{"version":3,"sources":["pages/EditPersonStory/Photos/ChoosePhotoModal.module.scss","components/ButtonRow.module.scss","pages/PublicViewStoryPair/StoryView.module.scss","components/Search.module.scss","components/FullscreenImageView.module.scss","components/FileUploader.module.scss","pages/EditCollectionDocument/TagView.module.scss","pages/EditDocumentPage/ResizableSplitPane.module.scss","pages/ListPersonFeedback/index.module.scss","components/layout/AppBar.module.scss","pages/Home/index.module.scss","components/inputs/CheckboxInput.module.scss","components/EditModeButton.module.scss","components/Backdrop.module.scss","components/IconButton.module.scss","pages/PublicViewPersonStory/PublicButton.module.scss","pages/PublicViewStoryPair/index.module.scss","components/layout/AppSideBar.module.scss","pages/PublicViewKeyLocation/index.module.scss","pages/ViewPersonPublic/index.module.scss","pages/PublicViewPersonStory/StoryView.module.scss","pages/PublicViewPersonStory/index.module.scss","components/CenteredPane.module.scss","pages/EditContactPerson/ContactPersonEventView.module.scss","components/TopTabs.module.scss","pages/EditPerson/index.module.scss","pages/ViewPerson/TextView.module.scss","pages/ViewPerson/LabelView.module.scss","pages/EditMilitaryEntity/index.module.scss","pages/EditPersonStory/Qualifications/TagView.module.scss","components/theme/SideBar.module.scss","components/layout/public/PublicLayout.module.scss","pages/ListPlaces/index.module.scss","pages/EditPersonStory/Photos/AddPhotoControl.module.scss","components/table/Table.module.scss","pages/EditCollectionDocument/DocumentElementPreview.module.scss","pages/PublicSearch/index.module.scss","pages/ViewPerson/index.module.scss","assets/js/light-bootstrap-dashboard.js","Translate.ts","models/ValidationResult.ts","utils/Functional.ts","redux/Actions.ts","models/User.ts","models/Place.ts","components/Icons.tsx","models/MilitaryEntity.ts","models/Collection.ts","utils/PageLinking.ts","models/DocumentReference.ts","models/DocumentTagDefinition.ts","models/DocumentTag.ts","models/SpecialFunction.ts","utils/Styles.ts","components/ButtonLink.tsx","components/PageLink.tsx","components/table/Fields.tsx","components/Paginator.tsx","components/table/Table.tsx","models/IndexedList.ts","api.ts","utils/ErrorConverter.ts","modals/BaseModal.tsx","components/ButtonRow.tsx","modals/ModalHeader.tsx","modals/Confirmation.tsx","models/Person.ts","models/IDocument.ts","utils/Formatting.ts","models/Document.ts","models/wrappers/PersonStoryHelper.ts","pages/PageBreadcrumb.ts","pages/Page.tsx","config/styles.ts","components/Search.tsx","utils/UpdateEffects.ts","pages/ListPage.tsx","modals/ModalContext.tsx","pages/ListMilitaryEntities/index.tsx","FunctionalAPI.ts","pages/ViewCollection/DocumentReferencesView.tsx","pages/ViewCollection/TitleCell.tsx","pages/ViewCollection/CategoryCell.tsx","pages/ViewCollection/Columns.tsx","pages/ViewCollection/index.tsx","redux/Reducers.ts","serviceWorker.ts","pages/Home/index.tsx","utils/ElementID.ts","components/inputs/InvalidFeedback.tsx","components/inputs/VerticalInput.tsx","pages/Login/index.tsx","components/theme/FormCheck.tsx","pages/ListCollections/index.tsx","components/inputs/InputGroup.tsx","components/inputs/SelectInput.tsx","components/inputs/TextInput.tsx","components/inputs/TextareaInput.tsx","components/inputs/DateInput.tsx","components/inputs/RadioInput.tsx","modals/CreatePerson.tsx","Countries.tsx","components/SecondaryButton.tsx","pages/EditPlace/PlaceSearchInput.tsx","utils/DelayedEffect.ts","models/PersonStory2.ts","pages/EditPersonStory/Stories/LanguageSelector.tsx","components/inputs/MapMarkerInput.tsx","pages/EditPlace/PlaceForm.tsx","modals/CreatePlace.tsx","components/inputs/ReferenceInputCell.tsx","pages/EditMilitaryEntity/MilitaryEntityForm.tsx","modals/CreateMilitaryEntity.tsx","components/inputs/ReferenceTypeaheadInput.tsx","pages/EditCollectionDocument/TagField.tsx","pages/EditCollection/CollectionEditor.tsx","pages/CreateCollection/index.tsx","pages/EditCollection/index.tsx","assets/images/mimetypes/128/audio.png","assets/images/mimetypes/128/binary.png","assets/images/mimetypes/128/compressed.png","assets/images/mimetypes/128/html.png","assets/images/mimetypes/128/image.png","assets/images/mimetypes/128/video.png","assets/images/mimetypes/128/word.png","utils/MimeTypes.ts","assets/images/mimetypes/128/pdf.png","assets/images/mimetypes/128/excel.png","assets/images/mimetypes/128/powerpoint.png","assets/images/mimetypes/128/empty.png","assets/images/mimetypes/128/svg.png","assets/images/mimetypes/128/csv.png","assets/images/mimetypes/128/text.png","assets/images/mimetypes/128/unknown.png","pages/EditCollectionDocument/DocumentElementPreviewErrorHeader.tsx","pages/EditCollectionDocument/DocumentElementPreview.tsx","modals/NotificationModal.tsx","modals/UnsavedChangesModal.tsx","components/FileUploader.tsx","components/CenteredPane.tsx","pages/EditCollectionDocument/DocumentFormState.ts","components/CardHeader.tsx","components/FormCard.tsx","utils/ReactUtils.ts","components/inputs/CheckboxInput.tsx","components/EditModeButton.tsx","pages/EditCollectionDocument/ReferenceView.tsx","pages/EditCollectionDocument/DocumentReferences.tsx","components/inputs/DocumentTagTypeInput.tsx","pages/EditCollectionDocument/TagView.tsx","pages/EditCollectionDocument/TagsListView.tsx","models/ContactPerson.ts","pages/RecordContactMoment/ContributionView.tsx","utils/Markdown.ts","pages/EditContactPerson/ContactPersonEventView.tsx","pages/EditCollectionDocument/EditDocumentForm.tsx","components/Backdrop.tsx","components/IconButton.tsx","components/FullscreenImageView.tsx","pages/EditDocumentPage/ImageBrowser.tsx","pages/EditDocumentPage/ResizableSplitPane.tsx","pages/EditDocumentPage/index.tsx","pages/EditPerson/components/EmptyMessage.tsx","modals/MoveDocument/MoveDocumentPreview.tsx","modals/MoveDocument/MoveToDocumentModal.tsx","pages/EditCollectionDocument/index.tsx","models/Memorial.ts","pages/ListMemorials/MemorialPlaceView.tsx","pages/ListMemorials/index.tsx","components/inputs/PlaceInputOption.tsx","components/inputs/PlaceInfo.tsx","components/inputs/PlaceInput.tsx","components/inputs/FormGroup.tsx","components/inputs/MapCoordinatesInput.tsx","utils/Notification.ts","components/TopTabs.tsx","pages/ListDocumentation/AddDocumentationControl.tsx","pages/ListDocumentation/AddAdlibDocumentModal.tsx","pages/ViewPlace/ListDocumentsTab.tsx","pages/EditMemorial/LocationUtils.ts","utils/BritishTrenchCoordinate.ts","pages/EditMemorial/index.tsx","components/PlaceLink.tsx","utils/Arrays.ts","pages/ListPersons/MergePersonsModal.tsx","components/MergeIcon.tsx","models/PersonEvent.tsx","pages/ListPersons/index.tsx","pages/ViewMemorial/ListPersonsOnMemorial.tsx","pages/ViewMemorial/index.tsx","pages/ListPersonStories/actions.tsx","pages/EditPersonStory/Stories/StoryTextView.tsx","models/wrappers/PersonStoryWrapper.ts","pages/EditPersonStory/Stories/PersonStoryStatusForLanguagesView.tsx","pages/ListPersonStories/PersonStoryStatusView.tsx","pages/ListPersonStories/Columns.tsx","pages/ListPersonStories/index.tsx","components/inputs/SimpleAutocomplete.tsx","components/inputs/MemorialInput.tsx","components/inputs/StringAutocomplete.tsx","pages/EditPerson/inputs/RegimentInput.tsx","pages/EditPerson/inputs/UnitInput.tsx","pages/EditPerson/EditEventModal.tsx","pages/EditPerson/LinkedPersonView.tsx","pages/ViewPerson/EventView.tsx","pages/EditPerson/components/AddEventControl.tsx","pages/EditPerson/PersonEventsTab.tsx","pages/EditPerson/PersonProjectsTab.tsx","pages/EditPerson/PersonStoriesTab.tsx","pages/EditPerson/index.tsx","components/EditLink.tsx","pages/ViewPerson/PersonInfoView.tsx","pages/ViewPerson/HeaderView.tsx","models/PersonFeedback.ts","components/DocumentUploadView.tsx","pages/ViewPerson/PersonFeedbackModal.tsx","pages/ViewPerson/NoDataView.tsx","utils/AppContext.ts","pages/ViewPerson/tabs/ProjectsTab.tsx","pages/ViewPerson/TextView.tsx","pages/ViewPerson/LabelView.tsx","pages/ViewPerson/tabs/LinkedPersonView.tsx","pages/ViewPerson/tabs/RelatedPersonsTab.tsx","pages/ViewPerson/tabs/PersonStoriesTab.tsx","pages/ViewPerson/index.tsx","pages/ListPlaces/MergePlacesModal.tsx","pages/ListPlaces/PlaceEventListModal.tsx","pages/ListPlaces/PlaceEventsView.tsx","pages/ListPlaces/index.tsx","pages/ViewPlace/index.tsx","pages/EditPlace/index.tsx","components/MarkdownView.tsx","pages/ListPersonFeedback/index.tsx","pages/ListUsers/EditUserModal.tsx","pages/ListUsers/index.tsx","models/Project.ts","pages/ListProjects/EditProjectModal.tsx","pages/ListProjects/index.tsx","pages/ViewProject/index.tsx","utils/Date.ts","pages/EditMilitaryEntity/MilitaryEntityEventView.tsx","pages/ViewMilitaryEntity/ListPersonsTab.tsx","pages/ViewMilitaryEntity/index.tsx","components/inputs/MilitaryEntityInput.tsx","pages/EditMilitaryEntity/EditStructureEventModal.tsx","pages/EditMilitaryEntity/EditTrackEventModal.tsx","pages/EditMilitaryEntity/MilitaryEventEditor.tsx","pages/EditMilitaryEntity/index.tsx","components/inputs/DateTimeInput.tsx","pages/SpecialFunctions/SpecialFunctionTypeSelector.tsx","pages/SpecialFunctions/SpecialFunctionInput.tsx","pages/SpecialFunctions/SpecialFunctionForm.tsx","pages/SpecialFunctions/TimestampTableColumn.tsx","pages/SpecialFunctions/SpecialFunctionResultTable.tsx","pages/SpecialFunctions/index.tsx","pages/AdvancedSearch/ExportFieldModal.tsx","pages/AdvancedSearch/index.tsx","pages/ActivateAccount/index.tsx","pages/RequestPasswordReset/index.tsx","pages/ListContactPersons/index.tsx","components/DateTimeFromToOutput.tsx","pages/ListContactMoments/ContactMomentTypeOutput.tsx","pages/ListContactMoments/index.tsx","components/inputs/DualTextInput.tsx","pages/EditContactPerson/ViewContactPersonModal.tsx","pages/EditContactPerson/index.tsx","pages/RecordContactMoment/ContributionList.tsx","pages/RecordContactMoment/index.tsx","utils/ValidationError.ts","pages/EditContactMoment/index.tsx","pages/ListDocumentation/index.tsx","components/inputs/TextInputColumn.tsx","pages/EditPersonStory/PersonPlace/ResetToOriginalLink.tsx","pages/EditPersonStory/PersonPlace/PersonForm.tsx","pages/EditPersonStory/PersonPlace/EventLinkView.tsx","pages/EditPersonStory/PersonPlace/EventLinksView.tsx","pages/EditPersonStory/PersonPlace/EventLinks.ts","pages/EditPersonStory/PersonPlace/StringsListView.tsx","components/inputs/ColumnInputGroup.tsx","components/inputs/CountryInput.tsx","pages/EditPersonStory/PersonPlace/PlaceForm.tsx","pages/EditPersonStory/PersonPlace/PersonPlaceTab.tsx","pages/EditPersonStory/Stories/StoriesData.ts","pages/EditPersonStory/Stories/PersonStoryStatusView.tsx","pages/EditPersonStory/Stories/StoriesStatus.tsx","pages/EditPersonStory/Stories/StoriesCheckbox.tsx","pages/EditPersonStory/Stories/StoriesTab.tsx","pages/EditPersonStory/PersonPlace/PersonPlaceData.ts","components/inputs/CompactCheckboxInput.tsx","pages/EditPersonStory/Summary/SummaryCheckbox.tsx","pages/EditPersonStory/Summary/SummaryTab.tsx","pages/EditPersonStory/Photos/AddPhotoControl.tsx","assets/images/phototemplates/template1.png","assets/images/phototemplates/template2.png","assets/images/phototemplates/template3.png","pages/EditPersonStory/Photos/ChooseTemplateModal.tsx","pages/EditPersonStory/Photos/ChoosePhotoItem.tsx","pages/EditPersonStory/Photos/ChoosePhotoModal.tsx","pages/EditPersonStory/Photos/EditPhotoPreview.tsx","pages/EditPersonStory/Photos/PhotoSource.ts","pages/EditPersonStory/Photos/PersonPhotoModal.tsx","pages/EditPersonStory/Photos/PhotoPreview.tsx","pages/EditPersonStory/Photos/AddPassportPhotoControl.tsx","pages/EditPersonStory/Photos/SimpleImagePreview.tsx","assets/images/personstory_map_placeholder.png","pages/EditPersonStory/Photos/PhotosTab.tsx","pages/EditPersonStory/Qualifications/EventCheckbox.tsx","pages/EditPersonStory/Qualifications/TagView.tsx","pages/EditPersonStory/Qualifications/QualificationsTab.tsx","pages/EditPersonStory/LinkedStories/SearchStoryInput.tsx","pages/EditPersonStory/LinkedStories/SearchStoryModal.tsx","pages/EditPersonStory/LinkedStories/ListMatchingPersonStories.tsx","pages/EditPersonStory/LinkedStories/Columns.tsx","pages/EditPersonStory/LinkedStories/LinkedStoriesTab.tsx","components/inputs/ContactPersonInput.tsx","components/inputs/KeyLocationInput.tsx","pages/EditPersonStory/KeyStory/KeyStoryTab.tsx","pages/EditPersonStory/index.tsx","pages/PublicViewPersonStory/PublicButton.tsx","pages/PublicViewPersonStory/ImageCarrousel.tsx","pages/PublicViewPersonStory/StoryView.tsx","assets/images/poppy.png","pages/PublicViewPersonStory/TimelineEventView.tsx","pages/PublicViewPersonStory/index.tsx","pages/PublicViewStoryPair/StoryView.tsx","pages/PublicViewStoryPair/index.tsx","components/inputs/PasswordInput.tsx","modals/LoginModal.tsx","components/layout/BreadcrumbsView.tsx","components/layout/AppBar.tsx","components/theme/SideBar.tsx","assets/images/icon.png","assets/images/sidebar.jpg","components/theme/NavItem.tsx","components/theme/NavGroup.tsx","components/layout/AppSideBar.tsx","components/layout/NoLoginAppBar.tsx","assets/images/vredesstad-ieper.png","components/layout/public/PublicHeader.tsx","assets/images/logo-inflandersfields.png","components/layout/public/PublicLayout.tsx","components/layout/Layout.tsx","components/LoadingModal.tsx","utils/GlobalErrorHandler.ts","BaseApp.tsx","pages/ListKeyLocations/index.tsx","models/Attachment.ts","components/AttachmentView.tsx","pages/EditKeyLocation/KeyLocationTab.tsx","utils/conversions.ts","pages/EditKeyLocation/LocationStoriesTab.tsx","pages/EditKeyLocation/index.tsx","pages/PublicViewKeyLocation/index.tsx","pages/PublicViewMapKeyLocations/api.ts","pages/PublicViewMapKeyLocations/index.tsx","assets/images/keypin.png","App.tsx","pages/PublicSearch/PublicSearchPersonsTable.tsx","pages/PublicSearch/index.tsx","pages/ViewPersonPublic/Header.tsx","pages/ViewPersonPublic/index.tsx","components/LoadingView.tsx","pages/PublicViewProject/index.tsx","PublicSearchApp.tsx","index.tsx","pages/EditDocumentPage/ImageBrowser.module.scss","pages/ListPersons/index.module.scss","pages/PublicViewPersonStory/ImageCarrousel.module.scss","components/inputs/PlaceInput.module.scss","pages/EditCollectionDocument/index.module.scss","components/layout/public/PublicHeader.module.scss"],"names":["module","exports","$sidebar","$sidebar_wrapper","$navbar","mobile_menu_visible","mobile_menu_initialized","toggle_initialized","$","document","ready","window_width","window","width","lbd","checkSidebarImage","initRightMenu","initMinimizeSidebar","initCollapseArea","tooltip","length","bootstrapSwitch","on","this","parent","addClass","removeClass","e","stopPropagation","resize","misc","navbar_menu_visible","image_src","data","undefined","sidebar_container","append","find","remove","first","clone","nav_content","children","each","content_buff","html","$sidebar_nav","insertBefore","click","event","$toggle","setTimeout","main_panel_height","scrollHeight","$layer","css","appendTo","sidebar_mini_active","collapse","simulateWindowResize","setInterval","dispatchEvent","Event","clearInterval","thisdiv","hasClass","hover","attr","preventDefault","height","languages","noun","singular","plural","nouns","collection","documentTag","person","militaryEntity","militaryUnit","memorial","place","project","user","result","personFeedback","contactPerson","contactPersonEvent","contactMoment","personEvent","personStory","keyLocation","languageCodes","getActiveLanguage","storedLanguage","localStorage","getItem","browserLanguage","navigator","language","languageString","split","toString","trim","toLowerCase","includes","selectedLanguage","setLanguage","langcode","setItem","moment","locale","T","key","parameters","param","replace","pluralize","amount","isValidationResult","obj","status","extra","ValidationError","ErrorNames","Ok","InvalidFormat","InvalidData","InvalidLength","SpacesNotAllowed","TooMany","DataAlreadyExists","ConnectionAlreadyExists","DataRequired","GoogleNotFound","GoogleTooManyResults","InvalidOption","InvalidDateOrder","EventsOverlap","Required","DoesNotExist","InvalidReference","UsernameAlreadyExists","EmailAlreadyExists","AtLeastOne","ShouldBeEmpty","ChildrenShouldBeEmpty","DocumentReferenceExist","EventReferenceExist","ContactReferencesExist","ContactPersonReferencesExist","MemorialReferencesExist","RelationsExist","PersonStoriesExist","AlreadyExists","InvalidStatusOption","InvalidPublishStatusOption","PersonAlreadyHasPersonStory","PersonStoryCannotBeDeletedIsPublished","PersonStoryCannotBeDeletedIsReferenced","KeyLocationCannotBeDeletedIsReferenced","InvalidBritishTrenchCoordinates","InvalidYear","InvalidYear2000","getErrorName","error","x","getErrorDescription","overrides","override","useStateWithError","initialValue","value","setValue","useState","setError","useAppDispatch","useDispatch","useAppSelector","projection","useSelector","useRefresh","callback","memo","useRef","current","useCallback","AppActionType","updatePagesStateAction","page","type","UpdatePagesState","payload","usePageState","state","pagesState","dispatch","updates","useTabState","pageKey","index","tabsState","update","UpdateTabState","startContactMomentAction","StartContactMoment","registerContactMomentContributionAction","contribution","RegisterContactMomentContribution","endContactMomentAction","EndContactMoment","setSharedPageState","SetSharedPageState","UserType","UserTypeNames","Admin","Revisor","Normal","NormalCivilian","ApiRead","ApiWrite","ReadOnly","ReadBESoldiers","AllUserTypes","Anonymous","Dataset","AccessibleDatasets","Any","Namelist","Deaths","Survivors","WithDocumentation","Stories","Contacts","IMR","Military","DatasetNames","Stories1","Stories2","Stories3","Stories4","translateDataset","dataset","translation","User","json","_id","account","name","email","phone","description","constructor","id","username","army","deleted","isAdmin","isRevisor","isAtLeastRevisor","isAtLeastNormal","isReadOnly","isGuest","canEdit","toJSON","AnonymousUser","PlaceType","PlaceTypes","Unknown","Topo","Sublocality","Locality","Neighborhood","ColloquialArea","AdministrativeAreaLevel2","AdministrativeAreaLevel1","Country","ResolutionStatus","getResolutionStatusName","Ambiguous","Found","Custom","NotFound","All","getResolutionStatusColor","toLatLng","lat","lon","lng","toLatLon","isPlace","Place","getTranslation","nameWithAlternatives","firstPart","alternative_names","some","join","resolution_status","countryCode","country_code","describe","locality","administrative_area_level_2","administrative_area_level_1","describeHierarchy","components","push","getPrimaryLanguage","hasLocation","loc","getPlaceTypeName","placeType","IconElement","props","className","icon","style","LoadingIcon","Icon","MilitaryEntityType","MilitaryEntityTypes","Division","Brigade","Regiment","Unit","getMilitaryEntityTypeName","Corps","getMilitaryEntityEventIcon","Sitemap","Route","Info","getMilitaryEntityEventTypeName","MilitaryTrackType","getMilitaryTrackTypeName","FrontierService","Support","HalfRest","Rest","Armies","MilitaryEntity","entity","division","brigade","regiment","unit_nr","unit","console","log","unitNr","DocumentCollectionType","DocumentCollectionStatus","DocumentCollectionLoadOption","PageID","DocumentReferenceType","DocumentReferenceRelation","DocumentTagFieldType","DocumentTagFieldPreposition","DocumentCollection","title","adlibId","adlibCode","Box","Todo","personId","composedTitle","LinkToPage","getPageLinkWithVia","toPage","toParam","viaPage","viaParam","getPageLink","getPageVia","ActivateAccount","AdvancedSearch","CreateCollection","CreateDocument","CreateContactPerson","CreateMemorial","CreateMilitaryEntity","CreatePerson","CreatePlace","EditCollection","EditDocument","EditContactMoment","EditContactPerson","EditDocumentPage","params","EditKeyLocation","EditMemorial","EditMilitaryEntity","EditPerson","EditPersonStory","PublicViewKeyLocation","PublicViewPerson","PublicViewPersonStory","PublicViewPersonKeyStory","PublicViewStoryPair","EditPlace","Home","ListCollections","ListContactPersons","ListContactMoments","ListDocumentation","ListKeyLocations","ListMemorials","ListMilitaryEntities","ListPersonFeedback","ListPersons","ListPersonStories","ListPlaces","ListProjects","ListUsers","Login","PublicSearch","RecordContactMoment","RequestPasswordReset","ResetPassword","SpecialFunctions","ViewCollection","ViewMemorial","ViewMilitaryEntity","ViewPerson","ViewPlace","ViewProject","ViewDocument","DocumentReference","relation","comment","info","ref_id","ref_type","ref_name","ref_relation","toJSONRef","Empty","None","getIcon","Person","MapMarker","MilityEntity","Project","Book","Memorial","Monument","ContactPerson","KeyLocation","Key","Question","getLink","serviceNumber","diedDate","day","month","year","isEmpty","getFullTagName","tags","tag","translations","parentTag","indexed","isReferenceFieldValue","isReferenceFieldObject","DocumentTag","tagDefinitions","fields","transformedFields","fromJSON","definition","DummyDocumentTagDefinition","allFields","getAllTagFields","fullName","equals","other","property","valueA","valueB","withFieldValue","field","Object","assign","concat","DocumentTagDefinition","map","DocumentTagField","selectable","validForDocument","validForContent","completeFields","definitions","generateDescription","fieldValue","preposition","SpecialFunctionCategory","AutocompleteType","TextMode","getSpecialFunctionCategoryName","category","General","Logs","Memorials","Persons","Places","PersonStories","getDefaultArguments","func","inputs","forEach","input","hour","minute","options","mode","Head","classes","cls","filter","ButtonLink","onClick","href","otherProps","link","currentPage","activePageState","via","to","ColumnAlign","DefaultColumnOptions","sortable","align","Left","clickable","ellipsize","StringTableColumn","getter","sort","a","b","localeCompare","render","item","styles","noValue","StringFieldTableColumn","IntegerFieldTableColumn","IntegerCalculatedTableColumn","getValue","ComponentTableColumn","renderer","sorter","TableRowActionStyle","tableRowActions","actions","action","isIcon","ActionsTableColumn","items","Right","Success","pageParam","PageLink","cursor","Paginator","React","PureComponent","handleClickedFirst","onPageSelected","handleClickedPrevious","handleClickedPage","parseInt","currentTarget","handleClickedNext","handleClickedLast","totalItems","pageSize","Math","ceil","shownItems","maxItems","numPages","start","end","Pagination","Item","disabled","ChevronDoubleLeft","ChevronLeft","Ellipsis","i","active","ChevronRight","ChevronDoubleRight","fromItem","toItem","label","from","total","marginLeft","marginRight","color","flexGrow","SortDirection","FilterIcon","column","selected","filterOptions","onFilter","referenceElement","setReferenceElement","popperElement","setPopperElement","filterOpen","setFilterOpen","popperStyles","attributes","usePopper","windowClickedHandler","useEffect","contains","target","addEventListener","removeEventListener","handleCheckedFilter","checked","filterButton","filterButtonActive","ref","filterPopout","popper","Form","Check","onChange","option","renderHeader","columns","sortColumn","sortDirection","filters","onClickedSort","onClickedFilter","textAlign","maxWidth","Up","SortUp","SortDown","Sort","th","sortableHeader","renderTH","NO_FILTERS","Table","displayedItems","rowKey","_","onClickItem","onPageChanged","onSortChanged","handleClickedSort","newDirection","Down","renderedHeader","useMemo","renderedRows","clickableRow","clickableCell","renderRow","table","TableCardBody","tableClassName","sortItems","c","IndexedList","indexer","list","GetPlaceOptions","url","location","host","indexOf","baseUrl","uploadAttachmentUrl","uploadPageUrl","uploadDocumentUrl","token","refreshingToken","onRequireLogin","onError","failHandler","documentTagDefinitions","documentTagsIndexed","_loadUserFromLocalStorage","userJson","JSON","parse","setToken","useGuestToken","logout","removeItem","loginWith","authResponse","stringify","_requestTyped","method","deserializer","_request","then","parametersWithToken","jsonrpc","success","_doRequest","Error","errorResponse","readyState","code","message","statusText","convertNonJSONRPCRequestError","request","Promise","resolve","ajax","headers","dataType","contentType","_translateSort","entry","isLoggedIn","search","query","reject","updateAttachment","attachment","getAttachment","validateAttachment","removeAttachment","findAttachment","collectionId","skip","limit","collection_id","login","password","activateUser","resendUserInvitationMail","requestUserPasswordReset","resetUserPassword","getAuthenticatedUser","createCollectionDocument","updateCollectionDocument","updateCollectionDocumentElement","documentId","elementIndex","element","newElementIndex","addCollectionDocumentSubdocument","moveCollectionDocumentElements","fromDocumentId","toDocumentId","elements","removeCollectionDocumentElements","getCollectionDocument","validateCollectionDocument","removeCollectionDocument","restoreCollectionDocument","findCollectionDocuments","filterValue","getCollectionDocuments","includeRemoved","includeDeleted","getDocumentsRelatedTo","countDocumentsRelatedTo","getCollectionDocumentTags","getCollectionDocumentTagsIndexed","getCollectionReference","searchCollectionReferences","references","importDocumentCollection","createCollection","updateCollection","getDocumentCollection","getDocumentCollectionsForPerson","validateDocumentCollection","removeCollection","restoreCollection","findDocumentCollections","createEvent","updateEvent","getEvent","validateEvent","removeEvent","removeEventsForPerson","findEvents","getFunctions","getFunction","validateFunction","args","arguments","callFunction","applyAction","ids","callFunctionCsv","createMemorial","updateMemorial","getMemorial","getMemorials","validateMemorial","removeMemorial","findMemorials","filterMode","addPersonToMemorial","memorialId","person_id","memorial_id","findPersonOnMemorial","addNewPersonToMemorial","removePersonFromMemorial","createMilitaryEntity","updateMilitaryEntity","getMilitaryEntity","validateMilitaryEntity","validateMilitaryEntityHistory","militaryEntityId","getMilitaryEntitiesIn","entity_id","mergeMilitaryEntities","id1","id2","_id1","_id2","removeMilitaryEntity","findMilitaryEntities","hasMilitaryEntity","getArmyList","getRegimentList","getUnitList","getUnitNumberList","getMilitaryEntitySoldiers","createPerson","updatePerson","getPerson","getPersons","_ids","validatePerson","getMergeSuggestions","fromDate","toDate","offset","clearMergeSuggestion","mergePersons","removePerson","findPersons","queryDocument","findPersonAdvanced","getPersonsDetails","getPersonsMemorated","createPersonDocument","updatePersonDocument","getPersonDocument","getDocumentsForPerson","validatePersonDocument","removePersonDocument","removeDocumentsForPerson","findPersonDocuments","findAttachmentsForPersonDocument","createPlace","updatePlace","getPlace","getCountries","validatePlace","canRemovePlace","mergePlaces","removePlace","findPlaces","take","Contains","findPlaceByNameAndCountryCode","lang","findPlaceByRegion","region","geonamesAPI","googleMapsAPI","googleMapsAPIMulti","createProject","updateProject","getProject","validateProject","removeProject","findProjects","createPersonStory","updatePersonStory","getPersonStory","getStoriesForPerson","validatePersonStory","removePersonStory","removeStoriesForPerson","findPersonStories","findPersonStories2","findMatchingPersonStories","personStoryId","findPersonStoriesForPerson","person_id_ref","getPersonStory2","validatePersonStory2","publishPersonStory2","unpublishPersonStory2","updatePersonStory2","createPersonStory2","getPublishedPersonStory","importDocumentPhotoToPersonStory","metadata","importAttachmentToPersonStory","attachmentId","updatePersonStoryPhoto","deletePersonStoryPhoto","createPersonFeedback","updatePersonFeedback","getPersonFeedback","validatePersonFeedback","removePersonFeedback","findPersonFeedback","markPersonFeedback","createUser","updateUser","getUser","validateUser","removeUser","findUser","createContactPerson","updateContactPerson","deleteContactPerson","getContactPerson","validateContactPerson","findContactPersons","findContactPersonsByName","firstName","lastName","findContactPersonEvents","createContactPersonEvent","updateContactPersonEvent","getContactPersonEvent","deleteContactPersonEvent","getContactPersonEventsForPerson","contactPersonId","contact_person_id","findContactMomentsForPerson","findContactMomentsForDocument","document_id","checkAdlibCode","createKeyLocation","updateKeyLocation","getKeyLocation","removeKeyLocation","validateKeyLocation","findKeyLocations","useModal","isOpen","setOpen","onClosed","BaseModal","Component","size","super","accepted","visible","handleHide","bind","componentWillReceiveProps","newProps","setState","close","renderModal","show","onHide","ButtonRow","buttonRow","ButtonRowTop","buttonRowTop","BottomButtonRow","bottomRow","ButtonRowModalFooter","ModalFooter","ModalHeader","Header","closeButton","Title","marginTop","ConfirmationModal","warning","acceptStyle","acceptText","rejectText","handleClickedNo","Body","Button","variant","Gender","VictimType","VictimSubType","PersonRelationType","PersonQueryOptions","DocumentStatus","DocumentCategory","DocumentKind","translateVictimType","Civilian","translateWarCasualty","isWarCasualty","alternativeFirstNames","alternativeLastNames","gender","bornDay","bornMonth","bornYear","bornDateSortable","diedDay","diedMonth","diedYear","diedDateSortable","diedAge","victimType","victimTypeDetails","warCasualty","inNamelist","familyInfo","events","relations","projects","militaryEvents","memorialIdsAndNames","memorials","surname","familyname","alternative_surnames","alternative_familynames","born_day","born_month","born_year","sort_born_date","died_day","died_month","died_year","died_age","sort_died_date","victim_type","victim_type_details","war_casualty","in_namelist","project_memberships","extend_events_enlisted","extend_memorials","extend_memorial_ids_names","nameSortable","birthDateFormatted","diedDateFormatted","hasBornDate","hasDiedDate","describeType","describeNameLister","describeVictimSubtype","victimSubType","Deportated","Executed","translateVictimSubType","describeGender","Undefined","Female","Male","translateGender","describeAge","ageAsNumber","isNaN","relationType","toLocaleLowerCase","zeroPad","num","places","zero","Array","getDocumentCategoryName","Document","kind","parentId","disclosed","referenced_entities","created","modified","filename","institution","inventoryId","source","counter","wiseProfile","wiseBranch","wiseLocation","wiseId","pages","reference","fromJSONRef","Adlib","Original","_title","filterLower","matchesFilterLower","AdlibCollectionDocument","PersonStoryHelper","PageLayout","useBreadcrumbs","viaTitle","base","viaEntity","viaId","setTitle","intermediateId","setIntermediateId","api","all","personName","personFirstName","personLastName","Breadcrumb","useBaseBreadcrumbs","first_name","family_name","usePageHeader","shortTitle","confirmNavigation","subtitles","breadcrumbs","SetActivePage","defaultContainerStyle","display","flexDirection","Page","containerStyle","sharedPageState","position","overflow","BasePage","loading","promise","displayName","saving","componentDidMount","loadContent","componentDidUpdate","oldProps","oldState","shouldLoadContent","getTitle","renderContent","showModal","modal","modals","Colors","labelTextSmallStyle","fontSize","textTransform","labelTextMediumStyle","labelTextLargeStyle","textSmallStyle","textMediumStyle","textLargeStyle","textMediumBoldStyle","fontWeight","blockTextMediumStyle","titleTextCapitalsStyle","titleBoldTextCapitalsStyle","flatlinkTextSmallStyle","flatlinkTextMediumStyle","TextStyles","small","medium","large","text","mediumBold","block","capitals","fatcapitals","subtitle","textDecorationLine","flatlink","Search","iconTop","placeholder","handleClear","section","htmlFor","top","autoComplete","spellCheck","autoCorrect","tabIndex","TimesCircle","clear","useDelayedUpdateEffect","delay","deps","isInitialMount","timeout","clearTimeout","defaultRowKey","ListPage","tableState","updateState","onClickedRow","onClickedAdd","header","additionalHeader","tablePage","filterInput","setFilterInput","actualHeader","alignItems","Card","direction","newFilters","ModalContext","createContext","useModalContext","useContext","ModalContextProvider","Provider","ListMilitaryEntityKind","getSortColumn","RegimentOrUnit","history","pageState","updatePageState","setItems","refresh","getQuery","handleClickedRemove","async","confirmed","corps","Edit","Danger","ButtonGroup","useDocumentCollection","setResult","empty","useDocumentTagDefinitions","useDocument","usePerson","EventsWithPlaces","Documents","RelationPersons","usePublishedPersonStory","storyId","useMemorial","useKeyLocation","NoOptions","useNumberOfRelatedDocuments","numberOfDocuments","setNumberOfDocuments","DocumentReferencesView","documentReferences","paddingRight","TitleCell","CategoryCell","justifyContent","Badge","getColumns","Digital","renderDocumentCounter","getDocumentIdPresentation","format","ViewCollectionDefaultState","showRemoved","refreshCollection","documentsJson","useCollectionDocuments","documents","flex","Alert","API","filteredDocuments","pageDocuments","slice","DefaultPagesState","advancedSearch","errors","tab","collections","persons","personStories","militaryEntities","filterStatus","users","contactPersons","contactPersonEvents","documentation","tagFilter","militaryEntityPersons","memorialPersons","personStoryMatches","placeDocumentation","editPlaceDocumentation","militaryDocumentation","editMilitaryDocumentation","editPersonDocumentation","memorialDocumentation","editMemorialDocumentation","publicSearch","selectedTab","basicInput","advancedInput","keyLocations","publicViewProject","DefaultTabState","editPlace","viewPlace","editMemorial","viewMemorial","editPerson","viewPerson","editMilitary","viewMilitary","editPersonStory","appReducers","combineReducers","documentEditorSettings","DocumentEditorSetRatio","ratio","activeContactMoment","UpdateContactMoment","contributions","stored","layout","Regular","exportModalState","UpdateExportModalState","Boolean","hostname","match","Tile","Col","sm","md","tile","tileInner","HomePage","Row","Users","useElementID","prefix","elementID","generateElementID","InvalidFeedback","VerticalInput","plainText","validated","onPressedEnter","handleKeyPress","inputClass","Group","controlId","Label","Control","onKeyPress","pending","setUsername","setPassword","handleClickedLogin","loginData","Container","padding","paddingTop","FormCheck","documentCollection","float","InputGroup","labelColumns","inputColumns","SelectInput","readOnly","controlStyle","optionElements","renderedOptions","handleChange","SelectInputOnly","TextInput","onBlur","TextareaInput","vertical","rows","inputDateToSortable","date","padStart","parseInputDateFromSortable","substring","inputDateToISO","test","isoString","isValid","inputDateFromISO","DateInput","monthRef","yearRef","isDigit","numberValue","Number","v","monthElement","focus","yearElement","RadioInput","labelCols","valueCols","horizontal","handleChanged","optionsRendered","content","FormLabel","CreatePersonModal","space","splitName","genderOptions","warCasualtyOptions","victimTypeOptions","namelisterOptions","setFirstName","firstNameError","setFirstNameError","setLastName","lastNameError","setLastNameError","setGender","genderError","setWarCasualty","warCasualtyError","isNamelister","setNamelister","isNamelisterError","setDiedDate","diedDateError","setDiedDateError","setVictimType","victimTypeError","handleClickedCancel","newPerson","initials","nationality","cwxrm_remembered","NotificationManager","died_date","setValidationErrors","COUNTRY_LIST","COUNTRY_SELECT_OPTIONS","country","SecondaryButton","PlaceSearchInput","resolutionStatus","onClickedGoogle","resolutionStatusColor","useDelayedEffect","dependencies","StoryStatus","Template","ImageType","Language","PersonStoryTag","removeWhitespaceLines","LanguageSelector","onUpdateLanguage","currentLanguage","setCurrentLanguage","NL","hasError","CustomToggle","forwardRef","Dropdown","Toggle","as","pill","FR","EN","DE","generateLanguageString","Menu","values","newLanguage","MapMarkerInputValue","toFixed","latAsString","lonAsString","latAsNumber","lonAsNumber","lastValidPosition","valid","withLatValue","parseFloat","withLonValue","MapMarkerInputMap","withGoogleMap","defaultCenter","defaultZoom","center","fromValue","latLng","draggable","onDragEnd","MapMarkerInput","labelColumnsCount","containerElement","mapElement","PlaceForm","formState","setFormState","onClickedSimilar","placeTypes","googleMatchCounter","geolocationError","setGeolocationError","alternativeNames","suggestions","similar","updatePlaceLanguage","newLanguageInfo","newLanguages","similarWithoutCurrent","similarPlace","placeId","setSuggestions","convertGoogleMatch","primaryLanguage","address","sublocality","loadMatchForLanguage","marginBottom","backgroundColor","newName","googleSuggestions","suggestion","noResults","onClickedGeonames","paddingLeft","span","allLanguages","handleClickedSuggestion","area2","area1","languageCode","CreatePlaceModal","renderName","renderDiedDate","renderServicerNumber","ReferenceInputPersonCell","highlighted","background","ReferenceInputOtherCell","ReferenceInputCell","documentType","currentValue","MilitaryEntityForm","regimentError","unitNrError","unitError","brigadeError","divisionError","armyError","typeOptions","armyOptions","updateFormState","CreateMilitaryEntityModal","ReferenceInput","onSelected","placeHolder","setOptions","loadingCounter","setLoadingCounter","isValidValue","showModalCreate","creating","showModalCreatePerson","showModalCreatePlace","showModalCreateMilitaryEntity","typeAheadProps","renderMenuItemChildren","useCache","defaultInputValue","filterBy","labelKey","onSearch","splice","emptyWithName","finally","isLoading","ReferenceInputGroup","ReferenceInputField","CollectionEditor","onSave","onCancel","setType","setDescription","setStatus","setAdlibId","setAdlibCode","setPerson","getPersonReference","hasChanged","InProgress","Done","personObject","Text","saved","setCollection","FileType","extensions","PDF","Word","PowerPoint","Compressed","Audio","Image","ImageSVG","Video","CSV","HTML","Binary","mimetypes","guessFileType","dot","lastIndexOf","extension","getFileTypeFromMimeType","mimetype","knownType","startsWith","getLargeIcon","wordIcon","Excel","compressedIcon","audioIcon","imageIcon","htmlIcon","binaryIcon","videoIcon","DocumentElementPreviewErrorHeaderView","centerTop","DocumentElementPreview","onPreview","showTitle","outer","PageElementPreview","SubdocumentElementPreview","subdocument","checkbox","SolidSquare","CheckSquare","Square","getTagName","url_resized","src","alt","onDrag","onMouseDown","nodrag","pageInfo","count","LightSquare","transcription","AlignJustify","expandIcon","ExpandArrowsAlt","numberOfPages","showPages","subdocumentInner","NotificationModal","okText","handleClose","UnsavedChangesModal","widget","blueimp","fileupload","processActions","validate","dfd","Deferred","file","files","acceptFileTypes","resolveWith","rejectWith","FileUploaderComponent","createRef","initUpload","onStart","onProgress","onSuccess","onFail","onFinish","paramName","formData","submit","$this","jqXHR","progress","prompt","fileinputButton","uploadGroup","PlusSquare","multiple","FileUploader","buttonStyle","onSaved","uploading","setUploading","setProgress","failed","setFailed","loaded","ProgressBar","max","now","AttachmentFileUploader","PageFileUploader","documentElement","feedbackSession","document_element","feedback_session","DocumentFileUploader","CenteredPane","panel","getFormStateForDocument","titleError","urlError","CardHeader","buttons","FormCard","node","bodyStyle","isArray","CheckboxInput","checkboxWrapper","Checkbox","checkboxCheck","EditModeButton","inverted","editbutton","ReferenceView","onClickedRemove","DocumentReferences","setReferences","addingReferenceType","setAddingReferenceType","referenceViews","handleRemoveReference","newReferences","paddingBottom","FilterableDocumentTagType","NoDisabledTags","DocumentTagTypeInput","disabledTags","availableTags","setAvailableTags","selectedItem","TagView","removeTag","deleteButton","tagtitle","tagsubtitle","TagsListView","handleAddTag","handleRemoveTag","handleFieldValueUpdated","documentCategory","hasTypes","tagViews","onChangeField","Tags","tagtypeselection","toUpperCase","ContactMomentType","ContactMomentTypes","Email","Phone","Visit","Feedback","Post","translateContactMomentType","ContactPersonEventHelper","ContributionView","onClickedDelete","linkPage","targetId","markdownReader","commonmark","Parser","markdownRenderer","HtmlRenderer","markdown2html","markdown","newMarkdown","RegExp","parsed","__html","ContactPersonActionButtonsView","handleClickedDelete","readonly","ContactPersonTitleView","contactMethod","contactPersonName","readonlyTitle","ContributionListView","contributionsList","labelText","ContactPersonEventView","compact","showCompact","ContactMomentCardBody","KeyStoryCardBody","transcript","dangerouslySetInnerHTML","personContributions","getContributionsForType","documentContributions","markdowncontent","story","setStory","contactEvent","contentHasChanged","onClickedEdit","titleReadonly","collectionObject","create","editButton","t","newTag","newTags","renderCategory","renderCounter","counterValue","renderDocumentTitle","renderDocumentDescription","renderStatus","renderDisclosed","renderReferences","renderTags","Web","rel","Wise","Archive","Copy","Reproduction","Backdrop","dark","backdrop","IconButton","iconbutton","IconLink","FullscreenImageView","caption","dragState","setDragState","dragging","offsets","setOffsets","offsetX","offsetY","scale","zoomAtCenter","maxHeight","left","transform","dragStartX","dragStartY","dragStartMouseX","pageX","dragStartMouseY","pageY","onMouseUp","onMouseMove","onMouseOut","onWheel","rect","getBoundingClientRect","relativeX","relativeY","zoom","clientX","right","clientY","bottom","deltaY","zoomButtons","SearchPlus","SearchMinus","closebutton","ImageViewer","canvas","image","setCanvas","newScale","paint","handleClickedZoomIn","clientWidth","clientHeight","handleClickedZoomOut","handleClickedFullscreen","fullscreenOpen","handleClickedFullscreenClose","handleMouseDown","handleMouseUp","handleMouseMove","handleMouseOut","handleDimensionsChanged","contentRect","dimensions","bounds","prevProps","context","getContext","clearRect","naturalHeight","naturalWidth","drawImage","filetype","originalUrl","isImage","isImageType","onResize","measureRef","viewerWrapper","zoomout","zoomin","fullscreen","open","ExternalLink","centered","ResizableLeft","setRef","ResizableDivider","dividerWrapper","onPointerDown","onPointerUp","onPointerMove","divider","ResizableRight","flexShrink","ResizableComponent","parentRef","dividerRef","leftRef","setParentRef","setDividerRef","setLeftRef","handlePointerDown","setPointerCapture","pointerId","draggingStartWidth","draggingStartX","draggingWidth","handlePointerMove","handlePointerUp","releasePointerCapture","setRatio","splitpane","ResizableSplitPane","connect","setDocumentEditorRatio","getFiletype","original_filename","readOnlyFromState","editingDocumentId","documentJson","setDocumentJson","pageNumberInput","setPageNumberInput","pageNumberError","setPageNumberError","setTranscription","setTags","originalPageTags","nextPage","pageNumber","getNextPage","previousPage","getPreviousPage","referencesHaveChanged","changed","oldAnnotation","newAnnotation","documentTitle","parsedPageNumberInput","pageViewer","url_original","previous","AngleLeft","next","AngleRight","leftPanel","Images","rightPanel","newDocument","textStyle","EmptyMessage","styleColumn","styleRow","MoveDocumentPreview","MoveToDocumentModal","setIsLoading","inputDocumentId","setInputDocumentId","selectedDocumentId","setSelectedDocumentId","documentForId","setDocumentForId","checkRoot","setCheckRoot","loadedDocument","loadDocument","root","isSubDocument","Footer","adlibInfo","setAdlibInfo","fullscreenPage","setFullScreenPage","ignoreNavigationCheck","setIgnoreNavigationCheck","selectedIndexes","setSelectedIndexes","setLoadedDocument","useContactPersonEventsForDocument","createEmptyDocument","originalFormState","hasFiles","newAdlibInfo","tagsHaveChanged","original","handleDocumentUpdated","newDocumentJson","stateToDocument","fromProps","handleClickedMoveToNewSubdocument","newIndexes","handleClickedMoveToMainDocument","handleClickedMoveDocument","hasOnlySelectedSubdocuments","catch","handlePageUpdated","handleClickedAddSubdocument","main","handleClickedRemovePages","hasSelectedSubdocuments","every","pageTitle","EditDocumentForm","DropdownButton","drop","eventKey","handleClickedMoveToSubdocument","elementList","handleClickedElement","handleSelectedIndex","AddPageControl","onPageUploaded","AddSubdocumentControl","onClickedAddSubdocument","translatedVia","FileAlt","validationResult","goBack","handleClickedSaveNew","savedDocument","confirm","generateTitle","handleClickedSaveExisting","addPage","borderRadius","addSubdocument","addSubdocumentInner","MemorialType","MemorialTypes","Plate","Cemetery","FieldGrave","MemorialTypeTranslations","translateMemorialType","CemeteryKind","PlateDetails","translateCemeteryKind","PlateDetailTranslations","Private","Organisation","Community","PlateDetailTranslationsShort","describeMemorialKind","type_plate_details","plate","type_cemetery_details","GetMemorialOption","MemorialPlaceView","extend_place","commaSeparatedString","firstViews","secondViews","firstViewText","secondViewText","memorialPlaceViewWithPlace","NumberOfPersons","PlaceNames","extend_nbr_of_persons","PlaceInputOption","searching","optionLeft","optionRight","placetype","onClickedClear","placeLabel","PlaceInput","inputText","setInputText","inputGroupButton","PlaceInfo","object","PlaceInputComponent","requestTimer","handleValueChanged","newValue","handleSelected","scheduleSearch","inputValue","prevState","snapshot","searchPlaces","searchMode","maxNumberOfPlaces","emptyLabel","FormGroup","MapCoordinatesInput","placeholderLat","placeholderLon","isInvalid","showNotification","settings","TopTabs","defaultActiveKey","tabs","activeKey","onSelect","tabKey","setTabKey","storeKey","renderedTabs","badgeVariant","Nav","Link","badgeContent","renderedContent","Tab","Pane","wrapper","Content","DocumentCategories","err","ListDocumentsTab","pageStateKey","useListDocumentationPageState","loadDocuments","handleTagSelected","handleClickedClearTag","handleClickedAdd","check","AddAdlibDocumentModal","justifyItems","AddDocumentationControl","row","DefaultLocation","ActualPositionSource","actualPositionSource","customPosition","addressPosition","CUSTOM","ADDRESS","PLACE","NONE","TRENCH_COORDINATE_REGEX","BritishTrenchCoordinates","coordinate","level1grid","level2grid","level3grid","subgrid10x","subgrid10y","subgrid100x","subgrid100y","y","subgrid10","subgrid100","LoadOptions","memorialTypeOptions","cemeteryKindOptions","plateTypeOptions","setName","nameError","setNameError","otherNames","setOtherNames","otherNamesError","setOtherNamesError","typeError","setTypeError","plateKind","setPlateKind","plateKindError","setPlateKindError","cemeteryExists","setCemeteryExists","cemeteryKind","setCemeteryKind","cemeteryKindError","setCemeteryKindError","setPlace","placeError","setPlaceError","descriptionError","setDescriptionError","setAddress","addressError","setAddressError","setCustomPosition","setAddressPosition","addressLastSearched","setAddressLastSearched","britishTrenchCoordinates","setBritishTrenchCoordinates","britishTrenchCoordinatesError","setBritishTrenchCoordinatesError","coordinatesLocked","setCoordinatesLocked","clearForm","exists","address_loc","calc_place_loc","address_positioned","position_locked","british_trench_coordinates","handleAddressEnterPressed","google","maps","Geocoder","geocode","componentRestrictions","results","GeocoderStatus","OK","geometry","geocodeAddress","createNewMemorial","save","createNew","actualAddressPosition","actualCustomPosition","positionSource","addressPositioned","start_day","start_month","start_year","start_date","calc_place_name","calc_place_country","place_id","cemetery_kind","dataWithId","handleClickedSave","leftForm","actualPositionOnMap","actualPosition","actualPositionOnMapSourceText","actualPositionSourceText","rightForm","coordinates","renderMemorialTab","renderDocumentsTab","PlaceLink","distinct","Set","MergePersonsModal","personA","setPersonA","personB","setPersonB","openResult","nameA","nameB","bornA","bornB","diedA","diedB","willEraseName","willEraseBorn","willEraseDied","willEraseType","erased","Switch","MergeIcon","Merge","PersonEventLoadOption","PersonEventType","JailedType","MemoratedKind","translateJailedEventType","Captive","MemoratedKindTranslations","Current","translateMemoratedKind","MilitaryEventType","MilitaryEventTypeTranslations","Enlisted","ActiveService","PostedTo","AttachedTo","Renumbered","TransferredTo","Promoted","translateMilitaryEventType","WhereEventType","WhereEventTypeTranslations","HomeAddress","Fugitive","Evacuated","Moved","translateWhereEventType","isRemovablePersonEvent","Born","Died","EVENT_TYPES","Circle","nameIn","School","GraduationCap","Work","Tools","Where","House","Marriage","RingsWedding","Shield","Injured","Medkit","Hospitalized","Ambulance","Cross","Memorated","Decorated","Medal","Extra","Comment","Jailed","Lock","CWXRM","Tag","DEFAULT_EVENT_FIELDS","sort_start_date","end_day","end_month","end_year","sort_end_date","getEventTypeInfo","eventType","getEventIcon","getEventTypeName","getEventNameForPlace","getEventSubType","where_reason","enlisted_reason","jailed_type","memorial_kind","extend_memorial","getEventInfo","links","topo","school_name","school_direction","work_company_name","work_profession","enlisted_army","enlisted_rank","enlisted_number","enlisted_regt","military_regiment_id","enlisted_unit","enlisted_nr","military_entity_id","enlisted_sub","injured_wound","injured_cause","death_reason","memorialName","memorial_ref","decoration","citation","last_name","group","personEventSorter","ta","getEventTypeMajorPriority","tb","ma","getEventTypeMinorPriority","mb","getEnlistedPriority","getWherePriority","getMemoratedPriority","getMajorPriorityForEventType","generatePersonsColumns","onClickedMerge","altFirstNames","altLastNames","ellipsized","nowrap","activeService","serviceNumbers","ev","n","ranks","rank","getMilitaryEntityName","militaryInfoColumn","selectDisplayedMemorials","memorialTag","selectedForMerge","Warning","mergingFirst","mergingSecond","datasetOptions","MilitaryEvents","merging","Times","ListPersonsOnMemorial","setMemorial","queryResult","iPerson","loadData","renderPersons","deletePersonStory","completed","StoryIndex","StoryTextView","onUpdateStory","updateStoryWithText","newText","PersonStoryWrapper","getStory","getMaximumNumberOfChars","STORY_1","STORY_2","formControlClassName","storyIndex","maxLength","onTextChanged","getCounter","storyTextFieldName","getStoryTextFieldName","getOrCreateStoryText","updateStoryWithStatus","newStatus","storyStatusName","getStoryTextStatusName","story_text","textForLanguage","newStoryText","createEmptyStoryText","storyText","getStoryStatus","storyTextStatusName","IN_PROGRESS","STORY_CHILD_1","STORY_CHILD_2","story_part_1","story_part_2","story_status","story_child_part_1","story_child_part_2","story_child_status","PersonStoryLanguageStatusBadge","badgeText","IN_REVIEW","DONE","badgeVariantForStatus","PersonStoryStatusViewForLanguages","personStoryWrapper","PersonStoryStatusViewForLanguage","PersonStoryStatusView","Man","Baby","story_child_option","PersonStoryLanguageStatusView","PersonStoryChildLanguageStatusView","getPersonStoryColumns","key_location","profile_image","extra_images","published_date","Date","toLocaleDateString","PersonStory","SimpleAutocomplete","onInputChange","itemValue","itemKey","renderItem","invalid","setChanged","wrapperStyle","inputProps","getItemValue","menuStyle","border","zIndex","isHighlighted","MemorialInput","MemorialInputComponent","searchMemorials","entities","identity","StringAutocomplete","setLoading","useDelayedEffectWithLoading","RegimentInput","RegimentInputGroup","UnitInput","UnitNrInput","UnitInputGroup","unitValue","unitNrValue","onChangeUnit","onChangeUnitNr","ARMY_OPTIONS","EditEventModal","whereTypeOptions","militaryTypeOptions","jailedOptions","memoratedKindOptions","handleStartDateChanged","startDate","startDateError","handleEndDateChanged","endDate","endDateError","handlePlaceChanged","newPlace","handleAddressChanged","handleCommentsChanged","comments","commentsError","handleSchoolNameChanged","schoolName","schoolNameError","handleSchoolDirectionChanged","schoolDirection","schoolDirectionError","handleWhereTypeChanged","whereType","whereTypeError","handleWorkCompanyNameChanged","workCompanyName","workCompanyNameError","handleWorkProfessionChanged","workProfession","workProfessionError","handleMilitaryTypeChanged","militaryType","militaryTypeError","handleMilitaryArmyChanged","militaryArmy","militaryArmyError","handleMilitaryRegimentChanged","militaryRegiment","militaryRegimentError","handleMilitaryUnitNrChanged","militaryUnitNr","militaryUnitNrError","handleMilitaryUnitChanged","militaryUnitError","handleMilitaryUnitSubChanged","militaryUnitSub","militaryUnitSubError","handleMilitaryRankChanged","militaryRank","militaryRankError","handleMilitaryServiceNumberChanged","militaryServiceNumber","militaryServiceNumberError","handleJailedTypeChanged","jailedType","jailedTypeError","handleInjuredWoundChanged","injuredWound","injuredWoundError","handleInjuredCauseChanged","injuredCause","injuredCauseError","handleDiedReasonChanged","diedReason","diedReasonError","handleMemoratedMemorialChanged","memoratedMemorial","memoratedMemorialError","memoratedPlace","handleMemoratedRefChanged","memoratedRef","memoratedRefError","handleMemoratedKindChanged","memoratedKind","memoratedKindError","handleDecoratedDecorationChanged","decoratedDecoration","decoratedDecorationError","handleDecoratedCitationChanged","decoratedCitation","handleCWXRMBatchChanged","cwxrmBatch","cwxrmBatchError","handleCWXRMCSVIdChanged","cwxrmCsvId","cwxrmCsvIdError","handleCWXRMFirstNameChanged","cwxrmFirstName","cwxrmFirstNameError","handleCWXRMLastNameChanged","cwxrmLastName","cwxrmLastNameError","handleCWXRMMailChanged","cwxrmMail","cwxrmMailError","handleCWXRMGroupChanged","cwxrmGroup","cwxrmGroupError","toEvent","reason","decoratedCitationError","batch","csv_id","load","cwxrmEvent","startDay","startMonth","startYear","endDay","endMonth","endYear","sortStart","sortEnd","newEvent","place_name","getEventLeftFields","getEventRightFields","eventHeader","lg","PersonRelationTypes","Family","Married","Parent","Child","Sibling","Friend","Fieldmate","Cousin","Grandchild","Grandparent","Other","LinkedPersonView","relationTypeOptions","describePersonalRelationType","newRelation","defaultValue","EventView","subType","eventIconWrapper","eventIcon","eventInfo","PersonEventTypes","AddEventControl","PersonEventsTab","eventsRendered","PersonProjectsTab","memberships","onMembershipsChanged","checkboxes","m","newMemberships","notes","handleChecked","Books","PersonStoriesTab","onPersonStorySelected","IMR_MEMORIAL_ID","ConnectedPage","registerContribution","victimSubTypeOptions","isIMROptions","loadNumberOfDocuments","handleFirstNameChanged","handleLastNameChanged","handleFirstNameAltChanged","firstNameAlt","handleLastNameAltChanged","lastNameAlt","lastNameAltError","handleGenderChanged","handleBornDateChanged","bornDate","bornDateError","handleDiedDateChanged","handleAgeChanged","age","ageError","handleWarCasualtyChanged","handleVictimTypeChanged","handleVictimSubTypeChanged","victimSubTypeError","handleNamelisterChanged","handleIsIMRChanged","isIMR","isIMRError","handleFamilyInfoChanged","familyInfoError","handleRelationSelected","newRelations","handleRelationChanged","r","handleClickedRemoveRelation","requestContributionRegistration","handleClickedSaveAndNew","renderIdentityTab","renderIdentityForm","FolderTree","renderCategoryForm","renderFamilyInfoForm","renderSaveButtons","handleClickedEditEvent","savedEvent","newEvents","handleClickedRemoveEvent","confirmation","handleClickedAddEvent","marriage_partner","createNewEvent","handleDeleteDocument","newDocuments","handleDeleteAttachment","handleProjectMembershipsChanged","projectMemberships","handlePersonStorySelected","handleSaveDocument","attachments","d","renderEventsTab","renderSaveFirstRow","renderRelationsTab","renderRelationsForm","renderProjectsTab","renderPersonStoriesTab","loadProjects","firstNameAltError","loadPersonStories","personstories","updatedPerson","born_date","generateTabs","ListUl","relationViews","EditLink","PersonInfoView","hasBorn","hasDied","hasAge","personInfo","HeaderView","handleClickedFeedback","PersonFeedbackStatus","PersonFeedbackLoadOptions","DocumentPreview","DocumentUploadListView","onCreated","onUpdated","documentViews","reduce","PersonFeedbackModal","uuidv4","setEmail","emailError","setEmailError","setMessage","messageError","setMessageError","setDocuments","doc","timestamp","Submitted","documentIds","NoDataView","bg","Context","AppContextProvider","useProjects","membership","p","TextView","LabelView","ViewPersonPage","contactMoments","usePersonContactMoments","usePersonRelatedDocuments","usePersonStories","contactMomentViews","cm","eventViews","renderContactsTab","ProjectsTab","renderStoriesTab","RelatedPersonsTab","AddressBook","MergePlacesModal","placeA","setPlaceA","placeB","setPlaceB","translationA","translationB","sublocalityA","sublocalityB","localityA","localityB","area2A","area2B","area1A","area1B","willEraseStatus","willEraseSublocality","willEraseLocality","willEraseArea2","willEraseArea1","willEraseCountry","MaxEvents","PlaceEventListModal","military","describeMilitaryEventUnit","personNumberBadge","setPage","allPersons","setAllPersons","setSortColumn","setSortDirection","extend_person","sortedPersons","reverse","pagePersons","PlaceEventsView","onClickedPlaceEvent","handleClickedPlaceEvents","extend_events_by_type","badges","eventKeys","keys","obj1","obj2","personEventBadge","body","badgesComponent","popover","Popover","firstType","firstCount","firstEventBadge","secondEventBadge","OverlayTrigger","rootClose","trigger","placement","overlay","badgeNoEvents","margin","registerLocale","require","PlaceNameTableColumn","communityNames","resultArray","placefields","StatusOptions","Unresolved","statusOptions","EventsByType","handleClickedMerge","textEllipsis","getName","StatusView","InfoLineView","ViewPlacePage","renderPlaceMapTab","placeObject","renderPlaceDocumentsTab","fetchData","EditPlacePage","usePlace","handlePositionChanged","setLocation","placeWithId","openNew","renderEditTab","MarkdownView","rendered","AttachmentView","urls","preview","Eye","Plus","FeedbackView","feedback","onClickedAddAttachment","extend_attachments","card","extend_person_name","refreshTimeout","PersonName","Attachments","handlePageSelected","handleClickedAddAttachment","Comments","itemViews","EditUserModal","languageOptions","handleUsernameChanged","usernameError","handleTypeChanged","handleLanguageChanged","languageError","handleDatasetChanged","datasetError","handleNameChanged","handleEmailChanged","handlePhoneChanged","phoneError","handleDescriptionChanged","createColumns","onClickedResend","getUsertypeName","Refresh","editedUser","user2","ProjectType","EditProjectModal","handleTitleChanged","handleFromDateChanged","fromDateError","handleToDateChanged","toDateError","fromDay","fromMonth","fromYear","toDay","toMonth","toYear","TemporaryExhibition","handleClickedEdit","useProject","handleDeletionConfirmed","formatSortableDate","getMilitaryEntitySubTypeName","track_type","MilitaryEntityEventView","from_date","to_date","getMilitaryEntityEventInfo","subHistory","eventStyles","loadPersons","handlePersonFilterChanged","personColumns","ViewMilitaryEntityPage","personFilterTimeout","subEntityColumns","updatePersons","personTablePage","getTabsForEntity","updateSubEntities","subEntities","handleClickedRemovePerson","personFilter","personSortColumn","personSortDirection","handleSubEntitiesPageChanged","subEntitiesTablePage","handleSubEntitiesSortChanged","subEntitiesSortColumn","subEntitiesSortDirection","handleClickedSubEntitiesRow","military_entity","renderPersonsTab","ListPersonsTab","renderEvent","subEntityRowKey","renderSubEntitiesTab","pageEntities","entityObject","MilitaryEntityInput","types","MilitaryEntityInputComponent","searchReferences","SelectableTypes","EditStructureEventModal","setFromDate","setFromDateError","setToDate","setToDateError","setEntity","entityError","setEntityError","trackTypes","EditTrackEventModal","setTopo","topoError","setTopoError","MilitaryEventEditor","setEvents","updatedEntity","findIndex","EmptyFormState","useMilitaryEntity","getFormStateFromMilitaryEntity","addEvent","mytabs","handleClickedSaveAndClear","addEventTitle","handleClickedAddStructureEvent","handleClickedAddRouteEvent","entityTitle","currentDateTime","inputDateTimeToISO","inputDateTimeFromISO","DateTimeInput","smallWidthInputStyle","hourRef","minuteRef","hourElement","minuteElement","SpecialFunctionTypeSelector","nameTranslations","bornFrom","bornTo","diedFrom","diedTo","startFrom","startTo","endFrom","endTo","dateFrom","dateTo","moveType","school","number","company","wound","cause","profession","ageFrom","ageTo","sub","civilian","bornPlace","livingPlace","entityId","repeatableTranslations","typeHeader","selectInputTranslations","any","MALE","FEMALE","UNDEFINED","MILITARY","CIVILIAN","UNKNOWN","DEPORTATED","EXECUTED","filters_type","born","injured","memorated","enlisted","decorated","work","where","died","jailed","homeaddress","fugitive","evacuated","deportated","moved","none","military_event_type","structure","captive","namenlijst","deaths","survivors","stories","with_documentation","contacts","irish_memorial_records","military_event_track_type","frontier_service","support","half_rest","rest","kiosk","getInputLabel","getSpecialInputClass","TextFunctionInput","CheckboxFunctionInput","CountryFunctionInput","DateFunctionInput","DateTimeFunctionInput","DummyInput","SelectFunctionInput","RepeatableInput","TextFunctionInputComponent","TextFunctionInputInnerComponent","Selected","Tail","Complete","NotEqual","handleInputChanged","prevMode","setPrevMode","autocomplete","handlePlaceSelected","handleMemorialSelected","getSelectOptionLabel","titles","translated","translateRepeatable","RepeatableInputComponent","renderRepeatable","handleParameterChanged","val","newInputs","newElement","handleDelete","RepeatableInputGroup","onDelete","typeObject","Input","SpecialFunctionForm","onArgumentsChange","newArguments","TimestampTableColumn","_parseTimestamp","unix","ColumnTitles","FIRST_NAME","FAMILY_NAME","BORN","DIED","VICTIM_TYPE","TITLE","NAME","TYPE","SelectColumn","DateColumn","SpecialFunctionResultTable","selection","elementType","getNoun","cols","translationKey","getColumnTitle","armies","sortedData","itemClickHandler","ActionButton","onExecute","setAction","renderedActions","whiteSpace","SpecialFunctionsPage","handleCategoryChanged","setCategory","handleFunctionChanged","getCategory","setFunction","handleArgumentsChanged","handleClickedExecute","selectedFunction","handleClickedExecuteToCSV","urlParams","newSelection","handleExecuteAction","Database","categories","categoryOptions","functionOptions","selectedCategory","categoryName","functions","fn","functionName","f","Gear","Gears","setSelected","groups","overflowY","getFilterIcon","getFilterTitle","NoSelection","NoSelector","useFunctionDefinition","handleClickedReset","handleClickedCSV","ExportFieldModal","renderRepeatableSelector","renderResultsTabContent","suffix","activationKey","passwordError","setPasswordError","validatePassword","setValidatePassword","validatePasswordError","setValidatePasswordError","contact","DateTimeFromToOutput","fromDateTimeString","toDateTimeString","Clock","ContactMomentTypeOutput","contactMomentType","typeAsString","contactPersonEventData","DualTextInput","firstValue","firstPlaceholder","firstColumns","onChangeFirst","secondValue","secondPlaceholder","secondColumns","onChangeSecond","ViewContactPersonModal","placeName","street","streetNumber","setPhone","setPhoneError","setStreet","streetError","setStreetError","setStreetNumber","streetNumberError","setStreetNumberError","setNotes","notesError","setNotesError","selectedContactMomentType","setSelectedContactMomentType","useContactPerson","useContactPersonEvents","contactMomentTypeOptions","handleClickedDeleteEvent","clearErrors","copyFields","fieldsForValidation","fieldsForUpdate","copyFieldsForUpdate","handleValidationErrors","saveButtons","Suggestions","onClicked","startsAt","endsAt","suggestionElements","ContributionList","onInsert","updatedContributions","setUpdatedContributions","updatePersonContributionWithReferencedData","updateDocumentContributionWithReferencedData","updateContributionsWithReferencedData","newContribution","newList","sortContactMomentContribution","DibornDocument","updateContactMomentAction","stop","handleStartsAtChanged","handleEndsAtChanged","handleTranscriptChanged","handleDeleteContribution","handleInsertContribution","startDateTime","ValidationResult","errorMessage","getErrorCode","isErrorWithName","splitted","firstErrorStringSplitted","notificationMessage","codeErrorMessage","errorDesription","EditContactMomentPage","contactMethodOptions","handleContactMethodChanged","newContributions","startsAtError","handleAPIError","endsAtError","FilesMedical","TextInputColumn","buttonLinkStyle","ResetToOrginalLink","PersonForm","onUpdate","familyName","handleFamilyNameChanged","renderNameResetLink","personStoryValue","familyNameError","EventLinkView","CheckCircle","EventLinksView","el","onClickHandler","describePersonEvent","eventWithIdFromPerson","eventLinksFromPersonEvents","eventId","StringsListView","ColumnInputGroup","CountryInput","setInputValue","countries","setCountries","inputUpper","toLocaleUpperCase","filtered","CountryInputGroup","community","area","communityUpdate","areaUpdate","countryCodeUpdate","handleEventClick","eventRef","selectedEvent","placeInfo","infoFromPlace","handleAreaLinkClick","generateAreaLinks","place_source_event_ref","generateEventLinksData","placeInfoForLanguage","areasFromPlace","areasFromPersonWithEventId","communityError","areaError","countryCodeError","placeEventError","PersonPlaceTab","onUpdatePerson","onUpdatePlace","StoriesErrorsWrapper","storiesErrors","errorsCount","getStoryStatusErrorMessage","storyStatusError","childStoryStatusError","getStoryTextErrorMessage","story1Error","story2Error","childStory1Error","childStory2Error","languagesWithErrors","storiesErrorsCount","storyStatus","labelStyle","StoriesStatus","onUpdateStatus","infoText","currentStoryStatus","StoriesCheckbox","onUpdateStories","StoriesTab","handleOnUpdateStory","getStatus","personPlaceErrorsCount","personPlaceErrors","checkStyle","SummaryCheckbox","publishTargets","targets","published","publishedToMuseum","publishedToKey","CompactCheckboxInput","toLocaleTimeString","SummaryTab","onUnpublishedButtonClicked","photo","viewBox","fill","xmlns","maskUnits","rx","stroke","mask","photoSelector","createAsDocument","handleClickedPhoto","pageViews","ChoosePhotoItem","documentsViews","ProfileDocument","gallery","drawScale","targetWidth","targetHeight","grayscale","setPosition","setSize","onImageLoaded","dragInitState","photoImage","overlayImage","renderCanvas","fillStyle","globalCompositeOperation","fillRect","startX","startY","startMouseX","startMouseY","initState","round","newX","newY","PhotoDimension","DocumentPhotoSource","getUrl","TemporaryPhotoSource","StoryPhotoSource","source_image_url","useParsedNumber","stringValue","lastCorrectValue","defaultMetaForProfile","template","defaultMetaForOther","dimension","Landscape","captions","recalculateImageSize","setDimension","Profile","Portrait","setSaving","xAsString","setX","yAsString","setY","widthAsString","setWidth","heightAsString","setHeight","setGrayscale","setTemplate","setPhoto","ratioLock","setRatioLock","originalSize","setOriginalSize","captionNL","setCaptionNL","captionEN","setCaptionEN","captionFR","setCaptionFR","captionDE","setCaptionDE","handleSizeChanged","handlePhotoLoaded","desiredAspectRatio","photoAspectRatio","floor","hasCaptions","templateUrl","template1image","template2image","template3image","xl","EditPhotoPreview","ChooseTemplateModal","ChoosePhotoModal","widthString","newHeight","heightString","newWidth","LockAlt","UnlockAlt","updatedStory","legend","Loading","processed_image_url","delete","infoStyle","cx","cy","ry","onChanged","handleClickedPassport","updated","PersonPhotoModal","extraPhotos","PhotoPreview","onClickedPhoto","isSaved","AddPassportPhotoControl","profileImage","SimpleImagePreview","map_image","mapImagePlaceholder","AddPhotoControl","linkedEventIds","coupling_use_events_with_places_refs","coupling_tags","newLinkedEventIds","handleDeleteTag","tagOptions","EventCheckbox","handleChangedOrphan","filteredStories","excludePersonStoryIdList","withChildStoryOnly","childStoryError","setChildStoryError","ModalBody","SearchStoryInput","ListMatchingPersonStories","setPersonStory","onMatchingItemsChanged","coupling_stories","handleSortChanged","displayedLinks","excludedPersonStoryIds","calculated_full_name","newLinks","newLinkedIds","coupling_story_refs","button","selectedStory","SearchStoryModal","handleClickedRow","ContactPersonInput","ContactPersonInputComponent","KeyLocationInput","onClear","KeyLocationInputComponent","KeyStoryTab","keyStoryDate","keyStoryDateError","onKeyStoryDateChanged","keyStoryOrganisationTitle","keyStoryOrganisationTitleError","onkeyStoryOrganisationTitleChanged","getPdfUrl","key_location_id","linked_contact_persons","newContactPersons","linkedContactPerson","key_date","EditPersonStoryPage","originalPersonStory","onUpdatePersonData","onUpdatePlaceData","saveResult","notification","resetValidationErrors","savedPersonStory","handleClickedPublishMuseum","autoLinkedStories","manualLinkedStories","hasPublishedLinkedStories","publish","handleClickedPublishKey","handleClickedUnpublish","handleKeyStoryDateChanged","iso","handleKeyStoryOrganisationTitleChanged","key_organisation_title","numberOfMatchingItems","imageErrors","keyStoryErrors","fetchPersonStoryData","personIdRef","createNewPersonStoryFromPersonId","publishResult","renderPersonPlaceTabContent","renderStoriesTabContent","renderPhotosTabContent","PhotosTab","renderQualificationsTab","QualificationsTab","renderLinkedStoriesTab","LinkedStoriesTab","numberOfItems","renderKeyStoryTab","renderSummaryTabContent","hasKeyStoryErrors","keyPosition","countQualifications","countLinkedStories","coupling_use_died_date","createNewPersonStoryFromPerson","keyDate","fixWhitespaceLines","storyErrors","languageStrings","errorFound","storyError","storyStatusErrorName","storyPart1ErrorName","storyPart2ErrorName","storyChildStatusErrorName","storyChildPart1ErrorName","storyChildPart2ErrorName","storyErrorsFromValidationResult","mapImage","key_position","linked_contact_person","PublicLink","btn","ImageCarrousel","images","setCurrent","setFullscreenOpen","currentUrl","fullSizeUrl","legenda","nextUrl","prevUrl","carrouselWrapper","carrousel","ImageCarrouselContent","onClickedNext","onClickedPrev","ImageCarrouselIndicator","previousButton","ChevronLeftLight","visibility","nextButton","ChevronRightLight","indicator","StoryView","child","storyPart1","storyPart2","storyWrapper","storyLine","storyIconWrapper","storyIcon","storyContent","profile_image_url","storyPersonPhoto","fadeLeft","fadeRight","fadeTop","fadeBottom","TimelineEventView","eventLineTop","eventLineBottom","namelistLinks","PersonWithEvents","ViewPersonStoryPage","alsoKnownAs","timeline","ViewStoryPairPage","story1","story1id","story2","story2id","person1","person2","paragraph","PasswordInput","score","StrengthBar","scoreClass","scoreCapped","min","role","LoginModal","loginInfo","BreadcrumbItem","views","CollapseIcon","SmallDropdownMenu","DropdownMenuItemStyle","DropdownMenuItem","AppBar","handleClickedLogout","handleClickedUserSettings","getLanguageListener","onLanguageChanged","page_title","SignOut","languageSelector","BreadcrumbsView","SideBarColor","SideBar","logo","backgroundImage","version","NavItem","NavGroup","NavGroupItem","ContactMomentView","contactMomentMain","Stop","AppSideBar","Red","Documentation","ContactMoment","Cogs","NoLoginAppBar","PublicHeader","ypresPeaceLogo","back","pageHeader","ypresLogo","PublicLayout","Layout","NoFrames","NoFramesLayout","Public","PublicPerson","PublicPersonKey","PublicMapKeyLocations","BlankLayout","RegularLayout","loggedIn","LoadingModal","grouped","messages","registerAsApiErrorHandler","handleError","BaseApp","loggingIn","modalCounter","loadingInfo","globalErrorHandler","appContext","handleRequireLogin","Modal","newModal","handleModalClosed","_stopLoading","newLoading","renderRoutes","pageParams","renderRouteSwitch","renderPage","PageClass","queryString","processParams","parseParams","renderWithProps","extractProps","extraProps","renderers","getUserConfirmation","when","parts","part","separator","photos","getAttachmentPreviewUrl","AttachmentListView","attachmentViews","KeyLocationTab","positionError","yearError","positionLocked","onNameChange","onPositionChange","onYearChange","onNotesChange","onPhotoCreated","onPhotoDeleted","onNumberChange","onPositionLockedChange","localLanguage","setLocalLanguage","onNumberValueChangedChanged","notesForLanguage","newNotes","QRCardFullContent","QRCardContent","QR","LocationStoriesTab","displayedStories","setPositionError","setYear","setYearError","setNumber","numberError","setNumberError","setPositionLocked","emptyLanguages","setPhotos","createNewKeyLocation","handleClickedRemoveAttachment","handleCreatedAttachment","hasErrors","exec","yearAsInt","numberAsInt","InvalidPosition","LocationWithPhotos","ViewKeyLocationPage","keyStories","KeyLocationView","storyStyles","carrouselImages","storyViewStyles","fromPosition","storyPreview","fetch","response","getMapLocations","mapboxgl","accessToken","mapboxToken","ViewMapKeyLocationPage","markersAdded","setLng","setLat","setZoom","markers","setMarkers","mapLoaded","setMapLoaded","locations","generateHtmlForKeyLocation","placeMarkers","loadImage","addImage","addLayer","features","feature","properties","Popup","setLngLat","setHTML","setOffset","addTo","addSource","marker","Map","container","PrivateRoute","App","exact","path","LoginPage","ActivateAccountPage","RequestPasswordResetPage","ListCollectionsPage","CreateCollectionPage","ViewCollectionPage","EditCollectionPage","EditCollectionDocument","ListMemorialsPage","EditMemorialPage","ViewMemorialPage","ListPersonStoriesPage","ListPersonsPage","EditPersonPage","AdvancedSearchPage","ListPlacesPage","ListUsersPage","ListProjectsPage","ViewProjectPage","ListContactPersonsPage","ListContactMomentsPage","EditContactPersonPage","RecordContactMomentPage","PublicSearchPersonsTable","listState","updateListState","resultsTable","aName","bName","details","setDetails","sliceWithDetails","SearchTab","setArgs","execute","advancedSearchRow","filtericon","Filter","ResultsTab","basicSearch","setBasicSearch","setAdvancedSearch","setErrors","publicStyles","Print","ViewPersonPublicPage","LoadingView","minHeight","PublicViewProject","projectId","setProject","createHashHistory","store","createStore","app","pathname","PublicSearchApp","getElementById","serviceWorker","registration","unregister"],"mappings":"yFACAA,EAAOC,QAAU,CAAC,OAAS,iCAAiC,QAAU,kCAAkC,UAAY,sC,oBCApHD,EAAOC,QAAU,CAAC,UAAY,6BAA6B,aAAe,gCAAgC,UAAY,+B,oBCAtHD,EAAOC,QAAU,CAAC,QAAU,2BAA2B,MAAQ,yBAAyB,KAAO,wBAAwB,UAAY,6BAA6B,SAAW,8B,oBCA3KD,EAAOC,QAAU,CAAC,QAAU,wBAAwB,MAAQ,sBAAsB,MAAQ,sBAAsB,MAAQ,wB,oBCAxHD,EAAOC,QAAU,CAAC,OAAS,oCAAoC,YAAc,yCAAyC,YAAc,yCAAyC,QAAU,uC,oBCAvLD,EAAOC,QAAU,CAAC,YAAc,kCAAkC,gBAAkB,wC,oBCApFD,EAAOC,QAAU,CAAC,SAAW,0BAA0B,YAAc,6BAA6B,aAAe,gC,oBCAjHD,EAAOC,QAAU,CAAC,UAAY,sCAAsC,eAAiB,2CAA2C,QAAU,sC,oBCA1ID,EAAOC,QAAU,CAAC,MAAQ,kCAAkC,KAAO,iCAAiC,KAAO,mC,oBCA3GD,EAAOC,QAAU,CAAC,iBAAmB,iCAAiC,KAAO,qBAAqB,WAAa,6B,oBCA/GD,EAAOC,QAAU,CAAC,KAAO,mBAAmB,UAAY,0B,oBCAxDD,EAAOC,QAAU,CAAC,gBAAkB,uCAAuC,cAAgB,uC,oBCA3FD,EAAOC,QAAU,CAAC,WAAa,mCAAmC,SAAW,mC,oBCA7ED,EAAOC,QAAU,CAAC,SAAW,2BAA2B,KAAO,yB,oBCA/DD,EAAOC,QAAU,CAAC,WAAa,iC,oBCA/BD,EAAOC,QAAU,CAAC,IAAM,4B,oBCAxBD,EAAOC,QAAU,CAAC,OAAS,oCAAoC,MAAQ,qC,oBCAvED,EAAOC,QAAU,CAAC,cAAgB,kCAAkC,kBAAoB,wC,oBCAxFD,EAAOC,QAAU,CAAC,OAAS,sCAAsC,aAAe,8C,oBCAhFD,EAAOC,QAAU,CAAC,OAAS,mC,mBCA3BD,EAAOC,QAAU,CAAC,MAAQ,yBAAyB,aAAe,gCAAgC,iBAAmB,oCAAoC,UAAY,6BAA6B,UAAY,6BAA6B,iBAAmB,oCAAoC,SAAW,4BAA4B,UAAY,6BAA6B,QAAU,2BAA2B,WAAa,8BAA8B,aAAe,kC,wv9OCAjdD,EAAOC,QAAU,CAAC,OAAS,sCAAsC,MAAQ,qCAAqC,aAAe,4CAA4C,gBAAkB,+CAA+C,iBAAmB,gDAAgD,UAAY,yCAAyC,UAAY,2C,oBCA9WD,EAAOC,QAAU,CAAC,MAAQ,8B,oBCA1BD,EAAOC,QAAU,CAAC,gBAAkB,kD,oBCApCD,EAAOC,QAAU,CAAC,QAAU,2B,oBCA5BD,EAAOC,QAAU,CAAC,YAAc,gCAAgC,aAAe,iCAAiC,4BAA8B,gDAAgD,gBAAkB,oCAAoC,sBAAwB,0CAA0C,kBAAoB,sCAAsC,uBAAyB,2CAA2C,+BAAiC,mDAAmD,wBAA0B,4CAA4C,wBAA0B,8C,oBCAxmBD,EAAOC,QAAU,CAAC,KAAO,yB,oBCAzBD,EAAOC,QAAU,CAAC,MAAQ,2B,oBCA1BD,EAAOC,QAAU,CAAC,cAAgB,4C,oBCAlCD,EAAOC,QAAU,CAAC,OAAS,0B,2ECA3BD,EAAOC,QAAU,CAAC,QAAU,2B,oBCA5BD,EAAOC,QAAU,CAAC,OAAS,+B,2MCA3BD,EAAOC,QAAU,CAAC,OAAS,2BAA2B,kBAAoB,sCAAsC,iBAAmB,qCAAqC,aAAe,mC,mBCAvLD,EAAOC,QAAU,CAAC,MAAQ,+BAA+B,cAAgB,uCAAuC,QAAU,iCAAiC,OAAS,kC,mBCApKD,EAAOC,QAAU,CAAC,aAAe,4BAA4B,cAAgB,6BAA6B,eAAiB,8BAA8B,UAAY,yBAAyB,QAAU,uBAAuB,MAAQ,qBAAqB,aAAe,4BAA4B,aAAe,4BAA4B,mBAAqB,oC,mBCAvWD,EAAOC,QAAU,CAAC,MAAQ,sCAAsC,SAAW,yCAAyC,QAAU,wCAAwC,iBAAmB,iDAAiD,OAAS,uCAAuC,UAAY,0CAA0C,SAAW,yCAAyC,SAAW,yCAAyC,WAAa,2CAA2C,OAAS,yC,mBCAzfD,EAAOC,QAAU,CAAC,QAAU,8BAA8B,WAAa,iCAAiC,kBAAoB,wCAAwC,QAAU,8BAA8B,OAAS,6BAA6B,YAAc,kCAAkC,WAAa,iCAAiC,mBAAqB,yCAAyC,OAAS,6BAA6B,MAAQ,8B,mBCA5bD,EAAOC,QAAU,CAAC,MAAQ,0BAA0B,iBAAmB,qCAAqC,UAAY,8BAA8B,UAAY,8BAA8B,WAAa,iC,2HCkBzMC,EACAC,EACAC,E,iBALAC,EAAsB,EACtBC,GAA0B,EAC1BC,GAAqB,EAMzBC,IAAEC,UAAUC,OAAM,WACd,MAAMC,EAAeH,IAAEI,QAAQC,QAG/BC,EAAIC,oBAGAJ,GAAgB,KAChBG,EAAIE,gBAGRF,EAAIG,sBAGJH,EAAII,mBAGJV,IAAE,mBAAmBW,UAQsB,IAAvCX,IAAE,0BAA0BY,QAC5BZ,IAAE,0BAA0Ba,kBAGhCb,IAAE,iBAAiBc,GAAG,SAAS,WAC3Bd,IAAEe,MAAMC,OAAO,gBAAgBC,SAAS,wBACzCH,GAAG,QAAQ,WACVd,IAAEe,MAAMC,OAAO,gBAAgBE,YAAY,wBAK/ClB,IAAE,QAAQc,GAAG,sBAAuB,kBAAkB,SAASK,GAC3DA,EAAEC,wBAKVpB,IAAEI,QAAQiB,QAAO,WACTrB,IAAEI,QAAQC,SAAW,KACrBC,EAAIE,mBAIZ,MAAMF,EAAM,CACRgB,KAAM,CACFC,oBAAqB,GAEzBhB,kBAAmB,WAEf,MAAMiB,GADN9B,EAAWM,IAAE,aACcyB,KAAK,SAEhC,QAAkBC,IAAdF,EAAyB,CACzB,MAAMG,EAAoB,gEAAkEH,EAAY,QACxG9B,EAASkC,OAAOD,QACmB,IAA5B7B,IAEPH,EAAiBkC,KAAK,gBAAgBC,SACtCnC,EAAiBkC,KAAK,oBAAoBC,SAE1ChC,GAA0B,IAIlCU,cAAe,WAKX,GAJAb,EAAmBK,IAAE,oBAIhBF,EA2BGE,IAAEI,QAAQC,QAAU,MAEpBV,EAAiBkC,KAAK,gBAAgBC,SACtCnC,EAAiBkC,KAAK,oBAAoBC,SAE1ChC,GAA0B,OAhCJ,CAE1BF,EAAUI,IAAE,OAAO6B,KAAK,oBAAoBE,QAAQC,OAAM,GAE1D,IAAIC,EAAc,GAIlBrC,EAAQsC,SAAS,MAAMC,MAAK,WACxB,MAAMC,EAAepC,IAAEe,MAAMsB,OAC7BJ,GAA4BG,KAGhCH,EAAc,mCAAqCA,EAAc,QAEjE,MAAMK,EAAe3C,EAAiBkC,KAAK,WAGtB7B,IAAEiC,GACVM,aAAaD,GAE1BtC,IAAE,sDAAsDwC,OAAM,SAASC,GACnEA,EAAMrB,qBAGVtB,GAA0B,EAW9B,IAAKC,EAAoB,CACrB,MAAM2C,EAAU1C,IAAE,mBAElB0C,EAAQF,OAAM,WAEV,GAA4B,IAAxB3C,EACAG,IAAE,QAAQkB,YAAY,YAEtBlB,IAAE,gBAAgB8B,SAClBa,YAAW,WACPD,EAAQxB,YAAY,aACrB,KAEHrB,EAAsB,MACnB,CACH8C,YAAW,WACPD,EAAQzB,SAAS,aAClB,KAGH,MAAM2B,EAAoB5C,IAAE,eAAe,GAAG6C,aACxCC,EAAS9C,IAAE,mCACjB8C,EAAOC,IAAI,SAAUH,EAAoB,MACzCE,EAAOE,SAAS,eAEhBL,YAAW,WACPG,EAAO7B,SAAS,aACjB,KAEH6B,EAAON,OAAM,WACTxC,IAAE,QAAQkB,YAAY,YACtBrB,EAAsB,EAEtBiD,EAAO5B,YAAY,WAEnByB,YAAW,WACPG,EAAOhB,SACPY,EAAQxB,YAAY,aACrB,QAGPlB,IAAE,QAAQiB,SAAS,YACnBpB,EAAsB,MAK9BE,GAAqB,IAI7BU,oBAAqB,WAGjBT,IAAE,sBAAsBc,GAAG,kBAAkB,WACzC,GAAId,IAAEI,QAAQC,QAAU,IACpB,OAAqC,IAAjCC,EAAIgB,KAAK2B,uBAQrBjD,IAAE,oBAAoBwC,OAAM,YACa,IAAjClC,EAAIgB,KAAK2B,qBACTjD,IAAE,QAAQkB,YAAY,gBACtBZ,EAAIgB,KAAK2B,qBAAsB,IAQ/BjD,IAAE,sBAAsBkD,SAAS,QAAQpC,GAAG,sBAAsB,WAC9Dd,IAAEe,MAAMgC,IAAI,SAAU,WAO1BJ,YAAW,WACP3C,IAAE,QAAQiB,SAAS,gBAEnBjB,IAAE,sBAAsB+C,IAAI,SAAU,QACtCzC,EAAIgB,KAAK2B,qBAAsB,IAChC,MAIP,IAAIE,EAAuBC,aAAY,WACnChD,OAAOiD,cAAc,IAAIC,MAAM,aAChC,KAGHX,YAAW,WACPY,cAAcJ,KACf,SAIXzC,iBAAkB,WACdV,IAAE,iBAAiBmC,MAAK,WACpB,IAAIqB,EAAUxD,IAAEe,MAAM0C,SAAS,iBAC/BzD,IAAEwD,GAASvC,SAAS,uBAGxBjB,IAAE,kCAAkC0D,OAAM,WAClC,IAAIF,EAAUxD,IAAEe,MAAM4C,KAAK,eACtB3D,IAAEe,MAAM0C,SAAS,gBAClBzD,IAAEe,MAAME,SAAS,eACjBjB,IAAEwD,GAAST,IAAI,CACX,OAAU,OACV,QAAW,QACX,SAAY,eAKxB,WACI,IAAIS,EAAUxD,IAAEe,MAAM4C,KAAK,eAC3B3D,IAAEe,MAAMG,YAAY,eAEflB,IAAEe,MAAM0C,SAAS,eAClBzD,IAAEwD,GAAST,IAAI,CACX,OAAU,WAGnBP,OAAM,SAASC,GAClBA,EAAMmB,iBAEN,IAAIJ,EAAUxD,IAAEe,MAAM4C,KAAK,eACvBE,EAAS7D,IAAEwD,GAAStB,SAAS,cAAc2B,SAE3C7D,IAAEe,MAAM0C,SAAS,eACjBzD,IAAEwD,GAAST,IAAI,CACX,OAAU,QAGd/C,IAAEe,MAAMG,YAAY,gBAEpBlB,IAAEwD,GAAST,IAAI,CACX,OAAUc,EAAS,KAEvB7D,IAAEe,MAAME,SAAS,oB,gFClRjC,MAAM6C,EAAY,CAChB,G,OACA,G,OACA,G,OACA,G,QAiBF,SAASC,EAAKC,EAA0BC,GACtC,MAAO,CAAED,WAAUC,UAGrB,MAAMC,EAAQ,CACZC,WAAYJ,EAAK,kBAAmB,oBACpC9D,SAAU8D,EAAK,gBAAiB,kBAChCK,YAAaL,EAAK,mBAAoB,qBACtCM,OAAQN,EAAK,cAAe,gBAC5BO,eAAgBP,EAAK,sBAAuB,yBAC5CQ,aAAcR,EAAK,oBAAqB,sBACxCS,SAAUT,EAAK,gBAAiB,kBAChCU,MAAOV,EAAK,aAAc,eAC1BW,QAASX,EAAK,eAAgB,iBAC9BY,KAAMZ,EAAK,YAAa,cACxBa,OAAQb,EAAK,cAAe,gBAC5Bc,eAAgBd,EAAK,sBAAuB,wBAC5Ce,cAAef,EAAK,qBAAsB,uBAC1CgB,mBAAoBhB,EAAK,0BAA2B,4BACpDiB,cAAejB,EAAK,qBAAsB,uBAC1CkB,YAAalB,EAAK,mBAAoB,qBACtCmB,YAAanB,EAAK,mBAAoB,sBACtCoB,YAAapB,EAAK,mBAAoB,sBAIxC,IAAIqB,EAA4B,CAAC,KAAM,KAAM,KAAM,MAE5C,MAAMC,EAAoB,KAC/B,MAAMC,EAAkBC,aAAaC,QAAQ,YAC7C,GAAuB,OAAnBF,QAA8C5D,IAAnB4D,EAsB7B,OAAOA,EAtBoD,CAC3D,MAAMG,EAAkBC,UAAUC,SAClC,IAAIF,EAiBF,MAAO,KAjBY,CAEnB,MACMG,EADmBH,EAAgBI,MAAM,KACP,GACxC,IACE,MAAMF,EAAWC,EAAeE,WAAWC,OAAOC,cAClD,OAAIZ,EAAca,SAASN,GAClBA,EAIA,KAET,MAAOxE,GACP,MAAO,SAUf,IAAI+E,EAAmBpC,EAAUuB,KAE1B,MAAMc,EAAeC,IAC1BF,EAAmBpC,EAAUsC,GAC7Bb,aAAac,QAAQ,WAAYD,GACjCE,IAAOC,OAAOH,IAMHI,EAAI,CAACC,EAAqBC,KACrC,IAAI9B,EAAUsB,EAAiBO,IAAQA,EACvC,QAAmB/E,IAAfgF,EACF,IAAK,IAAIC,KAASD,EAChB9B,EAASA,EAAOgC,QAAS,IAAGD,KAAUD,EAAWC,IAGrD,OAAO/B,GAGIZ,EAAYD,GAChByC,EAAEtC,EAAMH,GAAMC,UAGVC,EAAUF,GACdyC,EAAEtC,EAAMH,GAAME,QAGV4C,EAAY,CAAC9C,EAAY+C,IAClB,IAAXA,EAAe9C,EAASD,GAAQE,EAAOF,GCzGzC,SAASgD,EAAmBC,GACjC,MAA6B,kBAAfA,EAAIC,QAA4C,kBAAdD,EAAIE,OAA0C,kBAAbF,EAAIvF,KAIhF,IAAK0F,G,SAAAA,K,QAAAA,E,+BAAAA,E,sCAAAA,E,oDAAAA,E,2BAAAA,E,+CAAAA,E,4DAAAA,E,qCAAAA,E,+CAAAA,E,oDAAAA,E,6DAAAA,E,uDAAAA,E,kCAAAA,E,+BAAAA,E,sCAAAA,E,8BAAAA,E,oBAAAA,E,8BAAAA,E,qCAAAA,E,2BAAAA,E,+BAAAA,E,gCAAAA,E,iDAAAA,E,mDAAAA,E,6CAAAA,E,kDAAAA,E,+DAAAA,E,oDAAAA,E,iCAAAA,E,kDAAAA,E,4CAAAA,E,2DAAAA,E,uDAAAA,E,mFAAAA,E,qFAAAA,E,sFAAAA,E,qEAAAA,E,2BAAAA,E,oCAAAA,E,oCAAAA,M,KAoDZ,MAAMC,EAAkD,CACtD,CAACD,EAAgBE,GAAI,cACrB,CAACF,EAAgBG,cAAe,iCAChC,CAACH,EAAgBI,YAAa,+BAC9B,CAACJ,EAAgBK,cAAe,iCAChC,CAACL,EAAgBM,iBAAkB,oCACnC,CAACN,EAAgBO,QAAS,2BAC1B,CAACP,EAAgBQ,kBAAmB,qCACpC,CAACR,EAAgBS,wBAAyB,2CAC1C,CAACT,EAAgBU,aAAc,gCAC/B,CAACV,EAAgBW,eAAgB,kCACjC,CAACX,EAAgBY,qBAAsB,wCACvC,CAACZ,EAAgBa,cAAe,iCAChC,CAACb,EAAgBc,iBAAkB,oCACnC,CAACd,EAAgBe,cAAe,iCAChC,CAACf,EAAgBgB,SAAU,4BAC3B,CAAChB,EAAgBiB,aAAc,gCAC/B,CAACjB,EAAgBkB,iBAAkB,oCACnC,CAAClB,EAAgBmB,sBAAuB,yCACxC,CAACnB,EAAgBoB,mBAAoB,sCACrC,CAACpB,EAAgBqB,WAAY,8BAC7B,CAACrB,EAAgBsB,cAAe,iCAChC,CAACtB,EAAgBuB,sBAAuB,yCACxC,CAACvB,EAAgBwB,uBAAwB,0CACzC,CAACxB,EAAgByB,oBAAqB,uCACtC,CAACzB,EAAgB0B,uBAAwB,0CACzC,CAAC1B,EAAgB2B,6BAA8B,gDAC/C,CAAC3B,EAAgB4B,wBAAyB,2CAC1C,CAAC5B,EAAgB6B,eAAgB,kCACjC,CAAC7B,EAAgB8B,mBAAoB,sCACrC,CAAC9B,EAAgB+B,cAAe,+CAChC,CAAC/B,EAAgBgC,oBAAqB,uCACtC,CAAChC,EAAgBiC,2BAA4B,8CAC7C,CAACjC,EAAgBkC,4BAA6B,+CAC9C,CAAClC,EAAgBmC,sCAAuC,yDACxD,CAACnC,EAAgBoC,uCAAwC,0DACzD,CAACpC,EAAgBqC,uCAAwC,0DACzD,CAACrC,EAAgBsC,gCAAiC,6CAClD,CAACtC,EAAgBuC,YAAa,+BAC9B,CAACvC,EAAgBwC,gBAAiB,oCAG7B,SAASC,EAAaC,GAC3B,OAAOrD,GACLY,EAAWvF,MAAKiI,GAAKA,EAAE,KAAOD,KAC3B,CAAC1C,EAAgBE,GAAI,4BACxB,IAGG,SAAS0C,EAAoBF,EAAyBG,GAC3D,QAActI,IAAVmI,GAAuBA,IAAU1C,EAAgBE,GACnD,OAEF,MAAM4C,GAAYD,GAAa,IAAInI,MAAKiI,GAAKA,EAAE,KAAOD,IACtD,OAAOI,EAAWA,EAAS,GAAKL,EAAaC,GChHxC,SAASK,EAAqBC,GAMnC,MAAOC,EAAOC,GAAYC,mBAAYH,IAC/BN,EAAOU,GAAYD,qBAU1B,MAAO,CAACF,EARiBA,IACvBC,EAASD,GACTG,OAAS7I,IAMqBmI,EAJJA,IAC1BU,EAASR,EAAoBF,MAM1B,SAASW,IACd,OAAOC,cAGF,SAASC,EAAkBC,GAChC,OAAOC,YAAyBD,GAc3B,SAASE,EAAWC,GACzB,MAAMC,EAAOC,iBAAOF,GAEpB,OADAC,EAAKE,QAAUH,EACRI,uBAAY,IAAMH,EAAKE,WAAW,CAACF,IC3CrC,IAAKI,G,SAAAA,K,mDAAAA,E,sCAAAA,E,wDAAAA,E,oDAAAA,E,sCAAAA,E,oCAAAA,E,0CAAAA,E,4CAAAA,E,yEAAAA,E,sCAAAA,E,gCAAAA,E,2CAAAA,E,oDAAAA,M,KAoCL,SAASC,EAAmDC,EAASjB,GAC1E,MAAO,CACLkB,KAAMH,EAAcI,iBACpBC,QAAS,CAAEH,OAAMjB,UAsCd,SAASqB,EAAyCJ,GACvD,MAAMK,EAAQhB,GAAegB,GAASA,EAAMC,WAAWN,KACjDO,EAAWpB,IAIjB,MAAO,CAACkB,EAHOR,uBAAaW,IAC1BD,EAASR,EAAuBC,EAAMQ,MACrC,CAACD,EAAUP,KAIT,SAASS,EAAYC,EAA6B5B,GACvD,MAAMuB,EAAQhB,GAAegB,IAC3B,MAAMM,EAAwBD,EAC9B,OAAKA,GAAYC,EAGRN,EAAMO,UAAUD,GAFhB7B,KAKLyB,EAAWpB,IAMjB,MAAO,CAACkB,EALQQ,IA5CX,IAA8Bb,EAAcjB,EA6C3C2B,GACFH,GA9C+BP,EA8CDU,EA9Ce3B,EA8CN8B,EA7CpC,CACLZ,KAAMH,EAAcgB,eACpBX,QAAS,CAAEH,OAAMjB,cAqDd,SAASgC,EAAyBpH,GAEvC,MAAO,CACLsG,KAAMH,EAAckB,mBACpBb,QAASxG,GAqBN,SAASsH,EACdC,GAEA,MAAO,CACLjB,KAAMH,EAAcqB,kCACpBhB,QAASe,GAQN,SAASE,IACd,MAAO,CACLnB,KAAMH,EAAcuB,iBACpBlB,QAAS,IAmBN,SAASmB,EAAmBjB,GACjC,MAAO,CACLJ,KAAMH,EAAcyB,mBACpBpB,QAASE,GC/KN,IAAKmB,G,SAAAA,K,sBAAAA,E,cAAAA,E,kBAAAA,E,gBAAAA,E,iCAAAA,E,mBAAAA,E,qBAAAA,E,oBAAAA,E,mCAAAA,M,KAYL,MAAMC,EAA8C,CACzD,CAACD,EAASE,MAAO,kBACjB,CAACF,EAASG,QAAS,oBACnB,CAACH,EAASI,OAAQ,mBAClB,CAACJ,EAASK,eAAgB,2BAC1B,CAACL,EAASM,QAAS,oBACnB,CAACN,EAASO,SAAU,qBACpB,CAACP,EAASQ,SAAU,qBACpB,CAACR,EAASS,eAAgB,4BAGtBC,EAA6C,CACjD,CAACV,EAASW,UAAW,yBAClBV,GAOE,IAAKW,G,SAAAA,K,UAAAA,E,gBAAAA,E,sBAAAA,E,6BAAAA,E,sBAAAA,E,kBAAAA,E,qBAAAA,E,qBAAAA,E,qBAAAA,E,qBAAAA,E,uCAAAA,E,oBAAAA,E,qBAAAA,M,KAgBL,MAAMC,EAAgC,CAC3CD,EAAQE,IACRF,EAAQG,SACRH,EAAQI,OACRJ,EAAQK,UACRL,EAAQM,kBACRN,EAAQO,QACRP,EAAQQ,SACRR,EAAQS,IACRT,EAAQU,UAGGC,GAA6C,CACxD,CAACX,EAAQE,IAAK,eACd,CAACF,EAAQG,SAAU,oBACnB,CAACH,EAAQI,OAAQ,kBACjB,CAACJ,EAAQK,UAAW,qBACpB,CAACL,EAAQS,IAAK,eACd,CAACT,EAAQO,QAAS,mBAClB,CAACP,EAAQY,SAAU,oBACnB,CAACZ,EAAQa,SAAU,oBACnB,CAACb,EAAQc,SAAU,oBACnB,CAACd,EAAQe,SAAU,oBACnB,CAACf,EAAQM,kBAAmB,6BAC5B,CAACN,EAAQQ,SAAU,oBACnB,CAACR,EAAQU,SAAU,qBAGd,SAASM,GAAiBC,GAC/B,MAAMC,EAAcP,GAAavM,MAAKiI,GAAKA,EAAE,KAAO4E,IACpD,OAAOC,EAAcnI,EAAEmI,EAAY,IAAMD,EAsBpC,MAAME,GACI,gBAACC,GACZ,OAAO,IAAID,GACPC,EAAKC,IACLD,EAAKvD,KACLuD,EAAKE,QACLF,EAAKG,KACLH,EAAKI,MACLJ,EAAKK,MACLL,EAAKM,YACLN,EAAKlJ,UAebyJ,YACEC,EACA/D,EACAgE,EACAN,EACAC,EACAC,EACAC,EACAxJ,EACA4J,EACAb,EACAc,GACD,KAxBDH,QAwBA,OAvBA/D,UAuBA,OAtBAgE,cAsBA,OArBAN,UAqBA,OApBAC,WAoBA,OAnBAC,WAmBA,OAlBAC,iBAkBA,OAjBAxJ,cAiBA,OAhBA4J,UAgBA,OAfAb,aAeA,OAdAc,aAcA,EACIzO,KAAKsO,GAAKA,EACVtO,KAAKuK,KAAOA,EACZvK,KAAKuO,SAAWA,EAChBvO,KAAKiO,KAAOA,GAAQM,EACpBvO,KAAKkO,MAAQA,GAAS,GACtBlO,KAAKmO,MAAQA,GAAS,GACtBnO,KAAKoO,YAAcA,GAAe,GAClCpO,KAAK4E,SAAWA,GAAY,KAC5B5E,KAAKwO,KAAOA,GAAQ,GACpBxO,KAAK2N,QAAUA,GAAW,MAC1B3N,KAAKyO,QAAUA,IAAW,EAG9BC,UACE,OAAO1O,KAAKuK,OAASuB,EAASE,MAGhC2C,YACE,OAAO3O,KAAKuK,OAASuB,EAASG,QAGhC2C,mBACE,OAAO5O,KAAKuK,OAASuB,EAASE,OAAShM,KAAKuK,OAASuB,EAASG,QAGhE4C,kBACE,OAAO7O,KAAKuK,OAASuB,EAASI,QAAUlM,KAAK4O,mBAG/CE,aACE,OAAO9O,KAAKuK,OAASuB,EAASE,OACzBhM,KAAKuK,OAASuB,EAASI,QACvBlM,KAAKuK,OAASuB,EAASK,gBACvBnM,KAAKuK,OAASuB,EAASG,QAG9B8C,UACE,OAAO/O,KAAKuK,OAASuB,EAASW,UAGhCuC,UACE,OAAQhP,KAAK8O,aAGfG,SACI,MAAO,CACHlB,IAAK/N,KAAKsO,GACV/D,KAAMvK,KAAKuK,KACXyD,QAAShO,KAAKuO,SACdN,KAAMjO,KAAKiO,KACXC,MAAOlO,KAAKkO,MACZC,MAAOnO,KAAKmO,MACZC,YAAapO,KAAKoO,YAClBxJ,SAAU5E,KAAK4E,WAKlB,MAAMsK,GAAgB,IAAIrB,GAAK,KAAM/B,EAASW,UAAW,GAAI,GAAI,GAAI,GAAI,GAAI,MCpM7E,IAAK0C,I,SAAAA,K,kBAAAA,E,YAAAA,E,0BAAAA,E,oBAAAA,E,4BAAAA,E,iCAAAA,E,uDAAAA,E,uDAAAA,E,mBAAAA,Q,KAYL,MAAMC,GAAa,CACxBD,GAAUE,QACVF,GAAUG,KACVH,GAAUI,YACVJ,GAAUK,SACVL,GAAUM,aACVN,GAAUO,eACVP,GAAUQ,yBACVR,GAAUS,yBACVT,GAAUU,SAGL,IAAKC,GAUL,SAASC,GAAwB7J,GACtC,OAAQA,GACN,KAAK4J,GAAiBE,UAAW,OAAOvK,EAAE,8BAC1C,KAAKqK,GAAiBG,MAAO,OAAOxK,EAAE,0BACtC,KAAKqK,GAAiBI,OAAQ,OAAOzK,EAAE,gCACvC,KAAKqK,GAAiBK,SAAU,OAAO1K,EAAE,6BACzC,KAAKqK,GAAiBM,IAAK,OAAO3K,EAAE,wBACpC,QACE,OAAOA,EAAE,gCAIR,SAAS4K,GAAyBnK,GACvC,OAAQA,GACN,KAAK4J,GAAiBE,UAAW,MAAO,UACxC,KAAKF,GAAiBG,MAAO,MAAO,UACpC,KAAKH,GAAiBK,SAAU,MAAO,UACvC,KAAKL,GAAiBI,OAAQ,MAAO,UACrC,QAAS,MAAO,Y,SA5BRJ,K,sBAAAA,E,cAAAA,E,qBAAAA,E,sBAAAA,E,wBAAAA,E,eAAAA,Q,KAsEL,SAASQ,GAASjH,GACvB,OAAOA,IAAUA,EAAMkH,KAAOlH,EAAMmH,KAAO,CAAED,IAAKlH,EAAMkH,IAAKE,IAAKpH,EAAMmH,UAAQ7P,EAE3E,SAAS+P,GAASrH,GACvB,OAAOA,GAAS,CAAEkH,IAAKlH,EAAMkH,IAAKC,IAAKnH,EAAMoH,KA6BxC,SAASE,GAAQjN,GACtB,OAAOA,GAAUA,EAAc6G,KAG1B,MAAMqG,GAGXvC,YAAY3K,GAAgB,KAF5BA,WAE2B,EACzB1D,KAAK0D,MAAQA,EAGX4K,SACF,OAAOtO,KAAK0D,MAAMqK,IAGhBE,WACF,OAAOjO,KAAK6Q,iBAAiB5C,KAG3B6C,2BACF,MAAMC,EAAY/Q,KAAKiO,KACvB,OAAIjO,KAAK0D,MAAMsN,kBAAkBC,MAAKlI,GAAKA,EAAE/D,OAAOnF,OAAS,IACpDkR,EAAa,MAClB/Q,KAAK0D,MAAMsN,kBAAkBE,KAAK,UAG7BH,EAIP7K,aACF,OAAOlG,KAAK0D,MAAMyN,kBAGhB5G,WACF,OAAOvK,KAAK0D,MAAM6G,KAGhB6G,kBACF,OAAOpR,KAAK0D,MAAM2N,aAGpBC,SAAS1M,GACP,MAAMgJ,EAAchJ,EAAW5E,KAAK0D,MAAMX,UAAU6B,GAAY5E,KAAK6Q,iBACrE,IAAIhN,EAAS+J,EAAYK,KAQzB,OAPIL,EAAY2D,UAAY3D,EAAY2D,WAAa3D,EAAYK,OAC/DpK,GAAU,KAAO+J,EAAY2D,UAC3B3D,EAAY4D,8BACd3N,GAAU,KAAO+J,EAAY4D,6BAC3B5D,EAAY6D,8BACd5N,GAAU,KAAO+J,EAAY6D,6BAC/B5N,GAAU,KAAO7D,KAAK0D,MAAM2N,aACrBxN,EAGT6N,kBAAkB9M,GAChB,MAAMgJ,EAAchJ,EAAW5E,KAAK0D,MAAMX,UAAU6B,GAAY5E,KAAK6Q,iBAC/Dc,EAAuB,GAQ7B,OAPI/D,EAAY2D,UAAY3D,EAAY2D,WAAa3D,EAAYK,MAC/D0D,EAAWC,KAAKhE,EAAY2D,UAC1B3D,EAAY4D,6BACdG,EAAWC,KAAKhE,EAAY4D,6BAC1B5D,EAAY6D,6BACdE,EAAWC,KAAKhE,EAAY6D,6BAC9BE,EAAWC,KAAK5R,KAAK0D,MAAM2N,cACpBM,EAAWT,KAAK,MAGzBL,iBACE,OAAO7Q,KAAK0D,MAAMX,UAAUuB,MACvBtE,KAAK0D,MAAMX,UAAU6N,GAAMiB,mBAAmB7R,KAAK0D,MAAM2N,eAGhES,cACE,MAAM,IAAEC,GAAQ/R,KAAK0D,MACrB,OAAOqO,IAAoB,IAAZA,EAAIxB,KAAyB,IAAZwB,EAAIvB,KAGb,0BAACY,GACxB,OAAQA,GACN,IAAK,KACL,IAAK,KACH,MAAO,KACT,IAAK,KACH,MAAO,KACT,IAAK,KACH,MAAO,KACT,QACE,MAAO,OAKR,SAASY,GAAiBC,GAC/B,OAAQA,GACN,KAAK9C,GAAUG,KAAM,OAAO7J,EAAE,kBAC9B,KAAK0J,GAAUI,YAAa,OAAO9J,EAAE,yBACrC,KAAK0J,GAAUK,SAAU,OAAO/J,EAAE,sBAClC,KAAK0J,GAAUM,aAAc,OAAOhK,EAAE,0BACtC,KAAK0J,GAAUO,eAAgB,OAAOjK,EAAE,4BACxC,KAAK0J,GAAUQ,yBAA0B,OAAOlK,EAAE,mBAClD,KAAK0J,GAAUS,yBAA0B,OAAOnK,EAAE,mBAClD,KAAK0J,GAAUU,QAAS,OAAOpK,EAAE,qBACjC,KAAK0J,GAAUE,QACf,QACE,OAAO5J,EAAE,sBAqDQqK,GAAiBG,MAE9Bd,GAAUI,Y,YC3Rb,MAAM2C,GAAeC,GAAqB,oBAAGC,UAAWD,EAAME,KAAMC,MAAOH,EAAMG,QAC3EC,GAAc,IAAM,oBAAGH,UAAU,kCAEvC,IAAKI,GC0CAC,I,SD1CAD,K,kBAAAA,E,mBAAAA,E,iBAAAA,E,oCAAAA,E,qBAAAA,E,uBAAAA,E,gCAAAA,E,2BAAAA,E,kCAAAA,E,yBAAAA,E,mBAAAA,E,2BAAAA,E,qBAAAA,E,mBAAAA,E,wBAAAA,E,4BAAAA,E,wBAAAA,E,qBAAAA,E,8BAAAA,E,qBAAAA,E,kCAAAA,E,kCAAAA,E,gCAAAA,E,8BAAAA,E,gCAAAA,E,mCAAAA,E,qCAAAA,E,uCAAAA,E,yCAAAA,E,mBAAAA,E,mBAAAA,E,2BAAAA,E,mBAAAA,E,kCAAAA,E,oCAAAA,E,+CAAAA,E,iDAAAA,E,0BAAAA,E,gCAAAA,E,uBAAAA,E,4BAAAA,E,gCAAAA,E,mBAAAA,E,mBAAAA,E,qBAAAA,E,uBAAAA,E,qBAAAA,E,yBAAAA,E,sCAAAA,E,uBAAAA,E,uBAAAA,E,6BAAAA,E,oCAAAA,E,qBAAAA,E,iBAAAA,E,qCAAAA,E,6BAAAA,E,oCAAAA,E,2BAAAA,E,uBAAAA,E,iBAAAA,E,mBAAAA,E,qBAAAA,E,kBAAAA,E,oBAAAA,E,qBAAAA,E,kCAAAA,E,kCAAAA,E,uBAAAA,E,uBAAAA,E,4BAAAA,E,4BAAAA,E,6BAAAA,E,0BAAAA,E,mBAAAA,E,kCAAAA,E,oBAAAA,E,mBAAAA,E,mBAAAA,E,0BAAAA,E,oCAAAA,E,2CAAAA,E,oCAAAA,E,0BAAAA,E,mBAAAA,E,sBAAAA,E,uBAAAA,E,qBAAAA,E,kBAAAA,E,mBAAAA,E,mCAAAA,E,0BAAAA,E,8BAAAA,E,qBAAAA,E,qBAAAA,E,yBAAAA,E,qBAAAA,E,oCAAAA,E,0BAAAA,E,uBAAAA,E,2BAAAA,E,oBAAAA,Q,cC0CAC,K,cAAAA,E,oBAAAA,E,kBAAAA,E,oBAAAA,E,aAAAA,Q,KAQL,MAAMC,GAA4C,CACvDD,GAAmBE,SACnBF,GAAmBG,QACnBH,GAAmBI,SACnBJ,GAAmBK,MAGd,SAASC,GAA0BxI,GACxC,OAAQA,GACN,KAAKkI,GAAmBO,MAAO,OAAOvN,EAAE,4BACxC,KAAKgN,GAAmBE,SAAU,OAAOlN,EAAE,+BAC3C,KAAKgN,GAAmBG,QAAS,OAAOnN,EAAE,8BAC1C,KAAKgN,GAAmBI,SAAU,OAAOpN,EAAE,+BAC3C,KAAKgN,GAAmBK,KAAM,OAAOrN,EAAE,2BACvC,QAAS,OAAO8E,GAIb,SAAS0I,GAA2B1I,GACzC,OAAQA,GACN,IAAK,YAEL,IAAK,WAAY,OAAOiI,GAAKU,QAD7B,IAAK,QAAS,OAAOV,GAAKW,MAE1B,QAAS,OAAOX,GAAKY,MAIlB,SAASC,GAA+B9I,GAC7C,OAAQA,GACN,IAAK,YACL,IAAK,WACH,OAAO9E,EAAE,0CACX,IAAK,QACH,OAAOA,EAAE,sCACX,QACE,MAAO,IAKN,IAAK6N,GAOL,SAASC,GAAyBhJ,GACvC,OAAQA,GACN,KAAK+I,GAAkBE,gBACrB,OAAO/N,EAAE,2CACX,KAAK6N,GAAkBG,QACrB,OAAOhO,EAAE,mCACX,KAAK6N,GAAkBI,SACrB,OAAOjO,EAAE,oCACX,KAAK6N,GAAkBK,KACrB,OAAOlO,EAAE,gCACX,QACE,MAAO,M,SAlBD6N,K,mCAAAA,E,kBAAAA,E,qBAAAA,E,aAAAA,Q,KAsBL,MAAMM,GAAmB,CAC9B,OACA,SACA,SACA,WACA,SACA,cACA,SACA,SACA,QACA,SACA,SACA,SACA,OACA,UAkBK,MAAMC,GAGXxF,YAAYyF,GAA0B,KAFtCA,YAEqC,EACnC9T,KAAK8T,OAASA,EAGZxF,SACF,OAAOtO,KAAK8T,OAAO/F,IAGjBE,WACF,OAAQjO,KAAK8T,OAAOvJ,MAClB,KAAKkI,GAAmBE,SACtB,OAAQ3S,KAAK8T,OAAOC,UAAY,IAAM,KAAO/T,KAAK8T,OAAOtF,KAC3D,KAAKiE,GAAmBG,QACtB,OAAQ5S,KAAK8T,OAAOE,SAAW,IAAM,KAAOhU,KAAK8T,OAAOtF,KAC1D,KAAKiE,GAAmBI,SACtB,OAAQ7S,KAAK8T,OAAOG,UAAY,IAAM,KAAOjU,KAAK8T,OAAOtF,KAC3D,KAAKiE,GAAmBK,KACtB,OAAQ9S,KAAK8T,OAAOI,SAAW,IAAK,KAAOlU,KAAK8T,OAAOK,MAAQ,IAC3D,MAAQnU,KAAK8T,OAAOG,UAAY,IAChC,KAAOjU,KAAK8T,OAAOtF,KACzB,QAEE,OADA4F,QAAQC,IAAI,2BAA4BrU,KAAMA,KAAK8T,QAC5C,MAAQ9T,KAAK8T,OAAOtF,MAI7BjE,WACF,OAAOvK,KAAK8T,OAAOvJ,KAGjBiE,WACF,OAAOxO,KAAK8T,OAAOtF,KAGjByF,eACF,OAAOjU,KAAK8T,OAAOG,SAGjBE,WACF,OAAOnU,KAAK8T,OAAOK,KAGjBG,aACF,OAAOtU,KAAK8T,OAAOI,SCrMhB,IAAKK,GAIAC,GAmBAC,GCzBAC,GCGAC,GAeAC,GCJAC,GAQAC,I,SHpBAP,K,WAAAA,Q,cAIAC,K,YAAAA,E,yBAAAA,E,aAAAA,Q,cAmBAC,K,wBAAAA,Q,KAIL,MAAMM,GAWI,gBAACjH,GACd,OAAO,IAAIiH,GACTjH,EAAKC,IACLD,EAAKvD,KACLuD,EAAKkH,MACLlH,EAAKM,YACLN,EAAK5H,OACL4H,EAAKmH,QACLnH,EAAKoH,UACLpH,EAAKxK,OACLwK,EAAKW,SAIG,eACV,OAAO,IAAIsG,GACT,GACAR,GAAuBY,IACvB,GACA,GACAX,GAAyBY,KACzB,GACA,QACAzU,GACA,GAIJ0N,YACEC,EACA/D,EACAyK,EACA5G,EACAlI,EACA+O,EACAC,EACA5R,EACAmL,GACC,KAhDHH,QAgDE,OA/CF/D,UA+CE,OA9CFyK,WA8CE,OA7CF5G,iBA6CE,OA5CFlI,YA4CE,OA3CF+O,aA2CE,OA1CFC,eA0CE,OAzCF5R,YAyCE,OAxCFmL,aAwCE,EACAzO,KAAKsO,GAAKA,EACVtO,KAAKuK,KAAOA,GAAQgK,GAAuBY,IAC3CnV,KAAKgV,MAAQA,GAAS,GACtBhV,KAAKoO,YAAcA,GAAe,GAClCpO,KAAKkG,OAASA,GAAUsO,GAAyBY,KACjDpV,KAAKiV,QAAUA,GAAW,GAC1BjV,KAAKkV,UAAYA,GAAa,GAC9BlV,KAAKsD,OAASA,EACdtD,KAAKyO,QAAUA,IAAW,EAG5BQ,SACE,MAAO,CACLlB,IAAK/N,KAAKsO,GACV/D,KAAMvK,KAAKuK,KACXyK,MAAOhV,KAAKgV,MACZ5G,YAAapO,KAAKoO,YAClBlI,OAAQlG,KAAKkG,OACbmP,SAAUrV,KAAKsD,OAAStD,KAAKsD,OAAOyK,IAAM,KAC1CkH,QAASjV,KAAKiV,QACdC,UAAWlV,KAAKkV,WAIpBI,gBACE,OAAOtV,KAAKkV,UAAY,MAASlV,KAAKgV,Q,SCxG9BN,K,YAAAA,E,qBAAAA,E,oBAAAA,E,sBAAAA,E,oBAAAA,E,0BAAAA,E,oBAAAA,E,2BAAAA,E,kBAAAA,E,kBAAAA,E,oBAAAA,E,kBAAAA,E,wBAAAA,E,wBAAAA,E,uBAAAA,E,sBAAAA,E,kBAAAA,E,yBAAAA,E,gBAAAA,E,sBAAAA,E,gBAAAA,E,SAAAA,E,qBAAAA,E,yBAAAA,E,yBAAAA,E,uBAAAA,E,uBAAAA,E,mBAAAA,E,2BAAAA,E,yBAAAA,E,iBAAAA,E,wBAAAA,E,iBAAAA,E,mBAAAA,E,eAAAA,E,UAAAA,E,kBAAAA,E,uBAAAA,E,6BAAAA,E,6BAAAA,E,gCAAAA,E,yBAAAA,E,2BAAAA,E,0BAAAA,E,2BAAAA,E,mBAAAA,E,sBAAAA,E,oBAAAA,E,kBAAAA,E,yBAAAA,E,gBAAAA,E,gBAAAA,E,kBAAAA,E,mBAAAA,Q,KA0DL,MAAMa,GAIXlH,YAAY/D,EAAc1E,GAAiB,KAH3C0E,UAG0C,OAF1C1E,WAE0C,EACxC5F,KAAKsK,KAAOA,EACZtK,KAAK4F,MAAQA,GAAS,IAInB,SAAS4P,GAAmBC,EAAgBC,EAAiBC,EAAiBC,GACnF,MAAO,CAACC,GAAYJ,EAAQC,GAAUI,GAAWH,EAASC,IAAW1E,KAAK,SAGrE,SAAS4E,GAAWxL,EAAc1E,GACvC,OAAOA,EAAQ0E,EAAO,IAAM1E,EAAQ0E,EAY/B,SAASuL,GAAYvL,EAAc1E,GACxC,OAAQ0E,GACN,KAAKoK,GAAOqB,gBACV,MAAO,mBACT,KAAKrB,GAAOsB,eACV,MAAO,kBACT,KAAKtB,GAAOuB,iBACV,MAAO,sBACT,KAAKvB,GAAOwB,eACV,MAAO,oBACT,KAAKxB,GAAOyB,oBACV,MAAO,0BACT,KAAKzB,GAAO0B,eACV,MAAO,oBACT,KAAK1B,GAAO2B,qBACV,MAAO,4BACT,KAAK3B,GAAO4B,aACV,MAAO,kBACT,KAAK5B,GAAO6B,YACV,MAAO,iBACT,KAAK7B,GAAO8B,eACV,MAAQ,gBAAe5Q,SACzB,KAAK8O,GAAO+B,aACV,MAAQ,cAAa7Q,IACvB,KAAK8O,GAAOgC,kBACV,MAAQ,oBAAmB9Q,IAC7B,KAAK8O,GAAOiC,kBACV,MAAQ,oBAAmB/Q,IAC7B,KAAK8O,GAAOkC,iBACV,MAAMC,EAASjR,EAAMd,MAAM,KAC3B,MAAQ,cAAa+R,EAAO,MAAMA,EAAO,KAC3C,KAAKnC,GAAOoC,gBACV,MAAQ,kBAAiBlR,SAC3B,KAAK8O,GAAOqC,aACV,MAAQ,cAAanR,SACvB,KAAK8O,GAAOsC,mBACV,MAAQ,sBAAqBpR,SAC/B,KAAK8O,GAAOuC,WACV,MAAQ,YAAWrR,SACrB,KAAK8O,GAAOwC,gBACV,MAAQ,kBAAiBtR,SAC3B,KAAK8O,GAAOyC,sBACV,MAAQ,yBAAwBvR,IAClC,KAAK8O,GAAO0C,iBACV,MAAQ,eAAcxR,IACxB,KAAK8O,GAAO2C,sBACV,MAAQ,yBAAwBzR,IAClC,KAAK8O,GAAO4C,yBACV,MAAQ,0BAAyB1R,IACnC,KAAK8O,GAAO6C,oBACV,MAAQ,qBAAoB3R,IAC9B,KAAK8O,GAAO8C,UACV,MAAQ,WAAU5R,SACpB,KAAK8O,GAAO+C,KACV,MAAO,IACT,KAAK/C,GAAOgD,gBACV,MAAQ,eACV,KAAKhD,GAAOiD,mBACV,MAAQ,mBACV,KAAKjD,GAAOkD,mBACV,MAAQ,mBACV,KAAKlD,GAAOmD,kBACV,MAAQ,iBACV,KAAKnD,GAAOoD,iBACV,MAAQ,iBACV,KAAKpD,GAAOqD,cACV,MAAQ,aACV,KAAKrD,GAAOsD,qBACV,MAAQ,qBACV,KAAKtD,GAAOuD,mBACV,MAAQ,oBACV,KAAKvD,GAAOwD,YACV,MAAQ,WACV,KAAKxD,GAAOyD,kBACV,MAAQ,iBACV,KAAKzD,GAAO0D,WACV,MAAQ,UACV,KAAK1D,GAAO2D,aACV,MAAQ,YACV,KAAK3D,GAAO4D,UACV,MAAQ,SACV,KAAK5D,GAAO6D,MACV,MAAQ,SACV,KAAK7D,GAAO8D,aACV,MAAQ,UACV,KAAK9D,GAAO+D,oBACV,MAAQ,yBACV,KAAK/D,GAAOgE,qBACV,MAAQ,wBACV,KAAKhE,GAAOiE,cACV,MAAQ,iBACV,KAAKjE,GAAOkE,iBACV,MAAQ,aACV,KAAKlE,GAAOmE,eACV,MAAQ,gBAAejT,IACzB,KAAK8O,GAAOoE,aACV,MAAQ,cAAalT,IACvB,KAAK8O,GAAOqE,mBACV,MAAQ,sBAAqBnT,IAC/B,KAAK8O,GAAOsE,WACV,MAAQ,YAAWpT,IACrB,KAAK8O,GAAOuE,UACV,MAAQ,WAAUrT,IACpB,KAAK8O,GAAOwE,YACV,MAAQ,aAAYtT,IACtB,KAAK8O,GAAOyE,aACV,MAAQ,cAAavT,IACvB,QAEE,OADAwO,QAAQC,IAAI,mBAAqB/J,GACzB,K,SC/LFqK,K,gBAAAA,E,cAAAA,E,kBAAAA,E,kBAAAA,E,+BAAAA,E,oBAAAA,E,oBAAAA,E,iCAAAA,E,+BAAAA,E,2BAAAA,E,eAAAA,Q,cAeAC,K,kBAAAA,E,gBAAAA,E,2BAAAA,E,qBAAAA,E,mCAAAA,E,SAAAA,Q,KAgCL,MAAMwE,GACI,gBAACtL,GACd,OAAO,IAAIsL,GACTtL,EAAKC,IACLD,EAAKvD,KACLuD,EAAKG,KACLH,EAAKuL,SACLvL,EAAKwL,QACLxL,EAAKyL,MAGS,mBAACzL,GACjB,OAAO,IAAIsL,GACTtL,EAAK0L,OACL1L,EAAK2L,SACL3L,EAAK4L,SACL5L,EAAK6L,aACL,IAGJ1K,SACE,MAAO,CACLlB,IAAK/N,KAAKsO,GACV/D,KAAMvK,KAAKuK,KACX0D,KAAMjO,KAAKiO,KACXoL,SAAUrZ,KAAKqZ,SACfC,QAAStZ,KAAKsZ,SAIlBM,YACE,MAAO,CACLJ,OAAQxZ,KAAKsO,GACbmL,SAAUzZ,KAAKuK,KACfmP,SAAU1Z,KAAKiO,KACf0L,aAAc3Z,KAAKqZ,UAIX,eACV,OAAO,IAAID,GAAkB,GAAIzE,GAAsBkF,MAAO,GAAIjF,GAA0BkF,KAAM,IAGhF,qBAAC7L,GACnB,OAAO,IAAImL,GAAkB,GAAIzE,GAAsBkF,MAAO5L,EAAM2G,GAA0BkF,KAAM,IAUtGzL,YACEC,EACA/D,EACA0D,EACAoL,EACAC,EACAC,GACC,KAdHjL,QAcE,OAbF/D,UAaE,OAZF0D,UAYE,OAXFoL,cAWE,OAVFC,aAUE,OATFC,UASE,EACAvZ,KAAKsO,GAAKA,EACVtO,KAAKuK,KAAOA,EACZvK,KAAKiO,KAAOA,EACZjO,KAAKqZ,SAAWA,GAAYzE,GAA0BkF,KACtD9Z,KAAKsZ,QAAUA,GAAW,GAC1BtZ,KAAKuZ,KAAOA,EAGdQ,UACE,OAAQ/Z,KAAKuK,MACX,KAAKoK,GAAsBqF,OAAQ,OAAOxH,GAAK3E,KAC/C,KAAK8G,GAAsB/D,MAAO,OAAO4B,GAAKyH,UAC9C,KAAKtF,GAAsBuF,aAAc,OAAO1H,GAAKU,QACrD,KAAKyB,GAAsBwF,QAAS,OAAO3H,GAAK4H,KAChD,KAAKzF,GAAsB0F,SAAU,OAAO7H,GAAK8H,SACjD,KAAK3F,GAAsB4F,cAAe,OAAO/H,GAAK3E,KACtD,KAAK8G,GAAsB6F,YAAa,OAAOhI,GAAKiI,IACpD,QAAS,OAAOjI,GAAKkI,UAIzBC,UACE,OAAQ3a,KAAKuK,MACX,KAAKoK,GAAsBqF,OAAQ,OAAO,IAAIzE,GAAWb,GAAOsE,WAAYhZ,KAAKsO,IACjF,KAAKqG,GAAsB/D,MAAO,OAAO,IAAI2E,GAAWb,GAAOuE,UAAWjZ,KAAKsO,IAC/E,KAAKqG,GAAsBuF,aAAc,OAAO,IAAI3E,GAAWb,GAAOqE,mBAAoB/Y,KAAKsO,IAC/F,KAAKqG,GAAsBwF,QAAS,OAAO,IAAI5E,GAAWb,GAAOwE,YAAalZ,KAAKsO,IACnF,KAAKqG,GAAsB0F,SAAU,OAAO,IAAI9E,GAAWb,GAAOoE,aAAc9Y,KAAKsO,IACrF,KAAKqG,GAAsB4F,cAAe,OAAO,IAAIhF,GAAWb,GAAOiC,kBAAmB3W,KAAKsO,IAC/F,KAAKqG,GAAsB6F,YAAa,OAAO,IAAIjF,GAAWb,GAAOoC,gBAAiB9W,KAAKsO,IAC3F,QAAS,OAAO,IAAIiH,GAAWb,GAAO+C,OAI1C1S,WACE,GAAI/E,KAAKuK,OAASoK,GAAsBqF,OAAQ,CAC9C,MAAMT,EAAOvZ,KAAKuZ,KAElB,IAAI1V,EAAS7D,KAAKiO,KASlB,OARIsL,GAAQA,EAAK/K,OACf3K,GAAU,KAAO0V,EAAK/K,KAClB+K,EAAKqB,gBACP/W,GAAU,SAAQ0V,EAAKqB,eACzB/W,GAAU,KAER0V,GAAQA,EAAKsB,WACfhX,GAAU,UAAO0V,EAAKsB,SAASC,IAAM,IAAMvB,EAAKsB,SAASE,MAAQ,IAAMxB,EAAKsB,SAASG,MAChFnX,EAEP,OAAO7D,KAAKiO,KAIhBgN,UACE,OAAOjb,KAAKuK,OAASoK,GAAsBkF,OEjKxC,SAASqB,GAAeC,EAA0CC,GACvE,MAAMnN,EAAOmN,EAAIC,aAAa/W,KACxBgX,EAAYF,EAAInb,QAAUkb,EAAKI,QAAQH,EAAInb,QACjD,GAAIqb,EAAW,CAEb,OADmBJ,GAAeC,EAAMG,GACpB,MAAQrN,EAE5B,OAAOA,EAmBJ,SAASuN,GAAsBnS,GACpC,YAAiB1I,IAAV0I,GAAiC,OAAVA,QAA0C1I,IAAvB0I,EAAckB,KAE1D,SAASkR,GAAuBpS,GACrC,YAAiB1I,IAAV0I,GAAiC,OAAVA,QAA4C1I,IAAzB0I,EAAc4F,OAG1D,MAAMyM,GACI,gBAAC5N,EAAoB6N,GAElC,IAAIC,EAAS9N,EAAK8N,OAClB,MAAMC,EAAuC,GAC7C,IAAK,IAAInW,KAAOkW,EAAQ,CACtB,MAAMvS,EAAQuS,EAAOlW,GACrBmW,EAAkBnW,GAAO8V,GAAsBnS,GAC3C+P,GAAkB0C,SAASzS,GAC3BA,EAGN,MAAM0S,EAAaJ,EAAeJ,QAAQzN,EAAKsN,MAAQY,GACjDC,EAAYC,GAAgBH,EAAYJ,GAC9C,OAAO,IAAID,GACTK,EACAF,EACAI,EACAf,GAAeS,EAAgBI,IAItB,cAACX,EAA4BO,GACxC,MAAMM,EAAYC,GAAgBd,EAAKO,GACvC,OAAO,IAAID,GACTN,EACA,GACAa,EACAf,GAAeS,EAAgBP,IAWnC/M,YACE+M,EACAQ,EACAK,EACAE,GAAmB,KAXrBf,SAWoB,OAVpBQ,YAUoB,OATpBK,eASoB,OARpBhc,YAQoB,OANpBkc,cAMoB,EAElBnc,KAAKob,IAAMA,EACXpb,KAAK4b,OAASA,EACd5b,KAAKic,UAAYA,EACjBjc,KAAKmc,SAAWA,EAGlBC,OAAOC,GACL,GAAIrc,KAAKob,MAAQiB,EAAMjB,IACrB,OAAO,EAET,IAAK,IAAIkB,KAAYtc,KAAKic,UAAW,CACnC,MAAMM,EAASvc,KAAK4b,OAAOU,EAAS5W,KAC9B8W,EAASH,EAAMT,OAAOU,EAAS5W,KACrC,GAAI6W,GAAUC,GAA6B,kBAAZD,GAA2C,kBAAZC,GAC5D,GAAID,EAAOhS,OAASiS,EAAOjS,MAAQgS,EAAOjO,KAAOkO,EAAOlO,GACtD,OAAO,OACJ,GAAIiO,IAAWC,EACpB,OAAO,EAIX,OAAO,EAGTC,eAAeC,EAAerT,GAC5B,MAAM8B,EAA4B,GAElC,OADAA,EAAOuR,GAASrT,EACT,IAAIqS,GACT1b,KAAKob,IACLuB,OAAOC,OAAO,GAAI5c,KAAK4b,OAAQzQ,GAC/BnL,KAAKic,UACLjc,KAAKmc,UAITlN,SACE,IAAI2M,EAA6B,GACjC,IAAK,IAAIlW,KAAO1F,KAAK4b,OAAQ,CAC3B,IAAIc,EAAQ1c,KAAK4b,OAAOlW,GACpBgX,GAASjB,GAAuBiB,GAClCd,EAAOlW,GAAOgX,EAAMzN,SAEpB2M,EAAOlW,GAAOgX,EAIlB,MAAO,CACLtB,IAAKpb,KAAKob,IAAI9M,GACdsN,OAAQA,IAKP,SAASM,GACdd,EACAD,GAEA,MAAMlb,EAASmb,EAAInb,QAAUkb,EAAKI,QAAQH,EAAInb,QAC9C,OAAKA,EAGEic,GAAgBjc,EAAQkb,GAAM0B,OAAOzB,EAAIQ,QAFvCR,EAAIQ,Q,SDhIH/G,K,gBAAAA,E,YAAAA,E,gBAAAA,E,cAAAA,E,kCAAAA,Q,cAQAC,K,cAAAA,E,YAAAA,E,QAAAA,E,QAAAA,E,eAAAA,Q,KAoBL,MAAMgI,GACI,gBAAChP,GACd,OAAO,IAAIgP,GACThP,EAAKQ,GACLR,EAAKuN,aACLvN,EAAK8N,OAAOmB,KAAIL,GAASM,GAAiBlB,SAASY,KACnD5O,EAAK7N,OACL6N,EAAKmP,WACLnP,EAAKoP,iBACLpP,EAAKqP,iBAaT9O,YACEC,EACA+M,EACAO,EACA3b,EACAgd,EACAC,EACAC,GACC,KAjBH7O,QAiBE,OAhBF+M,kBAgBE,OAfFO,YAeE,OAdF3b,YAcE,OAbFgd,gBAaE,OAZFC,sBAYE,OAXFC,qBAWE,OAVFlB,eAUE,EACAjc,KAAKsO,GAAKA,EACVtO,KAAKqb,aAAeA,EACpBrb,KAAK4b,OAASA,EACd5b,KAAKC,OAASA,EACdD,KAAKid,WAAaA,EAClBjd,KAAKkd,iBAAmBA,EACxBld,KAAKmd,gBAAkBA,EAGzBC,eAAeC,GACbrd,KAAKic,UAAYC,GAAgBlc,KAAMqd,GAGzCC,oBAAoBlC,GAClB,IAAIhN,EAAcpO,KAAKqb,aAAa/W,KACpC,QAAuB3D,IAAnBX,KAAKic,UACP,OAAO7N,EAET,IAAK,IAAIsO,KAAS1c,KAAKic,UAAW,CAChC,IAAIsB,EAAanC,EAAIQ,OAAOc,EAAMhX,KAClC,GAAI6X,EAAY,CACd,IAAIlU,EAAQoS,GAAuB8B,GAAcA,EAAWtP,KAAOsP,EACnEnP,GAAe,KAhEsBoP,EAgEad,EAAMc,YA/DvD/X,EAAG,eAAiB+X,GA+DkD,KAAMnU,GAhE9E,IAAsCmU,EAmEzC,OAAOpP,GAIJ,MAAM4N,GAA6B,IAAIc,GAAsB,IAAK,GAAI,GAAI,MAAM,GAAO,GAAO,GAE9F,MAAME,GACI,gBAAClP,GACd,OAAO,IAAIkP,GAAiBlP,EAAKpI,IAAKoI,EAAKvD,KAAMuD,EAAK0P,YAAa1P,EAAKuN,cAQ1EhN,YACE3I,EACA6E,EACAiT,EACAnC,GACC,KAVH3V,SAUE,OATF6E,UASE,OARFiT,iBAQE,OAPFnC,kBAOE,EACArb,KAAK0F,IAAMA,EACX1F,KAAKuK,KAAOA,EACZvK,KAAKwd,YAAcA,EACnBxd,KAAKqb,aAAeA,GEnHjB,IAAKoC,GA8EAC,GA2CAC,GAhHL,SAASC,GAA+BC,GAC7C,OAAQA,GACN,KAAKJ,GAAwBK,QAC3B,OAAOrY,EAAE,mCACX,KAAKgY,GAAwBM,KAC3B,OAAOtY,EAAE,gCACX,KAAKgY,GAAwBO,UAC3B,OAAOvY,EAAE,qCACX,KAAKgY,GAAwBQ,QAC3B,OAAOxY,EAAE,mCACX,KAAKgY,GAAwBS,OAC3B,OAAOzY,EAAE,kCACX,KAAKgY,GAAwBU,cAC3B,OAAO1Y,EAAE,yCACX,QACE,OAAOoY,GAqIN,SAASO,GAAoBC,GAClC,MAAMxa,EAAmC,GACzC,OAAKwa,GAGLA,EAAKC,OAAOC,SAAQC,IAClB,OAAQA,EAAMjU,MACZ,IAAK,WAAY1G,EAAO2a,EAAMvQ,OAAQ,EAAO,MAC7C,IAAK,UAAWpK,EAAO2a,EAAMvQ,MAAQ,KAAM,MAC3C,IAAK,OAAQpK,EAAO2a,EAAMvQ,MAAQ,CAAE6M,IAAK,GAAIC,MAAO,GAAIC,KAAM,IAAM,MACpE,IAAK,WAAYnX,EAAO2a,EAAMvQ,MAAQ,CAAE6M,IAAK,GAAIC,MAAO,GAAIC,KAAM,GAAIyD,KAAM,GAAIC,OAAQ,IAAM,MAC9F,IAAK,WAAY7a,EAAO2a,EAAMvQ,MAAQ,CAAEsC,IAAK,GAAIC,IAAK,IAAM,MAC5D,IAAK,aAAc3M,EAAO2a,EAAMvQ,MAAQ,GAAI,MAC5C,IAAK,SAAUpK,EAAO2a,EAAMvQ,MAASuQ,EAAsCG,QAAQ,GAAI,MACvF,IAAK,OAAQ9a,EAAO2a,EAAMvQ,MAAQ,CAAE5E,MAAO,GAAIuV,KAAMjB,GAASkB,UAG3Dhb,GAdEA,G,SAhKC4Z,K,kBAAAA,E,YAAAA,E,sBAAAA,E,kBAAAA,E,gBAAAA,E,+BAAAA,Q,cA8EAC,K,cAAAA,E,qBAAAA,Q,cA2CAC,K,oBAAAA,E,YAAAA,E,YAAAA,E,oBAAAA,E,oBAAAA,E,qBAAAA,E,eAAAA,Q,KCjIL,MAAMmB,GAAU,IAAIC,IAClBA,EAAIC,QAAOD,QAAepe,IAARoe,IAAmB7N,KAAK,K,wBCQ5C,MAAM+N,GAAc9M,IACzB,MAAM,UAAEC,EAAF,QAAa8M,EAAb,MAAsBlK,EAAtB,MAA6B1C,EAA7B,SAAoCnR,GAAagR,EAKvD,OAEE,cADA,CACA,KAAGgN,KAAK,IAAI/M,UAAWA,EAAW8M,QANf9e,IACnBA,EAAEyC,iBACFqc,GAAWA,KAI6ClK,MAAOA,EAAO1C,MAAOA,EAA7E,SACGnR,K,aCJSgR,OACd,MAAM,KAAE7H,EAAF,MAAQ1E,EAAR,SAAezE,EAAf,MAAyBmR,KAAU8M,GAAejN,EAClDkN,EAAOxJ,GAAYvL,EAAM1E,GAAS,IAClC0Z,EAAc3V,GAAegB,GAASA,EAAM4U,kBAC5CC,EAAMF,EAAYhR,IAAMgR,EAAYxL,OAAU,IAAMwL,EAAYxL,OAAU,IAChF,OAAO,eAAC,KAAD,CAAM2L,GAAK,GAAEJ,SAAYG,IAAOlN,MAAOA,KAAkB8M,EAAzD,SAAsEje,KCXxE,IAAKue,I,SAAAA,O,eAAAA,I,kBAAAA,Q,KA2BL,MAAMC,GAAuC,CAClDC,UAAU,EACVC,MAAOH,GAAYI,KACnBC,WAAW,EACXC,WAAW,GAaN,MAAMC,GAMX5R,YACEC,EACA0G,EACAkL,EACAvB,GACC,KAVHrQ,QAUE,OATF0G,WASE,OARFkL,YAQE,OAPFvB,aAOE,OAeFwB,KAAO,CAACC,EAAMC,KACJrgB,KAAKkgB,OAAOE,IAAM,IAAIE,cAActgB,KAAKkgB,OAAOG,IAAM,IAf9DrgB,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAKkgB,OAASA,EACdlgB,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsBhB,GAGzD4B,OAAOC,EAASrO,GACd,MAAM9I,EAAQrJ,KAAKkgB,OAAOM,GAI1B,YAHc7f,IAAV0I,IACF8I,EAAMC,UAAY0M,GAAQ2B,KAAOC,QAASvO,EAAMC,YAE3C,wBAAsBD,EAAtB,cAAwCxR,IAAV0I,EAAsB,MAAQA,GAAnDrJ,KAAKsO,KAQlB,MAAMqS,GAKXtS,YACEC,EACA0G,EACA2J,GACC,KARHrQ,QAQE,OAPF0G,WAOE,OANF2J,aAME,OAUFwB,KAAO,CAACC,EAAMC,IACJD,EAAEpgB,KAAKsO,IAAYvJ,WAAWub,cAAcD,EAAErgB,KAAKsO,KAAYvJ,WAVvE/E,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsBhB,GAGzD4B,OAAOC,EAASrO,GACd,OAAO,wBAAsBA,EAAtB,SAA8BqO,EAAKxgB,KAAKsO,KAA/BtO,KAAKsO,KAQlB,MAAMsS,GAKXvS,YACEC,EACA0G,EACA2J,GACC,KARHrQ,QAQE,OAPF0G,WAOE,OANF2J,aAME,OAUFwB,KAAO,CAACC,EAAMC,IACJD,EAAEpgB,KAAKsO,IAAe+R,EAAErgB,KAAKsO,IAVrCtO,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsBhB,GAGzD4B,OAAOC,EAASrO,GACd,OAAO,wBAAsBA,EAAtB,SAA8BqO,EAAKxgB,KAAKsO,KAA/BtO,KAAKsO,KAQlB,MAAMuS,GAMXxS,YACEC,EACA0G,EACApL,EACA+U,GACC,KAVHrQ,QAUE,OATF0G,WASE,OARFpL,gBAQE,OAPF+U,aAOE,OAeFwB,KAAO,CAACC,EAAMC,IACJrgB,KAAK8gB,SAASV,GAAKpgB,KAAK8gB,SAAST,GAfzCrgB,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAK4J,WAAaA,EAClB5J,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsBhB,GAGzD4B,OAAOC,EAASrO,GACd,OAAO,wBAAsBA,EAAtB,SAA8BnS,KAAK8gB,SAASN,IAAnCxgB,KAAKsO,IAGfwS,SAASN,GACf,OAAOxgB,KAAK4J,WAAW4W,IAWpB,MAAMO,GAOX1S,YACEC,EACA0G,EACAgM,EACArC,EACAsC,GACC,KAZH3S,QAYE,OAXF0G,WAWE,OAVFgM,cAUE,OATFrC,aASE,OARFwB,UAQE,EACAngB,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAKghB,SAAWA,EAChBhhB,KAAKmgB,KAAOc,GAAM,EAAMb,EAAGC,IAAM,GACjCrgB,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsB,CAAEC,UAAU,EAAOG,WAAW,GAASpB,GAGhG4B,OAAOC,EAASrO,GACd,OAAO,wBAAsBA,EAAtB,SAA8BnS,KAAKghB,SAASR,IAAnCxgB,KAAKsO,KAIlB,IAAK4S,GAcL,SAASC,MAA8BC,GAC5C,OAAOA,EAAQpC,QAAOqC,IAAqB,IAAXA,GAA+B,OAAXA,QAA8B1gB,IAAX0gB,IAGzE,SAASC,GAAUjP,GACjB,MAAwB,kBAAVA,G,SAnBJ6O,K,oCAAAA,E,0CAAAA,E,wCAAAA,E,2CAAAA,Q,KAqBL,MAAMK,GAMXlT,YACEC,EACA0G,EACAwM,EACA7C,GACC,KAVHrQ,QAUE,OATF0G,WASE,OARF2J,aAQE,OAPF6C,WAOE,OA4BFrB,KAAO,CAACC,EAAMC,IAAS,EA3BrBrgB,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsB,CAAEC,UAAU,EAAOC,MAAOH,GAAY+B,OAAS9C,GACtG3e,KAAKwhB,MAAQA,EAGfjB,OAAOC,EAASrO,EAAmBxH,GACjC,MAAMyW,EAAUphB,KAAKwhB,MAAMhB,GAAMzD,KAAI,CAACsE,EAAQpW,KAC5C,MAAM,KAAEoH,EAAF,QAAQzS,EAAR,MAAiB0S,EAAQ4O,GAAoBQ,QAA7C,QAAsDxC,EAAtD,KAA+D5U,EAA/D,UAAqEqX,GAAcN,EACzF,OAAO/W,EACL,eAACsX,GAAD,CAAsBxP,UAAWE,EAAOhI,KAAMA,EAAM1E,MAAO+b,EAAW3M,MAAOpV,EAA7E,SACG0hB,GAAOjP,GAAQ,oBAAGD,UAAWC,IAAWA,EAAK1H,IADjCM,GAIf,eAACgU,GAAD,CAAwB7M,UAAWE,EAAO4M,QAASA,GAAO,KAAWA,EAAQsB,EAAM7V,IAASqK,MAAOpV,EAAnG,SACG0hB,GAAOjP,GAAQ,oBAAGD,UAAWC,IAAWA,EAAK1H,IAD/BM,MAKfqH,EAAQqK,OAAOC,OAAO,CAAEiF,OAAQ,WAAa1P,EAAMG,OACzD,OACE,qBAAkBF,UAAU,wBAAwBE,MAAOA,EAA3D,SACG8O,GADMphB,KAAKsO,K,cCvOb,MAAMwT,WAAkBC,IAAMC,cAA+B,eAAD,oBACjEC,mBAAqB,KACnB,MAAM,eAAEC,GAAmBliB,KAAKmS,MAChC+P,EAAe,IAHgD,KAMjEC,sBAAwB,KACtB,MAAM,KAAE7X,EAAF,eAAQ4X,GAAmBliB,KAAKmS,MACtC+P,EAAe5X,EAAO,IARyC,KAWjE8X,kBAAqBhiB,IACnB,MAAM,eAAE8hB,GAAmBliB,KAAKmS,MAChC+P,EAAeG,SAASjiB,EAAEkiB,cAAc3U,QAAQrD,MAAQ,OAbO,KAgBjEiY,kBAAoB,KAClB,MAAM,KAAEjY,EAAF,eAAQ4X,GAAmBliB,KAAKmS,MACtC+P,EAAe5X,EAAO,IAlByC,KAqBjEkY,kBAAoB,KAClB,MAAM,WAAEC,EAAF,SAAcC,EAAd,eAAwBR,GAAmBliB,KAAKmS,MAEtD+P,EADiBS,KAAKC,KAAKH,EAAaC,GACd,IAG5BnC,SACE,MAAM,KAAEjW,EAAF,WAAQuY,EAAR,WAAoBJ,EAApB,SAAgCC,EAAhC,SAA0CI,EAAW,EAArD,KAAwD9f,GAAShD,KAAKmS,MACtE4Q,EAAWJ,KAAKC,KAAKH,EAAaC,GACxC,GAAiB,IAAbK,EACF,OAAO,yBAET,MAAMvB,EAAuB,GAoB7B,IAAIwB,EACAC,EApBJzB,EAAM5P,KACJ,eAACsR,GAAA,EAAWC,KAAZ,CAEEC,SAAmB,IAAT9Y,EACV4U,QAASlf,KAAKiiB,mBAHhB,SAKE,oBAAG7P,UAAWI,GAAK6Q,qBAJf,UAOR7B,EAAM5P,KACJ,eAACsR,GAAA,EAAWC,KAAZ,CAEEC,SAAmB,IAAT9Y,EACV4U,QAASlf,KAAKmiB,sBAHhB,SAKE,oBAAG/P,UAAWI,GAAK8Q,eAJf,aAUJP,GAAYD,GACdE,EAAQ,EACRC,EAAMF,GACGzY,GAAQwY,EAAW,GAC5BE,EAAQ,EACRC,EAAMH,EAAW,GACRxY,GAAQyY,EAAYD,EAAW,GACxCG,EAAMF,EACNC,EAAQC,GAAOH,EAAW,KAE1BE,EAAQ1Y,GAAQwY,EAAW,GAAK,EAChCG,EAAMD,EAAQF,EAAW,GAGvBE,EAAQ,GAEVxB,EAAM5P,KAAK,eAACsR,GAAA,EAAWK,SAAZ,GAAyB,kBAEtC,IAAK,IAAIC,EAAIR,EAAOQ,EAAIP,EAAKO,IACvBA,EAAI,IACNhC,EAAM5P,KAAK,eAACsR,GAAA,EAAWC,KAAZ,CAAyB,YAAWK,EAAGC,OAAQD,IAAMlZ,EAAM4U,QAASlf,KAAKoiB,kBAAzE,SAA8FoB,EAAI,GAA5EA,IAEjCP,EAAMF,GACRvB,EAAM5P,KAAK,eAACsR,GAAA,EAAWK,SAAZ,GAAyB,kBAKtC/B,EAAM5P,KACJ,eAACsR,GAAA,EAAWC,KAAZ,CAEEC,SAAU9Y,IAASyY,EAAW,EAC9B7D,QAASlf,KAAKuiB,kBAHhB,SAKE,oBAAGnQ,UAAWI,GAAKkR,gBAJf,SAORlC,EAAM5P,KACJ,eAACsR,GAAA,EAAWC,KAAZ,CAEEC,SAAU9Y,IAASyY,EAAW,EAC9B7D,QAASlf,KAAKwiB,kBAHhB,SAKE,oBAAGpQ,UAAWI,GAAKmR,sBAJf,SAQR,MAAMC,EAAWtZ,EAAOoY,EAClBmB,EAASD,EAAWf,EACpBiB,EAAQre,EAAE,oBAAqB,CACnCse,MAAOH,EAAW,GAAG7e,WACrB0a,GAAIoE,EAAO9e,WACX/B,KAAM8C,EAAU9C,EAAM6f,GACtBmB,MAAOvB,EAAW1d,aAEpB,OACE,uBAAKqN,UAAU,wBAAwBE,MAAO,CAAC2R,WAAY,MAAOC,YAAa,OAA/E,UACE,uBAAM5R,MAAO,CAAE6R,MAAO,QAAtB,SAAiCL,IACjC,sBAAKxR,MAAO,CAAE8R,SAAU,KACxB,eAAClB,GAAA,EAAD,UACG1B,Q,wBCvHJ,IAAK6C,GA6EZ,SAASC,GAAWnS,GAClB,MAAM,OAAEoS,EAAF,SAAUC,EAAV,cAAoBC,EAApB,SAAmCC,GAAavS,GAE/CwS,EAAkBC,GAAuBrb,mBAA8B,OACvEsb,EAAeC,GAAoBvb,mBAA8B,OACjEwb,EAAYC,GAAiBzb,oBAAS,IAErCkX,OAAQwE,EAAV,WAAwBC,GAAeC,aAAUR,EAAkBE,EAAe,IAElFO,EAAuBnb,iBAAuC,MACpEob,qBAAU,KACR,GAAIN,EASF,OARAK,EAAqBlb,QAAW9J,IAC9BgU,QAAQC,IAAIjU,GACRykB,IAAkBA,EAAcS,SAASllB,EAAEmlB,SAAmBZ,IAAqBA,EAAiBW,SAASllB,EAAEmlB,SACjHP,GAAc,IAGlB3lB,OAAOmmB,iBAAiB,QAASJ,EAAqBlb,SAE/C,KACDkb,EAAqBlb,UACvB7K,OAAOomB,oBAAoB,QAASL,EAAqBlb,SACzDkb,EAAqBlb,QAAU,SAIpC,CAAC6a,EAAYF,EAAeF,IAE/B,MAIMe,EAAsB,CAACC,EAAkBtc,KACzCsc,IACFX,GAAc,GACdN,EAASrb,KAIb,OAAO,uCACL,sBAAK+I,UAAwB,OAAboS,EAAoB/D,KAAOmF,aAAenF,KAAOoF,mBAAoBC,IAAKlB,EAAqB1F,QAZrF,KAC1B8F,GAAeD,IAWf,SACE,oBAAG3S,UAAU,oBAEd2S,GACC,uBAAKe,IAAKhB,EAAkB1S,UAAWqO,KAAOsF,aAAczT,MAAO2S,EAAae,UAAYd,EAAWc,OAAvG,UACE,eAACC,GAAA,EAAKC,MAAN,CACE3b,KAAK,QACL+D,GAAK,GAAEiW,eACPT,MAAOre,EAAE,2BACTkgB,QAAsB,OAAbnB,EACT2B,SAAU/lB,GAAKslB,EAAoBtlB,EAAEkiB,cAAcqD,QAAS,QAE7DlB,EAAc1H,KAAIqJ,GACjB,eAACH,GAAA,EAAKC,MAAN,CAEE3b,KAAK,QACL+D,GAAK,GAAEiW,YAAiB6B,EAAO/c,QAC/Bya,MAAOsC,EAAOtC,MACd6B,QAASS,EAAO/c,QAAUmb,EAC1B2B,SAAU/lB,GAAKslB,EAAoBtlB,EAAEkiB,cAAcqD,QAASS,EAAO/c,QAL9D+c,EAAO/c,eA+CxB,SAASgd,GACPC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,OAAO,8BAAKL,EAAQvJ,KAAIwH,IAAM,aA7JhC,SACEA,EACAgC,EACAC,EACAxH,EACA0H,EACAC,GAEA,IAAIrU,EAYJ,GAXIiS,EAAO5F,QAAQkB,QAAUH,GAAY+B,QACvCnP,EAAQ,CAAEsU,UAAW,UACnBrC,EAAO5F,QAAQrf,QACjBgT,EAAQA,GAAS,GACjBA,EAAMhT,MAAQilB,EAAO5F,QAAQrf,OAE3BilB,EAAO5F,QAAQkI,WACjBvU,EAAQA,GAAS,GACjBA,EAAMuU,SAAWtC,EAAO5F,QAAQkI,UAG9BtC,EAAO5F,QAAQiB,UAAY2E,EAAO5F,QAAQK,OAAQ,CACpD,MAAM3M,EAAOkU,IAAehC,EAAOjW,GAAMkY,IAAkBnC,GAAcyC,GAAKtU,GAAKuU,OAASvU,GAAKwU,SAAYxU,GAAKyU,KAElH,OACE,sBAAoB7U,UAAWqO,KAAOyG,GAAI5U,MAAOA,EAAjD,UACE,wBAAMF,UAAWqO,KAAO0G,eAAgBjI,QAAS,IAAMwH,EAAcnC,GAArE,UAA+EA,EAAO5F,QAAQtM,KAAO,oBAAGD,UAAWmS,EAAO5F,QAAQtM,OAAWkS,EAAOvP,MAApJ,IAA4JuP,EAAO5F,QAAQiB,UAAY,oBAAGxN,UAAWC,OACpMkS,EAAO5F,QAAQK,QAAU2H,GACxB,eAACrC,GAAD,CACEC,OAAQA,EAAOjW,GACfkW,cAAqB7jB,IAAXqe,EAAuB,KAAOA,EACxCyF,cAAeF,EAAO5F,QAAQK,OAC9B0F,SAAU0B,GAAUO,EAAgBpC,EAAOjW,GAAI8X,OAP5C7B,EAAOjW,IAalB,OAAO,qBAAoBgE,MAAOA,EAA3B,SAAmCiS,EAAO5F,QAAQtM,KAAO,oBAAGD,UAAWmS,EAAO5F,QAAQtM,KAAM2C,MAAOuP,EAAOvP,QAAYuP,EAAOvP,OAApHuP,EAAOjW,IAwHS8Y,CAChC7C,EACAgC,EACAC,EAHwC,UAIxCC,EAAQ3lB,MAAKke,GAAUA,EAAOuF,SAAWA,EAAOjW,YAJR,aAIxC,EAAqDjF,MACrDqd,EACAC,S,SAjMQtC,K,QAAAA,E,aAAAA,Q,KAqMZ,MAAMgD,GAA6B,GAE5B,SAASC,GAAiBnV,GAC/B,MAAM,eACJoV,EADI,QAEJjB,EAFI,UAGJlU,EAHI,OAIJoV,EAAS,EAACC,EAAMxc,IAAkBA,GAJ9B,MAKJN,EAAQ,GALJ,YAMJ+c,EANI,cAOJC,EAPI,cAQJC,EARI,SASJlD,EATI,WAUJ6B,EAVI,cAWJC,EAXI,QAYJC,EAZI,KAaJnc,EAbI,SAcJoY,EAdI,WAeJD,EAfI,KAgBJzf,GACEmP,EAGE0V,EAAoB1d,uBAAaoa,IACrC,GAAIA,EAAOjW,KAAOiY,EAAY,CAC5B,MAAMuB,EAAetB,IAAkBnC,GAAcyC,GAAKzC,GAAc0D,KAAO1D,GAAcyC,GAC7Fc,EAAcrD,EAAOjW,GAAIwZ,QAEzBF,EAAcrD,EAAOjW,GAAI+V,GAAcyC,MAExC,CAACP,EAAYC,EAAeoB,IAEzBI,EAAiBC,mBAAQ,IAAM5B,GAAgBC,EAASC,EAAYC,EAAeC,GAAWY,GAAYQ,EAAmBnD,IAAW,CAAC4B,EAASC,EAAYC,EAAeqB,IAC7KK,EAAeD,mBAAQ,IAAMV,EAAexK,KAAI,CAACyD,EAAMvV,IArF/D,SACEqb,EACAkB,EACA7c,EACA6V,EACAvV,EACAyc,GAGA,OACE,qBAA8BtV,UAAWsV,EAAcjH,KAAO0H,kBAAexnB,EAA7E,SACG2lB,EAAQvJ,KAAIwH,IACX,MAAMjS,EAAuB,CAAEuU,SAAUtC,EAAO5F,QAAQkI,SAAUvnB,MAAOilB,EAAO5F,QAAQrf,OAIxF,OAHIilB,EAAO5F,QAAQkB,QAAUH,GAAY+B,QACvCnP,EAAMsU,UAAY,SAEbrC,EAAOhE,OACZC,EACA,CACEtB,QAASwI,GAAenD,EAAO5F,QAAQoB,UAAY,IAAM2H,EAAYlH,QAAQ7f,EAC7EyR,UAAW0M,GACT4I,GAAenD,EAAO5F,QAAQoB,UAAYU,KAAO2H,mBAAgBznB,EACjE4jB,EAAO5F,QAAQqB,UAAYS,KAAOT,eAAYrf,EAC9C4jB,EAAO5F,QAAQvM,WAEjBE,SAEF3H,OAjBG6c,EAAOhH,EAAMvV,IA2E+Cod,CAAU/B,EAASkB,EAAQ7c,EAAO6V,EAAMvV,EAAOyc,MAAe,CAACpB,EAASiB,EAAgBC,EAAQE,EAAa/c,IAEpL,OACE,uCACE,yBAAOyH,UAAW0M,GAAQ,QAAS,gBAAiB2B,KAAO6H,MAAOlW,GAAlE,UACE,iCACG4V,IAEH,iCACGE,OAGL,sBAAK9V,UAAU,yBAAf,SACE,eAAC,GAAD,CAAW9H,KAAMA,EAAMoY,SAAUA,EAAUG,WAAY0E,EAAe1nB,OAAQ4iB,WAAYA,EAAYP,eAAgByF,EAAe3kB,KAAMA,SAM5I,SAASulB,GAAiBpW,GAC/B,OACE,sBAAKC,UAAU,+CAA+CE,MAAO,CAAEhT,MAAO,QAA9E,SACE,eAACgoB,GAAD,CAAOlV,UAAWD,EAAMqW,kBAAoBrW,MAK3C,SAASsW,GACdnC,EACA9E,EACA+E,EACAC,GAEA,MAAMjC,EAAS+B,EAAQxlB,MAAK4nB,GAAKA,EAAEpa,KAAOiY,IAC1C,IAAKhC,EACH,OAAO/C,EAET,MAAM3d,EAAS,IAAI2d,GAEnB,OADA3d,EAAOsc,KAAKqG,IAAkBnC,GAAcyC,GAAKvC,EAAOpE,KAAO,CAACC,EAAGC,IAAMkE,EAAOpE,KAAKE,EAAGD,IACjFvc,ECvRF,MAAM8kB,GACC,eACV,OAAO,IAAIA,GAAe,IAAKnI,GAAQ,KAMzCnS,YAAYmT,EAAYoH,GAA+B,KAHvDC,UAGsD,OAFtDtN,aAEsD,EACpDvb,KAAK6oB,KAAOrH,EACZxhB,KAAKub,QAAU,GACfiG,EAAMjD,SAAQiC,GAAQxgB,KAAKub,QAAQqN,EAAQpI,IAASA,KCuCjD,IAAKsI,I,SAAAA,K,4BAAAA,E,sCAAAA,Q,KAmlDZ,IAAIC,GAAM,OAC0C,IAAhD7pB,SAAS8pB,SAASC,KAAKC,QAAQ,eACjCH,GAAM,yBAEO,WAhlDf,MAkBE1a,YAAY0a,GAAc,KAjB1BI,aAiByB,OAhBzBJ,SAgByB,OAfzBK,yBAeyB,OAdzBC,mBAcyB,OAbzBC,uBAayB,OAZzBhb,QAYyB,OAXzBib,WAWyB,OAVzB3lB,UAUyB,OATzB4lB,qBASyB,OAPzBC,oBAOyB,OANzBC,aAMyB,OALzBC,iBAKyB,OAHzBC,4BAGyB,OAFzBC,yBAEyB,EACvB7pB,KAAKmpB,QAAUJ,EACf/oB,KAAK+oB,IAAMA,EAAM,MACjB/oB,KAAKopB,oBAAsBL,EAAM,oBACjC/oB,KAAKqpB,cAAgBN,EAAM,0BAC3B/oB,KAAKspB,kBAAoBP,EAAO,8BAChC/oB,KAAKsO,GAAK,EACVtO,KAAKupB,MAAQ/kB,aAAaC,QAAQ,UAAY,KAC9CzE,KAAK4D,KAAO5D,KAAK8pB,4BAEjB9pB,KAAKwpB,gBAAkB,KAGzBM,4BACE,IAAIC,EAAWvlB,aAAaC,QAAQ,QACpC,OAAIslB,EACKlc,GAAKiO,SAASkO,KAAKC,MAAMF,IAEzB7a,GAIXgb,SAASX,GACPvpB,KAAKupB,MAAQA,EAEb/kB,aAAac,QAAQ,QAASikB,GAGhCY,gBACEnqB,KAAKupB,MAAQ,QAGfa,SACEpqB,KAAKupB,MAAQ,KACbvpB,KAAK4D,KAAOsL,GAEZ1K,aAAa6lB,WAAW,SACxB7lB,aAAa6lB,WAAW,QAG1BC,UAAUC,GACRvqB,KAAKkqB,SAASK,EAAahB,OAC3BvpB,KAAK4D,KAAOiK,GAAKiO,SAASyO,EAAa3mB,MAEvCY,aAAac,QAAQ,OAAQ0kB,KAAKQ,UAAUD,EAAa3mB,OAG3D6mB,cAAiBC,EAAgB/kB,EAAiBglB,GAChD,OAAO3qB,KAAK4qB,SAASF,EAAQ/kB,GAAYklB,MAAKhnB,GAAU8mB,EAAa9mB,KAGzD,eAAI6mB,EAAgB/kB,GAChC,MAAM2I,EAAKtO,KAAKsO,KAEhB,IAAIwc,EAAsBnlB,EACX,kBAAX+kB,GAA+B/kB,EAAW4jB,QAC5CuB,EAAsB,IAAInlB,EAAY4jB,MAAOvpB,KAAKupB,OAAS,UAE7D,MAAM7oB,EAAO,CACX4N,GAAIA,EACJyc,QAAS,MACTL,OAAQA,EACR7T,OAAQiU,GAEV,IACE,MAAME,QAAgBhrB,KAAKirB,WAAWvqB,GACtC,QAAuBC,IAAnBqqB,EAAQnnB,OACV,OAAOmnB,EAAQnnB,OACV,MAAImnB,EAAQliB,MACXkiB,EAAQliB,MAERoiB,MAAM,uBAEd,MAAOC,GACP,MAAMriB,EClJL,SAAuCA,GAC5C,GAAI,eAAgBA,GAA8B,IAArBA,EAAMsiB,WAMjC,MALqC,CACnCC,KAAM,UACNC,QAAS,sBACT5qB,UAAMC,GAKV,GAAI,WAAYmI,GAASA,EAAM5C,QAAU,IAMvC,MAL6B,CAC3BmlB,KAAM,OACNC,QAASxiB,EAAMyiB,WACf7qB,UAAMC,GAIV,OAAOmI,EDgIW0iB,CAA8BL,GAE5C,GAAoB,OAAfriB,EAAMuiB,MAAgC,MAAfviB,EAAMuiB,OAAkBrrB,KAAKypB,eAO9CzpB,KAAK0pB,SACd1pB,KAAK0pB,QAAQ5gB,OAR0D,CAKvE,SADwB9I,KAAKypB,iBAE3B,OAAOzpB,KAAK4qB,SAASF,EAAQ/kB,GAOjC,MAHI3F,KAAK2pB,aACP3pB,KAAK2pB,YAAY7gB,GAEbA,GAIVmiB,WAAWQ,GAUT,OAAOC,QAAQC,QAAQ1sB,IAAE2sB,KAAK,CAC5B7C,IAAK/oB,KAAK+oB,IACV8C,QAAS,GACTthB,KAAM,OACN7J,KAAMspB,KAAKQ,UAAUiB,GACrBK,SAAU,OACVC,YAAa,qCAIjBC,eAAe7L,GACb,OAAOA,EAAKpD,KAAIkP,GAAS,CAACA,EAAM,GAAIA,EAAM,KAAO5H,GAAcyC,GAAK,GAAK,KAG3EoF,aACE,MAA0B,cAAnBlsB,KAAK4D,KAAK2G,KAGnBmE,UACE,MAA0B,UAAnB1O,KAAK4D,KAAK2G,KAKnB4hB,OAAOC,GACL,OAAO,IAAIV,SAAQ,CAACC,EAASU,IAAWV,EAAQ,MAKlDW,iBAAiBC,GACf,OAAOvsB,KAAK4qB,SACV,mBACA,CAAE1rB,SAAUqtB,IAIhBC,cAAcle,GACZ,OAAOtO,KAAK4qB,SACV,gBACA,CAAE7c,IAAKO,IAIXme,mBAAmBF,EAAyBlL,GAC1C,OAAOrhB,KAAK4qB,SACV,qBACA,CAAE1rB,SAAUqtB,EAAYlL,WAI5BqL,iBAAiBpe,GACf,OAAOtO,KAAK4qB,SAAS,mBAAoB,CAAE7c,IAAKO,IAGlDqe,eACEvpB,EACAwpB,EACAC,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,IAElC,OAAOngB,KAAK4qB,SACV,iBACA,CACE1rB,SAAU,CAAEkE,aAAY2pB,cAAeH,GACvCC,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,IAObgJ,MAAMze,EAAkB0e,GACtB,OAAOjtB,KAAK4qB,SAAS,gBAAiB,CACpC5c,QAASO,EACT0e,SAAUA,IAIdC,aAAaxnB,EAAaunB,GACxB,OAAOjtB,KAAK4qB,SAAS,eAAgB,CACnCllB,MACAunB,aAIJE,yBAAyB7e,GACvB,OAAOtO,KAAK4qB,SAAS,2BAA4B,CAAEtc,OAGrD8e,yBAAyBlf,GACvB,OAAOlO,KAAK4qB,SAAS,2BAA4B,CAAE1c,UAGrDmf,kBAAkB3nB,EAAaunB,GAC7B,OAAOjtB,KAAK4qB,SAAS,oBAAqB,CAAEllB,MAAKunB,aAGnDK,uBACE,OAAOttB,KAAK4qB,SAAS,uBAAwB,IAK/C2C,yBAAyBruB,GACvB,OAAOc,KAAK4qB,SAAS,2BAA4B,CAAE1rB,aAGrDsuB,yBAAyBtuB,GACvB,OAAOc,KAAK4qB,SAAS,2BAA4B,CAAE1rB,SAAUA,IAG/DuuB,gCACEC,EACAC,EACAC,EACAC,GAEA,OAAO7tB,KAAK4qB,SAAS,kCAAmC,CACtD8C,aACAC,eACAC,UACAC,oBAIJC,iCAAiCJ,EAAoBziB,GACnD,OAAOjL,KAAK4qB,SAAS,mCAAoC,CACvD8C,aACAziB,UAIJ8iB,+BACEC,EAAwBC,EAA6BC,GAErD,OAAOluB,KAAK4qB,SAAS,iCAAkC,CACrDoD,iBACAC,eACAC,aAIJC,iCAAiCT,EAAoBQ,GACnD,OAAOluB,KAAK4qB,SAAS,mCAAoC,CACvD8C,aACAQ,aAIJE,sBAAsB9f,GACpB,OAAOtO,KAAK4qB,SAAS,wBAAyB,CAAE7c,IAAKO,IAGvD+f,2BACEnvB,EACAmiB,GAGA,OAAOrhB,KAAK4qB,SACV,6BACA,CAAE1rB,WAAUmiB,WAIhBiN,yBAAyBhgB,GACvB,OAAOtO,KAAK4qB,SAAS,2BAA4B,CAAE7c,IAAKO,IAG1DigB,0BAA0BjgB,GACxB,OAAOtO,KAAK4qB,SAAS,4BAA6B,CAAE7c,IAAKO,IAG3DkgB,wBACEpC,EACApN,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCxB,EACAlF,EACAD,GAEA,OAAOxZ,KAAK4qB,SAAS,yBAA0B,CAC7C1rB,SAAUktB,GAAS,GACnBqC,YAAazP,EACb6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,EACPxK,OAAQA,EACRC,SAAUA,EACVkF,QAASA,IAIb+P,uBAAuB9B,EAAsB+B,GAA0B,GACrE,OAAO3uB,KAAK4qB,SACV,yBACA,CAAExnB,WAAYwpB,EAAcgC,eAAgBD,IAIhDE,sBAAsBtkB,EAAqD+D,EAAYqQ,GACrF,OAAO3e,KAAK4qB,SACV,wBACA,CAAErgB,OAAM+D,KAAIqQ,YAIhBmQ,wBAAwBvkB,EAAqD+D,GAC3E,OAAOtO,KAAK4qB,SACV,0BACA,CAAErgB,OAAM+D,OAIZygB,4BACE,OAAI/uB,KAAK4pB,uBACA8B,QAAQC,QAAQ3rB,KAAK4pB,wBAEvB5pB,KAAKyqB,cACV,4BACA,IACAtP,IACE,MAAMtX,EAASsX,EAAK4B,IAAID,GAAsBhB,UAE9C,OADA9b,KAAK4pB,uBAAyB/lB,EACvBA,KAIbmrB,mCACE,OAAIhvB,KAAK6pB,oBACA6B,QAAQC,QAAQ3rB,KAAK6pB,qBAEvB7pB,KAAK+uB,4BAA4BlE,MAAK1P,IAC3C,MAAMtX,EAAS7D,KAAK6pB,oBAAsB,IAAIlB,GAAYxN,GAAMC,GAAOA,EAAI9M,KAG3E,OAFA6M,EAAKoD,SAAQnD,GAAOA,EAAIgC,eAAevZ,KACvC7D,KAAK6pB,oBAAsBhmB,EACpBA,KAIXorB,uBAAuB1kB,EAA6B+D,GAClD,OAAOtO,KAAKyqB,cAAc,yBAA0B,CAClDlgB,KAAMA,EACN+D,GAAIA,GACH8K,GAAkB0C,UAGvBoT,2BAA2B3kB,EAA6B6hB,GACtD,OAAOpsB,KAAKyqB,cAAc,6BAA8B,CACtDlgB,KAAMA,EACN6hB,MAAOA,EACPU,MAAM,MACLqC,GAAcA,EAAWpS,IAAI3D,GAAkB0C,YAKpDsT,yBACEla,EACA3K,EAAc,OAEd,OAAOvK,KAAK4qB,SACV,2BACA,CAAE1V,YAAW3K,SAIjB8kB,iBAAiBjsB,GACf,OAAOpD,KAAKyqB,cAAc,2BAA4B,CACpDvrB,SAAUkE,EAAW6L,UACpB8F,GAAmB+G,UAGxBwT,iBAAiBlsB,GACf,OAAOpD,KAAKyqB,cAAc,2BAA4B,CACpDvrB,SAAUkE,EAAW6L,UACpB8F,GAAmB+G,UAGxByT,sBAAsBjhB,EAAYqQ,EAA0C,IAC1E,OAAO3e,KAAKyqB,cAAc,wBAAyB,CACjD1c,IAAKO,EACLqQ,WACC5J,GAAmB+G,UAGxB0T,gCAAgClhB,GAC9B,OAAOtO,KAAK4qB,SACV,kCACA,CAAEvV,SAAU/G,IAIhBmhB,2BACErsB,EACAie,GAEA,OAAOrhB,KAAK4qB,SAAS,6BAA8B,CACjD1rB,SAAUkE,EACVie,WAIJqO,iBAAiBphB,GACf,OAAOtO,KAAK4qB,SAAS,2BAA4B,CAAE7c,IAAKO,IAG1DqhB,kBAAkBrhB,GAChB,OAAOtO,KAAK4qB,SAAS,4BAA6B,CAAE7c,IAAKO,IAG3DshB,wBACExD,EACApN,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCwO,GAA0B,GAE1B,OAAO3uB,KAAK4qB,SACV,yBACA,CACE1rB,SAAUktB,EACVqC,YAAazP,EACb6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,EACP2K,mBAMNkB,YAAYnuB,GACV,OAAO1B,KAAK4qB,SACV,cACA,CAAE1rB,SAAUwC,IAIhBouB,YAAYpuB,GACV,OAAO1B,KAAK4qB,SACV,cACA,CAAE1rB,SAAUwC,IAIhBquB,SAASzhB,EAAYqQ,EAAwD,IAC3E,OAAO3e,KAAK4qB,SACV,WACA,CAAE7c,IAAKO,EAAIqQ,QAASA,IAIxBqR,cACE9wB,EACAmiB,GAEA,OAAOrhB,KAAK4qB,SACV,gBACA,CAAE1rB,WAAUmiB,WAIhB4O,YAAY3hB,GACV,OAAOtO,KAAK4qB,SAAS,cAAe,CAAE7c,IAAKO,IAG7C4hB,sBAAsB7a,GACpB,OAAOrV,KAAK4qB,SACV,eACA,CAAE1rB,SAAU,CAAE,UAAamW,KAI/B8a,WACEjxB,EACA8f,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCxB,EAAwD,IAExD,OAAO3e,KAAK4qB,SACV,YACA,CACE1rB,WACA8f,SACA6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,EACPrF,YAONyR,eACE,OAAOpwB,KAAK4qB,SAAS,eAAgB,IAGvCyF,YAAYpiB,GACV,OAAOjO,KAAK4qB,SAAS,cAAe,CAAE3c,SAGxCqiB,iBACEriB,EACAsiB,GAEA,OAAOvwB,KAAK4qB,SACV,mBACA,CAAE3c,OAAMuiB,UAAWD,IAIvBE,aAAaxiB,EAAcsiB,GACzB,OAAOvwB,KAAK4qB,SACV,eACA,CAAE3c,OAAMuiB,UAAWD,IAIvBG,YAAYziB,EAAcoT,EAAgBsP,GACxC,OAAO3wB,KAAK4qB,SACV,cACA,CAAE3c,OAAMoT,SAAQsP,QAIpBC,gBAAgB3iB,EAAcsiB,GAC5B,OAAOvwB,KAAK4qB,SACV,kBACA,CAAE3c,OAAMuiB,UAAWD,IAMvBM,eAAeptB,GACb,OAAOzD,KAAK4qB,SAAS,iBAAkB,CAAE1rB,SAAUuE,IAGrDqtB,eAAertB,GACb,OAAOzD,KAAK4qB,SAAS,iBAAkB,CAAE1rB,SAAUuE,IAGrDstB,YAAYziB,EAAYqQ,EAA+B,IACrD,OAAO3e,KAAK4qB,SAAS,cAAe,CAAE7c,IAAKO,EAAIqQ,YAGjDqS,aAAaL,GACX,OAAO3wB,KAAK4qB,SAAS,eAAgB,CAAE+F,QAGzCM,iBAAiBxtB,EAA8C4d,GAC7D,OAAOrhB,KAAK4qB,SACV,mBACA,CAAE1rB,SAAUuE,EAAU4d,WAI1B6P,eAAe5iB,GACb,OAAOtO,KAAK4qB,SACV,iBACA,CAAE7c,IAAKO,IAIX6iB,cACEnS,EAAiB,GACjB6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCxB,EAA+B,GAC/ByS,GAEA,OAAOpxB,KAAK4qB,SAAS,eAAgB,CACnC1rB,SAAU,GACV2tB,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1BsO,YAAazP,EACbgF,MAAO,EACPrF,UACAyS,eAIJC,oBAAoBhc,EAAkBic,GACpC,OAAOtxB,KAAK4qB,SAAS,sBAAuB,CAC1C2G,UAAWlc,EACXmc,YAAaF,IAIjBG,qBACEH,EACAtS,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCxB,EAAoB,IAEpB,OAAO3e,KAAK4qB,SAAS,uBAAwB,CAC3C1rB,SAAU,GACVsyB,YAAaF,EACbzE,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,EACPrF,UACA8P,YAAazP,IAIjB0S,uBAAuBpuB,EAAiBguB,GACtC,OAAOtxB,KAAK4qB,SACV,yBACA,CAAE1rB,kBAAUsyB,YAAaF,IAI7BK,yBAAyBtc,EAAkBic,GACzC,OAAOtxB,KAAK4qB,SACV,2BACA,CAAE2G,UAAWlc,EAAUmc,YAAaF,IAMxCM,qBAAqB1yB,GACnB,OAAOc,KAAK4qB,SACV,uBACA,CAAE1rB,aAIN2yB,qBAAqB3yB,GACnB,OAAOc,KAAK4qB,SACV,uBACA,CAAE1rB,aAIN4yB,kBAAkBxjB,EAAYqQ,EAAgD,IAC5E,OAAO3e,KAAK4qB,SACV,oBACA,CAAE7c,IAAKO,EAAIsN,OAAQ+C,IAIvBoT,uBAAuB7yB,EAAiCmiB,GACtD,OAAOrhB,KAAK4qB,SACV,yBACA,CAAE1rB,WAAUmiB,WAIhB2Q,8BACE9yB,EACAmiB,EACA4Q,EACAhnB,GAEA,OAAOjL,KAAK4qB,SACV,gCACA,CAAE1rB,WAAUmiB,SAAQtT,IAAKkkB,EAAkBhnB,UAI/CinB,sBAAsBD,GACpB,OAAOjyB,KAAK4qB,SACV,wBACA,CAAEuH,UAAWF,IAIjBG,sBAAsBC,EAAaC,GACjC,OAAOtyB,KAAK4qB,SACV,wBACA,CAAE2H,KAAMF,EAAKG,KAAMF,IAIvBG,qBAAqBnkB,GACnB,OAAOtO,KAAK4qB,SACV,uBACA,CAAE7c,IAAKO,IAIXokB,qBACEtG,EACApN,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,IAElC,OAAOngB,KAAK4qB,SACV,qBACA,CACE1rB,SAAUktB,EACVqC,YAAazP,EACb6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,IAKb2O,kBAAkBvG,GAChB,OAAOpsB,KAAK4qB,SACV,oBACA,CAAE1rB,SAAUktB,IAIhBwG,YACExG,EACApN,EACA6N,EAAe,EACfC,EAAgB,GAEhB,OAAO9sB,KAAK4qB,SACV,cACA,CAAE1rB,SAAUktB,EAAOS,OAAMC,QAAO2B,YAAazP,IAIjD6T,gBACEzG,EACApN,EACA6N,EAAe,EACfC,EAAgB,GAEhB,OAAO9sB,KAAK4qB,SACV,kBACA,CAAE1rB,SAAUktB,EAAOS,OAAMC,QAAO2B,YAAazP,IAIjD8T,YACE1G,EACApN,EACA6N,EAAe,EACfC,EAAgB,GAEhB,OAAO9sB,KAAK4qB,SACV,cACA,CAAE1rB,SAAUktB,EAAOS,OAAMC,QAAO2B,YAAazP,IAIjD+T,kBACE3G,EACApN,EACA6N,EAAe,EACfC,EAAgB,GAEhB,OAAO9sB,KAAK4qB,SACV,oBACA,CAAE1rB,SAAUktB,EAAOS,OAAMC,QAAO2B,YAAazP,IAIjDgU,0BACExkB,EACAyF,EACAE,EACAG,EACA0K,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCxB,EAAgC,IAEhC,OAAO3e,KAAK4qB,SACV,4BACA,CACEpc,OACAyF,WACAE,OACAD,QAASI,EACTma,YAAazP,EACb6N,OACAC,QACA9I,MAAO,EACP7D,KAAMngB,KAAKgsB,eAAe7L,GAC1BxB,QAASA,IAOfsU,aAAa3vB,GACX,OAAOtD,KAAK4qB,SAAS,eAAgB,CACnC1rB,SAAUoE,IAId4vB,aAAa5vB,GACX,OAAOtD,KAAK4qB,SAAS,eAAgB,CACnC1rB,SAAUoE,IAId6vB,UAAU7kB,EAAYqQ,EAAgC,GAAI4K,GACxD,OAAOvpB,KAAK4qB,SAAS,YAAa,CAAE7c,IAAKO,EAAIqQ,UAAS4K,UAGxD6J,WAAWzC,EAAehS,EAAoB,IAC5C,OAAO3e,KAAK4qB,SAAS,aAAc,CAAEyI,KAAM1C,EAAKhS,YAGlD2U,eAAep0B,EAAyBmiB,GACtC,OAAOrhB,KAAK4qB,SACV,iBACA,CAAE1rB,WAAUmiB,WAIhBkS,oBAAoBC,EAAmBC,EAAiB3G,EAAgB4G,GACtE,OAAO1zB,KAAK4qB,SACV,sBACA,CAAE4I,WAAUC,SAAQ3G,QAAO4G,WAI/BC,qBAAqBte,GACnB,OAAOrV,KAAK4qB,SACV,uBACA,CAAE7c,IAAKsH,IAIXue,aAAavB,EAAaC,GACxB,OAAOtyB,KAAK4qB,SACV,eACA,CAAE2H,KAAMF,EAAKG,KAAMF,IAIvBuB,aAAavlB,GACX,OAAOtO,KAAK4qB,SACV,eACA,CAAE7c,IAAKO,IAIXwlB,YACEC,EACA/U,EAAiB,GACjB6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCxB,EAAgC,GAChChR,GAEA,OAAO3N,KAAK4qB,SAAS,aAAc,CACjC1rB,SAAU60B,EACVtF,YAAazP,EACb6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1BxB,UACAqF,MAAO,EACPrW,YAIJqmB,mBAAmB5H,GACjB,OAAOpsB,KAAK4qB,SACV,qBACA,CAAEwB,UAIN6H,kBAAkBtD,GAChB,OAAO3wB,KAAK4qB,SACV,oBACA,CAAE+F,QAINuD,oBAAoBvD,GAClB,OAAO3wB,KAAK4qB,SACV,sBACA,CAAE+F,QAMNwD,qBAAqBj1B,GACnB,OAAOc,KAAK4qB,SACV,iBACA,CAAE1rB,aAINk1B,qBAAqBl1B,GACnB,OAAOc,KAAK4qB,SACV,iBACA,CAAE1rB,aAKNm1B,kBAAkB/lB,GAChB,OAAOtO,KAAK4qB,SAAS,cAAe,CAAE7c,IAAKO,IAG7CgmB,sBAAsBjf,EAAkBsJ,EAAoB,IAC1D,OAAO3e,KAAK4qB,SACV,wBACA,CAAEvV,WAAUsJ,YAIhB4V,uBAAuBr1B,EAAoDmiB,GACzE,OAAOrhB,KAAK4qB,SACV,mBACA,CAAE1rB,WAAUmiB,WAIhBmT,qBAAqBlmB,GACnB,OAAOtO,KAAK4qB,SACV,iBACA,CAAE7c,IAAKO,IAIXmmB,yBAAyBpf,GACvB,OAAOrV,KAAK4qB,SACV,2BACA,CAAEvV,aAINqf,oBACEtI,EACAS,EAAe,EACfC,EAAgB,EAChB3M,GAEA,OAAOngB,KAAK4qB,SACV,eACA,CAAE1rB,SAAUktB,EAAOS,OAAMC,QAAO3M,OAAM6D,MAAO,IAIjD2Q,iCAAiCrmB,GAC/B,OAAOtO,KAAK4qB,SACV,6BACA,CAAE7c,IAAKO,IAMXsmB,YAAYlxB,GACV,OAAO1D,KAAK4qB,SAAS,cAAe,CAClC1rB,SAAUwE,IAIdmxB,YAAYnxB,GACV,OAAO1D,KAAK4qB,SAAS,cAAe,CAClC1rB,SAAUwE,IAIdoxB,SAASxmB,EAAYqQ,EAA6B,IAChD,OAAO3e,KAAK4qB,SAAS,WAAY,CAC/B7c,IAAKO,EACLqQ,YAIJoW,eACE,OAAO/0B,KAAK4qB,SAAS,eAAgB,IAGvCoK,cACEtxB,EACA2d,GAEA,OAAOrhB,KAAK4qB,SAAS,gBAAiB,CACpC1rB,SAAUwE,EACV2d,WAIJ4T,eAAe3mB,GACb,OAAOtO,KAAK4qB,SAAS,iBAAkB,CAAE7c,IAAKO,IAGhD4mB,YAAY7C,EAAaC,GACvB,OAAOtyB,KAAK4qB,SACV,cACA,CAAE2H,KAAMF,EAAKG,KAAMF,IAIvB6C,YAAY7mB,GACV,OAAOtO,KAAK4qB,SACV,cACA,CAAE7c,IAAKO,IAIX8mB,WACEpW,EACA6N,EAAe,EACfwI,EAAe,IACflV,EAAkC,GAClCxB,EAA6B,GAC7ByS,EACAhF,GAEA,OAAOpsB,KAAK4qB,SAAS,YAAa,CAChC1rB,SAAUktB,GAAS,GACnBS,OACAC,MAAOuI,EACPrR,MAAO,EACPyK,YAAazP,EACbmB,KAAMngB,KAAKgsB,eAAe7L,GAC1BxB,QAASA,EACTyS,WAAYA,GAAc,CAACzT,GAASkB,KAAMlB,GAAS2X,YAIvDC,8BAA8BtnB,EAAcrJ,EAAkBwM,GAC5D,OAAOpR,KAAK4qB,SACV,gCACA,CAAE3c,OAAMunB,KAAM5wB,EAAUyM,aAAcD,IAI1CqkB,kBACExnB,EACAynB,EACAtkB,EACAxM,EAAmB,MAEnB,OAAO5E,KAAK4qB,SACV,oBACA,CAAE3c,OAAMynB,SAAQrkB,aAAcD,EAAaokB,KAAM5wB,IAIrD+wB,YAAY1nB,EAAcmD,EAAqBxM,GAC7C,OAAO5E,KAAK4qB,SAAS,cAAe,CAClC3c,KAAMA,EACNoD,aAAcD,EACdxM,SAAUA,IAIdgxB,cAAc3nB,EAAcmD,EAAqBxM,GAC/C,OAAO5E,KAAK4qB,SAAS,gBAAiB,CACpC3c,KAAMA,EACNoD,aAAcD,EACdxM,SAAUA,IAIdixB,mBAAmB5nB,EAAcmD,EAAqBrO,GACpD,OAAO/C,KAAK4qB,SAAS,qBAAsB,CACzC3c,OACAoD,aAAcD,EACdrO,cAMJ+yB,cAAc52B,GACZ,OAAOc,KAAK4qB,SAAS,gBAAiB,CAAE1rB,aAG1C62B,cAAc72B,GACZ,OAAOc,KAAK4qB,SAAS,gBAAiB,CAAE1rB,aAG1C82B,WAAW1nB,GACT,OAAOtO,KAAK4qB,SAAS,aAAc,CAAE7c,IAAKO,IAG5C2nB,gBAAgB/2B,EAA0BmiB,GACxC,OAAOrhB,KAAK4qB,SACV,kBACA,CAAE1rB,WAAUmiB,WAIhB6U,cAAc5nB,GACZ,OAAOtO,KAAK4qB,SAAS,gBAAiB,CAAE7c,IAAKO,IAG/C6nB,aACEnX,EAAiB,GACjB6N,EAAe,EACfC,EAAgB,EAChB3M,EACAjhB,GAEA,OAAOc,KAAK4qB,SAAS,cAAe,CAClC1rB,SAAUA,GAAY,GACtB2tB,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,EACPyK,YAAazP,IAMjBoX,kBAAkBl3B,GAChB,OAAOc,KAAK4qB,SAAS,cAAe,CAAE1rB,aAGxCm3B,kBAAkBn3B,GAChB,OAAOc,KAAK4qB,SAAS,cAAe,CAAE1rB,aAGxCo3B,eAAehoB,GACb,OAAOtO,KAAK4qB,SAAS,WAAY,CAAE7c,IAAKO,IAG1CioB,oBAAoBlhB,EAAkBsJ,GACpC,OAAO3e,KAAK4qB,SACV,sBACA,CAAEvV,WAAUsJ,YAIhB6X,oBAAoBt3B,EAA8BmiB,GAChD,OAAOrhB,KAAK4qB,SACV,gBACA,CAAE1rB,WAAUmiB,WAIhBoV,kBAAkBnoB,GAChB,OAAOtO,KAAK4qB,SAAS,oBAAqB,CAAE7c,IAAKO,IAGnDooB,uBAAuBrhB,GACrB,OAAOrV,KAAK4qB,SAAS,yBAA0B,CAAEvV,aAGnDshB,kBACEz3B,EAAwC,GACxC2tB,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,IAElC,OAAOngB,KAAK4qB,SAAS,oBAAqB,CACxC1rB,WACA2tB,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,IAMX4S,mBACE13B,EAAmC,GACnC2tB,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCnB,EACAL,GAEA,OAAO3e,KAAK4qB,SAAS,oBAAqB,CACxC1rB,WACA2tB,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1BsO,YAAazP,EACbgF,MAAO,EACPrF,YAKJkY,0BACEC,EACAjK,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,GAClCnB,EACAL,GAEA,OAAO3e,KAAK4qB,SAAS,4BAA6B,CAChDkM,gBACAjK,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1BsO,YAAazP,EACbgF,MAAO,EACPrF,YAIJoY,2BACE1hB,GAEA,IAAInW,EAAW,CAAC83B,cAAe3hB,GAC/B,OAAOrV,KAAK4qB,SAAS,oBAAqB,CACxC1rB,WACA8kB,MAAO,IAKXiT,gBAAgB3oB,EAAYqQ,GAC1B,OAAO3e,KAAK4qB,SAAS,iBAAkB,CAAE7c,IAAKO,EAAIqQ,YAGpDuY,qBAAqBh4B,EAAyBmiB,GAC5C,OAAOrhB,KAAK4qB,SACV,sBACA,CAAE1rB,WAAUmiB,WAIhB8V,oBAAoB7oB,EAAYiX,GAC9B,OAAOvlB,KAAK4qB,SAAS,qBAAsB,CAAE7c,IAAKO,EAAIiX,WAGxD6R,sBAAsB9oB,GACpB,OAAOtO,KAAK4qB,SAAS,uBAAwB,CAAE7c,IAAKO,IAGtD+oB,mBAAmBn4B,EAAkCyf,GACnD,OAAO3e,KAAK4qB,SAAS,oBAAqB,CAAE1rB,SAAUA,EAAUyf,QAASA,IAG3E2Y,mBAAmBp4B,GACjB,OAAOc,KAAK4qB,SAAS,oBAAqB,CAAE1rB,aAG9Cq4B,wBAAwBjpB,GACtB,OAAOtO,KAAK4qB,SAAS,8BAA+B,CAAEtc,GAAIA,EAAIib,MAAO,UAGvEiO,iCACEV,EACAvR,EACAmI,EACApjB,EACAmtB,GAEA,OAAOz3B,KAAK4qB,SAAS,mCAAoC,CACvDkM,gBACAvR,SACAmI,aACApjB,OACAmtB,aAIJC,8BACEZ,EACAvR,EACAoS,EACAF,GAEA,OAAOz3B,KAAK4qB,SAAS,gCAAiC,CACpDkM,gBACAvR,SACAoS,eACAF,aAIJG,uBACEd,EACAvR,EACAkS,GAEA,OAAOz3B,KAAK4qB,SAAS,yBAA0B,CAC7CkM,gBACAvR,SACAkS,aAIJI,uBAAuBf,EAAuBvR,GAC5C,OAAOvlB,KAAK4qB,SACV,yBACA,CAAEkM,gBAAevR,WAMrBuS,qBAAqB54B,GACnB,OAAOc,KAAK4qB,SACV,sBACA,CAAE1rB,aAIN64B,qBAAqB74B,GACnB,OAAOc,KAAK4qB,SACV,sBACA,CAAE1rB,aAIN84B,kBAAkB1pB,GAChB,OAAOtO,KAAK4qB,SACV,mBACA,CAAE7c,IAAKO,IAIX2pB,uBAAuB/4B,EAAiCmiB,GACtD,OAAOrhB,KAAK4qB,SACV,wBACA,CAAE1rB,WAAUmiB,WAIhB6W,qBAAqB5pB,GACnB,OAAOtO,KAAK4qB,SAAS,sBAAuB,CAAE7c,IAAKO,IAGrD6pB,mBACEnZ,EACA6N,EAAe,EACfwI,EAAe,EACflV,EAAkC,GAClCxB,EAAuC,IAEvC,OAAO3e,KAAK4qB,SAAS,oBAAqB,CACxC6D,YAAazP,EACb9f,SAAU,GACV2tB,OACAC,MAAOuI,EACPlV,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,EACPrF,YAIJyZ,mBAAmB9pB,EAAYpI,GAC7B,OAAOlG,KAAK4qB,SAAS,qBAAsB,CAAE7c,IAAKO,EAAIpI,WAKxDmyB,WAAWn5B,GACT,OAAOc,KAAK4qB,SAAS,aAAc,CAAE1rB,aAGvCo5B,WAAWp5B,GACT,OAAOc,KAAK4qB,SAAS,aAAc,CAAE1rB,aAGvCq5B,QAAQjqB,GACN,OAAOtO,KAAK4qB,SAAS,UAAW,CAAE7c,IAAKO,IAGzCkqB,aAAat5B,EAA0CmiB,GACrD,OAAOrhB,KAAK4qB,SACV,eACA,CAAE1rB,WAAUmiB,WAIhBoX,WAAWnqB,GACT,OAAOtO,KAAK4qB,SAAS,aAAc,CAAE7c,IAAKO,IAG5CoqB,SACE1Z,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,GAEA,OAAOngB,KAAK4qB,SAAS,WAAY,CAC/B1rB,SAAU,GACVuvB,YAAazP,EACb6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,IAMX2U,oBAAoBz5B,GAClB,OAAOc,KAAK4qB,SACV,sBACA,CAAE1rB,aAIN05B,oBAAoB15B,GAClB,OAAOc,KAAK4qB,SACV,sBACA,CAAE1rB,aAIN25B,oBAAoB9qB,GAClB,OAAO/N,KAAK4qB,SACV,sBACA,CAAE7c,QAIN+qB,iBAAiB/qB,EAAa4Q,GAC5B,OAAO3e,KAAK4qB,SACV,mBACA,CAAE7c,MAAK4Q,YAIXoa,sBACE75B,EACAmiB,GAEA,OAAOrhB,KAAK4qB,SACV,wBACA,CAAE1rB,WAAUmiB,WAIhB2X,mBACEha,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,IAElC,OAAOngB,KAAK4qB,SAAS,oBAAqB,CACxC1rB,SAAU,GACVuvB,YAAazP,EACb6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,IAIXiV,yBAAyBC,EAAmBC,GAC1C,OAAOn5B,KAAK4qB,SACV,0BACA,CAAEsO,YAAWC,aAIjBC,wBACEpa,EACA6N,EAAe,EACfC,EAAgB,EAChB3M,EAAkC,IAElC,OAAOngB,KAAK4qB,SAAS,0BAA2B,CAC9C1rB,SAAU,GACVuvB,YAAazP,EACb6N,OACAC,QACA3M,KAAMngB,KAAKgsB,eAAe7L,GAC1B6D,MAAO,IAIXqV,yBAAyBn6B,GACvB,OAAOc,KAAK4qB,SACV,2BACA,CAAE1rB,aAINo6B,yBAAyBp6B,GACvB,OAAOc,KAAK4qB,SACV,2BACA,CAAE1rB,aAINq6B,sBAAsBjrB,GACpB,OAAOtO,KAAK4qB,SACV,wBACA,CAAE7c,IAAKO,IAIXkrB,yBAAyBlrB,GACvB,OAAOtO,KAAK4qB,SACV,2BACA,CAAE7c,IAAKO,IAIXmrB,gCAAgCC,GAC9B,OAAO15B,KAAK4qB,SACV,kCACA,CAAE+O,kBAAmBD,IAIzBE,4BAA4BvkB,GAC1B,OAAOrV,KAAK4qB,SACV,8BACA,CAAE2G,UAAWlc,IAIjBwkB,8BAA8BnM,GAC5B,OAAO1tB,KAAK4qB,SACV,gCACA,CAAEkP,YAAapM,IAInBqM,eAAe1O,GACb,OAAOrrB,KAAK4qB,SACV,iBACA,CAAES,SAMN2O,kBAAkB96B,GAChB,OAAOc,KAAK4qB,SACV,oBACA,CAAE1rB,aAIN+6B,kBAAkB/6B,GAChB,OAAOc,KAAK4qB,SACV,oBACA,CAAE1rB,aAINg7B,eAAe5rB,EAAYqQ,EAAoB,IAC7C,OAAO3e,KAAK4qB,SACV,iBACA,CAAE7c,IAAKO,EAAIqQ,YAIfwb,kBAAkB7rB,GAChB,OAAOtO,KAAK4qB,SACV,oBACA,CAAE7c,IAAKO,IAIX8rB,oBAAoBl7B,EAAiCmiB,GACnD,OAAOrhB,KAAK4qB,SACV,sBACA,CAAE1rB,WAAUmiB,WAIhBgZ,iBAAiBrb,EAAgB6N,EAAcC,EAAe3M,EAAkC,GAAIxB,EAAoB,IACtH,OAAO3e,KAAK4qB,SACV,mBACA,CAAE1rB,SAAU,GAAIuvB,YAAazP,EAAQ6N,OAAMC,QAAO3M,KAAMngB,KAAKgsB,eAAe7L,GAAO6D,MAAO,EAAGrF,cAS7DoK,I,8BE/nD/B,SAASuR,GAAYnoB,GAG1B,MAAOooB,EAAQC,GAAWjxB,oBAAS,GAMnC,MAAO,CAACgxB,EALQpwB,uBAAatG,IAC3BsO,EAAMwZ,QAAQ9nB,GACd22B,GAAQ,GACRroB,EAAMsoB,aACL,CAACtoB,EAAMwZ,QAASxZ,EAAMsoB,YAOZ,MAAMC,WAAwE3Y,IAAM4Y,UAIjGtsB,YAAY8D,EAAUyoB,GACpBC,MAAM1oB,GAD0D,KAHlE2oB,cAGkE,OAFlEF,UAAiCj6B,EAK/BX,KAAK46B,KAAOA,EAEZ56B,KAAK2K,MAAQ,CACXowB,SAAS,GAGX/6B,KAAK86B,UAAW,EAEhB96B,KAAKg7B,WAAah7B,KAAKg7B,WAAWC,KAAKj7B,MAGzCk7B,0BAA0BC,GACxBn7B,KAAKo7B,SAAS,CAAEL,SAAS,IAG3BpP,QAAQ9nB,GACN7D,KAAK86B,UAAW,EAEhB96B,KAAKo7B,SAAS,CAAEL,SAAS,IACzB/6B,KAAKmS,MAAMwZ,QAAQ9nB,GAGrBw3B,QACEr7B,KAAKmS,MAAMka,SACXrsB,KAAKo7B,SAAS,CAAEL,SAAS,IAErB/6B,KAAKmS,MAAMsoB,UACbz6B,KAAKmS,MAAMsoB,WAGfO,aACOh7B,KAAK86B,UACR96B,KAAKmS,MAAMka,SAEbrsB,KAAKo7B,SAAS,CAAEL,SAAS,IAErB/6B,KAAKmS,MAAMsoB,UACbz6B,KAAKmS,MAAMsoB,WAGfa,cAEE,MAAMpQ,MAAM,mBAGd3K,SACE,OACE,eAAC,KAAD,CAAOgb,KAAMv7B,KAAK2K,MAAMowB,QAASS,OAAQx7B,KAAKg7B,WAAYJ,KAAM56B,KAAK46B,KAArE,SACG56B,KAAKs7B,iB,mCC5EP,MAAMG,GAAatpB,IACxB,MAAM,SAAEhR,GAAagR,EACrB,OACE,sBAAKC,UAAWqO,KAAOib,UAAvB,SACGv6B,KAKMw6B,GAAgBxpB,IAC3B,MAAM,SAAEhR,GAAagR,EACrB,OACE,sBAAKC,UAAWqO,KAAOmb,aAAvB,SACGz6B,KAKM06B,GAAmB1pB,IAC9B,MAAM,SAAEhR,GAAagR,EACrB,OACE,sBAAKC,UAAWqO,KAAOqb,UAAvB,SACE,sBAAK1pB,UAAU,YAAf,SACE,sBAAKA,UAAWqO,KAAOib,UAAvB,SACGv6B,SAOE46B,GAAwB5pB,IACnC,MAAM,SAAEhR,GAAagR,EACrB,OACE,eAAC6pB,GAAA,EAAD,CAAa5pB,UAAWqO,KAAOib,UAA/B,SACGv6B,KCjCM86B,GAAe9pB,IAC1B,MAAM,SAAEhR,GAAagR,EAErB,OACE,eAAC,KAAM+pB,OAAP,CAAcC,aAAW,EAAzB,SACE,eAAC,KAAMC,MAAP,CAAa9pB,MAAO,CAAE+pB,UAAW,GAAjC,SAAuCl7B,OCwBhCm7B,GAAqBnqB,IAChC,MAAM,MAAE6C,EAAF,QAASsW,EAAT,QAAkBiR,EAAlB,YAA2BC,EAA3B,WAAwCC,EAAxC,WAAoDC,GAAevqB,GAElEooB,EAAQ5O,GAAW2O,GAASnoB,GAC7BwqB,EAAkB,IAAMhR,GAAQ,GAGtC,OACE,gBAAC,KAAD,CAAO4P,KAAMhB,EAAQiB,OAAQmB,EAA7B,UACE,eAACV,GAAD,UAAcjnB,IACd,gBAAC,KAAM4nB,KAAP,WACE,6BAAItR,IACHiR,GAAW,oBAAGjqB,MAAO,CAAE6R,MAAO,oBAAnB,SAA0CoY,OAExD,gBAACR,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASyd,EAAnC,SACGD,GAAcj3B,EAAE,2BAEnB,eAACo3B,GAAA,EAAD,CAAQC,QAASN,GAAe,UAAWtd,QAbxB,IAAMyM,GAAQ,GAajC,SACG8Q,GAAch3B,EAAE,mCC/CpB,IAAKs3B,GAMAC,GAyBAC,GAiCAC,GA2BAC,GC7FAC,GAMAC,GASAC,GDDL,SAASC,GAAoBhzB,GAClC,OAAQA,GACN,KAAKyyB,GAAWQ,SACd,OAAO/3B,EAAE,uBACX,KAAKu3B,GAAW5vB,SACd,OAAO3H,EAAE,uBACX,QACE,OAAOA,EAAE,uBAIR,SAASg4B,GAAqBC,GACnC,OACSj4B,EADLi4B,EACO,gBAEA,oB,SA3BDX,K,sBAAAA,E,YAAAA,E,iBAAAA,Q,cAMAC,K,oBAAAA,E,oBAAAA,E,aAAAA,Q,cAyBAC,K,YAAAA,E,kBAAAA,E,wBAAAA,E,qBAAAA,Q,cAiCAC,K,gBAAAA,E,kBAAAA,E,gBAAAA,E,cAAAA,E,kBAAAA,E,gBAAAA,E,sBAAAA,E,gBAAAA,E,cAAAA,E,wBAAAA,E,0BAAAA,E,iBAAAA,Q,cA2BAC,K,gDAAAA,E,6BAAAA,E,2BAAAA,E,4BAAAA,E,mCAAAA,E,mCAAAA,E,8BAAAA,E,8BAAAA,E,4BAAAA,E,wCAAAA,E,6BAAAA,E,yBAAAA,E,6CAAAA,E,8BAAAA,E,oCAAAA,Q,KAiFL,MAAMnjB,GA6BX3L,YAAY/K,GAAkB,KA5B9BgL,QA4B6B,OA3B7B4qB,eA2B6B,OA1B7BC,cA0B6B,OAzB7BwE,2BAyB6B,OAxB7BC,0BAwB6B,OAvB7BC,YAuB6B,OAtB7BC,aAsB6B,OArB7BC,eAqB6B,OApB7BC,cAoB6B,OAnB7BC,sBAmB6B,OAlB7BC,aAkB6B,OAjB7BC,eAiB6B,OAhB7BC,cAgB6B,OAf7BC,sBAe6B,OAd7BC,aAc6B,OAb7BC,gBAa6B,OAZ7BC,uBAY6B,OAX7BC,iBAW6B,OAV7BC,gBAU6B,OAT7BC,gBAS6B,OAR7BC,YAQ6B,OAP7BC,eAO6B,OAL7BC,cAK6B,OAJ7BC,oBAI6B,OAH7BC,yBAG6B,OAF7BC,eAE6B,EAC3Bj/B,KAAKsO,GAAKhL,EAAOyK,KAAO,GACxB/N,KAAKk5B,UAAY51B,EAAO47B,QACxBl/B,KAAKm5B,SAAW71B,EAAO67B,WACvBn/B,KAAK29B,sBAAwBr6B,EAAO87B,qBACpCp/B,KAAK49B,qBAAuBt6B,EAAO+7B,wBACnCr/B,KAAK69B,OAASv6B,EAAOu6B,OACrB79B,KAAK4+B,OAASt7B,EAAOs7B,QAAU,GAC/B5+B,KAAK2+B,WAAar7B,EAAO8K,YAEzBpO,KAAK89B,QAAUx6B,EAAOg8B,SACtBt/B,KAAK+9B,UAAYz6B,EAAOi8B,WACxBv/B,KAAKg+B,SAAW16B,EAAOk8B,UACvBx/B,KAAKi+B,iBAAmB36B,EAAOm8B,eAE/Bz/B,KAAKk+B,QAAU56B,EAAOo8B,SACtB1/B,KAAKm+B,UAAY76B,EAAOq8B,WACxB3/B,KAAKo+B,SAAW96B,EAAOs8B,UACvB5/B,KAAKs+B,QAAUh7B,EAAOu8B,SAAS96B,WAC/B/E,KAAKq+B,iBAAmB/6B,EAAOw8B,eAE/B9/B,KAAKu+B,WAAaj7B,EAAOy8B,YACzB//B,KAAKw+B,kBAAoBl7B,EAAO08B,oBAChChgC,KAAKy+B,YAAcn7B,EAAO28B,aAC1BjgC,KAAK0+B,WAAap7B,EAAO48B,YAEzBlgC,KAAK8+B,SAAWx7B,EAAO68B,oBACvBngC,KAAK6+B,UAAYv7B,EAAOu7B,UACxB7+B,KAAK++B,eAAiBz7B,EAAO88B,uBAC7BpgC,KAAKi/B,UAAY37B,EAAO+8B,kBAAoB,GAExC/8B,EAAOg9B,4BACTtgC,KAAKg/B,oBAAsB17B,EAAOg9B,0BAC/BvjB,KAAIkP,IAAK,CAAO3d,GAAI2d,EAAM,GAAIhe,KAAMge,EAAM,QAI7Che,WACF,OAAOjO,KAAKk5B,UAAY,IAAMl5B,KAAKm5B,SAGjCoH,mBACF,OAAOvgC,KAAKm5B,SAAW,IAAMn5B,KAAKk5B,UAGhCsH,yBACF,OAAIxgC,KAAK89B,SAAW99B,KAAK+9B,WAAa/9B,KAAKg+B,UACjCh+B,KAAK89B,SAAW,KAAO,KAAO99B,KAAK+9B,WAAa,KAAO,KAAO/9B,KAAKg+B,UAAY,KAEhF,GAGPyC,wBACF,OAAIzgC,KAAKk+B,SAAWl+B,KAAKm+B,WAAan+B,KAAKo+B,UACjCp+B,KAAKk+B,SAAW,KAAO,KAAOl+B,KAAKm+B,WAAa,KAAO,KAAOn+B,KAAKo+B,UAAY,KAEhF,GAGPsC,kBACF,OAA4D,OAApD1gC,KAAK89B,SAAW99B,KAAK+9B,WAAa/9B,KAAKg+B,UAG7C2C,kBACF,OAA4D,OAApD3gC,KAAKk+B,SAAWl+B,KAAKm+B,WAAan+B,KAAKo+B,UAGjDwC,eACE,OAAOrD,GAAoBv9B,KAAKu+B,YAAc,IAAMd,GAAqBz9B,KAAKy+B,aAGhFoC,qBACE,OAAO7gC,KAAK0+B,WAAaj5B,EAAE,qBAAuB,GAGpDq7B,wBACE,OA/OG,SAAgCC,GACrC,OAAQA,GACN,KAAK9D,GAAc+D,WACjB,OAAOv7B,EAAE,4BACX,KAAKw3B,GAAcgE,SACjB,OAAOx7B,EAAE,0BACX,KAAKw3B,GAAc5tB,QACjB,OAAO5J,EAAE,yBACX,QACE,OAAOA,EAAE,uBAsOJy7B,CAAuBlhC,KAAKw+B,mBAGrC2C,iBACE,OAtOG,SAAyBtD,GAC9B,OAAQA,GACN,KAAKd,GAAOqE,UACV,OAAO37B,EAAE,oBACX,KAAKs3B,GAAOsE,OACV,OAAO57B,EAAE,iBACX,KAAKs3B,GAAOuE,KACV,OAAO77B,EAAE,eACX,QACE,OAAOA,EAAE,qBA6NJ87B,CAAgBvhC,KAAK69B,QAG9B2D,cACE,GAAqB,OAAjBxhC,KAAKs+B,QAAkB,CACzB,IAAImD,EAAcpf,SAASriB,KAAKs+B,SAChC,GAAIoD,MAAMD,GACR,OAAOzhC,KAAKs+B,QAEZ,GAAImD,EAAc,EAChB,OAAOzhC,KAAKs+B,QAIlB,MAAO,GAG0B,oCAACqD,EAAkC9D,GACpE,OAAOp4B,EAAEo4B,IAAWd,GAAOqE,UACtB,YAAWO,IACX,YAAWA,KAAgB9D,EAAO+D,yB,SC/S/BxE,K,YAAAA,E,yBAAAA,E,aAAAA,Q,cAMAC,K,kBAAAA,E,UAAAA,E,YAAAA,E,iBAAAA,E,eAAAA,E,kCAAAA,Q,cASAC,K,oBAAAA,E,YAAAA,E,kBAAAA,E,6BAAAA,Q,KCpBL,MAAMuE,GAAU,CAACC,EAAaC,KACnC,MAAMC,EAAOD,EAASD,EAAI/8B,WAAWlF,OAAS,EAC9C,OAAOoiC,QAAQD,EAAO,GAAKA,IAAO9wB,KAAK,KAAO4wB,GCezC,SAASI,GAAwBrkB,GACtC,OAAOpY,EAAG,qBAAuBoY,EAAS5Y,eAqDrC,MAAMk9B,GAEK,iBAACtrB,GACf,OAAO,IAAIsrB,GACTtrB,EAAOvI,GACPuI,EAAOgH,SACPhH,EAAOurB,KACPvrB,EAAOwrB,SACPxrB,EAAO5W,OACP4W,EAAOsE,KACPtE,EAAO3Q,OACP2Q,EAAOyrB,UACPzrB,EAAOqX,SACPrX,EAAOsY,WACPtY,EAAO0rB,oBACP1rB,EAAO7B,YAASrU,EAChBkW,EAAOzI,kBAAezN,EACtBkW,EAAO2rB,QACP3rB,EAAO4rB,SACP5rB,EAAOpI,QACPoI,EAAO+V,aACP/V,EAAOzT,WACPyT,EAAO6rB,SACP7rB,EAAO5B,QACP4B,EAAO3B,UACP2B,EAAO8rB,YACP9rB,EAAO+rB,YACP/rB,EAAOgsB,OACPhsB,EAAOisB,QACPjsB,EAAOkS,IACPlS,EAAOksB,YACPlsB,EAAOmsB,WACPnsB,EAAOosB,aACPpsB,EAAOqsB,OACPrsB,EAAOssB,OAKI,gBAACr1B,EAAiBuP,GAC/B,OAAO,IAAI8kB,GACTr0B,EAAKC,IACLD,EAAK+P,SACL/P,EAAKs0B,KACLt0B,EAAKu0B,SACLv0B,EAAK7N,QAAUkiC,GAASrmB,SAAShO,EAAK7N,OAAQod,GAC9CvP,EAAKqN,KAAK4B,KAAI3B,GAAOM,GAAYI,SAASV,EAAKiC,KAC/CvP,EAAK5H,OACL4H,EAAKw0B,UACLx0B,EAAKogB,SACLpgB,EAAKqhB,WAAWpS,KAAIqmB,GAAahqB,GAAkB0C,SAASsnB,KAC5Dt1B,EAAKy0B,oBAAoBxlB,KAAIqmB,GAAahqB,GAAkBiqB,YAAYD,KACxEt1B,EAAKkH,YAASrU,EACdmN,EAAKM,kBAAezN,EACpB4E,IAAOuI,EAAK00B,SACZj9B,IAAOuI,EAAK20B,UACZ30B,EAAKW,UAAW,EAGhBX,EAAKif,cACLjf,EAAK1K,YAAc2R,GAAmB+G,SAAShO,EAAK1K,YACpD0K,EAAK40B,SAEL50B,EAAKmH,QACLnH,EAAKoH,UAELpH,EAAK60B,YACL70B,EAAK80B,YAEL90B,EAAK+0B,OACL/0B,EAAKg1B,QAELh1B,EAAKib,IAELjb,EAAKi1B,YACLj1B,EAAKk1B,WACLl1B,EAAKm1B,aACLn1B,EAAKo1B,OACLp1B,EAAKq1B,OAIG,eACV,OAAO,IAAIhB,GACT,GACA9E,GAAiBiG,MACjBhG,GAAaiG,cACb5iC,OACAA,EACA,GACAy8B,GAAehoB,MACf,EACA,GACA,GACA,QACAzU,OACAA,EACA4E,MACAA,WACA5E,GA4CJ0N,YACEC,EACAuP,EACAukB,EACAC,EACApiC,EACAkb,EACAjV,EACAo8B,EACApU,EACAiB,EACAoT,EACAvtB,EACA5G,EACAo0B,EACAC,EACAh0B,EACAme,EACAxpB,EACAs/B,EACAztB,EACAC,EACAytB,EACAC,EACAC,EACAC,EACA/Z,EACAga,EACAC,EACAC,EACAC,EACAC,GACC,KAxEH70B,QAwEE,OAvEFuP,cAuEE,OAtEFukB,UAsEE,OArEFC,cAqEE,OApEFpiC,YAoEE,OAnEFkb,UAmEE,OAlEFjV,YAkEE,OAjEFo8B,eAiEE,OAhEFpU,cAgEE,OA/DFiB,gBA+DE,OA9DFoT,yBA8DE,OA7DFn0B,iBA6DE,OA5DFo0B,aA4DE,OA3DFC,cA2DE,OA1DFh0B,aA0DE,OAxDFi0B,cAwDE,OAvDF9V,kBAuDE,OAtDFxpB,gBAsDE,OApDF6R,aAoDE,OAnDFC,eAmDE,OAjDFytB,iBAiDE,OAhDFC,iBAgDE,OA9CFC,YA8CE,OA7CFC,aA6CE,OA3CF/Z,SA2CE,OAzCFga,iBAyCE,OAxCFC,gBAwCE,OAvCFC,kBAuCE,OAtCFC,YAsCE,OArCFC,WAqCE,OAnCFK,YAmCE,OAlCFC,iBAkCE,EACAzjC,KAAKsO,GAAKA,EACVtO,KAAK6d,SAAWA,EAChB7d,KAAKoiC,KAAOA,EACZpiC,KAAKqiC,SAAWA,GAAY,KAC5BriC,KAAKC,OAASA,EACdD,KAAKmb,KAAOA,GAAQ,GACpBnb,KAAKkG,OAASA,GAAUk3B,GAAehoB,KACvCpV,KAAKsiC,UAAYA,IAAa,EAC9BtiC,KAAKkuB,SAAWA,GAAY,GAC5BluB,KAAKmvB,WAAaA,GAAc,GAChCnvB,KAAKuiC,oBAAsBA,GAAuB,GAClDviC,KAAKwjC,OAASxuB,EACdhV,KAAKoO,YAAcA,EACnBpO,KAAKwiC,QAAUA,GAAWj9B,MAC1BvF,KAAKyiC,SAAWA,GAAYziC,KAAKwiC,QACjCxiC,KAAKyO,QAAUA,IAAW,EAE1BzO,KAAK4sB,aAAeA,GAAgB,KACpC5sB,KAAK0iC,SAAWA,GAAY,GAC5B1iC,KAAKoD,WAAaA,EAElBpD,KAAKiV,QAAUA,EACfjV,KAAKkV,UAAYA,EAEjBlV,KAAK2iC,YAAcA,EACnB3iC,KAAK4iC,YAAcA,EAEnB5iC,KAAK6iC,OAASA,EACd7iC,KAAK8iC,QAAUA,EAEf9iC,KAAK+oB,IAAMA,EAEX/oB,KAAK+iC,YAAcA,EACnB/iC,KAAKgjC,WAAaA,EAClBhjC,KAAKijC,aAAeA,EACpBjjC,KAAKkjC,OAASA,EACdljC,KAAKmjC,MAAQA,EAGfO,mBAAmB1kB,GAIjB,YAHyBre,IAArBX,KAAKyjC,cACPzjC,KAAKyjC,YAAczjC,KAAKgV,MAAM/P,eAEzBjF,KAAKyjC,YAAYva,QAAQlK,IAAW,EAG7C/d,QACE,OAAO,IAAIkhC,GACTniC,KAAKsO,GACLtO,KAAK6d,SACL7d,KAAKoiC,KACLpiC,KAAKqiC,eAAY1hC,EACjBX,KAAKC,OACLD,KAAKmb,KACLnb,KAAKkG,OACLlG,KAAKsiC,UACLtiC,KAAKkuB,SACLluB,KAAKmvB,WACLnvB,KAAKuiC,oBACLviC,KAAKgV,MACLhV,KAAKoO,YACLpO,KAAKwiC,QACLxiC,KAAKyiC,SACLziC,KAAKyO,QAELzO,KAAK4sB,aACL5sB,KAAKoD,WACLpD,KAAK0iC,SAEL1iC,KAAKiV,QACLjV,KAAKkV,UAELlV,KAAK2iC,YACL3iC,KAAK4iC,YAEL5iC,KAAK6iC,OACL7iC,KAAK8iC,QAEL9iC,KAAK+oB,IAEL/oB,KAAK+iC,YACL/iC,KAAKgjC,WACLhjC,KAAKijC,aACLjjC,KAAKkjC,OACLljC,KAAKmjC,OAKTl0B,SAAqB,IAAD,EAClB,MAAO,CAGLlB,IAAK/N,KAAKsO,GACVuP,SAAU7d,KAAK6d,SACf7I,MAAOhV,KAAKgV,OAAS,KACrB5G,YAAapO,KAAKoO,aAAe,KACjCy0B,OAAQ7iC,KAAK6iC,OACb1nB,KAAMnb,KAAKmb,KAAK4B,KAAI3B,GAAOA,EAAInM,WAC/BmzB,KAAMpiC,KAAKoiC,KACXl8B,OAAQlG,KAAKkG,OACbgoB,SAAUluB,KAAKkuB,SACfiB,WAAYnvB,KAAKmvB,WAAWpS,KAAIqmB,GAAaA,EAAUn0B,WACvDozB,SAAQ,UAAEriC,KAAKqiC,gBAAP,aAAmB1hC,EAC3B8N,QAASzO,KAAKyO,QACd6zB,UAAWtiC,KAAKsiC,UAChBE,QAAS,EACTC,SAAU,EACVF,oBAAqBviC,KAAKuiC,oBAAoBxlB,KAAIjJ,GAAUA,EAAO8F,cAGnE+oB,YAAa3iC,KAAK2iC,YAClBC,YAAa5iC,KAAK4iC,YAGlB7Z,IAAK/oB,KAAK+oB,IAGV+Z,QAAS9iC,KAAK8iC,QAGdC,YAAa/iC,KAAK+iC,YAClBC,WAAYhjC,KAAKgjC,WACjBC,aAAcjjC,KAAKijC,aACnBC,OAAQljC,KAAKkjC,OACbC,MAAOnjC,KAAKmjC,OAIZzV,iBACF,OAAQ1tB,KAAKoD,YAAcpD,KAAKoD,WAAW8R,WAAclV,KAAKkV,WAAalV,KAAKijC,cAAgBjjC,KAAK4iC,aAAe,GAGlH5tB,YACF,YAAoBrU,IAAhBX,KAAKwjC,QAAwC,KAAhBxjC,KAAKwjC,QAChCxjC,KAAK6d,WAAawf,GAAiBiG,QACrCtjC,KAAK6d,SAAawf,GAAiBsG,yBAC5B,IAIJ3jC,KAAKwjC,OAGc,6BAACV,GAC3B,IAAIj/B,EAAiB,GAMrB,OAJEA,OADclD,IAAZmiC,GAAyBA,EAAU,EAC5B,GAEA,OAASjB,GAAQiB,EAAS,GAE9Bj/B,EAIW,qBAACsX,GACnB,IAAItX,EAAS,GACT7C,GAAQ,EAEZ,IAAK,IAAIwiB,EAAI,EAAGA,EAAIrI,EAAKtb,OAAQ2jB,IAAK,CACpC,IAAIpI,EAAMD,EAAKqI,GAGXxiB,EACFA,GAAQ,EAER6C,GAAU,KAGZA,GARoBuX,EAAIA,IAQAkC,oBAAoBlC,GAE9C,OAAOvX,GC/ZJ,MAAM+/B,ICON,IAAKC,GCGAA,GDsLL,SAASC,GAAe9uB,EAAewK,EAAaukB,GACzD,MAAMC,EArLR,SAA4BxkB,EAAaukB,GACvC,MAAOE,EAAWC,GAAS1kB,EAAI1a,MAAM,IAAK,IACnCkQ,EAAOmvB,GAAY56B,mBAASw6B,GAAY,QACxCK,EAAgBC,GAAqB96B,mBAAS,IAkFrD,OAhFA8b,qBAAU,KACR,QAAiB1kB,IAAbojC,EAMJ,OADAI,EAAS,OACDF,GACN,KAAKvvB,GAAOqE,mBACZ,KAAKrE,GAAOsC,mBACNktB,GACFI,GAAIxS,kBAAkBoS,GACnBrZ,MAAK/W,GAAUqwB,EAAS,IAAItwB,GAAeC,GAAQ7F,QAExD,MACF,KAAKyG,GAAOmE,eACZ,KAAKnE,GAAO8B,eACN0tB,GACFI,GAAI/U,sBAAsB2U,GACvBrZ,MAAKznB,GAAc+gC,EAAS/gC,EAAWkS,mBAE5C,MACF,KAAKZ,GAAO+B,aACNytB,GACFxY,QAAQ6Y,IAAI,CACVD,GAAIlW,sBAAsB8V,GAC1BI,GAAItV,qCACHnE,MAAK,EAAE3rB,EAAUic,MAClBgpB,EAAShC,GAASrmB,SAAS5c,EAAUic,GAAMnG,UAG/C,MACF,KAAKN,GAAOsE,WACZ,KAAKtE,GAAOuC,WACZ,KAAKvC,GAAO0C,iBACRktB,GAAInR,UAAU+Q,GAAOrZ,MAAKvnB,GAAU6gC,EAAS,IAAInqB,GAAO1W,GAAQ2K,QAClE,MACF,KAAKyG,GAAOwC,gBACNgtB,GACFI,GAAIrN,gBAAgBiN,GACjBrZ,MAAK1mB,GAAeggC,EAASP,GAAkBY,WAAWrgC,MAE/D,MACF,KAAKuQ,GAAOuE,UACZ,KAAKvE,GAAO8C,UACN0sB,GACFI,GAAIxP,SAASoP,GAAOrZ,MAAKnnB,GAASygC,EAAS,IAAIvzB,GAAMlN,GAAOuK,QAE9D,MACF,KAAKyG,GAAOoE,aACZ,KAAKpE,GAAOqC,aACNmtB,GACFI,GAAIvT,YAAYmT,GAAOrZ,MAAKpnB,GAAY0gC,EAAS1gC,EAASwK,QAE5D,MACF,KAAKyG,GAAOiC,kBACNutB,GACFI,GAAIxL,iBAAiBoL,GAClBrZ,MAAKvnB,GAAU6gC,EAAS7gC,EAAO41B,UAAY,IAAM51B,EAAO61B,YAE7D,MACF,KAAKzkB,GAAOgC,kBACNwtB,GACFI,GAAI/K,sBAAsB2K,GACvBrZ,MAAK5mB,IACJogC,EAAkBpgC,EAAcy1B,iBAChCyK,GAAUlgC,EAAcwgC,iBAAmB,IACvC,KAAOxgC,EAAcygC,gBAAkB,QAGjD,MACF,KAAKhwB,GAAOwE,YACNgrB,GACFI,GAAItO,WAAWkO,GACZrZ,MAAKlnB,GAAWwgC,EAASxgC,EAAQqR,cAxExCmvB,EAASJ,KA4EV,CAACE,EAAWC,EAAOH,IAEf9b,mBAAQ,KACb,OAAQgc,GACN,KAAKvvB,GAAOoF,KACV,MAAO,GACT,KAAKpF,GAAOsD,qBACV,MAAO,CAAC,IAAI2sB,GAAWl/B,EAAE,+BAAgC,uBAC3D,KAAKiP,GAAOqE,mBACZ,KAAKrE,GAAOsC,mBACV,MAAO,CACL,IAAI2tB,GAAWl/B,EAAE,+BAAgC,sBACjD,IAAIk/B,GAAW3vB,EAAQ,sBAAqBkvB,MAEhD,KAAKxvB,GAAOgD,gBACV,MAAO,CAAC,IAAIitB,GAAWl/B,EAAE,0BAA2B,iBACtD,KAAKiP,GAAOmE,eACZ,KAAKnE,GAAO8B,eACV,MAAO,CACL,IAAImuB,GAAWl/B,EAAE,0BAA2B,gBAC5C,IAAIk/B,GAAW3vB,EAAQ,gBAAekvB,MAE1C,KAAKxvB,GAAOmD,kBACV,MAAO,CAAC,IAAI8sB,GAAWl/B,EAAE,4BAA6B,mBACxD,KAAKiP,GAAO+B,aACV,MAAO,CACL,IAAIkuB,GAAWl/B,EAAE,4BAA6B,kBAC9C,IAAIk/B,GAAW3vB,GAASvP,EAAE,yBAA2B,cAAay+B,MAEtE,KAAKxvB,GAAOyD,kBACV,MAAO,CAAC,IAAIwsB,GAAWl/B,EAAE,uBAAwB,mBACnD,KAAKiP,GAAOwD,YACV,MAAO,CAAC,IAAIysB,GAAWl/B,EAAE,qBAAsB,aACjD,KAAKiP,GAAOsE,WACZ,KAAKtE,GAAOuC,WACV,MAAO,CACL,IAAI0tB,GAAWl/B,EAAE,qBAAsB,YACvC,IAAIk/B,GAAW3vB,EAAQ,YAAWkvB,MAEtC,KAAKxvB,GAAOwC,gBACV,MAAO,CACL,IAAIytB,GAAWl/B,EAAE,uBAAwB,kBACzC,IAAIk/B,GAAW3vB,EAAQ,kBAAiBkvB,MAE5C,KAAKxvB,GAAO0D,WACV,MAAO,CAAC,IAAIusB,GAAWl/B,EAAE,qBAAsB,YACjD,KAAKiP,GAAOuE,UACZ,KAAKvE,GAAO8C,UACV,MAAO,CACL,IAAImtB,GAAWl/B,EAAE,qBAAsB,WACvC,IAAIk/B,GAAW3vB,EAAQ,WAAUkvB,MAErC,KAAKxvB,GAAOqD,cACV,MAAO,CAAC,IAAI4sB,GAAWl/B,EAAE,mBAAoB,eAC/C,KAAKiP,GAAOoE,aACZ,KAAKpE,GAAOqC,aACV,MAAO,CACL,IAAI4tB,GAAWl/B,EAAE,mBAAoB,cACrC,IAAIk/B,GAAW3vB,EAAQ,cAAakvB,MAExC,KAAKxvB,GAAOiD,mBACV,MAAO,CAAC,IAAIgtB,GAAWl/B,EAAE,iCAAkC,qBAC7D,KAAKiP,GAAOkD,mBACV,MAAO,CAAC,IAAI+sB,GAAWl/B,EAAE,iCAAkC,qBAC7D,KAAKiP,GAAOiC,kBACV,MAAO,CACL,IAAIguB,GAAWl/B,EAAE,iCAAkC,oBACnD,IAAIk/B,GAAW3vB,EAAQ,oBAAmBkvB,MAE9C,KAAKxvB,GAAOgC,kBAEV,OADAtC,QAAQC,IAAI,gBAAiB+vB,GACtB,CACL,IAAIO,GAAWl/B,EAAE,iCAAkC,oBACnD,IAAIk/B,GAAW3vB,EAAQ,oBAAmBovB,KAC1C,IAAIO,GAAWl/B,EAAE,sBAAwB,oBAAmBy+B,MAEhE,KAAKxvB,GAAOwE,YACV,MAAO,CACL,IAAIyrB,GAAWl/B,EAAE,uBAAwB,aACzC,IAAIk/B,GAAW3vB,EAAQ,aAAYkvB,MAEvC,KAAKxvB,GAAOyE,aACV,MAAO,CACL,IAAIwrB,GAAWl/B,EAAE,uBAAwB,cACzC,IAAIk/B,GAAW3vB,EAAQ,cAAakvB,MAExC,KAAKxvB,GAAO8D,aACV,MAAO,CACL,IAAImsB,GAAWl/B,EAAE,sBAAuB,YAK9C,OADA2O,QAAQC,IAAI,wBAAyB4vB,GAC9B,KACN,CAACA,EAAWC,EAAOlvB,EAAOovB,IAIhBQ,CAAmBplB,EAAKukB,GACrC,OAAO9b,mBACL,IAAc,SAARzI,EAAiB,GAAK,IAAIwkB,EAAM,IAAIW,GAAW3vB,EAAO,IAAI,KAChE,CAACgvB,EAAMhvB,EAAOwK,IDpMLokB,GAEJY,WAAcrgC,IACnB,IAAKA,EACH,MAAO,MAET,IAAIN,EAAiB,GAKrB,OAJIM,EAAY0gC,WAAWhlC,OAAS,IAClCgE,EAASA,EAASM,EAAY0gC,WAAa,KACzC1gC,EAAY2gC,YAAYjlC,OAAS,IACnCgE,GAAkBM,EAAY2gC,aACzBjhC,EAAOhE,OAAS,EAAIgE,EAAS4B,EAAE,sC,SCJ9Bo+B,O,qBAAAA,I,wBAAAA,Q,KAiML,MAAMc,GAKXt2B,YAAY2G,EAAeyK,EAAYgE,GAAkB,GAAQ,KAJjEzO,WAIgE,OAHhEyK,QAGgE,OAFhEgE,YAEgE,EAC9DzjB,KAAKgV,MAAQA,EACbhV,KAAKyf,GAAKA,EACVzf,KAAKyjB,OAASA,GC7IX,SAASshB,GACdz2B,EACAwF,EACAzB,EACA2C,EACAgwB,EACAxlB,EACAukB,EACAkB,EACAC,GAEA,MAAMr6B,EAAWnB,cACXy7B,EAAcrB,GAAekB,EAAYxlB,GAAO,OAAQukB,GAC9D1e,qBAAU,K9BgFL,IAAuB1a,E8B/E1BE,G9B+E0BF,E8B/EH,CAAE2D,KAAIwF,SAAQzB,OAAM2C,QAAOkwB,YAAW1lB,MAAK2lB,cAAaF,qB9BgF1E,CACL16B,KAAMH,EAAcg7B,cACpB36B,QAASE,O8BjFR,CAACE,EAAUwH,EAAM2C,EAAOmwB,EAAaF,EAAmBnxB,EAAQxF,EAAIkR,K,SAxE7DqkB,O,qBAAAA,I,mBAAAA,I,+BAAAA,I,qCAAAA,I,iDAAAA,I,wBAAAA,Q,KAyFZ,MAAMwB,GAAuC,CAC3CjhB,SAAU,EACVkhB,QAAS,OACTC,cAAe,UAGJC,GAAQrzB,IACnB,MAAM,GACJ7D,EADI,OAEJwF,EAFI,KAGJzB,EAHI,MAIJ2C,EAJI,WAKJgwB,EAAahwB,EALT,IAMJwK,EANI,SAOJukB,EAPI,eAQJ0B,EAAiBJ,GARb,kBASJJ,EATI,SAUJ9jC,EAVI,gBAWJukC,EAAkB,IAChBvzB,EAGJ4yB,GAAcz2B,EAAIwF,EAAQzB,EAAM2C,EAAOgwB,EAAYxlB,EAAKukB,EAAUkB,GAElE,MAAMp6B,EAAWpB,IAMjB,OALA4b,qBAAU,KACRxa,EAASe,EAAmB85B,MAC3B,IAID,sBAAKpzB,MAAO,CAACgzB,QAAS,OAAQC,cAAe,SAAUnhB,SAAU,EAAGuhB,SAAU,WAAYC,SAAU,QAApG,SACE,sBAAKxzB,UAAU,YAAYE,MAAOmzB,EAAlC,SACGtkC,OAMF,MAAM0kC,WAA2D9jB,IAAM4Y,UAG5EtsB,YAAY8D,GACV0oB,MAAM1oB,GADc,KAFtBszB,oBAEsB,EAGpBzlC,KAAKylC,eAAiB,CACpBrhB,SAAU,GAId0hB,QAAWC,EAAqBC,GAC9B,MAAM,QAAEF,GAAY9lC,KAAKmS,MACzB,OAAO2zB,EAAQA,QAAQC,EAASC,GAGlCC,OAAUF,EAAqBC,GAC7B,MAAM,QAAEF,GAAY9lC,KAAKmS,MACzB,OAAO2zB,EAAQG,OAAOF,EAASC,GAGjCE,oBACElmC,KAAKmmC,cAGPC,mBAAmBC,EAAaC,GAC1BtmC,KAAKumC,kBAAkBF,EAAUrmC,KAAKmS,QACxCnS,KAAKmmC,cAGTI,kBAAkBF,EAAalL,GAC7B,OAAO,EAGTqL,WACE,OAAOxmC,KAAK2K,MAAML,KAAK0K,OAAS,GAGlCmxB,eAIAM,gBAEE,OAAO,kDAGTC,UAAaC,GACX,OAAO3mC,KAAKmS,MAAMy0B,OAAOrL,KAAKoL,GAGhCpmB,SACE,MAAM,KAAEjW,GAAStK,KAAK2K,MAEtB,OACE,eAAC66B,GAAD,CACEl3B,GAAIhE,EAAKgE,GACTwF,OAAQxJ,EAAKwJ,OACbzB,KAAM/H,EAAK+H,MAAQG,GAAKgzB,KACxBxwB,MAAO1K,EAAK0K,MACZgwB,WAAY16B,EAAK06B,WACjBxlB,IAAKlV,EAAKkV,IACVukB,SAAUz5B,EAAKy5B,SACfkB,kBAAmB36B,EAAK26B,kBACxBQ,eAAgBzlC,KAAKylC,eATvB,SAWKzlC,KAAKymC,mB,yBCzMT,MAAMI,GACA,UADAA,GAEE,UAFFA,GAGI,UAHJA,GAID,UAJCA,GAKD,UALCA,GAMD,UANCA,GAOJ,UAKHC,GAAqC,CACzCC,SAAS,UACTC,cAAe,YACf7iB,MAAO0iB,IAGHI,GAAsC,CAC1CF,SAAS,UACTC,cAAe,YACf7iB,MAAO0iB,IAGHK,GAAqC,CACzCH,SAAS,OACTC,cAAe,YACf7iB,MAAO0iB,IAGHM,GAAgC,CACpCJ,SAAS,UACT5iB,MAAO0iB,IAGHO,GAAiC,CACrCL,SAAS,WACT5iB,MAAO0iB,IAGHQ,GAAgC,CACpCN,SAAS,OACT5iB,MAAO0iB,IAGHS,GAAqC,CACzCP,SAAS,WACTQ,WAAY,IACZpjB,MAAO0iB,IAGHW,GAAsC,CAC1CT,SAAS,WACT5iB,MAAO0iB,IAGHY,GAAwC,CAC5CV,SAAS,SACT5iB,MAAO0iB,GACPG,cAAe,aAGXU,GAA4C,IAAID,GAAwBF,WAAY,QAOpFI,GAAwC,CAC5CZ,SAAS,UACT5iB,MAAO0iB,IAGHe,GAAyC,CAC7Cb,SAAS,WACT5iB,MAAO0iB,IAQIgB,GAAa,CACxB/jB,MAAO,CACLgkB,MAAOhB,GACPiB,OAAQd,GACRe,MAAOd,IAETe,KAAM,CACJH,MAAOX,GACPY,OAAQX,GACRc,WAAYZ,GACZU,MAAOX,IAETc,MAAO,CACLJ,OAAQP,IAEVxyB,MAAO,CACLozB,SAAUX,GACVY,YAAaX,IAEfY,SAAU,CACRF,SAxC6C,CAC/CrB,SAAS,SACT5iB,MAAO0iB,GACPG,cAAe,cAuCf3nB,KAAM,CACJyoB,MA5BwB,IAAIF,GAAyBW,mBAAoB,aA6BzER,OA5ByB,IAAIH,GAAyBW,mBAAoB,cA8B5EC,SAAU,CACRV,MAAOH,GACPI,OAAQH,KClGCa,GAAUt2B,IACrB,MAAM,UACJC,EADI,KAEJnE,EAFI,QAGJy6B,EAHI,YAIJC,EAJI,MAKJr2B,EALI,MAMJjJ,EANI,SAOJ8c,GACEhU,EACEy2B,EAAc7mB,IAAM5X,aAAY,IAAMgc,EAAS,KAAK,CAACA,IAE3D,OACE,2BAAS/T,UAAW0M,GAAQ2B,KAAOooB,QAASz2B,GAAYE,MAAOA,EAA/D,UACE,yBAAOw2B,QAAS76B,EAAO,SAAUmE,UAAWqO,KAAOqD,MAAOxR,MAAO,CAAEy2B,IAAKL,GAAxE,UACE,oBAAGt2B,UAAU,eAAe,cAAY,SACxC,uBAAMA,UAAU,UAAhB,SAA2B3M,EAAE,gCAE/B,wBACE6I,GAAIL,EAAO,SACXA,KAAMA,EACNmE,UAAW0M,GAAQ,eAAgB2B,KAAOjC,OAC1CmqB,YAAaA,GAAe,SAC5BK,aAAa,MACbC,WAAW,QACXC,YAAY,MACZC,SAAU,EACV9/B,MAAOA,EACP8c,SAAU/lB,GAAK+lB,EAAS/lB,EAAEkiB,cAAcjZ,SAEzCA,GACC,eAACwzB,GAAA,EAAD,CACEC,QAAS,OACT5d,QAAS0pB,EACTx2B,UAAW0M,GAAQ,OAAQtM,GAAK42B,YAAa3oB,KAAO4oB,OACpD/2B,MAAOu1B,GAAWI,KAAKD,MACvB,cAAY,OALd,SAOE,uBAAM51B,UAAU,UAAhB,SAA2B3M,EAAE,kC,cCtChC,SAAS6jC,GACdv/B,EACAw/B,EACAC,GAEA,MAAMC,EAAiBx/B,kBAAO,GAE9Bob,qBAAU,KACR,IAAIokB,EAAev/B,QAEZ,CACL,MAAMw/B,EAAU9nC,WAAWmI,EAAUw/B,GACrC,MAAO,IAAMI,aAAaD,GAH1BD,EAAev/B,SAAU,IAK1Bs/B,GCdL,MAAMI,GAAgB,CAAKppB,EAASvV,IAAiCA,EAqB9D,SAAS4+B,GAAqB13B,GACnC,MAAM,GACJ7D,EADI,OAEJwF,EAFI,KAGJzB,EAHI,MAIJ2C,EAJI,IAKJwK,EALI,KAMJxc,EANI,QAOJsjB,EAPI,MAQJ9E,EARI,MASJ7W,EATI,WAUJm/B,EAAa,GAVT,YAWJC,EAXI,OAYJviB,EAASoiB,GAZL,SAaJlnB,EAAW,GAbP,aAcJsnB,EAdI,aAeJC,EAfI,OAgBJC,EAhBI,iBAiBJC,GACEh4B,GAGE,OAAE6M,EAAF,UAAUorB,EAAV,cAAqB5jB,EAArB,WAAoCD,EAApC,QAAgDE,GAAY9b,GAC3D0/B,EAAaC,GAAkB/gC,mBAASyV,GAkB/CsqB,IACE,IAAMS,EAAY,CAAE/qB,OAAQqrB,EAAaD,UAAW,KACpD,IACA,CAACC,IAGH,MAAME,EAAeL,GACnB,uBAAK53B,MAAO,CAAEgzB,QAAS,OAAQkF,WAAY,UAA3C,UACE,eAAC/B,GAAD,CAAQx6B,KAAK,SAAS5E,MAAOghC,EAAalkB,SAAUmkB,IACnDH,EACD,sBAAK73B,MAAO,CAAE8R,SAAU,KACvB6lB,GACC,eAACpN,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAAS+qB,EAAnC,SACGxkC,EAAE,yBAMX,OACE,eAAC+/B,GAAD,CAAMl3B,GAAIA,EAAIwF,OAAQA,EAAQzB,KAAMA,EAAM2C,MAAOA,EAAOwK,IAAKA,EAA7D,SACE,gBAACirB,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,OAASjqB,UAAU,mBAA7C,UACE,eAACq4B,GAAA,EAAKvO,OAAN,UACGqO,IAEH,eAACE,GAAA,EAAK7N,KAAN,CAAWxqB,UAAU,mBAArB,SACGoP,GACC,eAAC8F,GAAD,CACEC,eAAgB/F,EAAM9gB,KACtB4lB,QAASA,EACTkB,OAAQA,EACR7c,MAAOm/B,EACPpiB,YAAasiB,EACbriB,cAjDerd,IACzBy/B,EAAY,CAAEK,UAAW9/B,KAiDfsd,cA9Cc,CAACrD,EAAgBmmB,KACzCX,EAAY,CAAExjB,WAAYhC,EAAQiC,cAAekkB,KA8CvChmB,SA3CS,CAACH,EAAgBlb,KACpC,MAAMshC,EAAalkB,EAAQzH,QAAOjW,GAAKA,EAAEwb,SAAWA,IACtC,OAAVlb,GACFshC,EAAW/4B,KAAK,CAAE2S,SAAQlb,UAE5B0gC,EAAY,CAAEtjB,QAASkkB,KAuCbnkB,cAAeA,EACfD,WAAYA,EACZE,QAASA,EACTnc,KAAM8/B,EACN1nB,SAAUA,EACVD,WAAYjB,EAAMwC,MAClBhhB,KAAMA,WCzHpB,MAAM4nC,GAAe7oB,IAAM8oB,cAA2B,CAAEtP,KAAM,IAAU7P,QAAQW,WAEzE,SAASye,KACd,OAAOC,qBAAWH,IAGb,MAAMI,GAAuBJ,GAAaK,SCa1C,IAAKC,GAsBZ,SAASC,GAAc5mB,EAAgB6d,GACrC,GAAe,SAAX7d,EACF,OAAQ6d,GACN,QACA,KAAK8I,GAAuBE,eAC1B,MAAO,WACT,KAAKF,GAAuBt4B,QAC1B,MAAO,UACT,KAAKs4B,GAAuBv4B,SAC1B,MAAO,WAIb,OAAO4R,G,SAnCG2mB,K,uBAAAA,E,oBAAAA,E,mBAAAA,Q,KAsCZ,MACM1jB,GAAUhH,GAA0BA,EAAKzS,IAE/BoE,WACd,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,IAAoBtmB,GAAQrN,EAC5By0B,EAASkE,MACRQ,EAAWC,GAAmB7gC,EAAa,qBAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,EAAjC,KAAgD4b,GAASkJ,GAExD9pB,EAAOgqB,GAAYjiC,qBAEpB3F,EAAO0gC,GAAI1gC,KACX6nC,EAAU3hC,GAAW,KACzBg8B,EAAQA,QAAQxB,GAAI5R,qBAzCxB,SAAkB0P,GAChB,OAAQA,GACN,QACA,KAAK8I,GAAuBE,eAC1B,MAAO,CAAE7gC,KAAM,CAAE,IAAO,CAACkI,GAAmBI,SAAUJ,GAAmBK,QAC3E,KAAKo4B,GAAuBt4B,QAC1B,MAAO,CAAErI,KAAMkI,GAAmBG,SACpC,KAAKs4B,GAAuBv4B,SAC1B,MAAO,CAAEpI,KAAMkI,GAAmBE,WAkClC+4B,CAAStJ,GACTpjB,EAfW,GAgBXorB,EAhBW,GAkBX,CAAC,CAACe,GAAc5kB,EAAY6b,GAAO5b,KAClCtjB,EAAO,mBACP2nB,KAAK2gB,MAEVnmB,oBAAUomB,EAAS,CAACrJ,EAAMpjB,EAAQorB,EAAW7jB,EAAYC,IAEzD,MAIMF,EAAU2B,mBAAQ,KACtB,MAAM0jB,EAAsBC,UAC1B,MAAMC,QAAkBjF,EAAOrL,MAAcppB,GAC3C,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,sCACT6lB,QAAS7lB,EAAE,wCACX82B,QAAS92B,EAAE,sBACX+2B,YAAY,SACZC,WAAYh3B,EAAE,yBACdi3B,WAAYj3B,EAAE,4BACV0M,MAGH05B,UAGCvH,GAAI7R,qBAAqBjS,EAAKzS,KACpC09B,MAGF,IAAInlB,EAA2C,GAC/C,OAAQ8b,GACN,KAAK8I,GAAuBE,eAC1B9kB,EAAU,CACR,IAAIvF,GAAqB,OAAQ,kBAAkBP,GAAQ,kCAASA,EAAKvM,UAAYuM,EAAKsrB,OAAS,MAAc,CAAC/rB,WAAW,EAAMH,UAAU,IAC7I,IAAImB,GAAqB,OAAQ,WAAWP,GAAQ,uBAAMlO,MAAO,CAACi1B,WAAY,KAA1B,UAAkC/mB,EAAKtM,SAAW,IAAM,KAAOsM,EAAKrM,MAAQ,OAAa,CAAC4L,WAAW,EAAMH,UAAU,IACzK,IAAIe,GAAuB,OAAQ,cAAe,CAAErhB,MAAO,OAE7D,MACF,KAAK4rC,GAAuBt4B,QAC1B0T,EAAU,CACR,IAAIvF,GAAqB,OAAQ,sBAAsBP,GAAQ,kCAASA,EAAKxM,SAAWwM,EAAKsrB,OAAS,MAAc,CAAC/rB,WAAW,IAChI,IAAIY,GAAuB,OAAQ,cAAe,CAAErhB,MAAO,OAE7D,MACF,KAAK4rC,GAAuBv4B,SAC1B2T,EAAU,CACR,IAAIvF,GAAqB,OAAQ,WAAWP,GAAQ,kCAASA,EAAKzM,UAAY,MAAc,CAACgM,WAAW,IACxG,IAAIY,GAAuB,OAAQ,cAAe,CAAErhB,MAAO,OAajE,OARIsE,EAAKoL,WACPsX,EAAQ1U,KACN,IAAI2P,GAAmB,UAAW,UAAUf,GAAQ,CAClD,CAAEnO,KAAMG,GAAKu5B,KAAMzhC,KAAMoK,GAAOsC,mBAAoB2K,UAAWnB,EAAKzS,KACpE,CAAEsE,KAAMG,GAAK42B,YAAalqB,QAASysB,EAAqBr5B,MAAO4O,GAAoB8qB,UAClF,CAAE1sC,MAAO,OAGTgnB,IACN,CAACsgB,EAAQ6E,EAASrJ,EAAMx+B,IAmBrBumC,EACJ,gBAAC8B,GAAA,EAAD,WACE,eAACpP,GAAA,EAAD,CACEC,QAAQ,kBACRrZ,OAAQ2e,IAAS8I,GAAuBE,eACxClsB,QAjBiC,KACrCqsB,EAAgB,CAAEnJ,KAAM8I,GAAuBE,kBAa7C,SAKG3lC,EAAE,+CAEL,eAACo3B,GAAA,EAAD,CACEC,QAAQ,kBACRrZ,OAAQ2e,IAAS8I,GAAuBt4B,QACxCsM,QApBwB,KAC5BqsB,EAAgB,CAAEnJ,KAAM8I,GAAuBt4B,WAgB7C,SAKGnN,EAAE,yCAEL,eAACo3B,GAAA,EAAD,CACEC,QAAQ,kBACRrZ,OAAQ2e,IAAS8I,GAAuBv4B,SACxCuM,QAvByB,KAC7BqsB,EAAgB,CAAEnJ,KAAM8I,GAAuBv4B,YAmB7C,SAKGlN,EAAE,6CAKT,OACE,eAACokC,GAAD,CACEv7B,GAAIoG,GAAOsD,qBACX3F,KAAMG,GAAKU,QACX8B,MAAOvP,EAAE,+BACT+Z,IAAKA,EACLxc,KAAK,iBACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPvB,YAAawB,EACb/jB,OAAQA,GACRwiB,aAtDsBxpB,IACxB6qB,EAAQz5B,KAAM,sBAAqB4O,EAAKzS,QAsDtCk8B,aAlHqB,KACvBoB,EAAQz5B,KAAK,8BAkHXu4B,iBAAkBA,K,UCnLjB,SAAS+B,GACdpG,EACAx3B,GAEA,MAAOzK,EAAQsoC,GAAa5iC,mBAASwL,GAAmBq3B,SAClDX,EAAU,KACd3F,EAAQA,QAAQxB,GAAI/U,sBAAsBjhB,EAAI,CAACmG,GAA6BuF,SAAU/W,EAAS,eAC5F4nB,KAAKshB,IAGV,OADA9mB,oBAAUomB,EAAS,CAAC3F,EAASx3B,IACtB,CAACzK,EAAQ4nC,EAASU,GAuCpB,SAASE,GAA0BvG,GACxC,MAAOjiC,EAAQsoC,GAAa5iC,mBAA6Cof,GAAYyjB,SAC/E5C,EAAO1D,EAAU,CAACA,GAAW,GAUnC,OATAzgB,qBAAU,KACJygB,EACFA,EAAQA,QAAQxB,GAAItV,mCAAoC9rB,EAAO,gBAC5D2nB,KAAKshB,GAER7H,GAAItV,mCACDnE,KAAKshB,KAET3C,GACI3lC,EAGF,SAASyoC,GAAYxG,EAAkBx3B,GAC5C,MAAOzK,EAAQsoC,GAAa5iC,qBACtBkiC,EAAU,KACTn9B,EAKLw3B,EAAQA,QAAQxB,GAAIlW,sBAAsB9f,GAAKrL,EAAS,aACrD4nB,KAAKshB,GALNA,OAAUxrC,IAQd,OADA0kB,oBAAUomB,EAAS,CAAC3F,EAASx3B,IACtB,CAACzK,EAAQ4nC,EAASU,GAyDpB,SAASI,GACdzG,EACAx3B,EACAqQ,EAAgC,CAACwe,GAAmBqP,iBAAkBrP,GAAmBsP,UAAWtP,GAAmBuP,iBACvHnjB,GAEA,MAAO1lB,EAAQsoC,GAAa5iC,qBAU5B,OADA8b,qBARgB,KACT/W,EAGHw3B,EAAQA,QAAQxB,GAAInR,UAAU7kB,EAAIqQ,EAAS4K,GAAQtmB,EAAS,WACzD4nB,MAAKvnB,GAAU6oC,EAAU,IAAInyB,GAAO1W,MAHvC6oC,OAAUxrC,KAMK,CAACmlC,EAASx3B,IACtBzK,EAgDF,SAAS8oC,GAAwB7G,EAAkB8G,GACxD,MAAO/oC,EAAQsoC,GAAa5iC,qBAU5B,OADA8b,qBARgB,KACTunB,EAIL9G,EAAQA,QAAQxB,GAAI/M,wBAAwBqV,GAAU1pC,EAAO,gBAC1D2nB,KAAKshB,GAJNA,OAAUxrC,KAMK,CAACmlC,EAAS8G,IACtB/oC,EAoCF,SAASgpC,GAAY/G,EAAmBx3B,EAAaqQ,GAC1D,MAAO9a,EAAQsoC,GAAa5iC,qBAU5B,OATA8b,qBAAU,KACH/W,EAKLw3B,EAAQA,QAAQxB,GAAIvT,YAAYziB,EAAIqQ,GAAU1b,EAAS,aACpD4nB,KAAKshB,GALNA,OAAUxrC,KAMX,CAACmlC,EAASx3B,EAAIqQ,IACV9a,EAGF,SAASipC,GAAehH,EAAmBx3B,EAAaqQ,GAC7D,MAAO9a,EAAQsoC,GAAa5iC,qBAU5B,OATA8b,qBAAU,KACH/W,EAKLw3B,EAAQA,QAAQxB,GAAIpK,eAAe5rB,EAAIqQ,GAAU1b,EAAS,gBACvD4nB,KAAKshB,GALNA,OAAUxrC,KAMX,CAACmlC,EAASx3B,EAAIqQ,IACV9a,EAGT,MAAMkpC,GAAgB,GAgDf,SAASC,GAA4BvzB,EAAyDD,GACnG,MAAOyzB,EAAmBC,GAAwB3jC,mBAAiB,GAUnE,OATA8b,qBAAU,KACF7L,EACF8qB,GAAIxV,wBAAwBrV,EAAUD,GAAQqR,KAAKqiB,GAEnDA,EAAqB,KAGzB,CAAC1zB,EAAQC,IAEJwzB,ECrVF,MAAME,GAA0Bh7B,IACrC,MAAM,mBAAEi7B,GAAuBj7B,EAE/B,OACE,qCACGi7B,EAAmBrwB,KAAI,CAAC1T,EAAO4B,IAC9B,kCACE,oBAAGmH,UAAW/I,EAAM0Q,UAAWzH,MAAO,CAAE6R,MAAO0iB,GAAiBwG,aAAa,KAAMxF,GAAWW,SAASV,SACvG,eAAClmB,GAAD,CAAUtP,MAAO,IAAIu1B,GAAWxoB,KAAKyoB,OAAuBx9B,KAAMjB,EAAMsR,UAAUrQ,KAAM1E,MAAOyD,EAAMsR,UAAU/U,MAA/G,SAAuHyD,EAAMtE,YAA3EsE,EAAMiF,IACxD,uBAAMgE,MAAO,CAAC4R,YAAa,aCRxBopB,GAAan7B,IACxB,MAAM,SAAEjT,GAAaiT,EAErB,OACE,iCACGjT,EAAS8V,MACR,uBAAM1C,MAAO,IAAIu1B,GAAWI,KAAKD,OAAjC,SAA0C9oC,EAAS8V,QAEnD,uBAAM1C,MAAO,IAAIu1B,GAAWI,KAAKD,MAAO7jB,MAAO0iB,IAA/C,SAAsEphC,EAAE,uBAE1E,wBACA,eAAC0nC,GAAD,CAAwBC,mBAAoBluC,EAASqjC,0B,cCZpD,MAAMgL,GAAgBp7B,IAC3B,MAAM,SAAEjT,GAAaiT,EAErB,OACE,uBAAKG,MAAO,CAACgzB,QAAS,OAAQC,cAAe,MAAOiI,eAAe,aAAchD,WAAW,YAA5F,UACE,uBAAMl4B,MAAO,IAAIu1B,GAAWI,KAAKD,OAAjC,SAA0C9F,GAAwBhjC,EAAS2e,YAAiB,wBAC3F3e,EAASmjC,UACR,eAACoL,GAAA,EAAD,CAAOn7B,MAAO,CAAC2R,WAAY,WAAY6Y,QAAS,YAAhD,SAA8D59B,EAASmjC,SAAW,MAAQ,SCN3F,SAASqL,KACd,MAAO,CACL,IAAI3sB,GAAqB,WAAYtb,EAAE,8BAA8BvG,GAC3D,eAACquC,GAAD,CAAcruC,SAAUA,KAC/B,CAAC0gB,UAAU,EAAMG,WAAW,IAC/B,IAAIE,GAAkB,KAAMxa,EAAE,gCAAgCvG,GACxDA,EAAS2e,WAAawf,GAAiBsQ,QAClCxL,GAASyL,sBAAsB1uC,EAAS4jC,SAXpB5jC,IACzBA,EAASkE,YAAclE,EAASwjC,UAAaxjC,EAASwjC,UAAYxjC,EAAS+jC,cAAgB/jC,EAAS0jC,aAAe,GAY9GiL,CAA0B3uC,IAElC,CAAC0gB,UAAU,IACd,IAAImB,GAAqB,QAAStb,EAAE,2BAA2BvG,GACrD,eAACouC,GAAD,CAAWpuC,SAAUA,KAC5B,CAAEI,MAAO,IAAKsgB,UAAU,IAC3B,IAAIK,GAAkB,SAAUxa,EAAE,4BAA4BvG,GAAYuG,EAAE,mBAAqBvG,EAASgH,UAC1G,IAAI+Z,GAAkB,WAAYxa,EAAE,8BAA8BvG,GAAYA,EAASujC,SAASqL,OAAO,sBACvG,IAAI7tB,GAAkB,QAASxa,EAAE,2BAA2BvG,GAAYA,EAASgvB,SAASruB,OAAOkF,YAAY,CAAE8a,MAAOH,GAAY+B,MAAO7B,UAAU,EAAOtgB,MAAO,OAI9J,MAAMkoB,GAAUtoB,GAAuBA,EAASoP,GCL1Cy/B,GAAuD,CAClE5hB,OAAQ,GACR6hB,aAAa,EAEb5D,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,IASf3U,WACd,MAAM,GAAE7D,EAAF,QAAM+8B,EAAN,QAAevF,EAAf,IAAwBtmB,GAAQrN,EAChCm5B,EAAYzhC,aAAgDc,GAASA,EAAMC,WAAWxH,aAEtFkjB,EAAU2B,kBAAQylB,GAAY,KAE7BtqC,EAAY6qC,GAAqB/B,GAAsBpG,EAASx3B,GACjE6M,EAAOkxB,GAA0BvG,IAChCoI,GLEF,SACLpI,EACAlZ,EACA+B,GAEA,MAAO9qB,EAAQsoC,GAAa5iC,mBAAsB,IAC5CkiC,EAAU,KACd3F,EAAQA,QACNxB,GAAI5V,uBAAuB9B,EAAc+B,GACzCzrB,EAAO,aAEN2nB,KAAKshB,IAGV,OADA9mB,oBAAUomB,EAAS,CAAC3F,EAASlZ,EAAc+B,IACpC,CAAC9qB,EAAQ4nC,EAASU,GKhBDgC,CAAuBrI,EAASx3B,EAAIlL,EAAWqL,SACjE2/B,EAAYnmB,mBAChB,IAAMimB,EAAcnxB,KAAI7d,GAAYijC,GAASrmB,SAAS5c,EAAUic,MAChE,CAAC+yB,EAAe/yB,IAWZtQ,EAAWnB,cACXqgC,EAAep/B,IACnBE,EAASR,EAAuB,aAAcM,KAoB1C/G,EAAO0gC,GAAI1gC,KACXsmC,EAAS,qCACb,uBAAK53B,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,MAAOiF,WAAY,YAAjE,UACA,oBAAGl4B,MAAO,CAAE+7B,KAAM,EAAGpqB,WAAY,MAAOC,YAAa,MAAOmY,UAAW,SAAvE,SACGj5B,EAAWgL,cAEbxK,EAAKoL,WACJ,uBAAKsD,MAAO,CAAE+7B,KAAM,GAApB,UACE,oBACEnvB,QAnCkB,KACxBmsB,EAAQz5B,KAAM,gBAAetD,WAmCvB8D,UAAU,oBACVE,MAAO,CAAEuP,OAAQ,UAAWwrB,aAAc,MAE5C,eAACxQ,GAAA,EAAD,CAAQ3d,QAjBc,KAC1BmsB,EAAQz5B,KAAM,0BAAyBxO,EAAW8R,cAgB9C,SAAuCzP,EAAE,+BAI5C7B,EAAKoL,WAAa5L,EAAWqL,SAC5B,gBAAC6/B,GAAA,EAAD,CAAOxR,QAAQ,SAAf,UACGr3B,EAAE,6BADL,IACmC,eAACwZ,GAAD,CAAYC,QApCtB0sB,gBACrB9F,EAAQG,OAAOsI,GAAI5e,kBAAkBrhB,GAAKrL,EAAS,eACzDgrC,KAkCqC,SAA4CxoC,EAAE,iCAM/E,OAAE0mB,EAAF,UAAUie,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkB8kB,EACnDkD,EAAoBJ,EACvBpvB,QAAO9f,GAAYA,EAASwkC,mBAAmBvX,KAC5CsiB,EAAgBD,EACnBE,MA3EY,GA2ENtE,EA3EM,IA2EiBA,EAAY,IAE5C,OACE,eAAC5E,GAAD,CACEl3B,GAAIoG,GAAOmE,eACX/E,OAAQxF,EACR+D,KAAMG,GAAK2C,IACXH,MAAO5R,EAAWkS,gBAClBkK,IAAKA,GAAO9K,GAAOgD,gBALrB,SAOE,sBAAKpF,MAAO,CAAE+pB,UAAW,OAAzB,SACE,gBAACoO,GAAA,EAAD,WACE,eAACA,GAAA,EAAKvO,OAAN,UACGgO,IAEH,eAAC3hB,GAAD,CACEhB,eAAgBknB,EAChBnoB,QAASA,EACTkB,OAAQA,GACRgB,eAAe,cACfd,YA/EqBxoB,IAC7BmsC,EAAQz5B,KAAM,cAAa1S,EAASoP,aA+E5BqZ,cA9DiBrd,IACzBy/B,EAAY,CAAEK,UAAW9/B,KA8DjBsd,cA3DgB,CAACrD,EAAgBmmB,KACzCX,EAAY,CAAExjB,WAAYhC,EAAQiC,cAAekkB,KA2DzCnkB,WAAYA,EACZC,cAAeA,EACflc,KAAM8/B,EACN1nB,SArGK,GAsGLD,WAAY+rB,EAAkB3uC,OAC9BmD,KAAK,qBC1HjB,MAAM2rC,GAAgC,CACpCC,eAAgB,CACdre,KAAM,GACNse,OAAQ,GACRhrC,YAAQlD,EACRmuC,IAAK,cAEP1rC,WAAY2qC,GACZgB,YAAa,CACX/vB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7BL,QAAS,GACTunB,aAAa,GAEfgB,QAAS,CACPhwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,SACZC,cAAenC,GAAcyC,GAC7BL,QAAS,GACT9Y,QAASjB,EAAQG,UAEnBoyB,UAAW,CACTjgB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,SACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEXwoB,cAAe,CACbjwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,uBACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEXyoB,iBAAkB,CAChBlwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7Bsb,KAAM8I,GAAuBE,eAC7B3kB,QAAS,IAEXsb,OAAQ,CACN/iB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BqoB,aAAcr/B,GAAiBM,IAC/BqW,QAAS,IAEX9iB,QAAS,CACPqb,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,SACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEXqY,SAAU,CACR9f,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEX2oB,MAAO,CACLpwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,UACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEX4oB,eAAgB,CACdrwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEX6oB,oBAAqB,CACnBtwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEX8oB,cAAe,CACbvwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEXgpB,sBAAuB,CACrBzwB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEXipB,gBAAiB,CACf1wB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEXkpB,mBAAoB,CAClB3wB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEXmpB,mBAAoB,CAClB5wB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEXopB,uBAAwB,CACtB7wB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEXqpB,sBAAuB,CACrB9wB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEXspB,0BAA2B,CACzB/wB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEXupB,wBAAyB,CACvBhxB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEXwpB,sBAAuB,CACrBjxB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEXypB,0BAA2B,CACzBlxB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,QACZC,cAAenC,GAAcyC,GAC7B0oB,UAAW,KACX/oB,QAAS,IAEX0pB,aAAc,CACZC,YAAa,QACbC,WAAY,GACZC,cAAe,GACftxB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEX8pB,aAAc,CACZvxB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,IAEX+pB,kBAAmB,CACjBxxB,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,OACZC,cAAenC,GAAcyC,GAC7BL,QAAS,KAeb,MAAMgqB,GAAkB,CACtBC,UAAW,GACXC,UAAW,GACXC,aAAc,GACdC,aAAc,GACdC,WAAY,GACZC,WAAY,GACZC,aAAc,GACdC,aAAc,GACdC,gBAAiB,IAgFJC,OATKC,YAAgB,CAChCC,uBA7SJ,SAAgC1mC,EAAgC0W,GAC5D,OAAQA,EAAO9W,OACNH,EAAcknC,uBACR30B,OAAOC,OAAO,GAAIjS,EAAO,CAAC4mC,MAAOlwB,EAAO5W,QAAQ8mC,QAEhD5mC,GAAS,CAAC4mC,QAAS/sC,aAAaC,QAAQ,wBAA0B,MAySjFmG,WA7FJ,SAAoBD,EAAmB0W,GACrC,GAAQA,EAAO9W,OACRH,EAAcI,iBAAnB,CACE,MAAMS,EAAQoW,EAAO5W,QAAQH,KACvBjB,EAAQsT,OAAOC,OAAO,GAAIjS,EAAMM,GAAQoW,EAAO5W,QAAQpB,OAC7D,OAAOsT,OAAOC,OAAO,GAAIjS,EAAO,CAAE,CAAC0W,EAAO5W,QAAQH,MAAOjB,IAEzD,OAAOsB,GAASgkC,IAuFlBzjC,UAvEJ,SAAmBP,EAAiB0W,GAClC,GAAQA,EAAO9W,OACRH,EAAcgB,eAAnB,CACE,MAAM/B,EAAQgY,EAAO5W,QAAQpB,MAC7B,OAAOsT,OAAOC,OAAO,GAAIjS,EAAO,CAAE,CAAC0W,EAAO5W,QAAQH,MAAOjB,IAEzD,OAAOsB,GAAS8lC,IAkElBe,oBA9DJ,SAA6B7mC,EAA2B0W,GACtD,OAAQA,EAAO9W,MACb,KAAKH,EAAckB,mBAEjB,OADA9G,aAAac,QAAQ,sBAAuB0kB,KAAKQ,UAAUnJ,EAAO5W,UAC3D,CAAEP,QAASmX,EAAO5W,SAC3B,KAAKL,EAAcqnC,oBAAqB,CACtC,IAAK9mC,EAAMT,QACT,OAAOS,EAET,MAAMtB,EAAQsT,OAAOC,OAAO,GAAIjS,EAAMT,QAASmX,EAAO5W,SAEtD,OADAjG,aAAac,QAAQ,sBAAuB0kB,KAAKQ,UAAUnhB,IACpD,CAAEa,QAASb,GAEpB,KAAKe,EAAcqB,kCAAmC,CACpD,IAAKd,EAAMT,QACT,OAAOS,EAET,MAAMG,EAAU,CAAE4mC,cAAe,IAAI/mC,EAAMT,QAAQwnC,cAAerwB,EAAO5W,UACnEpB,EAAQsT,OAAOC,OAAO,GAAIjS,EAAMT,QAASY,GAE/C,OADAtG,aAAac,QAAQ,sBAAuB0kB,KAAKQ,UAAUnhB,IACpD,CAAEa,QAASb,GAEpB,KAAKe,EAAcuB,iBAEjB,OADAnH,aAAa6lB,WAAW,uBACjB,CAAEngB,aAASvJ,GACpB,QACE,MAAMgxC,EAASntC,aAAaC,QAAQ,uBACpC,OAAOkG,GAAUgnC,GAAU,CAAEznC,QAAS8f,KAAKC,MAAM0nB,KAAc,KAoCjEpyB,gBAhCJ,SAAyB5U,EAAwB0W,GAC/C,OAAQA,EAAO9W,OACRH,EAAcg7B,cACV/jB,EAAO5W,QAEPE,GAAS,CAAEqK,MAAO,GAAIkwB,UAAW,GAAI7yB,KAAMG,GAAKgzB,KAAMoM,OAAQ/N,GAAWgO,QAAS1M,YAAa,KA4BxGO,gBAxBJ,SAAyB/6B,EAAyB0W,GAChD,OAAQA,EAAO9W,OACRH,EAAcyB,mBACVwV,EAAO5W,QAEPE,GAAS,IAoBlBmnC,iBAhBJ,SAA0BnnC,EAA0B0W,GAClD,OAAQA,EAAO9W,OACRH,EAAc2nC,uBACVp1B,OAAOC,OAAO,GAAIjS,EAAO0W,EAAO5W,QAAQK,SAExCH,GAAS,MCxSFqnC,QACW,cAA7B3yC,OAAO2pB,SAASipB,UAEe,UAA7B5yC,OAAO2pB,SAASipB,UAEhB5yC,OAAO2pB,SAASipB,SAASC,MACvB,2D,sDCHN,MAAMC,GAAQhgC,IACZ,MAAM,KAAEE,EAAF,MAAQ2C,EAAR,GAAeyK,GAAOtN,EAC5B,OACE,eAACigC,GAAA,EAAD,CAAKC,GAAI,EAAGC,GAAI,EAAGlgC,UAAWqO,KAAO8xB,KAArC,SACE,gBAAC,KAAD,CAAMngC,UAAWqO,KAAO+xB,UAAW/yB,GAAIA,EAAvC,UACE,oBAAGrN,UAAWC,IACd,wBACC2C,QA8BMy9B,OAxBGtgC,IAChB,MAAM,QAAEk5B,GAAYl5B,EAIpB,OAFA4yB,GAAcrwB,GAAO+C,UAAM9W,EAAW6R,GAAKiF,KAAMhS,EAAE,aAAcA,EAAE,cAE9D8oC,GAAIriB,aAMP,+BACE,sBAAK9Z,UAAU,YAAf,SACE,gBAACsgC,GAAA,EAAD,CAAKpgC,MAAO,CAAC+pB,UAAW,IAAxB,UACE,eAAC8V,GAAD,CAAMn9B,MAAOvP,EAAE,iBAAkB4M,KAAMG,GAAKmgC,MAAOlzB,GAAG,gCACtD,eAAC0yB,GAAD,CAAMn9B,MAAOvP,EAAE,gBAAiB4M,KAAMG,GAAKmgC,MAAOlzB,GAAG,aACrD,eAAC0yB,GAAD,CAAMn9B,MAAOvP,EAAE,yBAA0B4M,KAAMG,GAAKU,QAASuM,GAAG,uBAChE,eAAC0yB,GAAD,CAAMn9B,MAAOvP,EAAE,eAAgB4M,KAAMG,GAAKyH,UAAWwF,GAAG,YACxD,eAAC0yB,GAAD,CAAMn9B,MAAOvP,EAAE,kBAAmB4M,KAAMG,GAAK8H,SAAUmF,GAAG,uBAZhEpgB,OAAOuC,YAAW,IAAMypC,EAAQz5B,KAAK,YAC9B,2B,UCjCX,IAAItD,GAAK,EAEF,SAASskC,GAAaC,GAC3B,MAAQC,GAAcvpC,oBAAS,IAI1B,SAA2BspC,GAChC,OAAOA,KAAYvkC,GALkBykC,CAAkBF,KACvD,OAAOC,ECCF,MAAME,GAAmB7gC,IAC9B,MAAM,MAAErJ,EAAF,MAASwJ,GAAUH,EACzB,OACE,sBAAKC,UAAU,mBAAmBE,MAAO,IAAIA,EAAOgzB,QAAS,WAA7D,SACGx8B,KCSMmqC,GAAiB9gC,IAC5B,MAAM,KACJlE,EADI,MAEJ6V,EAFI,MAGJza,EAHI,MAIJP,EAJI,UAKJoqC,EALI,UAMJC,EANI,YAOJxK,EAPI,KAQJpvB,EARI,KASJhP,EAAO,OATH,SAWJ4b,EAXI,eAYJitB,GACEjhC,EAEEkhC,EAAiBD,GAAc,CAAMhzC,IAC3B,UAAVA,EAAEsF,KACJ0tC,MAEE9kC,EAAKskC,GAAa,SAClBU,EAAaJ,EAAY,yBAA4BpqC,EAAQ,0BAA6BqqC,EAAY,wBAA0B,eACtI,OACE,gBAACltB,GAAA,EAAKstB,MAAN,CAAYC,UAAWllC,EAAvB,UACE,eAAC2X,GAAA,EAAKwtB,MAAN,UAAa3vB,IACb,eAACmC,GAAA,EAAKytB,QAAN,CACEzlC,KAAMA,EACNmE,UAAWkhC,EACX/oC,KAAMA,EACNlB,MAAOA,EACP8c,SAAU/lB,GAAK+lB,EAAS/lB,EAAEkiB,cAAcjZ,OACxCsqC,WAAYN,EACZ1K,YAAaA,IAEd7/B,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,IACjCyQ,GAAQ,wBAAOnH,UAAU,uBAAjB,SAAyCmH,QC7CxCpH,WACd,MAAM,QAAE2zB,EAAF,QAAW8N,EAAX,QAAoBvI,GAAYl5B,GAE/B5D,EAAUslC,GAAetqC,mBAAS,KAClC0jB,EAAU6mB,GAAevqC,mBAAS,KAClCT,EAAOU,GAAYD,mBAAS,IACnCw7B,GAAcrwB,GAAO6D,WAAO5X,EAAW6R,GAAKgzB,KAAM,QAAS,SAE3D,MAAMuO,EAAqBnI,UACzB,IACE,MAAMoI,QAAkBlO,EAAQ8N,QAC9BrF,GAAIvhB,MAAMze,EAAU0e,GACpB,oBACA,IAEFshB,GAAIjkB,UAAU0pB,GACdxqC,EAAS,IACT6hC,EAAQz5B,KAAK,KACb,MAAO9I,GACY,IAAfA,EAAMuiB,KACR7hB,EAAS/D,EAAE,4BACW,IAAfqD,EAAMuiB,MACb7hB,EAAS/D,EAAE,qCAIjB,OACE,eAACwuC,GAAA,EAAD,UACE,eAACvB,GAAA,EAAD,CAAKtgC,UAAU,yBAAf,SACE,eAACq4B,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,IAAK/8B,MAAO,KAAtC,SACE,gBAACmrC,GAAA,EAAK7N,KAAN,CAAWtqB,MAAO,CAAE4hC,QAAS,QAA7B,UACE,qBAAI5hC,MAAO,CAAEsU,UAAW,SAAUmgB,SAAU,KAAMQ,WAAY,QAA9D,SAAyE9hC,EAAE,sBAC3E,wBACA,oBAAG6M,MAAO,CAAEsU,UAAW,UAAvB,SAAoCnhB,EAAE,wBACtC,gBAACwgB,GAAA,EAAD,WACE,eAACgtB,GAAD,CACEhlC,KAAK,WACL6V,MAAOre,EAAE,uBACT4D,MAAOkF,EACP4X,SAAU0tB,EACVlL,YAAaljC,EAAE,yBAEjB,eAACwtC,GAAD,CACEhlC,KAAK,WACL6V,MAAOre,EAAE,uBACT4D,MAAO4jB,EACP9G,SAAU2tB,EACVnL,YAAaljC,EAAE,uBACf2tC,eAAgBW,EAChBxpC,KAAK,aAEP,oBAAG+H,MAAO,CAAEsU,UAAW,UAAvB,SAAmC,eAAC,KAAD,CAAMnH,GAAG,uBAAT,SAAiCha,EAAE,iCACrEqD,GAAS,eAACwlC,GAAA,EAAD,CAAOxR,QAAQ,SAAf,SAAyBh0B,IACnC,sBAAKwJ,MAAO,CAAEsU,UAAW,SAAUutB,WAAY,IAA/C,SACE,gBAACtX,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAAS60B,EAAnC,UACGtuC,EAAE,wBACFmuC,EAAQ/zC,OAAS,GAAK,yCAAY,eAAC0S,GAAD,eAIzC,kCC9DL,MAAM6hC,GAAajiC,IACxB,MAAM,MAAE2R,EAAF,QAAS6B,EAAT,MAAkBrT,EAAlB,SAAyB6T,GAAahU,EAE5C,OACE,sBAAKC,UAAU,aAAaE,MAAOA,EAAnC,SACE,yBAAOF,UAAU,mBAAjB,UACE,wBACEA,UAAU,mBACV7H,KAAK,WACLlB,MAAM,GACNsc,QAASA,EACTQ,SAAUA,IAEZ,uBAAM/T,UAAU,oBACf0R,QCJH0D,GAAUpkB,GAAmCA,EAAWkL,GAG9C6D,WACd,MAAM,QAAE2zB,EAAF,QAAWuF,GAAYl5B,EAEvBmU,EAA8C2B,mBAAQ,IAAM,CAChE,IAAItH,GAAuB,YAAalb,EAAE,gCAAiC,CAACnG,MAAO,MACnF,IAAIyhB,GAAqB,QAAStb,EAAE,6BAA8B4uC,GACzD,kCAASA,EAAmBr/B,YAEpC,KAEIs2B,EAAWC,GAAmB7gC,EAAa,gBAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,EAAjC,YAAgDwnB,GAAgB1C,GAC/D9pB,EAAOgqB,GAAYjiC,qBAE1B8b,qBAAU,KACRygB,EAAQA,QAAQxB,GAAI1U,wBAClB,GACA5Q,EAnBW,GAoBXorB,EApBW,GAsBX,CAAC,CAAC7jB,EAAYC,IACdwnB,GACC9qC,EAAO,eACT2nB,MAAKhnB,GAAU2nC,EAAS,CACvB9qC,KAAMmD,EAAOnD,KAAKqc,IAAIhI,GAAmB+G,UACzCkI,MAAOngB,EAAOmgB,YAEf,CAAC8hB,EAAS9mB,EAAQorB,EAAW7jB,EAAYC,EAAewnB,IAE3D,MAaMpqC,EAAO0gC,GAAI1gC,KACXsmC,EAAS,uCACZtmC,EAAKoL,WACJ,eAAC6tB,GAAA,EAAD,CAAQvqB,MAAO,CAAEgiC,MAAO,SAAWp1B,QAhBX,KAC1BmsB,EAAQz5B,KAAK,wBAeX,SACGnM,EAAE,2BAGP,eAACwgB,GAAA,EAAD,CAAM7T,UAAU,cAAhB,SACE,eAACgiC,GAAD,CACEtwB,MAAOre,EAAE,0BACTkgB,QAASqoB,EACT7nB,SApBwB/lB,IAC5B,IAAIulB,EAAUvlB,EAAEkiB,cAAcqD,QAC9B4lB,EAAgB,CAAEyC,YAAaroB,KAmB3BrT,MAAO,CAAE6hC,WAAY,QAAS9G,aAAc,cAKlD,OACE,eAACxD,GAAD,CACEv7B,GAAIoG,GAAOgD,gBACXrF,KAAMG,GAAK2C,IACXH,MAAOvP,EAAE,0BACTzC,KAAK,aACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPvB,YAAawB,EACb/jB,OAAQA,GACRwiB,aAhCsBxpB,IACxB6qB,EAAQz5B,KAAM,gBAAe4O,EAAKlS,OAgChC47B,OAAQA,KC1EP,MAAMqK,GAAcpiC,IACzB,MAAM,GACJ7D,EADI,MAEJgE,EAFI,MAGJwR,EAHI,aAIJ0wB,EAAe,EAJX,aAKJC,EALI,SAMJtzC,EANI,MAOJ2H,EAPI,KAQJyQ,GACEpH,EAEJ,OACE,uBAAKC,UAAU,iBAAiBE,MAAOA,EAAvC,UACE,yBAAOw2B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,UAAwE1wB,EAAxE,OACA,uBAAK1R,UAAY,UAASqiC,GAAiB,GAAKD,IAAhD,UACGrzC,EACA2H,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,IACjCyQ,GAAQ,wBAAOnH,UAAU,uBAAjB,SAAyCmH,WCV7Cm7B,GAAeviC,IAC1B,MAAM,aACJqiC,EAAe,EADX,aAEJC,EAFI,KAGJxmC,EAHI,MAIJ6V,EAJI,MAKJza,EALI,MAMJP,EANI,SAOJ6rC,EAPI,UAQJxB,EARI,aASJyB,EATI,MAUJtiC,EAVI,QAWJqM,EAAU,GAXN,eAYJk2B,EAZI,SAaJ1uB,GACEhU,EAEE7D,EAAKskC,GAAa,SAElBU,EAAaxqC,EAAQ,0BAA6BqqC,EAAY,wBAA0B,eACxF2B,EAAkB7sB,mBACtB,IAAM4sB,GAAkBl2B,EAAQ5B,KAAIqJ,GAClC,yBAA2B/c,MAAO+c,EAAO/c,MAAzC,SAAiD+c,EAAOpR,OAA3CoR,EAAO/c,UAClB,CAACsV,EAASk2B,IACVE,EAAe5qC,uBAAa/J,IAChC+lB,EAAS/lB,EAAEkiB,cAAcjZ,SACxB,CAAC8c,IAEJ,OACE,eAACouB,GAAD,CACEjmC,GAAIA,EACJkmC,aAAcA,EACdC,aAAcA,EACd3wB,MAAOA,EACPhb,MAAOA,EACPwJ,MAAOA,EANT,SAQE,yBACEhE,GAAIA,EACJL,KAAMA,EACNmE,UAAWkhC,EACXjqC,MAAOA,EACP+Z,SAAUuxB,EACVxuB,SAAU4uB,EACVziC,MAAOsiC,EAPT,SAQEE,OAkBKE,GAAmB7iC,IAC9B,MAAM,QACJwM,EAAU,GADN,eAEJk2B,EAFI,MAGJxrC,EAHI,SAIJsrC,EAJI,UAKJxB,EALI,SAMJhtB,EANI,MAOJ7T,GACEH,EAEE7D,EAAKskC,GAAa,SAClBU,EAAaH,EAAY,wBAA0B,eACnD2B,EAAkB7sB,mBACtB,IAAM4sB,GAAkBl2B,EAAQ5B,KAAIqJ,GAClC,yBAA2B/c,MAAO+c,EAAO/c,MAAzC,SAAiD+c,EAAOpR,OAA3CoR,EAAO/c,UAClB,CAACsV,EAASk2B,IACVE,EAAe5qC,uBAAa/J,IAChC+lB,EAAS/lB,EAAEkiB,cAAcjZ,SACxB,CAAC8c,IAEJ,OACE,yBACE7X,GAAIA,EACJ8D,UAAWkhC,EACXjqC,MAAOA,EACP+Z,SAAUuxB,EACVxuB,SAAU4uB,EACVziC,MAAOA,EANT,SAOEwiC,KC9FOG,GAAa9iC,IACxB,MAAM,KACJlE,EADI,MAEJ6V,EAFI,MAGJza,EAHI,MAIJP,EAJI,SAKJ6rC,EALI,UAMJzB,EANI,UAOJC,EAPI,YAQJxK,EAAc7kB,EARV,SASJqC,EATI,eAUJitB,EAVI,OAWJ8B,GACE/iC,EAEEkhC,EAAiBD,GAAc,CAAMhzC,IAC3B,UAAVA,EAAEsF,KACJ0tC,MAEE9kC,EAAKskC,GAAa,SAClBU,EAAaJ,EAAY,yBAA4BpqC,EAAQ,0BAA6BqqC,EAAY,wBAA0B,eACtI,OACE,eAACoB,GAAD,CAAYjmC,GAAIA,KAAQ6D,EAAxB,SACE,wBACE7D,GAAIA,EACJL,KAAMA,EACN1D,KAAK,OACLoqC,SAAUA,GAAYzB,EACtB9gC,UAAWkhC,EACXjqC,MAAOA,EACP8c,SAAU/lB,GAAK+lB,GAAYA,EAAS/lB,EAAEkiB,cAAcjZ,OACpDsqC,WAAYN,EACZ6B,OAAQA,EACRvM,YAAaA,OCpCRwM,GAAiBhjC,IAC5B,MAAM,aACJqiC,EAAe,EADX,aAEJC,EAFI,KAGJxmC,EAHI,MAIJ6V,EAJI,MAKJza,EALI,MAMJP,EANI,SAOJ6rC,EAPI,UAQJzB,EARI,UASJC,EATI,YAUJxK,EAAc7kB,EAVV,SAWJsxB,EAXI,KAYJC,EAZI,SAaJlvB,GACEhU,EAEE7D,EAAKskC,GAAa,SAClBU,EAAaJ,EACf,yBACCpqC,EAAQ,0BAA6BqqC,EAAY,wBAA0B,eAEhF,OAAIiC,EAEA,uBAAKhjC,UAAU,aAAf,UACE,yBAAO02B,QAASx6B,EAAhB,UAAqBwV,EAArB,OACA,2BACExV,GAAIA,EACJL,KAAMA,EACN0mC,SAAUA,GAAYzB,EACtB9gC,UAAWkhC,EACXjqC,MAAOA,EACP8c,SAAU/lB,GAAK+lB,GAAYA,EAAS/lB,EAAEkiB,cAAcjZ,OACpDs/B,YAAaA,EACb0M,KAAMA,IAEPvsC,GACC,sBACEsJ,UAAU,mBACVE,MAAO,CAACgzB,QAAS,WAFnB,SAIGx8B,OAQT,uBAAKsJ,UAAU,iBAAf,UACE,wBAAO02B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,uBAAK1R,UAAY,UAASqiC,GAAiB,GAAKD,IAAhD,UACE,2BACElmC,GAAIA,EACJL,KAAMA,EACN0mC,SAAUA,GAAYzB,EACtB9gC,UAAWkhC,EACXjqC,MAAOA,EACP8c,SAAU/lB,GAAK+lB,GAAYA,EAAS/lB,EAAEkiB,cAAcjZ,OACpDs/B,YAAaA,EACb0M,KAAMA,IAEPvsC,GAAS,sBAAKsJ,UAAU,mBAAmBE,MAAO,CAACgzB,QAAS,WAAnD,SAAgEx8B,WCvE3E,SAASwsC,GAAoBC,GAIlC,OAH+B,KAAdA,EAAKv6B,KAAc,OAASu6B,EAAKv6B,KAAKjW,WAAWywC,SAAS,EAAG,OAC7C,KAAfD,EAAKx6B,MAAe,KAAOw6B,EAAKx6B,MAAMhW,WAAWywC,SAAS,EAAG,OAClD,KAAbD,EAAKz6B,IAAa,KAAOy6B,EAAKz6B,IAAI/V,WAAWywC,SAAS,EAAG,MAGpE,SAASC,GAA2BF,GACzC,MAAMv6B,EAAOu6B,EAAKG,UAAU,EAAG,GACzB36B,EAAQw6B,EAAKG,UAAU,EAAG,GAC1B56B,EAAMy6B,EAAKG,UAAU,EAAG,GAC9B,MAAO,CACL16B,KAAe,SAATA,EAAkB,GAAKA,EAC7BD,MAAiB,OAAVA,EAAiB,GAAKA,EAC7BD,IAAa,OAARA,EAAe,GAAKA,GAItB,SAAS66B,GAAetsC,GAC7B,MAAM,IAAEyR,EAAF,MAAOC,EAAP,KAAcC,GAAS3R,EAC7B,IAAK,eAAeusC,KAAK96B,GACvB,OACF,IAAK,eAAe86B,KAAK76B,GACvB,OACF,IAAK,aAAa66B,KAAK56B,GACrB,OAEF,MAAM66B,EAAa,GAAE76B,KAAQD,EAAMy6B,SAAS,EAAG,QAAQ16B,EAAI06B,SAAS,EAAG,OAIvE,OADwBjwC,IAAOswC,GACVC,UAIdD,OAJP,EAOK,SAASE,GAAiB1sC,GAC/B,MAAMksC,EAAOhwC,IAAO8D,GACpB,MAAO,CACL2R,KAAMu6B,EAAKv6B,OAAOjW,WAClBgW,OAAQw6B,EAAKx6B,QAAU,GAAGhW,WAC1B+V,IAAKy6B,EAAKA,OAAOxwC,YAiBd,MAAMixC,GAAa7jC,IACxB,MAAM,KACJlE,EADI,aAEJumC,EAAe,EAFX,MAGJ1wB,EAHI,MAIJza,EAJI,MAKJP,EALI,SAMJ6rC,EANI,UAOJxB,EAPI,MAQJ7gC,EARI,SASJ6T,GACEhU,EAEE8jC,EAAWhsC,iBAAyB,MACpCisC,EAAUjsC,iBAAyB,MAEnCksC,EAAW9sC,IACf,MAAM+sC,EAAcC,OAAOhtC,GAC3B,OAAQq4B,MAAM0U,IA4CV9nC,EAAKskC,GAAa,aAClBU,EAAaxqC,EAAQ,0BAA6BqqC,EAAY,wBAA0B,eAC9F,OACE,uBAAK/gC,UAAU,iBAAiBE,MAAOA,EAAvC,UACE,yBAAOw2B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,UAAwE1wB,EAAxE,OACA,uBAAK1R,UAAY,WAAS,GAAKoiC,GAA/B,UACE,uBAAKliC,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,OAA9C,UACE,wBACEt3B,KAAMA,EAAO,KACbmE,UAAWkhC,EACXhhC,MAAO,CAAEhT,MAAO,GAAI4kB,YAAa,IACjC7a,MAAOA,EAAMyR,IACbqL,SArDgB/lB,IACxB,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MAC1B,GAAIitC,EAAEz2C,OAAS,EACb,OAEF,IAAKs2C,EAAQG,GACX,OAEF,MAAMC,EAAeN,EAAS/rC,QAC9Bic,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAEyR,IAAKw7B,KAExB,IAAbA,EAAEz2C,QAAgB02C,GACpBA,EAAaC,SA0CP7N,YAAY,KACZvlB,SAAUuxB,IAEZ,wBACE1mC,KAAMA,EAAO,KACbmE,UAAWkhC,EACXhhC,MAAO,CAAEhT,MAAO,GAAI4kB,YAAa,IACjC7a,MAAOA,EAAM0R,MACboL,SA/CkB/lB,IAC1B,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MAC1B,GAAIitC,EAAEz2C,OAAS,EACb,OAEF,IAAKs2C,EAAQG,GACX,OAEF,MAAMG,EAAcP,EAAQhsC,QAC5Bic,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAE0R,MAAOu7B,KAE1B,IAAbA,EAAEz2C,QAAgB42C,GACpBA,EAAYD,SAoCN7N,YAAY,KACZ7iB,IAAKmwB,EACL7yB,SAAUuxB,IAEZ,wBACE1mC,KAAMA,EAAO,KACbmE,UAAWkhC,EACXhhC,MAAO,CAAEhT,MAAO,IAChB+J,MAAOA,EAAM2R,KACbmL,SA1CiB/lB,IACzB,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MACtBitC,EAAEz2C,OAAS,GAGVs2C,EAAQG,IAGbnwB,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAE2R,KAAMs7B,MAmClC3N,YAAY,OACZ7iB,IAAKowB,EACL9yB,SAAUuxB,OAGb7rC,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,W,sBC3JnC,MAAM4tC,GAAcvkC,IACzB,MAAM,MACJ2R,EADI,UAEJ6yB,EAAY,EAFR,MAGJttC,EAHI,UAIJutC,EAAY,EAJR,QAKJj4B,EALI,SAMJwH,EANI,WAOJ0wB,GAAa,GACX1kC,EAEE2kC,EAAiB12C,IACjBA,EAAEkiB,cAAcqD,SAClBQ,EAAS/lB,EAAEkiB,cAAcjZ,QAGvB4E,EAAO2kC,GAAa,WACpBmE,EAAkBp4B,EAAQ5B,KAAIqJ,IAClC,MAAM4wB,EACJ,yBAAO5kC,UAAU,mBAAjB,UACE,wBACEA,UAAU,mBACV7H,KAAK,QACL0D,KAAMA,EACN5E,MAAO+c,EAAO/c,MACdsc,QAAStc,IAAU+c,EAAO/c,MAC1B8c,SAAU2wB,IAEZ,uBAAM1kC,UAAU,oBACfgU,EAAOpR,SAGZ,OAAI6hC,EAEA,eAACzE,GAAA,EAAD,CAAKC,GAAIuE,EAA+BxkC,UAAU,8BAAlD,SACG4kC,GADsB5wB,EAAO/c,OAMhC,sBAAwB+I,UAAU,8BAAlC,SACG4kC,GADO5wB,EAAO/c,UAOvB,OAAIwtC,EAEA,uBAAKzkC,UAAU,gBAAf,UACG0R,GAAS,eAACmzB,GAAA,EAAD,CAAW7kC,UAAY,UAASukC,IAAarkC,MAAO,CAAE6hC,WAAY,IAAlE,SAAyErwB,IAClFizB,KAKH,sBAAK3kC,UAAU,gBAAf,SACE,sBAAKA,UAAU,uBAAf,SACG2kC,OCtCJ,MAAMG,GAAqB/kC,IAChC,MAAM,MAAE9I,GAAU8I,GACXooB,EAAQ5O,GAAW2O,GAASnoB,GAC7BlE,EAlBR,SAAmBA,GACjB,IAAIkpC,EAAQlpC,EAAKib,QAAQ,KACzB,OAAIiuB,GAAS,EACJ,CACLje,UAAWjrB,EAAKynC,UAAU,EAAGyB,GAC7Bhe,SAAUlrB,EAAKynC,UAAUyB,EAAQ,IAG5B,CACLje,UAAW,GACXC,SAAUlrB,GAQDmpC,CAAU/tC,GAEjBguC,EAAgBpvB,mBAAQ,IAAM,CAClC,CAAE5e,MAAO0zB,GAAOuE,KAAMtsB,MAAOvP,EAAE,gBAC/B,CAAE4D,MAAO0zB,GAAOsE,OAAQrsB,MAAOvP,EAAE,kBACjC,CAAE4D,MAAO0zB,GAAOqE,UAAWpsB,MAAOvP,EAAE,uBACnC,IACG6xC,EAAqBrvB,mBAAQ,IAAM,CACvC,CAAE5e,MAAO,IAAK2L,MAAOvP,EAAE,oBACvB,CAAE4D,MAAO,IAAK2L,MAAOvP,EAAE,oBACtB,IACG8xC,EAAoBtvB,mBAAQ,IAAM,CACtC,CAAE5e,MAAO2zB,GAAW5vB,SAAU4H,MAAOvP,EAAE,wBACvC,CAAE4D,MAAO2zB,GAAWQ,SAAUxoB,MAAOvP,EAAE,0BACtC,IACG+xC,EAAoBvvB,mBAAQ,IAAM,CACtC,CAAE5e,MAAO,IAAK2L,MAAOvP,EAAE,QACvB,CAAE4D,MAAO,IAAK2L,MAAOvP,EAAE,SACtB,KAEIyzB,EAAWue,EAAcC,EAAgBC,GAC5CxuC,EAAkB8E,EAAKirB,YACpBC,EAAUye,EAAaC,EAAeC,GACzC3uC,EAAkB8E,EAAKkrB,WACpB0E,EAAQka,EAAWC,GACtB7uC,EAAkB4zB,GAAOqE,YACtB3C,EAAawZ,EAAgBC,GAChC/uC,GAAkB,IACfgvC,EAAcC,EAAeC,GAChClvC,GAAkB,IACf0R,EAAUy9B,EAAaC,EAAeC,GACzCrvC,EFhEmB,CAAS2R,IAAK,GAAIC,MAAO,GAAIC,KAAM,MEiEnDujB,EAAYka,EAAeC,GAC9BvvC,EAAkB6zB,GAAWQ,UAuF3Bmb,EAAsB,KAC1BhtB,OAAQhrB,IAGV,OACE,gBAAC,KAAD,CAAO46B,KAAMhB,EAAQiB,OAAQmd,EAA7B,UACE,eAAC1c,GAAD,UAAcx2B,EAAE,8BAChB,eAAC,KAAMm3B,KAAP,UACE,gBAAC3W,GAAA,EAAD,CAAM3T,MAAO,CAACy0B,SAAU,IAAxB,UACE,eAACkO,GAAD,CACEhnC,KAAK,aACL6V,MAAOre,EAAE,gCACT4D,MAAO6vB,EACPpwB,MAAO4uC,EACPvxB,SAAUsxB,IAEZ,eAACxC,GAAD,CACEhnC,KAAK,YACL6V,MAAOre,EAAE,+BACT4D,MAAO8vB,EACPrwB,MAAO+uC,EACP1xB,SAAUyxB,IAEZ,eAAC5B,GAAD,CACE/nC,KAAK,OACL5E,MAAOwR,EACPiJ,MAAOre,EAAE,eACT0gB,SAAUmyB,EACVxvC,MAAOyvC,IAET,eAAC7D,GAAD,CACEzmC,KAAK,SACL0Q,QAAS04B,EACTvzB,MAAOre,EAAE,iBACT4D,MAAOw0B,EACP1X,SAxHmB9c,IAC3B0uC,EAAU1uC,IAwHFP,MAAOkvC,IAET,eAACtB,GAAD,CACEG,YAAU,EACVl4B,QAAS24B,EACTjuC,MAAOo1B,EAAc,IAAM,IAC3BtY,SA3HwB9c,IAChC4uC,EAAyB,MAAV5uC,IA2HPP,MAAOovC,IAET,eAACxB,GAAD,CACEG,YAAU,EACVl4B,QAAS44B,EACTluC,MAAOk1B,EACPpY,SA9HuB9c,IAC/BovC,EAAcpvC,IA8HNP,MAAO4vC,IAERja,GACC,eAACiY,GAAD,CACEG,YAAU,EACVl4B,QAAS64B,EACTnuC,MAAO8uC,EAAe,IAAM,IAC5BhyB,SAlIqB9c,IAC/B+uC,EAAwB,MAAV/uC,IAkIJP,MAAOuvC,SAKf,gBAACtc,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASy5B,EAArC,SACGlzC,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAvFJ0sB,UAC1B,IACE,MAAMgN,EAlDyB,CAC/B1Z,QAAShG,EACTiG,WAAYhG,EACZ0f,SAAU,GACVxZ,wBAAyB,GACzBD,qBAAsB,GACtBvB,OAAQA,EACRib,YAAa,GACb1qC,YAAa,GACb6wB,UAAW,GACXJ,UAAW,GACXsB,oBAAqB,GACrBb,SAAU,IACVC,WAAY,IACZC,UAAW,IACXC,eAAgB,GAChBI,SAAU,EACVH,SAAU7kB,EAASC,IACnB6kB,WAAY9kB,EAASE,MACrB6kB,UAAW/kB,EAASG,KACpB8kB,eAAgB,GAChBC,YAAaxB,EACbyB,oBAAqB,OACrBC,aAAcxB,EACdyB,YAAaiY,EACbY,kBAAkB,GA0BZl1C,QAAe0qC,GAAIjb,eAAeslB,EAAU,UAClD,GAAsB,OAAlB/0C,EAAOqC,OACT,MAAOrC,EAET,MAAMP,QAAeirC,GAAItb,aAAa2lB,GACtCI,uBAAoBhuB,QAAQvlB,EAAE,oCAC9BkmB,EAAQroB,GAEV,MAAMO,GACAmC,EAAmBnC,GA9BEA,KAC3B,GAAsB,OAAlBA,EAAOqC,OACT,OAAO,EAET,MAAM2oC,EAAShrC,EAAOnD,MAAQ,GAC9Bi3C,EAAkB9I,EAAO3P,SACzB4Y,EAAiBjJ,EAAO1P,YACxBqZ,EAAiB3J,EAAOoK,YAwBpBC,CAAoBr1C,GAEpBm1C,uBAAoBlwC,MAAMrD,EAAE,sCAwE5B,SACGA,EAAE,gCC9NA0zC,GAAiD,CAC1D,CACI9tB,KAAM,KACNpd,KAAMxI,EAAE,mBAEZ,CACI4lB,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,kBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,uBAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,mCAEV,CACIod,KAAM,KACNpd,KAAM,oCAEV,CACIod,KAAM,KACNpd,KAAM,0BAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,iBAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,kCAEV,CACIod,KAAM,KACNpd,KAAM,qBAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,gBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,kBAEV,CACIod,KAAM,KACNpd,KAAM,4BAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,oBAEV,CACIod,KAAM,KACNpd,KAAM,2BAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,wCAEV,CACIod,KAAM,KACNpd,KAAM,gBAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,kBAEV,CACIod,KAAM,KACNpd,KAAM,oBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,sBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,qBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,gCAEV,CACIod,KAAM,KACNpd,KAAM,iBAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,iBAEV,CACIod,KAAM,KACNpd,KAAM,oBAEV,CACIod,KAAM,KACNpd,KAAM,+BAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,iBAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,qCAEV,CACIod,KAAM,KACNpd,KAAM,iCAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,6BAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,0CAEV,CACIod,KAAM,KACNpd,KAAM,sBAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,oCAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,iBAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,8CAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,oBAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,mCAEV,CACIod,KAAM,KACNpd,KAAM,wBAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,iBAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,kBAEV,CACIod,KAAM,KACNpd,KAAM,4BAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,mCAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,oBAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,sBAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,uBAEV,CACIod,KAAM,KACNpd,KAAM,gDAEV,CACIod,KAAM,KACNpd,KAAM,yBAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,8BAEV,CACIod,KAAM,KACNpd,KAAM,6BAEV,CACIod,KAAM,KACNpd,KAAM,oCAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,yBAEV,CACIod,KAAM,KACNpd,KAAM,gBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,gBAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,6BAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,mBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,gBAEV,CACIod,KAAM,KACNpd,KAAM,gDAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,0BAEV,CACIod,KAAM,KACNpd,KAAM,aAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,wBAEV,CACIod,KAAM,KACNpd,KAAM,6BAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,gCAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,eAEV,CACIod,KAAM,KACNpd,KAAM,QAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,uBAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,gBAEV,CACIod,KAAM,KACNpd,KAAM,4BAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,wBAEV,CACIod,KAAM,KACNpd,KAAM,kBAEV,CACIod,KAAM,KACNpd,KAAM,iBAEV,CACIod,KAAM,KACNpd,KAAM,wCAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,cAEV,CACIod,KAAM,KACNpd,KAAM,WAEV,CACIod,KAAM,KACNpd,KAAM,qCAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,2BAEV,CACIod,KAAM,KACNpd,KAAM,wBAEV,CACIod,KAAM,KACNpd,KAAM,qBAEV,CACIod,KAAM,KACNpd,KAAM,kBAEV,CACIod,KAAM,KACNpd,KAAM,SAEV,CACIod,KAAM,KACNpd,KAAM,UAEV,CACIod,KAAM,KACNpd,KAAM,YAEV,CACIod,KAAM,KACNpd,KAAM,qBAKDmrC,IADkBD,GAAap8B,KAAIs8B,GAAW,yBAA2BhwC,MAAOgwC,EAAQhuB,KAA1C,SAAiDguB,EAAQprC,MAA5CorC,EAAQhuB,QACzB8tB,GAAap8B,KAAIs8B,IAAO,CAAOhwC,MAAOgwC,EAAQhuB,KAAMrW,MAAOqkC,EAAQprC,UCx+B7GqrC,GAAmBnnC,IAC9B,MAAM,QAAE2qB,EAAU,UAAZ,QAAuB5d,EAAvB,MAAgC5M,EAAhC,SAAuCnR,GAAagR,EAK1D,OACE,yBACE+M,QANiB9e,IACnBA,EAAEyC,iBACFqc,KAKE5M,MAAOA,EACPF,UAAY,oBAAmB0qB,IAHjC,SAKG37B,KCJMo4C,GAAoBpnC,IAC/B,MAAM,iBACJqnC,EADI,KAEJvrC,EAFI,MAGJ5E,EAHI,SAIJ8c,EAJI,gBAKJszB,EALI,MAMJ3wC,GACEqJ,EAEE7D,EAAKskC,GAAa,SAClB8G,EAAwBrpC,GAAyBmpC,GAEvD,OACE,uBAAKpnC,UAAU,iBAAf,UACE,yBAAO02B,QAASx6B,EAAI8D,UAAU,yBAA9B,UACE,oBAAGA,UAAWI,GAAKyH,UAAW3H,MAAO,CAAE6R,MAAOu1B,KAC7C,IACAj0C,EAAE,cAHL,OAKA,uBAAK2M,UAAY,WAAjB,UACE,wBACE9D,GAAIA,EACJL,KAAMA,EACNmE,UAAU,eACV7H,KAAK,OACLlB,MAAOA,EACP8c,SAAU/lB,GAAK+lB,EAAS/lB,EAAEkiB,cAAcjZ,OACxCs/B,YAAY,SAEb7/B,GACC,sBAAKsJ,UAAU,mBAAmBE,MAAO,CAACgzB,QAAS,WAAnD,SACGx8B,OAIP,sBAAKsJ,UAAU,WAAf,SACE,eAACknC,GAAD,CAAiBp6B,QAASu6B,EAA1B,2BCnDD,SAASE,GACd5vC,EACA6vC,EACArQ,GACA,OAAOlkB,qBAAU,KACf,MAAMqkB,EAAU9nC,WAAWmI,EAAUw/B,GACrC,MAAO,IAAMI,aAAaD,KACzBkQ,GCJE,IAAKC,GAMAC,GAMAC,GAKAC,GA8EAC,GA0DZ,SAASC,GAAsB7wC,GAC7B,OAAOA,EAAMvE,MAAM,eAAeoM,KAAK,S,SA1J7B2oC,K,0BAAAA,E,sBAAAA,E,aAAAA,Q,cAMAC,O,2BAAAA,I,2BAAAA,I,4BAAAA,Q,cAMAC,K,kBAAAA,E,eAAAA,Q,cAKAC,K,QAAAA,E,QAAAA,E,QAAAA,E,SAAAA,Q,cA8EAC,K,UAAAA,E,sBAAAA,E,kBAAAA,E,cAAAA,E,oBAAAA,E,kBAAAA,E,oBAAAA,E,0BAAAA,E,2BAAAA,E,oBAAAA,E,gCAAAA,E,2BAAAA,E,oBAAAA,E,qBAAAA,E,UAAAA,E,kBAAAA,E,oBAAAA,E,kBAAAA,E,yBAAAA,E,kBAAAA,E,mCAAAA,E,2CAAAA,E,iCAAAA,E,gCAAAA,E,qBAAAA,Q,mBCzFL,MAAME,GAAoBhoC,IAE/B,MAAM,iBAAEioC,EAAF,OAAoBvL,GAAW18B,GAG9BkoC,EAAiBC,GAAsB/wC,mBAASywC,GAASO,IAoB1DC,EAAY51C,IAAiC,IAAD,EAChD,wBAAOiqC,QAAP,IAAOA,OAAP,EAAOA,EAAQ3pC,SAASN,UAAxB,UAUI61C,EAAe14B,IAAM24B,YAEzB,EAAGv5C,WAAU+d,WAAW4G,IACtB,wBACEA,IAAKA,EACLxT,MAAO,CAACuP,OAAQ,UAAWsC,MAAO,WAClCjF,QAASA,EAHX,UAKG/d,EALH,cAUJ,OACE,qCACE,gBAACw5C,GAAA,EAAD,WACE,gBAACA,GAAA,EAASC,OAAV,CAAiBC,GAAIJ,EAAcnsC,GAAG,iBAAtC,YAtBCugC,GAGEA,EAAOhvC,OAAS,GAqBf,eAAC4tC,GAAA,EAAD,CAAOn7B,MAAO,CAAC4R,YAAa,GAAI42B,MAAI,EAAChe,QAAS,SAA9C,eAtCsBl4B,KAC9B,OAAQA,GACN,KAAKo1C,GAASO,GAAI,OAAO90C,EAAE,eAC3B,KAAKu0C,GAASe,GAAI,OAAOt1C,EAAE,eAC3B,KAAKu0C,GAASgB,GAAI,OAAOv1C,EAAE,eAC3B,KAAKu0C,GAASiB,GAAI,OAAOx1C,EAAE,iBAmCtBy1C,CAAuBb,MAG1B,eAACM,GAAA,EAASQ,KAAV,UACGx+B,OAAOy+B,OAAOpB,IAAUj9B,KAAInY,GAAY,gBAAC+1C,GAAA,EAASx3B,KAAV,CAA0C03B,GAAG,SAAS37B,QAAS9e,IAnDrFi7C,MACzBjB,EADyBiB,EAoDCz2C,GAlD1B01C,EAAmBe,GAmDXj7C,EAAEyC,kBAFqC,UAItC4C,EAAG,YAAcb,GACjB41C,EAAS51C,IACT,eAAC6oC,GAAA,EAAD,CAAOn7B,MAAO,CAAC2R,WAAY,GAAI62B,MAAI,EAAChe,QAAS,SAA7C,iBAN0Dl4B,a,cC1DhE,MAAM02C,GACC,eACV,OAAO,IAAIA,GAAoB,GAAI,QAAI36C,OAAWA,GAGpC,iBAAC0I,GACf,YAAc1I,IAAV0I,EACKrJ,KAAKosC,QAGP,IAAIkP,GACTjyC,EAAMkH,IAAIgrC,QAAQ,GAClBlyC,EAAMoH,IAAI8qC,QAAQ,GAClBlyC,EAAMkH,IACNlH,EAAMoH,IACNpH,GAIe,oBAACA,GAClB,OAAO,IAAIiyC,GACTjyC,EAAMkH,IAAIgrC,QAAQ,GAClBlyC,EAAMmH,IAAI+qC,QAAQ,GAClBlyC,EAAMkH,IACNlH,EAAMmH,IACN,CAAED,IAAKlH,EAAMkH,IAAKE,IAAKpH,EAAMmH,MAUjCnC,YACImtC,EACAC,EACAC,EACAC,EACAtyC,GACD,KAZHmyC,iBAYE,OAXFC,iBAWE,OAVFC,iBAUE,OATFC,iBASE,OARFC,uBAQE,EACA57C,KAAK47C,kBAAoBvyC,EACzBrJ,KAAKw7C,YAAcA,EACnBx7C,KAAKy7C,YAAcA,EACnBz7C,KAAK07C,YAAcA,EACnB17C,KAAK27C,YAAcA,EAGjBE,YACF,YAA4Bl7C,IAArBX,KAAK07C,kBAAkD/6C,IAArBX,KAAK27C,YAGhDG,aAAazyC,GACX,IAAK,aAAausC,KAAKvsC,GACrB,OAAO,IAAIiyC,GAAoBjyC,EAAOrJ,KAAKy7C,iBAAa96C,EAAWX,KAAK27C,YAAa37C,KAAK47C,mBAG5F,MAAMF,EAAcK,WAAW1yC,EAAMxD,QAAQ,IAAK,MAClD,OAAIwwC,OAAO3U,MAAMga,GACR,IAAIJ,GAAoBjyC,EAAOrJ,KAAKy7C,iBAAa96C,EAAWX,KAAK27C,YAAa37C,KAAK47C,mBAEnF,IAAIN,GAAoBjyC,EAAOrJ,KAAKy7C,YAAaC,EAAa17C,KAAK27C,iBAAkCh7C,IAArBX,KAAK27C,iBAA4Bh7C,EAAY,CAClI4P,IAAKmrC,EACLjrC,IAAKzQ,KAAK27C,cAKhBK,aAAa3yC,GACX,IAAK,aAAausC,KAAKvsC,GACrB,OAAO,IAAIiyC,GAAoBt7C,KAAKw7C,YAAanyC,EAAOrJ,KAAK07C,iBAAa/6C,EAAWX,KAAK47C,mBAG5F,MAAMD,EAAcI,WAAW1yC,EAAMxD,QAAQ,IAAK,MAClD,OAAIwwC,OAAO3U,MAAMia,GACR,IAAIL,GAAoBt7C,KAAKw7C,YAAanyC,EAAOrJ,KAAK07C,iBAAa/6C,EAAWX,KAAK47C,mBAEnF,IAAIN,GAAoBt7C,KAAKw7C,YAAanyC,EAAOrJ,KAAK07C,YAAaC,OAAkCh7C,IAArBX,KAAK07C,iBAA4B/6C,EAAY,CAClI4P,IAAKvQ,KAAK07C,YACVjrC,IAAKkrC,KAmBN,MAAMM,GAAoBC,0BAAe/pC,IAC9C,MAAM,SACJwzB,EADI,cAEJwW,EAAgBxW,EAASiW,kBAFrB,YAGJQ,EAAc,EAHV,SAIJj2B,EAJI,SAKJwuB,GAAW,GACTxiC,EAgBJ,OACE,eAAC,aAAD,CAAWiqC,YAAaA,EAAaC,OAAQF,EAAej9B,QAASymB,EAASkW,WAAQl7C,EARnEP,IACfu0C,GAGJxuB,EAASm1B,GAAoBgB,UAAU,CAAE/rC,IAAKnQ,EAAEm8C,OAAOhsC,MAAOE,IAAKrQ,EAAEm8C,OAAO9rC,UAI5E,SACGk1B,EAASiW,mBACR,eAAC,UAAD,CACEjW,SAAUA,EAASiW,kBACnBY,WAAY7H,EACZ8H,UApBer8C,IACjBu0C,GAGJxuB,EAASm1B,GAAoBgB,UAAU,CAAE/rC,IAAKnQ,EAAEm8C,OAAOhsC,MAAOE,IAAKrQ,EAAEm8C,OAAO9rC,iBAuBnEisC,GAAkBvqC,IAC7B,MAAM,aACJqiC,EAAe,EADX,MAEJ1wB,EAFI,KAGJvK,EAHI,SAIJo7B,GACExiC,EAEJ,IAAIwqC,EAAoBnI,EACnB1wB,IACH64B,EAAoB,GAEtB,MAAMruC,EAAKskC,GAAa,SACxB,OACE,uBAAKxgC,UAAU,iBAAf,UACKuqC,EAAoB,GAAM,wBAAO7T,QAASx6B,EAAI8D,UAAY,UAASuqC,kBAAzC,SAA6E74B,IAC1G,uBAAK1R,UAAY,WAAS,GAAKuqC,GAA/B,UACE,eAACV,GAAD,CACEW,iBAAkB,sBAAKtqC,MAAO,CAAExP,OAAQ,OACxC+5C,WAAY,sBAAKvqC,MAAO,CAAExP,OAAS,UACnC6xC,SAAUA,KACNxiC,IAELoH,GAAQ,wBAAOnH,UAAU,uBAAuBE,MAAO,CAACsU,UAAW,SAA3D,SAAsErN,WCzH1EujC,GAAa3qC,IAA2B,IAAD,UAClD,MAAM,UAAE4qC,EAAF,aAAaC,EAAb,iBAA2BC,GAAqB9qC,GAE/CkoC,EAAiBC,GAAsB/wC,mBAAiB,MAGzD2zC,EAAaj1B,mBACjB,IAAM7Y,GAAW2N,KAAIxS,GACnB,yBAAmBlB,MAAOkB,EAA1B,SAAiCyH,GAAiBzH,IAArCA,MAEf,IAEI4yC,EAAqBl1B,mBAAkB,IAAM,CAAC,IAAI,KACjDm1B,EAAkBC,GAAuB9zC,sBAE1C,iBACJiwC,EADI,QAEJH,EAFI,KAGJ9uC,EAHI,iBAIJ+yC,EAJI,UAKJv6C,EALI,YAMJw6C,EANI,QAOJC,GACET,EAEEloB,EAAc1qB,uBAAagB,IAC/B6xC,GAAaryC,KACPQ,EAAOkuC,SAAWluC,EAAOZ,MAAQY,EAAOpI,YACtC4H,EAAM6uC,mBAAqB1pC,GAAiBI,SAC9C/E,EAAOquC,iBAAmB1pC,GAAiBI,QAI/C,OADkByM,OAAOC,OAAO,GAAIjS,EAAOQ,QAG5C,CAAC6xC,IAGES,EAAsBtzC,uBAAY,CAACvF,EAAkBuG,KACzD6xC,GAAaryC,IACX,MAAM+yC,EAAkB/gC,OAAOC,OAAO,GAAIjS,EAAM5H,UAAU6B,GAAWuG,GAC/DwyC,EAAehhC,OAAOC,OAAO,GAAIjS,EAAM5H,UAAW,CAAC,CAAC6B,GAAW84C,IAErE,OADkB/gC,OAAOC,OAAO,GAAIjS,EAAO,CAAC5H,UAAW46C,EAAcnE,iBAAkB1pC,GAAiBI,cAGzG,CAAC8sC,IAIJrD,IAAiB,KACV52C,EAAUs3C,GAAiBpsC,KAKhCq2B,GAAIlP,WACFryB,EAAUs3C,GAAiBpsC,KAC3B,EAAG,GACH,CAAC,CAAC,SAAUoW,GAAcyC,UAC1BnmB,OACAA,EACA,CAAE0Q,aAAcgoC,IAChBxuB,MAAKkX,IACL,MAAM6b,EAAwB7b,EAAOrhC,KAAKse,QAAQ6+B,GAEzCA,EAAa9vC,MAAQoE,EAAM2rC,UAEpCjpB,EAAY,CAAE2oB,QAASI,OAhBvB/oB,EAAY,CAAE2oB,QAAS,OAkBxB,CAACz6C,EAAUs3C,GAAiBpsC,KAAMorC,GAAU,KAE/C,MAAM0E,EAAkBR,IACtB1oB,EAAY,CAAE0oB,iBA8FVS,EAAqB,CAAC9L,EAAgCttC,KAC1D,MAAMq5C,EAAkBr5C,GAAYgM,GAAMiB,mBAAmBqgC,EAAMgM,QAAQ7sC,cAC3E,MAAO,CACLtD,IAAK,SAAYovC,EAAmB,KACpC5yC,KAAM2nC,EAAM3nC,KACZ8G,aAAc6gC,EAAMgM,QAAQ7sC,aAC5BtO,UAAW,CACT,CAACk7C,GAAkB,CACjBhwC,KAAMikC,EAAMjkC,KACZkwC,YAAajM,EAAMgM,QAAQC,aAAe,KAC1C5sC,SAAU2gC,EAAMgM,QAAQ3sC,UAAY,KACpCC,4BAA6B0gC,EAAMgM,QAAQ1sC,6BAA+B,KAC1EC,4BAA6BygC,EAAMgM,QAAQzsC,6BAA+B,KAC1E4nC,QAASnH,EAAMgM,QAAQ7E,UAG3BroC,kBAAmB,GACnBG,kBAAmBrB,GAAiBG,MACpC8B,IAAK,CAAExB,IAAK2hC,EAAMlpB,SAAS,GAAIxY,IAAK0hC,EAAMlpB,SAAS,MAIjDo1B,EAAwBlM,IAC5B8K,GAAaryC,IACX,IAAIgzC,EAAehhC,OAAOC,OAAO,GAAIjS,EAAM5H,UAAWmvC,EAAMnvC,WAC5D,MAAQ,CACNy2C,iBAAkB7uC,EAAM6uC,iBACxBH,QAAS1uC,EAAM0uC,QACf9uC,KAAMI,EAAMJ,KACZ+yC,iBAAkB3yC,EAAM2yC,iBACxBt0B,SAAUsyB,GAAoBgB,UAAUhsC,GAAS4hC,EAAMngC,MACvDhP,UAAW46C,EACXJ,YAAa,GACbC,eAIN,OAAQ,uCACN,+BACE,sBAAKlrC,MAAO,CAACgzB,QAAS,OAAQC,cAAe,MAAOiI,eAAgB,cAApE,SACE,sBAAKl7B,MAAO,CAAC8R,SAAU,EAAGwC,UAAW,QAASy3B,aAAc,IAA5D,SACE,eAAClE,GAAD,CAAkBC,iBAAmBx1C,IAAc01C,EAAmB11C,EAASG,qBAIrF,gBAACkhB,GAAA,EAAD,WACE,gBAACwkB,GAAA,EAAD,CAAMn4B,MAAO,CAACgsC,gBAAiBzX,GAAsBsN,WAAY,GAAI9G,aAAc,IAAnF,UACE,eAACkM,GAAD,CACEtrC,KAAK,OACL5E,MAAK,UAAEtG,EAAUs3C,GAAiBpsC,YAA7B,QAAqC,GAC1CkY,SA3ImBo4B,IACzBd,EAAoBpD,EAAiB,CAACpsC,KAAMswC,KA2ItC/E,iBAAkBA,EAClBC,gBAhGoB7N,UAC1B,MAAM/nC,QAAeygC,GAAI1O,cAAc7yB,EAAUs3C,GAAiBpsC,KAAMorC,EAASzoC,GAAMiB,mBAAmBwnC,IAC1G,IAAImF,EAA8B,GAClCA,EAAoBA,EAAkB3hC,OAAOhZ,EAAOquC,MAAMn1B,KAAI0hC,GAAcT,EAAmBS,OAAY99C,MAC3G69C,EAAoBA,EAAkB3hC,OAAOhZ,EAAO05C,YAAYxgC,KAAI0hC,GAAcT,EAAmBS,OAAY99C,MACjHo9C,EAAeS,GACf,MAAME,EAAyC,IAA7BF,EAAkB3+C,OACpCw9C,EAAoBqB,EAAYj5C,EAAE,iCAA8B9E,IA0F1Dg+C,kBAvFsB/S,UAC5B,MAAM/nC,QAAeygC,GAAI3O,YAAY5yB,EAAUs3C,GAAiBpsC,KAAMorC,EAASzoC,GAAMiB,mBAAmBwnC,IACpGx1C,EAAOquC,MAAMryC,OAAS,EACxBk+C,EAAel6C,EAAOquC,OAEtB6L,EAAel6C,EAAO05C,aAExB,MAAMmB,EAA0C,IAA9B76C,EAAO05C,YAAY19C,QAAwC,IAAxBgE,EAAOquC,MAAMryC,OAClEw9C,EAAoBqB,EAAYj5C,EAAE,iCAA8B9E,IAgF1DmI,MAAOs0C,IAET,eAAC1I,GAAD,CACEzmC,KAAK,UACL6V,MAAOre,EAAE,2BACT+uC,aAAc,EACdnrC,MAAOgwC,EACPlzB,SAlJsB9c,IAC5BwrB,EAAY,CAAEwkB,QAAShwC,KAkJjBsV,QAASy6B,GACTxE,aAAc,CAACgK,YAAa,SAG/BrB,EAAY19C,OAAS,GAAK,eAAC6yC,GAAA,EAAD,UACzB,gBAACN,GAAA,EAAD,CAAKC,GAAI,CAAEwM,KAAM,EAAGnrB,OAAQ,GAA5B,UACE,oBAAGphB,MAAO,IAAIu1B,GAAWI,KAAKF,QAA9B,SAAwCtiC,EAAE,gCAC1C,8BACG83C,EAAYxgC,KAAIrZ,GACf,8BACE,eAACub,GAAD,CAAY3M,MAAO,IAAIu1B,GAAWxoB,KAAK0oB,QAAS7oB,QAAS,IA/FvC0sB,WAC9B,IACE,MAAMkT,EAAe,CAAC,KAAM,KAAM,KAAM,MACxC,IAAK,IAAI7zC,KAAS6zC,EAAe,CAC/B,IAAIL,EACA75C,EAAWk6C,EAAa7zC,GAC5B,MAAMpH,QAAeygC,GAAI1O,cAAc7yB,EAAUs3C,GAAiBpsC,KAAMorC,EAASz0C,GAC7Ef,EAAOquC,MAAMryC,OAAS,EACxB4+C,EAAaT,EAAmBn6C,EAAOquC,MAAM,GAAIttC,GAC1Cf,EAAO05C,YAAY19C,OAAS,IACnC4+C,EAAaT,EAAmBn6C,EAAO05C,YAAY,GAAI34C,IACrD65C,GACFL,EAAqBK,GAEzBzB,GAAaryC,GACJgS,OAAOC,OAAO,GAAIjS,EAAO,CAAC6uC,iBAAkB1pC,GAAiBG,UAEtE+oC,uBAAoBhuB,QAAQvlB,EAAE,oDAC9B,MAAOrF,GACP44C,uBAAoBlwC,MAAMrD,EAAE,sDA4E6Cs5C,GAA/D,SACG,IAAInuC,GAAMlN,GAAO4N,cAFb5N,EAAMqK,cAStByvC,EAAQ39C,OAAS,GAAK,eAAC6yC,GAAA,EAAD,UACrB,gBAACN,GAAA,EAAD,CAAKC,GAAI,CAAEwM,KAAM,EAAGnrB,OAAQ,GAA5B,UACE,oBAAGphB,MAAO,IAAIu1B,GAAWI,KAAKF,QAA9B,SAAwCtiC,EAAE,4BAC1C,8BACG+3C,EAAQzgC,KAAIrZ,GACX,8BACGu5C,EACC,eAACh+B,GAAD,CAAY3M,MAAO,IAAIu1B,GAAWxoB,KAAK0oB,QAAS7oB,QAAS,IAAM+9B,EAAiBv5C,GAAhF,SACG,IAAIkN,GAAMlN,GAAO4N,aAGpB,eAACsQ,GAAD,CAAUtP,MAAO,IAAIu1B,GAAWxoB,KAAK0oB,QAASz9B,KAAMoK,GAAOuE,UAAWrT,MAAOlC,EAAMqK,IAAKwX,OAAO,SAA/F,SACG,IAAI3U,GAAMlN,GAAO4N,cAPf5N,EAAMqK,cAevB,eAAC2mC,GAAD,CACEzmC,KAAK,OACL6V,MAAOre,EAAE,cACT+uC,aAAc,EACdnrC,MAAOkB,EACP4b,SA1LqB9c,IACzBwrB,EAAY,CAAEtqB,KAAMlB,KA0LhBwrC,eAAgBqI,IAElB,eAACjI,GAAD,CACEhnC,KAAK,oBACL6V,MAAOre,EAAE,0BACT+uC,aAAc,EACdnrC,MAAOi0C,EACPn3B,SA9LiCm3B,IACrCzoB,EAAY,CAAEyoB,wBA+LZ,eAACrI,GAAD,CACEhnC,KAAK,cACL6V,MAAOre,EAAE,0BACT+uC,aAAc,EACdnrC,MAAK,UAAEtG,EAAUs3C,GAAiB8D,mBAA7B,QAA4C,GACjDh4B,SAjM4Bg4B,IAChCV,EAAoBpD,EAAiB,CAAC,YAAe8D,OAkMnD,eAAClJ,GAAD,CACEhnC,KAAK,WACL6V,MAAOre,EAAE,uBACT+uC,aAAc,EACdnrC,MAAK,UAAEtG,EAAUs3C,GAAiB9oC,gBAA7B,QAAyC,GAC9C4U,SApMyB5U,IAC7BksC,EAAoBpD,EAAiB,CAAC,SAAY9oC,OAqMhD,eAAC0jC,GAAD,CACEhnC,KAAK,SACL6V,MAAOre,EAAE,qBACT+uC,aAAc,EACdnrC,MAAK,UAAEtG,EAAUs3C,GAAiB7oC,mCAA7B,QAA4D,GACjE2U,SAvMsB64B,IAC1BvB,EAAoBpD,EAAiB,CAAC,4BAA+B2E,OAwMnE,eAAC/J,GAAD,CACEhnC,KAAK,SACL6V,MAAOre,EAAE,qBACT+uC,aAAc,EACdnrC,MAAK,UAAEtG,EAAUs3C,GAAiB5oC,mCAA7B,QAA4D,GACjE0U,SA1MsB84B,IAC1BxB,EAAoBpD,EAAiB,CAAC,4BAA+B4E,UA4MrE,sBAAK3sC,MAAO,CAACgzB,QAAS,OAAQC,cAAe,MAAOiI,eAAgB,cAApE,SACE,sBAAKl7B,MAAO,CAAC8R,SAAU,EAAGwC,UAAW,SAArC,SACE,eAAC3H,GAAD,CAAYC,QA3MiB,KACjC89B,GAAcryC,IACZ,IAAI5H,EAAY4H,EAAM5H,UACtB,MAAM+7C,EAAe,CAAC,KAAM,KAAM,KAAM,MACxC,IAAK,IAAI7zC,KAAS6zC,EAAc,CAE9B/7C,EADiB+7C,EAAa7zC,IACRN,EAAM5H,UAAUs3C,GAExC,OAAO19B,OAAOC,OAAO,GAAIjS,EAAO,CAAC5H,UAAWA,OAE9Ci2C,uBAAoBhuB,QAAQvlB,EAAE,6CAiM1B,SACE,uBAAM6M,MAAOu1B,GAAWxoB,KAAK0oB,OAA7B,SAAsCtiC,EAAE,sBAAuB,CAACb,UrE5V7Bs6C,EqE4VoE7E,ErE3V3G,CAAC,KAAM,KAAM,KAAM,MAAMnxB,QAAQg2B,IAAiB,EAC7Cz5C,EAAG,YAAcy5C,GAEjB,oBAJkCA,OsEQhCC,GAAoBhtC,IAC/B,MAAOooB,EAAQ5O,GAAW2O,GAASnoB,IAI5B4qC,EAAWC,GAAgBzzC,mBAAyB,CACzDiwC,iBAAkB1pC,GAAiBI,OACnCotC,iBAAiB,GACjBjE,QAAS,KACT9uC,KAAM4E,GAAUK,SAChBzM,UjE8CK,CACL,GAZK,CACLkL,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAOT,GAbK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAQT,GAdK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAST,GAfK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,KiExCTkE,YAAa,GACbC,QAAS,GACTx0B,SAAUsyB,GAAoBlP,UAuC1BuM,EAAsB,KAC1BhtB,OAAQhrB,IAWV,OACE,gBAAC,KAAD,CAAO46B,KAAMhB,EAAQiB,OAAQmd,EAAqB/d,KAAK,KAAvD,UACE,eAACqB,GAAD,UAAcx2B,EAAE,6BAChB,eAAC,KAAMm3B,KAAP,UACE,eAACkgB,GAAD,CACEC,UAAWA,EACXC,aAAcA,EACdC,iBAXsBv5C,IAC5BioB,EAAQjoB,QAaN,gBAACq4B,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASy5B,EAArC,SACGlzC,EAAE,8BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAzDJ0sB,UAC1B,MAAM,iBACJ4N,EADI,QAEJH,EAFI,KAGJ9uC,EAHI,iBAIJ+yC,EAJI,SAKJt0B,GACE+zB,EAEEnhC,EAAuB,CAC3BrR,OACA8G,aAAcgoC,EACdt2C,UAAWg6C,EAAUh6C,UACrBiO,kBAAmBssC,EAAiBx4C,MAAM,KAC1CqM,kBAAmBqoC,EACnBznC,IAAKrB,GAASsY,EAAS4yB,oBAGzB,GAAsB,eADDtX,GAAItP,cAAcpZ,EAAQ,WACpC1V,OAET,OAGF,MAAMxC,QAAc4gC,GAAI1P,YAAYhZ,GACpCo9B,uBAAoBhuB,QAAQvlB,EAAE,kCAC9BkmB,EAAQjoB,IAgCJ,SACG+B,EAAE,qCCvFb,SAAS25C,GAAWlgD,GAClB,OAAO,gCAAOA,EAAS+O,OAGzB,SAASoxC,GAAengD,GAA8B,IAAD,EACnD,IAAIoT,EAAQ,CAAE2R,WAAY,GAC1B,MAAMpJ,EAAQ,UAAG3b,EAASqa,YAAZ,aAAG,EAAesB,SAChC,OAAIA,GAAYA,EAASG,KAErB,eAACyyB,GAAA,EAAD,CAAO3Q,QAAS,YAAaxqB,MAAOA,EAApC,SACG,WAAQuI,EAASC,IAAM,IAAMD,EAASE,MAAQ,IAAMF,EAASG,OAI3D,0BAIX,SAASskC,GAAqBpgD,GAA8B,IAAD,EACzD,IAAIoT,EAAQ,CAAE2R,WAAY,GACS,IAAD,EAAlC,iBAAI/kB,EAASqa,YAAb,aAAI,EAAeqB,eAEf,eAAC6yB,GAAA,EAAD,CAAO3Q,QAAS,SAAUxqB,MAAOA,EAAjC,mBACGpT,EAASqa,YADZ,aACG,EAAeqB,gBAIb,0BAIX,MAAM2kC,GAA4BptC,IAChC,MAAMmsC,OAAwC39C,IAAtBwR,EAAMqtC,iBAA4B7+C,GAAkC,IAAtBwR,EAAMqtC,YAAuB,YAAc,QACjH,OACE,uBAAyCltC,MAAO,CAC9Cy0B,SAAU,GACV0Y,WAAYnB,EACZpK,QAAS,SACTryB,OAAQ,WAJV,YAMuB,IAArB1P,EAAMitC,iBAA4Cz+C,IAArBwR,EAAMitC,aAA6BA,GAAWjtC,EAAMjT,UAClFogD,GAAqBntC,EAAMjT,UAC3BmgD,GAAeltC,EAAMjT,YARZiT,EAAMjT,SAASoP,IAAM,WAY7BoxC,GAA2BvtC,IAC/B,MAAMmsC,OAAwC39C,IAAtBwR,EAAMqtC,iBAA4B7+C,GAAkC,IAAtBwR,EAAMqtC,YAAuB,YAAc,QACjH,OAAQ,sBAAyCltC,MAAO,CACtDy0B,SAAU,GACV0Y,WAAWnB,EACXpK,QAAS,SACTryB,OAAQ,WAJF,SAML1P,EAAMjT,SAAS6F,YANAoN,EAAMjT,SAASoP,IAAM,WAU5BqxC,GAAsBxtC,IACjC,MAAMmsC,OAAwC39C,IAAtBwR,EAAMqtC,iBAA4B7+C,GAAkC,IAAtBwR,EAAMqtC,YAAuB,YAAc,QACjH,OAAIrtC,EAAMjT,SAASoP,IAAM6D,EAAMytC,eAAiBjrC,GAAsBqF,OAC7D,eAACulC,GAAD,IAA8BptC,IAC5BA,EAAMjT,SAASoP,GACjB,eAACoxC,GAAD,IAA6BvtC,IAGlC,uBAAyCG,MAAO,CAC9Cy0B,SAAU,GACV0Y,WAAYnB,EACZpK,QAAS,SACTryB,OAAQ,WAJV,UAME,oBAAGzP,UAAU,aAAaE,MAAO,CAAC4R,YAAa,YAC9Cze,EAAG,oBAAmB0M,EAAMytC,gBAAoC,IAAMztC,EAAM0tC,eAPrE1tC,EAAMjT,SAASoP,IAAM,WCjDxBwxC,GAAsB3tC,IACjC,MAAM,UAAE4qC,EAAF,aAAaC,GAAiB7qC,GAE9B,KACJ5H,EADI,SAEJ0J,EAFI,cAGJ8rC,EAHI,OAIJzrC,EAJI,YAKJ0rC,EALI,KAMJ7rC,EANI,UAOJ8rC,EAPI,QAQJjsC,EARI,aASJksC,EATI,SAUJnsC,EAVI,cAWJosC,EAXI,KAYJ3xC,EAZI,UAaJ4xC,GACErD,EAEEsD,EAAcp4B,mBAAQ,IAAMvV,GAC/BqK,KAAIxS,IAAI,CAAOlB,MAAOkB,EAAMyK,MAAOjC,GAA0BxI,QAAW,IACrE+1C,EAAcr4B,mBAAQ,IAAMrU,GAAOmJ,KAAIvO,IAAI,CAAOnF,MAAOmF,EAAMwG,MAAOxG,OAAU,IAEhF+xC,EAAmBz1C,IACvBkyC,EAAargC,OAAOC,OAAO,GAAImgC,EAAWjyC,KA+B5C,OACE,gBAACmb,GAAA,EAAD,WACE,eAACyuB,GAAD,CACE5wB,MAAOre,EAAE,4BACTwI,KAAK,OACL5E,MAAOkB,EACP4b,SAlCqB9c,IACzBk3C,EAAgB,CAAEh2C,KAAMlB,KAkCpBsV,QAAS0hC,IAEV91C,IAASkI,GAAmBE,UAC3B,eAACsiC,GAAD,CACEnxB,MAAOre,EAAE,gCACTwI,KAAK,WACL5E,MAAO0K,EACPoS,SAtBuBpS,IAC7BwsC,EAAgB,CAAExsC,cAsBZjL,MAAOq3C,IAGV51C,IAASkI,GAAmBG,SAC3B,eAACqiC,GAAD,CACEnxB,MAAOre,EAAE,+BACTwI,KAAK,UACL5E,MAAO2K,EACPmS,SAnCsBnS,IAC5BusC,EAAgB,CAAEvsC,aAmCZlL,MAAOo3C,KAGT31C,IAASkI,GAAmBK,MAAQvI,IAASkI,GAAmBI,WAChE,eAACoiC,GAAD,CACEnxB,MAAOre,EAAE,oCACTwI,KAAK,WACL5E,MAAO4K,EACPkS,SAxDuBlS,IAC7BssC,EAAgB,CAAEtsC,cAwDZnL,MAAOi3C,IAGVx1C,IAASkI,GAAmBK,MAC3B,eAACmiC,GAAD,CACEnxB,MAAOre,EAAE,kCACTwI,KAAK,UACL5E,MAAOiL,EACP6R,SA7DqB7R,IAC3BisC,EAAgB,CAAEjsC,YA6DZxL,MAAOm3C,IAGV11C,IAASkI,GAAmBK,MAC3B,eAACmiC,GAAD,CACEnxB,MAAOre,EAAE,gCACTwI,KAAK,OACL5E,MAAO8K,EACPgS,SAlEmBhS,IACzBosC,EAAgB,CAAEpsC,UAkEZrL,MAAOk3C,IAGX,eAACtL,GAAD,CACE5wB,MAAOre,EAAE,gCACTwI,KAAK,OACL5E,MAAOmF,EACP2X,SA9DqB3X,IACzB+xC,EAAgB,CAAE/xC,UA8DdmQ,QAAS2hC,EACTx3C,MAAOs3C,QCnIFI,GAA6BruC,IACxC,MAAM,MAAE9I,GAAU8I,GACXooB,EAAQ5O,GAAW2O,GAASnoB,IAE5B4qC,EAAWC,GAAgBzzC,mBAAkC,CAClEgB,KAAMkI,GAAmBI,SACzBoB,SAAU5K,EACV02C,mBAAep/C,EACf2T,OAAQ,GACR0rC,iBAAar/C,EACbwT,KAAM,GACN8rC,eAAWt/C,EACXqT,QAAS,GACTksC,kBAAcv/C,EACdoT,SAAU,GACVosC,mBAAex/C,EACf6N,KAAMoF,GAAO,GACbwsC,eAAWz/C,IAqDPg4C,EAAsB,IAAMhtB,OAAQhrB,GAE1C,OACE,gBAAC,KAAD,CAAO46B,KAAMhB,EAAQiB,OAAQmd,EAAqB/d,KAAK,KAAvD,UACE,eAACqB,GAAD,UAAcx2B,EAAE,6BAChB,eAAC,KAAMm3B,KAAP,UACE,eAACkjB,GAAD,CAAoB/C,UAAWA,EAAWC,aAAcA,MAE1D,gBAACjhB,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASy5B,EAArC,SACGlzC,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QA9DN0sB,UACxB,MAAM,KACJrhC,EADI,SAEJ0J,EAFI,OAGJK,EAHI,KAIJH,EAJI,QAKJH,EALI,SAMJD,EANI,KAOJvF,GACEuuC,EAEEnhC,EAAgC,CACpCrR,OACAiE,QAEF,OAAQjE,GACN,KAAKkI,GAAmBG,QACtBgJ,EAAO5H,QAAUA,EACjB,MACF,KAAKvB,GAAmBE,SACtBiJ,EAAO7H,SAAWA,EAClB,MACF,KAAKtB,GAAmBK,KACtB8I,EAAO1H,QAAUI,EACjBsH,EAAOzH,KAAOA,EACdyH,EAAO3H,SAAWA,EAClB,MACF,KAAKxB,GAAmBI,SACtB+I,EAAO3H,SAAWA,EAGtB,MAAMpQ,QAAeygC,GAAIvS,uBAAuBnW,EAAQ,UACxD,GAAsB,OAAlB/X,EAAOqC,OAAiB,CAC1B,MAAM4N,QAAewwB,GAAI1S,qBAAqBhW,GAG9C,OAFAo9B,uBAAoBhuB,QAAQvlB,EAAE,qCAC9BkmB,EAAQ7X,GAIV,MAAM+6B,EAAShrC,EAAOnD,MAAQ,GAC9Bs8C,EAAargC,OAAOC,OAAO,GAAImgC,EAAW,CACxCgD,cAAe/2C,EAAoB6lC,EAAO56B,UAC1CgsC,UAAWj3C,EAAoB6lC,EAAO16B,MACtC6rC,YAAah3C,EAAoB6lC,EAAO36B,SACxCgsC,aAAcl3C,EAAoB6lC,EAAO76B,SACzCmsC,cAAen3C,EAAoB6lC,EAAO96B,UAC1CqsC,UAAWp3C,EAAoB6lC,EAAOrgC,UAgBpC,SACG/I,EAAE,kC,aC9EN,MAAMg7C,GAAkBtuC,IAE7B,MAAM,KAAE5H,EAAF,WAAQm2C,EAAR,YAAoBC,GAAgBxuC,EACpCy0B,EAASkE,MAERnsB,EAASiiC,GAAcr3C,mBAA8B,KACrDF,EAAOC,GAAYC,mBAAS,KAC5Bs3C,EAAgBC,GAAqBv3C,mBAAS,GAE/Cw3C,EAAyB,KAAV13C,IAAiBA,EAAM6oC,MAAM,WAIlD7sB,qBAAU,KACH07B,GACHH,EAAW,MACZ,CAACG,IAEJ17B,qBAAU,KACRu7B,EAAW,MACV,CAACC,IAGJ,MAoFMG,EAAkB,KACtB,OAAQz2C,GACN,KAAKoK,GAAsBqF,OA5DD,MAC5B,IAAIinC,EAAWra,EAAOrL,MAAwBppB,GAC5C,eAAC+kC,GAAD,CAAmB7tC,MAAOA,KAAW8I,MAEvC8uC,EAASp2B,MAAKvnB,IACPA,GAGLo9C,EAAW,IAAItnC,GACb9V,EAAOyK,IACP4G,GAAsBqF,OACtB1W,EAAO47B,QAAU,IAAM57B,EAAO67B,WAC9BvqB,GAA0BkF,KAC1B,SAgDAonC,GACA,MAEF,KAAKvsC,GAAsB/D,MA5BF,MAC3B,IAAIqwC,EAAWra,EAAOrL,MAAuBppB,GAC3C,eAACgtC,GAAD,CAAkB91C,MAAOA,KAAW8I,MAEtC8uC,EAASp2B,MAAKnnB,IACPA,GAGLg9C,EAAW,IAAItnC,GACb1V,EAAMqK,IACN4G,GAAsB/D,MACtBlN,EAAMX,UAAUuB,KAAqB2J,KACrC2G,GAA0BkF,KAC1B,SAgBAqnC,GACA,MAEF,KAAKxsC,GAAsBuF,aAlDO,MACpC,IAAI+mC,EAAWra,EAAOrL,MAAgCppB,GACpD,eAACquC,GAAD,CAA2Bn3C,MAAOA,KAAW8I,MAE/C8uC,EAASp2B,MAAK/W,IACPA,GAGL4sC,EAAW,IAAItnC,GACbtF,EAAO/F,IACP4G,GAAsBuF,aACtB,IAAIrG,GAAeC,GAAQ7F,KAC3B2G,GAA0BkF,KAC1B,SAsCAsnC,GAGF,KAAKzsC,GAAsBwF,QAC3B,KAAKxF,GAAsB0F,YA2B/B,IAAIgnC,EAAiB,CACnBC,uBAAyB,CAACle,EAA8BjxB,EAA8ClH,KACpG,MAAMkhB,EAASiX,EAAUn1B,KACzB,OACE,gBAAC,WAAD,WACE,eAAC,KAAD,CAAake,OAAQha,EAAM81B,KAA3B,SACG9b,IAEC,+BACA,eAACwzB,GAAD,CACEzgD,SAAUkkC,EACVwc,aAAcr1C,EACds1C,aAAcx2C,EACd+1C,YAAY,KALJhc,EAAUn1B,WAahC,OACE,eAAC,KAAD,IACMozC,EACJ9X,MAAO,IACPgY,UAAU,EACVC,kBAAmBn4C,EACnBo4C,SAAU,KAAI,EACdnzC,GAAI,uBACJqQ,QAASA,EACT+iC,SAAS,OACTl9B,SAA0B,GAC1BmkB,YAAagY,GAAel7C,EAAE,iCAC9Bk8C,SA/JYv1B,IACA,KAAVA,IAIJ00B,GAAkBD,GAAkBA,EAAiB,IAErDtS,GAAIrf,2BAA2B3kB,EAAM6hB,GAClCvB,MAAKsE,IAGA5kB,IAASoK,GAAsBqF,QAC9BzP,IAASoK,GAAsB/D,OAC/BrG,IAASoK,GAAsBuF,cAClCiV,EAAWyyB,OAAO,EAAG,EAAGxoC,GAAkByoC,cAAc,KAG1DjB,EAAWzxB,MAEZ2yB,SAAQ,KACPhB,GAAkBD,GAAkBA,EAAiB,SA4IvD16B,SAAW3B,IAnDShE,SAmDmBgE,EAAS,MA7C9ChE,EAAKvF,UACP+lC,IAEAN,EAAWlgC,GAGblX,EAAS,IACTs3C,EAAWv3C,EAAQ,CAAC+P,GAAkBgzB,SAAW,MAuC/C2V,UAAWlB,EAAiB,KAUrBmB,GAAuB7vC,IAClC,MAAM,MAAE2R,EAAF,aAAS0wB,EAAe,KAAMp1B,GAAejN,EAE7C7D,EAAKskC,GAAa,kBACxB,OACE,uBAAKxgC,UAAU,iBAAf,UACE,wBAAO02B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,sBAAK1R,UAAY,WAAS,GAAKoiC,GAA/B,SACE,eAACiM,GAAD,IAAoBrhC,UCzMf6iC,GAAuB9vC,IAClC,MAAM,MAAE2R,EAAF,KAASvZ,EAAT,MAAelB,EAAf,SAAsB8c,EAAtB,SAAgCwuB,EAAhC,aAA0CH,EAAe,GAAMriC,EAI/DqO,EAAOnX,GAAS+P,GAAkBgzB,QAClC/sB,EAAOmB,EAAK7F,UAClB,OACE,gBAACsL,GAAA,EAAKstB,MAAN,CAAYsH,GAAInI,KAAhB,UACE,yBAAOtgC,UAAY,wBAAuBoiC,IAA1C,UACG1wB,EADH,OAGA,eAACsuB,GAAA,EAAD,CAAKC,GAAI,GAAKmC,EAAd,SACIh0B,EAAKvF,WAWJ05B,GAAY,eAAC8L,GAAD,CAAgBl2C,KAAMA,EAAMm2C,WAtBzBlgC,GAA6B2F,EAAS3F,KAYtD,wBAAMlO,MAAO,CAAE4hC,QAAS,QAAS5O,QAAS,gBAA1C,UACE,oBAAGlzB,UAAWoO,EAAKzG,UAAWzH,MAAO,CAAE+6B,aAAc,WACrD,eAACzrB,GAAD,CAAUtX,KAAM+U,EAAK/U,KAAM1E,MAAOyZ,EAAKzZ,MAAOwM,UAAU,OAAOmT,OAAO,SAAtE,SAAgF/E,EAAKvS,QACnF0mC,GACA,eAAC11B,GAAD,CAAYC,QAfI,IAAMiH,EAAS,MAe/B,SACE,oBAAG/T,UAAWI,GAAK42B,YAAa92B,MAAO,CAAEssC,YAAa,sBCR/D,MAAMsD,GAAoB/vC,IAC/B,MAAM,WAAE/O,EAAF,QAAcioC,EAAd,OAAuB8W,EAAvB,SAA+BC,GAAajwC,EAC5Cy0B,EAASkE,MAERvgC,EAAM83C,GAAW94C,mBAASgL,GAAuBY,MACjDH,EAAOmvB,GAAY56B,mBAAS,KAC5B6E,EAAak0C,GAAkB/4C,mBAAS,KACxCrD,EAAQq8C,GAAah5C,mBAASiL,GAAyBY,OACvDH,EAASutC,GAAcj5C,mBAAS,KAChC2L,EAAWutC,GAAgBl5C,mBAAS,KACpCjG,EAAQo/C,GAAan5C,mBAAiC,MAE7D8b,qBAAU,KACRg9B,EAAQj/C,EAAWmH,MACnB45B,EAAS/gC,EAAW4R,OACpBstC,EAAel/C,EAAWgL,aAC1Bm0C,EAAUn/C,EAAW8C,QACrBs8C,EAAWp/C,EAAW6R,SACtBwtC,EAAar/C,EAAW8R,WACxBwtC,EAAUt/C,EAAWE,OAnCzB,SAA4BA,GAC1B,OAAO,IAAI8V,GACT9V,EAAOyK,IACP4G,GAAsBqF,OACtB1W,EAAO47B,QAAU,IAAM57B,EAAO67B,WAC9BvqB,GAA0BkF,KAC1B,IA6B8B6oC,CAAmBv/C,EAAWE,QAAU,QACrE,CAACF,IAEJ,MAuCMw/C,EACJx/C,EAAWmH,OAASA,GACfnH,EAAW4R,QAAUA,GACrB5R,EAAWgL,cAAgBA,GAC3BhL,EAAW8C,SAAWA,GACtB9C,EAAW6R,UAAYA,GACvB7R,EAAW8R,YAAcA,IACxB9R,EAAWE,QAAUF,EAAWE,OAAOyK,QAAUzK,EAASA,EAAOgL,QAAK3N,GAE9E,OACE,gBAACslB,GAAA,EAAD,WACE,eAACyuB,GAAD,CACEzmC,KAAK,OACL6V,MAAOre,EAAE,mBACT+uC,aAAc,EACdnrC,MAAOkB,EACP4b,SAvDqBmwB,GAAc+L,EAAQ/L,GAwD3C33B,QAAS,CAAE,CAAEtV,MAAO,MAAO2L,MAAOvP,EAAE,2BAEtC,eAACwvC,GAAD,CACEhnC,KAAK,QACL6V,MAAOre,EAAE,oBACT+uC,aAAc,EACdnrC,MAAO2L,EACPmR,SAAUge,IAEZ,eAACgR,GAAD,CACElnC,KAAK,cACL6V,MAAOre,EAAE,0BACT+uC,aAAc,EACdnrC,MAAO+E,EACP+X,SAAUm8B,EACVjN,KAAM,IAER,eAACX,GAAD,CACEzmC,KAAK,SACL6V,MAAOre,EAAE,qBACT+uC,aAAc,EACdnrC,MAAOnD,EACPigB,SA7EuBmwB,GAAciM,EAAUjM,GA8E/C33B,QAAS,CACP,CAAEtV,MAAOmL,GAAyBY,KAAMJ,MAAOvP,EAAE,2BACjD,CAAE4D,MAAOmL,GAAyBquC,WAAY7tC,MAAOvP,EAAE,kCACvD,CAAE4D,MAAOmL,GAAyBsuC,KAAM9tC,MAAOvP,EAAE,8BAGrD,eAACw8C,GAAD,CACEh0C,KAAK,SACL6V,MAAOre,EAAE,qBACT+uC,aAAc,EACdjqC,KAAMoK,GAAsBqF,OAC5BmM,SAzDwB9c,IAC5Bq5C,EAAUr5C,IAyDNA,MAAO/F,IAET,eAAC2xC,GAAD,CACEhnC,KAAK,WACL6V,MAAOre,EAAE,sBACT+uC,aAAc,EACdnrC,MAAO4L,EACPkR,SAAUq8B,IAEZ,eAACvN,GAAD,CACEhnC,KAAK,aACL6V,MAAOre,EAAE,wBACT+uC,aAAc,EACdnrC,MAAO6L,EACPiR,SAAUs8B,IAEZ,eAACx8B,GAAA,EAAKstB,MAAN,CAAYsH,GAAInI,KAAhB,SACE,eAACN,GAAA,EAAD,CAAKC,GAAI,CAAEwM,KAAM,GAAInrB,OAAQ,GAA7B,SACE,gBAACmI,GAAD,WACE,eAACgB,GAAA,EAAD,CAAQC,QAAQ,SAAS5d,QA/FP0sB,UAC1B,MAAM/nC,QAAe+iC,EAAOrL,MAAKppB,GAC/B,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,2BACT6lB,QAAS7lB,EAAE,6BACX+2B,YAAY,SACZC,WAAYh3B,EAAE,yBACdi3B,WAAYj3B,EAAE,4BACV0M,MAGHtO,UAGC0qC,GAAI7e,iBAAiBtsB,EAAWkL,IAAM,IAC5C+8B,EAAQz5B,KAAK,kBAgFL,SACGnM,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QA5EV,IAAMkjC,IA4ExB,SACG38C,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CACEC,QAAQ,UACR1Z,UAAWw/B,EACX1jC,QApHc0sB,UACxB,MAAMmX,EAAez/C,GAAUA,EAAOgL,SAAWg2B,GAAInR,UAAU7vB,EAAOgL,SAAM3N,EAC5EyC,EAAWmH,KAAOA,EAClBnH,EAAW4R,MAAQA,EACnB5R,EAAWgL,YAAcA,EACzBhL,EAAW8C,OAASA,EACpB9C,EAAW6R,QAAUA,EACrB7R,EAAW8R,UAAYA,EACvB9R,EAAWE,OAASy/C,GAAgB,KACpCZ,EAAO/+C,IAwGC,SAKGqC,EAAE,gCCtKD0M,WACd,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,IAAoBtmB,GAAQrN,EAE5B/O,EAAa6kB,mBAAQ,IAAMlT,GAAmBq3B,SAAS,IAQ7D,OACE,eAAC5G,GAAD,CACEl3B,GAAIoG,GAAOuB,iBACX5D,KAAMG,GAAK2C,IACXH,MAAOvP,EAAE,gCACT+Z,IAAKA,GAAO9K,GAAOgD,gBAJrB,SAME,eAACg7B,GAAA,EAAD,CAAKtgC,UAAU,4BAAf,SACE,eAACggC,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,eAAC5H,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,OAA1B,SACE,gBAACoO,GAAA,EAAK7N,KAAN,WACE,eAAC6N,GAAA,EAAKrO,MAAN,UAAa32B,EAAE,kCACf,eAACglC,GAAA,EAAKuY,KAAN,CAAWnI,GAAG,MAAd,SACE,eAACqH,GAAD,CACE9+C,WAAYA,EACZ++C,OArBGvW,UACjB,MAAMqX,QAAcnd,EAAQG,OAAOsI,GAAIlf,iBAAiBjsB,GAAaH,EAAS,eAC9EooC,EAAQz5B,KAAK,gBAAkBqxC,EAAM30C,KAoBvB8zC,SAlBK,IAAM/W,EAAQz5B,KAAK,gBAmBxBy5B,QAASA,kBCvBXl5B,OACd,MAAM,GAAE7D,EAAF,QAAM+8B,EAAN,QAAevF,EAAf,IAAwBtmB,GAAQrN,GAC/B/O,EAAD,CAAa8/C,GAAiBhX,GAAsBpG,EAASx3B,GAYnE,OACE,eAACk3B,GAAD,CACEl3B,GAAIoG,GAAO8B,eACX1C,OAAQxF,EACR+D,KAAMG,GAAK2C,IACXH,MAAO5R,EAAWkS,gBAClBkK,IAAKA,GAAO9K,GAAOgD,gBALrB,SAOE,eAACg7B,GAAA,EAAD,CAAKtgC,UAAU,4BAAf,SACE,eAACggC,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,eAAC5H,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,OAA1B,SACE,gBAACoO,GAAA,EAAK7N,KAAN,WACE,eAAC6N,GAAA,EAAKrO,MAAN,UAAa32B,EAAE,gCACf,eAACglC,GAAA,EAAKuY,KAAN,CAAWnI,GAAG,MAAd,SACE,eAACqH,GAAD,CACE9+C,WAAYA,EACZ++C,OA1BGvW,UACjB,MAAMqX,QAAcnd,EAAQG,OAC1BsI,GAAIjf,iBAAiBlsB,GACrBH,EAAS,eAEXigD,EAAcD,IAsBAb,SAnBK,IAAM/W,EAAQz5B,KAAK,gBAoBxBy5B,QAASA,kB,8BC/CZ,OAA0B,kCCA1B,OAA0B,mCCA1B,OAA0B,uCCA1B,OAA0B,iCCA1B,OAA0B,kCCA1B,OAA0B,kCCA1B,OAA0B,iCCiClC,IAAK8X,I,SAAAA,O,aAAAA,I,eAAAA,I,iBAAAA,I,2BAAAA,I,2BAAAA,I,iBAAAA,I,iBAAAA,I,iBAAAA,I,uBAAAA,I,iBAAAA,I,cAAAA,I,gBAAAA,I,gBAAAA,I,sBAAAA,I,qBAAAA,Q,KAkBZ,MAAMC,GAA8C,CAClD,IAAOD,GAASE,IAChB,IAAOF,GAASG,KAChB,KAAQH,GAASG,KACjB,IAAOH,GAASI,WAChB,KAAQJ,GAASI,WACjB,IAAOJ,GAASK,WAChB,KAAML,GAASK,WACf,IAAOL,GAASK,WAChB,IAAOL,GAASK,WAChB,GAAML,GAASK,WACf,IAAOL,GAASK,WAChB,IAAOL,GAASM,MAChB,IAAON,GAASM,MAChB,IAAON,GAASM,MAChB,IAAON,GAASO,MAChB,IAAOP,GAASO,MAChB,KAAQP,GAASO,MACjB,IAAOP,GAASO,MAChB,KAAQP,GAASO,MACjB,IAAOP,GAASQ,SAChB,IAAOR,GAASS,MAChB,IAAOT,GAASU,IAChB,IAAOV,GAASU,IAChB,KAAQV,GAASW,KACjB,IAAOX,GAASW,KAChB,IAAOX,GAASH,KAChB,IAAOG,GAASY,QAOlB,MAAMC,GAA4C,CAChD,kBAAmBb,GAASE,IAC5B,qBAAsBF,GAASG,KAC/B,0EAA2EH,GAASG,KACpF,gCAAiCH,GAASI,WAC1C,4EAA6EJ,GAASI,WACtF,kBAAmBJ,GAASK,WAC5B,8BAA+BL,GAASK,WACxC,sBAAuBL,GAASK,WAChC,oBAAqBL,GAASK,WAC9B,mBAAoBL,GAASK,WAC7B,gBAAiBL,GAASQ,SAC1B,WAAYR,GAASU,IACrB,YAAaV,GAASW,KACtB,aAAcX,GAASH,KACvB,2BAA4BG,GAASY,QAGhC,SAASE,GAAcvhB,GAC5B,MAAMwhB,EAAMxhB,EAASyhB,YAAY,KACjC,GAAID,EAAM,EACR,OAAOf,GAAStpC,MAElB,MAAMuqC,EAAY1hB,EAASgT,UAAUwO,EAAM,GAAGtiB,oBACxCr3B,EAAO64C,GAAWgB,GACxB,YAAgBzjD,IAAT4J,EAAqB44C,GAAS9zC,QAAU9E,EAG1C,SAAS85C,GAAwBC,GACtC,IAAKA,EACH,OAAOnB,GAAS9zC,QAGlB,MAAMk1C,EAAYP,GAAUM,GAC5B,YAAkB3jD,IAAd4jD,EACKA,EAELD,EAASE,WAAW,UACfrB,GAASO,MACTY,EAASE,WAAW,UACpBrB,GAASM,MACTa,EAASE,WAAW,UACpBrB,GAASS,MAETT,GAAS9zC,QAGb,SAASo1C,GAAal6C,GAC3B,OAAQA,GACN,KAAK44C,GAASE,IACZ,MCvIS,68ZDwIX,KAAKF,GAASG,KACZ,OAAOoB,GACT,KAAKvB,GAASwB,MACZ,ME3IS,y7RF4IX,KAAKxB,GAASI,WACZ,MG7IS,6wZH8IX,KAAKJ,GAASK,WACZ,OAAOoB,GACT,KAAKzB,GAASM,MACZ,OAAOoB,GACT,KAAK1B,GAAStpC,MACZ,MInJS,yyGJoJX,KAAKspC,GAASO,MACZ,OAAOoB,GACT,KAAK3B,GAASQ,SACZ,MKvJS,ytVLwJX,KAAKR,GAASU,IACZ,MMzJS,63SN0JX,KAAKV,GAASW,KACZ,OAAOiB,GACT,KAAK5B,GAASH,KACZ,MO7JS,6gaP8JX,KAAKG,GAASY,OACZ,OAAOiB,GACT,KAAK7B,GAASS,MACZ,OAAOqB,GACT,KAAK9B,GAAS9zC,QACd,QACE,MQpKS,0vQCQR,MAAM61C,GAAyC/yC,GAElD,sBAAKC,UAAWqO,KAAO0kC,UAAW7yC,MAAO,IAAIu1B,GAAWI,KAAKC,WAAY5oC,MAAO,OAAQg/C,gBAAiBzX,GAAiB1iB,MAAO0iB,IAAjI,SACK10B,EAAMhR,WCsBR,MAAMikD,GAA0BjzC,IACrC,MAAM,MACJlH,EADI,QAEJ2iB,EAFI,SAGJpJ,EAHI,SAIJmwB,EAJI,QAKJz1B,EALI,WAMJwhC,EANI,UAOJ2E,EAPI,UAQJC,EARI,eASJ3pC,GACExJ,EAaJ,OACE,qCACE,uBAAKC,UAAWqO,KAAO47B,OAAvB,UAEE,uBAAKjqC,UAAWqO,KAAO8kC,MAAOrmC,QAASA,EAAvC,UAGsB,SAAjB0O,EAAQrjB,MAAmB,eAACi7C,GAAD,CAAoBl7C,KAAMsjB,EAASy3B,UAAWA,IACxD,gBAAjBz3B,EAAQrjB,MAA0B,eAACk7C,GAAD,CAA2BC,YAAa93B,KACzE+mB,GACA,wBACEviC,UAAW0M,GAAQ,iBAAkB2B,KAAOklC,UAC5CzmC,QAAS9e,IACPA,EAAEC,kBACFqgD,GAAYl8B,IAJhB,UAOE,oBAAGpS,UAAW0M,GAAQtM,GAAKozC,YAAa,eAAgBtzC,MAAO,CAAE6R,MAAO,WACxE,oBAAG/R,UAAW0M,GAAQ0F,EAAWhS,GAAKqzC,YAAcrzC,GAAKszC,OAAQ,uBAKvER,GACA,sBAAKlzC,UAAWqO,KAAO47B,OAAQ/pC,MAAO,CAAC+rC,aAAa,IAApD,SACE,eAAC5Q,GAAA,EAAD,CAAO3Q,QAAQ,YAAf,SAnCa,SAAjBlP,EAAQrjB,MACFU,EAAQ,GAAGlG,WAEf4W,GAAkBiS,EAAQ1uB,UAAY0uB,EAAQ1uB,SAASic,KAAKtb,OAAS,EpFlCxE,SAAoBub,EAAmBO,GAC5C,OAAOA,EAAeJ,QAAQH,EAAIA,KAAKC,aAAa/W,KoFkCvCyhD,CAAWn4B,EAAQ1uB,SAASic,KAAK,GAAIQ,GAGzClW,EAAE,8BAyCP+/C,GAAsBrzC,IAC1B,MAAM,KAAE7H,EAAF,UAAQ+6C,GAAclzC,EAkB5B,OAAO,qCACL,uBAAKC,UAAWqO,KAAOyN,SAAvB,WARK5jB,EAAK07C,aAAgB17C,EAAKg6C,cAG7B,EAFQ,8BASN,eAACY,GAAD,wCAIJ,sBACEe,IAAK37C,EAAK07C,aAAevB,GAAaJ,GAAwB/5C,EAAKg6C,WACnE4B,IAAI,GACJC,OAAQ/lD,IAAOA,EAAEC,kBAAmBD,EAAEyC,kBACtCujD,YAAahmD,IAAOA,EAAEC,kBAAmBD,EAAEyC,kBAC3CuP,UAAWqO,KAAO4lC,OAClB7J,WAAW,IAEb,wBAAMpqC,UAAWqO,KAAO6lC,SAAxB,UACGh8C,EAAK6Q,KAAKtb,OAAS,GAClB,wBACEuS,UAAU,WACV4C,MAAOvP,EAAE,8BAA+B,CAAE8gD,MAAOj8C,EAAK6Q,KAAKtb,OAAOkF,aAFpE,UAGE,oBAAGqN,UAAW0M,GAAQtM,GAAKozC,YAAa,eAAgBtzC,MAAO,CAAE6R,MAAO,WACxE,oBAAG/R,UAAW0M,GAAQtM,GAAKg0C,YAAa,iBACxC,oBAAGp0C,UAAU,cAAb,SAA4B9H,EAAK6Q,KAAKtb,YAGzCyK,EAAKm8C,eACJ,wBAAMr0C,UAAU,WAAW4C,MAAOvP,EAAE,iCAApC,UACE,oBAAG2M,UAAW0M,GAAQtM,GAAKozC,YAAa,eAAgBtzC,MAAO,CAAE6R,MAAO,WACxE,oBAAG/R,UAAW0M,GAAQtM,GAAKg0C,YAAa,iBACxC,oBAAGp0C,UAAW0M,GAAQtM,GAAKk0C,aAAc,uBAK/C,sBAAKt0C,UAAWqO,KAAOkmC,WAAvB,SACGr8C,EAAKg6C,UACJ,uBAAMlyC,UAAU,WAAW4C,MAAO,GAAIkK,QAnDnB9e,IACvBA,EAAEC,kBACEglD,GACFA,EAAU/6C,IAgDR,SACE,oBAAG8H,UAAW0M,GAAQtM,GAAKo0C,gBAAiB,eAAgBt0C,MAAO,CAAE6R,MAAO0iB,gBAWhF4e,GAA6BtzC,IACjC,MAAM,YAAEuzC,GAAgBvzC,EAClBgxB,OArJmBxiC,KADTitB,EAsJO83B,GArJXxmD,SACH,GAEF0uB,EAAQ1uB,SAASgvB,SAASlP,QAAO5e,GAAgB,SAAXA,EAAEmK,OAJjD,IAAkBqjB,EAuJhB,MAAMi5B,EAAe1jB,EAAMtjC,OAC3B,GAAsB,IAAlBgnD,EACF,OACE,qCACE,uBAAKv0C,MAAO,CAACxP,OAAQ,OAAQwiC,QAAS,OACpCC,cAAe,SACfiI,eAAgB,UAFlB,UAGA,uBAAMl7B,MAAO,IAAIu1B,GAAWI,KAAKD,OAAjC,SAA0CviC,EAAE,sCAC1C,uBAAM6M,MAAO,IAAIu1B,GAAWI,KAAKD,OAAjC,SAA0CviC,EAAE,2CAI7C,CACL,MAAMqhD,EAAY3jB,EAAMuL,MAAM,EAAG,GACjC,OACE,qCACE,uBAAKt8B,UAAWqO,KAAOyN,SAAvB,UACC44B,EAAU/pC,KAAI,CAAC6Q,EAAS3iB,IAErB,sBAAiBmH,UAAWqO,KAAOsmC,iBAAnC,SACE,sBACEd,IAAKr4B,EAAQo4B,aAAevB,GAAaJ,GAAwBz2B,EAAQ02B,WACzE4B,IAAI,GACJC,OAAQ/lD,IACNA,EAAEC,kBACFD,EAAEyC,kBAEJujD,YAAahmD,IACXA,EAAEC,kBACFD,EAAEyC,kBAEJuP,UAAWqO,KAAO4lC,OAClB7J,WAAW,KAbLvxC,KAiBb47C,EAAgB,GACf,sBAAKz0C,UAAWqO,KAAOsmC,iBAAvB,SACE,wBAAMz0C,MAAO,IAAIu1B,GAAW7yB,MAAMqzB,aAAlC,cAAkDwe,EAAgB,cC9LjEG,GAAqB70C,IAChC,MAAM,MAAE6C,EAAF,QAASsW,EAAT,OAAkB27B,GAAW90C,GAC5BooB,EAAQ5O,GAAW2O,GAASnoB,GAC7B+0C,EAAc,IAAMv7B,IAE1B,OACE,gBAAC,KAAD,CAAO4P,KAAMhB,EAAQiB,OAAQ0rB,EAA7B,UACE,eAACjrB,GAAD,UAAcjnB,IACd,eAAC,KAAM4nB,KAAP,UACE,6BAAItR,MAEN,eAACyQ,GAAD,UACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASgoC,EAAnC,SACGD,GAAUxhD,EAAE,sBCrBV0hD,GAAuBh1C,GAEhC,eAAC60C,GAAD,CACEhyC,MAAOvP,EAAE,wBACT6lB,QAAS7lB,EAAE,6BACP0M,I,gEC2BTlT,IAAUmoD,OAAO,qBAAuBnoD,IAAUooD,QAAQC,WAAY,CACrEC,eAAgB,CACdC,SAAU,SAAU9mD,EAAWie,GAC7B,GAAIA,EAAQyE,SACV,OAAO1iB,EAET,IAAI+mD,EAAMxoD,IAAEyoD,WACRC,EAAOjnD,EAAKknD,MAAMlnD,EAAKuK,OAS3B,OAPK0T,EAAQkpC,gBAAgBjS,KAAK+R,EAAKp9C,MAKrCk9C,EAAIK,YAAY9nD,KAAM,CAACU,KAJvBinD,EAAK7+C,MAAQ,qBACb2+C,EAAIM,WAAW/nD,KAAM,CAACU,KAKjB+mD,EAAI1hB,cA2BV,MAAMiiB,WAA8BjmC,IAAMC,cAG/C3T,YAAY8D,GACV0oB,MAAM1oB,GADuC,KAF/C2T,SAE+C,EAG7C9lB,KAAK8lB,IAAM/D,IAAMkmC,YAGnB/hB,oBACE,MAAM3gB,EAASvlB,KAAK8lB,IAAI5b,QACpBqb,GACFvlB,KAAKkoD,WAAW3iC,GAGpB6gB,mBAAmBC,GACbA,EAASjjB,WAAapjB,KAAKmS,MAAMiR,UACnCpjB,KAAK8lB,IAAI5b,SAAYjL,IAAEe,KAAK8lB,IAAI5b,SAAiBo9C,WAAWtnD,KAAKmS,MAAMiR,SAAW,UAAY,WAIlG8kC,WAAW3iC,GACT,MAAM,IACJwD,EADI,KAEJroB,EAFI,QAIJynD,EAJI,WAKJC,EALI,UAMJC,EANI,OAOJC,EAPI,SAQJC,GACEvoD,KAAKmS,MAERlT,IAAEsmB,GAAgB+hC,WAAW,CAC5Bv+B,MACA+C,SAAU,OACV08B,UAAW,OACXC,SAAU/nD,EACVgoD,OAAQ,SAAUtoD,EAAQM,GACxB,IAAIioD,EAAQ1pD,IAAEe,MAId,OAHAskC,GAAIhX,uBAAuBzC,MAAK,KAC9BnqB,EAAKkoD,MAAQD,EAAMrB,WAAW,OAAQ5mD,OAEjC,GAETmoD,SAAU,CAACzoD,EAAQM,KACjB0nD,GAAcA,EAAW1nD,MAK7BzB,IAAEsmB,GACC0V,KAAK,kBAAkB,SAAU76B,EAAGM,GACnC2nD,GAAaA,EAAU3nD,MAExBu6B,KAAK,kBAAkB,SAAU76B,EAAGM,GACnCynD,GAAWA,EAAQznD,MAEpBu6B,KAAK,oBAAoB,SAAU76B,EAAGM,GACrC6nD,GAAYA,EAAS7nD,MAEtBu6B,KAAK,kBAAkB,SAAU76B,EAAGM,GACnC4nD,GAAUA,EAAO5nD,MAIvB6f,SACE,MAAM,MAAEjO,EAAF,OAASw2C,GAAW9oD,KAAKmS,MAC/B,OACE,uBAAK2T,IAAK9lB,KAAK8lB,IAAK1T,UAAW0M,GAAQ2B,KAAOsoC,gBAAiBtoC,KAAOuoC,aAAc12C,MAAOA,EAA3F,UACE,oBAAGF,UAAWI,GAAKy2C,WAAY32C,MAAO,CAAEy0B,SAAU,MACjD+hB,GAAUrjD,EAAE,mCACb,wBAAO8E,KAAK,OAAO0D,KAAK,UAAUi7C,UAAQ,QAc3C,MAAMC,GAAgBh3C,IAC3B,MAAM,IACJ4W,EADI,KAEJroB,EAFI,MAGJ4R,EAHI,YAIJ82C,EAJI,OAKJN,EALI,QAMJO,GACEl3C,GACGm3C,EAAWC,GAAgBhgD,oBAAS,IACpCs/C,EAAUW,GAAejgD,mBAAS,IAClCkgD,EAAQC,GAAangD,oBAAS,GAiBrC,OACE,uBAAK+I,MAAOA,EAAZ,UACE,eAAC,GAAD,CACEyW,IAAKA,EACLroB,KAAMA,EACN4R,MAAOg3C,EAAY3sC,OAAOC,OAAO,CAAE0oB,QAAS,QAAU8jB,GAAeA,EACrEtgD,MAAO2gD,EAAShkD,EAAE,sCAAmC9E,EACrDmoD,OAAQA,EACRX,QAxBc,KAClBoB,GAAa,GACbG,GAAU,IAuBNtB,WArBkBhoD,IACtBopD,EAAYppD,EAAEupD,OAASvpD,EAAE4jB,MAAQ,MAqB7BqkC,UAnBiBjoD,IACrBmpD,GAAa,GACbF,EAAQjpD,EAAEyD,SAkBNykD,OAhBa,KACjBiB,GAAa,GACbG,GAAU,MAgBPJ,GAAa,uBAAKl3C,UAAWqO,KAAOuoC,YAAa12C,MAAO82C,EAA3C,UACZ,eAACQ,GAAA,EAAD,CAAaC,IAAK,IAAKC,IAAKjB,EAAUv2C,MAAO,CAAEhT,MAAO,OACtD,gCACGmG,EAAE,oCAAsC,KAAOojD,EAAStN,QAAQ,GAAK,aAgBnEwO,GAA0B53C,IACrC,MAAM,aACJya,EADI,WAEJxpB,EAFI,SAGJuiC,EAHI,MAIJrzB,EAJI,OAKJw2C,EALI,YAMJM,EANI,QAOJC,GACEl3C,EAEEzR,EAAO,CACXqN,IAAK6e,EACLxpB,aACAuiC,YAKF,OAHIrB,GAAI/a,QACN7oB,EAAK6oB,MAAQ+a,GAAI/a,OAGjB,eAAC4/B,GAAD,CACEpgC,IAAKub,GAAIlb,oBACT1oB,KAAMA,EACN4R,MAAOA,EACPw2C,OAAQA,EACRM,YAAaA,EACbC,QAASA,KAcFW,GAAoB73C,IAC/B,MAAM,WACJub,EADI,gBAEJu8B,EAFI,gBAGJC,EAHI,MAIJ53C,EAJI,OAKJw2C,EALI,YAMJM,EANI,QAOJC,GACEl3C,EAEEzR,EAAO,CACXo5B,YAAapM,EACby8B,iBAAkBF,EAClBG,iBAAkBF,GAKpB,OAHI5lB,GAAI/a,QACN7oB,EAAK6oB,MAAQ+a,GAAI/a,OAGjB,eAAC4/B,GAAD,CACEpgC,IAAKub,GAAIjb,cACT3oB,KAAMA,EACN4R,MAAOA,EACPw2C,OAAQA,EACRM,YAAaA,EACbC,QAASA,KAcFgB,GAAwBl4C,IACnC,MAAM,KACJgJ,EADI,WAEJgU,EAFI,gBAGJ+6B,EAHI,MAIJ53C,EAJI,OAKJw2C,EALI,YAMJM,EANI,QAOJC,GACEl3C,EAEEzR,EAAO,CACX6oB,MAAO+a,GAAI/a,MACXpO,KAAM6O,KAAKQ,UAAUrP,GACrBgU,WAAYA,GAAcnF,KAAKQ,UAAU2E,GACzCi7B,iBAAkBF,GAGpB,OACE,eAACf,GAAD,CACEpgC,IAAKub,GAAIhb,kBACT5oB,KAAMA,EACN4R,MAAOA,EACPw2C,OAAQA,EACRM,YAAaA,EACbC,QAASA,K,yBCrUR,MAAMiB,GAAgBn4C,IAC3B,MAAM,SAAEhR,GAAagR,EACrB,OACE,sBAAKC,UAAWqO,KAAO8pC,MAAvB,SACGppD,KCeA,SAASqpD,GAAwBtrD,GACtC,MAAO,CACLkjC,KAAMljC,EAASkjC,KACfS,OAAQ3jC,EAAS2jC,QAAU,GAC3B7tB,MAAO9V,EAAS8V,OAAS,GACzB5G,YAAclP,EAASkE,YAAclE,EAASkE,WAAWgL,aAAgBlP,EAASkP,aAAe,GACjGu0B,YAAazjC,EAASyjC,aAAe,GACrCC,YAAa1jC,EAAS0jC,aAAe,GACrC7Z,IAAK7pB,EAAS6pB,KAAO,GACrBga,YAAa7jC,EAAS6jC,aAAe,QACrCC,WAAY9jC,EAAS8jC,YAAc,GACnCC,aAAc/jC,EAAS+jC,cAAgB,GACvCC,OAAQhkC,EAASgkC,QAAU,GAC3BC,MAAOjkC,EAASikC,OAAS,GACzBj9B,OAAQhH,EAASgH,OACjBo8B,UAAWpjC,EAASojC,UACpBnnB,KAAMjc,EAASic,KACfgU,WAAYjwB,EAASiwB,WACrBs7B,WAAY,GACZC,SAAU,IClCP,MAAMC,GAAcx4C,IACzB,MAAM,KAAEE,EAAF,MAAQ2C,EAAR,QAAe41C,EAAf,SAAwBzpD,GAAagR,EAC3C,OACE,gBAACs4B,GAAA,EAAKvO,OAAN,WACG0uB,GAAW,sBAAKt4C,MAAO,CAAEgiC,MAAO,SAArB,SAAiCsW,IAC7C,sBAAIx4C,UAAU,aAAd,UACE,oBAAGA,UAAWC,IAAS,KACtB2C,KAEF7T,MCFM0pD,GAAY14C,IACvB,MAAM,KAACE,EAAD,MAAO2C,EAAP,UAAc5C,EAAd,MAAyBE,EAAzB,SAAgCnR,EAAhC,QAA0CypD,GAAWz4C,EChBtD,IAAyB24C,EDkB9B,MAAMC,ECjBO,QADiBD,EDiBA3pD,KChBA,IAAT2pD,KAEjB7oB,MAAM+oB,QAAQF,KACRA,EAAK75C,MAAKlI,GAAW,OAANA,IAAoB,IAANA,IDcc,CAACorC,WAAY,QAAKxzC,EAEvE,OACE,gBAAC8pC,GAAA,EAAD,CAAMr4B,UAAW0M,GAAQ,kBAAmB1M,GAAYE,MAAOA,EAA/D,UACE,eAACq4C,GAAD,CAAY31C,MAAOA,EAAO3C,KAAMA,EAAMu4C,QAASA,IAC/C,eAACngB,GAAA,EAAK7N,KAAN,CAAWtqB,MAAOy4C,EAAlB,SACG5pD,Q,yBENF,MAAM8pD,GAAiB94C,IAC5B,MAAM,aACJqiC,EAAe,EADX,aAEJC,EAFI,MAGJ3wB,EAHI,MAIJza,EAJI,MAKJP,EALI,SAMJ6rC,EANI,UAOJxB,EAPI,MAQJ7gC,EARI,SASJ6T,GACEhU,EAEE7D,EAAKskC,GAAa,SAClBU,EAAaxqC,EAAQ,8BAAiCqqC,EAAY,4BAA8B,mBACtG,OACE,uBAAK/gC,UAAU,iBAAiBE,MAAOA,EAAvC,UACE,wBAAOw2B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,uBAAK1R,UAAY,UAASqiC,GAAiB,GAAKD,KAAiB/zB,KAAOyqC,kBAAxE,UACE,eAACC,GAAD,CACE78C,GAAIA,EACJqmC,SAAUA,EACVtrC,MAAOA,EACP8c,SAAUA,EACVmtB,WAAYA,IAEbxqC,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,WAc7BqiD,GAAYh5C,IACvB,MAAM,GACJ7D,EADI,SAEJqmC,EAFI,MAGJtrC,EAHI,SAIJ8c,EAJI,WAKJmtB,EAAa,oBACXnhC,EAEJ,OACE,sBAAKC,UAAY,cAAaqO,KAAO2qC,gBAArC,SACE,yBAAOh5C,UAAU,mBAAjB,UACE,wBACE9D,GAAIA,EACJ/D,KAAK,WACL6Y,SAAUuxB,EACVviC,UAAWkhC,EACX3tB,QAAStc,EACT8c,SAAUhc,uBAAY/J,GAAK+lB,GAAYA,EAAS/lB,EAAEkiB,cAAcqD,UAAU,CAACQ,MAE7E,uBAAM/T,UAAU,oBATlB,a,yBC5DC,MAAMi5C,GAAkBl5C,IAC7B,MAAM,SAAEm5C,EAAF,SAAYloC,EAAZ,QAAsBlE,GAAY/M,EACxC,OACE,eAAC0qB,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QAASA,EAASkE,SAAUA,EAAUhR,UAAW0M,GAAQ2B,KAAO8qC,WAAYD,EAAW7qC,KAAO6qC,SAAW,IAAhI,SACE,oBAAGl5C,UAAWI,GAAKu5B,UCHZyf,GAAiBr5C,IAC5B,MAAM,KAAEqO,EAAF,gBAAQirC,EAAR,SAAyB9W,GAAaxiC,EACtCw5B,EAAsBxhC,uBAC1B,IAAMshD,EAAgBjrC,IACtB,CAACirC,EAAiBjrC,IAEdnB,EAAOmB,EAAK7F,UAElB,OACE,iCACE,oBAAGvI,UAAWoO,EAAKzG,UAAWzH,MAAO,CAAE+6B,aAAc,WACrD,eAACzrB,GAAD,CAAUtX,KAAM+U,EAAK/U,KAAM1E,MAAOyZ,EAAKzZ,MAAO0M,MAAO,IAAKu1B,GAAWxoB,KAAK0oB,OAAQQ,mBAAoB,aAAtG,SAAsH/nB,EAAKvS,QACzH0mC,GACA,eAAC11B,GAAD,CAAYC,QAASysB,EAArB,SACE,oBAAGv5B,UAAWI,GAAK42B,YAAa92B,MAAO,IAAKu1B,GAAWW,SAAST,OAAQ6W,YAAa,iBCZlF8M,GAAsBv5C,IACjC,MAAM,WAAEgd,EAAF,cAAcw8B,EAAd,SAA6BhX,GAAaxiC,GAEzCy5C,EAAqBC,GAA0BtiD,mBAASoL,GAAsBkF,OAc/EiyC,EAAiB7jC,mBAAQ,KAC7B,MAAM8jC,EAAyBvrC,IAC7B,IAAIvV,EAAQkkB,EAAWjG,QAAQ1I,GAC/B,GAAIvV,EAAQ,EACV,OAEF,MAAM+gD,EAAgB,IAAI78B,GAC1B68B,EAAcpK,OAAO32C,EAAO,GAC5B0gD,EAAcK,IAGhB,OAAO78B,EAAWpS,KAAIqmB,GACpB,eAACooB,GAAD,CAEEhrC,KAAM4iB,EACNqoB,gBAAiBM,EACjBpX,SAAUA,GAHLvR,EAAU90B,QAMlB,CAAC6gB,EAAYw8B,EAAehX,IAE/B,OACE,gBAAC1uB,GAAA,EAAKstB,MAAN,WACE,wBAAOnhC,UAAU,gBAAjB,SAAkC3M,EAAE,yBACpC,gBAAC2sC,GAAA,EAAD,WACG0Z,EAAejsD,OAAS,GAAK,sBAAKyS,MAAO,CAAE4hC,QAAS,SAAvB,SAAmC4X,IACtC,IAA1BA,EAAejsD,QAAgB,eAACyuC,GAAA,EAAD,CAAOxR,QAAQ,YAAYxqB,MAAO,IAAIu1B,GAAWI,KAAKF,QAAtD,SAAgEtiC,EAAE,+BAChGkvC,GAAY,qBAAGriC,MAAO,IAAIu1B,GAAWI,KAAKH,OAA9B,UAAuCriC,EAAE,oCAAzC,QACZkvC,GACA,gBAACjC,GAAA,EAAD,WACE,eAACN,GAAA,EAAD,CAAKC,GAAI,EAAG//B,MAAO,CAAE6hC,WAAY,EAAG8X,cAAe,GAAnD,SACE,gBAAChmC,GAAA,EAAKytB,QAAN,CACEmH,GAAG,SACH5sC,KAAK,gBACL5E,MAAOuiD,EACPzlC,SAAU/lB,GAAKyrD,EAAuBzrD,EAAEkiB,cAAcjZ,OAJxD,UAME,yBAAQA,MAAOsL,GAAsBkF,MAArC,SAA6CpU,EAAE,mCAC/C,yBAAQ4D,MAAOsL,GAAsBqF,OAArC,SAA8CvU,EAAE,mCAChD,yBAAQ4D,MAAOsL,GAAsB/D,MAArC,SAA6CnL,EAAE,kCAC/C,yBAAQ4D,MAAOsL,GAAsB0F,SAArC,SAAgD5U,EAAE,qCAClD,yBAAQ4D,MAAOsL,GAAsBuF,aAArC,SAAoDzU,EAAE,iDAG1D,eAAC2sC,GAAA,EAAD,CAAKC,GAAI,EAAG//B,MAAO,CAAE6hC,WAAY,EAAG8X,cAAe,GAAnD,SACGL,IAAwBj3C,GAAsBkF,OAC7C,eAAC4mC,GAAD,CACEl2C,KAAMqhD,EACNlL,WA5DiBlgC,IACX2O,EAAWruB,MAC7B0iB,GAAKA,EAAElV,KAAOkS,EAAKlS,KAMnB0qC,uBAAoBz/B,KAAK9T,EAAE,4CAF3BkmD,EAAc,IAAIx8B,EAAY3O,mBCjB7B,SAAStF,GAAeC,EAA0CC,GACvE,MAAMnN,EAAOmN,EAAIC,aAAa/W,KACxBgX,EAAYF,EAAInb,QAAUkb,EAAKI,QAAQH,EAAInb,QACjD,GAAIqb,EAAW,CAEb,OADmBJ,GAAeC,EAAMG,GACpB,MAAQrN,EAE5B,OAAOA,EAIX,MAAMi+C,GAKJ79C,YAAY+M,EAA4BD,GAA2C,KAJnF7M,QAIkF,OAHlF8M,SAGkF,OAFlFnN,UAEkF,EAChFjO,KAAKsO,GAAK8M,EAAI9M,GACdtO,KAAKob,IAAMA,EACXpb,KAAKiO,KAAOiN,GAAeC,EAAMC,IAUrC,MAAM+wC,GAA2B,GACpBC,GAAwBj6C,IACnC,MAAM,SAAEqS,EAAF,WAAYk8B,EAAZ,YAAwB/X,EAAxB,aAAqC0jB,EAAeF,IAAmBh6C,GACtEm6C,EAAeC,GAAoBhjD,mBAAsC,IAChF8b,qBAAU,KACRif,GAAItV,mCAAmCnE,MAAK1P,IAC1CoxC,EACEpxC,EAAK0N,KACF7J,QAAO5D,GAAOA,EAAI6B,aAAeovC,EAAannD,SAASkW,EAAI9M,MAC3DyO,KAAI3B,GAAO,IAAI8wC,GAA0B9wC,EAAKD,WAGpD,CAACkxC,IAEJ,MAAM/9C,EAAKskC,GAAa,SAClB4Z,EAAehoC,GAAY8nC,EAAcxrD,MAAKiI,GAAKA,EAAEuF,KAAOkW,EAASlW,KAE3E,OACE,eAAC,KAAD,CACEA,GAAIA,EACJqQ,QAAS2tC,EACT5K,SAAS,OACTl9B,SAAUgoC,EAAe,CAACA,GAAgB,GAC1CrmC,SAAU3E,GAASk/B,EAAWl/B,EAAM,GAAKA,EAAM,GAAGpG,SAAMza,GACxDgoC,YAAaA,K,yBC/BZ,MAAM8jB,GAAWt6C,IACtB,MAAM,IAAEiJ,EAAF,UAAOsxC,EAAP,SAAkB/X,GAAaxiC,EAGrC,OACE,eAACs4B,GAAA,EAAD,CAAMn4B,MAAO,CAACgsC,gBAAiBzX,IAA/B,SACE,gBAAC4D,GAAA,EAAK7N,KAAN,WACE,sBAAKxqB,UAAWqO,KAAOksC,aAAvB,UACEhY,GACA,oBACEviC,UAAW,sBACX8M,QAASwtC,MAIb,wBAAMt6C,UAAWqO,KAAOmsC,SAAUt6C,MAAO,IAAIu1B,GAAWS,SAASF,UAAjE,UACKhtB,EAAIA,IAAIC,aAAa/W,MAAwB6N,EAAMiJ,IAAM,OAE9D,qBAAIhJ,UAAWqO,KAAOosC,YAAtB,SAAoCzxC,EAAIe,iBC3BnC2wC,GAAgB36C,IAC3B,MAAM,SAAEjT,EAAF,KAAYic,EAAZ,aAAkB4xC,EAAlB,gBAAgCC,EAAhC,wBAAiDC,EAAjD,SAA0EtY,GAAaxiC,EAEvF+6C,EAAmBhuD,EAAS2e,SAC5BsvC,EAAWD,IAAqB7vB,GAAiBsG,yBAA2BupB,IAAqB7vB,GAAiBsQ,QAElHyf,EAAWnlC,mBAAQ,IAEhB9M,EAAK4B,KAAI,CAAC3B,EAAKnQ,IACpB,eAACwhD,GAAD,CAEErxC,IAAKA,EACLsxC,UAAW,IAAMM,EAAgB5xC,GACjCu5B,SAAUA,EACV0Y,cAAe,CAAC3wC,EAAOrT,IAAU4jD,EAAwB7xC,EAAKsB,EAAOrT,IAJhE4B,MAOR,CAACkQ,EAAMw5B,IAGV,OACE,eAACkW,GAAD,CACE71C,MAAOvP,EAAE,iBACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OAHtB,SAIE,gBAACpW,GAAA,EAAD,YACI0uB,GAAYwY,GAAY,uCACxB,qBAAI/6C,UAAWqO,KAAO8sC,iBAAtB,SAAyC9nD,EAAE,oBAAoB+nD,gBAC/D,sBAAKl7C,MAAO,CAAE+rC,aAAc,OAA5B,SACE,eAAC+N,GAAD,CACE1L,WAAYqM,EACZpkB,YAAaljC,EAAE,wBACf4mD,aAAclxC,EAAK4B,KAAI3B,GAAOA,EAAIA,IAAI9M,YAI3C8+C,QCvBF,IAAKK,I,SAAAA,K,cAAAA,E,cAAAA,E,cAAAA,E,oBAAAA,E,aAAAA,Q,KAQL,MAAMC,GAAqB,CAChCD,GAAkBE,MAClBF,GAAkBG,MAClBH,GAAkBI,MAClBJ,GAAkBK,SAClBL,GAAkBM,MAEb,SAASC,GAA2BzjD,GACzC,OAAQA,GACN,KAAKkjD,GAAkBE,MACrB,OAAOloD,EAAE,2BACX,KAAKgoD,GAAkBG,MACrB,OAAOnoD,EAAE,2BACX,KAAKgoD,GAAkBI,MACrB,OAAOpoD,EAAE,2BACX,KAAKgoD,GAAkBK,SACrB,OAAOroD,EAAE,8BACX,KAAKgoD,GAAkBM,KACrB,OAAOtoD,EAAE,0BACX,QACE,OAAO8E,GAyBN,MAAM0jD,GACmB,+BAACjqD,EAAqDuG,GAClF,OAAOvG,EAAmB0tC,cAAc1yB,QAAOxT,GAAgBA,EAAajB,OAASA,KC9ElF,MAAM2jD,GAAoB/7C,IAC/B,MAAM,aAAE3G,EAAF,gBAAgB2iD,GAAoBh8C,EACpCE,EAA6B,WAAtB7G,EAAajB,KAAoBiI,GAAK3E,KAAO2E,GAAK2vB,SACzDisB,EAAiC,WAAtB5iD,EAAajB,KAAoBmK,GAAOsE,WAAatE,GAAO+B,aAC7E,OACE,iCACE,gBAACmL,GAAD,CAAUtP,MAAO,CAACy0B,SAAU,GAAIwB,mBAAoB,aAAcj+B,KAAM8jD,EAAUxoD,MAAO4F,EAAa6iD,SAAtG,UACE,oBAAGj8C,UAAWC,IACb,IACA7G,EAAayC,MAAQzC,EAAa6iD,YAEpCF,GACC,eAACtxB,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QAASivC,EAAiB77C,MAAO,CAAC6R,MAAO,MAAOy6B,YAAa,EAAGzK,WAAW,IAAlG,SACE,oBAAG/hC,UAAWI,GAAK42B,oB,yBCtB7B,MAAMklB,GAAiB,IAAIC,KAAWC,OAChCC,GAAmB,IAAIF,KAAWG,aAQjC,SAASC,GAAcC,GAK5B,MAAMC,EAAgCD,EARzB/oD,QAAQ,IAAIipD,OAAO,KAAM,KAAM,QAS5C,MAAMC,EAAST,GAAerkC,MAAM4kC,GAGpC,MAAO,CAACG,OAFSP,GAAiBluC,OAAOwuC,I,yBCgB3C,MAAME,GAAkC98C,IACtC,MAAM,MAACzQ,EAAD,gBAAQysD,GAAmBh8C,EAE3B+8C,EAAsB,KACtBf,GACFA,KAcJ,OACqB,IAAnBh8C,EAAMg9C,SATJ,uBAAK78C,MAAO,CAACgiC,MAAO,SAApB,UACE,eAAC1yB,GAAD,CAAUtX,KAAMoK,GAAOgC,kBAAmB9Q,MAAOlE,EAAMqM,IAAvD,SAA4D,oBAAGqE,UAAWI,GAAKu5B,SAC/E,eAAC9sB,GAAD,CAAYC,QAASgwC,EAAqB58C,MAAO,CAACssC,YAAa,EAAGz6B,MAAO,oBAAzE,SACE,oBAAG/R,UAAWI,GAAK42B,mBAMiB,gCAKxCgmB,GAA0Bj9C,IAC9B,MAAM,MAAEzQ,GAAUyQ,EAsBlB,OACqB,IAAnBA,EAAMg9C,SANJ,sBAAI/8C,UAAU,aAAd,UACG7M,IAAO7D,EAAMshB,OAAO8qB,OAAO,cAD9B,SACsE,mBAAfpsC,EAAM6I,KAA4ByjD,GAA2BtsD,EAAM2tD,eAAiB5pD,EAAE,wCAhB3H,MACpB,MAAM6pD,EAAqB,GAAE5tD,EAAM+iC,iBAAmB,MAAM/iC,EAAMgjC,gBAAkB,KAEpF,OACE,sBAAItyB,UAAU,aAAd,UACE,eAACwP,GAAD,CAAUtX,KAAMoK,GAAOiC,kBAAmB/Q,MAAOlE,EAAMg4B,gBAAvD,SAAyE41B,IACzD,mBAAf5tD,EAAM6I,MAA8B,KAAO9E,EAAE,wBAAyB,CACrE8E,KAAMyjD,GAA2BtsD,EAAM2tD,eACvC9pD,OAAQA,IAAO7D,EAAMshB,OAAO8qB,OAAO,oBAaKyhB,IAS5CC,GAAwBr9C,IAE5B,MAAM,kBAACs9C,EAAD,UAAoBC,GAAav9C,EAEvC,OACE,qCACGs9C,EAAkB5vD,OAAS,GAC1B,iCACE,qBAAGyS,MAAO,IAAIu1B,GAAW/jB,MAAMikB,OAAQsW,aAAc,SAArD,UAAgEqR,EAAhE,OACA,sBAAKp9C,MAAO,CAACssC,YAAa,OAA1B,SACG6Q,EAAkB1yC,KAAIvR,GACrB,eAAC0iD,GAAD,CAEE1iD,aAAcA,GADTA,EAAa6iD,oBAUrBsB,GAA0Bx9C,IACrC,MAAM,MAAEzQ,EAAF,gBAASysD,EAAT,SAA0BgB,EAA1B,QAAoCS,GAAYz9C,EAChD09C,EAAcD,IAAuB,IAAZA,EAE/B,OACE,gBAACnlB,GAAA,EAAD,WACE,gBAACA,GAAA,EAAKvO,OAAN,WACE,eAAC+yB,GAAD,CAAgCvtD,MAAOA,EAAOysD,gBAAiBA,EAAiBgB,SAAUA,GAA2B,cAAfztD,EAAM6I,OAC5G,eAAC6kD,GAAD,CAAwB1tD,MAAOA,EAAOytD,SAAUA,QAEhDU,GACA,gBAACplB,GAAA,EAAK7N,KAAN,WACkB,mBAAfl7B,EAAM6I,MAA6B,eAACulD,GAAD,CAAuBpuD,MAAOA,IAClD,cAAfA,EAAM6I,MAAwB,eAACwlD,GAAD,CAAkBruD,MAAOA,WAWlE,SAASouD,GAAsB39C,GAC7B,MAAM,MAAEzQ,GAAUyQ,EAEZs0C,EAAgBx+B,mBACpB,IAAMvmB,EAAMsuD,WACR,oBAAG19C,MAAO,IAAIu1B,GAAWM,MAAMJ,QAASkoB,wBAAyBtB,GAAcjtD,EAAMsuD,cACrF,oBAAG19C,MAAO,CAAC6R,MAAO,QAAlB,SAA4B1e,EAAE,+CAClC,CAAC/D,EAAMsuD,aAGHE,EAAsBjC,GAAyBkC,wBAAwBzuD,EAAO,UAC9E0uD,EAAwBnC,GAAyBkC,wBAAwBzuD,EAAO,YAEtF,OAAO,uCACL,eAAC8tD,GAAD,CACEE,UAAWjqD,EAAE,6CACbgqD,kBAAmBS,IAErB,sBAAK59C,MAAO,CAAC+rC,aAAc,UAC3B,qBAAG/rC,MAAO,IACLu1B,GAAW/jB,MAAMikB,OACpB1L,UAAW,QACXgiB,aAAc,SAHhB,UAII54C,EAAE,mDAJN,OAKA,sBAAK2M,UAAWqO,KAAO4vC,gBAAiB/9C,MAAO,CAAEssC,YAAa,MAAO/W,GAAWM,MAAMJ,QAAtF,SACG0e,IAEH,sBAAKn0C,MAAO,CAAC+rC,aAAc,UAC3B,eAACmR,GAAD,CACEE,UAAWjqD,EAAE,+CACbgqD,kBAAmBW,OASzB,SAASL,GAAiB59C,GACxB,MAAM,MAAEzQ,GAAUyQ,GAEXm+C,EAAOC,GAAYhnD,qBAK1B,OAJA8b,qBAAU,KACRif,GAAIrN,gBAAgBv1B,EAAMkrC,SAAS/hB,KAAK0lC,KACvC,CAAC7uD,EAAMkrC,UAEH,qCACJ0jB,GACC,eAAC1uC,GAAD,CAAUtX,KAAMoK,GAAOwC,gBAAiBtR,MAAOlE,EAAMkrC,QAArD,SAA+D0jB,EAAMzrB,WAAa,IAAMyrB,EAAMxrB,gBCjJpF3yB,WACd,MAAM,eACJwJ,EADI,SAEJzc,EAFI,aAGJsxD,EAHI,SAIJ7b,EAJI,UAKJoI,EALI,gBAMJwD,EANI,kBAOJkQ,EAPI,cAQJC,GACEv+C,EAEE+6C,EAAmBhuD,EAAS2e,SAC5B3I,EAAYhW,EAASgW,WAAchW,EAASkE,YAAclE,EAASkE,WAAW8R,UAC9Ey7C,EAAgBzD,IAAqB7vB,GAAiBiG,OAAS4pB,IAAqB7vB,GAAiBsG,yBAErG,KACJvB,EADI,OAEJS,EAFI,MAGJ7tB,EAHI,YAIJ5G,EAJI,YAKJu0B,EALI,YAMJC,EANI,IAOJ7Z,EAPI,YAQJga,EARI,WASJC,EATI,aAUJC,EAVI,MAWJE,EAXI,OAYJj9B,EAZI,UAaJo8B,EAbI,KAcJnnB,EAdI,WAeJgU,GACE4tB,EAEE6T,EAAmB1xD,GAAYA,EAASkE,WAExC2pD,EAAgB3xC,IACfA,GAGLmlC,EAAgB,CAAEplC,KAAM,IAAIA,EAAMO,GAAYm1C,OAAOz1C,EAAKO,OAGtDm1C,GAAcxsB,GAAI1gC,KAAKkL,cAC3B,eAACu8C,GAAD,CACEjoC,SAAUqtC,EACVnF,UAAW3W,EACXz1B,QAASwxC,IAMP1D,EAAmB5xC,IACvBmlC,EAAgB,CAAEplC,KAAMA,EAAK6D,QAAO+xC,GAAKA,IAAM31C,OAG3C6xC,EAA0B,CAAC7xC,EAAkBsB,EAAerT,KAChE,MAAM2nD,EAAS51C,EAAIqB,eAAeC,EAAOrT,GACnC4nD,EAAU91C,EAAK4B,KAAIg0C,GAAKA,IAAM31C,EAAM41C,EAASD,IACnDxQ,EAAgB,CAAEplC,KAAM81C,KAMpBC,EAAiB,IAEnB,eAACjc,GAAD,CACEhnC,KAAK,WACLumC,aAAc,EACd1wB,MAAOre,EAAE,qBACT4D,MAAO64B,GAAwBhjC,EAAS2e,UACxC82B,UAAQ,IAKRwc,EAAgB,KACpB,MACMC,EAAwBlyD,EAAS4jC,SAAW5jC,EAAS4jC,QAAU,GADtCA,EAEL5jC,EAAS4jC,QAFgB,OAASjB,GAAQiB,EAAS,IAGzEr9B,EAAE,8BAHyBq9B,MAK/B,OACE,eAACmS,GAAD,CACEhnC,KAAK,UACLumC,aAAc,EACd1wB,MAAOre,EAAE,oBACT4D,MAAO+nD,EACPzc,UAAQ,KAoCR0c,EAAsB,IAExB,eAACpc,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,kBACTwI,KAAK,QACL5E,MAAO2L,EACPmR,SAAUnR,GAASurC,EAAgB,CAAEvrC,UACrC2/B,SAAUA,GAAYgc,EACtB7nD,MAAOi0C,EAAU0N,aAKjB6G,EAA4B,IAE9B,eAACnc,GAAD,CACEX,aAAc,EACd1wB,MAAOre,EAAE,wBACTwI,KAAK,cACL5E,MAAO+E,EACP+X,SAAU/X,GAAemyC,EAAgB,CAAEnyC,gBAC3CumC,SAAUA,GAAYgc,EACtBtb,KAAM,IA2KNkc,EAAe,IAEjB,eAAC7c,GAAD,CACEF,aAAc,EACd1wB,MAAOre,EAAE,mBACTwI,KAAK,SACL5E,MAAOnD,EACPigB,SAAUjgB,GAAUq6C,EAAgB,CAAEr6C,OAAQA,IAC9CyuC,SAAUA,EACVh2B,QAAS,CACP,CAAEtV,MAAO,OAAQ2L,MAAOvP,EAAE,yBAC1B,CAAE4D,MAAO,cAAe2L,MAAOvP,EAAE,gCACjC,CAAE4D,MAAO,OAAQ2L,MAAOvP,EAAE,4BAM5B+rD,EAAkB,IAEpB,eAACvG,GAAD,CACEzW,aAAc,EACdG,SAAUA,EACV7wB,MAAOre,EAAE,sBAAwB,IACjC4D,MAAOi5B,EACPnc,SAAUmc,GAAaie,EAAgB,CAAEje,gBAKzCmvB,EAAmB,IAErB,eAAC5G,GAAD,CACE71C,MAAOvP,EAAE,uBACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OAHtB,SAIE,eAACpW,GAAA,EAAD,UACE,eAACylC,GAAD,CACEv8B,WAAYA,EACZw8B,cAAgBK,GAAkBzL,EAAgB,CAACpxB,WAAY68B,IAC/DrX,SAAUA,QAoBd+c,EAAa,IAEf,eAAC5E,GAAD,CACE5tD,SAAUA,EACVic,KAAMA,EACN4xC,aAAcA,EACdC,gBAAiBA,EACjBC,wBAAyBA,EACzBtY,SAAUA,IAkHhB,OAAQuY,GACN,KAAK7vB,GAAiBs0B,IACpB,OA7GA,uCACE,eAAC9G,GAAD,CACE71C,MAAOvP,EAAE,0BACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OACpBuuB,QAASkG,EAJX,SAME,gBAAC7qC,GAAA,EAAD,WACGirC,IA7KPvc,EACI,eAACJ,GAAD,CAAYjmC,GAAG,WAAWkmC,aAAc,EAAG1wB,MAAOre,EAAE,gBAApD,SACE,oBACE0Z,KAAM4J,EACNxD,OAAO,SACPqsC,IAAI,sBACJt/C,MAAO,CACL6hC,WAAY,EACZ8X,cAAe,EACf3mB,QAAS,gBAPb,SASEvc,MAGJ,eAACksB,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,gBACTwI,KAAK,MACL5E,MAAO0f,EACP5C,SAAU4C,GAAOw3B,EAAgB,CAAEx3B,QACnC4rB,SAAUA,EACV7rC,MAAOi0C,EAAU2N,WA0JhB2G,IACAC,IACAE,SAGJC,OA+FL,KAAKp0B,GAAiBw0B,KACpB,OA1FF,uCACE,eAAChH,GAAD,CACE71C,MAAOvP,EAAE,0BACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OACpBuuB,QAASkG,EAJX,SAKE,gBAAC7qC,GAAA,EAAD,WACGirC,IApKL,eAACxc,GAAD,CACEF,aAAc,EACd1wB,MAAOre,EAAE,wBACTwI,KAAK,eACL5E,MAAO05B,EACP5c,SAAU4c,GAAewd,EAAgB,CAAExd,gBAC3C4R,SAAUA,EACVh2B,QAAS,CACP,CAAEtV,MAAO,QAAS2L,MAAO,iBAQ7B,eAAC0/B,GAAD,CACEF,aAAc,EACd1wB,MAAOre,EAAE,uBACTwI,KAAK,cACL5E,MAAO25B,EACP7c,SAAU6c,GAAcud,EAAgB,CAAEvd,eAC1C2R,SAAUA,EACVh2B,QAAS,CACP,CAAEtV,MAAO,gDAAiD2L,MAAO,iBACjE,CAAE3L,MAAO,yBAA0B2L,MAAO,oBAG1C,CAAE3L,MAAO,qBAAsB2L,MAAO,gBACtC,CAAE3L,MAAO,uBAAqB2L,MAAO,qBAQzC,eAACigC,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,yBACTwI,KAAK,gBACL5E,MAAO45B,EACP9c,SAAU8c,GAAgBsd,EAAgB,CAAEtd,iBAC5C0R,SAAUA,IA8HP0c,IAvHL,eAACpc,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,kBACTwI,KAAK,QACL5E,MAAO85B,EACPhd,SAAUgd,GAASod,EAAgB,CAAEpd,UACrCwR,SAAUA,IAmHP2c,IACAE,SAGJC,OAyEH,KAAKp0B,GAAiBsQ,QACpB,OArEF,uCACE,eAACkd,GAAD,CACE71C,MAAOvP,EAAE,0BACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OACpBuuB,QAASkG,EAJX,SAKE,gBAAC7qC,GAAA,EAAD,WACGirC,IACAC,KACEX,GApSP,eAACvb,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,mBACTwI,KAAK,SACL5E,MAAOw5B,EACP1c,SAAU0c,GAAU0d,EAAgB,CAAE1d,WACtC8R,SAAUA,IA+RP4c,IACAC,SAlFFhB,EAIH,eAACb,GAAD,CACEjuD,MAAO8uD,EACPrB,UAAU,EACVS,SAAS,IANJ,+BAqFN6B,IACAC,OAsDH,KAAKr0B,GAAiBy0B,QACpB,OAlDF,uCACE,eAACjH,GAAD,CACE71C,MAAOvP,EAAE,0BACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OACpBuuB,QAASkG,EAJX,SAKE,gBAAC7qC,GAAA,EAAD,WACGirC,IAvQL,eAACjc,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,wBACTwI,KAAK,cACL5E,MAAOs5B,EACPxc,SAAUwc,GAAe4d,EAAgB,CAAE5d,gBAC3CgS,SAAUA,IAOZ,eAACM,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,wBACTwI,KAAK,eACL5E,MAAOu5B,EACPzc,SAAUyc,GAAe2d,EAAgB,CAAE3d,gBAC3C+R,SAAUA,IAuPP0c,IACAC,IACAE,SAGJC,OAoCH,KAAKp0B,GAAiBsG,wBACtB,KAAKtG,GAAiBiG,MACpB,OAjCF,uCACA,eAACunB,GAAD,CACE71C,MAAOvP,EAAE,0BACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OACpBuuB,QAASkG,EAJX,SAKE,gBAAC7qC,GAAA,EAAD,WACGirC,IAlTH,eAACjc,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,qBACTwI,KAAK,WACL5E,MAAOnK,EAASwjC,SAChBiS,UAAQ,IAzFV,eAACD,GAAD,CACEzmC,KAAK,OACL6V,MAAOre,EAAE,iBACT+uC,aAAc,EACdnrC,MAAO+4B,EACPjc,SAAU9c,GAASk3C,EAAgB,CAAEne,KAAM/4B,IAC3CsrC,SAAUA,GAAYuY,IAAqB7vB,GAAiBsQ,QAC5DhvB,QAAS,CACP,CAAEtV,MAAOi0B,GAAaiG,SAAUvuB,MAAOvP,EAAE,2BACzC,CAAE4D,MAAOi0B,GAAay0B,KAAM/8C,MAAOvP,EAAE,uBACrC,CAAE4D,MAAOi0B,GAAaqQ,QAAS34B,MAAOvP,EAAE,0BACxC,CAAE4D,MAAOi0B,GAAa00B,aAAch9C,MAAOvP,EAAE,kCA8X9CmrD,GAzSH,gBAAC3qC,GAAA,EAAKstB,MAAN,CAAYsH,GAAInI,KAAhB,UACE,gBAACzsB,GAAA,EAAKwtB,MAAN,CAAYlvB,QAAM,EAAC8tB,GAAI,EAAGjgC,UAAU,gBAApC,UAAqDnP,EAAS,cAA9D,OACA,eAACmvC,GAAA,EAAD,CAAKC,GAAI,EAAGjgC,UAAU,yBAAtB,SACE,eAACwP,GAAD,CAAUtX,KAAMoK,GAAOmE,eAAgBjT,MAAO1G,EAAS0tB,cAAgB,GAAvE,SAA4EgkC,EAAkB17C,iBAuS/FhW,EAASgW,WAlUZ,eAAC+/B,GAAD,CACET,aAAc,EACd1wB,MAAOre,EAAE,sBACTwI,KAAK,aACL5E,MAAO6L,GAAa,GACpBy/B,UAAQ,IA8TPz1C,EAASkE,YAzXZ,eAAC6xC,GAAD,CACEhnC,KAAK,mBACLumC,aAAc,EACd1wB,MAAOre,EAAE,6BACT4D,MAAOnK,EAASkE,WAAY4R,MAC5BmR,SAAUnR,MACV2/B,SAAUA,GAAYgc,IAoXrBY,IACAC,SAGJC,IACAC,OAgBD,QACE,OAAO,iC,mDCriBN,MAAMO,GAAY9/C,IACvB,MAAM,SAAEhR,EAAF,KAAY+wD,KAAS71C,GAAUlK,EACrC,OACE,sBAAKC,UAAW0M,GAAQ2B,KAAO0xC,SAAUD,EAAOzxC,KAAOyxC,UAAOvxD,MAAgB0b,EAA9E,SACGlb,K,8CCHA,MAAMixD,GAAcjgD,IACzB,MAAM,KAAEE,EAAF,QAAQ6M,GAAY/M,EAC1B,OACE,oBACEC,UAAW0M,GAAQzM,EAAMoO,KAAO4xC,YAChCnzC,QAASA,KASFozC,GAAYngD,IACvB,MAAM,KAAEE,EAAF,KAAQ8M,GAAShN,EACvB,OACE,oBAAGgN,KAAMA,EAAMoG,OAAO,SAASqsC,IAAI,sBAAnC,SACE,oBAAGx/C,UAAW0M,GAAQzM,EAAMoO,KAAO4xC,iBCF5BE,GAAuBpgD,IAClC,MAAM,IAAE8zC,EAAF,QAAOuM,EAAP,QAAgBtzC,GAAY/M,GAE3BsgD,EAAWC,GAAgBnpD,mBAAoB,CAAEopD,UAAU,KAC3DC,EAASC,GAActpD,mBAAkB,CAC9CupD,QAAS,EACTC,QAAS,EACTC,MAAO,IA8EHC,EAAgBD,IACpBH,EAAW,CAAEC,QAASF,EAAQE,QAASC,QAASH,EAAQG,QAASC,WAa7D1gD,EAAuB,CAC3BuU,SAAU,MACVqsC,UAAW,MACXvtB,SAAU,WACVwtB,KAAMP,EAAQE,QACd/pB,IAAK6pB,EAAQG,QACbK,UAAY,SAAQR,EAAQI,UAG9B,OACE,gBAACf,GAAD,CAAU/yC,QAASA,EAASgzC,MAAM,EAAlC,UACE,sBACEjM,IAAKA,EACL/mC,QAAS9e,GAAKA,EAAEC,kBAChB8lD,OAAQ/lD,GAAKA,EAAEyC,iBACfujD,YAxGmBhmD,IACvBA,EAAEC,kBACFD,EAAEyC,iBAEF6vD,EAAa,CACXC,UAAU,EACVU,WAAYT,EAAQE,QACpBQ,WAAYV,EAAQG,QACpBQ,gBAAiBnzD,EAAEozD,MACnBC,gBAAiBrzD,EAAEszD,SAgGjBC,UA5FiBvzD,IACrBA,EAAEC,kBACFD,EAAEyC,iBAEE4vD,EAAUE,UACZD,EAAa,CAAEC,UAAU,KAwFvBiB,YApFmBxzD,IACvB,GAAIqyD,EAAUE,SAAU,CACtB,MAAMG,EAAU1yD,EAAEozD,MAAQf,EAAUc,gBAAkBd,EAAUY,WAC1DN,EAAU3yD,EAAEszD,MAAQjB,EAAUgB,gBAAkBhB,EAAUa,WAChET,EAAW,CAAEC,UAASC,UAASC,MAAOJ,EAAQI,UAiF5Ca,WA7EkBzzD,IAClBqyD,EAAUE,UACZD,EAAa,CAAEC,UAAU,KA4EvBmB,QAxDgB1zD,IACpBA,EAAEyC,iBAEF,IAAIkxD,EAAO3zD,EAAEkiB,cAAc0xC,wBAnBhB,EAACC,EAAmBC,EAAmBlB,KAWlD,MAAMF,EAAUmB,GAAaA,EAAYrB,EAAQE,SAAWE,EAAQJ,EAAQI,MACtED,EAAUmB,GAAaA,EAAYtB,EAAQG,SAAWC,EAAQJ,EAAQI,MAC5EH,EAAW,CAAEC,UAASC,UAASC,WAW/BmB,CAJgB/zD,EAAEg0D,SAAWL,EAAKZ,KAAOY,EAAKM,OAAS,EACvCj0D,EAAEk0D,SAAWP,EAAKhrB,IAAMgrB,EAAKQ,QAAU,EAExCn0D,EAAEo0D,OAAS,EAAoB,GAAhB5B,EAAQI,MAAcJ,EAAQI,MAAQ,IAKhEP,EAAUE,UACZD,EAAa,CACXC,UAAU,EACVU,WAAYT,EAAQE,QACpBQ,WAAYV,EAAQG,QACpBQ,gBAAiBnzD,EAAEozD,MACnBC,gBAAiBrzD,EAAEszD,SAuCnBthD,UAAWqO,KAAO4lC,OAClB/zC,MAAOA,EACPkqC,WAAW,EACX0J,IAAI,KAEN,uBAAK9zC,UAAWqO,KAAOg0C,YAAvB,UACE,eAACrC,GAAD,CACE//C,KAAMG,GAAKkiD,WACXx1C,QAtCqB9e,IAC3BA,EAAEC,kBACF4yD,EAAaL,EAAQI,MAAQ,OAsCzB,eAACZ,GAAD,CACE//C,KAAMG,GAAKmiD,YACXz1C,QArCsB9e,IAC5BA,EAAEC,kBACF4yD,EAA6B,GAAhBL,EAAQI,aAsClBR,GAAW,sBAAKpgD,UAAWqO,KAAO+xC,QAAvB,SAAiCA,IAC7C,sBAAKpgD,UAAWqO,KAAOm0C,YAAvB,SACE,oBAAGxiD,UAAWI,GAAK42B,oBC9IpB,MAAMyrB,WAAoB9yC,IAAM4Y,UAarCtsB,YAAY8D,GACV0oB,MAAM1oB,GAD6B,KAZrC2iD,YAYqC,OAXrCC,WAWqC,OATrCpC,cASqC,OARrCG,aAQqC,OAPrCC,aAOqC,OANrCC,WAMqC,OALrCK,gBAKqC,OAJrCC,gBAIqC,OAHrCC,qBAGqC,OAFrCE,qBAEqC,OAkCrCuB,UAAaF,IACX90D,KAAK80D,OAASA,EACT90D,KAAK80D,SAGV90D,KAAK80D,OAAOtvC,iBAAiB,SAAWplB,IACtCA,EAAEyC,iBAEF,IAAIkxD,EAAO3zD,EAAEkiB,cAAc0xC,wBACvBC,EAAY7zD,EAAEg0D,QAAUL,EAAKZ,KAC7Be,EAAY9zD,EAAEk0D,QAAUP,EAAKhrB,IAE7BksB,EAAW70D,EAAEo0D,OAAS,EAAiB,GAAbx0D,KAAKgzD,MAAchzD,KAAKgzD,MAAQ,GAC9DhzD,KAAKm0D,KAAKF,EAAWC,EAAWe,GAIhCj1D,KAAKqzD,WAAarzD,KAAK8yD,QACvB9yD,KAAKszD,WAAatzD,KAAK+yD,QACvB/yD,KAAKuzD,gBAAkBnzD,EAAEozD,MACzBxzD,KAAKyzD,gBAAkBrzD,EAAEszD,SAE3B1zD,KAAKk1D,UAxD8B,KA4FrCC,oBAAsB,KACA,OAAhBn1D,KAAK80D,QAGT90D,KAAKm0D,KAAKn0D,KAAK80D,OAAOM,YAAc,EAAGp1D,KAAK80D,OAAOO,aAAe,EAAGr1D,KAAKgzD,MAAQ,KAhG/C,KAmGrCsC,qBAAuB,KACD,OAAhBt1D,KAAK80D,QAGT90D,KAAKm0D,KAAKn0D,KAAK80D,OAAOM,YAAc,EAAGp1D,KAAK80D,OAAOO,aAAe,EAAgB,GAAbr1D,KAAKgzD,QAvGvC,KA0GrCuC,wBAA0B,KACxBv1D,KAAKo7B,SAAS,CAAEo6B,gBAAgB,KA3GG,KA8GrCC,6BAA+B,KAC7Bz1D,KAAKo7B,SAAS,CAAEo6B,gBAAgB,KA/GG,KAkHrCE,gBAAmBt1D,IACjBJ,KAAK2yD,UAAW,EAChB3yD,KAAKqzD,WAAarzD,KAAK8yD,QACvB9yD,KAAKszD,WAAatzD,KAAK+yD,QACvB/yD,KAAKuzD,gBAAkBnzD,EAAEozD,MACzBxzD,KAAKyzD,gBAAkBrzD,EAAEszD,OAvHU,KA0HrCiC,cAAiBv1D,IACfJ,KAAK2yD,UAAW,EAChB3yD,KAAKk1D,SA5H8B,KA+HrCU,gBAAmBx1D,IACbJ,KAAK2yD,WACP3yD,KAAK8yD,QAAU1yD,EAAEozD,MAAQxzD,KAAKuzD,gBAAkBvzD,KAAKqzD,WACrDrzD,KAAK+yD,QAAU3yD,EAAEszD,MAAQ1zD,KAAKyzD,gBAAkBzzD,KAAKszD,WACrDtzD,KAAKk1D,UAnI4B,KAuIrCW,eAAkBz1D,IAChBJ,KAAK2yD,UAAW,GAxImB,KA2IrCmD,wBAA2BC,IACzB/1D,KAAKo7B,SAAS,CAAE46B,WAAYD,EAAYE,SACxCj2D,KAAKk1D,SA1ILl1D,KAAK2K,MAAQ,CACX6qD,gBAAgB,GAGlBx1D,KAAK80D,OAAS,KAEd90D,KAAK+0D,MAAQ,IAAIrR,MACjB1jD,KAAK+0D,MAAMz1D,MAAQ,IACnBU,KAAK+0D,MAAMjyD,OAAS,IACpB9C,KAAK+0D,MAAMvvC,iBAAiB,QAAQ,IAAMxlB,KAAKk1D,UAC3Cl1D,KAAKmS,MAAM4W,MACb/oB,KAAK+0D,MAAM9O,IAAMjmD,KAAKmS,MAAM4W,KAG9B/oB,KAAK2yD,UAAW,EAChB3yD,KAAK8yD,QAAU,EACf9yD,KAAK+yD,QAAU,EACf/yD,KAAKgzD,MAAQ,EAEbhzD,KAAKqzD,WAAa,EAClBrzD,KAAKszD,WAAa,EAClBtzD,KAAKuzD,gBAAkB,EACvBvzD,KAAKyzD,gBAAkB,EAGzBrtB,mBAAmB8vB,GACbl2D,KAAKmS,MAAM4W,KAAO/oB,KAAKmS,MAAM4W,MAAQmtC,EAAUntC,MACjD/oB,KAAK+0D,MAAM9O,IAAMjmD,KAAKmS,MAAM4W,KA6BhCorC,KAAKF,EAAmBC,EAAmBlB,GAWzChzD,KAAK8yD,QAAUmB,GAAaA,EAAYj0D,KAAK8yD,SAAWE,EAAQhzD,KAAKgzD,MACrEhzD,KAAK+yD,QAAUmB,GAAaA,EAAYl0D,KAAK+yD,SAAWC,EAAQhzD,KAAKgzD,MACrEhzD,KAAKgzD,MAAQA,EAEbhzD,KAAKk1D,QAGPA,QACE,GAAoB,OAAhBl1D,KAAK80D,OACP,OAEF,IAAIqB,EAAUn2D,KAAK80D,OAAOsB,WAAW,MACrC,GAAgB,OAAZD,EACF,OAEFA,EAAQE,UAAU,EAAG,EAAGr2D,KAAK80D,OAAOx1D,MAAOU,KAAK80D,OAAOhyD,QAEvD,IAAIxD,EAAQU,KAAK80D,OAAOx1D,MAAQU,KAAKgzD,MACjClwD,EAASxD,EAAQU,KAAK+0D,MAAMuB,cAAgBt2D,KAAK+0D,MAAMwB,aAC3DJ,EAAQK,UAAUx2D,KAAK+0D,MAAO/0D,KAAK8yD,QAAS9yD,KAAK+yD,QAASzzD,EAAOwD,GAuDnEyd,SACE,MAAM,SAAEk2C,EAAF,IAAY1tC,EAAZ,YAAiB2tC,GAAgB12D,KAAKmS,OACtC,eAAEqjD,EAAF,WAAkBQ,GAAeh2D,KAAK2K,OACtC,MAAErL,EAAF,OAASwD,GAAWkzD,GAAc,CAAE12D,OAAQ,EAAGwD,QAAS,GACxD6zD,ElCnGH,SAAqBF,GAC1B,OAAOA,IAAatT,GAASO,OAAS+S,IAAatT,GAASQ,SkCkG1CiT,CAAYH,GAC5B,OAAO,uCACL,eAAC,KAAD,CAASR,QAAM,EAACY,SAAU72D,KAAK81D,wBAA/B,SACG,EAAGgB,gBACF,uBACEhxC,IAAKgxC,EACL1kD,UAAWqO,KAAOs2C,cAClB3Q,YAAapmD,KAAK01D,gBAClB/B,UAAW3zD,KAAK21D,cAChB/B,YAAa5zD,KAAK41D,gBAClB/B,WAAY7zD,KAAK61D,eANnB,UAOE,sBAAKzjD,UAAWqO,KAAOu2C,QAAvB,SACE,eAAC5E,GAAD,CACE//C,KAAMG,GAAKmiD,YACXz1C,QAASlf,KAAKs1D,yBAGlB,sBAAKljD,UAAWqO,KAAOw2C,OAAvB,SACE,eAAC7E,GAAD,CACE//C,KAAMG,GAAKkiD,WACXx1C,QAASlf,KAAKm1D,wBAGlB,sBAAK/iD,UAAWqO,KAAOy2C,WAAvB,SACE,eAAC9E,GAAD,CACE//C,KAAMG,GAAKo0C,gBACX1nC,QAASlf,KAAKu1D,4BAGlB,sBAAKnjD,UAAWqO,KAAO02C,KAAvB,SACE,eAAC7E,GAAD,CACEnzC,KAAMu3C,EACNrkD,KAAMG,GAAK4kD,iBAGdT,GAAW,yBAAQr3D,MAAOA,EAAOwD,OAAQA,EAAS,GAAIgjB,IAAK9lB,KAAKg1D,aAC/D2B,GACA,uBAAKvkD,UAAWqO,KAAO42C,SAAvB,UACE,sBAAKpR,IAAKxB,GAAagS,GAAWvQ,IAAI,KACtC,oBAAG5zC,MAAO,CAAEhT,MAAO,OAAnB,SAA6BmG,EAAE,8BAC/B,6BAAG,oBAAG0Z,KAAMu3C,EAAT,SAAuBjxD,EAAE,kCAMrC+vD,GAAkBzsC,GAAO,eAACwpC,GAAD,CAAqBtM,IAAKl9B,EAAK7J,QAASlf,KAAKy1D,mC,yBCtN7E,MAAM6B,GAAiBnlD,GACrB,sBAAK2T,IAAK3T,EAAMolD,OAAQjlD,MAAO,CAAChT,MAAO6S,EAAM7S,OAA7C,SACG6S,EAAMhR,WAULq2D,GAAoBrlD,GACxB,sBACEC,UAAWqO,KAAOg3C,eAClB3xC,IAAK3T,EAAMolD,OACXG,cAAevlD,EAAMulD,cACrBC,YAAaxlD,EAAMwlD,YACnBC,cAAezlD,EAAMylD,cALvB,SAOE,sBAAKxlD,UAAWqO,KAAOo3C,YAOrBC,GAAkB3lD,GACtB,sBAAKG,MAAO,CAAE8R,SAAU,EAAG2zC,WAAY,EAAGnyB,SAAU,QAApD,SACGzzB,EAAMhR,WAgBX,MAAM62D,WAA2Bj2C,IAAM4Y,UAKrCtsB,YAAY8D,GACV0oB,MAAM1oB,GADoC,KAJ5C8lD,eAI4C,OAH5CC,gBAG4C,OAF5CC,aAE4C,OAe5CC,aAAgBxqC,IACd5tB,KAAKi4D,UAAYrqC,GAhByB,KAmB5CyqC,cAAiBzqC,IACf5tB,KAAKk4D,WAAatqC,GApBwB,KAuB5C0qC,WAAc1qC,IACZ5tB,KAAKm4D,QAAUvqC,GAxB2B,KA2B5C2qC,kBAAqBn4D,IACK,OAApBJ,KAAKk4D,YAAwC,OAAjBl4D,KAAKm4D,UAGrCn4D,KAAKk4D,WAAWM,kBAAkBp4D,EAAEq4D,WAEpCz4D,KAAKo7B,SAAS,CACZu3B,UAAU,EACV+F,mBAAoB14D,KAAKm4D,QAAQ/C,YACjCuD,eAAgBv4D,EAAEg0D,QAClBwE,cAAe54D,KAAKm4D,QAAQ/C,gBArCY,KAyC5CyD,kBAAqBz4D,IACdJ,KAAK2K,MAAMgoD,UAGhB3yD,KAAKo7B,SAAS,CACZw9B,cAAe54D,KAAK2K,MAAM+tD,mBAAqBt4D,EAAEg0D,QAAUp0D,KAAK2K,MAAMguD,kBA9C9B,KAkD5CG,gBAAmB14D,IACjB,GAAwB,OAApBJ,KAAKk4D,YAA0C,OAAnBl4D,KAAKi4D,UACnC,OAEFj4D,KAAKk4D,WAAWa,sBAAsB34D,EAAEq4D,WACxC,IAAIlnB,EAAQvxC,KAAK2K,MAAMiuD,cAAgB54D,KAAKi4D,UAAU7C,YACtDp1D,KAAKmS,MAAM6mD,SAASznB,GACpB/sC,aAAac,QAAQ,sBAAuBisC,EAAMxsC,YAElD/E,KAAKo7B,SAAS,CACZu3B,UAAU,KAzDZ3yD,KAAK2K,MAAQ,CACXgoD,UAAU,EACV+F,mBAAoB,EACpBC,eAAgB,EAChBC,cAAe,GAGjB54D,KAAKi4D,UAAY,KACjBj4D,KAAKk4D,WAAa,KAClBl4D,KAAKm4D,QAAU,KAoDjB53C,SACE,IAAIjhB,EAA2B,IAAnBU,KAAKmS,MAAMo/B,MAAc,IACrC,OACE,uBAAKn/B,UAAWqO,KAAOw4C,UAAWnzC,IAAK9lB,KAAKo4D,aAA5C,UACE,eAACd,GAAD,CACEC,OAAQv3D,KAAKs4D,WACbh5D,MAAOU,KAAK2K,MAAMgoD,SAAW3yD,KAAK2K,MAAMiuD,cAAgBt5D,EAF1D,SAIGU,KAAKmS,MAAMghD,OAEd,eAACqE,GAAD,CACED,OAAQv3D,KAAKq4D,cACbX,cAAe13D,KAAKu4D,kBACpBX,cAAe53D,KAAK64D,kBACpBlB,YAAa33D,KAAK84D,kBAEpB,eAAChB,GAAD,UAAiB93D,KAAKmS,MAAMkiD,YAMpC,MAQa6E,GAAqBC,aARTxuD,IAAD,CACtB4mC,MAAO5mC,EAAM0mC,uBAAuBE,UAGV1mC,IAAD,CACzBmuD,SAAWznB,GAAkB1mC,EtH7HQ0mC,KAC9B,CACLhnC,KAAMH,EAAcknC,uBACpB7mC,QAAS,CAAE8mC,WsH0HyB6nB,CAAuB7nB,OAG7B4nB,CAA6CnB,ICxGxE,SAASqB,GAAY/uD,GAC1B,OAAIA,EAAKgvD,kBACArV,GAAc35C,EAAKgvD,mBAEnBjV,GAAwB/5C,EAAKg6C,UAGxBnyC,WACd,MAAM,GAAE7D,EAAIhE,KAAMqjB,EAAZ,QAA0B0d,EAA1B,QAAmCvF,EAAnC,OAA4Cc,EAA5C,IAAoDpnB,GAAQrN,EAE5DonD,EAAoB5vD,GAAegB,GAASA,EAAM+6B,gBAAgB8zB,sBAAuBlrD,EACzFqmC,EAAWrQ,GAAI1gC,KAAKkL,cAAgByqD,EACpC1uD,EAAWpB,KAEVgwD,EAAD,CAAeC,GAAmBptB,GAAYxG,EAASx3B,GACvDqN,EAAiB0wB,GAA0BvG,IAE1C6zB,EAAiBC,GAAsBrwD,mBAAS,KAChDswD,EAAiBC,GAAsBvwD,sBACvCk9C,EAAesT,GAAoBxwD,mBAAS,KAC5C4R,EAAM6+C,GAAWzwD,mBAAwB,KACzC4lB,EAAYw8B,GAAiBpiD,mBAA8B,IAE5D05C,EAAQh5C,kBAAO,GACrBob,qBAAU,KAAQ49B,EAAM/4C,SAAU,IAAS,CAACoE,EAAIqf,IAEhD,MAAMzuB,EAAW+oB,mBACf,IAAMwxC,EAAet3B,GAASrmB,SAAS29C,EAAc99C,QAAkBhb,GACvE,CAAC84D,EAAc99C,IAEXrR,EAAO2d,mBACX,KACE,MAAM2F,EAAU1uB,GAAYA,EAASgvB,SAASP,GAC9C,OAAIC,GAA4B,SAAjBA,EAAQrjB,KACdqjB,OAEP,IAGJ,CAAC1uB,EAAUyuB,IAEPssC,EAAmBhyC,mBACvB,IAAM3d,EAAOA,EAAK6Q,KAAK4B,KAAI3B,GAAOM,GAAYI,SAASV,EAAKO,KAAmB,IAC/E,CAACrR,EAAMqR,IAGT0J,qBAAU,KACR20C,EAAQ1vD,EAAOA,EAAK6Q,KAAK4B,KAAI3B,GAAOM,GAAYI,SAASV,EAAKO,KAAmB,IACjFgwC,EAAcrhD,EAAOA,EAAK6kB,WAAWpS,KAAIqmB,GAAahqB,GAAkB0C,SAASsnB,KAAa,IAC9F22B,EAAiBzvD,EAAOA,EAAKm8C,cAAgB,MAC5C,CAACvnD,EAAUyc,EAAgBrR,IAE9B+a,qBACE,IAAMu0C,GAAoBjsC,EAAe,GAAG5oB,aAC5C,CAAC4oB,IAGH,MAAMusC,EA7ER,SAAqBh7D,EAA8Bi7D,GACjD,IAAKj7D,EACH,OAEF,IAAIg7D,EAAWC,EAAa,EAC5B,KAAOD,EAAWh7D,EAASgvB,SAASruB,QAA+C,SAArCX,EAASgvB,SAASgsC,GAAU3vD,MACxE2vD,IACF,OAAOA,GAAYh7D,EAASgvB,SAASruB,YAASc,EAAYu5D,EAsEzCE,CAAYl7D,EAAUyuB,GACjC0sC,EApER,SAAyBn7D,EAA8Bi7D,GACrD,IAAKj7D,EACH,OAEF,IAAIg7D,EAAWC,EAAa,EAC5B,KAAOD,GAAY,GAA0C,SAArCh7D,EAASgvB,SAASgsC,GAAU3vD,MAClD2vD,IACF,OAAOA,EAAW,OAAIv5D,EAAYu5D,EA6DbI,CAAgBp7D,EAAUyuB,GAyBzC4sC,EAAwBtyC,mBAAQ,KACpC,IAAK3d,EACH,OAAO,EAET,GAAIA,EAAK6kB,WAAWtvB,SAAWsvB,EAAWtvB,OACxC,OAAO,EAET,IAAK,IAAI2jB,EAAI,EAAGA,EAAI2L,EAAWtvB,OAAQ2jB,IACrC,GAAIlZ,EAAK6kB,WAAW3L,GAAGzV,MAAQohB,EAAW3L,GAAGlV,GAC3C,OAAO,EAGX,OAAO,IACN,CAAChE,EAAM6kB,IAyBJqrC,EAvBa,MACjB,IAAKlwD,EACH,OAAO,EACT,GAAIiwD,EACF,OAAO,EAET,GAAIZ,KAAqBhsC,EAAe,GAAG5oB,WACzC,OAAO,EACT,GAAI0hD,IAAkBn8C,EAAKm8C,cACzB,OAAO,EACT,GAAItrC,EAAKtb,SAAWo6D,EAAiBp6D,OACnC,OAAO,EAET,IAAK,IAAI2jB,EAAI,EAAGA,EAAIrI,EAAKtb,OAAQ2jB,IAAK,CACpC,MAAMi3C,EAAgBR,EAAiBz2C,GACjCk3C,EAAgBv/C,EAAKqI,GAE3B,IAAKi3C,EAAcr+C,OAAOs+C,GACxB,OAAO,EAGX,OAAO,GAEO9X,GAEV3d,EAAoB96B,uBAAY,KAC/BqwD,GAAWvX,EAAM/4C,QACbwhB,QAAQC,SAAQ,IAEzBib,EAAOrL,KAAK4rB,IACLz7B,QAAQC,SAAQ,KACtB,CAAC6uC,EAAS5zB,IAEP+zB,EAAgBz7D,EAAYA,EAAS8V,OAASvP,EAAE,yBAA4B,GAC5EuP,EAAQvP,EAAE,qBAAsB,CACpCuP,MAAO2lD,EACPrwD,MAAOqjB,EAAe,GAAG5oB,aAErBigC,EAAav/B,EAAE,0BAA2B,CAAE6E,MAAOqjB,EAAe,GAAG5oB,aAErE61D,EAAwBv4C,SAASs3C,GACjC7jB,OAAuBn1C,IAAbzB,GACX,WAAW02C,KAAK+jB,IAChBiB,EAAwB,GACxBA,GAAyB17D,EAASgvB,SAASruB,OAuC1CixD,GAAcxsB,GAAI1gC,KAAKkL,cAC3B,eAACu8C,GAAD,CACEjoC,SAAUo3C,EACVlP,UAAW3W,EACXz1B,QATsB,KAExBrU,EAASe,GADY+oC,EACqB,GAAK,CAAE6kB,kBAAmBlrD,QAWtE,IAAKhE,EACH,OAAO,yBAET,MAAMuwD,EAAa,uCACjB,eAAC,GAAD,CACEpE,SAAU4C,GAAY/uD,GACtBye,IAAKze,EAAK07C,YACV0Q,YAAapsD,EAAKwwD,oBAEFn6D,IAAjB05D,GACC,eAACx9B,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QApIG,UACPve,IAAjB05D,GAGJhvB,EAAQz5B,KAAM,cAAatD,KAAM+rD,MAgIwBjoD,UAAWqO,KAAOs6C,SAAzE,SACE,oBAAG3oD,UAAWI,GAAKwoD,mBAGTr6D,IAAbu5D,GACC,eAACr9B,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QAhJD,UACPve,IAAbu5D,GAGJ7uB,EAAQz5B,KAAM,cAAatD,KAAM4rD,MA4IoB9nD,UAAWqO,KAAOw6C,KAArE,SACE,oBAAG7oD,UAAWI,GAAK0oD,eAGvB,sBAAK9oD,UAAWqO,KAAOiiB,SAAvB,SACE,+BAAMp4B,EAAKgvD,yBAIT6B,EACJ,eAAC1wB,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,MAAOv5B,OAAQ,oBAAzC,SACE,gBAAC2nC,GAAA,EAAK7N,KAAN,CAAWtqB,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,UAApD,UACE,gBAACkF,GAAA,EAAKrO,MAAN,WACE,oBAAGhqB,UAAWI,GAAK4oD,SAAW,IAC7B31D,EAAE,2BAEL,eAACglC,GAAA,EAAKuY,KAAN,CAAWnI,GAAG,MAAMvoC,MAAO,CAAE8R,SAAU,EAAGkhB,QAAS,OAAQC,cAAe,UAA1E,SACGs1B,SAKHQ,EAAa,qCACjB,eAACxQ,GAAD,CACE71C,MAAOvP,EAAE,0BACT4M,KAAMG,GAAK86C,KACXh7C,MAAO,CAAE+pB,UAAW,OACpBuuB,QAASkG,EAJX,SAME,gBAAC7qC,GAAA,EAAD,YACI0uB,GACA,eAACM,GAAD,CACEnxB,MAAOre,EAAE,2BACTwI,KAAK,cACL5E,MAAOswD,EACPxzC,SArKuBg0C,IAC/B,IAAIrxD,EACA44B,MAAMrf,SAAS83C,MACjBrxD,EAAQrD,EAAE,kCAEZm0D,EAAmBO,GACnBL,EAAmBhxD,IAgKXA,MAAO+wD,EACPtgD,KAAM9T,EAAE,kCAGZ,eAACimD,GAAD,CACEv8B,WAAYA,EACZw8B,cAAeA,EACfhX,SAAUA,IAEZ,eAACQ,GAAD,CACEC,UAAQ,EACRtxB,MAAOre,EAAE,0BACT4D,MAAOo9C,EACPx4C,KAAK,gBACLkY,SAAU4zC,EACV1kB,KAAM,EACNV,SAAUA,WAMZjP,EAAoCiP,EAAW,GAAK,CAAE6kB,kBAAmBlrD,GAC/E,OACE,gBAACk3B,GAAD,CACEl3B,GAAIoG,GAAOkC,iBACX9C,OAAS,GAAExF,KAAMqf,IACjBtb,KAAMG,GAAKgzB,KACXxwB,MAAOA,EACPgwB,WAAYA,EACZxlB,IAAKA,GAAO1J,GAAWpB,GAAO+B,aAAcnI,GAC5Cy1B,SAAUvkB,OAAM7e,EAAYg6D,EAC5Bj1B,gBAAiBA,EACjBT,kBAAmBA,EACnBQ,eAAgB,CACdwmB,cAAetX,EAAW,MAAQ,SAClCrP,QAAS,OACTC,cAAe,SACfziC,OAAQ,OACRshB,SAAU,GAfd,UAkBE,eAAC80C,GAAD,CAAoB/F,KAAMgI,EAAW9G,MAAOgH,KAC1C1mB,GACA,gBAAC9Y,GAAD,WACE,eAACgB,GAAA,EAAD,CACEC,QAAQ,YACR1Z,UAAWo3C,EACXt7C,QAxHkB,KAC1B,MAAM/D,EAAO7Q,EAAOA,EAAK6Q,KAAK4B,KAAI3B,GAAOM,GAAYI,SAASV,EAAKO,KAAmB,GACtFq+C,EAAQ7+C,GACR4+C,EAAiBzvD,EAAOA,EAAKm8C,cAAgB,IAC7CmT,GAAoBjsC,EAAe,GAAG5oB,YACtC4mD,EAAcrhD,EAAOA,EAAK6kB,WAAWpS,KAAIqmB,GAAahqB,GAAkB0C,SAASsnB,KAAa,KAgHxF,SAKG39B,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CACEC,QAAQ,UACRvyB,KAAK,SACL6Y,UAAWo3C,IAAY1kB,EACvB52B,QAxJgB0sB,UACxB,IAAK1sC,EACH,OAEF,MAAM4L,EAAkC,CACtCqQ,KAAMA,EAAK4B,KAAI3B,GAAOA,EAAInM,WAC1BkgB,WAAYA,EAAWpS,KAAIqmB,GAAaA,EAAUn0B,WAClDw3C,iBAEI54B,EAAkB+sC,EAAwB,EAC1CU,QAAoBh3B,GAAI7W,gCAC5BvuB,EAASoP,GACTqf,EACA7iB,EACA+iB,GAEFmrB,uBAAoBhuB,QAAQvlB,EAAE,4BAC9Bi0D,EAAgB4B,GACZ3tC,IAAiBE,IACnBo1B,EAAM/4C,SAAU,EAChBmhC,EAAQxlC,QAAS,cAAayI,KAAMuf,OAgIhC,SAMGpoB,EAAE,0BC3Vf,MAAM81D,GAAY,CAChBx0B,SAAS,GACTwB,mBAAoB,YACpBpkB,MAAO0iB,IAsBM20B,OAbOrpD,IAA8B,IAAD,EACjD,MAAM,QAAEmZ,EAAF,SAAWnqB,GAAagR,EAExBrP,EAAM,UAAGqP,EAAMrP,cAAT,QAAmB,OAE/B,OACE,sBAAKwP,MAAO,CAACxP,OAAOA,EAAQwiC,QAAQ,OAAQC,cAAe,SAAUiI,eAAgB,SAAUhD,WAAY,UAA3G,SACE,oBAAGl4B,MAAOipD,GAAV,SACGp6D,GAAuBmqB,OCbhC,MAAMmwC,GAA6B,CAACn8D,MAAO,OAAQgmC,QAAS,OAAQC,cAAe,SAAUiI,eAAgB,aAAchD,WAAY,cACjIkxB,GAA0B,CAACp8D,MAAO,OAAQgmC,QAAS,OAAQC,cAAe,MAAOiI,eAAgB,aAAchD,WAAY,UAiDlHmxB,OAxCcxpD,IAAqC,IAAD,EAE/D,MAAM,SAAEjT,EAAF,UAAY6iD,GAAc5vC,EAEhC,OAAKjT,EAYH,eAACurC,GAAA,EAAD,CAAMn4B,MAAO,CAACgsC,gBAAiBzX,IAA/B,SACE,eAAC4D,GAAA,EAAK7N,KAAN,UACE,+BACE,uBAAKtqB,MAAOmpD,GAAZ,UACE,sBAAKnpD,MAAOopD,GAAZ,SACE,sBAAKppD,MAAO,CAAC+7B,KAAM,GAAnB,SAAwBnvC,EAAS8V,UAEnC,sBAAK1C,MAAOopD,GAAZ,SACE,eAACjuB,GAAA,EAAD,CAAO3Q,QAAS,YAAhB,SACE,sBAAKxqB,MAAO,CAAC+7B,KAAM,GAAnB,SAAwBnvC,EAAS6O,UAGrC,sBAAKuE,MAAO,IAAIopD,GAAUr/B,UAAW,WAArC,SACE,oBAAG/pB,MAAOu1B,GAAWI,KAAKF,OAA1B,0BACG7oC,QADH,IACGA,OADH,EACGA,EAAUkP,mBADb,QAC4B,mBAxBpC,eAACq8B,GAAA,EAAD,CAAMn4B,MAAO,CAACgsC,gBAAiBzX,IAA/B,SACE,eAAC4D,GAAA,EAAK7N,KAAN,UACE,eAAC,GAAD,CAAc95B,OAAQ,IAAKwoB,QAAS7lB,EAAE,iCAAtC,SACGs8C,GAAa,yCAAY,eAACxvC,GAAD,cCuGvBqpD,OA5GczpD,IAC3B,MAAOooB,EAAQ5O,GAAW2O,GAASnoB,IAE5B4vC,EAAW8Z,GAAgBtyD,oBAAS,IACpCuyD,EAAiBC,GAAsBxyD,mBAAS,KAChDyyD,EAAoBC,GAAyB1yD,wBAA2B5I,IACxEu7D,EAAeC,GAAoB5yD,wBAA8B5I,IACjEy7D,EAAWC,GAAgB9yD,oBAAS,GAuB3C8b,qBAAW,KAnBUumB,WACnB,GAAKt9B,EAKL,IACEutD,GAAa,GACb,MAAMS,QAAuBh4B,GAAIlW,sBAAsB9f,GACvD6tD,EAAiBG,GACjB,MAAOl8D,GACP+7D,OAAiBx7D,GALnB,QAOEk7D,GAAa,QAXbM,OAAiBx7D,IAkBnB47D,CAAaP,KACb,CAACA,IAEH32C,qBAAU,IAAM42C,OAAsBt7D,IAAY,CAACm7D,EAAiBM,IAgBpE,OACE,gBAAC,KAAD,CAAO7gC,KAAMhB,EAAQiB,OAPH,IAAM7P,EAAQ,CAACzsB,cAAUyB,EAAW67D,MAAM,IAO5D,UACE,eAACvgC,GAAD,UAAcx2B,EAAE,8BAEhB,gBAAC,KAAMm3B,KAAP,WAEE,uBAAMtqB,MAAO,IAAIu1B,GAAWI,KAAKD,OAAjC,SACC71B,EAAMsqD,cAAgBh3D,EAAE,0CAA4CA,EAAE,qCAGvE,wBAAM6M,MAAO,CAAE+pB,UAAW,OAA1B,UAGE,eAAC4uB,GAAD,CACEzW,aAAc,EACdG,UAAU,EACV7wB,MAAOre,EAAE,6BAA+B,IACxC4D,MAAO+yD,EACPj2C,SAAUk2C,IAIZ,eAACpnB,GAAD,CACEhnC,KAAK,cACL5E,MAAOyyD,EACPh4C,MAAOre,EAAE,uCACT0gB,SAAW3H,IACTu9C,EAAmBv9C,IAErBmqB,YAAaljC,EAAE,6CACfkvC,SAAUynB,IAIZ,sBAAK9pD,MAAO,CAACgzB,QAAS,OAAQC,cAAe,MAAOiI,eAAe,YAAnE,SACE,eAACvuB,GAAD,CAAYC,QA/CY0sB,UAC5BkwB,GACFG,EAAsBH,IA6ChB,SACE,uBAAMxpD,MAAO,IAAKu1B,GAAWxoB,KAAK0oB,OAAQ6W,YAAa,SAAvD,SAAmEn5C,EAAE,8CAKzE,eAAC,GAAD,CAAqBvG,SAAUg9D,EAAena,UAAWA,UAK7D,gBAAC,KAAM2a,OAAP,WACE,eAAC7/B,GAAA,EAAD,CAAQC,QAAQ,UAAU,eAAa,QAAvC,SACGr3B,EAAE,2BAEL,gBAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAtDH,IAAMyM,EAAQ,CAACzsB,SAAUg9D,EAAeM,KAAMJ,IAsDZh5C,UAAW84C,IAAkBE,EAAtF,UACG32D,EAAE,0BAA2B,cC5BxB0M,WAEd,MAAM,GACJ7D,EADI,QAEJ+8B,EAFI,SAGJxtB,EAAWwf,GAAiBiG,MAHxB,KAIJjY,EAJI,QAKJya,EALI,IAMJtmB,EANI,OAOJhG,EAPI,SAQJC,EARI,SASJC,GACEvH,EAIEy0B,EAASkE,KAITyuB,EAAoB5vD,GAAegB,GAASA,EAAM+6B,gBAAgB8zB,sBAAuBlrD,EACzFqmC,EAAWrQ,GAAI1gC,KAAKkL,cAAgByqD,GAEnCoD,EAAWC,GAAgBrzD,sBAC3BszD,EAAgBC,GAAqBvzD,wBAAqC5I,IAG1Eo8D,EAAuBC,GAA4BzzD,oBAAS,IAC5D0zD,EAAiBC,GAAsB3zD,mBAAmB,KAC1D4lB,EAAYw8B,GAAiBpiD,mBAA8B,IAC5DtF,EAAgB4F,aACpBc,GAASA,EAAM6mC,oBAAoBtnC,UAE/ByR,EAAiB0wB,GAA0BvG,IAC1Cw2B,EAAD,CAAkBa,GAAqB7wB,GAAYxG,EAASx3B,IAC3DkiD,GtFGF,SACL1qB,EACApY,GAEA,MAAO7pB,EAAQsoC,GAAa5iC,mBAA+B,IACrDkiC,EAAU,KACT/d,EAKLoY,EAAQA,QAAQxB,GAAIzK,8BAA8BnM,GAAaxqB,EAAO,uBACnE2nB,KAAKshB,GALNA,EAAU,KAQd,OADA9mB,oBAAUomB,EAAS,CAAC3F,EAASpY,IACtB,CAAC7pB,EAAQ4nC,EAASU,GsFlBFixB,CAAkCt3B,EAASx3B,GAE5DpP,EAAW+oB,mBACf,IAAOq0C,GAAkBn6B,GAASrmB,SAASwgD,EAAgB3gD,IAxF/D,SACEkC,EACA8+C,EAAkC,CAAEpyD,KAAM,WAC1C4kB,EAAkC,IAElC,MAAMna,EAA2B,aAAnB2nD,EAAUpyD,KAAsBoyD,EAAU3nD,WAAQrU,EAC1DyN,EAAiC,aAAnBuuD,EAAUpyD,KAAsBoyD,EAAUvuD,iBAAczN,EACtEsU,EAA6B,YAAnB0nD,EAAUpyD,KAAqBoyD,EAAUruD,QAAK3N,EACxDuU,EAA+B,YAAnBynD,EAAUpyD,KAAqBoyD,EAAUtxC,UAAO1qB,EAE5DyC,EAAgC,eAAnBu5D,EAAUpyD,KACzBwK,GAAmB+G,SAAS6gD,EAAUv5D,iBACtCzC,EAEJ,OAAO,IAAIwhC,GACT,GACAtkB,EACAyf,GAAaqQ,aACbhtC,OACAA,EACA,GACAy8B,GAAehoB,MACf,EACA,GACA+Z,EACA,GACAna,EACA5G,EACA7I,MACAA,OACA,EACAnC,GAAcA,EAAWkL,GACzBlL,OACAzC,EACAsU,EACAC,GAsDMmoD,CAAoBx/C,EAAU8+C,EAAWxtC,IAC/C,CAACmtC,EAAgB3gD,EAAgBkC,EAAU8+C,IAGvCW,EAAoBr1C,mBAAQ,IACzBuiC,GAAwBtrD,IAC9B,CAACA,KACG69C,EAAWC,GAAgBzzC,mBAASihD,GAAwBtrD,IAE7DguD,EAAmBhuD,EAAS2e,SAC5B0/C,EAAWrQ,IAAqB7vB,GAAiBsG,yBAA2BupB,IAAqB7vB,GAAiBsQ,QAElH9iC,EAAWnB,cAIjB2b,qBAAU,KACHgG,GAGLiZ,GAAIvK,eAAe1O,GAAMR,MAAM2yC,IAC7BZ,EAAaY,QAEd,CAACnyC,IAGJhG,qBAAU,KACR23B,EAAasgB,KACZ,CAACA,IAEJj4C,qBAAU,KACRsmC,EAAczsD,EAASiwB,YACvB+tC,EAAmB,MAClB,CAACh+D,IAEJ,MAAMqhD,EAAkBp2C,uBAAaW,IACnCkyC,GAAaryC,GAASgS,OAAOC,OAAO,GAAIjS,EAAOG,OAC9C,IAEHua,qBAAU,KACR,GAAI7L,GAAUE,GAAYD,EAAU,CAClC,MAAMuyC,EAAgB,CAAC,IAAI5yC,GAAkBI,EAAQC,EAAmCC,IACxF6mC,EAAgB,CAACpxB,WAAY68B,OAE9B,CAACxyC,EAAQE,EAAUD,EAAU8mC,IAEhCl7B,qBAAU,KACRsmC,EAAc5O,EAAU5tB,cACvB,CAAC4tB,IAEJ,MAAM,KACJ3a,EADI,OAEJS,EAFI,MAGJ7tB,EAHI,YAIJ5G,EAJI,YAKJu0B,EALI,YAMJC,EANI,IAOJ7Z,EAPI,YAQJga,EARI,WASJC,GATI,aAUJC,GAVI,OAWJC,GAXI,MAYJC,GAZI,OAaJj9B,GAbI,UAcJo8B,GAdI,KAeJnnB,IACE4hC,EAEE0gB,GAAkBx1C,mBAAQ,KAC9B,GAAI/oB,EAASic,KAAKtb,SAAWsb,GAAKtb,OAChC,OAAO,EAET,IAAK,IAAI2jB,EAAI,EAAGA,EAAIrI,GAAKtb,OAAQ2jB,IAC/B,IAAKtkB,EAASic,KAAKqI,GAAGpH,OAAOjB,GAAKqI,IAChC,OAAO,EAGX,OAAO,IACN,CAACtkB,EAAUic,KAERo/C,GAAwBtyC,mBAAQ,KACpC,GAAI/oB,EAASiwB,WAAWtvB,SAAWsvB,EAAWtvB,OAC5C,OAAO,EAET,IAAK,IAAI2jB,EAAI,EAAGA,EAAI2L,EAAWtvB,OAAQ2jB,IACrC,GAAItkB,EAASiwB,WAAW3L,GAAGlV,KAAO6gB,EAAW3L,GAAGlV,GAC9C,OAAO,EAGX,OAAO,IACN,CAACpP,EAAUiwB,IAERshC,IzBlLN+J,GyBmLwCzd,GzBpLxC2gB,GyBoLqBJ,GzBjLLl7B,OAASo4B,GAAQp4B,MAC5Bs7B,GAAS76B,SAAW23B,GAAQ33B,QAC5B66B,GAAS1oD,QAAUwlD,GAAQxlD,OAC3B0oD,GAAStvD,cAAgBosD,GAAQpsD,aACjCsvD,GAAS/6B,cAAgB63B,GAAQ73B,aACjC+6B,GAAS96B,cAAgB43B,GAAQ53B,aACjC86B,GAAS30C,MAAQyxC,GAAQzxC,KACzB20C,GAAS36B,cAAgBy3B,GAAQz3B,aACjC26B,GAAS16B,aAAew3B,GAAQx3B,YAChC06B,GAASz6B,eAAiBu3B,GAAQv3B,cAClCy6B,GAASx6B,SAAWs3B,GAAQt3B,QAC5Bw6B,GAASv6B,QAAUq3B,GAAQr3B,OAC3Bu6B,GAASx3D,SAAWs0D,GAAQt0D,QAC5Bw3D,GAASp7B,YAAck4B,GAAQl4B,WyBqK/Bm7B,IACAlD,IzBvLA,IACLmD,GACAlD,GyBwLA,MAAMv1B,GAAoB96B,uBAAY,KAI/BsmD,IAAqBsM,GAExBC,GAAyB,GAClBtxC,QAAQC,SAAQ,KAGzBib,EAAOrL,KAAK4rB,IACZ6V,GAAyB,GAClBtxC,QAAQC,SAAQ,KACtB,CAACib,EAAQ6pB,GAAmBsM,IAEzBY,GAAyBC,IAC7BT,EAAkBS,IA4CdC,GAAkB,IACS17B,GAAS27B,UAAU,CAChDxvD,GAAIpP,EAASoP,GACb8zB,OACAvkB,SAAU3e,EAAS2e,SACnB3X,UACAo8B,aACAnnB,QACAgU,aACAna,MAAOA,GAAS,GAChB5G,YAAaA,GAAe,KAC5Bu0B,cACAC,cACAC,SACA9Z,MACAwZ,oBAAqBrjC,EAASqjC,oBAC9BrU,SAAUhvB,EAASgvB,SACnB6U,cACAC,cACAC,gBACAC,UACAC,WAC0Cl0B,SAIxCiqC,GAAuBr1C,IAC3B,GAAIA,GAA4B,OAAlBA,EAAOqC,OAAiB,CAEpC,MAAM2oC,EAAShrC,EAAOnD,MAAQ,GAC9Bs8C,EAAargC,OAAOC,OAAO,GAAImgC,EAAW,CACxC0N,WAAYzhD,EAAoB6lC,EAAO75B,OACvC01C,SAAU1hD,EAAoB6lC,EAAO9lB,QAGzC,OAAO,GAyFHg1C,GAAoCnyB,UACxC,IAAKt9B,EACH,OAGF,MAAM,YAAEo3C,SAAsBphB,GAAIxW,iCAAiCxf,EAAI2uD,EAAgB,IAIjFe,EAAaf,EAAgBlgD,KAAI9R,GAASA,EAAQ,KAClD,KAAE8Y,SAAeugB,GAAIvW,+BAA+Bzf,EAAIo3C,EAAY33C,IAAKiwD,GAC/EL,GAAsB55C,GACtBm5C,EAAmB,KAgBfe,GAAkCryB,UACtC,IAAKt9B,EACH,OAEF,IAAKpP,EAASmjC,SACZ,OAEF,MAAM,KAAEte,SAAeugB,GAAIvW,+BACzBzf,EACApP,EAASmjC,SACT46B,GAEFC,EAAmB,IACnBS,GAAsB55C,IAGlBm6C,GAA4BtyB,UAC3Bt9B,GAGLs4B,EAAOrL,MAA4BppB,GAI/B,eAAC,GAAD,CAAqBsqD,cAAe0B,MAAiChsD,MAEtE0Y,MAAKhnB,GACAA,EAAO24D,KACFl4B,GAAIvW,+BAA+Bzf,EAAI,KAAM2uD,GAElDp5D,EAAO3E,SACFolC,GAAIvW,+BAA+Bzf,EAAIzK,EAAO3E,SAAS6O,IAAKkvD,QADrE,IAIDpyC,MAAKujB,IACAA,GACFuvB,GAAsBvvB,EAAUrqB,MAElCm5C,EAAmB,OAEpBkB,OAAMh+D,SAeLi+D,GAAqBn/D,IACR,QAAbA,EACF85C,uBAAoBlwC,MAAMrD,EAAE,oCAE5Bk4D,GAAsBz+D,GACtB85C,uBAAoBhuB,QAAQvlB,EAAE,iCAI5B64D,GAA8B1yB,UAClC,IAAKt9B,EACH,OAEF,MAAM,KAAEiwD,SAAej6B,GAAIxW,iCAAiCxf,GAC5DqvD,GAAsBY,IAWlBC,GAA2B5yB,UAC/B,IAAKt9B,EACH,OAEF,MAAMzK,QAAe+iC,EAAOrL,MAAcppB,GACxC,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,qCACT6lB,QAAS7lB,EAAE,uCACX82B,QAAS92B,EAAE,sBACX+2B,YAAY,SACZC,WAAYh3B,EAAE,yBACdi3B,WAAYj3B,EAAE,4BACZ0M,MAGN,IAAKtO,EACH,OAEF,MAAM3E,QAAiBolC,GAAInW,iCAAiC7f,EAAI2uD,GAChEC,EAAmB,IACnBS,GAAsBz+D,IAQlBu/D,GAA0BxB,EAAgBhsD,MAC9ChG,GAASA,EAAQ/L,EAASgvB,SAASruB,QAA4C,gBAAlCX,EAASgvB,SAASjjB,GAAOV,OAGlE4zD,GAA8BlB,EAAgByB,OAClDzzD,GAASA,EAAQ/L,EAASgvB,SAASruB,QAA4C,gBAAlCX,EAASgvB,SAASjjB,GAAOV,OAIlEo0D,GAAY5hB,EAAU/nC,MAkHtBmmD,GACJ,eAACyD,GAAD,CACEjjD,eAAgBA,EAChBzc,SAAUA,EACVsxD,aAAcA,EAAeA,EAAa,QAAK7vD,EAC/Cg0C,SAAUA,EACVoI,UAAWA,EACXwD,gBAAiBA,EACjBkQ,kBAAmBA,GACnBC,cAzIsB,KAExB7lD,EAASe,GADY+oC,EACqB,GAAK,CAAE6kB,kBAAmBlrD,QA2IhE+sD,GAAawB,EA3HZA,EAIH,gBAACpyB,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,MAAOv5B,OAAQ,oBAAzC,UACE,eAAC2nC,GAAA,EAAKvO,OAAN,UACE,gBAACjd,GAAD,CAAYjK,MAAO,QAAS1C,MAAOu1B,GAAWxoB,KAAK0oB,OAAQ7oB,QAAS,IAAM49C,OAAkBn8D,GAA5F,UACE,oBAAGyR,UAAW,oBAAqBE,MAAO,CAAC4R,YAAa,KAAMze,EAAE,6BAGpE,eAACglC,GAAA,EAAK7N,KAAN,CAAWtqB,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,UAApD,SACE,eAAC,GAAD,CACEkxB,SAAU4C,GAAYwD,GACtB9zC,IAAK8zC,EAAe7W,YACpB0Q,YAAW,OAAEmG,QAAF,IAAEA,OAAF,EAAEA,EAAgB/B,oBAb5B,+BAsBP,eAACrwB,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,MAAOv5B,OAAQ,oBAAzC,SACE,gBAAC2nC,GAAA,EAAK7N,KAAN,CAAWtqB,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,UAApD,UACE,gBAACkF,GAAA,EAAKrO,MAAN,CAAY9pB,MAAO,CAAC+rC,aAAc,OAAlC,UACE,oBAAGjsC,UAAWI,GAAK4oD,SAAW,IAC7B31D,EAAE,2BAEJw3D,EAAgBp9D,OAAS,GACxB,gBAAC4qC,GAAA,EAAKvO,OAAN,CAAa5pB,MAAO,CAACgsC,gBAAiBzX,GAAsBolB,cAAe,OAA3E,UACE,oBAAG35C,MAAO,IAAIu1B,GAAWI,KAAKF,OAAQsW,aAAc,UAApD,iDAGA,gBAAC1iB,GAAD,YACI8iC,IAAiD,OAAtBv/D,EAASmjC,UACpC,gBAACw8B,GAAA,EAAD,CAAgBjkC,KAAK,KAAKkC,QAAQ,oBAAoB+d,GAAI5O,KAAa39B,GAAG,qBAAqB0G,MAAOvP,EAAE,6BAA8Bq5D,KAAK,OAA3I,UACE,eAACnkB,GAAA,EAASx3B,KAAV,CAAe47C,SAAS,MAAM7/C,QAAS6+C,GAAvC,SACGt4D,EAAE,6BAEJvG,EAASgvB,SAASlP,QAAO4O,GAA4B,gBAAjBA,EAAQrjB,OAAwBwS,KAAI6Q,IACvE,MAAM83B,EAAc93B,EACdloB,EAAMggD,EAAYh4B,WAClB1Y,EAAS0wC,EAAYxmD,UAAYijC,GAASrmB,SAAS4pC,EAAYxmD,SAAUyc,GAAgB3G,OAAUvP,EAAE,oBAC3G,OACE,eAACk1C,GAAA,EAASx3B,KAAV,CAAyB47C,SAAUr5D,EAAKwZ,QAAS,IAnLhC0sB,WACrC,IAAKt9B,EACH,OAEF,MAAM,KAAEyV,SAAeugB,GAAIvW,+BACzBzf,EACAo3C,EAAYh4B,WACZuvC,GAEFU,GAAsB55C,GACtBm5C,EAAmB,KAyKwD8B,CAA+BtZ,GAAtF,SAAqG1wC,GAAjFtP,SAKL,OAAtBxG,EAASmjC,UACR,eAACxF,GAAA,EAAD,CAAQjC,KAAK,KAAKkC,QAAQ,oBAAoB5d,QAAS++C,GAAvD,SACGx4D,EAAE,2BAIL,eAACo3B,GAAA,EAAD,CAAQjC,KAAK,KAAKkC,QAAQ,oBAAoB5d,QAASg/C,GAAvD,SACGz4D,EAAE,mBAGP,eAACo3B,GAAA,EAAD,CAAQzqB,UAAU,aAAawoB,KAAK,KAAKkC,QAAQ,iBAAiB5d,QAASs/C,GAA3E,SACG/4D,EAAE,gCAKX,gBAACglC,GAAA,EAAKuY,KAAN,CAAWnI,GAAG,MAAMzoC,UAAWqO,KAAOw+C,YAAtC,UACG//D,EAASgvB,SAASnR,KAAI,CAAC6Q,EAAS3iB,IAC/B,eAACm6C,GAAD,CAEEn6C,MAAOA,EACP2iB,QAASA,EACTpJ,SAAUy4C,EAAgB/3D,SAAS+F,GACnC0pC,SAAUA,EACVz1B,QAAS,IArJOjU,KAC5B,MAAM2iB,EAAU1uB,EAASgvB,SAASjjB,GACb,SAAjB2iB,EAAQrjB,KACV8gC,EAAQz5B,KAAM,cAAatD,KAAMrD,KACP,gBAAjB2iB,EAAQrjB,MACjB8gC,EAAQz5B,KAAM,cAAagc,EAAQF,eAgJVwxC,CAAqBj0D,GACpCy1C,WAAYl8B,GA5HE,EAACvZ,EAAeuZ,KAExC04C,EADE14C,EACiB,IAAIy4C,EAAiBhyD,GAErBgyD,EAAgBj+C,QAAOwE,GAAKA,IAAMvY,MAwHnBk0D,CAAoBl0D,EAAOuZ,GACnD6gC,UAAW7gC,GAAYs4C,EAAkBt4C,GACzC7I,eAAgBA,EAChB2pC,WAAW,GATNr6C,MAYPsyD,GACA,eAACjT,GAAD,UACE,wBAAOl4C,UAAU,uBAAjB,SAAyC3M,EAAE,yCAG9C83D,QAAmB58D,IAAP2N,GACX,eAACg8C,GAAD,UACE,wBAAOl4C,UAAU,uBAAjB,SAAyC3M,EAAE,sCAG9C83D,IAAa5oB,GAAYrmC,GAAM,uCAC9B,eAAC8wD,GAAD,CACE1xC,WAAYpf,EACZ27C,gBAAiB/qD,EAASgvB,SAASruB,OAAS,EAC5Cw/D,eAAgBhB,KAEK,OAAtBn/D,EAASmjC,UACR,eAACi9B,GAAD,CACEC,wBAAyBjB,gBA0BnC54B,GAAoCiP,EAAW,GAAK,CAAE6kB,kBAAmBlrD,GAC/E,IACIy1B,GADAy7B,GAAgBhgD,EAYpB,MAVY,MAARA,IACE88C,GAAkBA,EAAel5D,YACnCo8D,GAAiB,GAAE9qD,GAAOmE,kBAAkByjD,EAAel5D,WAAW2K,MACtEg2B,GAAWhvB,GAAmB+G,SAASwgD,EAAel5D,YAAYkS,kBAElEkqD,GAAgB9qD,GAAOoF,KACvBiqB,GAAW,QAKb,gBAACyB,GAAD,CACEl3B,GAAIA,EAAKoG,GAAO+B,aAAe/B,GAAOwB,eACtCpC,OAAQxF,EACR+D,KAAMG,GAAKitD,QACXzqD,MAAO2pD,GACP15B,kBAAmBA,GACnBS,gBAAiBA,GACjBlmB,IAAKggD,KAAkBtgE,EAASe,OAAS6V,GAAWpB,GAAO+B,aAAcvX,EAASmjC,UAAY,IAAM3tB,GAAOmD,mBAC3GksB,SAAUA,GARZ,UAUG7kC,EAASmjC,UACR,uBAAK/vB,MAAO,CAACssC,YAAa,QAA1B,UACE,eAACnR,GAAA,EAAD,CAAO3Q,QAAS,YAAhB,iBAAwC,eAAClb,GAAD,CAAUtX,KAAMoK,GAAO+B,aAAc7Q,MAAO1G,EAASmjC,SAAU/vB,MAAO,IAAIu1B,GAAWxoB,KAAKyoB,MAAM7jB,WAAW,GAA3G,SAAiHxe,EAAE,yCAG/J,gBAACitC,GAAA,EAAD,CAAKpgC,MAAO,CAAE+rC,aAAc,SAA5B,UACE,eAACjM,GAAA,EAAD,CAAKE,GAAI,EAAT,SAAa6oB,KACb,eAAC/oB,GAAA,EAAD,CAAKE,GAAI,EAAT,SAAa+oB,SAGb1mB,GACA,gBAAC9Y,GAAD,WACGvtB,IAAOpP,EAASuP,QAEb,eAACouB,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QA7TT0sB,gBACrBtH,GAAI/V,0BAA0BrvB,EAASoP,IAC7C+8B,EAAQz5B,KAAM,gBAAe1S,EAAS0tB,iBA2T5B,SACGnnB,EAAE,sBAGL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,SAAS5d,QAlWT0sB,UAC1B,IAAKt9B,EACH,OAEF,MAAMoxD,QAAyBp7B,GAAIjW,2BAA2BwvC,KAAgC,UAC9F,GAAgC,OAA5B6B,EAAiBx5D,OAAiB,CACpC,IAAK,IAAIR,KAAOg6D,EAAiBh/D,KAC/Bs4C,uBAAoBlwC,MAAMD,EAAa62D,EAAiBh/D,KAAKgF,IAC3DD,EAAE,iCACF,KAEJ,OAGF,MAAM5B,QAAe+iC,EAAOrL,MAAKppB,GAC/B,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,gCACT6lB,QAAS7lB,EAAE,kCACX82B,QAAS92B,EAAE,sBACX+2B,YAAY,SACZC,WAAYh3B,EAAE,yBACdi3B,WAAYj3B,EAAE,4BACZ0M,MAGDtO,UAGCygC,GAAIhW,yBAAyBhgB,GAEnC+8B,EAAQz5B,KAAM,oBAoUJ,SACGnM,EAAE,4BAIT,eAACo3B,GAAA,EAAD,CACEC,QAAQ,YACR1Z,UAAWqtC,GACXvxC,QApXkB,KACrB5Q,GAIH0uC,EAAasgB,GACb3R,EAAczsD,EAASiwB,cAJvB6tC,GAAyB,GACzB3xB,EAAQs0B,WA8WJ,SAKGl6D,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CACEC,QAAQ,UACR1Z,UAAWqtC,GACXvxC,QAlYgB,UACbve,IAAP2N,EA/GuBs9B,WAC3B,MAAM8zB,QAAyBp7B,GAAIjW,2BAA2BwvC,KAAgC,UAC9F,GAAgC,OAA5B6B,EAAiBx5D,OAGnB,OAFAgzC,GAAoBwmB,QACpB1mB,uBAAoBlwC,MAAMrD,EAAE,kCAG9B,MAAM+8B,QAAgB8B,GAAI/W,yBAAyB,CACjD1P,SAAUA,GAAYwf,GAAiBiG,MACvCvW,cAAe7tB,EAAS0tB,mBAAgBjsB,EACxCyhC,OACAl8B,UACAo8B,aACAnnB,KAAMA,GAAK4B,KAAI3B,GAAOA,EAAInM,WAC1BkgB,WAAYA,EAAWpS,KAAIqmB,GAAaA,EAAUn0B,WAClD+F,MAAOA,GAAS,KAChB5G,YAAaA,GAAe,KAC5By0B,SAEA5tB,QAAS/V,EAAS+V,QAClBC,UAAWhW,EAASgW,UAEpBytB,cACAC,cAEA7Z,MAEAga,cACAC,cACAC,gBACAC,UACAC,WAEF65B,GAAyB,GACzBhkB,uBAAoBhuB,QAAQvlB,EAAE,wBAC9B4lC,EAAQz5B,KAAM,cAAa4wB,EAAQz0B,QA6EjC6xD,GAjC8Bh0B,WAChC,MAAM8zB,QAAyBp7B,GAAIjW,2BAA2BwvC,KAAgC,UAC9F,GAAgC,OAA5B6B,EAAiBx5D,OAGnB,OAFAgzC,GAAoBwmB,QACpB1mB,uBAAoBlwC,MAAMrD,EAAE,kCAI9B,MAAMo6D,QAAsBv7B,GAAI9W,yBAAyBqwC,MAKzD,GAHAV,EAAkB0C,GAClB7mB,uBAAoBhuB,QAAQvlB,EAAE,wBAE1BxB,EAAe,CACjB,MAAM67D,QAAgBl5B,EAAOrL,MAAcppB,GACzC,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,uCACT6lB,QAAS7lB,EAAE,4CACP0M,MAGJ2tD,GACFj1D,EAASU,EAAwC,CAC/ChB,KAAM,WACN8jD,SAAUwR,EAAc9xD,IACxBE,KAAMk0B,GAAS49B,cAAc5kD,SAUjC6kD,IA2XI,SAKGv6D,EAAE,0BAaf,MAAM25D,GAAkBjtD,IACtB,MAAM,WAAEub,EAAF,gBAAcu8B,EAAd,eAA+BoV,GAAmBltD,EACxD,OACE,sBAAKC,UAAWqO,KAAOw/C,QAAvB,SACE,eAACjW,GAAD,CACEt8B,WAAYA,EACZu8B,gBAAiBA,EACjBb,YAAa,CAAE9pD,MAAO,IAAKwD,OAAQ,IAAKo9D,aAAc,GACtD7W,QAASgW,EACTvW,OAAQrjD,EAAE,yBASZ65D,GAAyBntD,IAC7B,MAAM,wBAAEotD,GAA4BptD,EACpC,OACE,sBAAKC,UAAWqO,KAAO0/C,eAAgBjhD,QAASqgD,EAAhD,SACE,uBAAKntD,UAAW0M,GAAQ2B,KAAO2/C,qBAA/B,UACE,oBAAGhuD,UAAWI,GAAKy2C,aACnB,gCAAOxjD,EAAE,mCChxBV,IAAK46D,I,SAAAA,K,wBAAAA,E,cAAAA,E,oBAAAA,E,qBAAAA,Q,KAML,MAAMC,GAAgB,CAC3BD,GAAaE,MACbF,GAAaG,SACbH,GAAaI,WACbJ,GAAal+B,UAETu+B,GAA8D,CAClE,CAACL,GAAaI,YAAa,2BAC3B,CAACJ,GAAaE,OAAQ,sBACtB,CAACF,GAAaG,UAAW,yBACzB,CAACH,GAAal+B,UAAW,0BAEpB,SAASw+B,GAAsBp2D,GACpC,OAAO9E,EAAEi7D,GAAyBn2D,KAAUA,EAGvC,IAAKq2D,GAQAC,GAJL,SAASC,GAAsB1+B,GACpC,OAAOA,IAASw+B,GAAaxzD,SAAW3H,EAAE,kCAAoCA,EAAE,mC,SALtEm7D,K,oBAAAA,E,qBAAAA,Q,cAQAC,K,kBAAAA,E,4BAAAA,E,sBAAAA,E,qBAAAA,Q,KAMZ,MAAME,GAA6D,CACjE,CAACF,GAAaG,SAAU,6BACxB,CAACH,GAAaI,cAAe,kCAC7B,CAACJ,GAAaK,WAAY,+BAC1B,CAACL,GAAazzD,UAAW,+BAM3B,MAAM+zD,GAAkE,CACtE,CAACN,GAAaG,SAAU,6BACxB,CAACH,GAAaI,cAAe,uCAC7B,CAACJ,GAAaK,WAAY,+BAC1B,CAACL,GAAazzD,UAAW,+BAMpB,SAASg0D,GAAqB39D,GACnC,OAAQA,EAAS8G,MACf,KAAK81D,GAAaE,MAChB,OAAQ98D,EAAS49D,oBAPaC,EAOmC79D,EAAS49D,oBANvE57D,EAAE07D,GAA6BG,KAAWA,GAMmD,KAAM,IAAM77D,EAAE,uBAChH,KAAK46D,GAAaG,SAEhB,OAAQ/8D,EAAS89D,sBAAwBT,GAAsBr9D,EAAS89D,sBAAsBn/B,MAAQ,IAAM,IAAM38B,EAAE,0BACtH,QACE,OAAOk7D,GAAsBl9D,EAAS8G,MAZ5C,IAAoC+2D,EAsB7B,IAAKE,I,SAAAA,K,wCAAAA,E,gCAAAA,E,qBAAAA,E,kCAAAA,Q,KCpEL,MAAMC,GAAqBtvD,IAChC,MAAM,SAAE1O,GAAa0O,EA8CrB,OAAI1O,EAASi+D,aAxCuBj+D,KAElC,IAAKA,EAASi+D,aACZ,OAAO,+BAIT,MAAMC,EAA+B,IAAI/wD,GAAMnN,EAASi+D,cAAcpwD,SAAShN,KACzE4pB,EAAWyzC,EAAqB78D,MAAM,MAK5C,IAAI88D,EAA4B,GAC5BC,EAA6B,GAEjC,GAAI3zC,EAASruB,QAAU,EAErB+hE,EAAWhwD,KAAK,gCAAO+vD,SAClB,CAEL,MAAMG,EAAgB5zC,EAASwgB,MAAM,EAAE,GAAGx9B,KAAK,MAGzC6wD,EAAiB7zC,EAASwgB,MAAM,EAAExgB,EAASruB,QAAQqR,KAAK,MAG9D0wD,EAAWhwD,KAAK,gCAAOkwD,KACvBD,EAAYjwD,KAAK,gCAAOmwD,KAG1B,OACE,qCACE,iCAAMH,EAAW,wBAAMC,QAQpBG,CAA2Bv+D,GA5C3B,yCCgBX,MAAM+jB,GAAU/jB,GAAwBA,EAASsK,IAGjCoE,WACd,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,IAAoBtmB,GAAQrN,EAE5By0B,EAASkE,KACTlnC,EAAO0gC,GAAI1gC,MAEV0nC,EAAWC,GAAmB7gC,EAAa,cAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkB8kB,GAClD9pB,EAAOgqB,GAAYjiC,qBAEpBkiC,EAAUthC,uBAAY,KAjB9B,IAAuBoa,EAkBnBuhB,EAAQA,QAAQxB,GAAInT,cAClBnS,EAdW,GAeXorB,EAfW,GAiBX,CAAC,EAtBgB7lB,EAsBDgC,EArBF,UAAXhC,EAAqB,kBAAoBA,GAqBfiC,IAC7B,CAACg7C,GAAkBS,gBAAiBT,GAAkBU,WAAYV,GAAkB5wD,QACnF1N,EAAO,aACP2nB,KAAK2gB,KACP,CAAC1F,EAAS9mB,EAAQorB,EAAW7jB,EAAYC,IAC5CnB,oBAAUomB,EAAS,CAACA,IAEpB,MAAMnlB,EAAU2B,mBAAQ,KACtB,MAAMinC,EAAuBzrD,IAC3BmjC,EAAOrL,MAAcppB,GACnB,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,8BACT6lB,QAAS7lB,EAAE,+BAAgC,CAAEwI,KAAMxK,EAASwK,OAC5DsuB,QAAS92B,EAAE,sBACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAEL0Y,MAAKghB,IACDA,GAGLvH,GAAIpT,eAAeztB,EAASsK,KAAK8c,MAAK,KACpCmuB,uBAAoBhuB,QAAQvlB,EAAE,iCAC9BgmC,WAKAnlB,EAAqC,CACzC,IAAIvF,GAAqB,OAAQtb,EAAE,kBAAiBhC,GAAY,kCAASA,EAASwK,QAAiB,CAAE+R,WAAW,EAAMJ,UAAU,EAAMG,WAAW,IACjJ,IAAIE,GAAkB,OAAQxa,EAAE,kBAAkBhC,GAAY29D,GAAqB39D,IAAW,CAAEmc,UAAU,IAC1G,IAAImB,GAAqB,QAAStb,EAAE,mBAAmBhC,GAAY,eAACg+D,GAAD,CAAmBh+D,SAAUA,KAAc,CAACmc,UAAU,EAAMG,WAAW,IAC1I,IAAIE,GAAkB,aAAc,KAAKxc,IAAaA,EAAS0+D,uBAAyB,GAAGp9D,YAAY,CAAE6a,UAAU,EAAOtgB,MAAO,IAAKugB,MAAOH,GAAY+B,SAQ3J,OANI7d,EAAKoL,WACPsX,EAAQ1U,KAAK,IAAI2P,GAAmB,UAAW9b,EAAE,yBAAyBhC,GAAY0d,GACpF,CAAE9O,KAAMG,GAAKu5B,KAAMz5B,MAAO4O,GAAoBQ,QAASpX,KAAMoK,GAAOqC,aAAc4K,UAAWle,EAASsK,KACtG,CAAEsE,KAAMG,GAAK42B,YAAa92B,MAAO4O,GAAoB8qB,OAAQ9sB,QAASgwC,KACrE,CAAE5vD,MAAO,OAEPgnB,IACN,CAAC1iB,EAAMgjC,EAAQ6E,IAUlB,OACE,eAAC5B,GAAD,CACEv7B,GAAIoG,GAAOqD,cACX1F,KAAMG,GAAK8H,SACXtF,MAAOvP,EAAE,mBACT+Z,IAAKA,EACLxc,KAAK,WACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPvB,YAAawB,EACb/jB,OAAQA,GACRwiB,aAhBsBvmC,IACxB4nC,EAAQz5B,KAAM,cAAanO,EAASsK,QAgBlCk8B,aArBqB,KACvBoB,EAAQz5B,KAAK,yB,8BCjFF,MAAMwwD,WAAyBrgD,IAAMC,cAClDzB,SACE,MAAM,MAAElX,EAAF,KAASmX,EAAT,UAAe6hD,GAAcriE,KAAKmS,MACxC,YAAgBxR,IAAT6f,EACL,sBAAkBlO,MAAO,CAAE6R,MAAO,OAAQ4iB,SAAU,IAApD,SACmB,IAAjB19B,EAAMxJ,OACF4F,EAAE,iCACWA,EAAZ48D,EAAc,6BAAkC,+BAH9C,UAMT,uBAAmBjwD,UAAWqO,KAAO2F,OAArC,UACE,sBAAKhU,UAAWqO,KAAO6hD,WAAvB,SACE,oBAAGhwD,MAAO,CAAE6R,MAAO9T,GAAyBmQ,EAAKta,SAAUkM,UAAWI,GAAKyH,cAE7E,uBAAK7H,UAAWqO,KAAO8hD,YAAvB,UACE,iCAAM/hD,EAAKvS,KAAX,IAAiB,wBAAMmE,UAAWqO,KAAO+hD,UAAxB,cAAqCzyD,GAAwByQ,EAAKta,QAAlE,UACjB,+BAAMsa,EAAK9O,2BANL8O,EAAKlS,KCTL6D,WACd,MAAM,MAAEzO,EAAF,OAAS6hB,EAAT,eAAiBk9C,GAAmBtwD,EACpClE,EAAOga,mBAAQ,IAAM,IAAIrX,GAAMlN,GAAO4N,YAAY,CAAC5N,IAEzD,OACE,uBAAK0O,UAAWqO,KAAOiiD,WAAvB,UACE,gBAAC9gD,GAAD,CAAUtX,KAAMoK,GAAOuE,UAAWrT,MAAOlC,EAAMqK,IAAKwX,OAAQA,EAA5D,UACE,oBAAGnT,UAAWI,GAAKyH,UAAW3H,MAAO,CAAE6R,MAAO9T,GAAyB3M,EAAMyN,sBAD/E,IACwGlD,KAEvGw0D,GACC,eAACxjD,GAAD,CAAY3M,MAAO,CAAE2R,WAAY,GAAK/E,QAASujD,EAA/C,SACE,oBAAGrwD,UAAWI,GAAK42B,oBCMtB,MAAMu5B,GAAcxwD,IACzB,MAAM,aACJqiC,EAAe,EADX,MAEJ1wB,EAFI,MAGJza,EAHI,YAIJs/B,EAAc7kB,EAJV,SAKJqC,EALI,MAMJrd,EANI,OAOJyc,GACEpT,EAEEy0B,EAASkE,MAYR83B,EAAWC,GAAgBt5D,mBAASF,EAAQ,IAAIuH,GAAMvH,GAAO4E,KAAO,IAE3EoX,qBAAU,KACRw9C,EAAax5D,EAAQ,IAAIuH,GAAMvH,GAAO4E,KAAO,MAC5C,CAAC5E,IAEJ,MAGMiF,EAAKskC,GAAa,SACxB,OACE,uBAAKxgC,UAAU,iBAAf,UACE,wBAAO02B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,uBAAK1R,UAAY,WAAS,GAAKoiC,GAA/B,UACE,gBAAC,KAAD,WACE,eAAC,GAAD,CACE9wC,MAAO2F,GAAS,IAAIuH,GAAMvH,GAC1BA,MAAOu5D,EACPj6B,YAAaA,EACbxiB,SAAW8hB,IACT46B,EAAa56B,IAEfyY,WAhBcl8B,GAAoB2B,EAAS3B,EAAS9gB,SAkBtD,sBAAK0O,UAAU,qBAAf,SACE,sBAAKA,UAAW,oBAAsBqO,KAAOqiD,iBAAkB5jD,QAnChD0sB,UACvB,MAAMloC,QAAckjC,EAAOrL,MAAuBppB,GAChD,eAACgtC,GAAD,CAAkB91C,MAAM,MAAO8I,MAG7BzO,GACFyiB,EAASziB,IA6BH,SACE,oBAAG0O,UAAWI,GAAKy2C,oBAIxB5/C,GAAS,eAAC05D,GAAD,CAAWr/D,MAAO2F,EAAOkc,OAAQA,EAAQk9C,eAvB9B,IAAMt8C,OAASxlB,KAwBnCmI,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,WAsBpC44C,GAAYshB,GACFA,IAEClyD,qBAEN,MAIJ,MAAMmyD,WAA4BlhD,IAAMC,cAG7C3T,YAAY8D,GACV0oB,MAAM1oB,GADqC,KAF7C+wD,kBAE6C,OAe7CC,mBAAsBC,IACpB,IAAI/5D,EAAQ+5D,EAERlxB,EAAQ7oC,EAAM6oC,MAAM,mFACpBA,GACFlyC,KAAKo7B,SAAS,CAAE2mB,WAAW,EAAMpjC,QAAS,KAC1C2lB,GAAIxP,SAASod,EAAM,IAChBrnB,MAAKhnB,IACAquC,GAASruC,GACX7D,KAAKqjE,eAAe,GAAI,IAAIzyD,GAAM/M,OAErCi+C,SACC,KACE9hD,KAAKo7B,SAAS,CAAC2mB,WAAW,QAIhC/hD,KAAKsjE,eAAej6D,GAGtBrJ,KAAKmS,MAAMgU,SAAS9c,IAnCuB,KAsC7Cg6D,eAAiB,CAACh6D,EAAe25D,KAC/B,MAAMxiD,EAAOwiD,EACTxiD,IACFxgB,KAAKmS,MAAMuuC,WAAWlgC,GACtBxgB,KAAKo7B,SAAS,CAACzc,QAAS,OAvC1B3e,KAAK2K,MAAQ,CACXgU,QAAS,GACTgoB,MAAO,KACP48B,WAAYpxD,EAAM9I,MAClB04C,WAAW,GAIf3b,mBAAmB8vB,EAA+CsN,EAA+CC,GAC/GzjE,KAAKo7B,SAAS,IAAIp7B,KAAK2K,MAAO44D,WAAYvjE,KAAKmS,MAAM9I,QAkCvDi6D,eAAej6D,GACTrJ,KAAKkjE,eACPv5B,aAAa3pC,KAAKkjE,cAClBljE,KAAKkjE,kBAAeviE,GAGjB0I,EAGHrJ,KAAKkjE,aAAethE,YAAW,IAAM5B,KAAK0jE,gBAAgB,KAF1D1jE,KAAKo7B,SAAS,CAAEzc,QAAS,KAM7B+kD,eACE1jE,KAAKkjE,kBAAeviE,EACpB,MAAM,WAAEgjE,GAAe3jE,KAAKmS,OAASwL,GAASkB,KAC9CylB,GAAIlP,WAAWp1B,KAAKmS,MAAM9I,MAAO,EAAG,IAAK,CAAC,CAAC,OAAQgb,GAAcyC,UAAMnmB,EAAWgjE,GAC/E94C,MAAKkX,IAGJ,IAAI6hC,EAAoB7hC,EAAOrhC,KAAKb,OAAS,IAAM,IAAMkiC,EAAOrhC,KAAKb,OAErEG,KAAKo7B,SAAS,CACdzc,QAASojB,EAAOrhC,KAAKguC,MAAM,EAAEk1B,GAAmB7mD,KAAIrZ,GAAS,IAAIkN,GAAMlN,UAI7E6c,SACE,MAAM,MAAElX,GAAUrJ,KAAKmS,OACjB,QAAEwM,GAAY3e,KAAK2K,MAEzB,IAAI02C,EAAiB,CACnBC,uBAAyB,CAACle,EAAkBjxB,EAAkClH,KAC5E,MAAMkhB,EAASiX,EAAUtyB,qBACzB,OACE,gBAAC,WAAD,WACE,eAAC,KAAD,CAAaqb,OAAQha,EAAM81B,KAA3B,SACG9b,IAEH,+BACE,eAAC,GAAD,CACE9iB,MAAOA,EACPmX,KAAM4iB,EACNi/B,eAAiC1hE,IAAtBX,KAAKkjE,gBAJV9/B,EAAUtyB,2BAY5B,OACE,eAAC,KAAD,IACMuwC,EACJ9X,MAAO,IACPgY,UAAU,EACVjzC,GAAI,sBACJmzC,SAAU,KAAI,EACd9iC,QAASA,EACT6iC,kBAAmBxhD,KAAK2K,MAAM44D,WAC9B7hB,SAAUA,GACVl9B,SAAqC,KAA1BxkB,KAAK2K,MAAM44D,WAAoB,QAAK5iE,EAC/CgoC,YAAa3oC,KAAK2K,MAAM44D,WACxBM,WAAYp+D,EAAE,8BACdk8C,SAAU3hD,KAAKmjE,mBACfh9C,SAAW3B,IAAaxkB,KAAKqjE,eAAe,GAAI7+C,EAAS,KACzDu9B,UAAW/hD,KAAK2K,MAAMo3C,aCzNf,SAAS+hB,GAAU3xD,GAChC,MAAM,GAAE7D,EAAF,aAAMkmC,EAAe,EAArB,aAAwBC,EAAxB,MAAsC3wB,EAAtC,MAA6Chb,EAA7C,SAAoD3H,GAAagR,EACvE,OACE,uBAAKC,UAAU,iBAAf,UACE,wBAAO02B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,uBAAK1R,UAAY,UAASqiC,GAAiB,GAAKD,IAAhD,UACGrzC,EACA2H,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,UCGnC,MAAMi7D,GAAuB5xD,IAClC,MAAM,aACJqiC,EAAe,EADX,KAEJvmC,EAFI,MAGJ6V,EAHI,SAIJ6hB,EAJI,eAKJq+B,EALI,eAMJC,EANI,SAOJ99C,EAPI,MAQJrd,EARI,SASJsa,GACEjR,EAEE7D,EAAKskC,GAAa,SACxB,OACE,eAACkxB,GAAD,CAAWx1D,GAAIA,EAAIkmC,aAAcA,EAAc1wB,MAAOA,EAAOhb,MAAOA,EAApE,SACE,uBAAKsJ,UAAU,MAAf,UACE,sBAAKA,UAAY,WAAjB,SACE,eAAC6T,GAAA,EAAKytB,QAAN,CACEplC,GAAIA,EAAK,OACTL,KAAMA,EAAO,OACb1D,KAAK,OACL6H,UAAU,eACVu2B,YAAaq7B,EACb36D,MAAOs8B,EAAS6V,YAChBr1B,SAAU/lB,GAAK+lB,EAASwf,EAASmW,aAAa17C,EAAEkiB,cAAcjZ,QAC9D66D,eAAqBvjE,IAAVmI,EACXsa,SAAUA,MAGd,sBAAKhR,UAAY,WAAjB,SACE,eAAC6T,GAAA,EAAKytB,QAAN,CACEplC,GAAIA,EAAK,OACTL,KAAMA,EAAO,OACb1D,KAAK,OACL6H,UAAU,eACVu2B,YAAas7B,EACb56D,MAAOs8B,EAAS8V,YAChBt1B,SAAU/lB,GAAK+lB,EAASwf,EAASqW,aAAa57C,EAAEkiB,cAAcjZ,QAC9D66D,eAAqBvjE,IAAVmI,EACXsa,SAAUA,Y,cCpDf,SAAS+gD,GAAiBC,GAC/B,MAAM,QAAE94C,EAAF,QAAWoe,EAAU,IAArB,MAA2Bp3B,EAAQ,WAAc8xD,EACvD,OAAQ9xD,GACN,IAAK,UACL,IAAK,UACH0mC,uBAAoBhuB,QAAQM,OAAS3qB,EAAW+oC,GAChD,MACF,IAAK,OACHsP,uBAAoBz/B,KAAK+R,OAAS3qB,EAAW+oC,GAC7C,MACF,IAAK,UACHsP,uBAAoBzc,QAAQjR,OAAS3qB,EAAW+oC,GAChD,MACF,IAAK,SACHsP,uBAAoBlwC,MAAMwiB,OAAS3qB,EAAW+oC,I,6CCO7C,MAAM26B,GAAWlyD,IACtB,MAAM,GAAE7D,EAAF,iBAAMg2D,EAAN,KAAwBC,EAAxB,UAA8BC,EAA9B,SAAyCC,GAAatyD,GAErDuyD,EAAQC,GAAa55D,EAAYoH,EAAMyyD,SAAUN,GAYlDO,EAAe58C,mBAAQ,IAAMs8C,EAAKxnD,KAAI+xB,IAC1C,MAAMg2B,EAAeh2B,EAAIg2B,cAAgB,YACzC,OACE,eAACC,GAAA,EAAI5hD,KAAL,UACE,gBAAC4hD,GAAA,EAAIC,KAAL,CAAUjG,SAAUjwB,EAAIxgC,GAAxB,UACE,oBAAG8D,UAAW08B,EAAIz8B,OACjB,IACAy8B,EAAI95B,WACiBrU,IAArBmuC,EAAIm2B,cAA8B,uCAChC,IACD,eAACx3B,GAAA,EAAD,CAAOqN,MAAI,EAAChe,QAASgoC,EAArB,SAAoCh2B,EAAIm2B,wBAP/Bn2B,EAAIxgC,QAWlB,CAACi2D,IAEAW,EAAkBX,EAAKxnD,KAAI+xB,GAC/B,eAACq2B,GAAA,EAAIC,KAAL,CAAuBrG,SAAUjwB,EAAIxgC,GAArC,SACGwgC,EAAIkI,WADQlI,EAAIxgC,MAKrB,OACE,gBAAC62D,GAAA,EAAIlxB,UAAL,CACE3lC,GAAIA,EACJg2D,iBAAkBI,GAAUJ,EAC5BE,UAAWA,EACXC,SArCkB31B,IACR,OAARA,IAGJ61B,EAAU71B,GACN21B,GACFA,EAAS31B,KA2BX,UAME,sBAAK18B,UAAY,GAAEqO,KAAO4kD,6BAA1B,SACE,eAACN,GAAA,EAAD,CAAK3yD,UAAU,WAAf,SACGyyD,MAGL,eAACM,GAAA,EAAIG,QAAL,UACGJ,QC9EHK,GAAyC,CAC7CloC,GAAiBy0B,QACjBz0B,GAAiBw0B,KACjBx0B,GAAiBsQ,QACjBtQ,GAAiBs0B,IACjBt0B,GAAiBiG,OAMHnxB,WACd,MAAM,aAAE83B,GAAiB93B,EAEnBqP,EAAQyG,mBAAQ,IAAMs9C,GAAmBxoD,KAAIxS,GACjD,eAACowC,GAAA,EAASx3B,KAAV,CAAe03B,GAAG,SAAoB37B,QAAS,IAAM+qB,EAAa1/B,GAAlE,SACG23B,GAAwB33B,IADKA,MAG9B,CAAC0/B,IACL,OACE,eAAC40B,GAAA,EAAD,CAAgBhkB,GAAI5O,KAAaj3B,MAAOvP,EAAE,kCAAmC6I,GAAG,uBAAhF,SACGkT,KCZSrP,OACd,MAAOooB,EAAQ5O,GAAW2O,GAASnoB,GAC7B+0C,EAAc,IAAMv7B,OAAQhrB,IAC3BuU,EAAWutC,GAAgBl5C,mBAAS,KACpCT,EAAOU,GAAYD,qBAqB1B,OACE,gBAAC,KAAD,CAAOgyB,KAAMhB,EAAQiB,OAAQ0rB,EAA7B,UACE,eAACjrB,GAAD,UAAcx2B,EAAE,+CAChB,gBAAC,KAAMm3B,KAAP,WACE,eAAC3W,GAAA,EAAD,UACE,eAACgvB,GAAD,CACEhnC,KAAK,oBACL6V,MAAOre,EAAE,4CACT4D,MAAO6L,EACPiR,SAAUs8B,MAGb35C,GAAS,eAACwlC,GAAA,EAAD,CAAOxR,QAAQ,SAAf,SAAyBh0B,OAErC,gBAACizB,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASgoC,EAArC,SACGzhD,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QArCJ0sB,UAC1BpiC,OAAS7I,GACT,IACE,MAAMkD,QAAeygC,GAAIvK,eAAe7kB,GACpB,YAAhBrR,EAAO0G,KACTf,EAAS/D,EAAE,oDAEXkmB,EAAQ9nB,GAGZ,MAAO2hE,GACY,WAAbA,EAAIn6C,KACN7hB,EAAS/D,EAAE,qDAEX+D,EAASg8D,EAAIl6C,WAuBb,SACG7lB,EAAE,kCC9Bb,MACM+hB,GAAUhH,GAAmBA,EAAKlS,GA0MzBm3D,OAnL2CtzD,IAA4B,IAAD,EAGnF,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,IAAoBtmB,EAApB,OAAyBonB,EAAzB,SAAiCuoB,EAAjC,SAA2C11C,EAA3C,SAAqDC,EAArD,OAA+DF,EAA/D,aAAuEksD,GAAiBvzD,GAIvFm5B,EAAWC,GApBpB,SAAmEjhC,GACjE,MAAMK,EAAQhB,GAAegB,GAASA,EAAMC,WAAWN,KACjDO,EAAWpB,IAIjB,MAAO,CAACkB,EAHQG,IACdD,EAASR,EAAuBC,EAAMQ,MAgBH66D,CAA8BD,IAC5DlkD,EAAOgqB,GAAYjiC,wBAA6C5I,GACjEgb,EAAiB0wB,GAA0BvG,IAC1CuE,EAAaC,GAAkB/gC,mBAAS+hC,EAAUtsB,QACnDM,EAAc3V,GAAegB,GAASA,EAAM4U,mBAI5C,OAAEP,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,EAAjC,UAAgDgpB,GAAclE,EAC9DlwB,EAAoB,OAAdo0B,OAAqB7uC,EAAYgb,EAAeJ,QAAQi0B,GAE9DlpB,EAAU2B,mBAAQ,IAAMylB,MAAc,IAgCtCjC,EAAU3hC,GAAW,KA3BL,EAAC+iB,EAAcC,KACnC,MAAM,OAAE9N,EAAF,WAAUuH,EAAV,cAAsBC,GAAkB8kB,EAqB9C,OAnBExF,EAAQA,QAAQxB,GAAI9V,wBAClBghB,EAAY,CAAE,WAAYA,GAAc,GACxCxwB,EApDS,GAqDTorB,EArDS,GAuDT,CAAC,CAACe,EAAc5kB,GAAaC,IAC7B,CAAC,cACDrU,EAAMsH,SACNtH,EAAMqH,QACLtW,EAAO,aACP2nB,MAAKhnB,IACJ2nC,EAAS,CACPxnB,MAAOngB,EAAOmgB,MACdtjB,KAAMmD,EAAOnD,KAAKqc,KAAI7d,GACAijC,GAASrmB,SAAS5c,EAAUyc,UAKnD+P,QAAQC,aAAQhrB,IAMvBilE,GAA8C/6C,MAAKnqB,IACjD8qC,EAAS9qC,SAGb2kB,oBAAUomB,EAAS,CAACrB,EAAW7jB,EAAYC,EAAexH,EAAQwwB,EAAWh2B,IAE7E8vB,IAAuB,KACrBmC,IACAF,EAAgB,CAACvsB,OAAQqrB,EAAaD,UAAW,MACjD,IACA,CAACC,IAKH,MAYMw7B,EAAqBzqD,IACzBmwB,EAAgB,CAAEiE,UAAWp0B,EAAMA,EAAI9M,GAAK,QAGxCw3D,EAAwB,KAC5Bv6B,EAAgB,CAAEiE,UAAW,QAGzBu2B,EAAmBn6B,UACvB,GAAI/tB,IAAawf,GAAiBiG,MAAO,CACvC,MAAM0iC,QAAcp/B,EAAOrL,MACzBppB,GAAS,eAAC8zD,GAAD,IAA2B9zD,MAEtC,QAAcxR,IAAVqlE,EACF,OAEiB,aAAfA,EAAMz7D,KACR8gC,EAAQz5B,KAAM,8BAA6ByrB,GAAiBiG,cAAc0iC,EAAM36C,YAAY7L,KACpE,eAAfwmD,EAAMz7D,MACf8gC,EAAQz5B,KAAM,8BAA6ByrB,GAAiBsG,gCAAgCqiC,EAAM36C,YAAY7L,UAGhH6rB,EAAQz5B,KAAM,8BAA6BiM,YAAmBrE,cAAmBC,cAAqBC,SAAgB8F,MAMpH2rB,EAAiB5mB,GAEd,UADCA,EAEG,SAEAA,EA0Cb,OACE,gBAACkmB,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,OAASjqB,UAAU,mBAA7C,UACE,eAACq4B,GAAA,EAAKvO,OAAN,UApCA,qCACE,uBAAK5pB,MAAO,CAAEhT,MAAO,OAAQgmC,QAAS,OAAQC,cAAe,MAAO2gC,aAAc,gBAAiB17B,WAAY,YAA/G,UACE,sBAAKl4B,MAAO,CAAC8R,SAAU,GAAvB,SACA,eAACqkB,GAAD,CAAQx6B,KAAK,SAAS5E,MAAOghC,EAAalkB,SAAUmkB,MAEnDlvB,EACC,uBAAK9I,MAAO,CAAC8R,SAAU,GAAvB,UACE,uBAAM9R,MAAO,IAAIu1B,GAAW/jB,MAAMikB,OAAQ7jB,YAAa,GAAvD,SAA4Dze,EAAE,kBAAoB,MAClF,uBAAM6M,MAAO,IAAIu1B,GAAWI,KAAKF,QAAjC,SAA2C7sB,GAAeS,EAAgBP,KACzE,IACD,oBAAG8D,QAAS4mD,EAAuB1zD,UAAW0M,GAAQtM,GAAK42B,YAAa,uBAG1E,sBAAK92B,MAAO,CAAC8R,SAAU,GAAvB,SACE,eAACgoC,GAAD,CACE1L,WAAYmlB,EACZl9B,YAAaljC,EAAE,4BAIrB,sBAAK6M,MAAO,CAAE8R,SAAU,MAEtB+qC,GACA,sBAAK78C,MAAO,CAAC8R,SAAU,GAAvB,SACE,eAAC+hD,GAAD,CAAyBl8B,aAAc87B,aAe/C,eAACt7B,GAAA,EAAK7N,KAAN,CAAWxqB,UAAU,mBAArB,SACE,eAACkV,GAAD,CACEC,gBAAqB,OAAL/F,QAAK,IAALA,OAAA,EAAAA,EAAO9gB,OAAQ,GAC/B4lB,QAASA,EACTkB,OAAQA,GACRE,YAzFkB0+C,IACxB/6B,EAAQz5B,KAAK4D,GAAmBd,GAAOyE,aAAcitD,EAAI93D,GAAIgR,EAAYhR,GAAIgR,EAAYxL,UAyFnF6T,cAlGmBrd,IACzBihC,EAAgB,CAAEnB,UAAW9/B,KAkGvBsd,cA/FkB,CAACrD,EAAgBmmB,KACzCa,EAAgB,CAAEhlB,WAAYhC,EAAQiC,cAAekkB,KA+F/ClkB,cAAeA,EACfD,WAAYA,EACZjc,KAAM8/B,EACN1nB,SAjMO,GAkMPD,WAAU,iBAAEjB,QAAF,IAAEA,OAAF,EAAEA,EAAOwC,aAAT,QAAkB,EAC5BhhB,KAAK,iBC5Nf,MAAMqjE,GAAkB,CAAE91D,IAAK,QAASE,IAAK,QAOtC,IAAK61D,I,SAAAA,O,eAAAA,I,mBAAAA,I,qBAAAA,I,kBAAAA,Q,KAcL,MASMC,GAAuB,CAACC,EACAC,EACA/iE,IAC/B8iE,EACKF,GAAqBI,OAC1BD,EACKH,GAAqBK,QAC1BjjE,GAAS4M,GAAS5M,EAAMqO,KACnBu0D,GAAqBM,MACvBN,GAAqBO,KCjBxBC,GAA0B,oHAMzB,MAAMC,GAQC,aAACC,GACX,MAAM90B,EAAQ80B,EAAW90B,MAAM40B,IAC/B,IAAK50B,EACH,OAAO,KAET,MAAMn1B,EAAMm1B,EAAM,GACZ+0B,EAAa/0B,EAAM,GACnBg1B,EAAa7kD,SAAS6vB,EAAM,IAC5Bi1B,EAAaj1B,EAAM,GACnBk1B,EAAal1B,EAAM,GAAK7vB,SAAS6vB,EAAM,SAAMvxC,EAC7C0mE,EAAan1B,EAAM,GAAK7vB,SAAS6vB,EAAM,SAAMvxC,EAC7C2mE,EAAcp1B,EAAM,IAAM7vB,SAAS6vB,EAAM,UAAOvxC,EAChD4mE,EAAcr1B,EAAM,IAAM7vB,SAAS6vB,EAAM,UAAOvxC,EAItD,OAAO,IAAIomE,GAAyBhqD,EAAKkqD,EAAYC,EAAYC,OAHhCxmE,IAAfymE,QAA2CzmE,IAAf0mE,EAA2B,CAAEt+D,EAAGq+D,EAAYI,EAAGH,QAAe1mE,OACzEA,IAAhB2mE,QAA6C3mE,IAAhB4mE,EAA4B,CAAEx+D,EAAGu+D,EAAaE,EAAGD,QAAgB5mE,GAKnH0N,YAAY0O,EAAakqD,EAAoBC,EAAoBC,EAAqBM,EAAsCC,GAAwC,KA1B5J3qD,SA0B2J,OAzB3JkqD,gBAyB2J,OAxB3JC,gBAwB2J,OAvB3JC,gBAuB2J,OAtB3JM,eAsB2J,OArB3JC,gBAqB2J,EACjK1nE,KAAK+c,IAAMA,EACX/c,KAAKinE,WAAaA,EAClBjnE,KAAKknE,WAAaA,EAClBlnE,KAAKmnE,WAAaA,EAClBnnE,KAAKynE,UAAYA,EACjBznE,KAAK0nE,WAAaA,EAGpB3iE,WACE,IAAIlB,EAAS7D,KAAK+c,IAAM,IAAM/c,KAAKinE,WAAajnE,KAAKknE,WAUrD,OATIlnE,KAAKmnE,aACPtjE,GAAU7D,KAAKmnE,YAEbnnE,KAAKynE,UACP5jE,GAAU,IAAM7D,KAAKynE,UAAU1+D,EAAI,IAAM/I,KAAKynE,UAAUD,EACjDxnE,KAAK0nE,aACZ7jE,GAAU,IAAM7D,KAAK0nE,WAAW3+D,EAAEhE,WAAWywC,SAAS,EAAG,KACrD,IAAMx1C,KAAK0nE,WAAWF,EAAEziE,WAAWywC,SAAS,EAAG,MAE9C3xC,GCnCX,MAAM8jE,GAAc,CAACnG,GAAkB5wD,OAExB,SAASmG,GAAa5E,GACnC,MAAM,QAAE2zB,EAAF,GAAWx3B,EAAX,QAAe+8B,EAAf,IAAwB7rB,GAAQrN,EAChCy0B,EAASkE,KAET88B,EAAqC3/C,mBAAQ,IAAMq4C,GAAcvjD,KAAIxS,GACzE,yBAAmBlB,MAAOkB,EAA1B,SAAiCo2D,GAAsBp2D,IAA1CA,MACX,IACEs9D,EAAuC5/C,mBAAQ,IAAM,CAAC24C,GAAapjC,SAAUojC,GAAaxzD,UAAU2P,KAAIqlB,IAAI,CAC9G/4B,MAAO+4B,EAAMptB,MAAO8rD,GAAsB1+B,QAC1C,IACE0lC,EAAoC7/C,mBAAQ,IAAM,CACtD44C,GAAaK,UACbL,GAAaG,QACbH,GAAaI,aACbJ,GAAazzD,UACb2P,KAAIxS,IAAI,OACNlB,MAAOkB,EAAMyK,OffmBssD,EeeU/2D,EfdvC9E,EAAEs7D,GAAwBO,KAAWA,IADvC,IAA+BA,MegBhC,IAEE79D,EAAWopC,GAAY/G,EAASx3B,EAAIq5D,IACpC3yD,EAAavP,EAAL6I,EAAO,2BAAgC,8BAC/C+D,EAAOG,GAAK8H,UAEXrM,EAAM85D,EAASC,EAAWC,GAAgB9+D,EAAkB,KAC5D++D,EAAYC,EAAeC,EAAiBC,GAAsBl/D,EAAkB,KACpFoB,EAAM83C,EAASimB,EAAWC,GAAgBp/D,EAAkBk3D,GAAaE,QACzEiI,EAAWC,EAAcC,EAAgBC,GAAqBx/D,EAAkB03D,GAAaK,YAC7F0H,EAAgBC,GAAqBt/D,oBAAS,IAC9Cu/D,EAAcC,EAAiBC,EAAmBC,GAAwB9/D,EAAkBy3D,GAAapjC,WACzG95B,EAAOwlE,EAAUC,EAAYC,GAAiBjgE,OAAoCxI,IAClFyN,EAAak0C,EAAgB+mB,EAAkBC,GAAuBngE,EAAkB,KACxF+0C,EAASqrB,EAAYC,EAAcC,GAAmBtgE,EAAkB,KAExEq9D,EAAgBkD,GAAqBngE,mBAA8B+xC,GAAoBlP,UAEvFq6B,EAAiBkD,GAAsBpgE,sBACvCqgE,GAAqBC,IAA0BtgE,mBAAiB,KAChEugE,GAA0BC,GAA6BC,GAA+BC,IAAoC9gE,EAA0B,KACpJ+gE,GAAmBC,IAAwB5gE,oBAAS,GAErD0jC,GAAoBD,GAA4B,WAAD,OAAavpC,QAAb,IAAaA,OAAb,EAAaA,EAAUsK,KAGtEq8D,GAAY,KAChBrC,EAAQ,IACRI,EAAc,IACd9lB,EAAQge,GAAaE,OACrBkI,EAAa5H,GAAaK,WAC1B6H,EAAgBnI,GAAapjC,UAC7BqrC,GAAkB,GAClBK,OAASvoE,GACT2hD,EAAe,IACfinB,EAAW,IACXG,EAAkBpuB,GAAoBlP,SACtCu9B,OAAmBhpE,GACnBkpE,GAAuB,IACvBM,IAAqB,IAGvB9kD,qBAAU,KA0CJ5hB,GACFskE,EAAQtkE,EAASwK,MACjBk6D,EAAc1kE,EAASuN,kBAAkBE,KAAK,MAC9CmxC,EAAQ5+C,EAAS8G,MACjBk+D,EAAahlE,EAAS49D,oBAAsBR,GAAaK,WACzD6H,EAAiBtlE,EAAS89D,uBAAyB99D,EAAS89D,sBAAsBn/B,MAASw+B,GAAapjC,UACxGqrC,EAAkBplE,EAAS89D,uBAAyB99D,EAAS89D,sBAAsB8I,QACnFnB,EAASzlE,EAASi+D,cAClBpf,EAAe7+C,EAAS2K,aACxBm7D,EAAW9lE,EAASy6C,SACpB2rB,GAAuBpmE,EAASy6C,SAjDhCyrB,OAAmBhpE,GACnB+oE,EAAkBpuB,GAAoBlP,OAGjC3oC,GAIAA,EAAS6mE,aAImB,IAA7B7mE,EAAS6mE,YAAY/5D,KAA4C,IAA7B9M,EAAS6mE,YAAY95D,MAG7B,IAA5B/M,EAASy6C,QAAQr+C,QACb4D,EAAS6mE,YAAY95D,MAAQ/M,EAAS8mE,eAAe/5D,KAAO/M,EAAS6mE,YAAY/5D,MAAQ9M,EAAS8mE,eAAeh6D,MAClF,IAAhC9M,EAAS+mE,qBACd/mE,EAAS+mE,oBAAqB,GAI5B/mE,EAASy6C,UAA2C,IAAhCz6C,EAAS+mE,mBAC/Bb,EAAmB,CACjBp5D,IAAK9M,EAAS6mE,YAAY/5D,IAC1BE,IAAKhN,EAAS6mE,YAAY95D,MAM1B/M,EAAS+mE,oBACXd,EAAkBpuB,GAAoBgB,UAAU,CAC9C/rC,IAAK9M,EAAS6mE,YAAY/5D,IAC1BE,IAAKhN,EAAS6mE,YAAY95D,QAiB9B25D,GAAqB1mE,EAASgnE,iBAC9BV,GAA4BtmE,EAASinE,4BAA8B,KAEnEN,OAED,CAAC3mE,IAKJ,MAwCMknE,GAA4B,KAC3BzsB,EAzCgB,MACrB,GAAKA,GAAWA,IAAY0rB,GAA5B,CAGA,KAAM1rB,GAAWA,EAAQr+C,OAAS,GAGhC,OAFA8pE,OAAmBhpE,QACnBq4C,uBAAoBlwC,MAAMrD,EAAE,0DAIzB/B,GAKU,IAAIknE,OAAOC,KAAKC,UACtBC,QACP,CACE7sB,UACA8sB,sBAAuB,CACrB3xB,QAAS31C,EAAM2N,aACfE,SAAU,IAAIX,GAAMlN,GAAOmN,iBAAiB5C,QAGhD,CAACg9D,EAAS/kE,KAGR,GAFA2jE,GAAuB3rB,GAEnBh4C,IAAW0kE,OAAOC,KAAKK,eAAeC,GAAI,CAC5C,MAAMxlC,EAAWslC,EAAQ,GAAGG,SAASpiD,SACrC2gD,EAAmB,CAAEp5D,IAAKo1B,EAASp1B,MAAOE,IAAKk1B,EAASl1B,QACxDi5D,EAAkBpuB,GAAoBlP,SACtC4M,uBAAoBhuB,QAAQvlB,EAAE,6DAG9BkkE,OAAmBhpE,GACnBq4C,uBAAoBhuB,QAAQvlB,EAAE,8DAxBlCuzC,uBAAoBlwC,MAAMrD,EAAE,uDAiC5B4lE,GAFA1B,OAAmBhpE,IAkBjB2qE,GAAoB,KACpBh9D,EACF+8B,EAAQz5B,KAAK,qBAEbw4D,MAIEmB,GAAQC,IACZ,MAAMC,EAAwBhF,GAAmB,CAAEl2D,IAAK,EAAGE,IAAK,GAC1Di7D,GAAqC,OAAdlF,QAAc,IAAdA,OAAA,EAAAA,EAAgB5qB,oBAAqB6qB,QAAmB9lE,EAE/EgrE,EAAiBpF,GAAoB,OAACC,QAAD,IAACA,OAAD,EAACA,EAAgB5qB,kBAAmB6qB,EAAiB/iE,GAC1FkoE,EAAiDD,IFrLvCrF,GAAqBI,OEuLrC,MAAMhmE,EAA2C,CAC/CqN,IAAKO,EACL/D,OACAg3D,sBAAuB,CACrBn/B,KAAM0mC,EACNuB,OAAQzB,EACR9vB,YAAa,IAEfuoB,mBAAoB92D,IAAS81D,GAAaE,MAAQiI,OAAW7nE,EAC7DsN,OACA+C,kBAAmBk3D,EAAaA,EAAWpjE,MAAM,KAAO,GACxDo5C,UACAosB,YAAaoB,EAAuB,CAAEn7D,IAAKm7D,EAAqBn7D,IAAKC,IAAKk7D,EAAqBj7D,KAAQ,CAAEF,IAAK,EAAGC,IAAK,GACtHi6D,gBAAiBP,GACjB97D,cACAy9D,UAAW,KACXC,YAAa,KACbC,WAAY,KACZC,WAAY,KACZC,gBAAiB,GACjB1B,eAAgB,CAAEh6D,IAAKk7D,EAAsBl7D,IAAKC,IAAKi7D,EAAsBh7D,KAC7Ey7D,mBAAoBxoE,EAAQA,EAAM2N,aAAe,GACjDm5D,mBAAoBoB,EACpBO,SAAUzoE,EAAQA,EAAMqK,SAAMpN,GAGhC2jC,GAAIrT,iBAAiBvwB,EAAM4N,EAAK,SAAW,UAAUuc,MAAKhnB,IACxD,GAAsB,QAAlBA,EAAOqC,OAAkB,CAC3B,MAAM2oC,EAAShrC,EAAOnD,MAAQ,GAU9B,OATAunE,EAAap5B,EAAO5gC,MACpBo6D,EAAmBx5B,EAAO79B,mBAC1By4D,EAAgB56B,EAAOqP,SACvBorB,EAAoBz6B,EAAOzgC,aAC3Bm6D,EAAa15B,EAAOtkC,MACpBo+D,EAAkB95B,EAAOwyB,oBACzB4H,EAAqBp6B,EAAOu9B,eAC5BhD,EAAcv6B,EAAOs9B,eACrBlC,GAAiCp7B,EAAO67B,4BAI1C,GAAIp8D,EAAI,CACN,MAAM+9D,EAAa1vD,OAAOC,OAAOlc,EAAM,CAAEqN,IAAKO,IAC9Cg2B,GAAIxT,eAAeu7C,GAChBxhD,MAAK,KACJs5C,GAAiB,CAAE74C,QAAS7lB,EAAE,2BAC1B+lE,GACFF,aAGNhnC,GAAIzT,eAAenwB,GAChBmqB,MAAKpnB,IACJ0gE,GAAiB,CAAE74C,QAAS7lB,EAAE,2BAC1B+lE,EACFF,KAEAjgC,EAAQz5B,KAAM,cAAanO,EAASsK,cAmB1Cu+D,GAAoB,KACxBf,IAAK,IAGDgB,GACJ,gBAACtmD,GAAA,EAAD,WACE,eAACgvB,GAAD,CACEhnC,KAAK,OACL6V,MAAOre,EAAE,iBACT4D,MAAO4E,EACPnF,MAAOk/D,EACPr/B,YAAaljC,EAAE,iBACf0gB,SAAU4hD,IAEZ,eAAC9yB,GAAD,CACEhnC,KAAK,cACL6V,MAAOre,EAAE,uBACT4D,MAAO6+D,EACPp/D,MAAOs/D,EACPz/B,YAAaljC,EAAE,uBACf0gB,SAAUgiD,IAEZ,eAACzzB,GAAD,CACEzmC,KAAK,OACL6V,MAAOre,EAAE,iBACT4D,MAAOkB,EACPzB,MAAOw/D,EACPzzB,eAAgB+yB,EAChBzhD,SAlI6B9c,IACjCg5C,EAAQh5C,MAmILkB,IAAS81D,GAAaG,UACrB,eAAC9pB,GAAD,CACErtC,MAAOy/D,EACPnqD,QAASkpD,EACT/+D,MAAOkgE,EACP7iD,SArImC9c,IACzC0/D,EAAgB1/D,MAuIbkB,IAAS81D,GAAaE,OACrB,eAAC7pB,GAAD,CACErtC,MAAOm/D,EACP1/D,MAAO4/D,EACP/pD,QAASmpD,EACT3hD,SAzIwB9c,IAC9Bo/D,EAAap/D,OA2ITkB,IAAS81D,GAAaG,UAAYj2D,IAAS81D,GAAaE,QACxD,eAACtV,GAAD,CACEnnC,MAAOre,EAAE,mBACT4D,MAAOu/D,EACPziD,SAAU0iD,IAGd,eAAC1zB,GAAD,CACElnC,KAAK,cACL6V,MAAOre,EAAE,wBACT4D,MAAO+E,EACPtF,MAAOugE,EACPljD,SAAUm8B,EACV3Z,YAAaljC,EAAE,6BAKf+mE,GAAsBlxB,GAAoBgB,UFtWpB,EAACkqB,EACAC,EACA/iE,IACtB8iE,GACFC,GACC/iE,GAAS4M,GAAS5M,EAAMqO,MACzBs0D,GEgWqDoG,CAAc,OAACjG,QAAD,IAACA,OAAD,EAACA,EAAgB5qB,kBAAmB6qB,EAAiB/iE,IAEvHgpE,GFnViC7pC,KACvC,OAAQA,GACN,KAAKyjC,GAAqBO,KACxB,OAAOphE,EAAE,iCACX,KAAK6gE,GAAqBK,QACxB,OAAOlhE,EAAE,oCACX,KAAK6gE,GAAqBM,MACxB,OAAOnhE,EAAE,kCACX,KAAK6gE,GAAqBI,OACxB,OAAOjhE,EAAE,qCE0UyBknE,CADJpG,GAAoB,OAACC,QAAD,IAACA,OAAD,EAACA,EAAgB5qB,kBAAmB6qB,EAAiB/iE,IAGrGkpE,GACJ,gBAAC3mD,GAAA,EAAD,WACE,eAAC08C,GAAD,CACE10D,KAAK,QACL6V,MAAOre,EAAE,kBACT4D,MAAO3F,EACPoF,MAAOqgE,EACPxgC,YAAaljC,EAAE,wBACf0gB,SAAU+iD,EACV3jD,OAAQ,WAEV,eAAC0vB,GAAD,CACEhnC,KAAK,UACL6V,MAAOre,EAAE,oBACT4D,MAAO60C,EACPp1C,MAAO0gE,EACP7gC,YAAaljC,EAAE,oBACf8T,KAAM9T,EAAE,sCACR0gB,SAAUojD,EACVn2B,eAAgBu3B,GAChBz1B,OAAQy1B,KAEV,eAACjuB,GAAD,CACE54B,MAAOre,EAAE,qBACTkgC,SAAU6mC,GACVrmD,SAAUujD,EACVnwD,KAAMmzD,GACN/3B,SAAUu1B,KAEZ,eAACjf,GAAD,CACEnnC,MAAOre,EAAE,+BACT4D,MAAO6gE,GACP/jD,SAAUgkD,KAGZ,eAACpG,GAAD,CACE91D,KAAK,cACL6V,MAAOre,EAAE,wBACTkgC,SAAU6gC,EACVrgD,SAAUujD,IAEZ,eAACz0B,GAAD,CACEhnC,KAAK,6BACL6V,MAAOre,EAAE,qCACT4D,MAAOygE,GACP3jD,SAAU4jD,GACV70B,OA9HmC,KACvC,GAAwC,IAApC40B,GAAyBjqE,OAC3B,OAEF,MAAMgtE,EAAc9F,GAAyB98C,MAAM6/C,IAC/C+C,EACF9C,GAA4B8C,EAAY9nE,YAExCklE,GAAiC7jE,EAAgBsC,kCAuH/CI,MAAOkhE,QAyBP8C,GAAoB,IAEtB,uCACE,gBAACp6B,GAAA,EAAD,CAAKpgC,MAAO,CAACk4B,WAAY,UAAW2J,WAAY,IAAhD,UACE,eAAC/B,GAAA,EAAD,CAAKE,GAAI,EAAT,SACE,eAACuY,GAAD,CACEv4C,MAAO,CAACxP,OAAQ,QAChBuP,KAAMG,GAAKY,KACX4B,MAAOvP,EAAE,gCAHX,SAKG8mE,OAGL,eAACn6B,GAAA,EAAD,CAAKE,GAAI,EAAT,SACE,eAACuY,GAAD,CACEv4C,MAAO,CAACxP,OAAQ,QAChBuP,KAAMG,GAAKyH,UACXjF,MAAOvP,EAAE,gCAHX,SAKGmnE,UAIP,eAAC/wC,GAAD,UACE,eAACgB,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASotD,GAAnC,SACG7mE,EAAE,8BAOPsnE,GAAqB,KAGjB,IAAD,EAFP,OAAKtpE,EAID,eAAC,GAAD,CACE+V,OAAQ/V,EAASsK,IACjB2L,SAAQ,UAAEjW,EAASwK,YAAX,QAAmB,GAC3BwL,SAAS,WACT4xB,QAASA,EACTvF,QAASA,EACTc,OAAQA,EACRpnB,IAAK1J,GAAWpB,GAAOqC,aAActT,EAASsK,KAC9CohD,UAAU,EACVuW,aAAa,8BAZV,IAkBX,OACE,eAAClgC,GAAD,CACEl3B,GAAIA,EAAKoG,GAAOqC,aAAerC,GAAO0B,eACtCtC,OAAQxF,EACR+D,KAAMA,EACN2C,MAAOA,EACPgwB,WAAYv/B,EAAE,2BACd+Z,IAAKA,GAAO1J,GAAWpB,GAAOoE,aAAcxK,GAC5Cy1B,SAAUvkB,OAAM7e,EAAa8C,EAAWA,EAASwK,KAAO,GAP1D,SASE,eAACo2D,GAAD,CACE/1D,GAAG,sBACHg2D,iBAAiB,UACjBM,SAAS,eACTL,KApFG,CACL,CACElyD,KAAMG,GAAK8H,SACXtF,MAAOvP,EAAE,iCACT6I,GAAI,UACJ0oC,QAAS,IAAM81B,KACf7H,aAAc,IAAM,IAEtB,CACE5yD,KAAMG,GAAK2vB,SACXntB,MAAOvP,EAAE,4BACT6I,GAAI,YACJ0oC,QAAS,IAAM+1B,KACf9H,aAAc,IAAMh4B,GAAkBloC,iBC1bvC,MAAMioE,GAAa76D,IACxB,MAAM,MAAEzO,EAAF,MAAS4O,GAAUH,EACzB,OACE,kCACE,oBAAGC,UAAWI,GAAKyH,YAAc,IACjC,eAAC2H,GAAD,CAAUxP,UAAU,OAAO9H,KAAMoK,GAAOuE,UAAW3G,MAAOA,EAAO1M,MAAOlC,EAAMqK,IAA9E,SACG,IAAI6C,GAAMlN,GAAO4N,aAEnB5N,EAAMqO,KAAO,uCACX,IACD,qBACEoN,KAAO,mDAAkDzb,EAAMqO,IAAIxB,OAAO7M,EAAMqO,IAAIvB,MACpFwE,MAAOvP,EAAE,8BACT6M,MAAO,CAACy0B,SAAU,UAAW9iB,WAAY,UAAWC,YAAa,WACjEqB,OAAQ,SAJV,eAMK9f,EAAE,8BANP,IAMsC,oBAAG2M,UAAWI,GAAK4kD,eANzD,eCrBD,SAAS6V,GAAY7xB,GAC1B,OAAOnZ,MAAMle,KAAK,IAAImpD,IAAI9xB,GAAQA,U,kCCmB7B,MAAM+xB,GAAqBh7D,IAChC,MAAOooB,EAAQ5O,GAAW2O,GAASnoB,IAC5Bi7D,EAASC,GAAc9jE,mBAAS4I,EAAMi7D,UACtCE,EAASC,GAAchkE,mBAAS4I,EAAMm7D,SAOvC30B,EAAsB,KAC1BhtB,EAAQ,CACNyhD,UACAE,UACAzhC,WAAW,EACX2hC,YAAY,KAsBVC,EAAQL,EAAQn/D,KAChBy/D,EAAQJ,EAAQr/D,KAChB0/D,EAAQP,EAAQ5sC,mBAChBotC,EAAQN,EAAQ9sC,mBAChBqtC,EAAQT,EAAQ3sC,kBAChBqtC,EAAQR,EAAQ7sC,kBAChBstC,EAAgBN,IAAUC,EAC1BM,EAA0B,KAAVL,GAAiBA,IAAUC,EAC3CK,EAA0B,KAAVJ,GAAiBA,IAAUC,EAC3CI,EAAgBd,EAAQ7uC,aAAe+uC,EAAQ/uC,WAErD,OACE,gBAAC,KAAD,CAAOhD,KAAMhB,EAAQiB,OAAQmd,EAAqB/d,KAAK,KAAvD,UACE,eAACqB,GAAD,UAAcx2B,EAAE,6BAChB,gBAAC,KAAMm3B,KAAP,WACE,6BAAIn3B,EAAE,+BACN,eAAC,KAAD,UACE,mCACE,gCACE,8BAAKA,EAAE,iBACP,8BAAKgoE,IACL,qBAAIr7D,UAAW27D,EAAgBttD,KAAO0tD,OAAS,GAA/C,SAAoDT,OAEtD,gCACE,8BAAKjoE,EAAE,iBACP,8BAAKkoE,IACL,qBAAIv7D,UAAW47D,EAAgBvtD,KAAO0tD,OAAS,GAA/C,SAAoDP,OAEtD,gCACE,8BAAKnoE,EAAE,iBACP,8BAAKooE,IACL,qBAAIz7D,UAAW67D,EAAgBxtD,KAAO0tD,OAAS,GAA/C,SAAoDL,OAEtD,gCACE,8BAAKroE,EAAE,iBACP,8BAAK83B,GAAoB6vC,EAAQ7uC,cACjC,qBAAInsB,UAAW87D,EAAgBztD,KAAO0tD,OAAS,GAA/C,SAAoD5wC,GAAoB+vC,EAAQ/uC,yBAKxF,gBAACxC,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QA1EJ,KAC1BmuD,EAAWC,GACXC,EAAWH,IAwEP,SACE,oBAAGh7D,UAAWI,GAAK47D,WAErB,sBAAK97D,MAAO,CAAE8R,SAAU,KACxB,eAACyY,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASy5B,EAArC,SACGlzC,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAnEH,KAC3ByM,EAAQ,CACNyhD,UACAE,UACAzhC,WAAW,EACX2hC,YAAY,KA8DV,SACE,oBAAGp7D,UAAWI,GAAK0T,UAErB,gBAAC2W,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QA7DI,KAClCyM,EAAQ,CACNyhD,UACAE,UACAzhC,WAAW,EACX2hC,YAAY,KAwDV,UACE,oBAAGp7D,UAAWI,GAAK0T,QAClB,MACD,oBAAG9T,UAAWI,GAAKi2B,mBCzGhB4lC,GAAal8D,IACxB,MAAM,KAAEqO,EAAF,SAAQgE,GAAarS,EAE3B,OADeqS,EAAS1jB,MAAKiI,GAAKA,EAAEuF,KAAOkS,EAAKlS,KAE9C,wBAAM8D,UAAU,iBAAiBE,MAAO,CAAE2R,YAAa,EAAGC,aAAc,EAAGmY,WAAY,EAAGgiB,cAAe,GAAzG,UACE,oBAAGjsC,UAAY,GAAEI,GAAKozC,4BACtB,oBAAGxzC,UAAY,GAAEI,GAAK87D,oCAEtB,oBAAGl8D,UAAWI,GAAK87D,MAAOh8D,MAAO,CAAE2R,WAAY,EAAGC,YAAa,MCJ9D,IAAKqqD,GAMAC,GAkEAC,GAkBAC,GAdL,SAASC,GAAyBpkE,GACvC,OAAO9E,EAAE8E,IAASkkE,GAAWG,QAAU,qBAAuB,sB,SA7EpDL,K,qBAAAA,E,8BAAAA,E,wBAAAA,Q,cAMAC,K,cAAAA,E,gBAAAA,E,YAAAA,E,cAAAA,E,oBAAAA,E,kBAAAA,E,sBAAAA,E,oBAAAA,E,YAAAA,E,YAAAA,E,sBAAAA,E,gBAAAA,E,4BAAAA,E,eAAAA,Q,cAkEAC,K,gBAAAA,E,mBAAAA,Q,cAkBAC,K,oBAAAA,E,kBAAAA,E,aAAAA,Q,KAKZ,MAAMG,GAA+D,CACnE,CAACH,GAAcnrC,UAAW,yBAC1B,CAACmrC,GAAcI,SAAU,wBACzB,CAACJ,GAAc50D,MAAO,sBAEjB,SAASi1D,GAAuBxkE,GACrC,OAAO9E,EAAEopE,GAA0BtkE,KAAW,IAAMA,EAa/C,IAAKykE,I,SAAAA,K,oBAAAA,E,+BAAAA,E,qBAAAA,E,yBAAAA,E,wBAAAA,E,+BAAAA,E,qBAAAA,Q,KASZ,MAAMC,GAAmE,CACvE,CAACD,GAAkBE,UAAW,6BAC9B,CAACF,GAAkBG,eAAgB,kCACnC,CAACH,GAAkBI,UAAW,6BAC9B,CAACJ,GAAkBK,YAAa,+BAChC,CAACL,GAAkBM,YAAa,+BAChC,CAACN,GAAkBO,eAAgB,kCACnC,CAACP,GAAkBQ,UAAW,8BAGzB,SAASC,GAA2BllE,GACzC,OAAO9E,EAAEwpE,GAA8B1kE,KAAW,IAAMA,EAoCnD,IAAKmlE,I,SAAAA,K,0BAAAA,E,oBAAAA,E,sBAAAA,E,wBAAAA,E,eAAAA,Q,KAQZ,MAAMC,GAAgE,CACpE,CAACD,GAAeE,aAAc,6BAC9B,CAACF,GAAeG,UAAW,0BAC3B,CAACH,GAAe1uC,YAAa,4BAC7B,CAAC0uC,GAAeI,WAAY,2BAC5B,CAACJ,GAAeK,OAAQ,wBAEnB,SAASC,GAAwBzlE,GACtC,OAAO9E,EAAEkqE,GAA2BplE,KAAW,IAAMA,EAkDhD,SAAS0lE,GAAuBvuE,GACrC,OAAOA,EAAM6I,OAASikE,GAAgB0B,MAAQxuE,EAAM6I,OAASikE,GAAgB2B,KAU/E,MAAMC,GAAqC,CACzC,CACE7lE,KAAMikE,GAAgB0B,KACtB79D,KAAMG,GAAK69D,OACXpiE,KAAM,aACNqiE,OAAQ,gBACRptE,OAAQ,eAEV,CACEqH,KAAMikE,GAAgB+B,OACtBl+D,KAAMG,GAAKg+D,cACXviE,KAAM,eACNqiE,OAAQ,kBACRptE,OAAQ,iBAEV,CACEqH,KAAMikE,GAAgBiC,KACtBp+D,KAAMG,GAAKk+D,MACXziE,KAAM,aACNqiE,OAAQ,gBACRptE,OAAQ,eAEV,CACEqH,KAAMikE,GAAgBmC,MACtBt+D,KAAMG,GAAKo+D,MACX3iE,KAAM,cACNqiE,OAAQ,iBACRptE,OAAQ,gBAEV,CACEqH,KAAMikE,GAAgBqC,SACtBx+D,KAAMG,GAAKs+D,aACX7iE,KAAM,iBACNqiE,OAAQ,oBACRptE,OAAQ,mBAEV,CACEqH,KAAMikE,GAAgBphE,SACtBiF,KAAMG,GAAKu+D,OACX9iE,KAAM,iBACNqiE,OAAQ,oBACRptE,OAAQ,mBAEV,CACEqH,KAAMikE,GAAgBwC,QACtB3+D,KAAMG,GAAKy+D,OACXhjE,KAAM,gBACNqiE,OAAQ,mBACRptE,OAAQ,kBAEV,CACEqH,KAAMikE,GAAgB0C,aACtB7+D,KAAMG,GAAK2+D,UACXljE,KAAM,qBACNqiE,OAAQ,wBACRptE,OAAQ,uBAEV,CACEqH,KAAMikE,GAAgB2B,KACtB99D,KAAMG,GAAK4+D,MACXnjE,KAAM,aACNqiE,OAAQ,gBACRptE,OAAQ,eAEV,CACEqH,KAAMikE,GAAgB6C,UACtBh/D,KAAMG,GAAK8H,SACXrM,KAAM,kBACNqiE,OAAQ,qBACRptE,OAAQ,oBAEV,CACEqH,KAAMikE,GAAgB8C,UACtBj/D,KAAMG,GAAK++D,MACXtjE,KAAM,kBACNqiE,OAAQ,qBACRptE,OAAQ,oBAEV,CACEqH,KAAMikE,GAAgBgD,MACtBn/D,KAAMG,GAAKi/D,QACXxjE,KAAM,cACNqiE,OAAQ,iBACRptE,OAAQ,gBAEV,CACEqH,KAAMikE,GAAgBkD,OACtBr/D,KAAMG,GAAKm/D,KACX1jE,KAAM,eACNqiE,OAAQ,kBACRptE,OAAQ,iBAEV,CACEqH,KAAMikE,GAAgBoD,MACtBv/D,KAAMG,GAAKq/D,IACX5jE,KAAM,cACNqiE,OAAQ,iBACRptE,OAAQ,iBAIN4uE,GAAuB,CAC3B/jE,IAAK,GACL89D,UAAW,KACXC,YAAa,KACbC,WAAY,KACZgG,gBAAiB,WACjBC,QAAS,KACTC,UAAW,KACXC,SAAU,KACVC,cAAe,WACf/jE,YAAa,IAoGR,SAASgkE,GAAiBC,GAC/B,OAAOjC,GAAYtvE,MAAKiI,GAAKA,EAAEwB,OAAS8nE,KACnC,CACD9nE,KAAM8nE,EACNhgE,KAAMG,GAAKi/D,QACXxjE,KAAM,gBACNqiE,OAAQ,mBACRptE,OAAQ,kBAIP,SAASovE,GAAaD,GAC3B,OAAOD,GAAiBC,GAAWhgE,KAG9B,SAASkgE,GAAiBF,GAC/B,OAAO5sE,EAAE2sE,GAAiBC,GAAWpkE,MAOhC,SAASukE,GAAqBH,EAA4B3uE,GAC/D,OAAO+B,EAAE2sE,GAAiBC,GAAW/B,OAAQ,CAAE5sE,UAG1C,SAAS+uE,GAAgB/wE,GAC9B,OAAQA,EAAM6I,MACZ,KAAKikE,GAAgBmC,MACnB,OAAOX,GAAwBtuE,EAAMgxE,cACvC,KAAKlE,GAAgBphE,SACnB,OAAOqiE,GAA2B/tE,EAAMixE,iBAC1C,KAAKnE,GAAgBkD,OACnB,OAAO/C,GAAyBjtE,EAAMkxE,aACxC,KAAKpE,GAAgB6C,UACnB,MAA4B,SAAxB3vE,EAAMmxE,eAA6BnxE,EAAMoxE,iBAAkD,aAA/BpxE,EAAMoxE,gBAAgBvoE,UACpF,EAEOwkE,GAAuBrtE,EAAMmxE,eACxC,QACE,QASC,SAASE,GAAarxE,EAAoBsxE,GAAiB,GAChE,MAAMnvE,EAA0B,IAC1B,KAAE0G,GAAS7I,EAgFjB,GA/EI6I,IAASikE,GAAgB8C,WACxB/mE,IAASikE,GAAgBoD,OACzBrnE,IAASikE,GAAgBphE,UACzB7C,IAASikE,GAAgB0B,MACzB3lE,IAASikE,GAAgB2B,MACxBzuE,EAAMmqE,WAAanqE,EAAMoqE,aAAepqE,EAAMqqE,aAChDloE,EAAO+N,KAAK,CACVlM,IAAK,OACLsP,MAAOvP,EAAE,cACT4D,OAAQ3H,EAAMmqE,WAAa,KAAO,KAAOnqE,EAAMoqE,aAAe,KAAO,KAAOpqE,EAAMqqE,YAAc,SAIhGrqE,EAAMmqE,WAAanqE,EAAMoqE,aAAepqE,EAAMqqE,aAChDloE,EAAO+N,KAAK,CACVlM,IAAK,WACLsP,MAAOvP,EAAE,mBACT4D,OAAQ3H,EAAMmqE,WAAa,KAAO,KAAOnqE,EAAMoqE,aAAe,KAAO,KAAOpqE,EAAMqqE,YAAc,QAGhGrqE,EAAMswE,SAAWtwE,EAAMuwE,WAAavwE,EAAMwwE,WAC5CruE,EAAO+N,KAAK,CACVlM,IAAK,SACLsP,MAAOvP,EAAE,iBACT4D,OAAQ3H,EAAMswE,SAAW,KAAO,KAAOtwE,EAAMuwE,WAAa,KAAO,KAAOvwE,EAAMwwE,UAAY,QAK5FvhE,GAAQjP,EAAMggE,eAChB79D,EAAO+N,KAAK,CACVlM,IAAK,QACLsP,MAAOvP,EAAE,eACT4D,MAAO2pE,EACL,eAACpxD,GAAD,CAAUxP,UAAU,OAAO9H,KAAMoK,GAAOuE,UAAWrT,MAAOlE,EAAMyqE,SAAhE,SACG,IAAIv7D,GAAMlP,EAAMggE,cAAcpwD,aAE/B,IAAIV,GAAMlP,EAAMggE,cAAcpwD,aAGlC5P,EAAMuxE,MACRpvE,EAAO+N,KAAK,CACVlM,IAAK,OACLsP,MAAOvP,EAAE,iBACT4D,MAAO3H,EAAMuxE,OAGbvxE,EAAM6I,OAASikE,GAAgB+B,SAC7B7uE,EAAMwxE,aACRrvE,EAAO+N,KAAK,CACVlM,IAAK,aACLsP,MAAOvP,EAAE,oBACT4D,MAAO3H,EAAMwxE,cAGbxxE,EAAMyxE,kBACRtvE,EAAO+N,KAAK,CACVlM,IAAK,kBACLsP,MAAOvP,EAAE,yBACT4D,MAAO3H,EAAMyxE,oBAIfzxE,EAAM6I,OAASikE,GAAgBiC,OAC7B/uE,EAAM0xE,mBACRvvE,EAAO+N,KAAK,CACVlM,IAAK,kBACLsP,MAAOvP,EAAE,yBACT4D,MAAO3H,EAAM0xE,oBAGb1xE,EAAM2xE,iBACRxvE,EAAO+N,KAAK,CACVlM,IAAK,iBACLsP,MAAOvP,EAAE,wBACT4D,MAAO3H,EAAM2xE,mBAIf3xE,EAAM6I,OAASikE,GAAgBphE,SAAU,CA+B3C,GA9BI1L,EAAM4xE,eACRzvE,EAAO+N,KAAK,CACVlM,IAAK,eACLsP,MAAOvP,EAAE,sBACT4D,MAAO3H,EAAM4xE,gBAGb5xE,EAAM6xE,eACR1vE,EAAO+N,KAAK,CACVlM,IAAK,eACLsP,MAAOvP,EAAE,sBACT4D,MAAO3H,EAAM6xE,gBAGb7xE,EAAM8xE,iBACR3vE,EAAO+N,KAAK,CACVlM,IAAK,iBACLsP,MAAOvP,EAAE,+BACT4D,MAAO3H,EAAM8xE,kBAGb9xE,EAAM+xE,eACR5vE,EAAO+N,KAAK,CACVlM,IAAK,eACLsP,MAAOvP,EAAE,0BACT4D,MAAQ2pE,GAAStxE,EAAMgyE,qBACnB,eAAC9xD,GAAD,CAAUxP,UAAU,OAAO9H,KAAMoK,GAAOqE,mBAAoBnT,MAAOlE,EAAMgyE,qBAAzE,SAAgGhyE,EAAM+xE,gBACtG/xE,EAAM+xE,gBAGV/xE,EAAMiyE,eAAiBjyE,EAAMkyE,YAAa,CAC5C,MAAMz/D,EAAOzS,EAAMkyE,YAAc,IAAMlyE,EAAMiyE,cAC7C9vE,EAAO+N,KAAK,CACVlM,IAAK,eACLsP,MAAOvP,EAAE,2BACT4D,MAAQ2pE,GAAStxE,EAAMmyE,mBACnB,eAACjyD,GAAD,CAAUxP,UAAU,OAAO9H,KAAMoK,GAAOqE,mBAAoBnT,MAAOlE,EAAMmyE,mBAAzE,SAA8F1/D,IAC9FA,IAGJzS,EAAMoyE,cACRjwE,EAAO+N,KAAK,CACVlM,IAAK,cACLsP,MAAOvP,EAAE,yBACT4D,MAAO3H,EAAMoyE,eA6BnB,GAzBIpyE,EAAM6I,OAASikE,GAAgBwC,UAC7BtvE,EAAMqyE,eACRlwE,EAAO+N,KAAK,CACVlM,IAAK,eACLsP,MAAOvP,EAAE,sBACT4D,MAAO3H,EAAMqyE,gBAGbryE,EAAMsyE,eACRnwE,EAAO+N,KAAK,CACVlM,IAAK,eACLsP,MAAOvP,EAAE,sBACT4D,MAAO3H,EAAMsyE,iBAIftyE,EAAM6I,OAASikE,GAAgB2B,MAC7BzuE,EAAMuyE,cACRpwE,EAAO+N,KAAK,CACVlM,IAAK,SACLsP,MAAOvP,EAAE,oBACT4D,MAAO3H,EAAMuyE,eAIfvyE,EAAM6I,OAASikE,GAAgB6C,UAAW,CAC5C,GAAI3vE,EAAM8vB,YAAa,CACrB,MAAM0iD,EAAexyE,EAAMoxE,gBAAkBpxE,EAAMoxE,gBAAgB7kE,KAAO,IAAMvM,EAAM8vB,YACtF3tB,EAAO+N,KAAK,CACVlM,IAAK,WACLsP,MAAOvP,EAAE,2BACT4D,MAAO2pE,EACL,eAACpxD,GAAD,CAAUxP,UAAU,OAAO9H,KAAMoK,GAAOoE,aAAclT,MAAOlE,EAAM8vB,YAAnE,SACG0iD,IAEDA,IAGJxyE,EAAMyyE,cACRtwE,EAAO+N,KAAK,CACVlM,IAAK,cACLsP,MAAOvP,EAAE,sBACT4D,MAAO3H,EAAMyyE,eA2DnB,OAvDIzyE,EAAM6I,OAASikE,GAAgB8C,YAC7B5vE,EAAM0yE,YACRvwE,EAAO+N,KAAK,CACVlM,IAAK,sBACLsP,MAAOvP,EAAE,6BACT4D,MAAO3H,EAAM0yE,aAGb1yE,EAAM2yE,UACRxwE,EAAO+N,KAAK,CACVlM,IAAK,oBACLsP,MAAOvP,EAAE,2BACT4D,MAAO3H,EAAM2yE,YAKf3yE,EAAM6I,OAASikE,GAAgBoD,QAC7BlwE,EAAMmjC,YACRhhC,EAAO+N,KAAK,CACVlM,IAAK,iBACLsP,MAAOvP,EAAE,wBACT4D,MAAO3H,EAAMmjC,aAGbnjC,EAAM4yE,WACRzwE,EAAO+N,KAAK,CACVlM,IAAK,iBACLsP,MAAOvP,EAAE,uBACT4D,MAAO3H,EAAM4yE,YAGb5yE,EAAMwM,OACRrK,EAAO+N,KAAK,CACVlM,IAAK,iBACLsP,MAAOvP,EAAE,mBACT4D,MAAO3H,EAAMwM,QAGbxM,EAAM6yE,OACR1wE,EAAO+N,KAAK,CACVlM,IAAK,iBACLsP,MAAOvP,EAAE,oBACT4D,MAAO3H,EAAM6yE,SAKf7yE,EAAM0M,aACRvK,EAAO+N,KAAK,CACVlM,IAAK,cACLsP,MAAOvP,EAAE,qBACT4D,MAAO,sBAAK4mD,wBAAyBtB,GAAcjtD,EAAM0M,iBAGtDvK,EAGF,MAAM2wE,GAAoB,CAACp0D,EAAgBC,KAChD,MAAMo0D,EAAKC,GAA0Bt0D,GAC/Bu0D,EAAKD,GAA0Br0D,GAErC,GAAIo0D,IAAOE,EACT,OAAOF,EAAKE,EAEd,GAAMv0D,EAAE2rD,aAAe1rD,EAAE0rD,YAAe3rD,EAAE2rD,YAAe1rD,EAAE0rD,WACzD,OAAO3rD,EAAE2rD,WAAa1rD,EAAE0rD,WAE1B,GAAM3rD,EAAE0rD,cAAgBzrD,EAAEyrD,aAAgB1rD,EAAE0rD,aAAgBzrD,EAAEyrD,YAC5D,OAAO1rD,EAAE0rD,YAAczrD,EAAEyrD,YAE3B,GAAM1rD,EAAEyrD,YAAcxrD,EAAEwrD,WAAczrD,EAAEyrD,WAAcxrD,EAAEwrD,UACtD,OAAOzrD,EAAEyrD,UAAYxrD,EAAEwrD,UAEzB,MAAM+I,EAAKC,GAA0Bz0D,GAC/B00D,EAAKD,GAA0Bx0D,GACrC,GAAIu0D,IAAOE,EACT,OAAOF,EAAKE,EAEd,GAAI10D,EAAE7V,OAASikE,GAAgBphE,UAAYiT,EAAE9V,OAASikE,GAAgBphE,SAAU,CAG9E,OAFW2nE,GAAoB30D,GACpB20D,GAAoB10D,GAE1B,GAAID,EAAE7V,OAASikE,GAAgBmC,OAAStwD,EAAE9V,OAASikE,GAAgBmC,MAAO,CAG/E,OAFWqE,GAAiB50D,GACjB40D,GAAiB30D,GAEvB,GAAID,EAAE7V,OAASikE,GAAgB6C,WAAahxD,EAAE9V,OAASikE,GAAgB6C,UAAW,CAGvF,OAFW4D,GAAqB70D,GACrB60D,GAAqB50D,GAIlC,OAAO,GAIF,SAASq0D,GAA0BhzE,GACxC,OAAOwzE,GAA6BxzE,EAAM6I,MAGrC,SAAS2qE,GAA6B7C,GAC3C,OAAQA,GACN,KAAK7D,GAAgB0B,KACnB,OAAO,EACT,KAAK1B,GAAgB+B,OAErB,KAAK/B,GAAgBiC,KAErB,KAAKjC,GAAgBmC,MAErB,KAAKnC,GAAgBqC,SACnB,OAAO,EACT,KAAKrC,GAAgBphE,SAErB,KAAKohE,GAAgBkD,OAErB,KAAKlD,GAAgBwC,QAErB,KAAKxC,GAAgB0C,aACnB,OAAO,EACT,KAAK1C,GAAgB2B,KACnB,OAAO,EACT,KAAK3B,GAAgB6C,UACnB,OAAO,EACT,KAAK7C,GAAgB8C,UACnB,OAAO,EACT,KAAK9C,GAAgBoD,MACnB,OAAO,EACT,KAAKpD,GAAgBgD,MACnB,OAAO,EACT,QACE,OAAQ,GAMP,SAASqD,GAA0BnzE,GACxC,OAAQA,EAAM6I,MACZ,KAAKikE,GAAgB0B,KACnB,OAAO,EACT,KAAK1B,GAAgB+B,OACnB,OAAO,EACT,KAAK/B,GAAgBiC,KACnB,OAAO,EACT,KAAKjC,GAAgBmC,MACnB,OAAO,EACT,KAAKnC,GAAgBqC,SACnB,OAAO,EACT,KAAKrC,GAAgBphE,SACnB,OAAO,EACT,KAAKohE,GAAgBkD,OACnB,OAAO,EACT,KAAKlD,GAAgBwC,QACnB,OAAO,EACT,KAAKxC,GAAgB0C,aACnB,OAAO,EACT,KAAK1C,GAAgB2B,KACnB,OAAO,EACT,KAAK3B,GAAgB6C,UACnB,OAAO,GACT,KAAK7C,GAAgB8C,UACnB,OAAO,GACT,KAAK9C,GAAgBoD,MACnB,OAAO,GACT,KAAKpD,GAAgBgD,MACnB,OAAO,GACT,QACE,OAAQ,GAKd,SAASwD,GAAiBtzE,GACxB,MACO,gBADCA,EAAMgxE,aAEH,EAEA,EAKb,SAASqC,GAAoBrzE,GAC3B,OAAQA,EAAMixE,iBACZ,IAAK,WACH,OAAO,EACT,IAAK,YACH,OAAO,EACT,IAAK,iBACH,OAAO,EACT,IAAK,cACH,OAAO,EACT,QACE,OAAO,GAKb,SAASsC,GAAqBvzE,GAC5B,IAAIA,EAAMoxE,iBAAmBpxE,EAAMoxE,gBAAgBvoE,OAAS81D,GAAaG,SAUvE,OAAO,EATP,OAAQ9+D,EAAMmxE,eACZ,IAAK,WACH,OAAO,EACT,IAAK,UACH,OAAO,EACT,QACE,OAAO,GCh1BR,SAASsC,GACd1pB,EACA2pB,GAGA,MAAMxxE,EAAO0gC,GAAI1gC,KACXC,EAAkD,CACtD,IAAIkd,GAAqB,OAAQtb,EAAE,4BAA4BnC,IAC7D,MAAM+xE,EAAgB/xE,EAAOq6B,sBAAsB99B,OAAS,EAAI,KAAOyD,EAAOq6B,sBAAsBzsB,KAAK,MAAQ,IAAM,GACjHokE,EAAehyE,EAAOs6B,qBAAqB/9B,OAAS,EAAI,KAAOyD,EAAOs6B,qBAAqB1sB,KAAK,MAAQ,IAAM,GACpH,OACE,kCACE,0BAAQkB,UAAWqO,KAAO80D,WAA1B,UAAuCjyE,EAAO61B,SAAUm8C,KACxD,wBACA,wBAAMljE,UAAWqO,KAAO80D,WAAxB,UAAqCjyE,EAAO41B,UAAWm8C,UAG1D,CAAEz1D,UAAU,EAAMG,WAAW,IAAQ,CAACK,EAAGC,IAAMD,EAAEnS,KAAKqS,cAAcD,EAAEpS,QACzE,IAAIgS,GAAkB,YAAaxa,EAAE,iCAAiCnC,GAAUA,EAAOk9B,oBAAoB,CAAElhC,MAAO,MACpH,IAAI2gB,GAAkB,WAAYxa,EAAE,gCAAgCnC,GAAUA,EAAOm9B,mBAAmB,CAAEnhC,MAAO,MACjH,IAAIyhB,GAAqB,OAAQtb,EAAE,4BAA4BnC,IAC7D,MAAMy7B,EAAiBz7B,EAAOy7B,gBAAkB,GAC1CvwB,EAAOuwB,EAAel/B,OAAS,EAAIk/B,EAAe,GAAGu0C,mBAAgB3yE,EAC3E,OAAO,uCACJ2C,EAAOs9B,eACR,wBACCpyB,GAAS,IAAGA,MAAUlL,EAAOo7B,WAAaj5B,EAAE,qBAAuB,QAErE,CAAEma,UAAU,EAAOtgB,MAAO,IAAK8S,UAAWqO,KAAO+0D,OAAQz1D,WAAW,IACvE,IAAIgB,GAAqB,UAAWtb,EAAE,+BAA+BnC,IACnE,GAAIA,EAAOi7B,aAAevB,GAAW5vB,SAAU,CAC7C,MAAM2xB,EAAiBz7B,EAAOy7B,gBAAkB,GAC1C02C,EAAgB12C,EAAej+B,MAAKV,GAAKA,EAAEuyE,kBAAoB3D,GAAkBG,gBACjFuG,EAAiBzI,GACrBluC,EACGhiB,KAAI44D,GAAMA,EAAGnC,kBACbx0D,QAAO42D,GAAKA,KAEXC,EAAQ5I,GACZluC,EACGhiB,KAAI44D,GAAMA,EAAGpC,gBACbv0D,QAAO82D,GAAQA,KAEd7nE,EAAOwnE,GA7DrB,SAA+B/zE,GAC7B,MAAMwsB,EAAqB,GAM3B,OALIxsB,EAAMkyE,aACR1lD,EAAStc,KAAKlQ,EAAMkyE,aAClBlyE,EAAMiyE,eACRzlD,EAAStc,KAAKlQ,EAAMiyE,eAEE,IAApBzlD,EAASruB,OACJ6B,EAAM+xE,cAENvlD,EAAShd,KAAK,KAAO,KAAOxP,EAAM+xE,cAmDPsC,CAAsBN,GACpD,OACE,uCACE,eAAChoC,GAAA,EAAD,CAAOqN,MAAI,EAAChe,QAAQ,YAApB,SAAiC44C,EAAexkE,KAAK,SACpD,IACA2kE,EAAM3kE,KAAK,MACZ,wBACCjD,GAAQ,uBAAM+G,MAAO/G,EAAb,SAAoBA,OAIjC,OAAO,4BAER,CAAE8R,WAAW,EAAMH,UAAU,EAAOxN,UAAWqO,KAAOu1D,qBACzD,IAAIj1D,GAAqB,YAAatb,EAAE,iCAAiCnC,IACvE,MACM0vE,EAnFZ,SAAkC/zC,GAChC,MAAMx7B,EAAWw7B,EAAUn+B,MAAK2C,GAAYA,EAAS8G,OAAS81D,GAAaG,UAAY/8D,EAAS89D,sBAAsB8I,UACjHprC,EAAUn+B,MAAK2C,GAAYA,EAAS8G,OAAS81D,GAAaE,OAAS98D,EAAS89D,sBAAsB8I,SACvG,OAAO5mE,EAAW,CAACA,GAAY,GA+ETwyE,CAAyB3yE,EAAO27B,WAAa,IACvCliB,KAAItZ,GAC1B,gBAACme,GAAD,CAA6BtX,KAAMoK,GAAOoE,aAAclT,MAAOnC,EAASsK,IAAKqE,UAAWqO,KAAOy1D,YAA/F,UACE,oBAAG9jE,UAAWI,GAAK8H,WAClB,IACD,uBAAMlI,UAAU,OAAhB,SAAwB3O,EAASwK,SAHpBxK,EAASsK,OAM1B,OACE,gCACGilE,MAGJ,CAAEpzD,UAAU,KAiCjB,OA/BIhc,EAAKoL,WACPnL,EAAO+N,KACL,IAAI2P,GAAmB,UAAW9b,EAAE,+BAA+BnC,IACjE,MAAMO,EAAqD,GAwB3D,OAvBAA,EAAO+N,KAAK,CACVS,KAAMG,GAAKu5B,KACXz5B,MAAO4O,GAAoBQ,QAC3B9hB,QAAS6F,EAAE,uBACX6E,KAAMoK,GAAOuC,WACb0K,UAAWre,EAAOgL,KAEhB8mE,GACFvxE,EAAO+N,KAAK,CACVS,KAAM1H,GAAS,eAAC0jE,GAAD,CAAW7pD,SAAU7Z,EAAMwrE,iBAAkB31D,KAAMld,IAClEgP,MAAO4O,GAAoBk1D,QAC3Bx2E,QAAS6F,EAAE,wBACXyZ,QAAS,CAAC5b,EAAQqH,IAAUyqE,EAAe9xE,EAAQqH,KAGnD8gD,GACF5nD,EAAO+N,KAAK,CACVS,KAAMG,GAAK42B,YACX92B,MAAO4O,GAAoB8qB,OAC3BpsC,QAAS6F,EAAE,yBACXyZ,QAAS5b,GAAUmoD,EAAgBnoD,KAGhCO,IACN,CAAEvE,MAAO,OAGTuE,EAGF,SAASsnC,GAAc5mB,GAC5B,OAAQA,GACN,QACE,MAAO,SACT,IAAK,YACH,MAAO,iBACT,IAAK,WACH,MAAO,kBAcN,MAAMiD,GAAUhH,GAAiBA,EAAKlS,GAG7B6D,WACd,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,OAAoBc,EAApB,IAA4BpnB,GAAQrN,GAEnCm5B,EAAWC,GAAmB7gC,EAAa,YAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,EAAjC,QAAgD7Y,EAAhD,aAAyD0oE,EAAzD,cAAuEC,GAAkBhrC,EACzFirC,EAAiBtuD,mBACrB,IAAMtb,EAAmBoQ,KAAIpP,GAC3B,yBAAsBtE,MAAOsE,EAA7B,SAAuCD,GAAiBC,IAA3CA,MAEf,IAGF0X,qBACE,IAAMkmB,EAAgB,CAAE59B,QAASwE,EAAMxE,SAAWjB,EAAQE,OAC1D,CAAC2+B,EAAiBp5B,EAAMxE,UAG1B,MAAO6T,EAAOgqB,GAAYjiC,qBACpBkiC,EAAU3hC,GAAW,KACzBg8B,EAAQA,QACNxB,GAAIxQ,YACF,GACA9U,EAxBS,GAyBTorB,EAzBS,GA2BT,CAAC,CAACe,GAAc5kB,GAAaC,IAC7B,CAAC2W,GAAmBnf,UAAWmf,GAAmBq5C,gBAClD7oE,GACCzK,EAAO,WACX2nB,MAAKogD,GAAWz/B,EAAS,CACxBxnB,MAAOinD,EAAQjnD,MACftjB,KAAMuqE,EAAQvqE,KAAKqc,KAAIhU,GAAK,IAAIiR,GAAOjR,YAG3Csc,oBAAUomB,EAAS,CAACzsB,EAAQorB,EAAW7jB,EAAYC,EAAe7Y,IAElE,MAmBM2Y,EAAU2B,mBACd,IA+DSktD,IA9DqBvpC,UAC1B,MAAMC,QAAkBjF,EAAOrL,MAAcppB,GAC3C,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,4BACT6lB,QAAS7lB,EAAE,6BAA8B,CAAEwI,KAAM3K,EAAO2K,OACxDsuB,QAAS92B,EAAE,sBACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAGH05B,UAGCvH,GAAIzQ,aAAavwB,EAAOgL,IAC9B0qC,uBAAoBhuB,QAAQvlB,EAAE,6BAA8B,CAAEwI,KAAM3K,EAAO2K,QAC3Ew9B,QAGyBG,MAAOtoC,EAAgBqH,KAChD,MAAM0rE,EAAe1rE,EAAMwrE,iBAAiB,GAC5C,IAAKE,EAEH,YADA9qC,EAAgB,CAAE8qC,aAAc/yE,IAGlC,GAAI+yE,EAAa/nE,KAAOhL,EAAOgL,GAE7B,YADAi9B,EAAgB,CAAE8qC,kBAAc11E,IAIlC4qC,EAAgB,CAAE+qC,cAAehzE,IACjC,MAAMO,QAAe+iC,EAAOrL,MAA8BppB,GACxD,eAACg7D,GAAD,CACEC,QAASiJ,EACT/I,QAAShqE,KACL6O,MAGHtO,EAAOgoC,WAOZN,EAAgB,CACd8qC,kBAAc11E,EACd21E,mBAAe31E,UAGX2jC,GAAI1Q,aAAa/vB,EAAOupE,QAAQ9+D,GAAIzK,EAAOypE,QAAQh/D,IACzD61D,GAAiB,CACf74C,QAAS7lB,EAAE,2BAA4B,CAAE2a,EAAGi2D,EAAapoE,KAAMoS,EAAG/c,EAAO2K,SAEvEpK,EAAO2pE,WACTniC,EAAQz5B,KAAM,YAAW/N,EAAOupE,QAAQ9+D,MAExCm9B,KAlBAF,EAAgB,CACd+qC,mBAAe31E,QAuBvB,CAAC0qC,EAASzE,EAAQ6E,EAASF,IAGvBzB,EAAa7hB,mBAAQ,KACzB,MAAMwuD,EAAoB,GAK1B,OAJIJ,GACFI,EAAQ7kE,KAAKykE,GACXC,GACFG,EAAQ7kE,KAAK0kE,GACR,CAAEH,iBAAkBM,KAC1B,CAACJ,EAAcC,IAEZnsC,EAAmB,uCACvB,yBACE/3B,UAAU,eACV/I,MAAOsE,EACPwY,SArG0B/lB,IAC5BmrC,EAAgB,CAAE59B,QAASvN,EAAEkiB,cAAcjZ,SAqGzCiJ,MAAO,CAAEhT,MAAO,KAJlB,SAMGi3E,IAEFF,GACC,gBAACpqC,GAAA,EAAD,CAAa35B,MAAO,CAAE2R,WAAY,GAAIC,YAAa,IAAnD,UACE,gBAAC2Y,GAAA,EAAD,WACE,oBAAGzqB,UAAWI,GAAK87D,QAClB,IACA+H,EAAapoE,QAEhB,eAAC4uB,GAAA,EAAD,CAAQ3d,QArGmB,KAC/BqsB,EAAgB,CACd8qC,kBAAc11E,EACd21E,mBAAe31E,KAkGb,SACE,oBAAGyR,UAAWI,GAAKkkE,gBAM3B,OACE,eAAC7sC,GAAD,CACEv7B,GAAIoG,GAAOwD,YACX7F,KAAMG,GAAKmgC,MACX39B,MAAOvP,EAAE,qBACT+Z,IAAKA,EACLxc,KAAK,SACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPxB,WAAYA,EACZC,YAAawB,EACb/jB,OAAQA,GACRwiB,aA7HsB1mC,IACxB+nC,EAAQz5B,KAAM,YAAWtO,EAAOgL,OA6H9B27B,aAlIqB,KACvBoB,EAAQz5B,KAAK,oBAkIXu4B,iBAAkBA,KClVxB,MACM3iB,GAAS,CAAChH,EAAcvV,IAAkBuV,EAAKlS,GAmKtCqoE,OAzJiBxkE,IAAgC,IAAD,EAI7D,MAAOm5B,EAAWC,GAAmB7gC,EAAa,oBAC3C8W,EAAOgqB,GAAYjiC,sBACnB9F,EAAUmzE,GAAertE,mBAAgC4I,EAAM1O,WAIhE,QAAE4nC,EAAF,QAAWvF,EAAX,OAAoBc,GAAWz0B,GAC/B,OAAE6M,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkB8kB,EAyBzDjmB,qBAAU,KACRuxD,EAAYzkE,EAAM1O,YACjB,CAAC0O,EAAM1O,WAEV,MAAMgoC,EAAU3hC,GAAW,KAAO,IAAD,GAC3B,UAACqI,EAAM1O,gBAAP,aAAC,EAAgBsK,MA1BN,EAAC8e,EAAcC,KAC9B,MAAM,OAAC9N,EAAD,WAASuH,EAAT,cAAqBC,GAAiB8kB,EAC5C,OAAOxF,EAAQA,QACbxB,GAAIxQ,YACF,CAACmL,UAAS,OAAEx7B,QAAF,IAAEA,OAAF,EAAEA,EAAUsK,KACtBiR,EA/BS,GAgCTorB,EAhCS,GAkCT,CAAC,CAACe,EAAc5kB,GAAaC,IAC7B,CAAC2W,GAAmBq5C,iBACnB3rD,MAAMgsD,IACG,CACLn2E,KAAMm2E,EAAYn2E,KAAKqc,KAAI+5D,GAAW,IAAI98D,GAAO88D,KACjD9yD,MAAO6yD,EAAY7yD,UAG1B,YAYF+yD,GAAyClsD,MAAKnqB,IAC5C8qC,EAAS9qC,SAIb2kB,oBAAUomB,EAAS,CAACrB,EAAW7jB,EAAYC,IAE3C8iB,IACE,KACEmC,IACAF,EAAgB,CAACnB,UAAW,MAE9B,IACA,CAACprB,IAGHqG,oBAAUomB,EAAS,CAAChoC,IAIpB,MAkBM6iB,EAAkC2B,mBAAQ,KAyB9C,IAAI3B,EAAU6uD,IAvBoBvpC,UAChC,IAAKnoC,EACH,OAEF,MAAMooC,QAAkBjF,EAAOrL,MAAcppB,GAC3C,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,wCACT6lB,QAAS7lB,EAAE,0CACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAGH05B,UAGCvH,GAAI3S,yBAAyBruB,EAAOgL,GAApC,OAAwC7K,QAAxC,IAAwCA,OAAxC,EAAwCA,EAAUsK,KACxDirC,uBAAoBhuB,QAAQvlB,EAAE,yCAA0C,CAACwI,KAAM3K,EAAO2K,QACtFw9B,QAQF,OAHuB,IAAnBt5B,EAAMg9C,WACR7oC,EAAUA,EAAQtH,QAAOuF,GAAuB,YAAbA,EAAOjW,IAAkC,cAAdiW,EAAOjW,MAEhEgY,IACN,CAAC7iB,EAAUmjC,EAAQz0B,EAAMg9C,SAAU1jB,IAEhCN,EAAiB5mB,IACrB,OAAQA,GACN,QACE,MAAO,SACT,IAAK,YACH,MAAO,iBACT,IAAK,WACH,MAAO,mBAMb,OACE,uCACE,eAACkmB,GAAA,EAAKvO,OAAN,UACE,sBAAK5pB,MAAO,CAACgzB,QAAS,QAAtB,SACE,eAACmD,GAAD,CAAQx6B,KAAK,SAAS5E,MAAO2V,EAAQmH,SAvDV9c,IACjCkiC,EAAgB,IAAID,EAAWtsB,OAAQ3V,WAyDrC,eAACohC,GAAA,EAAK7N,KAAN,CAAWxqB,UAAU,mBAArB,SACE,eAACkV,GAAD,CACEC,gBAAqB,OAAL/F,QAAK,IAALA,OAAA,EAAAA,EAAO9gB,OAAQ,GAC/B4lB,QAASA,EACTkB,OAAQA,GACRE,YAnEkBlH,IACxB6qB,EAAQz5B,KAAKiE,GAAYnB,GAAOsE,WAAYwH,EAAKlS,MAmE3CqZ,cA5EmBrd,IACzBihC,EAAgB,CAAEnB,UAAW9/B,KA4EvBsd,cAzEkB,CAACrD,EAAgBmmB,KACzCa,EAAgB,CAAEhlB,WAAYhC,EAAQiC,cAAekkB,KAyE/ClkB,cAAeA,EACfD,WAAYA,EACZjc,KAAM8/B,EACN1nB,SA3JO,GA4JPD,WAAU,iBAAEjB,QAAF,IAAEA,OAAF,EAAEA,EAAOwC,aAAT,QAAkB,EAC5BhhB,KAAK,iBC7Jf,MAAM2kE,GAAc,CAACnG,GAAkB5wD,OAsHxBkI,OApHO3G,IAEpB,MAAM,QAAE2zB,EAAF,GAAWx3B,EAAX,QAAe+8B,EAAf,OAAwBzE,EAAxB,IAAgCpnB,GAAQrN,EAExC1O,EAAWopC,GAAY/G,EAASx3B,EAAIq5D,IACpC16B,EAAoBD,GAA4B,WAAD,OAAavpC,QAAb,IAAaA,OAAb,EAAaA,EAAUsK,KAEtEnK,EAAO0gC,GAAI1gC,KAqBXyiB,EAAe,IAEjB,eAACokB,GAAA,EAAKvO,OAAN,UACE,uBAAK5pB,MAAO,CAACgzB,QAAS,OAAQC,cAAe,OAA7C,UACE,uBAAKjzB,MAAO,CAAC8R,SAAU,EAAGw6B,YAAa,IAAvC,UACGn7C,GAAY,qBAAG6O,MAAO,IAAIu1B,GAAW7yB,MAAMozB,SAAUiW,aAAc,WAAvD,UAAmE,oBAC9EjsC,UAAWI,GAAK8H,WADL,WACkB7W,QADlB,IACkBA,OADlB,EACkBA,EAAUwK,QACxCxK,GACD,oBAAG6O,MAAO,IAAIu1B,GAAWI,KAAKH,MAAOuW,aAAc,UAAnD,SAA+D+iB,GAAqB39D,KACnFA,GAAYA,EAASi+D,cACtB,6BAAG,eAACsL,GAAD,CAAW16D,MAAOu1B,GAAWxoB,KAAK0oB,OAAQrkC,MAAOD,EAASi+D,oBAE9D99D,EAAKoL,WACJ,+BACE,eAAC4S,GAAD,CAAUtX,KAAMoK,GAAOqC,aAAcnR,MAAO0I,EAA5C,SACE,oBAAG8D,UAAWI,GAAKu5B,gBAS3B+gC,EAAoB,IAChB,uCACLzmD,IACA2wD,OAICA,EAAgB,IAElB,eAACvsC,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,OAASjqB,UAAU,mBAA7C,SACE,eAAC,GAAD,CAAuB3O,SAAUA,EACjB4nC,QAASA,EACTvF,QAASA,EACTc,OAAQA,EACRgN,QAAS,GACTub,UAAU,EACV3vC,IAAK,OAKrButD,EAAqB,KAGjB,IAAD,EAFP,OAAKtpE,EAID,uCACG4iB,IACD,eAAC,GAAD,CACE7M,OAAQ/V,EAASsK,IACjB2L,SAAQ,UAAEjW,EAASwK,YAAX,QAAmB,GAC3BwL,SAAS,WACT4xB,QAASA,EACTvF,QAASA,EACTc,OAAQA,EACRpnB,IAAK1J,GAAWpB,GAAOoE,aAAcrV,EAASsK,KAC9CohD,UAAU,EACVuW,aAAa,6BAdZ,IAqBX,OAAKjiE,EAID,eAAC+hC,GAAD,CACEl3B,GAAIoG,GAAOoE,aACXhF,OAAQxF,EACR+D,KAAMG,GAAK8H,SACXtF,MAAOvR,EAASwK,KAChBuR,IAAKA,GAAO1J,GAAWpB,GAAOoE,aAAcxK,GAL9C,SAME,eAAC+1D,GAAD,CACE/1D,GAAG,sBACHg2D,iBAAiB,WACjBM,SAAS,eACTL,KAnGC,CACL,CACElyD,KAAMG,GAAK8H,SACXtF,MAAOvP,EAAE,iCACT6I,GAAI,WACJ0oC,QAAS,IAAM81B,IACf7H,aAAc,IAAM,IAEtB,CACE5yD,KAAMG,GAAK2vB,SACXntB,MAAOvP,EAAE,4BACT6I,GAAI,YACJ0oC,QAAS,IAAM+1B,IACf9H,aAAc,IAAMh4B,EAAkBloC,iBAyElC,gCC9GL,MAAMkyE,GAAoB,CAAC9yE,EAA4ByiC,EAAqBswC,KACjFtwC,EAAOrL,MAAcppB,GACnB,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,iCACT6lB,QAAS7lB,EAAE,kCAAmC,CAAEwI,KAAO,IAAE9J,EAAY0gC,WAAa,IAAM1gC,EAAY2gC,eACpGvI,QAAS92B,EAAE,sBACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAEL0Y,MAAKghB,IACDA,GAGLvH,GAAI7N,kBAAkBtyB,EAAY4J,KAAK8c,MAAK,KAC1CmuB,uBAAoBhuB,QAAQvlB,EAAE,oCAC9ByxE,WCnBC,IAAKC,I,SAAAA,O,qBAAAA,I,qBAAAA,I,iCAAAA,I,kCAAAA,Q,KAmBL,MAAMC,GAAiBjlE,IAE5B,MAUM,YAAEhO,EAAF,MAAe2E,EAAf,SAAsB6rC,EAAtB,cAAgC0iC,EAAhC,UAA+C3nB,EAA/C,SAA0D9qD,GAAauN,EAiBvEmlE,EAAsB,CAACC,EAAiBtsE,KAC5C,QAAoBtK,IAAhBwD,EACF,OACyB,IAAIqzE,GAAmBrzE,GAC/BmzE,oBAAoBC,EAAStsE,EAAOrG,IAWnD6yE,EAAYxsE,GACW,IAAIusE,GAAmBrzE,GACxBszE,SAASxsE,EAAMrG,GAGrC8yE,EAA2BzsE,GAC3BA,IAAUksE,GAAWQ,SAAW1sE,IAAUksE,GAAWS,QAChD,IAEF,IAGHC,EAAuB/uE,EAAQ,0BAA4B,eAEjE,OACE,eAACmd,GAAA,EAAD,UACA,gBAACA,GAAA,EAAKstB,MAAN,CAAYC,UAAU,+BAAtB,UACE,eAACvtB,GAAA,EAAKwtB,MAAN,CAAYnhC,MA3DkB,CAChCy0B,SAAU,GACV5iB,MAAO,UACP6iB,cAAe,aAwDb,SAAgC0oB,IAChC,eAACzpC,GAAA,EAAKytB,QAAN,CACEzlC,KAAMkE,EAAMlE,KACZ5E,MAAOouE,EAAStlE,EAAM2lE,YACtB1lE,UAAWylE,EACXh9B,GAAG,WACHxF,KAAM,GACNjyB,SAAUuxB,EACVxuB,SAAU/lB,GArDOm3E,KACrB,MAAMQ,EAAYL,EAAwBvlE,EAAM2lE,YAC5CP,EAAQ13E,OAASk4E,IAGrBT,EAAoBC,EAASplE,EAAM2lE,iBACfn3E,IAAhBwD,GACFkzE,EAAclzE,KA8CG6zE,CAAc53E,EAAEkiB,cAAcjZ,SAE/C,eAAC4c,GAAA,EAAK+8B,KAAN,CAAW1wC,MA/DkB,CAC/B6R,MAAO,WA8DL,SAnCgBlZ,KAClB,IAAK9G,EACH,MAAO,MAGT,MAAQ,GAFWszE,EAASxsE,GAAOpL,UACjB63E,EAAwBzsE,MAgCrCgtE,CAAW9lE,EAAM2lE,cAEnBhvE,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,UCjGjC,MAAM0uE,GAGXnpE,YAAYlK,GAA6B,KAFzCA,iBAEwC,EACtCnE,KAAKmE,YAAcA,EAKdmzE,oBAAoBC,EAAiBtsE,EAAmBrG,GAC7D,MAAMszE,EAAqBl4E,KAAKm4E,sBAAsBltE,GACbjL,KAAKo4E,qBAAqBxzE,GACnDszE,GAAsBX,EAGjCc,sBAAsBC,EAAwBrtE,EAAmBrG,GACtE,MAAM2zE,EAAkBv4E,KAAKw4E,uBAAuBvtE,GACXjL,KAAKo4E,qBAAqBxzE,GACnD2zE,GAAmBD,EAK9BF,qBAAqBxzE,GACU,OAAhC5E,KAAKmE,YAAYs0E,iBAAuD93E,IAAhCX,KAAKmE,YAAYs0E,aAC3Dz4E,KAAKmE,YAAYs0E,WAAa,IAGhC,IAAIC,EAAmB14E,KAAKmE,YAAYs0E,WAAW7zE,GACnD,QAAwBjE,IAApB+3E,GAAqD,OAApBA,EAA0B,CAC7D,IAAIC,EAAe34E,KAAK44E,qBAAqBh0E,GAE7C,OADA5E,KAAKmE,YAAYs0E,WAAW7zE,GAAY+zE,EACjCA,EAEP,OAAOD,EAMJjB,SAASxsE,EAAmBrG,GACjC,MAAMszE,EAAqBl4E,KAAKm4E,sBAAsBltE,GACtD,QAAyBtK,IAArBX,KAAKmE,YAA2B,CAClC,MAAM00E,EAAY74E,KAAKmE,YAAYs0E,WACnC,QAAkB93E,IAAdk4E,GAAyC,OAAdA,EAAoB,CACjD,MAAM9nB,EAAI8nB,EAAUj0E,GACpB,GAAImsD,EAAG,CAEL,OADcA,EAAEmnB,IAAuB,KAK7C,MAAO,GAGFY,eAAe7tE,EAAmBrG,GACvC,MAAMm0E,EAAsB/4E,KAAKw4E,uBAAuBvtE,GACxD,QAAyBtK,IAArBX,KAAKmE,YAA2B,CAClC,MAAM00E,EAAY74E,KAAKmE,YAAYs0E,WACnC,QAAkB93E,IAAdk4E,GAAyC,OAAdA,EAAoB,CACjD,MAAM9nB,EAAI8nB,EAAUj0E,GACpB,GAAImsD,EAAG,CAEL,OADcA,EAAEgoB,IAAwB,KAK9C,OAAOl/B,GAAYm/B,YAMbb,sBAAsBltE,GAC5B,OAAQA,GACN,KAAKksE,GAAWQ,QACd,MAAO,eACT,KAAKR,GAAWS,QACd,MAAO,eACT,KAAKT,GAAW8B,cACd,MAAO,qBACT,KAAK9B,GAAW+B,cACd,MAAO,sBAILV,uBAAuBvtE,GAC7B,OAAQA,GACN,KAAKksE,GAAWQ,QAEhB,KAAKR,GAAWS,QACd,MAAO,eACT,KAAKT,GAAW8B,cAEhB,KAAK9B,GAAW+B,cACd,MAAO,sBAILN,qBAAqBh0E,GAC3B,MAAO,CACLu0E,aAAc,GACdC,aAAc,GACdC,aAAcx/B,GAAYm/B,YAC1BM,mBAAoB,GACpBC,mBAAoB,GACpBC,mBAAoB3/B,GAAYm/B,YAChCp0E,SAAUA,ICxGhB,MAgBM60E,GAAkCtnE,IACtC,MAAMunE,EAAYvnE,EAAMvN,SAClBkgE,EAlBuB5+D,KAC7B,OAAOA,GACL,KAAK2zC,GAAYm/B,YACf,MAAO,YACT,KAAKn/B,GAAY8/B,UACf,MAAO,UACT,KAAK9/B,GAAY+/B,KACf,MAAO,YAWUC,CAAsB1nE,EAAMjM,QACjD,OAAQ,eAACunC,GAAA,EAAD,CAAOn7B,MAAO,CAAC2R,WAAY,GAAI6Y,QAASgoC,EAAxC,SAAuD4U,KAQ1D,SAASI,GAAkC3nE,GAChD,MAAM4nE,EAAqB,IAAIvC,GAAmBrlE,EAAMhO,aACxD,OACE,+BACGwY,OAAOy+B,OAAOpB,IAAUj9B,KAAInY,GAC3B,eAAC60E,GAAD,CAEE70E,SAAUA,EACVsB,OAAQ6zE,EAAmBjB,eAAe3mE,EAAM2lE,WAAYlzE,IAFvDA,OAgBR,SAASo1E,GAAiC7nE,GAC/C,MAAM,SAACvN,EAAD,YAAWT,GAAegO,EAC1B4nE,EAAqB,IAAIvC,GAAmBrzE,GAClD,OACE,eAACs1E,GAAD,CAEE70E,SAAUA,EACVsB,OAAQ6zE,EAAmBjB,eAAe3mE,EAAM2lE,WAAYlzE,IAFvDA,GClDI,SAASq1E,GAAsB9nE,GAC5C,MAAM,YAAChO,GAAegO,EACtB,OACE,iCACE,uBAAKG,MAAO,CAACgzB,QAAS,OAAQkI,eAAgB,OAAQhD,WAAY,UAAlE,UACE,oBAAGl4B,MAAO,CAACsU,UAAW,SAAUtnB,MAAO,IAAK8S,UAAWI,GAAK0nE,MAC5D,gCACE,eAACJ,GAAD,CAAmC31E,YAAaA,EAAa2zE,WAAYX,GAAWQ,eAGxF,uBAAKrlE,MAAO,CAACgzB,QAAS,OAAQkI,eAAgB,OAAQhD,WAAY,UAAlE,UACE,oBAAGl4B,MAAO,CAACsU,UAAW,SAAUtnB,MAAO,IAAK8S,UAAWI,GAAK2nE,OAC1Dh2E,EAAYi2E,oBACd,gCACE,eAACN,GAAD,CAAmC31E,YAAaA,EAAa2zE,WAAYX,GAAW8B,mBAEnF90E,EAAYi2E,oBACf,gCACE,eAAC3sC,GAAA,EAAD,CAAO3Q,QAAQ,QAAf,SACGr3B,EAAE,yCAYR,SAAS40E,GAA8BloE,GAC5C,MAAM,YAAChO,EAAD,SAAcS,GAAYuN,EAChC,OACE,+BACE,uBAAKG,MAAO,CAACgzB,QAAS,OAAQkI,eAAgB,OAAQhD,WAAY,UAAlE,UACE,oBAAGl4B,MAAO,CAACsU,UAAW,SAAUtnB,MAAO,IAAK8S,UAAWI,GAAK0nE,MAC5D,gCACE,eAACF,GAAD,CAAkC71E,YAAaA,EAAa2zE,WAAYX,GAAWQ,QAAS/yE,SAAUA,WAOzG,SAAS01E,GAAmCnoE,GACjD,MAAM,YAAChO,EAAD,SAAcS,GAAYuN,EAChC,OACE,+BACE,uBAAKG,MAAO,CAACgzB,QAAS,OAAQkI,eAAgB,OAAQhD,WAAY,UAAlE,UACE,oBAAGl4B,MAAO,CAACsU,UAAW,SAAUtnB,MAAO,IAAK8S,UAAWI,GAAK2nE,OAC1Dh2E,EAAYi2E,oBACd,gCACE,eAACJ,GAAD,CAAkC71E,YAAaA,EAAa2zE,WAAYX,GAAW8B,cAAer0E,SAAUA,OAE3GT,EAAYi2E,oBACf,gCACE,eAAC3sC,GAAA,EAAD,CAAO3Q,QAAQ,QAAf,SACGr3B,EAAE,8CC7DR,SAAS80E,GAAsBvrE,EAAkBm/C,GACtD,MAAM7nC,EAAyC,CAC7C,IAAI3F,GAAuB,uBAAwBlb,EAAE,sBAAuB,CAAEua,WAAW,EAAM1gB,MAAO,OAGxG,IAAK,MAAMsF,KAAY+X,OAAOy+B,OAAOpB,IACnC1zB,EAAQ1U,KAAK,IAAImP,GAAsB,cAAanc,iBAAyBa,EAAE,uCAAwC,CAACb,SAAUA,KAAYT,GAC5I,eAACk2E,GAAD,CAA+Bl2E,YAAaA,EAAaS,SAAUA,KAClE,CAAEgb,UAAU,EAAOtgB,MAAO,GAAI0f,OAAQ,CACrC,CAAEtZ,IAAK,cAAe2D,MAAO,cAAeya,MAAOre,EAAE,oCACrD,CAAEC,IAAK,YAAa2D,MAAO,YAAaya,MAAOre,EAAE,kCACjD,CAAEC,IAAK,OAAQ2D,MAAO,OAAQya,MAAOre,EAAE,kCAI7C,IAAK,MAAMb,KAAY+X,OAAOy+B,OAAOpB,IACnC1zB,EAAQ1U,KAAK,IAAImP,GAAsB,cAAanc,uBAA+Ba,EAAE,4CAA6C,CAACb,SAAUA,KAAYT,GACvJ,eAACm2E,GAAD,CAAoCn2E,YAAaA,EAAaS,SAAUA,KACvE,CAAEgb,UAAU,EAAOtgB,MAAO,GAAI0f,OAAQ,CACrC,CAAEtZ,IAAK,cAAe2D,MAAO,cAAeya,MAAOre,EAAE,oCACrD,CAAEC,IAAK,YAAa2D,MAAO,YAAaya,MAAOre,EAAE,kCACjD,CAAEC,IAAK,OAAQ2D,MAAO,OAAQya,MAAOre,EAAE,kCA8B7C,OAzBA6gB,EAAQ1U,KAAK,IAAImP,GAAqB,WAAYtb,EAAE,kCAAkCtB,GACpFA,EAAYq2E,aAAe,oBAAGpoE,UAAU,iBAAoB,oBAAGA,UAAU,gBACxE,CAAEwN,UAAU,EAAOvN,KAAM,sBAAuB/S,MAAO,MAE1DgnB,EAAQ1U,KAAK,IAAImP,GAAqB,WAAYtb,EAAE,mCAAmCtB,GACrFA,EAAYs2E,cAAgB,oBAAGroE,UAAU,iBAAoB,oBAAGA,UAAU,gBACzE,CAAEwN,UAAU,EAAOvN,KAAM,kBAAmB/S,MAAO,MAEtDgnB,EAAQ1U,KAAK,IAAImP,GAAqB,QAAStb,EAAE,6BAA6BtB,IAAW,eACvF,UAAAA,EAAYu2E,oBAAZ,eAA0B76E,QAA1B,UAAmCsE,EAAYu2E,oBAA/C,aAAmC,EAA0B76E,OAAS,oBAAGuS,UAAU,iBAClF,CAAEC,KAAM,gBAAiB/S,MAAO,MAMnCgnB,EAAQ1U,KAAK,IAAIqO,GAAkB,iBAAkBxa,EAAE,iCAAiCtB,GACtFA,EAAYw2E,eAAiB,IAAIC,KAAKz2E,EAAYw2E,gBAAgBE,qBAAuBp1E,EAAE,+BAC1F,CAAEnG,MAAO,OAER0P,GACFsX,EAAQ1U,KAAK,IAAI2P,GAAmB,UAAW9b,EAAE,yBAAyB,IAAM0b,GAC9E,CAAE9O,KAAMG,GAAK42B,YAAa92B,MAAO4O,GAAoB8qB,OAAQ9sB,QAASivC,KACrE,CAAE7uD,MAAO,MAEPgnB,ECtCT,MAAMkB,GAAUrjB,GAA+BA,EAAY4J,IAG5C,SAASoK,GAAkBhG,GACxC,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,IAAoBtmB,GAAQrN,EAE5By0B,EAASkE,KACTlnC,EAAO0gC,GAAI1gC,MAEV0nC,EAAWC,GAAmB7gC,EAAa,kBAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,EAAjC,QAAgDC,GAAY6kB,GAC3D9pB,EAAOgqB,GAAYjiC,qBAEpBkiC,EAAUthC,uBAAY,KAC1B,MAAMjL,EAAW,GACjB,IAAK,MAAM8f,KAAUyH,EACfzH,EAAO3V,QACTnK,EAAS8f,EAAOuF,QAAUvF,EAAO3V,OAGrC+K,QAAQC,IAAI,WAAYnV,GACxB4mC,EAAQA,QAAQxB,GAAI1N,mBAClB13B,EArBW,GAsBXkrC,EAtBW,GAwBX,CAAC,CAAe7jB,EAAaC,GAAgB,CAAC,uBAAwBA,IACtExH,EACA,CAAC,mBACA9b,EAAO,gBACP2nB,MAAOrJ,IACNgqB,EAAShqB,QAEZ,CAACskB,EAAS9mB,EAAQorB,EAAW7jB,EAAYC,EAAeC,IAC3DpB,oBAAUomB,EAAS,CAACA,IAEpB,MAAMnlB,EAAU2B,mBAAQ,IAKfsyD,GAAsB32E,EAAKoL,WAJL7K,IAC3B8yE,GAAkB9yE,EAAayiC,GAAQ,KAAO6E,WAI/C,CAAC7nC,EAAMgjC,EAAQ6E,IAOlB,OACE,eAAC5B,GAAD,CACEv7B,GAAIoG,GAAOyD,kBACXqH,IAAKA,EACLnN,KAAMG,GAAKsoE,YACX9lE,MAAOvP,EAAE,uBACTzC,KAAK,cACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPvB,YAAawB,EACb/jB,OAAQA,GACRwiB,aAjBsB7lC,IACxB,MAAMqb,EAAM9K,GAAOyD,kBACnBkzB,EAAQz5B,KAAM,kBAAiBzN,EAAY4J,gBAAgByR,Q,wDCrCxD,MAAMu7D,GAA0B5oE,IACrC,MAAM,YACJw2B,EADI,QAEJ7C,EAFI,WAGJy9B,EAHI,cAIJyX,EAJI,SAKJvW,EALI,OAMJvvB,EANI,UAOJ+lC,EAPI,QAQJC,EARI,WASJC,EATI,QAUJx8D,EAVI,QAWJy8D,EAXI,SAYJzmC,GACExiC,GACGqoD,EAAS6gB,GAAc9xE,oBAAS,GAOvC,OACE,eAAC,KAAD,CACE+xE,aAAc,CAAEh8E,MAAO,QACvBi8E,WAAY,CACVnpE,UAAWgpE,EAAU,0BAA4B,eACjDzyC,cACAgM,WACAO,UAEFsmC,aAAcP,EACdz5D,MAA0B,IAAnB7C,EAAQ9e,QAAgB26D,EAAU,MAAC75D,GAAage,EACvD88D,UAAW,CAAEvnC,QAAS,SAAUvO,SAAU,QAAS8Z,WAAY,QAASi8B,OAAQ,iBAAkBC,OAAQ,KAC1GR,WAAY,CAAC36D,EAAmBo7D,SACrBj7E,IAAT6f,EACE,sBAAKlO,MAAO,CAAE6R,MAAO,OAAQ4iB,SAAU,IAAvC,SACwB,IAAtBw8B,EAAW1jE,OACP4F,EAAE,iCACSA,EAAVqgC,EAAY,6BAAkC,gCAGrD,sBAAyBxzB,MAAO,CAAEmtC,WAAYm8B,EAAgB,YAAc,QAAS1nC,QAAS,SAAUryB,OAAQ,WAAhH,SACGs5D,EAAW36D,IADJ06D,EAAQ16D,IAKtBnX,MAAOk6D,EACPp9C,SA/BkB/lB,IACpBi7E,GAAW,GACXL,EAAc56E,EAAEkiB,cAAcjZ,QA8B5Bo7D,SAAUA,KCvDHoX,GAAiB1pE,IAC5B,MAAM,MACJ2R,EADI,SAEJqC,EAFI,MAGJ9c,EAHI,MAIJP,GACEqJ,EACE7D,EAAKskC,GAAa,UACjBgwB,EAAWC,GAAgBt5D,mBAASF,EAAQA,EAAM4E,KAAO,IAChEoX,qBAAU,IAAMw9C,EAAax5D,EAAQA,EAAM4E,KAAO,KAAK,CAAC5E,IAExD,MAKO3F,EAAOwlE,GAAY3/D,qBACpBu0C,EAAUz0C,GAASA,EAAM8iE,SAU/B,OATA9mD,qBAAU,KACHy4B,EAKLxZ,GAAIxP,SAASgpB,GAASjzB,KAAKq+C,GAJzBA,OAASvoE,KAKV,CAACm9C,IAGF,gBAACvJ,GAAD,CAAYjmC,GAAIA,KAAQ6D,EAAxB,UACE,eAAC,GAAD,CACE1O,SAAU4F,EACVA,MAAOu5D,EACPliB,WArBkBl8B,IACtBq+C,EAAar+C,EAASvW,MACtBkY,EAAS3B,IAoBL2B,SAAU08C,EACVuY,aAAmBz6E,IAAVmI,EACT6/B,YAAa7kB,IAEdpgB,GAAS,eAACspE,GAAD,CAAWtpE,MAAOA,QAmB3B,MAAMo4E,WAA+B/5D,IAAMC,cAGhD3T,YAAY8D,GACV0oB,MAAM1oB,GADwC,KAFhD+wD,kBAEgD,OAShDC,mBAAsB95D,IAEpB,IAAI6oC,EAAQ7oC,EAAM6oC,MAAM,mFACpBA,GACFlyC,KAAKo7B,SAAS,CAAEzc,QAAS,KACzB2lB,GAAIvT,YAAYmhB,EAAM,IACnBrnB,MAAKhnB,IACAquC,GAASruC,GACX7D,KAAKqjE,eAAenxB,EAAM,GAAIruC,OAGpC7D,KAAKsjE,eAAej6D,GAGtBrJ,KAAKmS,MAAMgU,SAAS9c,IAvB0B,KA0BhDg6D,eAAiB,CAACh6D,EAAemX,KAC/BxgB,KAAKmS,MAAMuuC,WAAWlgC,GAEtBxgB,KAAKo7B,SAAS,CACZzc,QAAS,MA3BX3e,KAAK2K,MAAQ,CACXgU,QAAS,GACTgoB,MAAO,MA6BX28B,eAAej6D,GACTrJ,KAAKkjE,eACPv5B,aAAa3pC,KAAKkjE,cAClBljE,KAAKkjE,kBAAeviE,GAGjB0I,EAGHrJ,KAAKkjE,aAAethE,YAAW,IAAM5B,KAAK+7E,mBAAmB,KAF7D/7E,KAAKo7B,SAAS,CAAEzc,QAAS,KAM7Bo9D,kBACE,MAAM,MAAE1yE,EAAF,WAASs6D,GAAe3jE,KAAKmS,MACnCnS,KAAKkjE,kBAAeviE,EACpB2jC,GAAInT,cAAc9nB,EAAO,EAAG,GAAI,CAAC,CAAC,SAAUgb,GAAcyC,KAAM,GAAI68C,GACjE94C,MAAKmxD,GAAYh8E,KAAKo7B,SAAS,CAC9Bzc,QAASq9D,EAASt7E,SAIxB6f,SACE,MAAM,MAAElX,EAAF,YAASs/B,EAAT,QAAsByyC,GAAU,GAAUp7E,KAAKmS,OAC/C,QAAEwM,GAAY3e,KAAK2K,MACzB,OAAO,uCACL,eAACowE,GAAD,CACEpyC,YAAaA,EACb7C,aAA+BnlC,IAAtBX,KAAKkjE,aACdK,WAAYl6D,EACZ2xE,cAAeh7E,KAAKmjE,mBACpBsB,SAAUzkE,KAAKqjE,eACf4X,UAAWz6D,GAAQA,EAAKvS,KACxBitE,QAAS16D,GAAQA,EAAKzS,IACtBotE,WAAY36D,GAAQA,EAAKvS,KACzB0Q,QAASA,EACTy8D,QAASA,IAEVp7E,KAAK2K,MAAMg8B,UC9IlB,SAASs1C,GAAS5yE,GAChB,OAAOA,EAQF,MAAM6yE,GAAsB/pE,IACjC,MAAM,YAAEw2B,EAAF,MAAet/B,EAAf,SAAsB8c,EAAtB,OAAgCgG,GAAWha,GAE1CwM,EAASiiC,GAAcr3C,mBAAmB,KAC1CixD,EAAS6gB,GAAc9xE,oBAAS,GAYjCu8B,E/FxBD,SACL/7B,EACA6vC,EACArQ,GAEA,MAAOzD,EAASq2C,GAAc5yE,oBAAS,GAQvC,OAPA8b,qBAAU,KACR82D,GAAW,GACX,MAAMzyC,EAAU9nC,YAAW,KACzBmI,IAAW8gB,MAAK,IAAMsxD,GAAW,OAChC5yC,GACH,MAAO,IAAMI,aAAaD,KACzBkQ,GACI9T,E+FWSs2C,EAA4B,IACrC5hB,EAGEruC,EAAO9iB,GAAOwhB,KAAK+1B,GAFjBl1B,QAAQC,WAGhB,CAACQ,EAAQ9iB,GAAQ,KAEpB,OACE,eAAC0xE,GAAD,CACEpyC,YAAaA,EACb7C,QAASA,EACTy9B,WAAYl6D,EACZ2xE,cAtBkB3xE,IACpBgyE,GAAW,GACXl1D,EAAS9c,IAqBPo7D,SAlBoBp7D,IACtBgyE,GAAW,GACXl1D,EAAS9c,IAiBPsV,QAASA,EACTu8D,QAASe,GACTd,WAAYc,GACZhB,UAAWgB,MCpCJI,GAAiBlqE,IAC5B,MAAM,MAAE9I,EAAF,SAAS8c,EAAT,KAAmB3X,GAAS2D,EAE5Bga,EAAShiB,uBACbd,GAASi7B,GAAIzR,gBAAgB,CAAErkB,QAAQnF,EAAO,EAAG,KACjD,CAACmF,IAGH,OACE,eAAC0tE,GAAD,CACEvzC,YAAaljC,EAAE,0BACf4D,MAAOA,EACP8c,SAAUA,EACVgG,OAAQA,KAYDmwD,GAAsBnqE,IACjC,MAAM,MAAE9I,EAAF,SAAS8c,EAAT,KAAmB3X,GAAS2D,EAC5B7D,EAAKskC,GAAa,iBACxB,OACE,eAAC2B,GAAD,CAAYjmC,GAAIA,KAAQ6D,EAAxB,SACE,eAACkqE,GAAD,CAAehzE,MAAOA,EAAO8c,SAAUA,EAAU3X,KAAMA,OC5BhD+tE,GAAapqE,IACxB,MAAM,KAAE3D,EAAF,SAAQyF,EAAR,MAAkB5K,EAAlB,SAAyB8c,GAAahU,EAEtCga,EAAShiB,uBACbd,GAASi7B,GAAIxR,YAAY,CAAEtkB,OAAMyF,YAAY5K,EAAO,EAAG,KACvD,CAACmF,EAAMyF,IAGT,OACE,eAACioE,GAAD,CACEvzC,YAAaljC,EAAE,kCACf4D,MAAOA,EACP8c,SAAUA,EACVgG,OAAQA,KAiBDqwD,GAAerqE,IAC1B,MAAM,KAAE3D,EAAF,SAAQyF,EAAR,KAAkBE,EAAlB,MAAwB9K,EAAxB,SAA+B8c,GAAahU,EAE5Cga,EAAShiB,uBACbd,GAASi7B,GAAIvR,kBAAkB,CAAEvkB,OAAMyF,WAAUE,QAAQ9K,EAAO,EAAG,KACnE,CAACmF,EAAMyF,EAAUE,IAGnB,OACE,eAAC+nE,GAAD,CACEvzC,YAAaljC,EAAE,oCACf4D,MAAOA,EACP8c,SAAUA,EACVgG,OAAQA,KAqBDswD,GAAkBtqE,IAC7B,MAAM,UAAEuqE,EAAF,YAAaC,EAAb,aAA0BC,EAA1B,eAAwCC,EAAxC,KAAwDruE,EAAxD,SAA8DyF,GAAa9B,EAC3E7D,EAAKskC,GAAa,iBACxB,OACE,eAAC2B,GAAD,CAAYjmC,GAAIA,KAAQ6D,EAAxB,SACE,gBAACugC,GAAA,EAAD,WACE,eAACN,GAAA,EAAD,CAAKE,GAAI,EAAT,SACE,eAACkqC,GAAD,CAAanzE,MAAOszE,EAAax2D,SAAU02D,EAAgBruE,KAAMA,EAAMyF,SAAUA,EAAUE,KAAMuoE,MAEnG,eAACtqC,GAAA,EAAD,CAAKE,GAAI,EAAT,SACE,eAACiqC,GAAD,CAAWlzE,MAAOqzE,EAAWv2D,SAAUy2D,EAAcpuE,KAAMA,EAAMyF,SAAUA,YC0B/E6oE,GAA8BlpE,GAAOmJ,KAAIvO,GAC7C,yBAAmBnF,MAAOmF,EAA1B,SAAiCA,GAApBA,KAGR,MAAMuuE,WAAuBriD,GAMlCrsB,YAAY8D,GACV0oB,MAAM1oB,EAAO,MADyB,KALxC6qE,sBAKwC,OAJxCC,yBAIwC,OAHxCC,mBAGwC,OAFxCC,0BAEwC,OAiXxCC,uBAA0B7nC,IACxBv1C,KAAKo7B,SAAS,CACZiiD,UAAW9nC,EACX+nC,oBAAgB38E,KApXoB,KAwXxC48E,qBAAwBhoC,IACtBv1C,KAAKo7B,SAAS,CACZoiD,QAASjoC,EACTkoC,kBAAc98E,KA3XsB,KA+XxC+8E,mBAAsBC,IACpB39E,KAAKo7B,SAAS,CACZ13B,MAAOi6E,EACPxU,gBAAYxoE,KAlYwB,KAuYxCi9E,qBAAwB1/B,IACtBl+C,KAAKo7B,SAAS,CACZ8iB,UACAsrB,kBAAc7oE,KA1YsB,KA8YxCk9E,sBAAyBC,IACvB99E,KAAKo7B,SAAS,CACZ0iD,WACAC,mBAAep9E,KAjZqB,KAqZxCq9E,wBAA2BC,IACzBj+E,KAAKo7B,SAAS,CACZ6iD,aACAC,qBAAiBv9E,KAxZmB,KA4ZxCw9E,6BAAgCC,IAC9Bp+E,KAAKo7B,SAAS,CACZgjD,kBACAC,0BAAsB19E,KA/Zc,KAmaxC29E,uBAA0Bj1E,IACxBrJ,KAAKo7B,SAAS,CACZmjD,UAAWl1E,EACXm1E,oBAAgB79E,KAtaoB,KA0axC89E,6BAAgCC,IAC9B1+E,KAAKo7B,SAAS,CACZsjD,kBACAC,0BAAsBh+E,KA7ac,KAibxCi+E,4BAA+BC,IAC7B7+E,KAAKo7B,SAAS,CACZyjD,iBACAC,yBAAqBn+E,KApbe,KAwbxCo+E,0BAA6B11E,IAC3BrJ,KAAKo7B,SAAS,CACZ4jD,aAAc31E,EACd41E,uBAAmBt+E,KA3biB,KA+bxCu+E,0BAA6B71E,IAC3BrJ,KAAKo7B,SAAS,CACZ+jD,aAAc91E,EACd+1E,uBAAmBz+E,KAlciB,KAscxC0+E,8BAAiCC,IAC/Bt/E,KAAKo7B,SAAS,CACZkkD,mBACAC,2BAAuB5+E,KAzca,KA6cxC6+E,4BAA+BC,IAC7Bz/E,KAAKo7B,SAAS,CACZqkD,iBACAC,yBAAqB/+E,KAhde,KAodxCg/E,0BAA6Bn8E,IAC3BxD,KAAKo7B,SAAS,CACZ53B,eACAo8E,uBAAmBj/E,KAvdiB,KA2dxCk/E,6BAAgCC,IAC9B9/E,KAAKo7B,SAAS,CACZ0kD,kBACAC,0BAAsBp/E,KA9dc,KAkexCq/E,0BAA6BC,IAC3BjgF,KAAKo7B,SAAS,CACZ6kD,eACAC,uBAAmBv/E,KAreiB,KAyexCw/E,mCAAsCC,IACpCpgF,KAAKo7B,SAAS,CACZglD,wBACAC,gCAA4B1/E,KA5eQ,KAgfxC2/E,wBAA2Bj3E,IACzBrJ,KAAKo7B,SAAS,CACZmlD,WAAYl3E,EACZm3E,qBAAiB7/E,KAnfmB,KAufxC8/E,0BAA6BC,IAC3B1gF,KAAKo7B,SAAS,CACZslD,eACAC,uBAAmBhgF,KA1fiB,KA8fxCigF,0BAA6BC,IAC3B7gF,KAAKo7B,SAAS,CACZylD,eACAC,uBAAmBngF,KAjgBiB,KAqgBxCogF,wBAA2BC,IACzBhhF,KAAKo7B,SAAS,CACZ4lD,aACAC,qBAAiBtgF,KAxgBmB,KA4gBxCugF,+BAAiCt1C,UAE/B,IAAIloC,EAAQD,EAAS0oE,eAAiB7nC,GAAIxP,SAASrxB,EAAS0oE,eAAYxrE,EACxEX,KAAKo7B,SAAS,CACZ+lD,kBAAmB19E,EACnB29E,4BAAwBzgF,EACxB0gF,eAAgB39E,KAlhBoB,KAshBxC49E,0BAA6BC,IAC3BvhF,KAAKo7B,SAAS,CACZmmD,eACAC,uBAAmB7gF,KAzhBiB,KA6hBxC8gF,2BAA8Bp4E,IAC5BrJ,KAAKo7B,SAAS,CACZsmD,cAAer4E,EACfs4E,wBAAoBhhF,KAhiBgB,KAoiBxCihF,iCAAoCC,IAClC7hF,KAAKo7B,SAAS,CACZymD,sBACAC,8BAA0BnhF,KAviBU,KA2iBxCohF,+BAAkCC,IAChChiF,KAAKo7B,SAAS,CACZ4mD,oBACAF,8BAA0BnhF,KA9iBU,KAkjBxCshF,wBAA2BC,IACzBliF,KAAKo7B,SAAS,CACZ8mD,aACAC,qBAAiBxhF,KArjBmB,KAyjBxCyhF,wBAA2BC,IACzBriF,KAAKo7B,SAAS,CACZinD,aACAC,qBAAiB3hF,KA5jBmB,KAgkBxC4hF,4BAA+BC,IAC7BxiF,KAAKo7B,SAAS,CACZonD,iBACAC,yBAAqB9hF,KAnkBe,KAukBxC+hF,2BAA8BC,IAC5B3iF,KAAKo7B,SAAS,CACZunD,gBACAC,wBAAoBjiF,KA1kBgB,KA8kBxCkiF,uBAA0BC,IACxB9iF,KAAKo7B,SAAS,CACZ0nD,YACAC,oBAAgBpiF,KAjlBoB,KAqlBxCqiF,wBAA2BC,IACzBjjF,KAAKo7B,SAAS,CACZ6nD,aACAC,qBAAiBviF,KAxlBmB,KA4lBxCg4C,oBAAsB,KACpB34C,KAAKq7B,SA7lBiC,KAgmBxCixC,kBAAoB,KAClB,MAAM5qE,EAAQ1B,KAAKmjF,UACnB7+C,GAAItU,cAActuB,EAAOA,EAAMqM,IAAM,SAAW,UAC7C8c,MAAKhnB,IACJ,GAAsB,OAAlBA,EAAOqC,OAwCXlG,KAAK2rB,QAAQjqB,OAxCb,CACE,MAAMmtC,EAAShrC,EAAOnD,MAAQ,GAC9BV,KAAKo7B,SAAS,CACZkiD,eAAgBt0E,EAAoB6lC,EAAOg9B,WAC3C4R,aAAcz0E,EAAoB6lC,EAAOmjC,SACzC7I,WAAYngE,EAAoB6lC,EAAOs9B,UACvC3C,aAAcxgE,EAAoB6lC,EAAOokC,MACzC8K,cAAe/0E,EAAoB6lC,EAAOzgC,aAE1C8vE,gBAAiBl1E,EAAoB6lC,EAAOqkC,aAC5CmL,qBAAsBr1E,EAAoB6lC,EAAOskC,kBACjDqL,eAAgBx1E,EAAoB6lC,EAAO6jC,cAC3CiM,qBAAsB31E,EAAoB6lC,EAAOukC,mBACjD0L,oBAAqB91E,EAAoB6lC,EAAOwkC,iBAChD4L,kBAAmBj2E,EAAoB6lC,EAAO8jC,iBAC9CyM,kBAAmBp2E,EAAoB6lC,EAAOykC,eAC9CiM,sBAAuBv2E,EAAoB6lC,EAAO4kC,eAClDmM,kBAAmB52E,EAAoB6lC,EAAO8kC,eAC9C+L,oBAAqB12E,EAAoB6lC,EAAO+kC,aAChDmM,qBAAsB/2E,EAAoB6lC,EAAOilC,cACjDoM,kBAAmBl3E,EAAoB6lC,EAAO0kC,eAC9C8M,2BAA4Br3E,EAAoB6lC,EAAO2kC,iBACvDgN,gBAAiBx3E,EAAoB6lC,EAAO+jC,aAC5C+N,kBAAmB33E,EAAoB6lC,EAAOklC,eAC9C+M,kBAAmB93E,EAAoB6lC,EAAOmlC,eAC9CiN,gBAAiBj4E,EAAoB6lC,EAAOu0C,QAC5ChC,uBAAwBp4E,EAAoB6lC,EAAOrd,aACnDgwD,kBAAmBx4E,EAAoB6lC,EAAOslC,cAC9CwN,mBAAoB34E,EAAoB6lC,EAAOgkC,eAC/CiP,yBAA0B94E,EAAoB6lC,EAAOulC,YACrDiP,uBAAwBr6E,EAAoB6lC,EAAOwlC,UACnD8N,gBAAiBn5E,EAAoB6lC,EAAOy0C,OAC5ChB,gBAAiBt5E,EAAoB6lC,EAAO00C,QAC5Cd,oBAAqBz5E,EAAoB6lC,EAAOhK,YAChD+9C,mBAAoB55E,EAAoB6lC,EAAOylC,WAC/CyO,eAAgB/5E,EAAoB6lC,EAAO3gC,OAC3Cg1E,gBAAiBl6E,EAAoB6lC,EAAO0lC,cAroBpDv0E,KAAKg9E,iBAAmBrgE,OAAOy+B,OAAOs0B,IAAgB3yD,KAAIxS,GACxD,yBAAmBlB,MAAOkB,EAA1B,SAAiCylE,GAAwBzlE,IAA5CA,KAGfvK,KAAKi9E,oBAAsBtgE,OAAOy+B,OAAO4zB,IAAmBjyD,KAAIxS,GAC9D,yBAAmBlB,MAAOkB,EAA1B,SAAiCklE,GAA2BllE,IAA/CA,KAGfvK,KAAKk9E,cAAgBvgE,OAAOy+B,OAAOqzB,IAAY1xD,KAAIxS,GACjD,yBAAmBlB,MAAOkB,EAA1B,SAAiCokE,GAAyBpkE,IAA7CA,KAGfvK,KAAKm9E,qBAAuB,CAACzO,GAAcnrC,SAAUmrC,GAAcI,SAAS/xD,KAAIxS,GAC9E,yBAAmBlB,MAAOkB,EAA1B,SAAiCwkE,GAAuBxkE,IAA3CA,KAGfvK,KAAK2K,MAAQ,CACXowB,SAAS,EAETsiD,UAAW,CAAEviE,IAAK,GAAIC,MAAO,GAAIC,KAAM,IACvCwiE,QAAS,CAAE1iE,IAAK,GAAIC,MAAO,GAAIC,KAAM,IACrCtX,WAAO/C,EACPu9C,QAAS,GACT4/B,SAAU,GAEVG,WAAY,GACZG,gBAAiB,GAEjBM,gBAAiB,GACjBG,eAAgB,GAEhBN,UAAW7O,GAAeG,SAE1BmP,aAAchQ,GAAkBG,cAChCgQ,aAAc,GACdG,iBAAkB,GAClB97E,aAAc,GACdi8E,eAAgB,GAChBK,gBAAiB,GACjBG,aAAc,GACdG,sBAAuB,GAEvBG,WAAY9R,GAAWiD,OAEvBgP,aAAc,GACdG,aAAc,GAEdG,WAAY,GAEZG,uBAAmBxgF,EACnB4gF,aAAc,GACdG,cAAehT,GAAcI,QAE7B+S,oBAAqB,GACrBG,kBAAmB,GAEnBE,WAAY,GACZG,WAAY,GACZG,eAAgB,GAChBG,cAAe,GACfG,UAAW,GACXG,WAAY,IAIhB/8C,oBACElmC,KAAKwjF,KAAKxjF,KAAKmS,MAAMzQ,OAGvB8hF,KAAK9hF,GAwFH,OAvFA1B,KAAKo7B,SAAS,CACZiiD,UAAW,CACTviE,IAAyB,OAApBpZ,EAAMmqE,UAAqB,GAAKnqE,EAAMmqE,UAAU9mE,WACrDgW,MAA6B,OAAtBrZ,EAAMoqE,YAAuB,GAAKpqE,EAAMoqE,YAAY/mE,WAC3DiW,KAA2B,OAArBtZ,EAAMqqE,WAAsB,GAAKrqE,EAAMqqE,WAAWhnE,YAE1Du4E,oBAAgB38E,EAChB68E,QAAS,CACP1iE,IAAuB,OAAlBpZ,EAAMswE,QAAmB,GAAKtwE,EAAMswE,QAAQjtE,WACjDgW,MAA2B,OAApBrZ,EAAMuwE,UAAqB,GAAKvwE,EAAMuwE,UAAUltE,WACvDiW,KAAyB,OAAnBtZ,EAAMwwE,SAAoB,GAAKxwE,EAAMwwE,SAASntE,YAEtD04E,kBAAc98E,EACd+C,MAAOiN,GAAQjP,EAAMggE,cAAgBhgE,EAAMggE,kBAAe/gE,EAC1DwoE,gBAAYxoE,EACZu9C,QAASx8C,EAAMuxE,MAAQ,GACvBzJ,kBAAc7oE,EACdm9E,SAAUp8E,EAAM0M,YAChB2vE,mBAAep9E,EAEfs9E,WAAY,GACZC,qBAAiBv9E,EACjBy9E,gBAAiB,GACjBC,0BAAsB19E,EAEtB+9E,gBAAiB,GACjBC,0BAAsBh+E,EACtBk+E,eAAgB,GAChBC,yBAAqBn+E,EAErB49E,UAAW7O,GAAeG,SAC1B2O,oBAAgB79E,EAEhBq+E,aAAchQ,GAAkBG,cAChC8P,uBAAmBt+E,EACnBw+E,aAAc,GACdC,uBAAmBz+E,EACnB2+E,iBAAkB,GAClBC,2BAAuB5+E,EACvB6C,aAAc,GACdo8E,uBAAmBj/E,EACnB8+E,eAAgB,GAChBC,yBAAqB/+E,EACrBm/E,gBAAiB,GACjBC,0BAAsBp/E,EACtBs/E,aAAc,GACdC,uBAAmBv/E,EACnBy/E,sBAAuB,GACvBC,gCAA4B1/E,EAE5B4/E,WAAY9R,GAAWiD,OACvB8O,qBAAiB7/E,EAEjB+/E,aAAc,GACdC,uBAAmBhgF,EACnBkgF,aAAc,GACdC,uBAAmBngF,EAEnBqgF,WAAY,GACZC,qBAAiBtgF,EAEjBwgF,uBAAmBxgF,EACnBygF,4BAAwBzgF,EACxB4gF,aAAc,GACdC,uBAAmB7gF,EACnB+gF,cAAehT,GAAcI,QAC7B6S,wBAAoBhhF,EAEpBkhF,oBAAqB,GACrBC,8BAA0BnhF,EAC1BqhF,kBAAmB,GACnBqB,4BAAwB1iF,EAExBuhF,WAAY,GACZC,qBAAiBxhF,EACjB0hF,WAAY,GACZC,qBAAiB3hF,EACjB6hF,eAAgB,GAChBC,yBAAqB9hF,EACrBgiF,cAAe,GACfC,wBAAoBjiF,EACpBmiF,UAAW,GACXC,oBAAgBpiF,EAChBsiF,WAAY,GACZC,qBAAiBviF,IAGXe,EAAM6I,MACZ,KAAKikE,GAAgB+B,OACnBvwE,KAAKo7B,SAAS,CACZ6iD,WAAYv8E,EAAMwxE,YAClBkL,gBAAiB18E,EAAMyxE,mBAEzB,MACF,KAAK3E,GAAgBmC,MACnB3wE,KAAKo7B,SAAS,CACZmjD,UAAW78E,EAAMgxE,eAEnB,MACF,KAAKlE,GAAgBiC,KACnBzwE,KAAKo7B,SAAS,CACZsjD,gBAAiBh9E,EAAM0xE,kBACvByL,eAAgBn9E,EAAM2xE,kBAExB,MACF,KAAK7E,GAAgBphE,SACnBpN,KAAKo7B,SAAS,CACZ4jD,aAAct9E,EAAMixE,gBACpBwM,aAAcz9E,EAAM4xE,cACpBgM,iBAAkB59E,EAAM+xE,cACxBjwE,aAAc9B,EAAMiyE,cACpB8L,eAAgB/9E,EAAMkyE,YACtBkM,gBAAiBp+E,EAAMoyE,aACvBsM,sBAAuB1+E,EAAM8xE,gBAC7ByM,aAAcv+E,EAAM6xE,gBAEtB,MACF,KAAK/E,GAAgBkD,OACnB1xE,KAAKo7B,SAAS,CACZmlD,WAAY7+E,EAAMkxE,cAEpB,MACF,KAAKpE,GAAgBwC,QACnBhxE,KAAKo7B,SAAS,CACZylD,aAAcn/E,EAAMsyE,cACpB0M,aAAch/E,EAAMqyE,gBAEtB,MACF,KAAKvF,GAAgB2B,KACnBnwE,KAAKo7B,SAAS,CACZ4lD,WAAYt/E,EAAMuyE,eAEpB,MACF,KAAKzF,GAAgB6C,UACnBrxE,KAAKo7B,SAAS,CACZ+lD,kBAAmBz/E,EAAMoxE,gBACzByO,aAAc7/E,EAAMyyE,aACpBuN,cAAehgF,EAAMmxE,gBAEvB,MACF,KAAKrE,GAAgB8C,UACnBtxE,KAAKo7B,SAAS,CACZymD,oBAAqBngF,EAAM0yE,WAC3B4N,kBAAmBtgF,EAAM2yE,WAE3B,MACF,KAAK7F,GAAgBoD,MACnB5xE,KAAKo7B,SAAS,CACZ8mD,WAAYxgF,EAAM4hF,OAAS,GAC3BjB,YAAa3gF,EAAM6hF,QAAU,IAAIx+E,WACjCy9E,eAAgB9gF,EAAMmjC,YAAc,GACpC89C,cAAejhF,EAAM4yE,WAAa,GAClCwO,UAAWphF,EAAMwM,OAAS,GAC1B+0E,WAAYvhF,EAAM6yE,OAAS,KAE7BjwC,GAAIvU,SAASruB,EAAMqM,KAAK8c,MAAKnpB,IAC3B,MAAM+hF,EAAa/hF,EACnB1B,KAAKo7B,SAAS,CACZ8mD,WAAYuB,EAAWH,OAAS,GAChCjB,YAAaoB,EAAWF,QAAU,IAAIx+E,WACtCy9E,eAAgBiB,EAAW5+C,YAAc,GACzC89C,cAAec,EAAWnP,WAAa,GACvCwO,UAAWW,EAAWv1E,OAAS,GAC/B+0E,WAAYQ,EAAWlP,OAAS,SAO1C4O,UACE,MAAM,MAAEzhF,GAAU1B,KAAKmS,OACjB,UACJkrE,EADI,QAEJG,EAFI,MAGJ95E,EAHI,QAIJw6C,EAJI,WAKJ+/B,EALI,gBAMJG,EANI,gBAOJM,EAPI,eAQJG,EARI,UASJN,EATI,aAUJS,EAVI,aAWJG,EAXI,iBAYJG,EAZI,eAaJG,EAbI,aAcJj8E,EAdI,gBAeJs8E,EAfI,aAgBJG,EAhBI,sBAiBJG,EAjBI,WAkBJG,EAlBI,aAmBJG,EAnBI,aAoBJG,EApBI,WAqBJG,EArBI,kBAsBJG,EAtBI,aAuBJI,EAvBI,cAwBJG,EAxBI,eAyBJL,EAzBI,oBA0BJQ,EA1BI,kBA2BJG,EA3BI,WA4BJE,EA5BI,WA6BJG,EA7BI,eA8BJG,EA9BI,cA+BJG,EA/BI,UAgCJG,EAhCI,WAiCJG,EAjCI,SAkCJnF,GACE99E,KAAK2K,MAGH+4E,EAA6B,KAAlBrG,EAAUviE,IAAa,KAAOuH,SAASg7D,EAAUviE,KAC5D6oE,EAAiC,KAApBtG,EAAUtiE,MAAe,KAAOsH,SAASg7D,EAAUtiE,OAChE6oE,EAA+B,KAAnBvG,EAAUriE,KAAc,KAAOqH,SAASg7D,EAAUriE,MAC9D6oE,EAAyB,KAAhBrG,EAAQ1iE,IAAa,KAAOuH,SAASm7D,EAAQ1iE,KACtDgpE,EAA6B,KAAlBtG,EAAQziE,MAAe,KAAOsH,SAASm7D,EAAQziE,OAC1DgpE,EAA2B,KAAjBvG,EAAQxiE,KAAc,KAAOqH,SAASm7D,EAAQxiE,MACxDgpE,EAAY1uC,GAAoB+nC,GAChC4G,EAAU3uC,GAAoBkoC,GAE9B0G,EAAWvnE,OAAOC,OAAO,GAAIlb,EAAO,CACxCmqE,UAAW6X,EACX5X,YAAa6X,EACb5X,WAAY6X,EACZ7R,gBAAiBiS,EACjBhS,QAAS6R,EACT5R,UAAW6R,EACX5R,SAAU6R,EACV5R,cAAe8R,EACf9X,SAAUzoE,EAAQA,EAAMqK,IAAK,KAC7B2zD,aAAch+D,EACduvE,KAAM/0B,EACN9vC,YAAa0vE,IAEf,OAAQoG,EAAS35E,MACf,KAAKikE,GAAgB+B,OACnB2T,EAAShR,YAAe+K,EACxBiG,EAAS/Q,iBAAmBiL,EAC5B,MACF,KAAK5P,GAAgBmC,MACnBuT,EAASxR,aAAe6L,EACxB,MACF,KAAK/P,GAAgBiC,KACnByT,EAAS9Q,kBAAoBsL,EAC7BwF,EAAS7Q,gBAAkBwL,EAC3B,MACF,KAAKrQ,GAAgBphE,SACnB82E,EAASvR,gBAAkBqM,EAC3BkF,EAAS5Q,cAAgB6L,EACzB+E,EAASzQ,cAAgB6L,EACzB4E,EAASvQ,cAAgBnwE,EACzB0gF,EAAStQ,YAAc6L,EACvByE,EAASpQ,aAAegM,EACxBoE,EAAS3Q,cAAgB0M,EACzBiE,EAAS1Q,gBAAkB4M,EAC3B,MACF,KAAK5R,GAAgBkD,OACnBwS,EAAStR,YAAc2N,EACvB,MACF,KAAK/R,GAAgBwC,QACnBkT,EAASnQ,cAAgB2M,EACzBwD,EAASlQ,cAAgB6M,EACzB,MACF,KAAKrS,GAAgB0C,aACnB,MACF,KAAK1C,GAAgB2B,KACnB+T,EAASjQ,aAAe+M,EACxB,MACF,KAAKxS,GAAgB6C,UACnB6S,EAAS1yD,YAAc2vD,EAAoBA,EAAkBpzE,IAAM,KACnEm2E,EAASrR,cAAgB6O,EACzBwC,EAAS/P,aAAeoN,EACpBJ,IACF+C,EAASpR,gBAAkB,IACtBqO,EACHpvE,IAAKovE,EAAkB5W,eACvB4Z,WAAYhD,EAAkBlV,iBAEhCiY,EAASxiB,aAAe2f,GAE1B,MACF,KAAK7S,GAAgB8C,UACnB4S,EAAS9P,WAAayN,EACtBqC,EAAS7P,SAAW2N,EACpB,MACF,KAAKxT,GAAgBoD,MACnBsS,EAASZ,MAAQpB,EACjBgC,EAASX,OAASlhE,SAASggE,GAC3B6B,EAASr/C,WAAa29C,EACtB0B,EAAS5P,UAAYqO,EACrBuB,EAASh2E,MAAQ40E,EACjBoB,EAAS3P,MAAQ0O,EAGrB,OAAOiB,EAkSTE,qBACE,MAAM,MAAE1iF,GAAU1B,KAAKmS,OACjB,UACJkrE,EADI,eAEJC,EAFI,QAGJE,EAHI,aAIJC,EAJI,MAKJ/5E,EALI,WAMJylE,EANI,QAOJjrB,EAPI,aAQJsrB,EARI,WAUJyU,EAVI,gBAWJC,EAXI,gBAYJE,EAZI,qBAaJC,EAbI,gBAeJK,EAfI,qBAgBJC,EAhBI,eAiBJE,EAjBI,oBAkBJC,EAlBI,UAoBJP,EApBI,eAqBJC,EArBI,aAuBJQ,EAvBI,kBAwBJC,EAxBI,aAyBJE,EAzBI,kBA0BJC,EA1BI,iBA2BJE,EA3BI,sBA4BJC,EA5BI,eA6BJE,EA7BI,oBA8BJC,EA9BI,aA+BJl8E,EA/BI,kBAgCJo8E,EAhCI,gBAiCJE,EAjCI,qBAkCJC,EAlCI,aAmCJE,EAnCI,kBAoCJC,EApCI,sBAqCJE,EArCI,2BAsCJC,EAtCI,WAwCJE,EAxCI,gBAyCJC,EAzCI,aA2CJE,EA3CI,kBA4CJC,EA5CI,aA6CJE,EA7CI,kBA8CJC,EA9CI,WAgDJE,EAhDI,gBAiDJC,EAjDI,kBAmDJE,EAnDI,uBAoDJC,EApDI,aAqDJG,EArDI,kBAsDJC,EAtDI,cAuDJE,EAvDI,mBAwDJC,EAxDI,oBA0DJE,EA1DI,yBA2DJC,EA3DI,kBA4DJE,EA5DI,uBA6DJqB,EA7DI,WA+DJnB,GA/DI,gBAgEJC,GAhEI,WAiEJE,GAjEI,gBAkEJC,GAlEI,eAmEJE,GAnEI,oBAoEJC,GApEI,cAqEJE,GArEI,mBAsEJC,GAtEI,UAuEJE,GAvEI,eAwEJC,GAxEI,WAyEJE,GAzEI,gBA0EJC,IACEljF,KAAK2K,OACH,KAAEJ,IAAS7I,EAEXmC,GAAwB,GAmV9B,OAlVI0G,KAASikE,GAAgB8C,WACtB/mE,KAASikE,GAAgBoD,OACzBrnE,KAASikE,GAAgBphE,UACzB7C,KAASikE,GAAgB0B,MACzB3lE,KAASikE,GAAgB2B,KAE9BtsE,GAAO+N,KACL,eAACokC,GAAD,CAEE/nC,KAAK,OACL6V,MAAOre,EAAE,cACT4D,MAAOg0E,EACPl3D,SAAUnmB,KAAKo9E,uBACft0E,MAAOw0E,EACP3oC,SAAUpqC,KAASikE,GAAgB0B,MAAQ3lE,KAASikE,GAAgB2B,MANhE,eAWRtsE,GAAO+N,KACL,eAACokC,GAAD,CAEE/nC,KAAK,aACL6V,MAAOre,EAAE,mBACT4D,MAAOg0E,EACPl3D,SAAUnmB,KAAKo9E,uBACft0E,MAAOw0E,GALH,cAQRz5E,GAAO+N,KACL,eAACokC,GAAD,CAEE/nC,KAAK,WACL6V,MAAOre,EAAE,iBACT4D,MAAOm0E,EACPr3D,SAAUnmB,KAAKu9E,qBACfz0E,MAAO20E,GALH,aASNlzE,KAASikE,GAAgB6C,WACxB9mE,KAASikE,GAAgB8C,WAC9BztE,GAAO+N,KACL,eAAC+wD,GAAD,CAEE10D,KAAK,QACL6V,MAAOre,EAAE,eACT4D,MAAO3F,EACPyiB,SAAUnmB,KAAK09E,mBACf50E,MAAOqgE,EACP5jD,OAAQ,UANJ,UASHhb,KAASikE,GAAgB0B,MACzB3lE,KAASikE,GAAgBmC,OACzBpmE,KAASikE,GAAgBphE,UACzB7C,KAASikE,GAAgBkD,QACzBnnE,KAASikE,GAAgBwC,SACzBzmE,KAASikE,GAAgB0C,cACzB3mE,KAASikE,GAAgB2B,MAC5BtsE,GAAO+N,KACL,eAACqjC,GAAD,CAEEhnC,KAAK,UACL6V,MAAOre,EAAE,iBACT4D,MAAO60C,EACP/3B,SAAUnmB,KAAK49E,qBACf90E,MAAO0gE,GALH,YASNj/D,KAASikE,GAAgB+B,QAC3B1sE,GAAO+N,KACL,eAACqjC,GAAD,CAEEhnC,KAAK,cACL6V,MAAOre,EAAE,oBACT4D,MAAO40E,EACP93D,SAAUnmB,KAAKg+E,wBACfl1E,MAAOo1E,GALH,cAON,eAACjpC,GAAD,CAEEhnC,KAAK,mBACL6V,MAAOre,EAAE,yBACT4D,MAAO+0E,EACPj4D,SAAUnmB,KAAKm+E,6BACfr1E,MAAOu1E,GALH,oBASN9zE,KAASikE,GAAgBmC,OAC3B9sE,GAAO+N,KACL,eAAC8iC,GAAD,CAEEzmC,KAAK,aACL6V,MAAOre,EAAE,mBACT4D,MAAOk1E,EACPp4D,SAAUnmB,KAAKs+E,uBACfzpC,eAAgB70C,KAAKg9E,iBACrBl0E,MAAO01E,GANH,cAUNj0E,KAASikE,GAAgBiC,MAC3B5sE,GAAO+N,KACL,eAACqjC,GAAD,CAEEhnC,KAAK,eACL6V,MAAOre,EAAE,yBACT4D,MAAOq1E,EACPv4D,SAAUnmB,KAAKy+E,6BACf31E,MAAO61E,GALH,mBAON,eAAC1pC,GAAD,CAEEhnC,KAAK,kBACL6V,MAAOre,EAAE,wBACT4D,MAAOw1E,EACP14D,SAAUnmB,KAAK4+E,4BACf91E,MAAOg2E,GALH,mBASNv0E,KAASikE,GAAgBphE,UAC3BvJ,GAAO+N,KACL,eAAC8iC,GAAD,CAEEzmC,KAAK,gBACL6V,MAAOre,EAAE,sBACT4D,MAAO21E,EACP74D,SAAUnmB,KAAK++E,0BACflqC,eAAgB70C,KAAKi9E,oBACrBn0E,MAAOm2E,GANH,gBAQN,eAACvqC,GAAD,CAEE5wB,MAAOre,EAAE,sBACTwI,KAAK,gBACL5E,MAAO81E,EACPh5D,SAAUnmB,KAAKk/E,0BACfrqC,eAAgB,CACd,yBAAmBxrC,MAAM,GAAzB,SAA6B5D,EAAE,mBAAnB,WACTq3E,IAELh0E,MAAOs2E,GATH,gBAWN,eAAC9C,GAAD,CAEEx4D,MAAOre,EAAE,0BACT4D,MAAOi2E,EACPn5D,SAAUnmB,KAAKq/E,8BACfv2E,MAAOy2E,EACP/wE,KAAM2wE,GALF,YAON,eAAC1C,GAAD,CAEE34D,MAAOre,EAAE,2BACTk3E,YAAa8C,EACb5C,eAAgB78E,KAAKw/E,4BACrB9C,UAAWl5E,EACXo5E,aAAc58E,KAAK2/E,0BACnB72E,MAAO82E,GAAqBF,EAC5BlxE,KAAM2wE,EACNlrE,SAAUqrE,GARN,QAUN,eAACrqC,GAAD,CAEEhnC,KAAK,oBACL6V,MAAOre,EAAE,yBACT4D,MAAOy2E,EACP35D,SAAUnmB,KAAK6/E,6BACf/2E,MAAOi3E,GALH,OAON,eAAC9qC,GAAD,CAEEhnC,KAAK,gBACL6V,MAAOre,EAAE,sBACT4D,MAAO42E,EACP95D,SAAUnmB,KAAKggF,0BACfl3E,MAAOo3E,GALH,QAON,eAACjrC,GAAD,CAEEhnC,KAAK,0BACL6V,MAAOre,EAAE,+BACT4D,MAAO+2E,EACPj6D,SAAUnmB,KAAKmgF,mCACfr3E,MAAOu3E,GALH,kBASN91E,KAASikE,GAAgBkD,QAC3B7tE,GAAO+N,KACL,eAAC8iC,GAAD,CAEEzmC,KAAK,cACL6V,MAAOre,EAAE,oBACT4D,MAAOk3E,EACPp6D,SAAUnmB,KAAKsgF,wBACfzrC,eAAgB70C,KAAKk9E,cACrBp0E,MAAO03E,GANH,eAUNj2E,KAASikE,GAAgBwC,SAC3BntE,GAAO+N,KACL,eAACqjC,GAAD,CAEEhnC,KAAK,gBACL6V,MAAOre,EAAE,sBACT4D,MAAOq3E,EACPv6D,SAAUnmB,KAAKygF,0BACf33E,MAAO63E,GALH,gBAON,eAAC1rC,GAAD,CAEEnxB,MAAOre,EAAE,sBACTwI,KAAK,gBACL5E,MAAOw3E,EACP16D,SAAUnmB,KAAK4gF,0BACf93E,MAAOg4E,GALH,iBASNv2E,KAASikE,GAAgB2B,MAC3BtsE,GAAO+N,KACL,eAACqjC,GAAD,CAEEhnC,KAAK,cACL6V,MAAOre,EAAE,oBACT4D,MAAO23E,EACP76D,SAAUnmB,KAAK+gF,wBACfj4E,MAAOm4E,GALH,eASN12E,KAASikE,GAAgB6C,YAC3BxtE,GAAO+N,KACL,eAACiqE,GAAD,CACE/3D,MAAOre,EAAE,2BACT4D,MAAO83E,EACPh7D,SAAUnmB,KAAKkhF,+BACfp4E,MAAOs4E,IAET,eAACnsC,GAAD,CACEhnC,KAAK,gBACL6V,MAAOre,EAAE,sBACT4D,MAAOk4E,EACPp7D,SAAUnmB,KAAKshF,0BACfx4E,MAAO04E,MAGU,OAAjBL,QAAiB,IAAjBA,OAAA,EAAAA,EAAmB52E,QAAS81D,GAAaG,UAC3C38D,GAAO+N,KACL,eAAC8iC,GAAD,CACEzmC,KAAK,iBACL6V,MAAOre,EAAE,uBACT4D,MAAOq4E,EACPv7D,SAAUnmB,KAAKyhF,2BACf5sC,eAAgB70C,KAAKm9E,qBACrBr0E,MAAO64E,MAKXp3E,KAASikE,GAAgB8C,WAC3BztE,GAAO+N,KACL,eAACqjC,GAAD,CACEhnC,KAAK,uBACL6V,MAAOre,EAAE,6BACT4D,MAAOw4E,EACP17D,SAAUnmB,KAAK4hF,iCACf94E,MAAOg5E,IAET,eAAC7sC,GAAD,CACEhnC,KAAK,qBACL6V,MAAOre,EAAE,2BACT4D,MAAO24E,EACP77D,SAAUnmB,KAAK+hF,+BACfj5E,MAAOu6E,KAIT94E,KAASikE,GAAgBoD,OAC3B/tE,GAAO+N,KACL,eAACqjC,GAAD,CAEEhnC,KAAK,cACL6V,MAAOre,EAAE,oBACT4D,MAAO64E,GACP/7D,SAAUnmB,KAAKiiF,wBACfn5E,MAAOq5E,GACPxtC,UAAU,GANN,cAQN,eAACM,GAAD,CAEEhnC,KAAK,eACL6V,MAAOre,EAAE,oBACT4D,MAAOg5E,GACPl8D,SAAUnmB,KAAKoiF,wBACft5E,MAAOw5E,GACP3tC,UAAU,GANN,cAQN,eAACM,GAAD,CAEEhnC,KAAK,mBACL6V,MAAOre,EAAE,wBACT4D,MAAOm5E,GACPr8D,SAAUnmB,KAAKuiF,4BACfz5E,MAAO25E,IALH,kBAON,eAACxtC,GAAD,CAEEhnC,KAAK,kBACL6V,MAAOre,EAAE,uBACT4D,MAAOs5E,GACPx8D,SAAUnmB,KAAK0iF,2BACf55E,MAAO85E,IALH,iBAON,eAAC3tC,GAAD,CAEEhnC,KAAK,aACL6V,MAAOre,EAAE,mBACT4D,MAAOy5E,GACP38D,SAAUnmB,KAAK6iF,uBACf/5E,MAAOi6E,IALH,aAON,eAAC9tC,GAAD,CAEEhnC,KAAK,cACL6V,MAAOre,EAAE,oBACT4D,MAAO45E,GACP98D,SAAUnmB,KAAKgjF,wBACfl6E,MAAOo6E,IALH,eASHr/E,GAGTwgF,sBACE,MAAM,SAAEvG,GAAa99E,KAAK2K,MACpB9G,EAAwB,GAW9B,OAVAA,EAAO+N,KACL,eAACujC,GAAD,CAEElnC,KAAK,WACL6V,MAAOre,EAAE,kBACT4D,MAAOy0E,EACP33D,SAAUnmB,KAAK69E,sBACfxoC,KAAM,GALF,aAQDxxC,EAGTy3B,cACE,MAAM,MAAE55B,GAAU1B,KAAKmS,MAEvB,OAAO,uCACL,eAAC,KAAM+pB,OAAP,CAAcC,aAAW,EAAC/pB,UAAWqO,KAAO6jE,YAA5C,SACE,gBAAC,KAAMloD,MAAP,WACE,oBAAGhqB,UAAWkgE,GAAa5wE,EAAM6I,QAChC,IACAgoE,GAAiB7wE,EAAM6I,WAG5B,eAAC,KAAMqyB,KAAP,UACE,eAAC3W,GAAA,EAAD,UACE,gBAACysB,GAAA,EAAD,WACE,eAACN,GAAA,EAAD,CAAKmyC,GAAI,EAAT,SACGvkF,KAAKokF,uBAER,eAAChyC,GAAA,EAAD,CAAKmyC,GAAI,EAAT,SACGvkF,KAAKqkF,+BAKd,gBAACtoD,GAAD,WACA,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASlf,KAAK24C,oBAA1C,SACKlzC,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASlf,KAAKssE,kBAAxC,SACG7mE,EAAE,gCCptCb,MAAM++E,GAAsB,CAC1BtnD,GAAmBunD,OACnBvnD,GAAmBwnD,QACnBxnD,GAAmBynD,OACnBznD,GAAmB0nD,MACnB1nD,GAAmB2nD,QACnB3nD,GAAmB4nD,OACnB5nD,GAAmB6nD,UACnB7nD,GAAmB8nD,OACnB9nD,GAAmB+nD,WACnB/nD,GAAmBgoD,YACnBhoD,GAAmBioD,OAIRC,GAAoBjzE,IAC/B,MAAM,OAAE0rB,EAAF,SAAUxkB,EAAV,MAAoBpO,EAApB,SAA2Bkb,EAA3B,gBAAqCgoC,GAAoBh8C,EACzDkzE,EAAsBp9D,mBAC1B,IAAM,IACDu8D,GAAoBznE,KAAIxS,IAAI,CAAMlB,MAAOkB,EAAMyK,MAAOgF,GAAOsrE,6BAA6B/6E,EAAMszB,QACnG9gB,KAAIyD,GAAQ,yBAAyBnX,MAAOmX,EAAKnX,MAArC,SAA6CmX,EAAKxL,OAArCwL,EAAKnX,UAChC,CAACw0B,IAqBH,OAAO,qCACL,eAAC4M,GAAA,EAAD,CAAMn4B,MAAO,CAACssC,YAAa,EAAGvR,aAAc,EAAG8G,WAAY,EAAG8X,cAAe,EAAG3N,gBAAiB,WAAjG,SACA,gBAAC5L,GAAA,EAAD,WACE,gBAACN,GAAA,EAAD,CAAKC,GAAI,EAAG//B,MAAO,CAACssC,YAAa,IAAjC,UACE,eAACh9B,GAAD,CAAUtX,KAAMoK,GAAOsE,WAAYpT,MAAOyT,EAASkY,UAAWjf,MAAO,CAAC2R,WAAY,IAAlF,SACG5K,EAAS/V,QAAW+V,EAAS/V,OAAO47B,QAAU,IAAM7lB,EAAS/V,OAAO67B,aAEvE,eAACtC,GAAA,EAAD,CACEC,QAAQ,OACR5d,QAXoB,IAAMivC,EAAgBljD,GAY1CqH,MAAO,CAAE25C,cAAe,GAH1B,SAIE,oBAAG75C,UAAWI,GAAK42B,gBAEnB,yBACEh3B,UAAU,eACV/I,MAAOgQ,EAASA,SAChB8M,SAlCqB/lB,IAC7B,MAAMmlF,EAAc5oE,OAAOC,OACzB,GACAvD,EACA,CAAEA,SAAUjZ,EAAEkiB,cAAcjZ,QAE9B8c,EAASlb,EAAOs6E,IA6BRC,aAActoD,GAAmBioD,MAJnC,SAMGE,OAGP,eAACjzC,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,2BACEhpC,MAAOgQ,EAASykE,SAChBn1C,YAAaljC,EAAE,qCACf2M,UAAU,eACVijC,KAAM,EACNlvB,SAtCuB/lB,IAC7B,MAAMmlF,EAAc5oE,OAAOC,OACzB,GACAvD,EACA,CAAEykE,SAAU19E,EAAEkiB,cAAcjZ,QAE9B8c,EAASlb,EAAOs6E,gB,wBCjCb,MAAME,GAAatzE,IAExB,MAAM,MAAEzQ,EAAF,cAASgvD,EAAT,gBAAwBjF,GAAoBt5C,EAC5CoH,EAAsB,GAE5Bw5D,GAAarxE,GAAO6c,SAAQ0N,IAC1B1S,EAAK3H,KAAK,sBAA8BQ,UAAU,WAAxC,UAAoD6Z,EAAMjX,MAA1D,MAASiX,EAAMvmB,IAAM,UAC/B6T,EAAK3H,KAAK,qBAA8BQ,UAAU,WAAxC,SAAoD6Z,EAAM5iB,OAAjD4iB,EAAMvmB,IAAM,aAEjC,MAAMggF,EAAUjT,GAAgB/wE,GAKhC,OACE,uBAAK0Q,UAAWqO,KAAO/e,MAAvB,UACE,sBAAK0Q,UAAWqO,KAAOklE,iBAAvB,SACE,sBAAKvzE,UAAW0M,GAAQ,aAAc2B,KAAOmlE,WAA7C,SACE,oBAAGxzE,UAAWkgE,GAAa5wE,EAAM6I,YAGrC,sBAAK6H,UAAWqO,KAAOolE,UAAvB,SACE,gBAACp7C,GAAA,EAAD,CAAMn4B,MAAO,CAAE+rC,aAAc,GAA7B,UACE,gBAAC5T,GAAA,EAAKvO,OAAN,WACE,uBAAK5pB,MAAO,CAAEgiC,MAAO,SAArB,UACIoc,GACA,eAAC7zB,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QAfX,IAAMwxC,GAAiBA,EAAchvD,GAejD,SACE,oBAAG0Q,UAAWI,GAAKu5B,SAGrB0f,GAAmBwkB,GAAuBvuE,IAC1C,eAACm7B,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QAnBT,IAAMusC,GAAmBA,EAAgB/pD,GAmBvD,SACE,oBAAG0Q,UAAWI,GAAK42B,mBAIzB,gCAAKmpC,GAAiB7wE,EAAM6I,MAAOm7E,GAAW,+BAAI,IAAJ,OAAiB,IAAKA,WAEtE,eAACj7C,GAAA,EAAK7N,KAAN,CAAWtqB,MAAO,CAAE6hC,WAAY,GAAhC,SACE,qBAAI/hC,UAAU,MAAd,SACGmH,eCvDTusE,GAAsC,CAC1CtX,GAAgB+B,OAChB/B,GAAgBiC,KAChBjC,GAAgBmC,MAChBnC,GAAgBphE,SAChBohE,GAAgBkD,OAChBlD,GAAgBwC,QAChBxC,GAAgB0C,aAChB1C,GAAgB6C,UAChB7C,GAAgB8C,UAChB9C,GAAgBgD,OAwBHuU,OAjBU5zE,IACvB,MAAM,aAAE83B,GAAiB93B,EAEnBqP,EAAQyG,mBAAQ,IAAM69D,GAAiB/oE,KAAIxS,GAC/C,gBAACowC,GAAA,EAASx3B,KAAV,CAAe03B,GAAG,SAAoB37B,QAAS,IAAM+qB,EAAa1/B,GAAlE,UACE,oBAAG6H,UAAWkgE,GAAa/nE,KAC1B,IACAgoE,GAAiBhoE,KAHYA,MAK9B,CAAC0/B,IACL,OACE,eAAC40B,GAAA,EAAD,CAAgBhkB,GAAI5O,KAAaj3B,MAAOvP,EAAE,wBAAyB6I,GAAG,oBAAtE,SACGkT,KCtBA,MAAMwkE,GAAmB7zE,IAC9B,MAAM,cAAEu+C,EAAF,gBAAiBjF,EAAjB,aAAkCxhB,EAAlC,OAAgDrL,GAAWzsB,EAC3D8zE,EAAiBrnD,EAAO7hB,KAAIrb,GAChC,eAAC+jF,GAAD,CAEE/jF,MAAOA,EACPgvD,cAAeA,EACfjF,gBAAiBA,GAHZ/pD,EAAMqM,OAOf,OACE,uBAAKuE,MAAO,CAAE6hC,WAAY,GAA1B,UACE,sBAAK7hC,MAAO,CAAE+rC,aAAc,GAA5B,SACE,gBAAC3L,GAAA,EAAD,CAAKtgC,UAAU,2BAAf,UACE,eAACggC,GAAA,EAAD,CAAKC,GAAI,IACT,eAACD,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,sBAAKjgC,UAAU,cAAf,SACC,eAAC,GAAD,CAAiB63B,aAAcA,aAKrCg8C,MCtBMC,GAAqB/zE,IAChC,MAAM,YAAEg0E,EAAF,SAAernD,EAAf,qBAAyBsnD,GAAyBj0E,EAelDk0E,EAAavnD,EAAS/hB,KAAIpZ,GAC9B,eAACsnD,GAAD,CAEEnnC,MAAOngB,EAAQqR,MACf3L,WAA4D1I,IAArDwlF,EAAYrlF,MAAKwlF,GAAKA,EAAE3iF,UAAYA,EAAQoK,MACnDoY,SAAUR,GAlBQ,EAAChiB,EAAmBgiB,KAExC,GAAIA,UADmEhlB,IAArDwlF,EAAYrlF,MAAKwlF,GAAKA,EAAE3iF,UAAYA,EAAQoK,OAI9D,GAAI4X,EAAS,CACX,MAAM4gE,EAAiB,IAAIJ,EAAa,CAAExiF,QAASA,EAAQoK,IAAKy4E,MAAO,KACvEJ,EAAqBG,OAChB,CACL,MAAMA,EAAiBJ,EAAYnnE,QAAOsnE,GAAKA,EAAE3iF,UAAYA,EAAQoK,MACrEq4E,EAAqBG,KAQAE,CAAc9iF,EAASgiB,IAHvChiB,EAAQoK,OAMjB,OACE,eAAC88C,GAAD,CAAUx4C,KAAMG,GAAKk0E,MAAO1xE,MAAOvP,EAAE,4BAArC,SACG4gF,KC1BMM,GAAoBx0E,IAE/B,MAAMopD,EAAY,CAChBx0B,SAAS,GACTwB,mBAAoB,YACpBpkB,MAAO,YAGH,cAAE8qB,EAAF,sBAAiB23C,GAA0Bz0E,EAE3C6gE,EAAQ/jC,EAAclyB,KAAI5Y,GAC9B,eAAC8a,GAAD,CAEEjK,MAAO4uB,GAAkBY,WAAWrgC,GACpC+a,QAAS,KAAO0nE,EAAsBziF,IAHxC,SAIGy/B,GAAkBY,WAAWrgC,IAHzBA,EAAY4J,OAOrB,OAAIkhC,EAAcpvC,OAAS,EAEvB,eAACgrD,GAAD,CAAUx4C,KAAMG,GAAKsoE,YAAa9lE,MAAOvP,EAAE,iCAA3C,SACGutE,IAIG,uCACN,gBAACtgC,GAAA,EAAD,CAAMpgC,MAAO,CAAC+pB,UAAW,IAAzB,UACE,eAAC+V,GAAA,EAAD,CAAKC,GAAI,IACT,eAACD,GAAA,EAAD,CAAKC,GAAI,EAAGjgC,UAAW,gCAAvB,SACE,oBAAGE,MAAOipD,EAAV,SACG91D,EAAE,gEAGP,eAAC2sC,GAAA,EAAD,CAAKC,GAAI,OAEX,gBAACK,GAAA,EAAD,CAAMpgC,MAAO,CAAC+pB,UAAW,IAAzB,UACE,eAAC+V,GAAA,EAAD,CAAKC,GAAI,IACT,eAACD,GAAA,EAAD,CAAKC,GAAI,EAAGjgC,UAAW,gCAAvB,SACI,eAACyqB,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAAS,IAAM0nE,OAAsBjmF,GAAjE,SACG8E,EAAE,oDAGT,eAAC2sC,GAAA,EAAD,CAAKC,GAAI,WCwDXw0C,GAAkB,uCA0kCTC,OADO3tB,aAPJxuD,IAAD,CACf1G,cAAe0G,EAAM6mC,oBAAoBtnC,YAEtBW,IAAD,CAClBk8E,qBAAuBv7E,GACrBX,EAASU,EAAwCC,OAE/B2tD,CAvkCtB,cAA6BtzB,GAQ3Bx3B,YAAY8D,GACV0oB,MAAM1oB,GAD4B,KAPpCklC,mBAOoC,OANpCC,wBAMoC,OALpCC,uBAKoC,OAJpCyvC,0BAIoC,OAHpCxvC,uBAGoC,OAFpCyvC,kBAEoC,OAoOpCC,sBAAwBt7C,UAAa,IAAD,EAClC,KAAI,UAAC5rC,KAAK2K,MAAMrH,cAAZ,aAAC,EAAmByK,KACtB,OAEF,MAAMw4C,QAAcjiB,GAAIxV,wBAAwB,SAAU9uB,KAAK2K,MAAMrH,OAAOyK,KAC5E/N,KAAKo7B,SAAS,IAAIp7B,KAAK2K,MAAOsiC,kBAAmBsZ,KAzOf,KA4OpC4gC,uBAA0BjuD,IACxBl5B,KAAKo7B,SAAS,CACZlC,YACAwe,oBAAgB/2C,KA/OgB,KAmPpCymF,sBAAyBjuD,IACvBn5B,KAAKo7B,SAAS,CACZjC,WACA0e,mBAAel3C,KAtPiB,KA0PpC0mF,0BAA6BC,IAC3BtnF,KAAKo7B,SAAS,CACZksD,eACA5vC,oBAAgB/2C,KA7PgB,KAiQpC4mF,yBAA4BC,IAC1BxnF,KAAKo7B,SAAS,CACZosD,cACAC,sBAAkB9mF,KApQc,KAwQpC+mF,oBAAuBr+E,IACrBrJ,KAAKo7B,SAAS,CACZyC,OAAQx0B,EACR2uC,iBAAar3C,KA3QmB,KA+QpCgnF,sBAAyBt+E,IACvBrJ,KAAKo7B,SAAS,CACZwsD,SAAUv+E,EACVw+E,mBAAelnF,KAlRiB,KAsRpCmnF,sBAAyBz+E,IACvBrJ,KAAKo7B,SAAS,CACZvgB,SAAUxR,EACVkvC,mBAAe53C,KAzRiB,KA6RpConF,iBAAoBC,IAClBhoF,KAAKo7B,SAAS,CACZ4sD,MACAC,cAAUtnF,KAhSsB,KAoSpCunF,yBAA4B7+E,IAC1BrJ,KAAKo7B,SAAS,CACZqD,YAAuB,MAAVp1B,EACb6uC,sBAAkBv3C,KAvSc,KA2SpCwnF,wBAA2B9+E,IACzBrJ,KAAKo7B,SAAS,CACZmD,WAAYl1B,EACZqvC,qBAAiB/3C,KA9Se,KAkTpCynF,2BAA8B/+E,IAC5BrJ,KAAKo7B,SAAS,CACZ2F,cAAe13B,EACfg/E,wBAAoB1nF,KArTY,KAyTpC2nF,wBAA2Bj/E,IACzBrJ,KAAKo7B,SAAS,CACZ+c,aAAwB,MAAV9uC,EACdgvC,uBAAmB13C,KA5Ta,KAgUpC4nF,mBAAsBl/E,IACpBrJ,KAAKo7B,SAAS,CACZotD,MAAiB,MAAVn/E,EACPo/E,gBAAY9nF,KAnUoB,KAuUpC+nF,wBAA2B/pD,IACzB3+B,KAAKo7B,SAAS,CACZuD,aACAgqD,qBAAiBhoF,KA1Ue,KA8UpCioF,uBAA0BxlD,IACxB,IAAKA,EAAU90B,GACb,OAEF,MAAMA,EAAK80B,EAAU90B,GACrBg2B,GAAInR,UAAU7kB,GAAIuc,MAAKvnB,IACrB,MAAM,UAAEu7B,GAAc7+B,KAAK2K,MAOrBk+E,EAAe,IAAIhqD,EANY,CACnCtN,UAAWjjB,EACXhL,SACA+V,SAAU6jB,GAAmBioD,MAC7BrH,SAAU,KAGZ99E,KAAKo7B,SAAS,CAAEyD,UAAWgqD,QA5VK,KAgWpCC,sBAAwB,CAAC79E,EAAeoO,KACtC,MAAM,UAAEwlB,GAAc7+B,KAAK2K,MACrBk+E,EAAehqD,EAAU9hB,KAAI,CAACgsE,EAAGvlE,IAAMA,IAAMvY,EAAQoO,EAAW0vE,IACtE/oF,KAAKo7B,SAAS,CAAEyD,UAAWgqD,KAnWO,KAsWpCG,4BAA+B/9E,IAC7B,MAAM,UAAE4zB,GAAc7+B,KAAK2K,MACrBk+E,EAAehqD,EAAU7f,QAAO,CAAC+pE,EAAGvlE,IAAMA,IAAMvY,IACtDjL,KAAKo7B,SAAS,CAAEyD,UAAWgqD,KAzWO,KAqYpCvc,kBAAoB,KAClBtsE,KAAKurE,OAAO1gD,MAAKhnB,IACVA,IAGLm1C,uBAAoBhuB,QAAQvlB,EAAE,sBAE9BzF,KAAKipF,gCAAgCplF,GAAQgnB,MAAK,KAChD,MAAM,QAAEwgB,EAAF,GAAW/8B,GAAOtO,KAAKmS,WAClBxR,IAAP2N,EAEF+8B,EAAQz5B,KAAK,YAAc/N,EAAOkK,KAGlC/N,KAAKmmC,sBAnZuB,KAyZpC+iD,wBAA0B,KACxBlpF,KAAKurE,OAAO1gD,MAAKhnB,IACVA,IAGLm1C,uBAAoBhuB,QAAQvlB,EAAE,sBAE9BzF,KAAKipF,gCAAgCplF,GAAQgnB,MAAK,KAChD,GAAI7qB,KAAKmS,MAAM7D,GAAI,CACjB,MAAM,QAAE+8B,GAAYrrC,KAAKmS,MACzBk5B,EAAQz5B,KAAK,wBAEb5R,KAAKqpC,gBArauB,KA2xBpC8/C,kBAAoB,IACX,uCACL,gBAACz2C,GAAA,EAAD,CAAKpgC,MAAO,CAAE6hC,WAAY,IAA1B,UACE,eAAC/B,GAAA,EAAD,CAAKE,GAAI,EAAT,SACE,eAACuY,GAAD,CAAUx4C,KAAMG,GAAK3E,KAAMmH,MAAOvP,EAAE,8BAApC,SACGzF,KAAKopF,yBAGV,gBAACh3C,GAAA,EAAD,CAAKE,GAAI,EAAT,UACE,eAACuY,GAAD,CAAUx4C,KAAMG,GAAK62E,WAAYr0E,MAAOvP,EAAE,8BAA1C,SACGzF,KAAKspF,uBAER,eAACz+B,GAAD,CAAUx4C,KAAMG,GAAKU,QAAS8B,MAAOvP,EAAE,4BAAvC,SACGzF,KAAKupF,+BAIXvpF,KAAKwpF,uBA5yB0B,KAgzBpCC,uBAA0B/nF,IACxB1B,KAAK0mC,WAAuBv0B,GAC1B,eAAC,GAAD,CACEzQ,MAAOA,KACHyQ,MAEL0Y,MAAKnpB,IACN4iC,GAAIxU,YAAYpuB,GAAOmpB,MAAK6+D,IAC1B,MAAM,OAAE9qD,GAAW5+B,KAAK2K,MAClBg/E,EAAY/qD,EAAO7hB,KAAI3c,GAAKA,EAAE2N,MAAQrM,EAAMqM,IAAM27E,EAAatpF,IACrEupF,EAAUxpE,KAAKq0D,IACfx0E,KAAKo7B,SAAS,CAAEwD,OAAQ+qD,UAEzBvrB,OAAM,UA7zByB,KAg0BpCwrB,yBAA4BloF,IAC1B1B,KAAK0mC,WAAUv0B,GACb,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,2BACT6lB,QAAS7lB,EAAE,6BACX82B,QAAS92B,EAAE,sBACX+2B,YAAY,SACZC,WAAYh3B,EAAE,yBACdi3B,WAAYj3B,EAAE,4BACV0M,MAEL0Y,MAAKg/D,IACDA,GAGLvlD,GAAIrU,YAAYvuB,EAAMqM,KAAK8c,MAAK,KAC9B,MAAM,OAAE+T,GAAW5+B,KAAK2K,MAClBg/E,EAAY/qD,EAAO5f,QAAO5e,GAAKA,EAAE2N,MAAQrM,EAAMqM,MACrD/N,KAAKo7B,SAAS,CAAEwD,OAAQ+qD,WAl1BM,KAu1BpCG,sBAAyBv/E,IACvB,MAAM,GAAE+D,GAAOtO,KAAKmS,MACpB,IAAK7D,EACH,OAEF,MAAM5M,EvBlmBH,SAAwB2T,EAAkBg9D,GAC/C,OAAQA,GACN,KAAK7D,GAAgB0B,KACnB,OAAOvzD,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgB0B,KACtB3+C,UAAWlc,GACVy8D,IACL,KAAKtD,GAAgB+B,OACnB,OAAO5zD,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgB+B,OACtBh/C,UAAWlc,EACX69D,YAAa,GACbC,iBAAkB,IACjBrB,IACL,KAAKtD,GAAgBiC,KACnB,OAAO9zD,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgBiC,KACtBl/C,UAAWlc,EACX+9D,kBAAmB,GACnBC,gBAAiB,IAChBvB,IACL,KAAKtD,GAAgBmC,MACnB,OAAOh0D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgBmC,MACtBp/C,UAAWlc,EACXq9D,aAAchD,GAAeE,aAC5BkC,IACL,KAAKtD,GAAgBqC,SACnB,OAAOl0D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgBqC,SACtBt/C,UAAWlc,EACX00E,iBAAkB,IACjBjY,IACL,KAAKtD,GAAgBphE,SACnB,OAAOuP,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgBphE,SACtBmkB,UAAWlc,EACXs9D,gBAAiB3D,GAAkBG,cACnCmE,cAAe,GACfG,cAAe,GACfE,cAAe,GACfC,YAAa,GACbJ,gBAAiB,GACjBM,aAAc,GACdP,cAAe,GACfM,mBAAoB,KACpBH,qBAAsB,MACrB5B,IACL,KAAKtD,GAAgBkD,OACnB,OAAO/0D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgBkD,OACtBngD,UAAWlc,EACXu9D,YAAanE,GAAWiD,QACvBI,IACL,KAAKtD,GAAgBwC,QACnB,OAAOr0D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgBwC,QACtBz/C,UAAWlc,EACX0+D,cAAe,GACfC,cAAe,IACdlC,IACL,KAAKtD,GAAgB0C,aACnB,OAAOv0D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgB0C,aACtB3/C,UAAWlc,GACVy8D,IACL,KAAKtD,GAAgB2B,KACnB,OAAOxzD,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgB2B,KACtB5+C,UAAWlc,EACX4+D,aAAc,IACbnC,IACL,KAAKtD,GAAgB6C,UACnB,OAAO10D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgB6C,UACtB9/C,UAAWlc,EACXmc,YAAa,KACbqhD,cAAenE,GAAcI,QAC7BqF,aAAc,IACbrC,IACL,KAAKtD,GAAgB8C,UACnB,OAAO30D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgB8C,UACtB//C,UAAWlc,EACX++D,WAAY,GACZC,SAAU,IACTvC,IACL,KAAKtD,GAAgBgD,MACnB,OAAO70D,OAAOC,OAAO,CACnBrS,KAAMikE,GAAgBgD,MACtBjgD,UAAWlc,GACVy8D,IACL,KAAKtD,GAAgBoD,OAEvB,MAAM1mD,MAAM,uBAAyBmnD,GuBogBrB2X,CAAe17E,EAAI/D,GACjCvK,KAAK0mC,WAAuBv0B,GAC1B,eAAC,GAAD,CAAgBzQ,MAAOA,KAAWyQ,MACjC0Y,MAAKnpB,IACN4iC,GAAIzU,YAAYnuB,GACbmpB,MAAKhnB,GACGygC,GAAIvU,SAASlsB,EAAOkK,IAAK,CAACwgE,GAAsB39D,MAAOusB,GAAmB9iB,aAElFwQ,MAAKhnB,IACN,MAAM,OAAE+6B,GAAW5+B,KAAK2K,MAClBg/E,EAAY,IAAI/qD,EAAQ/6B,GAC9B8lF,EAAUxpE,KAAKq0D,IACfx0E,KAAKo7B,SAAS,CAAEwD,OAAQ+qD,UAEzBvrB,OAAM,UA12ByB,KA62BpC6rB,qBAAwB/qF,GACfc,KAAK0mC,WAAmBv0B,GAC7B,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,oCACT6lB,QAAS7lB,EAAE,sCACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAEL0Y,MAAKghB,KACDA,GAGEvH,GAAI9P,qBAAqBt1B,EAAS6O,KAAK8c,MAAK,KACjDs5C,GAAiB,CACf74C,QAAS7lB,EAAE,wCAEb,MAAM,UAAE2oC,GAAcpuC,KAAK2K,MACrBu/E,EAAe97C,EAAUpvB,QAAOjW,GAAKA,EAAEgF,MAAQ7O,EAAS6O,MAE9D,OADA/N,KAAKo7B,SAAS,CAAEgT,UAAW87C,KACpB,OAl4BuB,KAu4BpCC,uBAA0B59D,GACjBvsB,KAAK0mC,WAAmBv0B,GAC7B,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,gCACT6lB,QAAS7lB,EAAE,kCACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAEL0Y,MAAKghB,KACDA,GAGEvH,GAAI5X,iBAAiBH,EAAWxe,KAAK8c,MAAK,KAC/Cs5C,GAAiB,CACf74C,QAAS7lB,EAAE,qCAEN,OAz5BuB,KA85BpC2kF,gCAAmCjE,IACjCnmF,KAAKo7B,SAAS,CAAEivD,mBAAoBlE,KA/5BF,KAk6BpCmE,0BAA6BnmF,IAC3B,MAAMqb,EAAM9K,GAAOuC,WACa,IAAD,EAExB,SAFatW,IAAhBwD,EACFnE,KAAKmS,MAAMk5B,QAAQz5B,KAAM,kBAAiBzN,EAAY4J,gBAAgByR,KAA9C,UAAqDxf,KAAK2K,MAAMrH,cAAhE,aAAqD,EAAmByK,OAEhG/N,KAAKmS,MAAMk5B,QAAQz5B,KAAM,kBAAD,UAAkB5R,KAAK2K,MAAMrH,cAA7B,aAAkB,EAAmByK,kBAAkByR,KAAvD,UAA8Dxf,KAAK2K,MAAMrH,cAAzE,aAA8D,EAAmByK,QAv6BzE,KA26BpCw8E,mBAAqB,CAACrrF,EAAqCwB,KACzD,MAAM,GAAE4N,GAAOtO,KAAKmS,MAChB7D,IACF5N,EAAK6wB,UAAYjjB,GAEnB,MAAM+9D,EAAa1vD,OAAOC,OAAO,CAAE7O,IAAK7O,EAAWA,EAAS6O,SAAMpN,GAAaD,GAC/E,OAAO4jC,GAAI/P,uBAAuB83C,EAAYntE,EAAW,SAAW,UACjE2rB,MAAMhnB,GACiB,QAAlBA,EAAOqC,OACFwlB,QAAQC,QAAQ9nB,GAErB3E,EACKolC,GAAIlQ,qBAAqBi4C,GAC7BxhD,MAAK9hB,IACJ,MAAM,UAAEqlC,GAAcpuC,KAAK2K,MAC3B5B,EAAEyhF,YAActrF,EAASsrF,YACzB,MAAMN,EAAe97C,EAAUrxB,KAAI0tE,GAAKA,EAAE18E,MAAQ7O,EAAS6O,IAAMhF,EAAI0hF,IAErE,OADAzqF,KAAKo7B,SAAS,CAAEgT,UAAW87C,IACpBnhF,KAGJu7B,GAAInQ,qBAAqBzzB,GAC7BmqB,MAAK9hB,IACJ,MAAM,UAAEqlC,GAAcpuC,KAAK2K,MACrBu/E,EAAe,IAAI97C,EAAWrlC,GAEpC,OADA/I,KAAKo7B,SAAS,CAAEgT,UAAW87C,IACpBnhF,QAr8BiB,KAq9BpC2hF,gBAAkB,IACX1qF,KAAK2K,MAAMrH,OAMZ,eAAC0iF,GAAD,CACEpnD,OAAQ5+B,KAAK2K,MAAMi0B,OACnB8xB,cAAe1wD,KAAKypF,uBACpBh+B,gBAAiBzrD,KAAK4pF,yBACtB3/C,aAAcjqC,KAAK8pF,wBATf,qCACL9pF,KAAK2qF,mBAAmBllF,EAAE,8CAx9BG,KAs+BpCmlF,mBAAqB,IACZ,uCACL,eAACl4C,GAAA,EAAD,CAAKpgC,MAAO,CAAE+pB,UAAW,GAAIgiB,aAAc,SAA3C,SACE,eAACjM,GAAA,EAAD,CAAKE,GAAI,GAAT,SACE,eAACuY,GAAD,CAAUx4C,KAAMG,GAAKwyD,KAAMhwD,MAAOvP,EAAE,+BAApC,SACGzF,KAAK6qF,4BAIX7qF,KAAKwpF,uBA/+B0B,KAm/BpCmB,mBAAsB1iD,GAElB,eAAC,GAAD,CAAc3c,QAAS2c,IAr/BS,KA0/BpC8kC,mBAAqB,KACnB,GAAK/sE,KAAK2K,MAAMrH,OAIT,CACL,MAAMy/C,EAAe,IAAI/oC,GAAOha,KAAK2K,MAAMrH,QAC3C,OACE,eAAC,GAAD,CACEkW,OAAQupC,EAAaz0C,GACrBoL,SAAUqpC,EAAa90C,KACvBwL,SAAS,SACT4xB,QAASrrC,KAAKmS,MAAMk5B,QACpBvF,QAAS9lC,KAAKmS,MAAM2zB,QACpBc,OAAQ5mC,KAAKmS,MAAMy0B,OAEnBpnB,IAAK1J,GAAWpB,GAAOuC,WAAY8rC,EAAaz0C,IAChD6gD,UAAU,EACVuW,aAAa,2BAhBjB,OAAQ,qCACL1lE,KAAK2qF,mBAAmBllF,EAAE,+CA7/BG,KAkhCpCqlF,kBAAoB,KAClB,MAAM,SAAEhsD,EAAF,mBAAYurD,GAAuBrqF,KAAK2K,MAC9C,OACE,uBAAK2H,MAAO,CAAE+rC,aAAc,SAA5B,UACE,eAAC6nC,GAAD,CACEC,YAAakE,EACbvrD,SAAUA,EACVsnD,qBAAsBpmF,KAAKoqF,kCAE5BpqF,KAAKwpF,wBA3hCwB,KAgiCpCuB,uBAAyB,IAErB,uBAAKz4E,MAAO,CAAE+rC,aAAc,SAA5B,UACE,eAACsoC,GAAD,CACE13C,cAAejvC,KAAK2K,MAAMskC,cAC1B23C,sBAAuB5mF,KAAKsqF,4BAE7BtqF,KAAKwpF,uBApiCVxpF,KAAKq3C,cAAgB,CACnB,CAAEhuC,MAAO0zB,GAAOuE,KAAMtsB,MAAOvP,EAAE,gBAC/B,CAAE4D,MAAO0zB,GAAOsE,OAAQrsB,MAAOvP,EAAE,kBACjC,CAAE4D,MAAO0zB,GAAOqE,UAAWpsB,MAAOvP,EAAE,sBAEtCzF,KAAKs3C,mBAAqB,CACxB,CAAEjuC,MAAO,IAAK2L,MAAOvP,EAAE,oBACvB,CAAE4D,MAAO,IAAK2L,MAAOvP,EAAE,mBAEzBzF,KAAKu3C,kBAAoB,CACvB,CAAEluC,MAAO2zB,GAAW5vB,SAAU4H,MAAOvP,EAAE,wBACvC,CAAE4D,MAAO2zB,GAAWQ,SAAUxoB,MAAOvP,EAAE,yBAEzCzF,KAAKgnF,qBAAuB,CAC1B,CAAE39E,MAAO4zB,GAAc5tB,QAAS2F,MAAOvP,EAAE,0BACzC,CAAE4D,MAAO4zB,GAAc+D,WAAYhsB,MAAOvP,EAAE,6BAC5C,CAAE4D,MAAO4zB,GAAcgE,SAAUjsB,MAAOvP,EAAE,4BAE5CzF,KAAKw3C,kBAAoB,CACvB,CAAEnuC,MAAO,IAAK2L,MAAOvP,EAAE,QACvB,CAAE4D,MAAO,IAAK2L,MAAOvP,EAAE,QAEzBzF,KAAKinF,aAAe,CAClB,CAAE59E,MAAO,IAAK2L,MAAOvP,EAAE,qBACvB,CAAE4D,MAAO,IAAK2L,MAAOvP,EAAE,qBAGzBzF,KAAK2K,MAAQ,CACXL,KAAM,CACJgE,GAAI6D,EAAM7D,GAAKoG,GAAOuC,WAAavC,GAAO4B,aAC1CxC,OAAQ3B,EAAM7D,GACd+D,KAAMG,GAAK3E,KACXmH,MAAOvP,EAAE,4BACT+Z,IAAKrN,EAAMqN,KAAO,WAGpB0Z,UAAW,GACXC,SAAU,GACVmuD,aAAc,GACdE,YAAa,GACb3pD,OAAQd,GAAOqE,UACfwmD,S/GjKmB,CAAS9sE,IAAK,GAAIC,MAAO,GAAIC,KAAM,I+GkKtDH,S/GlKmB,CAASC,IAAK,GAAIC,MAAO,GAAIC,KAAM,I+GmKtDgtE,IAAK,GACLvpD,aAAa,EACb0Z,cAAc,EACdqwC,OAAO,EAEPjqD,WAAYvB,GAAWQ,SACvBuD,cAAe9D,GAAc5tB,QAC7BsvB,WAAY,GACZE,UAAW,GAEXwrD,mBAAoB,GAEpBzrD,OAAQ,GACRwP,UAAW,GACXtP,SAAU,GACVmQ,cAAc,GAEdhC,kBAAmB,GAMA,0BAErBpS,MAAMqL,0BACAlmC,KAAKgrF,eACXhrF,KAAKknF,wBAGiB,yBAAC7gD,EAA2BC,GAA4B,IAAD,IAC7EzL,MAAMuL,mBAAmBC,EAAUC,GAC/BD,EAAS/3B,KAAOtO,KAAKmS,MAAM7D,KACzBtO,KAAKmS,MAAM7D,GACbtO,KAAKmmC,cAELnmC,KAAKqpC,UAIL,UAAArpC,KAAK2K,MAAMrH,cAAX,eAAmByK,QAAnB,UAA2Bu4B,EAAShjC,cAApC,aAA2B,EAAiByK,MAC9C/N,KAAKknF,wBAIT79C,QACErpC,KAAKo7B,SAAS,CACZ9wB,KAAM,CACJgE,GAAItO,KAAKmS,MAAM7D,GAAKoG,GAAOuC,WAAavC,GAAO4B,aAC/CxC,OAAQ9T,KAAKmS,MAAM7D,GACnB+D,KAAMG,GAAK3E,KACXmH,MAAOvP,EAAE,4BACT+Z,IAAKxf,KAAKmS,MAAMqN,KAAO,WAGzB0Z,UAAW,GACXwe,oBAAgB/2C,EAChBw4B,SAAU,GACV0e,mBAAel3C,EACf2mF,aAAc,GACd2D,uBAAmBtqF,EACnB6mF,YAAa,GACbC,sBAAkB9mF,EAClBk9B,OAAQd,GAAOqE,UACf4W,iBAAar3C,EACbinF,S/GpOmB,CAAS9sE,IAAK,GAAIC,MAAO,GAAIC,KAAM,I+GqOtD6sE,mBAAelnF,EACfka,S/GtOmB,CAASC,IAAK,GAAIC,MAAO,GAAIC,KAAM,I+GuOtDu9B,mBAAe53C,EACfqnF,IAAK,GACLC,cAAUtnF,EACV89B,aAAa,EACbyZ,sBAAkBv3C,EAClBw3C,cAAc,EACdE,uBAAmB13C,EACnB6nF,OAAO,EACPC,gBAAY9nF,EAEZ49B,WAAYvB,GAAWQ,SACvBkb,qBAAiB/3C,EACjBogC,cAAe9D,GAAc5tB,QAC7Bg5E,wBAAoB1nF,EACpBg+B,WAAY,GACZgqD,qBAAiBhoF,EAEjB0pF,mBAAoB,GAEpBxrD,UAAW,GACXD,OAAQ,GACRwP,UAAW,KAIf48C,eACEhrF,KAAK8lC,QAAQxB,GAAInO,kBAAax1B,OAAWA,OAAWA,EAAW,IAAKuC,EAAO,YACxE2nB,MAAKiU,GAAY9+B,KAAKo7B,SAAS,CAAE0D,SAAUA,EAASp+B,SAGzDwqF,yBAC4BvqF,IAAtBX,KAAK2K,MAAMrH,QAKftD,KAAK8lC,QAAQxB,GAAIvN,2BAA2B/2B,KAAK2K,MAAMrH,OAAOyK,KAAM7K,EAAO,WACxE2nB,MAAKsgE,IACJnrF,KAAKo7B,SAAS,CAAE6T,cAAek8C,EAAczqF,UAInDylC,cACE,MAAM,GAAE73B,EAAF,IAAMkR,GAAQxf,KAAKmS,MACpB7D,GAGLtO,KAAK8lC,QAAQxB,GAAInR,UACf7kB,EACA,CAAC6uB,GAAmBqP,iBAAkBrP,GAAmBsP,UAAWtP,GAAmBuP,kBACtFzpC,EAAS,WAAW4nB,MAAKvnB,KACXA,EAAOs7B,QAAU,IACzBze,KAAKq0D,IACZ,MAAMvmE,EAAO3K,EAAO47B,QAAU,IAAM57B,EAAO67B,WAAWquB,cACtDxtD,KAAKo7B,SAAS,CACZ9wB,KAAM,CACJgE,GAAItO,KAAKmS,MAAM7D,GAAKoG,GAAOuC,WAAavC,GAAO4B,aAC/CxC,OAAQ9T,KAAKmS,MAAM7D,GACnB+D,KAAMG,GAAK3E,KACXmH,MAAOvP,EAAE,yBAA0B,CAAEwI,SACrC+2B,WAAYv/B,EAAE,2BACd+Z,IAAKA,GAAO,UAAYlR,EACxBy1B,SAAU91B,GAEZ3K,SAEA41B,UAAW51B,EAAO47B,QAClBwY,oBAAgB/2C,EAChBw4B,SAAU71B,EAAO67B,WACjB0Y,mBAAel3C,EACf2mF,aAAchkF,EAAO87B,qBAAqBluB,KAAK,KAC/C+5E,uBAAmBtqF,EACnB6mF,YAAalkF,EAAO+7B,wBAAwBnuB,KAAK,KACjDu2E,sBAAkB9mF,EAClBk9B,OAAQv6B,EAAOu6B,OACfma,iBAAar3C,EACbinF,SAAU,CACR9sE,IAAKxX,EAAOg8B,UAAY,GACxBvkB,MAAOzX,EAAOi8B,YAAc,GAC5BvkB,KAAM1X,EAAOk8B,WAAa,IAE5BqoD,mBAAelnF,EACfka,SAAU,CACRC,IAAKxX,EAAOo8B,UAAY,GACxB3kB,MAAOzX,EAAOq8B,YAAc,GAC5B3kB,KAAM1X,EAAOs8B,WAAa,IAE5B2Y,mBAAe53C,EACfqnF,IAAyB,IAApB1kF,EAAOu8B,SAAiB,GAAKv8B,EAAOu8B,SAAS96B,WAClDkjF,cAAUtnF,EACV89B,YAAan7B,EAAO28B,aACpBiY,sBAAkBv3C,EAClBw3C,aAAc70C,EAAO48B,YACrBmY,uBAAmB13C,EACnB6nF,MAAOllF,EAAO27B,UAAU/5B,SAAS2hF,IACjC4B,gBAAY9nF,EAEZ49B,WAAYj7B,EAAOy8B,YACnB2Y,qBAAiB/3C,EACjBogC,cAAez9B,EAAO08B,oBACtBqoD,wBAAoB1nF,EACpBg+B,WAAYr7B,EAAO8K,YACnBu6E,qBAAiBhoF,EAEjB0pF,mBAAoB/mF,EAAO68B,oBAE3BtB,UAAWv7B,EAAOu7B,UAClBD,OAAQt7B,EAAOs7B,QAAU,GACzBwP,UAAW9qC,EAAO8qC,WAAa,KAEjCpuC,KAAKkrF,uBA4ITjC,gCAAgC3lF,GAC9B,MAAM,cAAEW,GAAkBjE,KAAKmS,MAC/B,OAAIlO,EACKjE,KAAK0mC,WAAmBv0B,GAC7B,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,0CACT6lB,QAAS7lB,EAAE,+CACP0M,MAEL0Y,MAAKi1C,IACN,GAAIA,EAAS,CACX,MAAM,qBAAEinB,GAAyB/mF,KAAKmS,MACtC40E,EAAqB,CACnBx8E,KAAM,SACN8jD,SAAU/qD,EAAOyK,IACjBE,KAAM3K,EAAO47B,QAAU,IAAM57B,EAAO67B,aAGxC,OAAO77B,KAGFooB,QAAQC,QAAQroB,GA0C3BioE,OACE,MAAM,OACJjoE,EADI,UAGJ41B,EAHI,aAIJouD,EAJI,SAKJnuD,EALI,YAMJquD,EANI,OAOJ3pD,EAPI,WAQJU,EARI,cASJwC,EATI,SAUJ6mD,EAVI,SAWJ/sE,EAXI,IAYJmtE,EAZI,YAaJvpD,EAbI,aAcJ0Z,EAdI,MAeJqwC,EAfI,WAgBJ7pD,EAhBI,UAiBJE,EAjBI,mBAkBJwrD,GACErqF,KAAK2K,MACT,GAAIrH,EAAQ,CAEV,MAAM8nF,EAAgBzuE,OAAOC,OAAO,GAAItZ,EAAQ,CAC9C47B,QAAShG,EACTiG,WAAYhG,EACZiG,qBAAsBkoD,EAAaznF,OAAS,EAAIynF,EAAaxiF,MAAM,KAAO,GAC1Eu6B,wBAAyBmoD,EAAY3nF,OAAS,EAAI2nF,EAAY1iF,MAAM,KAAO,GAC3E+4B,SACAkC,YAAaxB,EACbyB,oBAAqBe,EACrBzB,SAAUsoD,EAAS9sE,IACnBykB,WAAYqoD,EAAS7sE,MACrBykB,UAAWooD,EAAS5sE,KACpBykB,eAAgB6V,GAAoBsyC,GACpCloD,SAAU7kB,EAASC,IACnB6kB,WAAY9kB,EAASE,MACrB6kB,UAAW/kB,EAASG,KACpB8kB,eAAgBwV,GAAoBz6B,GACpCglB,SAAUmoD,EACV55E,YAAauwB,EACbE,YACAoB,aAAcxB,EACdyB,YAAaiY,GAAgB1Z,EAC7B0B,oBAAqBkqD,IAKvB,OAHI/mF,EAAO27B,UAAU/5B,SAAS2hF,IAGvBviD,GAAIhR,eAAe83D,EAAe,UAAUvgE,MAAKhnB,IACtD,GAAsB,OAAlBA,EAAOqC,OAKX,OAAOo+B,GAAIpR,aAAak4D,GAJtBprF,KAAKk5C,oBAAoBr1C,MAMxB,CAEL,MAAM+0C,EAA2B,CAC/B1Z,QAAShG,EACTiG,WAAYhG,EACZiG,qBAAsBkoD,EAAaxiF,MAAM,KACzCu6B,wBAAyBmoD,EAAY1iF,MAAM,KAC3C+4B,SACAkC,YAAaxB,EACbyB,oBAAqBe,EACrBzB,SAAUsoD,EAAS9sE,IACnBykB,WAAYqoD,EAAS7sE,MACrBykB,UAAWooD,EAAS5sE,KACpB0kB,SAAU7kB,EAASC,IACnB6kB,WAAY9kB,EAASE,MACrB6kB,UAAW/kB,EAASG,KACpB6kB,SAAUmoD,EAAM3lE,SAAS2lE,GAAO,EAChCnvC,SAAU,GACVzqC,YAAauwB,EACbE,YACAoB,aAAcxB,EACdyB,YAAaiY,GAAgB1Z,EAE7Bqa,YAAa,GACbrZ,eAAgB6V,GAAoBsyC,GACpC9nD,eAAgBwV,GAAoBz6B,GACpCk+B,kBAAkB,EAClB5Y,oBAAqBkqD,EACrBprD,UAAW,IAEb,OAAOqF,GAAIhR,eAAeslB,EAAW,UAAU/tB,MAAKhnB,IAClD,GAAsB,OAAlBA,EAAOqC,OAKX,OAAOo+B,GAAIrR,aAAa2lB,GAJtB54C,KAAKk5C,oBAAoBr1C,OASjCq1C,oBAAoBr1C,GAClB,MAAMgrC,EAAShrC,EAAOnD,MAAQ,GAC9BV,KAAKo7B,SAAS,CACZsc,eAAgB1uC,EAAoB6lC,EAAO3P,SAC3C2Y,cAAe7uC,EAAoB6lC,EAAO1P,YAC1C6Y,YAAahvC,EAAoB6lC,EAAOhR,QACxC6a,gBAAiB1vC,EAAoB6lC,EAAO9O,aAC5CsoD,mBAAoBr/E,EAAoB6lC,EAAO7O,qBAC/C6nD,cAAe7+E,EAAoB6lC,EAAOw8C,WAC1C9yC,cAAevvC,EAAoB6lC,EAAOoK,WAC1CgvC,SAAUj/E,EAAoB6lC,EAAOhP,UACrCorD,kBAAmBjiF,EAAoB6lC,EAAOzP,sBAC9CqoD,iBAAkBz+E,EAAoB6lC,EAAOxP,yBAC7CspD,gBAAiB3/E,EAAoB6lC,EAAOzgC,eAIhDk9E,eACE,MAAM,OAAE1sD,EAAF,UAAUC,EAAV,mBAAqBwrD,GAAuBrqF,KAAK2K,MACvD,MAAO,CACL,CACE0H,KAAMG,GAAK3E,KACXmH,MAAOvP,EAAE,4BACT6I,GAAI,WACJ0oC,QAASh3C,KAAKmpF,mBAEhB,CACE92E,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,0BACT6I,GAAI,SACJ0oC,QAASh3C,KAAK0qF,gBACdzlB,aAAc,IAAMrmC,EAAO/+B,OAAOkF,YAEpC,CACEsN,KAAMG,GAAKwyD,KACXhwD,MAAOvP,EAAE,6BACT6I,GAAI,YACJ0oC,QAASh3C,KAAK4qF,mBACd3lB,aAAc,IAAMpmC,EAAUh/B,OAAOkF,YAEvC,CACEsN,KAAMG,GAAKu/C,KACX/8C,MAAOvP,EAAE,iCACT6I,GAAI,YACJ0oC,QAASh3C,KAAK+sE,mBACd9H,aAAc,IAAMjlE,KAAK2K,MAAMsiC,kBAAkBloC,YAEnD,CACEsN,KAAMG,GAAKk0E,MACX1xE,MAAOvP,EAAE,iCACT6I,GAAI,gBACJ0oC,QAASh3C,KAAK+qF,uBACd9lB,aAAc,IAAMjlE,KAAK2K,MAAMskC,cAAcpvC,OAAOkF,YAEtD,CACEsN,KAAMG,GAAKk0E,MACX1xE,MAAOvP,EAAE,4BACT6I,GAAI,WACJ0oC,QAASh3C,KAAK8qF,kBACd7lB,aAAc,IAAMolB,EAAmBxqF,OAAOkF,aAMpDqkF,qBACE,MAAM,UACJlwD,EADI,eAEJwe,EAFI,SAGJve,EAHI,cAIJ0e,EAJI,aAKJyvC,EALI,kBAMJ2D,EANI,YAOJzD,EAPI,iBAQJC,EARI,OASJ5pD,EATI,YAUJma,EAVI,SAWJ4vC,EAXI,cAYJC,EAZI,SAaJhtE,EAbI,cAcJ09B,EAdI,IAeJyvC,EAfI,SAgBJC,GACEjoF,KAAK2K,MAET,OACE,gBAACsb,GAAA,EAAD,WACE,eAACgvB,GAAD,CACEhnC,KAAK,YACL5E,MAAO8vB,EACPrV,MAAOre,EAAE,mBACT0gB,SAAUnmB,KAAKonF,sBACft+E,MAAO+uC,IAET,eAAC5C,GAAD,CACEhnC,KAAK,gBACL5E,MAAOm+E,EACP1jE,MAAOre,EAAE,sBACT+uC,aAAc,EACdruB,SAAUnmB,KAAKunF,yBACfz+E,MAAO2+E,IAET,eAACxyC,GAAD,CACEhnC,KAAK,aACL5E,MAAO6vB,EACPpV,MAAOre,EAAE,oBACT0gB,SAAUnmB,KAAKmnF,uBACfr+E,MAAO4uC,IAET,eAACzC,GAAD,CACEhnC,KAAK,iBACL5E,MAAOi+E,EACPxjE,MAAOre,EAAE,uBACT+uC,aAAc,EACdruB,SAAUnmB,KAAKqnF,0BACfv+E,MAAOmiF,IAET,eAACv2C,GAAD,CACEzmC,KAAK,SACL0Q,QAAS3e,KAAKq3C,cACdvzB,MAAOre,EAAE,iBACT4D,MAAOw0B,EACP1X,SAAUnmB,KAAK0nF,oBACf5+E,MAAOkvC,IAET,eAAChC,GAAD,CACE/nC,KAAK,YACL5E,MAAOu+E,EACP9jE,MAAOre,EAAE,eACT0gB,SAAUnmB,KAAK2nF,sBACf7+E,MAAO++E,IAET,eAAC7xC,GAAD,CACE/nC,KAAK,YACL5E,MAAOwR,EACPiJ,MAAOre,EAAE,eACT0gB,SAAUnmB,KAAK8nF,sBACfh/E,MAAOyvC,IAET,eAACtD,GAAD,CACEhnC,KAAK,MACL5E,MAAO2+E,EACPlkE,MAAOre,EAAE,cACT0gB,SAAUnmB,KAAK+nF,iBACfj/E,MAAOm/E,OAMfqB,qBACE,MAAM,iBACJpxC,EADI,YAEJzZ,EAFI,WAGJF,EAHI,gBAIJma,EAJI,cAKJ3X,EALI,mBAMJsnD,EANI,aAOJlwC,EAPI,kBAQJE,EARI,MASJmwC,EATI,WAUJC,GACEzoF,KAAK2K,MACT,OACE,gBAACsb,GAAA,EAAD,WACE,eAACywB,GAAD,CACEG,YAAU,EACVl4B,QAAS3e,KAAKs3C,mBACdjuC,MAAOo1B,EAAc,IAAM,IAC3BtY,SAAUnmB,KAAKkoF,yBACfp/E,MAAOovC,IAET,eAACxB,GAAD,CACEG,YAAU,EACVl4B,QAAS3e,KAAKu3C,kBACdluC,MAAOk1B,EACPpY,SAAUnmB,KAAKmoF,wBACfr/E,MAAO4vC,IAERja,GACC,eAACiY,GAAD,CACEG,YAAU,EACV/yB,MAAOre,EAAE,qBACTkxC,UAAW,EACXh4B,QAAS3e,KAAKw3C,kBACdnuC,MAAO8uC,EAAe,IAAM,IAC5BvB,UAAW,EACXzwB,SAAUnmB,KAAKsoF,wBACfx/E,MAAOuvC,IAGV5Z,GAAeF,IAAevB,GAAW5vB,UACxC,eAACspC,GAAD,CACEG,YAAU,EACV/yB,MAAOre,EAAE,gBACTkxC,UAAW,EACXh4B,QAAS3e,KAAKinF,aACd59E,MAAOm/E,EAAQ,IAAM,IACrB5xC,UAAW,EACXzwB,SAAUnmB,KAAKuoF,mBACfz/E,MAAO2/E,IAGX,eAAC/zC,GAAD,CACEzmC,KAAK,WACL6V,MAAOre,EAAE,mBACTkZ,QAAS3e,KAAKgnF,qBACd39E,MAAO03B,EACP5a,SAAUnmB,KAAKooF,2BACft/E,MAAOu/E,OAMfkB,uBACE,MAAM,WAAE5qD,EAAF,gBAAcgqD,GAAoB3oF,KAAK2K,MAC7C,OACE,eAACsb,GAAA,EAAD,UACE,eAACkvB,GAAD,CACElnC,KAAK,cACL6V,MAAOre,EAAE,qBACT4D,MAAOs1B,EACPxY,SAAUnmB,KAAK0oF,wBACf//C,YAAaljC,EAAE,iCACf2vC,UAAQ,EACRtsC,MAAO6/E,EACPtzC,KAAM,MAMdw1C,sBACE,MAAM,UAAEhsD,EAAF,OAAahB,GAAW79B,KAAK2K,MAC7B6gF,EAAgB3sD,EAAU9hB,KAAI,CAAC1D,EAAUpO,IAC7C,eAACm6E,GAAD,CAEEvnD,OAAQA,EACRxkB,SAAUA,EACVpO,MAAOA,EACPkb,SAAUnmB,KAAK8oF,sBACf36B,gBAAiBnuD,KAAKgpF,6BALjB/9E,KAQT,OACE,eAACgb,GAAA,EAAD,UACE,gBAACA,GAAA,EAAKysB,IAAN,WACE,eAACN,GAAA,EAAD,CAAKC,GAAI,EAAT,SACCm5C,IAED,eAACp5C,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,eAAC,KAAD,UACE,gBAAC5H,GAAA,EAAD,CAAMn4B,MAAO,CAACssC,YAAa,EAAGvR,aAAc,EAAG8G,WAAY,EAAG8X,cAAe,EAAG3N,gBAAiB,WAAjG,UACE,eAAChQ,GAAA,EAAD,CAAOxR,QAAS,YAAaxqB,MAAO,CAAC6R,MAAO,QAA5C,SACG1e,EAAE,8BAEL,yBAAO2M,UAAU,YAAjB,UAA8B3M,EAAE,4BAAhC,OACA,eAAC2sC,GAAA,EAAD,UACE,eAACqO,GAAD,CAAgBE,YAAal7C,EAAE,yBAA0B8E,KAAMoK,GAAsBqF,OAAQ0mC,WAAY1gD,KAAK4oF,uCA2L9HY,oBACE,OACE,eAAC3tD,GAAD,UACE,eAACgB,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASlf,KAAKssE,kBAAxC,SACG7mE,EAAE,2BA6FXghC,gBACE,OACE,eAAC49B,GAAD,CACE/1D,GAAG,mBACHg2D,iBAAiB,WACjBC,KAAMvkE,KAAKsrF,eACX1mB,SAAS,kBCnqCV,MAAM6mB,GAAYt5E,IACvB,MAAM,KAAE7H,EAAF,MAAQ1E,GAAUuM,EACxB,OACE,sBAAKG,MAAO,CAAEqzB,SAAU,WAAY0uB,MAAO,GAAItrB,IAAK,GAAI4yC,OAAQ,KAAhE,SACE,eAAC/5D,GAAD,CAAUtX,KAAMA,EAAM1E,MAAOA,EAA7B,SACE,oBAAGwM,UAAWI,GAAKu5B,YCFd2/C,GAAkBv5E,IAC7B,MAAM,OAAE7O,GAAW6O,EACbw5E,EAAUroF,EAAOo9B,YACjBkrD,EAAUtoF,EAAOq9B,YACjBqnD,EAAM1kF,EAAOk+B,cACbqqD,EAAS7D,EAAInoF,OAAS,EAC5B,OACE,uBAAKuS,UAAWqO,KAAOqrE,WAAvB,UACE,+BACGH,GAAW,8CAAQroF,EAAO06B,YAC1B2tD,GAAWC,GAAW,kDACtBA,GAAW,gDAAWtoF,EAAO86B,YAC7BytD,GAAU,4CAAK7D,EAAL,OACV1kF,EAAOo7B,YAAe,KAAIj5B,EAAE,2BAE/B,oBAAG6M,MAAOu1B,GAAWI,KAAKF,OAA1B,SAAmCzkC,EAAOq7B,iBCNnCotD,GAAc55E,IACzB,MAAM,KAAEvO,EAAF,OAAQN,EAAR,sBAAgB0oF,GAA0B75E,EAEhD,OACE,eAACs4B,GAAA,EAAD,UACE,gBAACA,GAAA,EAAK7N,KAAN,WACG0H,GAAIpY,cAAgBtoB,EAAKoL,WAAa,eAACy8E,GAAD,CAAUnhF,KAAMoK,GAAOuC,WAAYrR,MAAOtC,EAAOgL,MACtFg2B,GAAIpY,cACJ,eAAC2Q,GAAA,EAAD,CAAS3d,QAAS8sE,EAAuB15E,MAAO,CAAEgiC,MAAO,SAAzD,SACG7uC,EAAE,0BAGP,sBAAI6M,MAAO,CAAE+rC,aAAc,GAA3B,UACG/6C,EAAO41B,UACP,IACA51B,EAAOu6B,SAAWd,GAAOqE,WAAa,oBAAGhvB,UAAW9O,EAAOu6B,SAAWd,GAAOuE,KAAO9uB,GAAK8uB,KAAO9uB,GAAK6uB,YAExG,qBAAI/uB,MAAO,CAAE+pB,UAAW,EAAGgiB,aAAc,GAAzC,SACE,uBAAM/rC,MAAO,CAAE00B,cAAe,aAA9B,SAA8C1jC,EAAO61B,aAEvD,eAACuyD,GAAD,CAAgBpoF,OAAQA,U,cClBzB,IAAK2oF,GAMAC,I,SANAD,K,kBAAAA,E,sBAAAA,E,qBAAAA,Q,cAMAC,K,gCAAAA,E,kCAAAA,Q,KCbL,MAAMC,GAAmBh6E,IAC9B,MAAM,MAAElH,EAAF,QAAS2iB,EAAT,gBAAkBugC,GAAoBh8C,EAC5C,OACE,uBAAKG,MAAO,CAAEuP,OAAQ,UAAWqC,YAAa,GAAIyhB,SAAU,YAA5D,UACE,eAACyf,GAAD,CACEn6C,MAAOA,EACP2iB,QAASA,EACTpJ,UAAU,EACVmwB,UAAU,EACVz1B,QAAS,OACTwhC,WAAY,SAEd,eAAC7jB,GAAA,EAAD,CACEC,QAAQ,OACR5d,QAASivC,EACT77C,MAAO,CAAEqzB,SAAU,WAAY0uB,MAAO,EAAGE,OAAQ,GAHnD,SAKE,oBAAGniD,UAAWI,GAAK42B,oBAedgjD,GAA0Bj6E,IACrC,MAAM,KAAEgJ,EAAF,UAAQizB,EAAR,gBAAmB+f,EAAnB,UAAoCk+B,EAApC,UAA+CC,EAA/C,gBAA0DpiC,GAAoB/3C,EAkB9Eo6E,EAAgBn+C,EAAUo+C,QAAsB,CAACt+D,EAAUhvB,KAC/DA,EAASgvB,SAAS3P,SAAQ,CAACqP,EAAS3iB,KAClCijB,EAAStc,KACP,eAACu6E,GAAD,CAEElhF,MAAOA,EACP2iB,QAASA,EACTugC,gBAAiB,IAAMA,EAAgBjvD,EAAU+L,IAH5C/L,EAAS6O,IAAM,IAAM9C,OAOzBijB,IACN,IAEH,OACE,uBAAK5b,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,OAA9C,UACGgnD,EACqB,IAArBn+C,EAAUvuC,OACT,eAACwqD,GAAD,CACElvC,KAAMA,EACN+uC,gBAAiBA,EACjBb,QArCenqD,IACJ,QAAbA,EACF85C,uBAAoBlwC,MAAMrD,EAAE,oCAE5B4mF,EAAUntF,IAkCNkqD,YAAa,CAAE9pD,MAAO,IAAKwD,OAAQ,IAAKo9D,aAAc,KAGxD,eAAClW,GAAD,CACEt8B,WAAY0gB,EAAU,GAAGrgC,IACzBk8C,gBAAiB7b,EAAU,GAAGlgB,SAASruB,OACvCqqD,gBAAiBA,EACjBb,QArCenqD,IACJ,QAAbA,EACF85C,uBAAoBlwC,MAAMrD,EAAE,oCAE5B6mF,EAAUptF,IAkCNkqD,YAAa,CAAE9pD,MAAO,IAAKwD,OAAQ,IAAKo9D,aAAc,SCxEnDusB,GAAuBt6E,IAClC,MAAM,OAAE7O,GAAW6O,GACZooB,EAAQ5O,GAAW2O,GAASnoB,GAC7B+0C,EAAc,IAAMv7B,IAEpBu+B,EAAkBjiC,mBAAQ,IAAMykE,iBAAU,KACzCxzD,EAAWue,EAAcC,EAAgBC,GAAqBxuC,EAAkB,KAChFgwB,EAAUye,EAAaC,EAAeC,GAAoB3uC,EAAkB,KAC5E+E,EAAOy+E,EAAUC,EAAYC,GAAiB1jF,EAAkB,KAChEmiB,EAASwhE,EAAYC,EAAcC,GAAmB7jF,EAAkB,KACxEilC,EAAW6+C,GAAgB1jF,mBAAsB,IAElD4R,EAAuB,CAC3B,CACEC,IAAK,sBACLQ,OAAQ,CACNtY,OAAQ,CACNiH,KAAMoK,GAAsBqF,OAC5BjM,IAAKzK,EAAOgL,GACZL,KAAM3K,EAAO2K,KACboL,SAAUzE,GAA0BkF,KACpCR,QAAS,OAgDjB,OACE,gBAAC,KAAD,CAAOshB,KAAK,KAAKW,KAAMhB,EAAQiB,OAAQ0rB,EAAvC,UACE,eAACjrB,GAAD,UAAcx2B,EAAE,gCAChB,gBAAC,KAAMm3B,KAAP,WACE,6BAAIn3B,EAAE,yCACN,gBAACwgB,GAAA,EAAD,WACE,eAACgvB,GAAD,CACEhnC,KAAK,aACL6V,MAAOre,EAAE,kCACTkjC,YAAaljC,EAAE,kCACf4D,MAAO6vB,EACPpwB,MAAO4uC,EACPvxB,SAAUsxB,IAEZ,eAACxC,GAAD,CACEhnC,KAAK,YACL6V,MAAOre,EAAE,iCACTkjC,YAAaljC,EAAE,iCACf4D,MAAO8vB,EACPrwB,MAAO+uC,EACP1xB,SAAUyxB,IAEZ,eAAC3C,GAAD,CACEhnC,KAAK,QACL6V,MAAOre,EAAE,8BACTkjC,YAAaljC,EAAE,8BACf4D,MAAO6E,EACPpF,MAAO8jF,EACPzmE,SAAUwmE,IAEZ,eAACx3C,GAAD,CACElnC,KAAK,UACL6V,MAAOre,EAAE,gCACTkjC,YAAaljC,EAAE,4CACf4D,MAAOiiB,EACPxiB,MAAOikF,EACP5mE,SAAU2mE,OAGd,6BAAIrnF,EAAE,sCACN,eAAC2mF,GAAD,CACEjxE,KAAMA,EACNizB,UAAWA,EACX8b,gBAAiBA,EACjBiE,gBAtFsBjvD,IAC5B,MAAMgrF,EAAe97C,EAAUpvB,QAAOjW,GAAKA,EAAEgF,MAAQ7O,EAAS6O,MAC9Dk/E,EAAa/C,IAqFPmC,UAlFuBntF,IAC7B+tF,EAAa,IAAI7+C,EAAWlvC,KAkFtBotF,UA/EuBptF,IAC7B+tF,GAAa7+C,GAAaA,EAAUrxB,KAAImwE,GAAOA,EAAIn/E,MAAQ7O,EAAS6O,IAAM7O,EAAWguF,YAiFnF,gBAACnxD,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASgoC,EAArC,SACGzhD,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAlFN0sB,UACxB,MAAMlrC,EAA8B,CAClC6wB,UAAWjuB,EAAOgL,GAClB4qB,YACAC,WACAjrB,QACAE,YAAakd,EACb6hE,UAAW5nF,MAASuoC,OAAO,oBAC3BlpC,SAAUN,IACV4B,OAAQ+lF,GAAqBmB,UAC7BC,YAAaj/C,EAAUrxB,KAAI7d,GAAYA,EAAS6O,MAChDq8C,iBAAkBF,GAGdrmD,QAAeygC,GAAIrM,uBAAuBv3B,EAAM,UAEtD,GAAsB,QAAlBmD,EAAOqC,OAAkB,CAC3B,MAAM2oC,EAAShrC,EAAOnD,MAAQ,GAC9Bi3C,EAAkB9I,EAAO3V,WACzB4e,EAAiBjJ,EAAO1V,UACxB0zD,EAAch+C,EAAO3gC,OACrB8+E,EAAgBn+C,EAAOzgC,wBAEjBk2B,GAAIxM,qBAAqBp3B,GAC/Bs4C,uBAAoBhuB,QAAQvlB,EAAE,mCAC9BkmB,KAyDE,SACE,oBAAGvZ,UAAWI,GAAK0T,iBC7IhBonE,GAAcn7E,IACzB,MAAM,KAAE81B,GAAS91B,EACjB,OACE,eAACs4B,GAAA,EAAD,CAAM8iD,GAAG,QAAQn7E,UAAU,cAA3B,SACE,eAACq4B,GAAA,EAAK7N,KAAN,UACE,eAAC6N,GAAA,EAAKuY,KAAN,CAAW5wC,UAAU,aAArB,SACG61B,SCHLulD,GAAUzrE,IAAM8oB,cAA2B,IAM1C,MAAM4iD,GAAqBD,GAAQviD,SCJ1B94B,WACd,MAAM,mBAAEk4E,GAAuBl4E,GACzB,QAAE2zB,GDDDiF,qBAAWyiD,ICEZ1uD,E3IyTD,SAAqBgH,GAC1B,MAAOjiC,EAAQsoC,GAAa5iC,mBAAqB,IAQjD,OAPA8b,qBACE,KACEygB,EAAQA,QAAQxB,GAAInO,kBAAax1B,OAAWA,OAAWA,EAAW,IAAKuC,EAAO,YAC3E2nB,MAAKiU,GAAYqN,EAAUrN,EAASp+B,UAEzC,CAAColC,IAEIjiC,E2IlUU6pF,CAAY5nD,GAE7B,OAAkC,IAA9BukD,EAAmBxqF,OACd,eAACytF,GAAD,CAAYrlD,KAAMxiC,EAAE,mCAG3B,eAAColD,GAAD,CAAUx4C,KAAMG,GAAKk0E,MAAO1xE,MAAOvP,EAAE,4BAArC,SACE,8BACG4kF,EAAmBttE,KAAI4wE,IACtB,MAAMhqF,EAAUm7B,EAASh+B,MAAK8sF,GAAKA,EAAE7/E,MAAQ4/E,EAAWhqF,UACxD,OAAO,8BAA8BA,EAAUA,EAAQqR,MAAQ,OAA/C24E,EAAWhqF,iB,qBCjB9B,MAAMkqF,GAAY17E,IACvB,MAAM,KAAE81B,EAAF,MAAQ31B,GAAUH,EACxB,OACE,uBAAMG,MAAOA,EAAOF,UAAWqO,KAAOwnB,KAAtC,SAA6CA,K,yBCJ1C,MAAM6lD,GAAa37E,IACxB,MAAM,KAAE81B,GAAS91B,EACjB,OACE,uBAAMC,UAAWqO,KAAOqD,MAAxB,SAAgCmkB,KCKvBm9C,GAAoBjzE,IAC/B,MAAM,SAAEkH,EAAF,OAAYwkB,GAAW1rB,EAE7B,OAAO,qCACL,gBAACugC,GAAA,EAAD,WACE,eAACN,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,eAACy7C,GAAD,CAAW7lD,KAAMjuB,GAAOsrE,6BAA6BjsE,EAASA,SAAUwkB,OAE1E,eAACuU,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,eAACzwB,GAAD,CAAUtX,KAAMoK,GAAOsE,WAAYpT,MAAOyT,EAASkY,UAAnD,SACGlY,EAAS/V,QAAW+V,EAAS/V,OAAO47B,QAAU,IAAM7lB,EAAS/V,OAAO67B,eAGzE,eAACiT,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,eAACw7C,GAAD,CAAU5lD,KAAM5uB,EAASykE,mBChBjB3rE,WACd,MAAM,UAAE0sB,EAAF,OAAahB,GAAW1rB,EAE9B,OAAyB,IAArB0sB,EAAUh/B,OACL,eAACytF,GAAD,CAAYrlD,KAAMxiC,EAAE,6BAG3B,eAACglC,GAAA,EAAD,UACE,eAACA,GAAA,EAAK7N,KAAN,UAEIiC,EAAU9hB,KAAI,CAAC1D,EAAUpO,IACvB,eAAC,GAAD,CAA8BoO,SAAUA,EAAUwkB,OAAQA,EAAQ5yB,MAAOA,GAAlDA,UCb5B,MAAM07E,GAAoBx0E,IAE/B,MAAMopD,EAAY,CAChBx0B,SAAS,GACTwB,mBAAoB,YACpBpkB,MAAO,YAGH,cAAE8qB,EAAF,sBAAiB23C,GAA0Bz0E,EAE3C6gE,EAAQ/jC,EAAclyB,KAAI5Y,GAC9B,eAAC8a,GAAD,CAEEjK,MAAO4uB,GAAkBY,WAAWrgC,GACpC+a,QAAS,KAAO0nE,EAAsBziF,IAHxC,SAIGy/B,GAAkBY,WAAWrgC,IAHzBA,EAAY4J,OAOrB,OAA6B,IAAzBkhC,EAAcpvC,OAEd,gBAAC6yC,GAAA,EAAD,CAAMpgC,MAAO,CAAC+pB,UAAW,IAAzB,UACE,eAAC+V,GAAA,EAAD,CAAKC,GAAI,IACT,eAACD,GAAA,EAAD,CAAKC,GAAI,EAAGjgC,UAAW,gCAAvB,SACE,qBAAGE,MAAOipD,EAAV,UACG91D,EAAE,oDACFutE,OAGL,eAAC5gC,GAAA,EAAD,CAAKC,GAAI,OAKX,gBAACK,GAAA,EAAD,CAAMpgC,MAAO,CAAC+pB,UAAW,IAAzB,UACE,eAAC+V,GAAA,EAAD,CAAKC,GAAI,IACT,eAACD,GAAA,EAAD,CAAKC,GAAI,EAAGjgC,UAAW,gCAAvB,SACE,qBAAGE,MAAOipD,EAAV,UACG91D,EAAE,gDACFutE,OAGL,eAAC5gC,GAAA,EAAD,CAAKC,GAAI,QCtBJ07C,GAAkB57E,IAC7B,MAAM,GAAE7D,EAAF,QAAMw3B,EAAN,OAAec,EAAf,QAAuByE,EAAvB,IAAgC7rB,GAAQrN,EAExCvO,EAAO0gC,GAAI1gC,KACXN,EAASipC,GAAUzG,EAASx3B,EAAI,CAAC6uB,GAAmBqP,iBAAkBrP,GAAmBsP,UAAWtP,GAAmBuP,kBACvHshD,EjJwID,SAAiCloD,EAAkBzwB,GACxD,MAAOxR,EAAQsoC,GAAa5iC,mBAA+B,IAW3D,OADA8b,qBATgB,KACThQ,EAKLywB,EAAQA,QAAQxB,GAAI1K,4BAA4BvkB,GAAWnS,EAAO,kBAC/D2nB,KAAKshB,GALNA,EAAU,MAOK,CAACrG,EAASzwB,IACtBxR,EiJpJgBoqF,CAAwBnoD,EAASliC,EAAKmL,eAAYpO,EAAY2N,GAC/E8/B,EjJ4MD,SAAmCtI,EAAkBzwB,GAC1D,MAAOxR,EAAQsoC,GAAa5iC,mBAAsB,IAKlD,OAJA8b,qBAAU,KACRygB,EAAQA,QAAQxB,GAAIzV,sBAAsB,SAAUxZ,GAAWnS,EAAO,aACnE2nB,KAAKshB,KACP,CAACrG,EAASzwB,IACNxR,EiJlNWqqF,CAA0BpoD,EAASx3B,GAC/C2gC,EjJqJD,SAA0BnJ,EAAkBzwB,GACjD,MAAOxR,EAAQsoC,GAAa5iC,mBAA0B,IAYtD,OADA8b,qBAVgB,KACThQ,EAILywB,EAAQA,QAAQxB,GAAIvN,2BAA2B1hB,GAAWnS,EAAO,gBAC9D2nB,MAAKgsD,IACJ1qC,EAAU0qC,EAAYn2E,SALxByrC,EAAU,MAQK,CAACrG,EAASzwB,IACtBxR,EiJlKesqF,CAAiBroD,EAASliC,EAAKmL,eAAYpO,EAAY2N,GAEvE8/E,EAAqBnmE,mBAAQ,IACH,IAA1B+lE,EAAenuF,OAEf,eAACytF,GAAD,CAAYrlD,KAAMxiC,EAAE,4BAIjBuoF,EAAejxE,KAAIsxE,GACxB,eAAC1+B,GAAD,CAAiDjuD,MAAO2sF,EAAIl/B,UAAU,GAAzCk/B,EAAG30D,oBAEjC,CAACs0D,IAEEM,EAAarmE,mBAAQ,IACpB3kB,GAGLA,EAAOs7B,OAAOze,KAAKq0D,IACZlxE,EAAOs7B,OAAO7hB,KAAIrb,GAAS,eAAC+jF,GAAD,CAA2B/jF,MAAOA,GAAlBA,EAAMqM,QAH/C,0BAIR,CAACzK,IASEgnF,EAA6BnmF,IACjC,IAAKA,EACH,OAEF,MAAMqb,EAAM9K,GAAOsE,WACnBqyB,EAAQz5B,KAAM,kBAAiBzN,EAAY4J,gBAAgByR,KAA9C,OAAqDlc,QAArD,IAAqDA,OAArD,EAAqDA,EAAQgL,OAKtEigF,EAAoB,IAAMH,EAuB1BtD,EAAoB,IACjB,eAAC0D,GAAD,CAAanE,oBAA0B,OAAN/mF,QAAM,IAANA,OAAA,EAAAA,EAAQw7B,WAAY,KAExD2vD,EAAmB,IAChB,eAAC,GAAD,CAAkBx/C,cAAeA,EAAe23C,sBAAuB0D,IAG1E/lB,EAAiB,GACvBA,EAAK3yD,KAAK,CACRtD,GAAI,SACJ0G,MAAOvP,EAAE,0BACT4M,KAAMG,GAAKY,KACX4jC,QApCsB,IAAM,qCAAGs3C,IAqC/BrpB,aAAc,kBAAY,OAAN3hE,QAAM,IAANA,OAAA,EAAAA,EAAQs7B,QAAR,OAAiBt7B,QAAjB,IAAiBA,GAAjB,UAAiBA,EAAQs7B,cAAzB,aAAiB,EAAgB/+B,OAAOkF,WAAa,OAE3Ew/D,EAAK3yD,KAAK,CACRS,KAAMG,GAAKwyD,KACThwD,MAAOvP,EAAE,6BACX6I,GAAI,YACJ0oC,QAzCyB,IAClB,eAAC03C,GAAD,CAAmB7vD,WAAiB,OAANv7B,QAAM,IAANA,OAAA,EAAAA,EAAQu7B,YAAa,GAAIhB,QAAc,OAANv6B,QAAM,IAANA,OAAA,EAAAA,EAAQu6B,SAAUd,GAAOqE,YAyC/F6jC,aAAc,mCAAM3hE,QAAN,IAAMA,OAAN,EAAMA,EAAQu7B,UAAUh/B,OAAOkF,kBAA/B,QAA6C,OAE7Dw/D,EAAK3yD,KAAK,CACRtD,GAAI,gBACJ0G,MAAOvP,EAAE,iCACT4M,KAAMG,GAAK2vB,SACX6U,QA7C6B,IACxB1zC,EAID,eAAC,GAAD,CACEkW,OAAQlW,EAAOgL,GACfoL,SAAUpW,EAAO2K,KACjBwL,SAAS,SACT4xB,QAASA,EACTvF,QAASA,EACTc,OAAQA,EACRpnB,IAAK1J,GAAWpB,GAAOsE,WAAY1V,EAAOgL,IAC1C6gD,UAAU,EACVuW,aAAa,2BAZT,+BA4CVT,aAAc,IAAM72B,EAAUvuC,OAAOkF,aAElCnB,EAAKmL,YACRw1D,EAAK3yD,KAAK,CACRtD,GAAI,WACJ0G,MAAOvP,EAAE,4BACT4M,KAAMG,GAAKm8E,YACX33C,QAASu3C,EACTtpB,aAAc,IAAM+oB,EAAenuF,OAAOkF,aAE5Cw/D,EAAK3yD,KAAK,CACRtD,GAAI,UACJ0G,MAAOvP,EAAE,2BACT4M,KAAMG,GAAKk0E,MACX1vC,QAASy3C,EACTxpB,aAAc,IAAMh2B,EAAcpvC,OAAOkF,aAE3Cw/D,EAAK3yD,KAAK,CACRtD,GAAI,WACJ0G,MAAOvP,EAAE,4BACT4M,KAAMG,GAAK4H,KACX48B,QAAS8zC,EACT7lB,aAAc,IAAM3hE,GAAUA,EAAOw7B,UAAYx7B,EAAOw7B,SAASj/B,OAAOkF,cAI5E,MAAMiQ,EAAQ1R,EAASA,EAAO41B,UAAY,IAAM51B,EAAO61B,SAASq0B,cAAgB,GAChF,OACE,eAAChoB,GAAD,CACEl3B,GAAIoG,GAAOsE,WACXlF,OAAQxF,EACR+D,KAAMG,GAAK3E,KACXmH,MAAOA,EACPwK,IAAKA,GAAO9K,GAAOwD,YALrB,SAOG5U,GACC,uBAAKgP,MAAO,CAAE+pB,UAAW,IAAzB,UACE,eAAC0vD,GAAD,CAAYnoF,KAAMA,EAAMN,OAAQA,EAAQ0oF,sBAxGlB,KACvB1oF,GAGLsjC,EAAOrL,MAAKppB,GAAS,eAACs6E,GAAD,CAAqBnpF,OAAQA,KAAY6O,SAqGxD,eAACkyD,GAAD,CACE/1D,GAAG,aACHg2D,iBAAiB,SACjBC,KAAMA,EACNK,SAAS,qB,wBCnJd,MAAMgqB,GAAoBz8E,IAC/B,MAAOooB,EAAQ5O,GAAW2O,GAASnoB,IAC5B08E,EAAQC,GAAavlF,mBAAS4I,EAAM08E,SACpCE,EAAQC,GAAazlF,mBAAS4I,EAAM48E,QAOrCp2C,EAAsB,KAC1BhtB,EAAQ,CACNkjE,SACAE,SACAljD,WAAW,EACX2hC,YAAY,KAsBVC,EAAQohB,EAAO5gF,KACfy/D,EAAQqhB,EAAO9gF,KACfghF,EAAeJ,EAAOh+E,iBACtBq+E,EAAeH,EAAOl+E,iBACtBs+E,EAAeF,EAAa9wC,aAAe,GAC3CixC,EAAeF,EAAa/wC,aAAe,GAC3CkxC,EAAYJ,EAAa19E,UAAY,GACrC+9E,EAAYJ,EAAa39E,UAAY,GACrCg+E,EAASN,EAAaz9E,6BAA+B,GACrDg+E,EAASN,EAAa19E,6BAA+B,GACrDi+E,EAASR,EAAax9E,6BAA+B,GACrDi+E,EAASR,EAAaz9E,6BAA+B,GACrDs8D,EAAgBN,IAAUC,EAC1BiiB,EAAkBd,EAAO3oF,SAAW6oF,EAAO7oF,OAC3CgoE,EAAgB2gB,EAAOtkF,OAASwkF,EAAOxkF,KACvCqlF,EAAuBT,GAAgBA,IAAiBC,EACxDS,EAAoBR,GAAaA,IAAcC,EAC/CQ,EAAiBP,GAAUA,IAAWC,EACtCO,EAAiBN,GAAUA,IAAWC,EACtCM,EAAmBnB,EAAOz9E,cAAgB29E,EAAO39E,YAEvD,OACE,gBAAC,KAAD,CAAOmqB,KAAMhB,EAAQiB,OAAQmd,EAAqB/d,KAAK,KAAvD,UACE,eAACqB,GAAD,UAAcx2B,EAAE,4BAChB,gBAAC,KAAMm3B,KAAP,WACE,6BAAIn3B,EAAE,8BACN,eAAC,KAAD,UACE,mCACE,gCACE,8BAAKA,EAAE,gBACP,gCACE,oBACE2M,UAAWI,GAAKyH,UAChB3H,MAAO,CAAE6R,MAAO9T,GAAyBw+E,EAAO3oF,WAC/C,IAAKunE,KACV,gCACE,oBACEr7D,UAAW0M,GAAQtM,GAAKyH,UAAW01E,EAAkBlvE,KAAO0tD,YAASxtE,GACrE2R,MAAO,CAAE6R,MAAO9T,GAAyB0+E,EAAO7oF,WAC/C,IACH,uBAAMkM,UAAW27D,EAAgBttD,KAAO0tD,OAAS,GAAjD,SAAsDT,UAG1D,gCACE,8BAAKjoE,EAAE,gBACP,8BAAKuM,GAAiB68E,EAAOtkF,QAC7B,qBAAI6H,UAAW87D,EAAgBztD,KAAO0tD,OAAS,GAA/C,SAAoDn8D,GAAiB+8E,EAAOxkF,WAE9E,gCACE,8BAAK9E,EAAE,2BACP,8BAAK0pF,IACL,qBAAI/8E,UAAWw9E,EAAuBnvE,KAAO0tD,OAAS,GAAtD,SAA2DihB,OAE7D,gCACE,8BAAK3pF,EAAE,wBACP,8BAAK4pF,IACL,qBAAIj9E,UAAWy9E,EAAoBpvE,KAAO0tD,OAAS,GAAnD,SAAwDmhB,OAE1D,gCACE,8BAAK7pF,EAAE,iBACP,8BAAK8pF,IACL,qBAAIn9E,UAAW09E,EAAiBrvE,KAAO0tD,OAAS,GAAhD,SAAqDqhB,OAEvD,gCACE,8BAAK/pF,EAAE,iBACP,8BAAKgqF,IACL,qBAAIr9E,UAAW29E,EAAiBtvE,KAAO0tD,OAAS,GAAhD,SAAqDuhB,OAEvD,gCACE,8BAAKjqF,EAAE,uBACP,8BAAKopF,EAAOz9E,cACZ,qBAAIgB,UAAW49E,EAAmBvvE,KAAO0tD,OAAS,GAAlD,SAAuD4gB,EAAO39E,yBAKtE,gBAAC2qB,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QA7GJ,KAC1B4vE,EAAUC,GACVC,EAAUH,IA2GN,SACE,oBAAGz8E,UAAWI,GAAK47D,WAErB,sBAAK97D,MAAO,CAAE8R,SAAU,KACxB,eAACyY,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASy5B,EAArC,SACGlzC,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAtGH,KAC3ByM,EAAQ,CACNkjE,SACAE,SACAljD,WAAW,EACX2hC,YAAY,KAiGV,SACE,oBAAGp7D,UAAWI,GAAK0T,UAErB,gBAAC2W,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAhGI,KAClCyM,EAAQ,CACNkjE,SACAE,SACAljD,WAAW,EACX2hC,YAAY,KA2FV,UACE,oBAAGp7D,UAAWI,GAAK0T,QAClB,MACD,oBAAG9T,UAAWI,GAAKi2B,mBC5HvBjhB,GAAUhH,GAAiBA,EAAKlS,GAChC2hF,GAAY,IAELC,GAAuB/9E,IAClC,MAAM,QAAEk5B,EAAF,KAAW9gC,EAAX,MAAiBg8C,GAAUp0C,EAC3BzO,EAAQ,IAAIkN,GAAMuB,EAAMzO,QACvB62B,EAAQ5O,GAAW2O,GAASnoB,GAG7BmU,EAAkC2B,mBAAQ,IAAM,CACpD,IAAItH,GAAuB,eAAgBlb,EAAE,eAAgB,CAAEnG,MAAO,MACtE,IAAI2gB,GACF,WACAxa,EAAE,gBACFnC,GAAUA,EAAOk9B,oBACjB,CAAElhC,MAAO,MAEX,IAAI2gB,GACF,WACAxa,EAAE,gBACFnC,GAAUA,EAAOm9B,mBACjB,CAAEnhC,MAAO,MAEX,IAAIyhB,GACF,UACAtb,EAAE,+BACFnC,IACE,IAAKA,EAAOy7B,gBAAkB,IAAIl/B,OAAS,EAAG,CAC5C,MAAMk/B,EAAiBz7B,EAAOy7B,gBAAkB,GAC1CoxD,EAAWpxD,EAAej+B,MAAKV,GAAKA,EAAEuyE,kBAAoB3D,GAAkBG,iBAC7EpwC,EAAej+B,MAAKV,GAAKA,EAAEuyE,kBAAoB3D,GAAkBE,WACtE,GAAIihB,EAAU,CACZ,MAAMr8E,ExC2FX,SAAmCpS,GACxC,IAAIoS,EAASpS,EAAM4xE,cAOnB,OANI5xE,EAAM+xE,gBACR3/D,GAAU,IAAMpS,EAAM+xE,eACpB/xE,EAAMkyE,cACR9/D,GAAU,KAAOpS,EAAMkyE,aACrBlyE,EAAMiyE,gBACR7/D,GAAU,IAAMpS,EAAMiyE,eACjB7/D,EwCnGkBs8E,CAA0BD,GACzC,OAAO,uCACJA,EAAS5c,cACT4c,EAAS3c,iBAAmB,uCAAG,MAAM,eAAC/lC,GAAA,EAAD,CAAO3Q,QAAQ,SAAS1qB,UAAWqO,KAAO4vE,kBAA1C,SAA8DF,EAAS3c,kBAAyB,SACrI1/D,MAIP,OAAOypB,GAAoBj6B,EAAOi7B,iBAGrC,KAEIj0B,EAAMgmF,GAAW/mF,mBAAS,IAC1BgnF,EAAYC,GAAiBjnF,mBAA+B,CAAE7I,KAAM,GAAIsjB,MAAO,KAC/EuC,EAAYkqE,GAAiBlnF,mBAAS,iBACtCid,EAAekqE,GAAoBnnF,mBAAS8a,GAAcyC,IAEjEzB,qBAAU,KACJkhC,EAAQ0pC,IAGZ3rD,GAAInU,WACF,CAAE5lB,OAAM4hE,SAAUzoE,EAAM4K,SACxB3N,EACA,EACAsvF,GACA,GACA,CAAC1hB,GAAsBv0D,OAAQmjB,GAAmBq5C,iBAClD3rD,MAAKhnB,IACL,MAAMmrC,EAAoB,GAC1B,IAAK,MAAMttC,KAASmC,EAAOnD,UACGC,IAAxBe,EAAMivF,eAGV3hD,EAAQp9B,KAAK,IAAIoI,GAAOtY,EAAMivF,gBAEhCH,EAAc,CAAE9vF,KAAMsuC,EAAShrB,MAAOngB,EAAOmgB,aAE9C,CAACtgB,EAAM4K,GAAI/D,EAAMg8C,IACpB,MAAMqqC,EAAgB3oE,mBAAQ,KAC5B,MAAMpkB,EAAS,IAAI0sF,EAAW7vF,MAU9B,MATmB,iBAAf6lB,EACF1iB,EAAOsc,MAAK,CAACC,EAAGC,IAAMD,EAAEmgB,aAAajgB,cAAcD,EAAEkgB,gBAC7B,aAAfha,EACT1iB,EAAOsc,MAAK,CAACC,EAAGC,KAAOD,EAAE6d,kBAAoB,YAAY3d,cAAcD,EAAE4d,kBAAoB,cACrE,aAAf1X,GACT1iB,EAAOsc,MAAK,CAACC,EAAGC,KAAOD,EAAEie,kBAAoB,YAAY/d,cAAcD,EAAEge,kBAAoB,cAE3F7X,IAAkBnC,GAAc0D,MAClClkB,EAAOgtF,UACFhtF,IACN,CAAC0sF,EAAYhqE,EAAYC,IACtBsqE,EAAc7oE,mBAAQ,IACnB2oE,EAAcliD,MAvFR,GAuFyBpkC,EAvFzB,GAuF0CA,EAvF1C,KAwFZ,CAACsmF,EAAetmF,IAWnB,OACE,gBAAC,KAAD,CAAOswB,KAAK,KAAKW,KAAMhB,EAAQiB,OA5Fb,IAAM7P,IA4FxB,UACE,eAACsQ,GAAD,UACGx2B,EAAE,2BAA4B,CAC7B/D,OxCyWyB2wE,EwCzWC9nE,ExC0W3B9E,EAAE2sE,GAAiBC,GAAWnvE,SwCzW7BQ,MAAOA,EAAMuK,SAGjB,eAAC,KAAM2uB,KAAP,UACG2pB,EAAQ0pC,GAAY,uCACnB,6BAAIxqF,EAAE,gCACN,oBAAG6M,MAAO,CAAEsU,UAAW,UAAvB,SACE,eAAChF,GAAD,CAAUtX,KAAMoK,GAAOsB,eAAgB5D,UAAU,kBAAjD,SACG3M,EAAE,oCAIP,eAAC6hB,GAAD,CACEC,eAAgBupE,EAChBxqE,QAASA,EACTkB,OAAQA,GACRG,cAAe2oE,EACf1oE,cA/BgB,CAACrB,EAAoBC,KAC7CiqE,EAAclqE,GACdmqE,EAAiBlqE,IA8BTxjB,KAAK,SACLujB,WAAYA,EACZC,cAAeA,EACflc,KAAMA,EACNoY,SA9HK,GA+HLD,WAAY8tE,EAAWvsE,MACvB0D,YAjCgB0+C,IACxB/6B,EAAQz5B,KAAM,YAAWw0D,EAAI93D,cxCgX1B,IAA4B+jE,G,kCyCrd5B,MAAM0e,GAAmB5+E,IAI9B,MAAM,MAAEzO,EAAF,oBAASstF,GAAwB7+E,EAKjC8+E,EAA2B,CAACvtF,EAAe6G,EAAuBg8C,KACtEyqC,EAAoBttF,EAAO6G,EAAMg8C,IAmB7B3nB,EAASl7B,EAAMwtF,uBAAyB,GACxCC,EAAwB,GACxBC,EAA4Bz0E,OAAO00E,KAAKzyD,GAfxBze,MAAM,CAACmxE,EAAMC,IAC3Brc,GAA6Boc,GAA2Bpc,GAA6Bqc,GAChF,EACArc,GAA6Boc,GAA2Bpc,GAA6Bqc,IACpF,EAED,IAUb,IAAK,IAAI7rF,KAAO0rF,EAAW,CACzB,MAAM7mF,EAAO6mF,EAAU1rF,GACjB6gD,EAAQ3nB,EAAOr0B,GACrB4mF,EAAOv/E,KACL,gBAAC67B,GAAA,EAAD,CAEEr7B,UAAWqO,KAAO+wE,iBAClBtyE,QAAU9e,IACRA,EAAEyC,iBACFzC,EAAEC,kBACFnB,SAASuyF,KAAKhwF,QACdwvF,EAAyBvtF,EAAO6G,EAAMg8C,IAP1C,UAUE,oBAAGn0C,UAAWkgE,GAAa/nE,KAAS,IAAMq0B,EAAOr0B,GAAMxF,aATlDW,IAaX,MAAMgsF,EAAkB,qCAAE,sBAAKp/E,MAAO,CAACgzB,QAAS,OAAQC,cAAe,SAAUiI,eAAe,aAAchD,WAAW,YAA/F,SACvB2mD,MAGGQ,EACJ,gBAACC,GAAA,EAAD,CAAStjF,GAAG,gBAAZ,UACE,eAACsjF,GAAA,EAAQx1D,MAAT,UACE,uBAAM9pB,MAAOu1B,GAAWI,KAAKF,OAA7B,SAAsCtiC,EAAE,oBAE1C,eAACmsF,GAAA,EAAQtsB,QAAT,UACGosB,OAOP,GAAIN,EAAUvxF,OAAS,EAAG,CAExB,MAAMgyF,EAAYT,EAAU,GACtBU,EAAalzD,EAAOizD,GAGpBE,EACJ,qCAEE,gBAACtkD,GAAA,EAAD,CAEEr7B,UAAWqO,KAAO+wE,iBAClBtyE,QAAU9e,IACRA,EAAEyC,iBACFzC,EAAEC,kBACFnB,SAASuyF,KAAKhwF,QACdwvF,EAAyBvtF,EAAOmuF,EAAWC,IAP/C,UASE,oBAAG1/E,UAAWkgE,GAAauf,KAAc,IAAMC,EAAW/sF,aARrD,qBAAuBrB,EAAMqK,OAYlCikF,EAAoBZ,EAAUvxF,OAAS,EAC3C,eAACoyF,GAAA,EAAD,CAAgBC,WAAS,EAACC,QAAQ,QAAQC,UAAU,QAAQC,QAASV,EAArE,SACE,gBAAClkD,GAAA,EAAD,CAEEr7B,UAAWqO,KAAO+wE,iBAFpB,cAGIJ,EAAUvxF,OAAS,IAFhB,eAAiB6D,EAAMqK,OAKhC,+BAEF,OAAQ,uCAAGgkF,EAAiBC,KAEvB,CAGH,MAAMM,EACJ,eAAC7kD,GAAA,EAAD,CAEEn7B,MAAO,CAACigF,OAAQ,EAAGxrD,SAAU,OAAQuX,gBAAiBzX,GAAkB1iB,MAAO0iB,IAFjF,SAIGphC,EAAE,iBAHE,kBAAoB/B,EAAMqK,KAOnC,OAAO,qCAAGukF,MC1EhBE,0BAAeC,EAAQ,MACvBD,0BAAeC,EAAQ,MACvBD,0BAAeC,EAAQ,MACvBD,0BAAeC,EAAQ,MAEhB,MAAMC,GAKXrkF,YAAYC,EAAY0G,EAAe2J,GAAoC,KAJ3ErQ,QAI0E,OAH1E0G,WAG0E,OAF1E2J,aAE0E,OAM1Eg0E,eAAkBjvF,IAChB,IAAIkvF,EAAwB,GAC5B,MAAMhuF,EAAoBN,IACpBuuF,EAA0CnvF,EAAMA,MAAMX,UAAU6B,GAGtE,OAFIiuF,EAAYthF,UACdqhF,EAAYhhF,KAAKihF,EAAYthF,UACxBqhF,EAAY1hF,KAAK,OAZgD,KA+C1EiP,KAAO,CAACC,EAAUC,IACTD,EAAEnS,KAAKqS,cAAcD,EAAEpS,MA/C9BjO,KAAKsO,GAAK,OACVtO,KAAKgV,MAAQ,OACbhV,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsB,CAAEC,UAAU,EAAOG,WAAW,GAASpB,GAYhG4B,OAAOC,EAAarO,GAOlB,OACA,qCACE,yBAAsBA,EAAtB,UACI,eAACugC,GAAA,EAAD,UACE,gBAACN,GAAA,EAAD,WACA,oBACEhgC,UAAWI,GAAKyH,UAChB3H,MAAO,CAAE6R,MAAO9T,GAAyBmQ,EAAK9c,MAAMyN,oBACpD6D,MAAOjF,GAAwByQ,EAAK9c,MAAMyN,qBAE3C,IACC,kCAASqP,EAAKvS,YAGlB,eAACykC,GAAA,EAAD,UACE,gBAACN,GAAA,EAAD,WACG,IACD,uBAAM9/B,MAtBW,CACzBi1B,WAAY,IACZR,SAAU,IAoBF,SAAkC/mC,KAAK2yF,eAAenyE,YAfrDxgB,KAAKsO,OA4BpB,SAAS68B,GAAc5mB,GACrB,OAAQA,GACN,IAAK,cACH,MAAO,eACT,IAAK,OACH,MAAO,SACT,QACE,OAAOA,GAgDb,MAAMuuE,GAAgB,CACpBhjF,GAAiBM,IACjBN,GAAiBG,MACjBH,GAAiBK,SACjBL,GAAiBijF,WACjBjjF,GAAiBI,OACjBJ,GAAiBE,WAIbwX,GAAUhH,GAAgBA,EAAKlS,GAErB6D,WACd,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,IAAoBtmB,GAAQrN,EAE5By0B,EAASkE,KACTlnC,EAAO0gC,GAAI1gC,KAEXovF,EAAgB/qE,mBAAQ,IAAM6qE,GAAc/1E,KAAI7W,GACpD,yBAAqBmD,MAAOnD,EAA5B,SAAqC6J,GAAwB7J,IAAhDA,MACX,KAEGolC,EAAWC,GAAmB7gC,EAAa,WAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,EAAjC,aAAgD2oB,EAAhD,aAA8DknC,EAA9D,cAA4EC,GAAkBhrC,GAC7F9pB,EAAOgqB,GAAYjiC,qBACpBkiC,EAAU3hC,GAAW,KACzBg8B,EAAQA,QAAQxB,GAAIlP,WAClBpW,EAlBW,GAmBXorB,EAnBW,GAqBX,CAAC,CAACe,GAAc5kB,GAAaC,IAC7B,CAACsC,GAAgBmqE,cACjBt1E,GAAS2X,SACT,CAAEnkB,kBAAmBg+B,IAAiBr/B,GAAiBM,SAAMzP,EAAYwuC,IACxEjsC,EAAO,UACP2nB,MAAKhnB,IACJ,MAAMk+B,EAASl+B,EAAOnD,KAAKqc,KAAIrZ,GAAS,IAAIkN,GAAMlN,KAClD,OAAO8nC,EAAS,CAAE9qC,KAAMqhC,EAAQ/d,MAAOngB,EAAOmgB,cAGpDqB,oBAAUomB,EAAS,CAACzsB,EAAQorB,EAAW7jB,EAAYC,EAAe2oB,IAElE,MAQM7oB,EAAU2B,mBACd,IA7FJ,SACErkB,EACAqtF,EACAtlD,EACAunD,GAEA,MAAM5sE,EAAkD,CACtD,IAAIosE,GAAqB,OAAQjtF,EAAE,eAAgB,CAACsa,WAAW,EAAMH,UAAU,EAAMtgB,MAAO,MAC5F,IAAI2gB,GAAkB,OAAQxa,EAAE,eAAe/B,GAASsO,GAAiBtO,EAAMA,MAAM6G,OAAO,CAACjL,MAAO,MACpG,IAAI2gB,GAAkB,QAASxa,EAAE,gBAAgB/B,GAASA,EAAMmN,iBAAiBW,6BAA+B,IAAI,CAAEoO,UAAU,IAChI,IAAIK,GAAkB,QAASxa,EAAE,gBAAgB/B,GAASA,EAAMmN,iBAAiBY,6BAA+B,IAAI,CAAEmO,UAAU,IAChI,IAAImB,GAAqB,cAAetb,EAAE,sBAAsB/B,GACvD,iCACH,gCAAOA,EAAM0N,cAAmB,wBAChC,uBAAMgB,UAAWqO,KAAO0yE,aAAc7gF,MAAO,CAAChT,MAAO,IAAKynC,SAAU,IAApE,SAA0EqsD,mBAAQ1vF,EAAM0N,YAAa9M,WAExG,CAAEyb,WAAW,EAAMH,UAAU,EAAOtgB,MAAO,MAC9C,IAAIyhB,GAAqB,SAAUtb,EAAE,iBAAiB/B,GAC7C,eAACqtF,GAAD,CAAiBrtF,MAAOA,EAAMA,MAAOstF,oBAAqBC,KAChE,CAAElxE,WAAW,EAAOH,UAAU,EAAOtgB,MAAO,OAoBjD,OAlBIsE,EAAKoL,WACPsX,EAAQ1U,KACN,IAAI2P,GAAmB,UAAW9b,EAAE,yBAAyB/B,GAAS,CACpE,CAAE2O,KAAMG,GAAKu5B,KAAMzhC,KAAMoK,GAAO8C,UAAWmK,UAAWje,EAAM4K,IAC5D,CACE+D,KAAM1H,GAAS,eAAC0jE,GAAD,CAAW7pD,SAAU7Z,EAAMwrE,iBAAkB31D,KAAM9c,IAClE4O,MAAO4O,GAAoBk1D,QAC3Bx2E,QAAS6F,EAAE,wBACXyZ,QAASg0E,GAEX,CACE7gF,KAAMG,GAAK42B,YACXlqB,QAASysB,EACTr5B,MAAO4O,GAAoB8qB,YAK5B1lB,EA2IIonB,CACL9pC,GArF+B,CAACF,EAAe2uE,EAA4B9rB,KAC3E3f,EAAOrL,MAAKppB,GACV,eAAC+9E,GAAD,CACE7kD,QAASA,EACT3nC,MAAOA,EACP6G,KAAM8nE,EACN9rB,MAAOA,KACHp0C,SAKkBy5B,UAE1B,GAAe,UADMtH,GAAIrP,eAAevxB,EAAM4K,IAM5C,YAJA61D,GAAiB,CACf74C,QAAS7lB,EAAE,gCACX6M,MAAO,YAIX,MAAMu5B,QAAkBjF,EAAOrL,MAAcppB,GAC3C,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,2BACT6lB,QAAS7lB,EAAE,4BAA6B,CAAEwI,KAAMvK,EAAMuK,OACtDwuB,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAGH05B,UAGCvH,GAAInP,YAAYzxB,EAAM4K,IAC5B0qC,uBAAoBhuB,QAAQvlB,EAAE,4BAA6B,CAAEwI,KAAMvK,EAAMuK,QACzEw9B,QAGyBG,MAAOloC,EAAciH,KAC9C,MAAM0rE,EAAe1rE,EAAMwrE,iBAAiB,GAC5C,IAAKE,EAEH,YADA9qC,EAAgB,CAAE8qC,aAAc3yE,IAGlC,GAAIA,IAAU2yE,EAEZ,YADA9qC,EAAgB,CAAE8qC,kBAAc11E,IAIlC4qC,EAAgB,CAAE+qC,cAAe5yE,IACjC,MAAMG,QAAe+iC,EAAOrL,MAA6BppB,GACvD,eAACy8E,GAAD,CACEC,OAAQxY,EACR0Y,OAAQrrF,KACJyO,MAGR,GAAKtO,EAAOgoC,UAML,CAGLN,EAAgB,CACd8qC,kBAAc11E,EACd21E,mBAAe31E,UAIXmlC,EAAQA,QAAQxB,GAAIpP,YAAYrxB,EAAOgrF,OAAOvgF,GAAIzK,EAAOkrF,OAAOzgF,IAAK,WAC3E,MAAMgd,EAAU7lB,EAAE,0BAA2B,CAAC2a,EAAGi2D,EAAapoE,KAAMoS,EAAG3c,EAAMuK,OAC7E+qC,uBAAoBhuB,QAAQM,GACxBznB,EAAO2pE,WACTniC,EAAQz5B,KAAM,WAAU/N,EAAOgrF,OAAOvgF,MAEtCm9B,SAnBFF,EAAgB,CACd+qC,mBAAe31E,QA8BvB,CAACiD,EAAM2nC,EAAiBF,EAASzE,EAAQ6E,EAAS3F,IAiB9CqE,EAAmB,uCACvB,yBACE/3B,UAAU,eACVE,MAAO,CAAEhT,MAAO,KAChB+J,MAAO8lC,EACPhpB,SAZ+B/lB,IACjCmrC,EAAgB,CACd4D,aAAc/uC,EAAEkiB,cAAcjZ,MAC9B+gC,UAAW,KAKb,SAMG4oD,IAEF7jD,IAAiBr/B,GAAiBM,KACjC,oBAAGgC,UAAWI,GAAKyH,UAAW3H,MAAO,CACnC6R,MAAO9T,GAAyB8+B,GAChCyP,YAAa,MAGhBy3B,GACC,gBAACpqC,GAAA,EAAD,CAAa35B,MAAO,CAAE2R,WAAY,GAAIC,YAAa,IAAnD,UACE,gBAAC2Y,GAAA,EAAD,WACE,oBAAGzqB,UAAWI,GAAK87D,QAClB,IACA+H,EAAapoE,QAEhB,eAAC4uB,GAAA,EAAD,CAAQ3d,QApCmB,KAC/BqsB,EAAgB,CACd8qC,kBAAc11E,EACd21E,mBAAe31E,KAiCb,SACE,oBAAGyR,UAAWI,GAAKkkE,gBAMrB5sC,EAAa7hB,mBAAQ,KACzB,MAAMwuD,EAAmB,GAKzB,OAJIJ,GACFI,EAAQ7kE,KAAKykE,GACXC,GACFG,EAAQ7kE,KAAK0kE,GACR,CAAEH,iBAAkBM,KAC1B,CAACJ,EAAcC,IAElB,OACE,eAACzsC,GAAD,CACEv7B,GAAIoG,GAAO0D,WACX/F,KAAMG,GAAKyH,UACXjF,MAAOvP,EAAE,qBACT+Z,IAAKA,EACLxc,KAAK,QACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPxB,WAAYA,EACZC,YAAawB,EACb/jB,OAAQA,GACRwiB,aArKsBtmC,IACxB2nC,EAAQz5B,KAAM,WAAUlO,EAAM4K,OAqK5B27B,aA1KqB,KACvBoB,EAAQz5B,KAAK,mBA0KXu4B,iBAAkBA,KCjXxB,MAAMkpD,GAAclhF,IAClB,MAAM,OAAEjM,GAAWiM,EACnB,OACE,sBAAKG,MAAO,CAAE+rC,aAAc,GAA5B,SACE,+BACE,uBAAK/rC,MAAO,IAAKu1B,GAAWI,KAAKF,QAAjC,UACE,oBAAG31B,UAAWI,GAAKyH,UAAW3H,MAAO,CAAE6R,MAAO9T,GAAyBnK,MAAc,IACpF6J,GAAwB7J,WAY7BotF,GAAgBnhF,IACpB,MAAM,MAAE2R,EAAF,KAASmkB,EAAT,SAAe9mC,GAAagR,EAClC,OACE,uBAAKG,MAAO,CAACgzB,QAAQ,OAAQC,cAAe,MAAOiF,WAAY,WAAY6T,aAAc,UAAzF,UACE,uBAAK/rC,MAAO,CAAC+7B,KAAM,EAAGznB,UAAU,QAAS1C,YAAa,KAAM2jB,GAAW/jB,MAAMikB,QAA7E,UAAuFjkB,EAAvF,QACEmkB,GAAQ,sBAAK31B,MAAO,CAAC+7B,KAAM,KAAMxG,GAAWI,KAAKF,QAAzC,SAAmDE,IAC3D9mC,GAAY,sBAAKmR,MAAO,CAAC+7B,KAAM,KAAMxG,GAAWI,KAAKF,QAAzC,SAAmD5mC,QAaxD,MAAMoyF,WAAsB1tD,GACzCx3B,YAAY8D,GACV0oB,MAAM1oB,GAD+B,KAyDvCqhF,kBAAqBC,GACZ,qCACJA,GAAeA,EAAY3hF,eAC1B,eAACmqC,GAAD,CACEW,iBAAkB,sBAAKtqC,MAAO,CAAExP,OAAQ,OACxC+5C,WAAY,sBAAKvqC,MAAO,CAAExP,OAAS,UACnC6iC,SAAU2V,GAAoBgB,UAAUm3C,EAAY/vF,OAAS+vF,EAAY/vF,MAAMqO,KAAO,CAAExB,IAAKkjF,EAAY/vF,MAAMqO,IAAIxB,IAAKE,IAAKgjF,EAAY/vF,MAAMqO,IAAIvB,MACnJ2V,SAAU,OACVrC,MAAM,OAjEyB,KAuEvC4vE,wBAA2BD,GAEvB,eAAC,GAAD,CACEj6E,OAAQi6E,EAAYnlF,GACpBoL,SAAU+5E,EAAYniF,SAAShN,KAC/BmV,SAAS,QACT4xB,QAASrrC,KAAKmS,MAAMk5B,QACpBvF,QAAS9lC,KAAKmS,MAAM2zB,QACpBc,OAAQ5mC,KAAKmS,MAAMy0B,OACnBpnB,IAAK1J,GAAWpB,GAAOuE,UAAWw6E,EAAYnlF,IAC9C6gD,UAAU,EACVuW,aAAa,uBA/EjB1lE,KAAK2K,MAAQ,CACXL,KAAM,CACJgE,GAAIoG,GAAOuE,UACXnF,OAAQ3B,EAAM7D,GACd+D,KAAMG,GAAKyH,UACXjF,MAAO,MACPwK,IAAKrN,EAAMqN,KAAO9K,GAAO0D,YAE3B60B,kBAAmB,GAIA,0BAAI,IAAD,IAKxB,GAJApS,MAAMqL,0BAEAlmC,KAAK2zF,cAEP,UAAC3zF,KAAK2K,MAAMjH,aAAZ,aAAC,EAAkBqK,KACrB,OAEF,MAAMw4C,QAAcjiB,GAAIxV,wBAAwB,QAA5B,UAAqC9uB,KAAK2K,MAAMjH,aAAhD,aAAqC,EAAkBqK,KAC3E/N,KAAKo7B,SAAS,IAAIp7B,KAAK2K,MAAOsiC,kBAAmBsZ,IAG3B,yBAAClgB,EAA8BC,GAA+B,IAAD,IACnFzL,MAAMuL,mBAAmBC,EAAUC,GAE/BtmC,KAAKmS,MAAM7D,KAAO+3B,EAAS/3B,UACvBtO,KAAK2zF,YAGb,MAAM71C,EAAO,UAAG99C,KAAK2K,MAAMjH,aAAd,aAAG,EAAkBqK,IAClC,GAAI+vC,GAAWA,KAAO,UAAKxX,EAAS5iC,aAAd,aAAK,EAAgBqK,KAAK,CAC9C,MAAMw4C,QAAcjiB,GAAIxV,wBAAwB,QAASgvB,GACzD99C,KAAKo7B,SAAS,IAAIp7B,KAAK2K,MAAOsiC,kBAAmBsZ,KAItC,kBACb,MAAM7iD,QAAc1D,KAAK8lC,QAAQxB,GAAIxP,SAAS90B,KAAKmS,MAAM7D,GAAI,IAAK7I,EAAE,eACpE,OAAOzF,KAAKo7B,SAAS,CACnB13B,QACA4G,KAAM,CACJgE,GAAIoG,GAAOuE,UACXnF,OAAQ9T,KAAKmS,MAAM7D,GACnB+D,KAAMG,GAAKyH,UACXjF,MAAOvP,EAAE,oBACT+Z,IAAKxf,KAAKmS,MAAMqN,KAAO9K,GAAO0D,cAqCpCkzE,aAAamI,GAA2C,IAAD,EACrD,OAAI,UAACzzF,KAAK2K,MAAMjH,aAAZ,aAAC,EAAkBqK,MAGlB0lF,EAGE,CACL,CACEphF,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,sBACT6I,GAAI,MACJ0oC,QAAS,IAAMh3C,KAAKwzF,kBAAkBC,GACtCxuB,aAAc,IAAM,IAEtB,CACE5yD,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,4BACT6I,GAAI,YACJ0oC,QAAS,IAAMh3C,KAAK0zF,wBAAwBD,GAC5CxuB,aAAc,IAAMjlE,KAAK2K,MAAMsiC,kBAAkBloC,aAlB5C,GAwBX0hC,gBACE,MAAM,MAAE/iC,GAAU1D,KAAK2K,MACjB8oF,EAAc/vF,GAAS,IAAIkN,GAAMlN,GACjCE,EAAO0gC,GAAI1gC,KAEjB,OACE,uCACE,gBAAC6mC,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,IAA1B,UACE,eAACoO,GAAA,EAAKvO,OAAN,UACE,uBAAK5pB,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,OAA9C,UACE,sBAAKjzB,MAAO,CAAE8R,SAAU,EAAGw6B,YAAa,IAAxC,SACGl7C,GAAS,qBAAG4O,MAAO,IAAIu1B,GAAW7yB,MAAMozB,SAAUiW,aAAc,WAAvD,UAAmE,oBAAGjsC,UAAWI,GAAKyH,UAAW3H,MAAO,CAAC4R,YAAa,KAAtH,WAA6HuvE,QAA7H,IAA6HA,OAA7H,EAA6HA,EAAaniF,SAAShN,UAE/J,+BACGZ,GAASE,EAAKoL,WAAa,eAACy8E,GAAD,CAAUnhF,KAAMoK,GAAO8C,UAAW5R,MAAOlC,EAAMqK,aAIjF,eAAC08B,GAAA,EAAK7N,KAAN,UACE,sBAAKtqB,MAAO,CAAE+rC,aAAc,OAA5B,SACE,gBAAC3L,GAAA,EAAD,WACE,gBAACN,GAAA,EAAD,CAAKC,GAAI,EAAT,UACE,eAACihD,GAAD,CAAcxvE,MAAOre,EAAE,kBAAvB,SACE,eAAC4tF,GAAD,CAAYntF,OAAQxC,EAAQA,EAAMyN,kBAAoBrB,GAAiBijF,eAEzE,eAACO,GAAD,CAAcxvE,MAAOre,EAAE,cAAewiC,KAAMj2B,GAAiBtO,EAAQA,EAAM6G,KAAO4E,GAAUE,WAC5F,eAACikF,GAAD,CAAcxvE,MAAOre,EAAE,0BAA2BwiC,KAAMvkC,GAASA,EAAMsN,kBAAkBnR,OAAS,EAAI6D,EAAMsN,kBAAkBE,KAAK,MAAQ,WAE7I,eAACkhC,GAAA,EAAD,CAAKC,GAAI,EAAT,SACE,eAACihD,GAAD,CAAcxvE,MAAOre,EAAE,sBAAvB,SACE,+BACGkX,OAAOy+B,OAAOpB,IAAUj9B,KAAInY,GAC3B6uF,IAAW,OAAI/vF,QAAJ,IAAIA,OAAJ,EAAIA,EAAOX,UAAU6B,KAAa,qBAAG0N,MAAO,IAAIu1B,GAAWI,KAAKF,OAAQsW,aAAc,UAApD,UAA+D,eAAC5Q,GAAA,EAAD,CAAO3Q,QAAS,YAAaxqB,MAAO,CAAC4R,YAAa,GAAlD,SAAwD,GAAEtf,OAAqB6uF,EAAYniF,SAAS1M,wBAUhO,eAACy/D,GAAD,CACE/1D,GAAG,kBACHg2D,iBAAiB,MACjBM,SAAS,YACTL,KAAMvkE,KAAKsrF,aAAamI,SC5LnB,SAASG,GAAczhF,GACpC,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,GAAoBx3B,EAApB,IAAwBkR,GAAQrN,GAI/B4qC,EAAWC,GAAgBzzC,mBAAyB,CACzDiwC,iBAAkB1pC,GAAiBI,OACnCmpC,QAAS,KACT9uC,KAAM4E,GAAUK,SAChB8tC,iBAAkB,GAClBv6C,U1LwCK,CACL,GAZK,CACLkL,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAOT,GAbK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAQT,GAdK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAST,GAfK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,K0LlCTkE,YAAa,GACbC,QAAS,GACTx0B,SAAUsyB,GAAoBlP,WAG1B,iBACJoN,EADI,QAEJH,EAFI,KAGJ9uC,EAHI,iBAIJ+yC,EAJI,SAKJt0B,GACE+zB,EAEEr5C,EvJqMD,SAAkBoiC,EAAkBx3B,GACzC,MAAOzK,EAAQsoC,GAAa5iC,qBAU5B,OATA8b,qBAAU,KACH/W,EAKLw3B,EAAQA,QAAQxB,GAAIxP,SAASxmB,GAAKrL,EAAS,UACxC4nB,KAAKshB,GALNA,OAAUxrC,KAMX,CAACmlC,EAASx3B,IACNzK,EuJhNOgwF,CAAS/tD,EAASx3B,GAG1B2+B,EAAoBD,GAA4B,QAAD,OAAUtpC,QAAV,IAAUA,OAAV,EAAUA,EAAOqK,KAItEsX,qBAAU,KACJ3hB,EACFs5C,EAAa,CACXxD,iBAAkB91C,EAAMyN,kBACxBkoC,QAAS31C,EAAM2N,aACf9G,KAAM7G,EAAM6G,KACZ+yC,iBAAkB55C,EAAMsN,kBAAkBE,KAAK,KAC/C8X,SAAUsyB,GAAoBgB,UAAUhsC,GAAS5M,EAAMqO,MACvDhP,UAAWW,EAAMX,W1LWhB,CACL,GAZK,CACLkL,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAOT,GAbK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAQT,GAdK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAST,GAfK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,K0LJLkE,YAAa,GACbC,QAAS,KAGX4sB,MAED,CAAC1mE,IAIJ,MAAMowF,EAAyBnuD,IAC7B9Q,EAAY,CAAE7L,SAAU2c,KAGpB2mC,EAAoB,KACxBf,GAAK,IAKD12C,EAAe1pB,IACfquC,IAAqB1pC,GAAiBI,SACxC/E,EAAOquC,iBAAmB1pC,GAAiBI,QAG7C8sC,EAAargC,OAAOC,OAAO,GAAImgC,EAAW5xC,KAGtC4oF,EAAe/qE,IACnB6L,EAAY,CAAE7L,cAGVohD,EAAY,KAChBptB,EAAa,CACXxD,iBAAkB1pC,GAAiBI,OACnCmpC,QAAS,KACT9uC,KAAM4E,GAAUK,SAChB8tC,iBAAkB,GAClBt0B,SAAUsyB,GAAoBlP,QAC9BrpC,U1L9BG,CACL,GAZK,CACLkL,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAOT,GAbK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAQT,GAdK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,IAST,GAfK,CACLprC,KAAM,GACNkwC,YAAa,GACb5sC,SAAU,GACVE,4BAA6B,GAC7BD,4BAA6B,GAC7B6nC,QAAS,K0LqCPkE,YAAa,GACbC,QAAS,MAIP+tB,EAAO3/B,UACX,MAAMqS,EAAkBrtC,GAAMiB,mBAAmBwnC,GAE3Cz9B,EAA0C,CAC9C7N,IAAKO,EACL/D,OACA8G,aAAcgoC,EACdt2C,UAAWg6C,EAAUh6C,UACrBiO,kBAAmBssC,EAAiBx4C,MAAM,KAC1CqM,kBAAmBqoC,EACnBznC,IAAKrB,GAASsY,EAAS4yB,oBAIzB,GAAsB,eADDtX,GAAItP,cAAcpZ,EAAQtN,EAAK,SAAW,WACpDpI,OAAX,CAKA,GAAIoI,EAAI,CACN,MAAM0lF,EAAcr3E,OAAOC,OAAO,CAAE7O,IAAKO,GAAMsN,SACzC0oB,GAAIzP,YAAYm/D,GAClBxoB,GACFyoB,QACG,CACL,MAAMvwF,QAAc4gC,GAAI1P,YAAYhZ,GAChC4vD,EACFyoB,IAEA5oD,EAAQz5B,KAAM,WAAUlO,EAAMqK,OAGlCirC,uBAAoBhuB,QAAQvlB,EAAE,oCAAoC,CAACwI,KAAM2N,EAAO7Y,UAAUk7C,GAAiBhwC,aAjBzG+qC,uBAAoBhuB,QAAQvlB,EAAE,0CAA0C,CAACwI,KAAM2N,EAAO7Y,UAAUk7C,GAAiBhwC,SAoB/GgmF,EAAU,KACV3lF,EACF+8B,EAAQz5B,KAAK,kBAEbw4D,KAMEp1D,EAAgBvP,EAAR/B,EAAU,4BAAiC,+BAqBnDwwF,EAAgB,IAElB,uCACE,gBAACxhD,GAAA,EAAD,CAAKpgC,MAAO,CAAC+rC,aAAc,IAA3B,UACE,eAACjM,GAAA,EAAD,UACE,eAACyY,GAAD,CACEx4C,KAAMG,GAAKY,KACX4B,MAAOvP,EAAE,wBACT6M,MAAO,CAAC+pB,UAAW,IAHrB,SAIE,eAACygB,GAAD,CAAWC,UAAWA,EAAWC,aAAcA,EAAcc,QAASxvC,QAG1E,eAAC8jC,GAAA,EAAD,UACE,gBAACyY,GAAD,CACEx4C,KAAMG,GAAKyH,UACXjF,MAAOvP,EAAE,4BACT6M,MAAO,CAAC+pB,UAAW,IAHrB,UAKE,eAAC4f,GAAD,CACEW,iBAAkB,sBAAKtqC,MAAO,CAACxP,OAAQ,OACvC+5C,WAAY,sBAAKvqC,MAAO,CAACxP,OAAS,UAClC6iC,SAAU3c,EACVmzB,cAAenzB,EAAS4yB,mBAAqB,CAACrrC,IAAK,GAAIE,IAAK,GAC5D0V,SAAU2tE,EACVhwE,MAAM,KAER,sBAAKxR,MAAO,CAAExP,OAAQ,UACtB,eAACihE,GAAD,CACE91D,KAAK,cACL6V,MAAOre,EAAE,0BACTkgC,SAAU3c,EACV7C,SAAU4tE,YAKlB,eAACl4D,GAAD,UACE,eAACgB,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASotD,EAAnC,SACG7mE,EAAE,8BAOPiuF,EAA0B,IACzBhwF,EAID,eAAC,GAAD,CACE8V,OAAQ,IAAI5I,GAAMlN,GAAO4K,GACzBoL,SAAU,IAAI9I,GAAMlN,GAAO4N,SAAShN,KACpCmV,SAAS,QACT4xB,QAASl5B,EAAMk5B,QACfvF,QAAS3zB,EAAM2zB,QACfc,OAAQz0B,EAAMy0B,OACdpnB,IAAK1J,GAAWpB,GAAO8C,UAAW9T,EAAMqK,KACxCohD,UAAU,EACVuW,aAAa,2BAZT,+BAkBZ,OACE,eAAClgC,GAAD,CACEl3B,GAAIA,EAAKoG,GAAO8C,UAAY9C,GAAO6B,YACnCzC,OAAQxF,EACR+D,KAAMG,GAAKyH,UACXjF,MAAOA,EACPgwB,WAAYv/B,EAAE,2BACd+Z,IAAKA,GAAO1J,GAAWpB,GAAOuE,UAAW3K,GACzCy1B,SAAUvkB,EAAMxK,OAAQrU,EAP1B,SASE,eAAC0jE,GAAD,CACE/1D,GAAG,kBACHg2D,iBAAkB,MAClBC,KAhGG,CACL,CACElyD,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,sBACT6I,GAAI,MACJ0oC,QAAS,IAAMk9C,IACfjvB,aAAc,IAAM,IAEtB,CACE5yD,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,4BACT6I,GAAI,YACJ0oC,QAAS,IAAM08C,IACfzuB,aAAc,IAAMh4B,EAAkBloC,aAoFtC6/D,SAAS,gB,yBC/PV,MAAMuvB,GAAgBhiF,IAC3B,MAAM,QAAE6kC,GAAY7kC,EACdiiF,EAAWnsE,mBAAQ,IAAM0mC,GAAc3X,IAAU,CAACA,IACxD,OAAO,sBAAKiZ,wBAAyBmkC,KCYjCC,GAAkBliF,IACtB,MAAM,WAAEoa,EAAF,aAAc0d,GAAiB93B,EACrC,OACE,uBAAKG,MAAO,CAAEqzB,SAAU,WAAYL,QAAS,gBAA7C,UACE,sBAAK2gB,IAAK15B,EAAW+nE,KAAKC,SAAW9vC,GAAaR,GAAc13B,EAAW+nE,KAAK52B,WAAYxX,IAAI,YAChG,sBAAM5zC,MAAO,CAAEqzB,SAAU,WAAYwtB,KAAM,EAAGkB,MAAO,EAAGE,OAAQ,EAAG3tC,UAAW,UAA9E,SACE,gBAACqlB,GAAA,EAAD,WACE,oBACE9sB,KAAMoN,EAAW+nE,KAAK52B,SACtBtrD,UAAU,mCACVE,MAAO,CAAE4hC,QAAS,UAAWhwB,YAAa,GAC1ClP,MAAOvP,EAAE,gCAAiC8f,OAAO,SAJnD,SAME,oBAAGnT,UAAWI,GAAKgiF,QAErB,yBACEpiF,UAAU,mCACV4C,MAAOvP,EAAE,qCACTyZ,QAAS,IAAM+qB,EAAa1d,GAH9B,SAKE,oBAAGna,UAAWI,GAAKiiF,kBAYzBC,GAAgBviF,IAA8B,IAAD,IACjD,MAAM,SAAEwiF,EAAF,uBAAYC,GAA2BziF,EACvCq4E,GAAc,UAACmK,EAASE,0BAAV,QAAgC,IAAI93E,KAAIwP,GAC1D,eAAC8nE,GAAD,CAEE9nE,WAAYA,EACZ0d,aAAc1d,GAAcqoE,EAAuBD,EAAUpoE,IAFxDA,EAAWxe,OAIpB,OACE,gBAAC08B,GAAA,EAAD,CAAMr4B,UAAWqO,KAAOq0E,KAAxB,UACE,gBAACrqD,GAAA,EAAKvO,OAAN,CAAa9pB,UAAWqO,KAAOzL,MAA/B,UACE,uBAAM5C,UAAWqO,KAAOxS,KAAxB,SAA+B0mF,EAAS1mF,OAD1C,KACwD,oBAAGkR,KAAM,UAAYw1E,EAASzmF,MAA9B,SAAsCymF,EAASzmF,QADvG,UACwH,eAAC0T,GAAD,CAAUtX,KAAMoK,GAAOsE,WAAYpT,MAAO+uF,EAASpjE,UAAnD,mBAA+DojE,EAASI,0BAAxE,QAA8F,MADtN,KACwOxvF,IAAOovF,EAASxH,WAAWr/C,OAAO,oBAD1Q,OAGA,eAACrD,GAAA,EAAK7N,KAAN,UACE,eAACu3D,GAAD,CAAcn9C,QAAS29C,EAASvmF,gBAEjCumF,EAASE,oBAAsBF,EAASE,mBAAmBh1F,OAAS,GACnE,eAAC4qC,GAAA,EAAKiyB,OAAN,UACG8tB,QAqBI,MAAMvyE,WAA2B4tB,GAG9Cx3B,YAAY8D,GACV0oB,MAAM1oB,GADoC,KAF5C6iF,oBAE4C,OA8B5CxR,KAAO,KACL,MAAM,OAAExkE,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkBxmB,KAAK2K,MAC9D,OAAO3K,KAAK8lC,QAAQxB,GAAInM,mBACtBnZ,EAtCW,GAuCXorB,EAvCW,GAyCX,CAAC,CAACpqC,KAAKmrC,cAAc5kB,GAAaC,IAClC,CAAC0lE,GAA0B+I,WAAY/I,GAA0BgJ,cAChE,YACArqE,MAAKogD,IACJjrE,KAAKo7B,SAAS,CACZpX,MAAOinD,EAAQjnD,MACfxC,MAAOypD,EAAQvqE,WA1CqB,KA+C5Cy0F,mBAAsB7qF,IACpBtK,KAAKo7B,SAAS,CAAEgP,UAAW9/B,GAAQtK,KAAKwjF,OAhDE,KAmD5C4R,2BAA6BxpD,MAAO+oD,EAA2BpoE,OAhD7DvsB,KAAK2K,MAAQ,CACXL,KAAM,CACJgE,GAAIoG,GAAOuD,mBACX5F,KAAMG,GAAK6iF,SACXrgF,MAAOvP,EAAE,8BAGXuZ,OAAQ,GACRorB,UAAW,EACX7jB,WAAY,YACZC,cAAenC,GAAc0D,KAE7B/D,MAAO,EACPxC,MAAO,IAIX0kB,oBACErL,MAAMqL,oBAENlmC,KAAKwjF,OAGPr4C,cAAcl9B,GACZ,OAAOA,EA4BTw4B,gBACE,MAAM,UAAE2D,EAAF,MAAa5oB,EAAb,MAAoBwC,GAAUhkB,KAAK2K,MACnC2qF,EAAY9zE,EAAMzE,KAAIyD,GAC1B,eAACk0E,GAAD,CAEEC,SAAUn0E,EACVo0E,uBAAwB50F,KAAKo1F,4BAFxB50E,EAAKzS,OAKd,OAAO,uCACL,sBAAKuE,MAAO,CAAE+pB,UAAW,IAAzB,SACGi5D,IAEH,eAAC,GAAD,CACEhrF,KAAM8/B,EACN1nB,SA3ES,GA4ETG,WAAYrB,EAAM3hB,OAClB4iB,WAAYuB,EACZ9B,eAAgBliB,KAAKm1F,mBACrBnyF,KAAK,uBCtIN,MAAMuyF,WAAsB76D,GAKjCrsB,YAAY8D,GACV0oB,MAAM1oB,GAD+B,KAJvCkuC,iBAIuC,OAHvCm1C,qBAGuC,OAFvCjf,oBAEuC,OAsCvCkf,sBAAyBlnF,IACvBvO,KAAKo7B,SAAS,CACZ7sB,WACAmnF,mBAAe/0F,KAzCoB,KA6CvCg1F,kBAAqBtsF,IACnBrJ,KAAKo7B,SAAS,CACZ7wB,KAAMlB,EACNi/D,eAAW3nE,KAhDwB,KAoDvCi1F,sBAAyBvsF,IACvBrJ,KAAKo7B,SAAS,CACZx2B,SAAUyE,EACVwsF,mBAAel1F,KAvDoB,KA2DvCm1F,qBAAwBzsF,IACtBrJ,KAAKo7B,SAAS,CACZztB,QAAStE,EACT0sF,kBAAcp1F,KA9DqB,KAkEvCq1F,kBAAqB/nF,IACnBjO,KAAKo7B,SAAS,CACZntB,OACA+5D,eAAWrnE,KArEwB,KAyEvCs1F,mBAAsB/nF,IACpBlO,KAAKo7B,SAAS,CACZltB,QACA0+E,gBAAYjsF,KA5EuB,KAgFvCu1F,mBAAsB/nF,IACpBnO,KAAKo7B,SAAS,CACZjtB,QACAgoF,gBAAYx1F,KAnFuB,KAuFvCy1F,yBAA4BhoF,IAC1BpO,KAAKo7B,SAAS,CACZhtB,cACAi7D,sBAAkB1oE,KA1FiB,KA8FvC2rE,kBAAoB,KAClB,MAAM,KAAE1oE,GAAS5D,KAAKmS,OAChB,KACJ5H,EADI,QAEJoD,EAFI,SAGJY,EAHI,KAIJN,EAJI,MAKJC,EALI,MAMJC,EANI,YAOJC,EAPI,SAQJxJ,GACE5E,KAAK2K,MAEHjK,EAAuC,CAC3CqN,IAAKnK,EAAOA,EAAKmK,SAAMpN,EACvB4J,OACAoD,UACAK,QAASO,EACTN,OACAC,QACAC,QACAC,cACAxJ,YAGF0/B,GAAI9L,aAAa93B,EAAMkD,EAAO,SAAW,UAAUinB,MAAKhnB,IACtD,GAAsB,OAAlBA,EAAOqC,OAET,YADAlG,KAAK2rB,QAAQjrB,GAIf,MAAMmuC,EAAShrC,EAAOnD,MAAQ,GAC9BV,KAAKo7B,SAAS,CACZktC,UAAWt/D,EAAoB6lC,EAAOtkC,MACtCwrF,aAAc/sF,EAAoB6lC,EAAOlhC,SACzC+nF,cAAe1sF,EAAoB6lC,EAAO7gC,SAC1Cg6D,UAAWh/D,EAAoB6lC,EAAO5gC,MACtC2+E,WAAY5jF,EAAoB6lC,EAAO3gC,OACvCioF,WAAYntF,EAAoB6lC,EAAO1gC,OACvCk7D,iBAAkBrgE,EAAoB6lC,EAAOzgC,aAC7CynF,cAAe7sF,EAAoB6lC,EAAOjqC,gBAnI9C5E,KAAKqgD,YAAct0C,EAAcgR,KAAIg0C,IAAC,CAAO1nD,MAAO0nD,EAAE,GAAI/7C,MAAOvP,EAAEsrD,EAAE,QAErE/wD,KAAKw1F,gBAAkB,CACrB,CAAEnsF,MAAO,KAAM2L,MAAOvP,EAAE,gBACxB,CAAE4D,MAAO,KAAM2L,MAAOvP,EAAE,gBACxB,CAAE4D,MAAO,KAAM2L,MAAOvP,EAAE,gBACxB,CAAE4D,MAAO,KAAM2L,MAAOvP,EAAE,iBAG1BzF,KAAKu2E,eAAiBlpE,GAAa0P,KAAIhU,IAAC,CAAOM,MAAON,EAAE,GAAIiM,MAAOvP,EAAEsD,EAAE,QAEvE,IAAInF,EAAoBuO,EAAMvO,MAAQ,CACpC2G,KAAMuB,EAASI,OACfyB,QAASjB,EAAQE,IACjBoB,QAAS,GACTC,KAAM,GACNC,MAAO,GACPC,MAAO,GACPC,YAAa,GACbxJ,SAAU,MAEZ5E,KAAK2K,MAAQ,CACXowB,SAAS,EAETxsB,SAAU3K,EAAKoK,QACfzD,KAAM3G,EAAK2G,KACX3F,SAAUhB,EAAKgB,SACf+I,QAAS/J,EAAK+J,QACdM,KAAMrK,EAAKqK,KACXC,MAAOtK,EAAKsK,MACZC,MAAOvK,EAAKuK,MACZC,YAAaxK,EAAKwK,aAyGtBktB,cACE,MAAM,KAAE13B,GAAS5D,KAAKmS,OAChB,SACJ5D,EADI,cAEJmnF,EAFI,KAGJnrF,EAHI,UAIJ+9D,EAJI,SAKJ1jE,EALI,cAMJixF,EANI,QAOJloF,EAPI,aAQJooF,EARI,KASJ9nF,EATI,UAUJ+5D,EAVI,MAWJ95D,EAXI,WAYJ0+E,EAZI,MAaJz+E,EAbI,WAcJgoF,EAdI,YAeJ/nF,EAfI,iBAgBJi7D,GACErpE,KAAK2K,MAET,OAAO,uCACL,eAACsxB,GAAD,UACUx2B,EAAP7B,EAAS,uBAA4B,4BAExC,eAAC,KAAMg5B,KAAP,UACE,gBAAC3W,GAAA,EAAD,WACE,eAACgvB,GAAD,CACEhnC,KAAK,WACL6V,MAAOre,EAAE,uBACT4D,MAAOkF,EACP4X,SAAUnmB,KAAKy1F,sBACf3sF,MAAO4sF,IAET,eAAChhD,GAAD,CACEzmC,KAAK,OACL6V,MAAOre,EAAE,mBACT4D,MAAOkB,EACP4b,SAAUnmB,KAAK21F,kBACfh3E,QAAS3e,KAAKqgD,YACdv3C,MAAOw/D,IAET,eAAC5zB,GAAD,CACEzmC,KAAK,WACL6V,MAAOre,EAAE,uBACT4D,MAAOzE,EACPuhB,SAAUnmB,KAAK41F,sBACfj3E,QAAS3e,KAAKw1F,gBACd1sF,MAAO+sF,IAET,eAACnhD,GAAD,CACEzmC,KAAK,UACL6V,MAAOre,EAAE,sBACT4D,MAAOsE,EACPwY,SAAUnmB,KAAK81F,qBACfn3E,QAAS3e,KAAKu2E,eACdztE,MAAOitF,IAET,eAAC9gD,GAAD,CACEhnC,KAAK,OACL6V,MAAOre,EAAE,mBACT4D,MAAO4E,EACPkY,SAAUnmB,KAAKg2F,kBACfltF,MAAOk/D,IAET,eAAC/yB,GAAD,CACEhnC,KAAK,QACL6V,MAAOre,EAAE,oBACT4D,MAAO6E,EACPiY,SAAUnmB,KAAKi2F,mBACfntF,MAAO8jF,IAET,eAAC33C,GAAD,CACEhnC,KAAK,QACL6V,MAAOre,EAAE,oBACT4D,MAAO8E,EACPgY,SAAUnmB,KAAKk2F,mBACfptF,MAAOqtF,IAET,eAAChhD,GAAD,CACElnC,KAAK,cACL6V,MAAOre,EAAE,0BACT4D,MAAO+E,EACP+X,SAAUnmB,KAAKo2F,yBACfttF,MAAOugE,SAIb,gBAACttC,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASlf,KAAKg7B,WAA1C,SACGv1B,EAAE,2BAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASlf,KAAKssE,kBAAxC,SACG7mE,EAAE,gCC/Pb,SAAS4wF,GACP3lC,EACAjF,EACA6qC,GAEA,MAAO,CACL,IAAI31E,GAAuB,UAAWlb,EAAE,iBAAkB,CAAEnG,MAAO,MACnE,IAAI2gB,GAAkB,OAAQxa,EAAE,cAAc7B,IAAQ2yF,O/LM1BhsF,E+LN0C3G,EAAK2G,K/LOtE9E,GAAG+G,EAAa1L,MAAKiwD,GAAKA,EAAE,KAAOxmD,KAASiC,EAAa,IAAI,IAD/D,IAAyBjC,K+LL5B,IAAIoW,GAAuB,OAAQlb,EAAE,cACrC,IAAIkb,GAAuB,QAASlb,EAAE,eACtC,IAAIkb,GAAuB,QAASlb,EAAE,cAAe,CAAEnG,MAAO,MAC9D,IAAI2gB,GAAkB,SAAUxa,EAAE,gBAAgB7B,GAAQA,EAAKioC,UAAYpmC,EAAE,uBAAyBA,EAAE,yBACxG,IAAI8b,GAAmB,UAAW9b,EAAE,yBAAyB7B,IAC3D,MAAMC,EAA4C,CAChD,CAAEwO,KAAMG,GAAKu5B,KAAM7sB,QAASwxC,GAC5B,CAAEr+C,KAAMG,GAAK42B,YAAalqB,QAASusC,EAAiBn5C,MAAO4O,GAAoB8qB,SASjF,OAPKpoC,EAAKioC,WACRhoC,EAAO+9C,OAAO,EAAG,EAAG,CAClBvvC,KAAMG,GAAKgkF,QACXt3E,QAASo3E,EACT12F,QAAS6F,EAAE,iCAGR5B,IACN,CAAEvE,MAAO,OAKT,MAAMkoB,GAAUhH,GAAgBA,EAAKzS,IAI5BoE,WACd,MAAM,QAAE2zB,EAAF,IAAWtmB,GAAQrN,EAEnBy0B,EAASkE,MAERQ,EAAWC,GAAmB7gC,EAAa,UAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkB8kB,GAElD9pB,EAAOgqB,GAAYjiC,qBACpBkiC,EAAU3hC,GAAW,KACzBg8B,EAAQA,QAAQxB,GAAI5L,SAClB1Z,EAbW,GAcXorB,EAdW,GAgBX,CAAC,CAAC7jB,EAAYC,KACbtjB,EAAO,SACP2nB,KAAK2gB,MAEVnmB,oBAAUomB,EAAS,CAAC3F,EAAS9mB,EAAQorB,EAAW7jB,EAAYC,IAE5D,MAQMF,EAAiC2B,mBAAQ,IAmCtCouE,IA5BoBzyF,IACzBgjC,EAAOrL,MACLppB,GAAS,eAAC,GAAD,CAAevO,KAAMA,KAAUuO,MACxC0Y,MAAK4rE,IACL,IAAIC,EAAQ/5E,OAAOC,OAAO65E,EAAY,CAAE1oF,IAAKnK,EAAKmK,MAClDu2B,GAAIhM,WAAWo+D,GAAO7rE,KAAK4gB,SAIF7nC,IAC3BgjC,EAAOrL,MAAcppB,GACnB,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,0BACT6lB,QAAS7lB,EAAE,2BAA4B,CAAEwI,KAAMrK,EAAKqK,OACpDsuB,QAAS92B,EAAE,sBACXi3B,WAAYj3B,EAAE,yBACdg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,YACRrqB,MAEL0Y,MAAKghB,IACDA,GAGLvH,GAAI7L,WAAW70B,EAAKmK,KAAK8c,KAAK4gB,SA9BK7nC,IACrC0gC,GAAInX,yBAAyBvpB,EAAKmK,KAAK8c,MAAK,KAC1CmuB,uBAAoBhuB,QAAQvlB,EAAE,iCAqCjC,CAACmhC,EAAQ6E,IAEZ,OACE,eAAC5B,GAAD,CACEv7B,GAAIoG,GAAO4D,UACXjG,KAAMG,GAAKmgC,MACX39B,MAAOvP,EAAE,oBACT+Z,IAAKA,EACLxc,KAAK,OACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPvB,YAAawB,EACb/jB,OAAQA,GACRyiB,aA9DqB2B,UACvB,MAAMhoC,QAAagjC,EAAOrL,MACxBppB,GAAS,eAAC,GAAD,CAAevO,UAAMjD,KAAewR,YAEzCmyB,GAAIjM,WAAWz0B,GACrB6nC,QC5EG,IAAKkrD,I,SAAAA,K,4CAAAA,Q,KC6BG,MAAMC,WAAyBl8D,GAG5CrsB,YAAY8D,GACV0oB,MAAM1oB,GADkC,KAF1CkuC,iBAE0C,OAsC1Cw2C,mBAAsB7hF,IACpBhV,KAAKo7B,SAAS,CACZpmB,QACAy1C,gBAAY9pD,KAzC0B,KA6C1Cg1F,kBAAqBtsF,IACnBrJ,KAAKo7B,SAAS,CACZ7wB,KAAMlB,EACNi/D,eAAW3nE,KAhD2B,KAoD1Cm2F,sBAAyBvhD,IACvBv1C,KAAKo7B,SAAS,CAAE5H,SAAU+hB,EAAMwhD,mBAAep2F,KArDP,KAwD1Cq2F,oBAAuBzhD,IACrBv1C,KAAKo7B,SAAS,CAAE3H,OAAQ8hB,EAAM0hD,iBAAat2F,KAzDH,KA4D1Cy1F,yBAA4BhoF,IAC1BpO,KAAKo7B,SAAS,CACZhtB,cACAi7D,sBAAkB1oE,KA/DoB,KAmE1C2rE,kBAAoB,KAClB,MAAM,QAAE3oE,GAAY3D,KAAKmS,OACnB,MACJ6C,EADI,KAEJzK,EAFI,SAGJipB,EAHI,OAIJC,EAJI,YAKJrlB,GACEpO,KAAK2K,MAEHjK,EAA0C,CAC9CqN,IAAKpK,EAAUA,EAAQoK,SAAMpN,EAC7BqU,QACAzK,OACA2sF,QAAS1jE,EAAS1Y,IAAMuH,SAASmR,EAAS1Y,KAAO,KACjDq8E,UAAW3jE,EAASzY,MAAQsH,SAASmR,EAASzY,OAAS,KACvDq8E,SAAU5jE,EAASxY,KAAOqH,SAASmR,EAASxY,MAAQ,KACpDq8E,MAAO5jE,EAAO3Y,IAAMuH,SAASoR,EAAO3Y,KAAO,KAC3Cw8E,QAAS7jE,EAAO1Y,MAAQsH,SAASoR,EAAO1Y,OAAS,KACjDw8E,OAAQ9jE,EAAOzY,KAAOqH,SAASoR,EAAOzY,MAAQ,KAC9C5M,eAEFk2B,GAAIrO,gBAAgBv1B,EAAMiD,EAAU,SAAW,UAAUknB,MAAKhnB,IAC5D,GAAsB,OAAlBA,EAAOqC,OAET,YADAlG,KAAK2rB,QAAQjrB,GAIf,MAAMmuC,EAAShrC,EAAOnD,MAAQ,GAC9BV,KAAKo7B,SAAS,CACZqvB,WAAYzhD,EAAoB6lC,EAAO75B,OACvCszD,UAAWt/D,EAAoB6lC,EAAOtkC,MACtCwsF,cAAe/tF,EAAoB6lC,EAAOqoD,SAC1CD,YAAajuF,EAAoB6lC,EAAOwoD,OACxChuB,iBAAkBrgE,EAAoB6lC,EAAOzgC,mBAlGjD,MAAMzK,EAAUwO,EAAMxO,SAAW,CAC/BqR,MAAO,GACPzK,KAAMosF,GAAYa,oBAClBN,QAAS,KACTC,UAAW,KACXC,SAAU,KACVC,MAAO,KACPC,QAAS,KACTC,OAAQ,KACRnpF,YAAa,IAGfpO,KAAKqgD,YAAc,CACjB,CAAEh3C,MAAOstF,GAAYa,oBAAqBxiF,MAAOvP,EAAE,qCAGrDzF,KAAK2K,MAAQ,CACXowB,SAAS,EAET/lB,MAAOrR,EAAQqR,MACfzK,KAAM5G,EAAQ4G,KACdipB,SAAU,CACR1Y,IAAyB,OAApBnX,EAAQuzF,QAAmB,GAAKvzF,EAAQuzF,QAAQnyF,WACrDgW,MAA6B,OAAtBpX,EAAQwzF,UAAqB,GAAKxzF,EAAQwzF,UAAUpyF,WAC3DiW,KAA2B,OAArBrX,EAAQyzF,SAAoB,GAAKzzF,EAAQyzF,SAASryF,YAE1D0uB,OAAQ,CACN3Y,IAAuB,OAAlBnX,EAAQ0zF,MAAiB,GAAK1zF,EAAQ0zF,MAAMtyF,WACjDgW,MAA2B,OAApBpX,EAAQ2zF,QAAmB,GAAK3zF,EAAQ2zF,QAAQvyF,WACvDiW,KAAyB,OAAnBrX,EAAQ4zF,OAAkB,GAAK5zF,EAAQ4zF,OAAOxyF,YAEtDqJ,YAAazK,EAAQyK,aAwEzBktB,cACE,MAAM,QAAE33B,GAAY3D,KAAKmS,OACnB,MACJ6C,EADI,WAEJy1C,EAFI,KAGJlgD,EAHI,UAIJ+9D,EAJI,SAKJ90C,EALI,cAMJujE,EANI,OAOJtjE,EAPI,YAQJwjE,EARI,YASJ7oF,EATI,iBAUJi7D,GACErpE,KAAK2K,MAET,OAAO,uCACL,eAACsxB,GAAD,UACGx2B,EAAE9B,EAAU,8BAAgC,mCAE/C,eAAC,KAAMi5B,KAAP,UACE,gBAAC3W,GAAA,EAAD,WACE,eAACgvB,GAAD,CACEhnC,KAAK,QACL6V,MAAOre,EAAE,2BACT4D,MAAO2L,EACPmR,SAAUnmB,KAAK62F,mBACf/tF,MAAO2hD,IAET,eAAC/V,GAAD,CACEzmC,KAAK,OACL6V,MAAOre,EAAE,0BACT4D,MAAOkB,EACP4b,SAAUnmB,KAAK21F,kBACf7sF,MAAOw/D,EACP3pD,QAAS3e,KAAKqgD,cAEhB,eAACrK,GAAD,CACE/nC,KAAK,YACL6V,MAAOre,EAAE,8BACT4D,MAAOmqB,EACPrN,SAAUnmB,KAAK82F,sBACfhuF,MAAOiuF,IAET,eAAC/gD,GAAD,CACE/nC,KAAK,UACL6V,MAAOre,EAAE,4BACT4D,MAAOoqB,EACPtN,SAAUnmB,KAAKg3F,oBACfluF,MAAOmuF,IAET,eAAC9hD,GAAD,CACElnC,KAAK,cACL6V,MAAOre,EAAE,iCACT4D,MAAO+E,EACP+X,SAAUnmB,KAAKo2F,yBACfttF,MAAOugE,SAIb,gBAACttC,GAAD,WACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,YAAY5d,QAASlf,KAAKg7B,WAA1C,SACGv1B,EAAE,2BAEL,gBAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASlf,KAAKssE,kBAAxC,UACG7mE,EAAE,uBAAwB,cCzLrC,MAAM+hB,GAAUhH,GAAmBA,EAAKzS,IAGzB,SAASsK,GAAalG,GACnC,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,OAAoBc,EAApB,IAA4BpnB,GAAQrN,GAEnCm5B,EAAWC,GAAmB7gC,EAAa,aAC5C,OAAEsU,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkB8kB,GAElD9pB,EAAOgqB,GAAYjiC,qBACpBkiC,EAAU3hC,GAAW,KACzBg8B,EAAQA,QAAQxB,GAAInO,aAClBnX,EAXW,GAYXorB,EAZW,GAcX,CAAC,CAAC7jB,EAAYC,KACbtjB,EAAO,YACP2nB,KAAK2gB,MAEVnmB,oBAAUomB,EAAS,CAACzsB,EAAQorB,EAAW7jB,EAAYC,IAEnD,MAUMF,EAAoC2B,mBACxC,KACE,MAAMwvE,EAAqB9zF,IACzBijC,EAAOrL,MAAqBppB,GAC1B,eAAC,GAAD,CAAkBxO,QAASA,KAAawO,MACvC0Y,MAAKnqB,IACN,MAAM+qB,EAAU9O,OAAOC,OAAOlc,EAAM,CAAEqN,IAAKpK,EAAQoK,MACnDu2B,GAAIvO,cAActK,GAASZ,KAAK4gB,OAI9BE,EAAsBC,UAC1B,MAAMC,QAAkBjF,EAAOrL,MAAcppB,GAC3C,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,6BACT6lB,QAAS7lB,EAAE,8BAA+B,CAAEuP,MAAOrR,EAAQqR,QAC3DunB,QAAS92B,EAAE,sBACXi3B,WAAYj3B,EAAE,yBACdg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,YACRrqB,MAGH05B,UAGCvH,GAAIpO,cAAcvyB,EAAQoK,KAChC09B,MAGF,MAAO,CACL,IAAI9qB,GAAuB,QAASlb,EAAE,kBACtC,IAAI8b,GAAmB,UAAW9b,EAAE,oBAAoB9B,GAAW,CACjE,CAAE0O,KAAMG,GAAKu5B,KAAM7sB,QAASu4E,GAC5B,CAAEplF,KAAMG,GAAK42B,YAAalqB,QAASysB,EAAqBr5B,MAAO4O,GAAoB8qB,cAIzF,CAACpF,EAAQ6E,IAGX,OACE,eAAC5B,GAAD,CACEv7B,GAAIoG,GAAO2D,aACXhG,KAAMG,GAAKk0E,MACX1xE,MAAOvP,EAAE,uBACT+Z,IAAKA,EACLxc,KAAK,UACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPvB,YAAawB,EACb/jB,OAAQA,GACRwiB,aAzDsBrmC,IACxB0nC,EAAQz5B,KAAK,aAAejO,EAAQoK,MAyDlCk8B,aAhEqB,KACvBrD,EAAOrL,MAAqBppB,GAAS,eAAC,GAAD,IAAsBA,MACxD0Y,MAAKnqB,GAAQ4jC,GAAIxO,cAAcp1B,KAC/BmqB,KAAK4gB,MCjBIt5B,WACd,MAAM,QAAEk5B,EAAF,QAAWvF,EAAX,GAAoBx3B,EAApB,IAAwBkR,GAAQrN,EAEhCy0B,EAASkE,MACRtpB,EAAOgqB,GAAYjiC,sBACnB+hC,EAAWC,GAAmB7gC,EAAa,WAC5C/G,E/JiSD,SAAoBmiC,EAAkBx3B,GAC3C,MAAOzK,EAAQsoC,GAAa5iC,qBAK5B,OAJA8b,qBACE,KAAQygB,EAAQA,QAAQxB,GAAItO,WAAW1nB,GAAK,WAAWuc,KAAKshB,KAC5D,CAACrG,EAASx3B,IAELzK,E+JvSS6zF,CAAW5xD,EAASx3B,IAC9B,OAAE0Q,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkB8kB,EAEnDG,EAAUthC,uBAAY,KAC1B27B,EAAQA,QACNxB,GAAIxQ,YACF,CAAE,8BAA+BxlB,GACjC0Q,EAdS,GAeTorB,EAfS,GAiBT,CAAC,CAAC7jB,EAAYC,KAEhBtjB,EAAO,WACP2nB,MAAK9hB,GAAKyiC,EAAS,CACnBxnB,MAAOjb,EAAEib,MACTtjB,KAAMqI,EAAErI,KAAKqc,KAAIyqD,GAAK,IAAIxtD,GAAOwtD,WAElC,CAAC1hC,EAAS9mB,EAAQorB,EAAW7jB,EAAYC,EAAelY,IAC3D+W,oBAAUomB,EAAS,CAACA,IAEpB,MAIMnlB,EAAkC2B,mBACtC,IAqBSktD,IAdsB7xE,IAC3BsjC,EAAOrL,MAAKppB,GACV,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,4BACT6lB,QAAS7lB,EAAE,6BAA8B,CAAEwI,KAAM3K,EAAO2K,OACxDsuB,QAAS92B,EAAE,sBACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAEL0Y,MAAKghB,GAAaA,GAjBSD,iBACxBtH,GAAIzQ,aAAavwB,EAAOgL,IAC9Bm9B,IACAuN,uBAAoBhuB,QAAQvlB,EAAE,6BAA8B,CAAEwI,KAAM3K,EAAO2K,SAczC0pF,CAAwBr0F,SAK9D,CAACsjC,EAAQ6E,IAGX,OACE,eAAC5B,GAAD,CACEv7B,GAAIoG,GAAOwE,YACXpF,OAAQxF,EACR+D,KAAMG,GAAK4H,KACXpF,MAAOvP,EAAE,yBAA0B,CAAEwI,KAAMtK,EAAUA,EAAQqR,MAAQ,QACrEwK,IAAKA,GAAO9K,GAAO2D,aACnBrV,KAAK,UACLsjB,QAASA,EACT9E,MAAOA,EACP7W,MAAO2gC,EACPvB,YAAawB,EACb/jB,OAAQA,GACRwiB,aA5CsB1mC,IACxB+nC,EAAQz5B,KAAKiE,GAAYnB,GAAOsE,WAAY1V,EAAOgL,IAAM,QAAUwH,GAAWpB,GAAOwE,YAAa5K,QCnD/F,SAASspF,GAAmBriD,GACjC,GAAa,KAATA,EACF,MAAO,GAET,MAAMv6B,EAAOu6B,EAAKG,UAAU,EAAG,GACzB36B,EAAQw6B,EAAKG,UAAU,EAAG,GAC1B56B,EAAMy6B,EAAKG,UAAU,EAAG,GAC9B,MAAQ,GAAU,OAAR56B,EAAe,IAAMA,KAAiB,OAAVC,EAAiB,IAAMA,KAAkB,SAATC,EAAkB,IAAMA,IC8DzF,SAAS68E,GAA6Bn2F,GAC3C,OAAQA,EAAM6I,MACZ,IAAK,YACH,OAAO9E,EAAE,yCACX,IAAK,WACH,OAAOA,EAAE,wCACX,IAAK,QACH,OAAO8N,GAAyB7R,EAAMo2F,YACxC,QACE,MAAO,IASN,MAAMC,GAA2B5lF,IACtC,MAAM,MAAEzQ,EAAF,cAASgvD,EAAT,gBAAwBjF,GAAoBt5C,EAC5CoH,EAAsB,IApEvB,SAAoC7X,GACzC,MAAMmC,EAA0B,GAehC,GAdInC,EAAMs2F,WAAiC,aAApBt2F,EAAMs2F,WAC3Bn0F,EAAO+N,KAAK,CACVlM,IAAK,OACLsP,MAAOvP,EAAE,kCACT4D,MAAOuuF,GAAmBl2F,EAAMs2F,aAGhCt2F,EAAMu2F,SAA6B,aAAlBv2F,EAAMu2F,SACzBp0F,EAAO+N,KAAK,CACVlM,IAAK,KACLsP,MAAOvP,EAAE,gCACT4D,MAAOuuF,GAAmBl2F,EAAMu2F,WAGjB,aAAfv2F,EAAM6I,MAAsC,cAAf7I,EAAM6I,KAAsB,CAC3D,MAAMuJ,EAASpS,EAAMoS,OACjBA,GACFjQ,EAAO+N,KAAK,CACVlM,IAAK,SACLsP,MAAOjC,GAA0Be,EAAOvJ,MAAQ,IAChDlB,MACE,eAACuY,GAAD,CAAUtX,KAAMoK,GAAOqE,mBAAoBnT,MAAOkO,EAAO/F,IAAzD,SACG,IAAI8F,GAAeC,GAAQ7F,SAMtC,GAAmB,UAAfvM,EAAM6I,KAAkB,CAC1B,MAAM7G,EAAQhC,EAAMgC,MAChBA,GACFG,EAAO+N,KAAK,CACVlM,IAAK,QACLsP,MAAOvP,EAAE,mCACT4D,MAAO,eAAC05D,GAAD,CAAWr/D,MAAOA,MAGzBhC,EAAMuxE,MACRpvE,EAAO+N,KAAK,CAAElM,IAAK,OAAQsP,MAAOvP,EAAE,kCAAmC4D,MAAO3H,EAAMuxE,OAKxF,OAHIvxE,EAAM0M,aACRvK,EAAO+N,KAAK,CAAElM,IAAK,cAAesP,MAAOvP,EAAE,yCAA0C4D,MAAO3H,EAAM0M,cAE7FvK,GAwBPq0F,CAA2Bx2F,GAAO6c,SAAQ0N,IACxC1S,EAAK3H,KAAK,qBAA8BQ,UAAU,WAAxC,SAAoD6Z,EAAMjX,OAAjDiX,EAAMvmB,IAAM,UAC/B6T,EAAK3H,KAAK,qBAA8BQ,UAAU,WAAxC,SAAoD6Z,EAAM5iB,OAAjD4iB,EAAMvmB,IAAM,aAGjC,MAEMoO,EAAUpS,EAAwCoS,OAClDqkF,EAAarkF,GACdA,EAAOu3B,SACPv3B,EAAOu3B,QAAQtuB,KAAI,CAACrb,EAAOuJ,IAC5B,eAAC8sF,GAAD,CAEEr2F,MAAOA,EACPgvD,cAAeA,GAAa,KAAWA,EAAchvD,IACrD+pD,gBAAiBA,GAAe,KAAWA,EAAgB/pD,KAHtDuJ,KAOX,OAAO,uCACL,uBAAKmH,UAAWgmF,KAAY12F,MAA5B,UACE,sBAAK0Q,UAAWgmF,KAAYzS,iBAA5B,SACE,sBAAKvzE,UAAWgmF,KAAYxS,UAA5B,SACE,oBAAGxzE,UAAWa,GAA2BvR,EAAM6I,YAGnD,sBAAK6H,UAAWgmF,KAAYvS,UAA5B,SACE,eAACp7C,GAAA,EAAD,CAAMn4B,MAAO,CAAE+rC,aAAc,GAA7B,SACE,gBAAC5T,GAAA,EAAK7N,KAAN,WACE,uBAAKtqB,MAAO,CAAEgiC,MAAO,SAArB,UACIoc,GACA,eAAC7zB,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QA1BX,IAAMwxC,GAAiBA,EAAchvD,GA0BjD,SACE,oBAAG0Q,UAAWI,GAAKu5B,SAGrB0f,GACA,eAAC5uB,GAAA,EAAD,CAAQC,QAAQ,OAAO5d,QA9BT,IAAMusC,GAAmBA,EAAgB/pD,GA8BvD,SACE,oBAAG0Q,UAAWI,GAAK42B,mBAIzB,gCAAK/1B,GAA+B3R,EAAM6I,MAA1C,SAA0D,6BAAIstF,GAA6Bn2F,QAC3F,qBAAI0Q,UAAU,MAAd,SACGmH,cAMX,sBAAKjH,MAAO,CAAE2R,WAAY,OAA1B,SAAmCk0E,QCzHjC3wE,GAAUhH,GAAiBA,EAAKlS,GAStB6D,WAAgC,IAAD,EAI7C,MAAOm5B,EAAWC,GAAmB7gC,EAAa,0BAC3C8W,EAAOgqB,GAAYjiC,qBACpB+V,EAAc3V,GAAegB,GAASA,EAAM4U,mBAI5C,QAAE8rB,EAAF,QAAWvF,EAAX,OAAoBhyB,GAAW3B,GAC/B,OAAE6M,EAAF,UAAUorB,EAAV,WAAqB7jB,EAArB,cAAiCC,GAAkB8kB,EA2BnDG,EAAU3hC,GAAW,KAvBP,EAAC+iB,EAAcC,KACjC,MAAM,OAAE9N,EAAF,WAAUuH,EAAV,cAAsBC,GAAkB8kB,EAC9C,OAAIx3B,GAAWA,EAAOvJ,OAASkI,GAAmBK,MAAQgB,EAAOvJ,OAASkI,GAAmBI,SAgBtF6Y,QAAQC,aAAQhrB,GAfdmlC,EAAQA,QAAQxB,GAAItR,0BACzBlf,EAAOtF,KACPsF,EAAOG,UAAY,GACnBH,EAAOK,MAAQ,KACfL,EAAOQ,QAAU,KACjB0K,EACA6N,EACAC,EACA,CAAC,CAACqe,EAAc5kB,GAAaC,IAC7B,CAAC2W,GAAmBnf,UAAWmf,GAAmBq5C,iBACjDtzE,EAAO,WAAW2nB,MAAKmkB,IAAO,CAC/BhrB,MAAOgrB,EAAQhrB,MACftjB,KAAMsuC,EAAQtuC,KAAKqc,KAAIzZ,GAAU,IAAI0W,GAAO1W,UAShD+0F,CAjDa,GAiDDjuD,EAjDC,IAiD+Bvf,MAAKnqB,IAC/C8qC,EAAS9qC,SAEb2kB,oBAAUomB,EAAS,CAACrB,EAAW7jB,EAAYC,IAE3C8iB,IAAuB,KACrBmC,IACAF,EAAgB,CAACnB,UAAW,MAC5B,IACA,CAACprB,IAKH,MAYMs5E,EAA6BjvF,IACjCkiC,EAAgB,IAAID,EAAWtsB,OAAQ3V,KAKnCkvF,EAAgBpjB,KAEhBhqC,EAAiB5mB,IACrB,OAAQA,GACN,QACE,MAAO,SACT,IAAK,YACH,MAAO,iBACT,IAAK,WACH,MAAO,mBAcb,OACE,uCACE,eAACkmB,GAAA,EAAKvO,OAAN,UARA,sBAAK5pB,MAAO,CAACgzB,QAAS,QAAtB,SACE,eAACmD,GAAD,CAAQx6B,KAAK,SAAS5E,MAAO2V,EAAQmH,SAAUmyE,QAUjD,eAAC7tD,GAAA,EAAK7N,KAAN,CAAWxqB,UAAU,mBAArB,SACE,eAACkV,GAAD,CACEC,gBAAqB,OAAL/F,QAAK,IAALA,OAAA,EAAAA,EAAO9gB,OAAQ,GAC/B4lB,QAASiyE,EACT/wE,OAAQA,GACRE,YA3CkBlH,IACxB6qB,EAAQz5B,KAAK4D,GAAmBd,GAAOsE,WAAYwH,EAAKlS,GAAIgR,EAAYhR,GAAIgR,EAAYxL,UA2ClF6T,cApDmBrd,IACzBihC,EAAgB,CAAEnB,UAAW9/B,KAoDvBsd,cAjDkB,CAACrD,EAAgBmmB,KACzCa,EAAgB,CAAEhlB,WAAYhC,EAAQiC,cAAekkB,KAiD/ClkB,cAAeA,EACfD,WAAYA,EACZjc,KAAM8/B,EACN1nB,SAxHO,GAyHPD,WAAU,iBAAEjB,QAAF,IAAEA,OAAF,EAAEA,EAAOwC,aAAT,QAAkB,EAC5BhhB,KAAK,iBC9FA,MAAMw1F,WAA+B3yD,GAKlDx3B,YAAY8D,GACV0oB,MAAM1oB,GADwC,KAJhDsmF,yBAIgD,OAHhDF,mBAGgD,OAFhDG,sBAEgD,OAsFhDxR,sBAAwBt7C,UAAa,IAAD,EAClC,KAAI,UAAC5rC,KAAK2K,MAAMmJ,cAAZ,aAAC,EAAmBxF,IACtB,OAEF,MAAMi4C,QAAcjiB,GAAIxV,wBAAwB,kBAAmB9uB,KAAK2K,MAAMmJ,OAAOxF,IACrFtO,KAAKo7B,SAAS,IAAIp7B,KAAK2K,MAAOsiC,kBAAmBsZ,KA3FH,KA+FhDoyC,cAAgB,KACd,MAAM,gBAAEC,EAAF,OAAmB9kF,GAAW9T,KAAK2K,MACpCmJ,IAGD9T,KAAKy4F,sBACP9uD,aAAa3pC,KAAKy4F,qBAClBz4F,KAAKy4F,yBAAsB93F,GAE7BX,KAAKq4F,YA9GQ,GA8GIO,EA9GJ,IA8G0C/tE,MAAKnqB,IAC1DV,KAAKo7B,SAAS,CACZ4T,QAAStuC,EACT6jE,KAAMvkE,KAAK64F,iBAAiB/kF,UA3Gc,KAgHhDglF,kBAAoB,KAClB,MAAM,OAAEhlF,GAAW9T,KAAK2K,MACnBmJ,GAEL9T,KAAK8lC,QAAQxB,GAAIpS,sBAAsBpe,EAAOxF,IAAKpL,EAAO,iBAAiB2nB,MAAKkuE,IAC9E/4F,KAAKo7B,SAAS,CACZ29D,cACAx0B,KAAMvkE,KAAK64F,iBAAiB/kF,SAvHc,KA4HhDklF,0BAA6B11F,IAC3BtD,KAAK0mC,WAAmBv0B,GACtB,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,4BACT6lB,QAAS7lB,EAAE,6BAA8B,CAAEwI,KAAM3K,EAAO2K,OACxDsuB,QAAS92B,EAAE,sBACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAGL0Y,MAAKghB,IAAeA,GAAavH,GAAIzQ,aAAavwB,EAAOgL,OACzDuc,MAAK,KACJs5C,GAAiB,CAAE74C,QAAS7lB,EAAE,6BAA8B,CAAEwI,KAAM3K,EAAO2K,SAC3EjO,KAAK24F,oBA3IqC,KA+IhDN,YAAc,CAACxrE,EAAcC,KAC3B,MAAM,OAAEhZ,EAAF,aAAUmlF,EAAV,iBAAwBC,EAAxB,oBAA0CC,GAAwBn5F,KAAK2K,MAC7E,OAAImJ,GAAWA,EAAOvJ,OAASkI,GAAmBK,MAAQgB,EAAOvJ,OAASkI,GAAmBI,SAgBtF6Y,QAAQC,aAAQhrB,GAfdX,KAAK8lC,QAAQxB,GAAItR,0BACtBlf,EAAOtF,KACPsF,EAAOG,UAAY,GACnBH,EAAOK,MAAQ,KACfL,EAAOQ,QAAU,KACjB2kF,EACApsE,EACAC,EACA,CAAC,CAACosE,EAAkBC,KACnBj2F,EAAO,WAAW2nB,MAAKmkB,IAAO,CAC/BhrB,MAAOgrB,EAAQhrB,MACftjB,KAAMsuC,EAAQtuC,KAAKqc,KAAIzZ,GAAU,IAAI0W,GAAO1W,UA7JF,KAyMhD81F,6BAAgC9uF,IAC9BtK,KAAKo7B,SAAS,CAAEi+D,qBAAsB/uF,GAAQtK,KAAK84F,oBA1ML,KA6MhDQ,6BAA+B,CAAC/0E,EAAgBmmB,KAC9C1qC,KAAKo7B,SAAS,CAAEm+D,sBAAuBh1E,EAAQi1E,yBAA0B9uD,KA9M3B,KAiNhD+uD,4BAA+B3lF,IAC7B,MAAM,QAAEu3B,GAAYrrC,KAAKmS,MACzBk5B,EAAQz5B,KAAKiE,GAAYnB,GAAOqE,mBAAoBjF,EAAO4lF,gBAAgB3rF,KAAO,QAAU+H,GAAWpB,GAAOqE,mBAAoB/Y,KAAKmS,MAAM7D,MAnN/F,KAsNhDqrF,iBAAmB,IAEf,gBAAClvD,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,OAASjqB,UAAU,mBAA7C,UACGkyB,GAAI1gC,KAAKoL,WAAa,eAACy8E,GAAD,CAAUnhF,KAAMoK,GAAOsC,mBAAoBpR,MAAO5F,KAAKmS,MAAM7D,KACpF,eAACsrF,GAAD,CAAgB9lF,OAAQ9T,KAAK2K,MAAMmJ,OACnBu3B,QAASrrC,KAAKmS,MAAMk5B,QACpBvF,QAAS9lC,KAAKmS,MAAM2zB,QACpBc,OAAQ5mC,KAAKmS,MAAMy0B,OACnBgN,QAAS5zC,KAAKmS,MAAMyhC,QAASp0B,IAAK,QA9NR,KAoOhDkrE,gBAAkB,KAChB,MAAM,OAAE52E,GAAW9T,KAAK2K,MACxB,IAAKmJ,EACH,OAAO,yBAET,MACMmyE,GADUnyE,EAAOA,OAAOu3B,SAAW,IACKtuB,KAAIrb,GAAS1B,KAAK65F,YAAYn4F,KAC5E,OACA,gBAAC+oC,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,MAAOsJ,SAAU,YAA3C,UACE,eAAC8E,GAAA,EAAKvO,OAAN,UACCoI,GAAI1gC,KAAKoL,WAAa,eAACy8E,GAAD,CAAUnhF,KAAMoK,GAAOsC,mBAAoBpR,MAAO5F,KAAKmS,MAAM7D,OAEpF,eAACm8B,GAAA,EAAK7N,KAAN,UACCqpD,QAjP2C,KAsPhDlZ,mBAAqB,KAAO,IAAD,UACzB,OACE,uBAAKz6D,MAAO,CAACqzB,SAAU,YAAvB,UACGrB,GAAI1gC,KAAKoL,WAAa,eAACy8E,GAAD,CAAUnhF,KAAMoK,GAAOsC,mBAAoBpR,MAAO5F,KAAKmS,MAAM7D,KACpF,eAAC,GAAD,CACEkL,OAAM,oBAAExZ,KAAK2K,MAAMmJ,cAAb,aAAE,EAAmBxF,UAArB,QAA2B,GACjCoL,SAAQ,oBAAE1Z,KAAK2K,MAAMmJ,cAAb,aAAE,EAAmB7F,YAArB,QAA6B,GACrCwL,SAAS,kBACT4xB,QAASrrC,KAAKmS,MAAMk5B,QACpBvF,QAAS9lC,KAAKmS,MAAM2zB,QACpBc,OAAQ5mC,KAAKmS,MAAMy0B,OACnBpnB,IAAK1J,GAAWpB,GAAOqE,mBAAR,UAA4B/Y,KAAK2K,MAAMmJ,cAAvC,aAA4B,EAAmBxF,IAC9D6gD,UAAU,EACVuW,aAAa,8BAnQ2B,KAgRhDo0B,gBAAmBhmF,GAAiCA,EAAO/F,IAhRX,KAkRhDgsF,qBAAuB,KACrB,MAAM,YACJhB,EADI,sBAEJQ,EAFI,yBAGJC,EAHI,qBAIJH,GACEr5F,KAAK2K,MACHqvF,EAAejB,EAAYrqD,MA/RpB,GAgSX2qD,EAhSW,IAiSVA,EAAuB,IAG1B,OACE,gBAAC5uD,GAAA,EAAD,CAAMn4B,MAAO,CAAE+pB,UAAW,OAASjqB,UAAU,mBAA7C,UACE,eAACq4B,GAAA,EAAKvO,OAAN,UACGoI,GAAI1gC,KAAKoL,WAAa,eAACy8E,GAAD,CAAUnhF,KAAMoK,GAAOsC,mBAAoBpR,MAAO5F,KAAKmS,MAAM7D,OAEtF,eAACm8B,GAAA,EAAK7N,KAAN,CAAWxqB,UAAU,mBAArB,SACE,eAACkV,GAAD,CACEC,eAAgByyE,EAChB1zE,QAAStmB,KAAK04F,iBACdlxE,OAAQxnB,KAAK85F,gBACbpyE,YAAa1nB,KAAKy5F,4BAClB9xE,cAAe3nB,KAAKo5F,6BACpBxxE,cAAe5nB,KAAKs5F,6BACpB9yE,cAAegzE,EACfjzE,WAAYgzE,EACZjvF,KAAM+uF,EACN32E,SApTK,GAqTLD,WAAYs2E,EAAYl5F,OACxBmD,KAAK,yBA7SbhD,KAAKu4F,cAAgBpjB,GACnBn1E,KAAKg5F,2BAEPh5F,KAAK04F,iBAAmB,CACtB,IAAIz4E,GACF,WACAxa,EAAE,iDACF+a,GAAQA,EAAKk5E,gBAAgBzlF,UAAY,KAE3C,IAAIgM,GACF,OACAxa,EAAE,6CACF+a,IAASA,EAAKk5E,gBAAgBxlF,SAAW,IAAM,IAAMsM,EAAKk5E,gBAAgBvlF,OAE5E,IAAI8L,GACF,OACAxa,EAAE,6CACF+a,GAAQo3E,GAAmBp3E,EAAKw3E,YAAc,MAEhD,IAAI/3E,GACF,KACAxa,EAAE,2CACF+a,GAAQo3E,GAAmBp3E,EAAKy3E,UAAY,OAIhDj4F,KAAK2K,MAAQ,CACXL,KAAM,CACJgE,GAAIoG,GAAOqE,mBACXjF,OAAQ3B,EAAM7D,GACd+D,KAAMG,GAAKU,QACX8B,MAAO,OAETuvD,KAAM,GACN00B,aAAc,GACdL,gBAAiB,EACjBO,oBAAqB90E,GAAcyC,GACnCoyE,iBAAkB,SAClBG,qBAAsB,EACtBG,yBAA0Bn1E,GAAcyC,GACxCyyE,sBAAuB,WACvBR,YAAa,GACb9rD,kBAAkB,GAIE,yBAAC5G,EAAuCC,GAAwC,IAAD,IACrGzL,MAAMuL,mBAAmBC,EAAUC,GAE/BD,EAAS/3B,KAAOtO,KAAKmS,MAAM7D,IAC7BtO,KAAKmmC,eAGH,UAAAG,EAASxyB,cAAT,eAAiBxF,OAAjB,UAAwBtO,KAAK2K,MAAMmJ,cAAnC,aAAwB,EAAmBxF,KAC7CtO,KAAKknF,wBAMT/gD,cACE,MAAM,GAAE73B,EAAF,IAAMkR,GAAQxf,KAAKmS,MACzBnS,KAAK8lC,QAAQxB,GAAIxS,kBAAkBxjB,EAAI,CAAC,iBAAkB,kBAAmBrL,EAAS,mBACnF4nB,MAAK/W,IACJ,MAAMmmF,EAAe,IAAIpmF,GAAeC,GACxC9T,KAAKo7B,SAAS,CACZ9wB,KAAM,CACJgE,GAAIoG,GAAOqE,mBACXjF,OAAQxF,EACR+D,KAAMG,GAAKU,QACX8B,MAAOilF,EAAahsF,KACpBuR,IAAKA,GAAO,qBAEd1L,OAAQmmF,EACR11B,KAAMvkE,KAAK64F,iBAAiBoB,GAC5BjrD,aAASruC,IACR,KACDX,KAAK24F,gBACL34F,KAAK84F,0BAmFbD,iBAAiB/kF,GACf,MAAMywD,EAAiB,GAiCvB,OAhCIzwD,EAAOvJ,OAASkI,GAAmBK,MAAQgB,EAAOvJ,OAASkI,GAAmBI,UAChF0xD,EAAK3yD,KAAK,CACRtD,GAAI,UACJ0G,MAAOvP,EAAE,mCACT4M,KAAMG,GAAKmgC,MACXsyB,aAAc,SAA6BtkE,IAAvBX,KAAK2K,MAAMqkC,QAAwB,MAAQhvC,KAAK2K,MAAMqkC,QAAQhrB,MAAMjf,WACxFiyC,QAASh3C,KAAK25F,mBAGlBp1B,EAAK3yD,KAAK,CACRtD,GAAI,SACJ0G,MAAOvP,EAAE,kCACT4M,KAAMG,GAAK+4E,OACXtmB,aAAc,KAAOnxD,EAAOA,OAAOu3B,SAAW,IAAIxrC,OAAOkF,WACzDiyC,QAASh3C,KAAK0qF,kBAEhBnmB,EAAK3yD,KAAK,CACRtD,GAAI,YACJ0G,MAAOvP,EAAE,qCACT4M,KAAMG,GAAK+4E,OACXtmB,aAAc,IAAMjlE,KAAK2K,MAAMsiC,kBAAkBloC,WACjDiyC,QAASh3C,KAAK+sE,qBAEZj5D,EAAOvJ,OAASkI,GAAmBK,MACrCyxD,EAAK3yD,KAAK,CACRtD,GAAI,cACJ0G,MAAOvP,EAAE,uCACT4M,KAAMG,GAAKU,QACX+xD,aAAc,IAAMjlE,KAAK2K,MAAMouF,YAAYl5F,OAAOkF,WAClDiyC,QAASh3C,KAAK+5F,uBAGXx1B,EAoETs1B,YAAYn4F,GACV,OACE,eAACq2F,GAAD,CAAyBr2F,MAAOA,IA2CpC+kC,gBACE,OACE,eAAC49B,GAAD,CACE/1D,GAAG,uBACHg2D,iBAAkBtkE,KAAK2K,MAAM45D,KAAKtzD,MAAKlI,GAAc,YAATA,EAAEuF,KAAoB,UAAY,SAC9Ei2D,KAAMvkE,KAAK2K,MAAM45D,KACjBK,SAAS,kB,yBC3VV,MAAMs1B,GAAuB/nF,IAClC,MAAM,MACJgoF,EADI,WAEJz5C,EAFI,MAGJr3C,EAHI,aAKJmrC,EAAe,EALX,aAMJC,EANI,MAOJ3wB,EAPI,MAQJhb,GACEqJ,EACE7D,EAAKskC,GAAa,WAExB,OACE,uBAAKxgC,UAAU,iBAAf,UACE,wBAAO02B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,uBAAK1R,UAAY,UAASqiC,GAAiB,GAAKD,IAAhD,UACE,eAAC,GAAD,CACE2lD,MAAOA,EACPz5C,WAAYA,EACZr3C,MAAOA,EACP+xE,aAAmBz6E,IAAVmI,IAEVA,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,WAkBnC,MAAMsxF,WAAqCr4E,IAAMC,cAGtD3T,YAAY8D,GACV0oB,MAAM1oB,GAD8C,KAFtD+wD,kBAEsD,OAoBtDC,mBAAsB/iE,IACpB,IAAIiJ,EAAQjJ,EAAEkiB,cAAcjZ,MAExB6oC,EAAQ7oC,EAAM6oC,MAAM,mFACpBA,GACFlyC,KAAKo7B,SAAS,CAAEzc,QAAS,KACzB2lB,GAAIxS,kBAAkBogB,EAAM,IACzBrnB,MAAKhnB,IACAquC,GAASruC,GACX7D,KAAKqjE,eAAenxB,EAAM,GAAI,IAAIr+B,GAAehQ,QAGvD7D,KAAKsjE,eAAetjE,KAAKmS,MAAMgoF,MAAO9wF,GAGxCrJ,KAAKo7B,SAAS,CAAE/xB,WAnCoC,KAsCtDg6D,eAAiB,CAACh6D,EAAemX,KAC/BxgB,KAAKmS,MAAMuuC,WAAWlgC,EAAK1M,QAE3B9T,KAAKo7B,SAAS,CACZ/xB,MAAO,GACPsV,QAAS,MAxCX3e,KAAK2K,MAAQ,CACXgU,QAAS,GACTtV,MAAO8I,EAAM9I,MAAQ,IAAIwK,GAAe1B,EAAM9I,OAAO4E,KAAO,GAC5D04B,MAAO,MAIXzL,0BAA0BC,GACpBA,EAASg/D,QAAUn6F,KAAKmS,MAAMgoF,OAChCn6F,KAAKsjE,eAAenoC,EAASg/D,MAAOn6F,KAAK2K,MAAMtB,OAGnD+8B,mBAAmBC,GACbrmC,KAAKmS,MAAM9I,OAASrJ,KAAKmS,MAAM9I,QAAUg9B,EAASh9B,OACpDrJ,KAAKo7B,SAAS,CAAE/xB,MAAO,IAAIwK,GAAe7T,KAAKmS,MAAM9I,OAAO4E,OA8BhEq1D,eAAe62B,EAA6B9wF,GACtCrJ,KAAKkjE,eACPv5B,aAAa3pC,KAAKkjE,cAClBljE,KAAKkjE,kBAAeviE,GAGjB0I,EAGHrJ,KAAKkjE,aAAethE,YAAW,IAAM5B,KAAKq6F,iBAAiBF,IAAQ,KAFnEn6F,KAAKo7B,SAAS,CAAEzc,QAAS,KAM7B07E,iBAAiBF,GACfn6F,KAAKkjE,kBAAeviE,EACpB2jC,GAAI5R,qBAAqB,CAAEnoB,KAAM,CAAE,IAAO4vF,IAAWn6F,KAAK2K,MAAMtB,MAAO,EAAG,IACvEwhB,MAAKmxD,GAAYh8E,KAAKo7B,SAAS,CAC9Bzc,QAASq9D,EAASt7E,KAAKqc,KAAIjJ,GAAU,IAAID,GAAeC,SAI9DyM,SACE,MAAM,QAAE5B,EAAF,MAAWtV,GAAUrJ,KAAK2K,OAC1B,QAAEywE,GAAU,GAAUp7E,KAAKmS,MACjC,OAAO,uCACL,eAAC,KAAD,CACEopE,WAAY,CAAEnpE,UAAWgpE,EAAU,0BAA4B,gBAC/DI,aAAch7D,GAAQA,EAAKvS,KAC3BuT,MAA0B,IAAnB7C,EAAQ9e,OAAe,MAACc,GAAage,EAC5C88D,UAAW,CAAEvnC,QAAS,SAAUvO,SAAU,QAAS8Z,WAAY,QAASi8B,OAAQ,iBAAkBC,OAAQ,KAC1GR,WAAY,CAAC36D,EAAgCo7D,SAClCj7E,IAAT6f,EACE,sBAAKlO,MAAO,CAAE6R,MAAO,OAAQ4iB,SAAU,IAAvC,SACmB,IAAjB19B,EAAMxJ,OACF4F,EAAE,iCACDzF,KAAKkjE,aAAez9D,EAAE,8BAAgCA,EAAE,gCAG/D,sBAAmB6M,MAAO,CAAEmtC,WAAYm8B,EAAgB,YAAc,QAAS1nC,QAAS,SAAUryB,OAAQ,WAA1G,SACGrB,EAAKvS,MADEuS,EAAKlS,IAKnBjF,MAAOA,EACP8c,SAAUnmB,KAAKmjE,mBACfsB,SAAUzkE,KAAKqjE,iBAEhBrjE,KAAK2K,MAAMg8B,UC1IlB,MAAM2zD,GAAkB,CAAC7nF,GAAmBE,SAAUF,GAAmBG,QAASH,GAAmBI,UAExF0nF,GAA2BpoF,IACtC,MAAM,MAAElH,EAAF,iBAASgnB,EAAT,MAA2BvwB,GAAUyQ,GAEpCooB,EAAQ5O,GAAW2O,GAASnoB,GAG7BkuC,EAA+Bp4B,mBAAQ,IAAM,CACjD,CAAE5e,MAAO,YAAa2L,MAAOvP,EAAE,0CAC/B,CAAE4D,MAAO,WAAY2L,MAAOvP,EAAE,2CAC7B,KACI8E,EAAM83C,GAAW94C,mBAAiC7H,EAAQA,EAAM6I,KAAO,cACvEipB,EAAUgnE,EAAazD,EAAe0D,GACzCtxF,EAAkBzH,EAAQ+zC,GAA2B/zC,EAAMs2F,WlJ7BxC,CAASl9E,IAAK,GAAIC,MAAO,GAAIC,KAAM,MkJ8BnDyY,EAAQinE,EAAWzD,EAAa0D,GACnCxxF,EAAkBzH,EAAQ+zC,GAA2B/zC,EAAMu2F,SlJ/BxC,CAASn9E,IAAK,GAAIC,MAAO,GAAIC,KAAM,MkJgCnDlH,EAAQ8mF,EAAWC,EAAaC,GACnC3xF,EAAkBzH,EAAQA,EAAMoS,YAASnT,IACtCyN,EAAak0C,GAAkB/4C,mBAAS7H,EAAQA,EAAM0M,YAAc,IA+B3E,OACE,gBAAC,KAAD,CAAOmtB,KAAMhB,EAAQiB,OA7CH,IAAM7P,EAAQ,MA6ChC,UACE,eAACsQ,GAAD,iDACA,eAAC,KAAMW,KAAP,UACE,gBAAC3W,GAAA,EAAD,WACE,eAACyuB,GAAD,CACE5wB,MAAOre,EAAE,kCACTwI,KAAK,OACL5E,MAAOkB,EACP4b,SAtCiB9c,GAAkBg5C,EAAQh5C,GAuC3CsV,QAAS0hC,IAEX,eAACrK,GAAD,CACElyB,MAAOre,EAAE,kCACTwI,KAAK,OACL5E,MAAOmqB,EACPrN,SAAUq0E,EACV1xF,MAAOiuF,IAET,eAAC/gD,GAAD,CACElyB,MAAOre,EAAE,gCACTwI,KAAK,KACL5E,MAAOoqB,EACPtN,SAAUu0E,EACV5xF,MAAOmuF,IAET,eAACiD,GAAD,CACEp2E,MAAOre,EAAE,oCACT4D,MAAOyK,EACP4sC,WAAYk6C,EACZT,MAAOG,GACPxxF,MAAO+xF,IAET,eAAC1lD,GAAD,CACEC,UAAQ,EACRtxB,MAAOre,EAAE,yCACTwI,KAAK,cACL5E,MAAO+E,EACP+X,SAAUm8B,SAIhB,eAACvmB,GAAD,UACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAtEN0sB,UACxB,MAAM1sC,EAA0C,CAC9CsP,KAAMsF,EAASA,EAAOtF,KAAO,GAC7BjE,OACAytF,UAAW1iD,GAAoB9hB,GAC/BykE,QAAS3iD,GAAoB7hB,GAC7BtB,UAAWre,EAASA,EAAO/F,IAAM,GACjC+F,OAAQA,EACR1F,eAEIvK,QAAeygC,GAAItS,8BACvB9yB,EACA+L,EAAQ,SAAW,SACnBgnB,EACAhnB,GAEF,GAAsB,OAAlBpH,EAAOqC,OAET,YADAylB,EAAQzsB,GAIV,MAAM2vC,EAAShrC,EAAOnD,MAAQ,GAC9B+5F,EAAiB5rD,EAAOmpD,WACxB2C,EAAe9rD,EAAOopD,SACtB6C,EAAejsD,EAAO1c,WAAa0c,EAAOrgC,OA8CtC,SACG/I,EAAE,+BC9FPs1F,GAAa,CACjBznF,GAAkBE,gBAClBF,GAAkBG,QAClBH,GAAkBI,SAClBJ,GAAkBK,MAGPqnF,GAAuB7oF,IAClC,MAAM,MAAElH,EAAF,iBAASgnB,EAAT,MAA2BvwB,GAAUyQ,GACpCooB,EAAQ5O,GAAW2O,GAASnoB,GAG7BkuC,EAA+Bp4B,mBAAQ,IAC3C8yE,GAAWh+E,KAAIg0C,IAAC,CAAO1nD,MAAO0nD,EAAG/7C,MAAOzB,GAAyBw9C,QACjE,KAGKxmD,EAAM83C,GAAW94C,mBAAS7H,EAAQA,EAAMo2F,WAAaxkF,GAAkBE,kBACvEggB,EAAUgnE,EAAazD,EAAe0D,GACzCtxF,EAAkBzH,EAAQ+zC,GAA2B/zC,EAAMs2F,WnJlCxC,CAASl9E,IAAK,GAAIC,MAAO,GAAIC,KAAM,MmJmCnDyY,EAAQinE,EAAWzD,EAAa0D,GACnCxxF,EAAkBzH,EAAQ+zC,GAA2B/zC,EAAMu2F,SnJpCxC,CAASn9E,IAAK,GAAIC,MAAO,GAAIC,KAAM,MmJqCnDtX,EAAOwlE,EAAUC,EAAYC,GAChCjgE,EAAkBzH,EAAQA,EAAMgC,WAAQ/C,IACrCsyE,EAAMgoB,EAASC,EAAWC,GAC7BhyF,EAAkBzH,GAAQA,EAAMuxE,MAAa,KAC1C7kE,EAAak0C,GAAkB/4C,mBAAS7H,EAAQA,EAAM0M,YAAc,IAiC3E,OACE,gBAAC,KAAD,CAAOmtB,KAAMhB,EAAQiB,OAlDH,IAAM7P,EAAQ,MAkDhC,UACE,eAACsQ,GAAD,UAAcx2B,EAAE,8CAChB,eAAC,KAAMm3B,KAAP,UACE,gBAAC3W,GAAA,EAAD,WACE,eAACyuB,GAAD,CACE5wB,MAAOre,EAAE,uCACTwI,KAAK,aACL5E,MAAOkB,EACP4b,SAxCiB9c,GAAkBg5C,EAAQh5C,GAyC3CsV,QAAS0hC,IAEX,eAACrK,GAAD,CACElyB,MAAOre,EAAE,kCACTwI,KAAK,OACL5E,MAAOmqB,EACPrN,SAAUq0E,EACV1xF,MAAOiuF,IAET,eAAC/gD,GAAD,CACElyB,MAAOre,EAAE,gCACTwI,KAAK,KACL5E,MAAOoqB,EACPtN,SAAUu0E,EACV5xF,MAAOmuF,IAET,eAACt0B,GAAD,CACE7+C,MAAOre,EAAE,mCACTwI,KAAK,QACL5E,MAAO3F,EACPyiB,SAAU+iD,EACVpgE,MAAOqgE,EACP5jD,OAAQ,WAEV,eAAC0vB,GAAD,CACEnxB,MAAOre,EAAE,kCACTwI,KAAK,OACL5E,MAAO4pE,EACP9sD,SAAU80E,EACVnyF,MAAOoyF,IAET,eAAC/lD,GAAD,CACEC,UAAQ,EACRtxB,MAAOre,EAAE,yCACTwI,KAAK,cACL5E,MAAO+E,EACP+X,SAAUm8B,SAIhB,eAACvmB,GAAD,UACE,eAACc,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAhFN0sB,UACxB,MAAM1sC,EAAsC,CAC1CqL,KAAM,QACNutF,WAAYvtF,EACZytF,UAAW1iD,GAAoB9hB,GAC/BykE,QAAS3iD,GAAoB7hB,GAC7B04C,SAAUzoE,EAAQA,EAAMqK,SAAMpN,EAC9B+C,MAAOA,EACPuvE,OACA7kE,eAEIvK,QAAeygC,GAAItS,8BACvB9yB,EACA+L,EAAQ,SAAW,SACnBgnB,EACAhnB,GAEF,GAAsB,OAAlBpH,EAAOqC,OAET,YADAylB,EAAQzsB,GAIV,MAAM2vC,EAAShrC,EAAOnD,MAAQ,GAC9B+5F,EAAiB5rD,EAAOmpD,WACxB2C,EAAe9rD,EAAOopD,SACtB7uB,EAAcv6B,EAAOs9B,UACrBgvB,EAAatsD,EAAOokC,OAsDhB,SACGxtE,EAAE,+BC9GA21F,GAAuBjpF,IAClC,MAAM,iBAAE8f,EAAF,MAAoBhnB,EAApB,OAA2B2zB,EAA3B,UAAmCy8D,GAAclpF,EACjDy0B,EAASkE,KAEThb,EAAc8b,MAAO3gC,EAAevJ,KACxC,MAAMioF,EAAY,IAAI/qD,GAEtB,GADA+qD,EAAU1+E,GAASvJ,EACfuwB,EAAkB,CACpB,MAAMqpE,QAAsBh3D,GAAIzS,qBAAqB,CACnD9jB,IAAKkkB,EACLoZ,QAASs+C,IAEX3wC,uBAAoBhuB,QAAQvlB,EAAE,sCAC9B41F,EAAUC,EAAcjwD,SAAW,SAEnCgwD,EAAU1R,IAgEd,OACE,eAACoO,GAAD,CAEEr2F,MAAOk9B,EAAO3zB,GACdylD,cAhE2B9kB,UAC7B,MAAM3gC,EAAQ2zB,EAAO28D,WAAUxyF,GAAKA,IAAMrH,IAC1C,KAAIuJ,EAAQ,GAGZ,GAAmB,UAAfvJ,EAAM6I,KAAkB,CAC1B,MAAM25E,QAAiBt9C,EAAOrL,MAAqCppB,GACjE,eAAC6oF,GAAD,CACE/oE,iBAAkBA,EAClBvwB,MAAOA,EACPuJ,MAAOA,KACHkH,MAGJ+xE,GACFp0D,EAAY7kB,EAAOi5E,OAChB,CACL,MAAMA,QAAiBt9C,EAAOrL,MAAyCppB,GACrE,eAACooF,GAAD,CACEtoE,iBAAkBA,EAClBvwB,MAAOA,EACPuJ,MAAOA,KACHkH,MAGJ+xE,GACFp0D,EAAY7kB,EAAOi5E,KAuCrBz4B,gBAnC6B7f,UAC/B,MAAMC,QAAkBjF,EAAOrL,MAAcppB,GAC3C,eAACmqB,GAAD,CACEtnB,MAAOvP,EAAE,yCACT6lB,QAAS7lB,EAAE,2CACX82B,QAAS92B,EAAE,sBACXg3B,WAAYh3B,EAAE,yBACd+2B,YAAY,SACZE,WAAYj3B,EAAE,4BACV0M,MAGR,IAAK05B,EACH,OAEF,MAAM5gC,EAAQ2zB,EAAO1V,QAAQxnB,GAC7B,GAAIuJ,EAAQ,EACV,OAEF,MAAM0+E,EAAY/qD,EAAO5f,QAAO,CAACjW,EAAGya,IAAMA,IAAMvY,IAC5CgnB,UACIqS,GAAIzS,qBAAqB,CAC7B9jB,IAAKkkB,EACLoZ,QAASs+C,IAEX3wC,uBAAoBhuB,QAAQvlB,EAAE,0CAEhC41F,EAAU1R,KAKH1+E,IClELuwF,GAA0C,CAC9CjxF,KAAMkI,GAAmBK,KACzBmB,SAAU,GACV8rC,mBAAep/C,EACf2T,OAAQ,GACR0rC,iBAAar/C,EACbwT,KAAM,GACN8rC,eAAWt/C,EACXqT,QAAS,GACTksC,kBAAcv/C,EACdoT,SAAU,GACVosC,mBAAex/C,EACf6N,KAAMoF,GAAO,GACbwsC,eAAWz/C,GAqBb,MAAMgnE,GAAoD,CAAC,gBAAiB,kBAE5Dx1D,WACd,MAAM,GAAE7D,EAAF,QAAMw3B,EAAN,IAAetmB,EAAf,QAAoB6rB,GAAYl5B,EAEhCy0B,EAASkE,KAETh3B,ExKwND,SACLgyB,EACAx3B,EACAqQ,EAAgDouB,IAEhD,MAAOlpC,EAAQsoC,GAAa5iC,qBAU5B,OATA8b,qBAAU,KACH/W,EAKLw3B,EAAQA,QAAQxB,GAAIxS,kBAAkBxjB,EAAIqQ,GAAU1b,EAAS,mBAC1D4nB,KAAKshB,GALNA,OAAUxrC,KAMX,CAACmlC,EAASx3B,EAAIqQ,IACV9a,EwKvOQ43F,CAAkB31D,EAASx3B,EAAIq5D,KACvC5qB,EAAWC,GAAgBzzC,mBAAkCiyF,KAC7D58D,EAAQy8D,GAAa9xF,mBAAgC,IAEtD0jC,EAAmBD,GAA4B,kBAAD,OAAoBl5B,QAApB,IAAoBA,OAApB,EAAoBA,EAAQ/F,KAG1EugF,EAAarmE,mBAAQ,IAClB2W,EAAO7hB,KAAI,CAAC0K,EAAGxc,IACpB,eAACmwF,GAAD,CAEEnpE,iBAAkB3jB,EAClBrD,MAAOA,EACP2zB,OAAQA,EACRy8D,UAAWA,GAJNpwF,MAOR,CAAC2zB,EAAQtwB,IAENiyC,EAAkBp2C,uBAAaW,IACnCkyC,GAAaD,GAAapgC,OAAOC,OAAO,GAAImgC,EAAWjyC,OACtD,IAEGu+B,EAAQl/B,uBAAY,KACxBo2C,EAAgBi7C,MACf,CAACj7C,IAEJl7B,qBAAU,KACJvR,GACFysC,EAtDN,SAAwCzsC,GACtC,MAAO,CACLvJ,KAAMuJ,EAAOvJ,KACb0J,SAAUH,EAAOG,UAAY,GAC7B8rC,mBAAep/C,EACf2T,OAAQR,EAAOI,SAAW,GAC1B8rC,iBAAar/C,EACbwT,KAAML,EAAOK,MAAQ,GACrB8rC,eAAWt/C,EACXqT,QAASF,EAAOE,SAAW,GAC3BksC,kBAAcv/C,EACdoT,SAAUD,EAAOC,UAAY,GAC7BosC,mBAAex/C,EACf6N,KAAMsF,EAAOtF,MAAQoF,GAAO,GAC5BwsC,eAAWz/C,GAwCO+6F,CAA+B5nF,IAC/CunF,EAAUvnF,EAAOu3B,SAAW,KAE5BhC,MAED,CAACv1B,EAAQu1B,EAAOkX,IAEnB,MAAMo7C,EAAW/vD,UACf,MAAM+9C,EAAY,IAAI/qD,EAAQl9B,GAC9B,GAAI4M,EAAI,CACN,MAAMwF,QAAewwB,GAAIzS,qBAAqB,CAC5C9jB,IAAKO,EACL+8B,QAASs+C,IAEX3wC,uBAAoBhuB,QAAQvlB,EAAE,sCAC9B41F,EAAUvnF,EAAOu3B,SAAW,SAE5BgwD,EAAU1R,IA2DRiS,EAAmB,CACvB,CACEttF,GAAI,OACJ+D,KAAMG,GAAKY,KACX4B,MAAOvP,EAAE,oCACTw/D,aAAc,IAAM,GACpBjuB,QA7DkB,IACb,uCACL,eAAC6T,GAAD,CAAUx4C,KAAMG,GAAK3E,KAAMmH,MAAOvP,EAAE,oCAAqC6M,MAAO,CAAE+pB,UAAW,OAA7F,SACE,eAACyjB,GAAD,CAAoB/C,UAAWA,EAAWC,aAAcA,MAE1D,gBAACnhB,GAAD,WACE,eAACgB,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAASotD,EAAnC,SACG7mE,EAAE,yBAEL,eAACo3B,GAAA,EAAD,CAAQC,QAAQ,UAAU5d,QAAS28E,EAAnC,SACGp2F,EAAE,sCAqDT,CACE6I,GAAI,SACJ+D,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,kCACTw/D,aAAc,IAAMrmC,EAAO/+B,OAAOkF,WAClCiyC,QApDoB,IAEpB,uBAAK1kC,MAAO,CAAE6hC,WAAY,IAA1B,UACE,uBAAK7hC,MAAO,CAAE+rC,aAAc,IAA5B,UACE,wBAAMjsC,UAAWqO,KAAOq7E,cAAxB,UACGr2F,EAAE,iCADL,OAGA,gBAACo3B,GAAA,EAAD,CAAQC,QAAQ,gBAAgBxqB,MAAO,CAAE4R,YAAa,IAAMhF,QAAS68E,EAArE,UACE,oBAAG3pF,UAAWI,GAAKU,UADrB,IACkCzN,EAAE,6CAEpC,gBAACo3B,GAAA,EAAD,CAAQC,QAAQ,gBAAiBxqB,MAAO,CAAE4R,YAAa,IAAMhF,QAAS88E,EAAtE,UACE,oBAAG5pF,UAAWI,GAAKW,QADrB,IACgC1N,EAAE,4CAGnC6oF,MAwCL,CACEhgF,GAAI,YACJ+D,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,4BACTw/D,aAAc,IAAMh4B,EAAkBloC,WACtCiyC,QAxCuB,IACpBljC,EAID,eAAC,GAAD,CACE0F,OAAQ,IAAI3F,GAAeC,GAAQxF,IAAM,GACzCoL,SAAU,IAAI7F,GAAeC,GAAQ7F,MAAQ,GAC7CwL,SAAS,kBACT4xB,QAASl5B,EAAMk5B,QACfvF,QAASA,EACTc,OAAQA,EACRpnB,IAAK1J,GAAWpB,GAAOsC,mBAAoBlD,EAAO/F,KAClDohD,UAAU,EACVuW,aAAa,8BAZT,iCA0CNq2B,EAAiCnwD,UACrC,MAAMlqC,QAAcklC,EAAOrL,MAAyCppB,GAClE,eAACooF,GAAD,CAAyBtoE,iBAAkB3jB,KAAQ6D,MAEjDzQ,GACFi6F,EAASj6F,IAGPs6F,EAA6BpwD,UACjC,IAAKt9B,EACH,OAEF,MAAM5M,QAAcklC,EAAOrL,MAAqCppB,GAC9D,eAAC6oF,GAAD,CAAqB/oE,iBAAkB3jB,KAAQ6D,MAE7CzQ,GACFi6F,EAASj6F,IAGP4qE,EAAoB1gC,UACxB,MAAM,KACJrhC,EADI,SAEJ0J,EAFI,OAGJK,EAHI,KAIJH,EAJI,QAKJH,EALI,SAMJD,EANI,KAOJvF,GACEuuC,EAEEnhC,EAAmD,CACvD7N,IAAKO,EACL/D,OACAiE,QAEF,OAAQjE,GACN,KAAKkI,GAAmBG,QACtBgJ,EAAO5H,QAAUA,EACjB,MACF,KAAKvB,GAAmBE,SACtBiJ,EAAO7H,SAAWA,EAClB,MACF,KAAKtB,GAAmBK,KACtB8I,EAAO1H,QAAUI,EACjBsH,EAAOzH,KAAOA,EACdyH,EAAO3H,SAAWA,EAClB,MACF,KAAKxB,GAAmBI,SACtB+I,EAAO3H,SAAWA,EAGtB,MAAMpQ,QAAeygC,GAAIvS,uBAAuBnW,EAAQtN,EAAK,SAAW,UAClEugC,EAAShrC,EAAOnD,MAAQ,GAU9B,GATA6/C,EAAgB,CACdR,cAAe/2C,EAAoB6lC,EAAO56B,UAC1CgsC,UAAWj3C,EAAoB6lC,EAAO16B,MACtC6rC,YAAah3C,EAAoB6lC,EAAO36B,SACxCgsC,aAAcl3C,EAAoB6lC,EAAO76B,SACzCmsC,cAAen3C,EAAoB6lC,EAAO96B,UAC1CqsC,UAAWp3C,EAAoB6lC,EAAOrgC,QAGlB,OAAlB3K,EAAOqC,OAAiB,CAC1B,GAAIoI,QACIg2B,GAAIzS,qBAAqBlV,OAAOC,OAAO,CAAE7O,IAAKO,GAAMsN,IAC1Do9B,uBAAoBhuB,QAAQvlB,EAAE,oCACzB,CACLmW,EAAOyvB,QAAUzM,EACjB,MAAM9qB,QAAewwB,GAAI1S,qBAAqBhW,GAC9Co9B,uBAAoBhuB,QAAQvlB,EAAE,gCAC9B4lC,EAAQz5B,KAAKiE,GAAYnB,GAAOsC,mBAAoBlD,EAAO/F,MAE7D,OAAO,EAGT,OAAO,GAGH8tF,EAA4B,KAChCvvB,IAAoBzhD,MAAKG,IAClBA,SAGMrqB,IAAP2N,EACF+6B,IAEAgC,EAAQz5B,KAAK,kCAKbqqF,EAAcnoF,EAChBf,GAA0Be,EAAOvJ,MAAQ,KAAO,IAAIsJ,GAAeC,GAAQ7F,KAC3E,MACE+G,EAAQ1G,EAAK2tF,EAAcx2F,EAAE,oCAEnC,OACE,eAAC+/B,GAAD,CACEl3B,GAAIA,EAAKoG,GAAOsC,mBAAqBtC,GAAO2B,qBAC5CvC,OAAQxF,EACR+D,KAAMG,GAAKU,QACX8B,MAAOA,EACPgwB,WAAYv/B,EAAE,2BACd+Z,IAAKA,GAAO1J,GAAWpB,GAAOqE,mBAAoBzK,GAClDy1B,SAAUvkB,OAAM7e,EAAYs7F,EAP9B,SASE,eAAC53B,GAAD,CACE/1D,GAAG,2BACHg2D,iBAAiB,OACjBC,KAAMq3B,EACNh3B,SAAS,oBCvTV,MAEMs3B,GAAkB,KAC7B,MAAMpyC,EAAMvkD,MAUZ,MARgB,CACduV,IAAKgvC,EAAIvU,OAAOxwC,WAChBgW,OAAQ+uC,EAAI/uC,QAAQ,GAAGhW,WACvBiW,KAAM8uC,EAAI9uC,OAAOjW,WACjB0Z,KAAMqrC,EAAIrrC,OAAO1Z,WACjB2Z,OAAQorC,EAAIprC,SAAS3Z,aAMlB,SAASo3F,GAAmB9yF,GACjC,MAAM,IAAEyR,EAAF,MAAOC,EAAP,KAAcC,EAAd,KAAoByD,EAApB,OAA0BC,GAAWrV,EAC3C,IAAK,eAAeusC,KAAK96B,GACvB,OACF,IAAK,eAAe86B,KAAK76B,GACvB,OACF,IAAK,aAAa66B,KAAK56B,GACrB,OACF,IAAK,eAAe46B,KAAKn3B,GACvB,OACF,IAAK,eAAem3B,KAAKl3B,GACvB,OAEF,MAAMm3B,EAAa,GAAE76B,KAAQD,EAAMy6B,SAAS,EAAG,QAAQ16B,EAAI06B,SAAS,EAAG,QAAQ/2B,EAAK+2B,SAAS,EAAG,QAAQ92B,EAAO82B,SAAS,EAAG,UAI3H,OADwBjwC,IAAOswC,GACVC,UAIdD,OAJP,EAOK,SAASumD,GAAqB/yF,GACnC,MAAMksC,EAAOhwC,IAAO8D,GACpB,MAAO,CACL2R,KAAMu6B,EAAKv6B,OAAOjW,WAClBgW,OAAQw6B,EAAKx6B,QAAS,GAAGhW,WACzB+V,IAAKy6B,EAAKA,OAAOxwC,WACjB0Z,KAAM82B,EAAK92B,OAAO1Z,WAClB2Z,OAAQ62B,EAAK72B,SAAS3Z,YAwBnB,MAAMs3F,GAAiBlqF,IAC5B,MAAM,KACJlE,EADI,aAEJumC,EAAe,EAFX,MAGJ1wB,EAHI,MAIJza,EAJI,MAKJP,EALI,SAMJ6rC,EANI,UAOJxB,EAPI,SAQJhtB,EARI,MASJ7T,GACEH,EAEEmqF,EAAuB,CAC3Bh9F,MAAO,GACP4kB,YAAa,GAQT+xB,EAAWhsC,iBAAyB,MACpCisC,EAAUjsC,iBAAyB,MACnCsyF,EAAUtyF,iBAAyB,MACnCuyF,EAAYvyF,iBAAyB,MA0DrCqE,EAAKskC,GAAa,aAClBU,EAAaqB,EAAW,yBAA4B7rC,EAAQ,0BAA6BqqC,EAAY,wBAA0B,eACrI,OACE,uBAAK/gC,UAAU,iBAAiBE,MAAOA,EAAvC,UACE,wBAAOw2B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,uBAAK1R,UAAY,WAAS,GAAKoiC,GAA/B,UACE,uBAAKliC,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,OAA9C,UACE,wBACEt3B,KAAMA,EAAO,KACbmE,UAAWkhC,EACXhhC,MAAOgqF,EACPjzF,MAAOA,EAAMyR,IACbqL,SApEgB/lB,IACxB,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MAC1B,GAAIitC,EAAEz2C,OAAS,EACb,OAEFsmB,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAEyR,IAAKw7B,KAEzC,MAAMC,EAAeN,EAAS/rC,QACb,IAAbosC,EAAEz2C,QAAgB02C,GACpBA,EAAaC,SA4DP7N,YAAY,OAEd,wBACE16B,KAAMA,EAAO,KACbmE,UAAWkhC,EACXhhC,MAAOgqF,EACPjzF,MAAOA,EAAM0R,MACboL,SAhEkB/lB,IAC1B,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MAC1B,GAAIitC,EAAEz2C,OAAS,EACb,OAEFsmB,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAE0R,MAAOu7B,KAE3C,MAAMG,EAAcP,EAAQhsC,QACX,IAAbosC,EAAEz2C,QAAgB42C,GACpBA,EAAYD,SAwDN7N,YAAY,KACZ7iB,IAAKmwB,IAEP,wBACEhoC,KAAMA,EAAO,KACbmE,UAAWkhC,EACXhhC,MA7FmB,CAC3BhT,MAAO,GACP4kB,YAAa,IA4FL7a,MAAOA,EAAM2R,KACbmL,SA7DiB/lB,IACzB,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MAC1B,GAAIitC,EAAEz2C,OAAS,EACb,OAEFsmB,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAE2R,KAAMs7B,KAE1C,MAAMmmD,EAAcF,EAAQryF,QACX,IAAbosC,EAAEz2C,QAAgB48F,GACpBA,EAAYjmD,SAqDN7N,YAAY,OACZ7iB,IAAKowB,IAEP,wBACEjoC,KAAMA,EAAO,KACbmE,UAAWkhC,EACXhhC,MAAOgqF,EACPjzF,MAAOA,EAAMoV,KACb0H,SA1DiB/lB,IACzB,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MAC1B,GAAIitC,EAAEz2C,OAAS,EACb,OAEFsmB,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAEoV,KAAM63B,KAE1C,MAAMomD,EAAgBF,EAAUtyF,QACf,IAAbosC,EAAEz2C,QAAgB68F,GACpBA,EAAclmD,SAkDR7N,YAAY,KACZ7iB,IAAKy2E,IAEP,wBACEtuF,KAAMA,EAAO,OACbmE,UAAWkhC,EACXhhC,MAAO,CAAEhT,MAAO,IAChB+J,MAAOA,EAAMqV,OACbyH,SAvDmB/lB,IAC3B,MAAMk2C,EAAIl2C,EAAEkiB,cAAcjZ,MACtBitC,EAAEz2C,OAAS,GAGfsmB,EAASxJ,OAAOC,OAAO,GAAIvT,EAAO,CAAEqV,OAAQ43B,MAmDpC3N,YAAY,KACZ7iB,IAAK02E,OAGR1zF,GAAS,eAACkqC,GAAD,CAAiBlqC,MAAOA,WClM7B6zF,GAA+BxqF,IAC1C,MAAM,aACJqiC,EAAe,EADX,aAEJC,EAFI,MAGJ3wB,EAHI,MAIJza,EAJI,aAKJ4gC,EALI,QAMJtrB,EANI,SAOJwH,GACEhU,EAEE7D,EAAKskC,GAAa,SAClBkC,EAAkB7sB,mBACtB,IAAMtJ,EAAQ5B,KAAIqJ,GAChB,yBAA2B/c,MAAO+c,EAAO/c,MAAzC,SAAiD+c,EAAOpR,OAA3CoR,EAAO/c,UAClB,CAACsV,IACP,OACE,uBAAKvM,UAAU,iBAAf,UACE,wBAAO02B,QAASx6B,EAAI8D,UAAY,UAASoiC,kBAAzC,SAAwE1wB,IACxE,sBAAK1R,UAAY,UAASqiC,GAAiB,GAAKD,IAAhD,SACE,uBAAKliC,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,OAA9C,UACE,yBACEj3B,GAAIA,EACJL,KAAK,wBACLmE,UAAU,eACV/I,MAAOA,EACP8c,SAAUA,EACV7T,MAAO,CAAEhT,MAAO,KANlB,SAOEw1C,IACF,eAACjY,GAAA,EAAD,CAAQjC,KAAK,KAAK1b,QAAS+qB,EAAc33B,MAAO,CAAE2R,WAAY,IAA9D,SACE,oBAAG7R,UAAWI,GAAKiiF,kBClBzBmI,GAAsD,CAC1D9vE,MAAO,gCACPoM,UAAW,oCACXC,SAAU,mCACVmuD,aAAc,uCACdE,YAAa,sCACbqV,SAAU,mCACVC,OAAQ,iCACRC,SAAU,mCACVC,OAAQ,iCACRj5E,KAAM,+BACNtE,GAAI,6BACJ7b,KAAM,+BACNR,WAAY,qCACZM,MAAO,gCACPu5F,UAAW,oCACXC,QAAS,kCACTC,QAAS,kCACTC,MAAO,gCACP7yF,KAAM,+BACNiE,KAAM,+BACNyF,SAAU,mCACVE,KAAM,+BACND,QAAS,iCACT6rB,YAAa,qCACbC,oBAAqB,4CACrBke,QAAS,kCACTm/C,SAAU,mCACVC,OAAQ,iCACRC,SAAU,mCACV92E,QAAS,kCACT+2E,OAAQ,iCACR9yD,UAAW,oCACXjnC,SAAU,mCACVg6F,OAAQ,iCACRrpB,WAAY,qCACZC,SAAU,mCACVqpB,QAAS,kCACTta,OAAQ,iCACRua,MAAO,gCACPC,MAAO,gCACPC,WAAY,qCACZC,QAAS,kCACTC,MAAO,gCACPlgE,OAAQ,iCACRo1C,KAAM,+BACN+qB,IAAK,8BACLloB,KAAM,+BACNhwD,IAAK,8BACLsc,KAAM,+BACN67D,SAAU,mCACV3yE,QAAS,kCACTld,YAAa,sCACb2F,SAAU,mCACVC,QAAS,kCACTusE,WAAY,qCACZ2d,UAAW,oCACXC,YAAa,sCACbxwF,QAAS,kCACThK,QAAS,kCACT01C,QAAS,kCACT+kD,SAAU,mCACV/oF,SAAU,oCAONgpF,GAAmE,CACvE53E,QAAS,CACPyjB,OAAQ,6CACRo0D,WAAY,iDACZnE,MAAO,CACL,KAAQ,gDACR,QAAW,mDACX,OAAU,kDACV,UAAa,qDACb,SAAY,oDACZ,UAAa,qDACb,KAAQ,gDACR,MAAS,iDACT,MAAS,iDACT,KAAQ,gDACR,OAAU,qDAiChB,MAAMoE,GAAgF,CACpF1gE,OAAQ,CACN2gE,IAAK,qBACLC,KAAM,cACNC,OAAQ,gBACRC,UAAW,oBAEb5+D,YAAa,CACXwE,IAAK,qBACLq6D,SAAU,sBACVC,SAAU,uBAEZ7+D,oBAAqB,CACnBuE,IAAK,qBACLu6D,QAAS,wBACTC,WAAY,2BACZC,SAAU,0BAEZC,aAAc,CACZC,KAAM,aACNC,QAAS,gBACT3B,OAAQ,eACR4B,UAAW,kBACXC,SAAU,iBACVC,UAAW,kBACXC,KAAM,aACNC,MAAO,cACP99F,MAAO,sCACP+9F,KAAM,aACNC,OAAQ,gBAEVtc,OAAQ,CACNob,IAAK,qBACL,SAAY,6BACZ,iBAAkB,kCAClB,YAAa,6BACb,cAAe,+BACf,WAAc,+BACd,iBAAkB,kCAClB,SAAY,6BACZ,qBAAsB,sCAExBjB,SAAU,CACRiB,IAAK,qBACLmB,YAAa,6BACbC,SAAU,0BACVC,UAAW,2BACXC,WAAY,4BACZC,MAAO,wBAET39D,KAAM,CACJo8D,IAAK,qBACLwB,KAAM,qBACN91F,QAAS,wBACTwzD,SAAU,0BAEZuiC,oBAAqB,CACnBzB,IAAK,qBACL0B,UAAW,wCACX3zE,WAAY,wCAEdg0D,WAAY,CACVie,IAAK,qBACLkB,OAAQ,oBACRS,QAAS,sBAEXxyF,QAAS,CACP6wF,IAAK,cACL4B,WAAY,mBACZC,OAAQ,iBACRC,UAAW,oBACXC,QAAS,kBACTC,mBAAoB,4BACpBC,SAAU,mBACVC,uBAAwB,cACxBvQ,SAAU,oBAEZwQ,0BAA2B,CACzBC,iBAAkB,0CAClBC,QAAS,kCACTC,UAAW,mCACXC,KAAM,gCAERC,MAAO,CACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,WAEPr9F,QAAS,CACP,IAAO,sBAET0V,SAAU,CACR,QAAW,mBACX,OAAU,kBACV,MAAS,iBACT,QAAW,mBACX,OAAU,kBACV,UAAa,qBACb,OAAU,kBACV,MAAS,iBACT,WAAc,sBACd,YAAe,uBACf,OAAU,oBAId,SAAS4nF,GAAcziF,GACrB,OAAO/Y,EAAEm3F,GAAiBp+E,EAAMvQ,QAAUuQ,EAAMvQ,KAY3C,SAASizF,GAAqB1iF,GACnC,OAAQA,EAAMjU,MACZ,IAAK,OACH,OAAO42F,GAAkB3iF,GAC3B,IAAK,WACH,OAAO4iF,GAAsB5iF,GAC/B,IAAK,UACH,OAAO6iF,GAAqB7iF,GAC9B,IAAK,OACH,OAAO8iF,GAAkB9iF,GAC3B,IAAK,WACH,OAAO+iF,GAAsB/iF,GAO/B,QACE,OAAOgjF,GALT,IAAK,SACH,OAAOC,GAAoBjjF,GAC7B,IAAK,aACH,OAAOkjF,GAAgBljF,IAM7B,MAAMgjF,GAAcrvF,GAAsB,yBAEpCgvF,GAAqB3iF,GACjBrM,GAKJ,eAACwvF,GAAD,CACEnjF,MAAOA,EACPnV,MAAQ8I,EAAM9I,OAAS,CAAEA,MAAO,GAAIuV,KAAMjB,GAASkB,MACnDsH,SAPkB9c,GACpB8I,EAAMgU,SAAS3H,EAAMvQ,KAAM5E,GAOzBP,MAAOE,EAAoBmJ,EAAM08B,OAAOrwB,EAAMvQ,SAYhD0zF,GAA8BxvF,IAClC,MAAM,MAAEqM,EAAF,MAASnV,EAAT,MAAgBP,EAAhB,SAAuBqd,GAAahU,EACpC2R,EAAQmE,mBAAQ,IAAMg5E,GAAcziF,IAAQ,CAACA,IAE7ClQ,EAAKskC,GAAa,SAKxB,OACE,uBAAKxgC,UAAU,iBAAiBE,MAAO,CAAEuU,SAAU,KAAnD,UACE,yBAAOiiB,QAASx6B,EAAI8D,UAAY,yBAAhC,UAA0D0R,EAA1D,OACA,uBAAK1R,UAAU,WAAf,UACE,eAACwvF,GAAD,CACEtzF,GAAIA,EACJL,KAAMuQ,EAAMvQ,KACZuQ,MAAOA,EACPnV,MAAOA,EACPP,MAAOA,EACPqd,SAAUA,IAEXrd,GAAS,sBAAKsJ,UAAU,mBAAmBE,MAAO,CAAEgzB,QAAS,WAApD,SAAkEx8B,OAE9E,sBAAKsJ,UAAU,WAAf,SACG/I,EAAMuV,OAASjB,GAASkkF,SACvB,yBAAQz+E,UAAQ,EAAChR,UAAU,eAA3B,SACE,yBAAQ/I,MAAM,WAAd,SAA0B5D,EAAE,+BAG9B,0BAAQ4D,MAAOA,EAAMuV,KAAMxM,UAAU,eAAe+T,SAxBjC/lB,IACzB+lB,EAAS,CAAE9c,MAAOA,EAAMA,MAAOuV,KAAMxe,EAAEkiB,cAAcjZ,SAuB/C,UACE,yBAAQA,MAAOsU,GAASkB,KAAxB,SAA+BpZ,EAAE,yBACjC,yBAAQ4D,MAAOsU,GAASmkF,KAAxB,SAA+Br8F,EAAE,yBACjC,yBAAQ4D,MAAOsU,GAASokF,SAAxB,SAAmCt8F,EAAE,6BACrC,yBAAQ4D,MAAOsU,GAAS2X,SAAxB,SAAmC7vB,EAAE,6BACrC,yBAAQ4D,MAAOsU,GAAS9D,MAAxB,SAAgCpU,EAAE,0BAClC,yBAAQ4D,MAAOsU,GAASqkF,SAAxB,SAAmCv8F,EAAE,sCAgB3Cm8F,GAAmCzvF,IACvC,MAAM,GAAE7D,EAAF,KAAML,EAAN,MAAYuQ,EAAZ,MAAmBnV,EAAnB,MAA0BP,EAA1B,SAAiCqd,GAAahU,EAE9CmhC,EAAaxqC,EAAQ,0BAA4B,eACjDm5F,EAAsB7hG,IAC1B+lB,EAAS,CACP9c,MAAOjJ,EAAEkiB,cAAcjZ,MACvBuV,KAAMvV,EAAMuV,OAASjB,GAASkkF,SAAWK,EAAW74F,EAAMuV,SAGvDlb,EAAOwlE,GAAY3/D,wBAA0B5I,IAC7C8C,EAAUmzE,GAAertE,wBAA8B5I,IACvDuhG,EAAUC,GAAe54F,mBAAmBF,EAAMuV,MAEzD,GAA2B,UAAvBJ,EAAM4jF,aAA0B,CAClC,MAAMC,EAAuB3+F,IAC3BwlE,EAASxlE,GACTy+F,EAAY94F,EAAMuV,MAClBuH,EAAS,CACP9c,MAAO3F,EAAMuK,KACb2Q,KAAMjB,GAASkkF,SACfvzF,GAAI5K,EAAM4K,MAGd,OACE,eAAC,GAAD,CACEjF,MAAOA,EAAMA,MACb3F,MAAOA,EACPyiB,SAAUmwB,GAAKnwB,EAAS,CAAE9c,MAAOitC,EAAG13B,KAAMvV,EAAMuV,OAChDtM,MAAO,CAAEhT,MAAO,QAChBohD,WAAY2hD,EACZ1+B,WAAYt6D,EAAMuV,OAGjB,GAA2B,aAAvBJ,EAAM4jF,aAA6B,CAC5C,MAAME,EAA0B7+F,IAC9BmzE,EAAYnzE,GACZ0+F,EAAY94F,EAAMuV,MAClBuH,EAAS,CACP9c,MAAO5F,EAASwK,KAChB2Q,KAAMjB,GAASkkF,SACfvzF,GAAI7K,EAASsK,OAGjB,OACE,eAAC,GAAD,CACE1E,MAAOA,EAAMA,MACb5F,SAAUA,EACV0iB,SAAUmwB,GAAKnwB,EAAS,CAAE9c,MAAOitC,EAAG13B,KAAMvV,EAAMuV,OAChD8hC,WAAY4hD,EACZ3+B,WAAYt6D,EAAMuV,OAItB,OACE,wBACEtQ,GAAIA,EACJL,KAAMA,EACN1D,KAAK,OACL6H,UAAWkhC,EACXjqC,MAAOA,EAAMA,MACb8c,SAAU87E,KAMZb,GAAyB5iF,IAC7B,MAAMsF,EAAQm9E,GAAcziF,GAC5B,OAAQrM,GAGJ,eAAC84C,GAAD,CACEnnC,MAAOA,EACPza,MAAQ8I,EAAM9I,QAAS,EACvB8c,SALcR,GAAqBxT,EAAMgU,SAAS3H,EAAMvQ,KAAM0X,GAM9D7c,MAAOE,EAAoBmJ,EAAM08B,OAAOrwB,EAAMvQ,UAMhDozF,GAAwB7iF,IAC5B,MAAMsF,EAAQm9E,GAAcziF,GAC5B,OAAQrM,GAGJ,eAACuiC,GAAD,CACEzmC,KAAMuQ,EAAMvQ,KACZ6V,MAAOA,EACP0wB,aAAc,EACdC,aAAc,EACdprC,MAAQ8I,EAAM9I,OAAS,KACvB8c,SARc9c,GAAkB8I,EAAMgU,SAAS3H,EAAMvQ,KAAM5E,GAS3DsV,QAASy6B,GACTtwC,MAAOE,EAAoBmJ,EAAM08B,OAAOrwB,EAAMvQ,OAC9CqE,MAAO,CAAEuU,SAAU,QAMrBy6E,GAAqB9iF,IACzB,MAAMsF,EAAQm9E,GAAcziF,GAC5B,OAAQrM,GAGJ,eAAC6jC,GAAD,CACE/nC,KAAMkE,EAAMlE,KACZ6V,MAAOA,EACP0wB,aAAc,EACdnrC,MAAQ8I,EAAM9I,OxJvdG,CAASyR,IAAK,GAAIC,MAAO,GAAIC,KAAM,IwJwdpDmL,SAPc9c,GAA0B8I,EAAMgU,SAAS3H,EAAMvQ,KAAM5E,GAQnEiJ,MAAO,CAAEuU,SAAU,QAMrB06E,GAAyB/iF,IAC7B,MAAMsF,EAAQm9E,GAAcziF,GAC5B,OAAQrM,GAGJ,eAACkqF,GAAD,CACEpuF,KAAMkE,EAAMlE,KACZ6V,MAAOA,EACPza,MAAQ8I,EAAM9I,OFveO,CAASyR,IAAK,GAAIC,MAAO,GAAIC,KAAM,GAAIyD,KAAM,GAAIC,OAAQ,IEwe9EyH,SANc9c,GAA8B8I,EAAMgU,SAAS3H,EAAMvQ,KAAM5E,GAOvEiJ,MAAO,CAAEuU,SAAU,QAM3B,SAAS07E,GAAqB7lF,EAAerT,GAC3C,MAAM3D,GAAiC64F,GAAwB7hF,IAAU,IAAIrT,GAC7E,OAAO3D,EAAMD,EAAEC,GAAO2D,EAExB,MAAMo4F,GAAuBjjF,IAC3B,MAAMsF,EAAQm9E,GAAcziF,GACtBgkF,EAAShkF,EAAMgkF,QAAU,GACzB7jF,EAAUH,EAAMG,QAAQ5B,KAAIqJ,GAChC,yBAAqB/c,MAAO+c,EAA5B,SAAqCo8E,EAAOp8E,IAAWm8E,GAAqB/jF,EAAMvQ,KAAMmY,IAA3EA,KAEf,OAAQjU,GAGJ,eAACuiC,GAAD,CACEzmC,KAAMuQ,EAAMvQ,KACZ6V,MAAOA,EACPza,MAAQ8I,EAAM9I,OAASmV,EAAMG,QAAQ,GACrCwH,SANc9c,GAAkB8I,EAAMgU,SAAS3H,EAAMvQ,KAAM5E,GAO3DwrC,eAAgBl2B,EAChB61B,aAAc,EACdC,aAAc,EACdniC,MAAO,CAAEuU,SAAU,QAMrB66E,GAAmBljF,IACvB,MAAMikF,EArZR,SAA6BjkF,GAC3B,MAAM5Q,EAAcywF,GAAuB7/E,EAAMvQ,MACjD,GAAIL,EAAa,CACf,MAAMusF,EAAmC,GAIzC,OAHA37E,EAAM27E,MAAM57E,SAAQhU,GAAQ4vF,EAAM5vF,EAAK0D,MAAQL,EAAYusF,MAAM5vF,EAAK0D,MAClExI,EAAEmI,EAAYusF,MAAM5vF,EAAK0D,OACzB1D,EAAK0D,OACF,CACLi8B,OAAQzkC,EAAEmI,EAAYs8B,QACtBo0D,WAAY74F,EAAEmI,EAAY0wF,YAC1BnE,SAEG,CACL,MAAMA,EAAmC,GAGzC,OAFA37E,EAAM27E,MAAM57E,SAAQhU,GAAQ4vF,EAAM5vF,EAAK0D,MAAQ1D,EAAK0D,OAE7C,CACLi8B,OAAQ1rB,EAAMvQ,KACdqwF,WAAY9/E,EAAMvQ,KAAO,KACzBksF,UAkYeuI,CAAoBlkF,GACjC6hC,EAAc7hC,EAAM27E,MAAMp9E,KAAIxS,IAAI,CAAOlB,MAAOkB,EAAK0D,KAAM+G,MAAOzK,EAAK0D,SAC7E,OAAQkE,GACN,eAACwwF,GAAD,CACE/0F,YAAa60F,EACbjkF,MAAOA,EACPnV,MAAO8I,EAAM9I,OAAiD,GAC9DwlC,OAAQ18B,EAAM08B,OAAOrwB,EAAMvQ,OAA+B,GAC1DoyC,YAAaA,EACbl6B,SAAUhU,EAAMgU,SAChBy8E,iBAAkBzwF,EAAMywF,oBAcxBD,GAA4BxwF,IAChC,MAAM,YAAEvE,EAAF,MAAe4Q,EAAf,MAAsBnV,EAAtB,YAA6Bg3C,EAA7B,SAA0Cl6B,EAA1C,OAAoD0oB,EAApD,iBAA4D+zD,GAAqBzwF,EAEjF0wF,EAAyB,CAAC53F,EAAegD,EAAc60F,KAC3D,MAAMl1E,EAAUvkB,EAAM4B,GAChB83F,EAAYpmF,OAAOC,OAAO,GAAIgR,EAAQtP,OAAQ,CAAE,CAACrQ,GAAO60F,IACxDE,EAAa,CAAEz4F,KAAMqjB,EAAQrjB,KAAM+T,OAAQykF,GAC3C3/B,EAAW/5D,EAAM0T,KAAI,CAAChU,EAAGya,IAAMA,IAAMvY,EAAQ+3F,EAAaj6F,IAChEod,EAAS3H,EAAMvQ,KAAMm1D,KAEhB74D,EAAM83C,GAAW94C,mBAAS82C,EAAY,GAAGh3C,OAY1C45F,EAAgBh4F,IACpB,MAAMm4D,EAAW/5D,EAAM2V,QAAO,CAACjW,EAAGya,IAAMA,IAAMvY,IAC9Ckb,EAAS3H,EAAMvQ,KAAMm1D,IAEvB,OAAO,uCACJ/5D,EAAM0T,KAAI,CAAC1T,EAAO4B,IACjB,eAACi4F,GAAD,CAEEh5D,OAAQt8B,EAAY0wF,WAAa1wF,EAAYusF,MAAM9wF,EAAMkB,MACzDiU,MAAOA,EACPnV,MAAOA,EACP4B,MAAOA,EACP4jC,OAAQA,EAAO5jC,IAAU,GACzBkb,SAAU08E,EACVM,SAAUF,GAPLh4F,KAUT,8BAAK2C,EAAYs8B,SACf04D,GAAoBA,EAAiBpkF,GAtBdjU,IACzB,MAAM64D,EAAW,IAAI/5D,EAAO,CAAEkB,OAAM+T,OAAQ,KAC5C6H,EAAS3H,EAAMvQ,KAAMm1D,OAqBnB,eAACu5B,GAAD,CACE74E,MAAOlW,EAAY0wF,WACnBj1F,MAAOkB,EACP4b,SAjCqB/lB,IACzBiiD,EAAQjiD,EAAEkiB,cAAcjZ,QAiCpBsV,QAAS0hC,EACTpW,aAhCmB,KACvB,MAAMm5B,EAAW,IAAI/5D,EAAO,CAAEkB,OAAM+T,OAAQ,KAC5C6H,EAAS3H,EAAMvQ,KAAMm1D,UA6CnB8/B,GAAwB/wF,IAC5B,MAAM,OAAE+3B,EAAF,MAAU1rB,EAAV,MAAiBnV,EAAjB,MAAwB4B,EAAxB,SAA+Bkb,EAA/B,SAAyCg9E,EAAzC,OAAmDt0D,GAAW18B,EAC9D5H,EAAOlB,EAAMkB,KAEb+T,EAA+C2J,mBAAQ,KAC3D,MAAMm7E,EAAa5kF,EAAM27E,MAAMr5F,MAAKiwD,GAAKA,EAAE9iD,OAAS1D,IACpD,OAAK64F,EAGEA,EAAW9kF,OAAOvB,KAAIyG,GAAK,CAACA,EAAG09E,GAAqB19E,MAFlD,KAGR,CAAChF,EAAOjU,IACLwqC,EAAe,CAAC9mC,EAAc5E,KAClC8c,EAASlb,EAAOgD,EAAM5E,IAGxB,OAAO,uBAAK+I,UAAU,uBAAf,UACL,gCAAK83B,EAAL,IAAa,oBAAG93B,UAAWI,GAAK42B,YAAa92B,MAAO,CAAE6R,MAAO,OAAQtC,OAAQ,WAAa3C,QAFvE,IAAMikF,EAASl4F,QAGlC,sBAAKmH,UAAU,8BAAf,SACGkM,EAAOvB,KAAI,EAAEyB,EAAO6kF,KACnB,eAACA,EAAD,CAEEp1F,KAAMuQ,EAAMvQ,KACZ5E,MAAOA,EAAMiV,OAAOE,EAAMvQ,MAC1BkY,SAAU4uB,EACVlG,OAAQA,GAJHrwB,EAAMvQ,cC7mBRq1F,GAAuBnxF,IAClC,MAAM,KAAEoe,EAAF,KAAQlS,EAAR,OAAcwwB,EAAd,kBAAsB00D,EAAtB,iBAAyCX,GAAqBzwF,EAC9DmM,EAA+C2J,mBACnD,IAAM5J,EAAKC,OAAOvB,KAAIyB,GAAS,CAACA,EAAO0iF,GAAqB1iF,OAC5D,CAACH,IAEGwkF,EAAyB,CAAC50F,EAAc5E,KAC5C,MAAMm6F,EAAe7mF,OAAOC,OAAO,GAAI2T,EAAM,CAAE,CAACtiB,GAAO5E,IACvDk6F,EAAkBC,IAEpB,OACE,+BACGllF,EAAOvB,KAAI,EAAEyB,EAAO6kF,KACnB,eAACA,EAAD,CAEEh6F,MAAOknB,EAAK/R,EAAMvQ,MAClBA,KAAMuQ,EAAMvQ,KACZkY,SAAU08E,EACVh0D,OAAQA,EACR+zD,iBAAkBA,GALbpkF,EAAMvQ,WCtBd,MAAMw1F,GAMXp1F,YACEC,EACA0G,EACAkL,EACAvB,GACC,KAVHrQ,QAUE,OATF0G,WASE,OARFkL,YAQE,OAPFvB,aAOE,OAiBFwB,KAAO,CAACC,EAAMC,IACLrgB,KAAK0jG,gBAAgBtjF,GAAKpgB,KAAK0jG,gBAAgBrjF,GAjBtDrgB,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAKkgB,OAASA,EACdlgB,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsBhB,GAGzD4B,OAAOC,EAASrO,GACd,MAAM9I,EAAQrJ,KAAKkgB,OAAOM,GAC1B,OAAO,wBAAsBrO,EAAtB,cAAwCxR,IAAV0I,EAAsB,MAAQA,GAAnDrJ,KAAKsO,IAGvBo1F,gBAAgBljF,GACd,MAAMnX,EAAQrJ,KAAKkgB,OAAOM,GAC1B,OAAOjb,IAAO8D,EAAO,kBAAkBs6F,QCf3C,MAAMC,GAAgD,CACpDC,WAAY,mBACZC,YAAa,kBACbC,KAAM,cACNC,KAAM,cACNC,YAAa,cACbC,MAAO,iBACPC,KAAM,gBACNC,KAAM,iBA6BR,MAAMC,GAMGh2F,YAAYqyC,GAAsD,KALzEpyC,QAKwE,OAJxE0G,WAIwE,OAHxE2J,aAGwE,OAFxE+hC,gBAEwE,OAexEvgC,KAAO,CAACC,EAA6BC,IAAgC,EAdnErgB,KAAKsO,GAAK,WACVtO,KAAKgV,MAAQ,IACbhV,KAAK2e,QAAUgB,GACf3f,KAAK0gD,WAAaA,EAGpBngC,OAAOC,EAAgCrO,EAAmBxH,GACxD,MAAM2D,EAAKkS,EAAKzS,IACV4X,EAAUhb,EAAMzF,SAASoJ,GAC/B,OAAO,wBAAQ6D,EAAR,SACL,eAACg5C,GAAD,CAAU78C,GAAI,UAAYA,EAAIjF,MAAOsc,EAASQ,SAAUR,GAAW3lB,KAAK0gD,WAAWpyC,EAAIqX,QAOtF,MAAM2+E,GAKTj2F,YACEC,EACA0G,EACA2J,GACC,KARHrQ,QAQE,OAPF0G,WAOE,OANF2J,aAME,OAyBFwB,KAAO,CAACC,EAA6BC,KACnC,MAAM9D,EAAS6D,EAAEpgB,KAAKsO,IAChBkO,EAAS6D,EAAErgB,KAAKsO,IACtB,OAAIiO,EAAOvB,OAASwB,EAAOxB,KAClBuB,EAAOvB,KAAOwB,EAAOxB,KACrBuB,EAAOxB,QAAUyB,EAAOzB,MACxBwB,EAAOxB,MAAQyB,EAAOzB,MAEtBwB,EAAOzB,IAAM0B,EAAO1B,KAhC7B9a,KAAKsO,GAAKA,EACVtO,KAAKgV,MAAQA,EACbhV,KAAK2e,QAAUhC,OAAOC,OAAO,GAAI+C,GAAsBhB,GAGzDmC,SAASN,GACP,MAAMnX,EAAQmX,EAAKxgB,KAAKsO,IACxB,GAAkB,IAAdjF,EAAMyR,KAA6B,IAAhBzR,EAAM0R,OAA8B,IAAf1R,EAAM2R,KAChD,MAAO,GAKT,MAAQ,GAHkB,IAAd3R,EAAMyR,IAAY,IAAMzR,EAAMyR,OACZ,IAAhBzR,EAAM0R,MAAc,IAAM1R,EAAM0R,SAClB,IAAf1R,EAAM2R,KAAa,IAAM3R,EAAM2R,OAI9CuF,OAAOC,EAAgCrO,GACrC,MAAM9I,EAAQrJ,KAAK8gB,SAASN,GAI5B,YAHc7f,IAAV0I,IACF8I,EAAMC,UAAY0M,GAAQ2B,KAAOC,QAASvO,EAAMC,YAE3C,wBAAsBD,EAAtB,cAAwCxR,IAAV0I,EAAsB,MAAQA,GAAnDrJ,KAAKsO,KAgBpB,MAAMi2F,GAA8BpyF,IACzC,MAAM,OAAEtO,EAAF,QAAUwnC,EAAV,UAAmBm5D,EAAnB,WAA8B9jD,GAAevuC,EAE7CnP,EAzFR,SAAiBa,GACf,OAAQA,EAAO4gG,aACb,IAAK,SACH,MAAO,SACT,IAAK,QACH,MAAO,QACT,IAAK,WACH,MAAO,WACT,IAAK,cACH,MAAO,cACT,QACE,MAAO,UA8EEC,CAAQ7gG,GACfyiB,EAAU2B,mBAAQ,KACtB,MAAM08E,EAAiD9gG,EAAOyiB,QAAQvJ,KAAIwH,IACxE,MAAMvP,EAxGZ,SAAwBA,GACtB,MAAM4vF,EAAiBhB,GAAa5uF,GACpC,OAAO4vF,EAAiBn/F,EAAEm/F,GAAkB5vF,EAsG1B6vF,CAAetgF,EAAOvP,OACpC,MAAoB,SAAhBuP,EAAOha,KACF,IAAI+5F,GAAW//E,EAAO7H,MAAO1H,GACX,cAAhBuP,EAAOha,KACT,IAAIk5F,GACTl/E,EAAO7H,MACP1H,GACAwL,GAAQA,EAAK+D,EAAO7H,SAEG,SAAhB6H,EAAOha,KACT,IAAIwW,GAAqB,OAAQtb,EAAE,4BAA4BnC,IACpE,MAAM+xE,EAAgB/xE,EAAOgkF,aAAe,KAAOhkF,EAAOgkF,aAAe,IAAM,GACzEhS,EAAehyE,EAAOkkF,YAAc,KAAOlkF,EAAOkkF,YAAc,IAAM,GAC5E,OACE,kCACE,0BAAQp1E,UAAWqO,KAAO80D,WAA1B,UAAuCjyE,EAAO61B,SAAUm8C,KACxD,wBACA,wBAAMljE,UAAWqO,KAAO80D,WAAxB,UAAqCjyE,EAAO41B,UAAWm8C,UAG1D,CAAEz1D,UAAU,EAAMG,WAAW,IAAQ,CAACK,EAAGC,IAAOD,EAAEnS,KAAgBqS,cAAcD,EAAEpS,QAC5D,eAAhBsW,EAAOha,KACT,IAAIwW,GAAqBwD,EAAO7H,MAAO1H,GAAO1R,IACnD,MAAMkL,EAAQlL,EAAOwhG,OAAe,GACpC,OAAO,uCACJvnE,GAAoBj6B,EAAOi7B,YAA4B,IAAMd,GAAqBn6B,EAAOm7B,aAC1F,wBACCjwB,GAAS,IAAGA,MAAUlL,EAAOo7B,WAAaj5B,EAAE,qBAAuB,SAIjE,IAAIwa,GACTsE,EAAO7H,MACP1H,GACAwL,GAAQA,EAAK+D,EAAO7H,YAO1B,OAHI7Y,EAAOud,SAAWvd,EAAOud,QAAQvhB,OAAS,GAC5C8kG,EAAK/yF,KAAK,IAAIyyF,GAAa3jD,IAErB78C,EAAO4gG,aACb,IAAK,SACHE,EAAK/yF,KAAK,IAAI2P,GAAmB,UAAW9b,EAAE,yBAAyBnC,GAAU,CAC/E,CAAE+O,KAAMG,GAAKu5B,KAAMzhC,KAAMoK,GAAOuC,WAAY0K,UAAWre,EAAOyK,SAEhE,MACF,IAAK,QACH42F,EAAK/yF,KAAK,IAAI2P,GAAmB,UAAW9b,EAAE,yBAAyB/B,GAAS,CAC9E,CAAE2O,KAAMG,GAAKu5B,KAAMzhC,KAAMoK,GAAO8C,UAAWmK,UAAWje,EAAMqK,SAE9D,MACF,IAAK,WACH42F,EAAK/yF,KAAK,IAAI2P,GAAmB,UAAW9b,EAAE,yBAAyBhC,GAAY,CACjF,CAAE4O,KAAMG,GAAKu5B,KAAMzhC,KAAMoK,GAAOqC,aAAc4K,UAAWle,EAASsK,SAEpE,MACF,IAAK,cACH42F,EAAK/yF,KAAK,IAAI2P,GAAmB,UAAW9b,EAAE,yBAAyB6qD,GAAS,CAC9E,CAAEj+C,KAAMG,GAAKu5B,KAAMzhC,KAAMoK,GAAOwC,gBAAiByK,UAAW2uC,EAAMviD,SAIxE,OAAO42F,IACN,CAAC9gG,KAEGyG,EAAMgmF,GAAW/mF,mBAAS,IAC1Bgd,EAAYkqE,GAAiBlnF,mBAAS+c,EAAQ,GAAGhY,KACjDkY,EAAekqE,GAAoBnnF,mBAAS8a,GAAcyC,IAK3Di+E,EAAa98E,mBACjB,IAAMQ,GAAUnC,EAASziB,EAAOnD,KAAM6lB,EAAYC,IAClD,CAAC3iB,EAAQyiB,EAASC,EAAYC,IAE1BkB,EAAcO,mBAAQ,KAC1B,IAAI+8E,EACJ,OAAQnhG,EAAO4gG,aACb,IAAK,SACH,OAAQjkF,GAAmC6qB,EAAQz5B,KAAK,YAAc4O,EAAKzS,KAC7E,IAAK,QACH,OAAQyS,GAAmC6qB,EAAQz5B,KAAK,WAAa4O,EAAKzS,KAC5E,IAAK,WACH,OAAQyS,GAAmC6qB,EAAQz5B,KAAK,cAAgB4O,EAAKzS,KAEjF,OAAOi3F,IACN,CAACnhG,EAAQwnC,EAASqV,IAErB,OACE,eAACp5B,GAAD,CACEC,eAAgBw9E,EAAWr2D,MAAa,GAAPpkC,EAAkB,GAAPA,EAAY,IACxDgc,QAASA,EACTqB,cAAe2oE,EACf1oE,cA1BsB,CAACrD,EAAgBmmB,KACzC+lD,EAAclsE,GACdmsE,EAAiBhmD,IAyBfhjB,YAAaA,EAEbnB,WAAYA,EACZC,cAAeA,EACflc,KAAMA,EACNoY,SAAU,GACVD,WAAY5e,EAAOnD,KAAKb,OACxBmD,KAAMA,EACN2H,MAAO65F,KC3MPS,GAAgB9yF,IACpB,MAAM,UAAEqyF,EAAF,QAAapjF,EAAb,UAAsB8jF,GAAc/yF,GACnCkP,EAAQ8jF,GAAa57F,mBAAS,IACrC8b,qBAAU,KACJjE,EAAQvhB,OAAS,IAAMuhB,EAAQlc,SAASmc,IAC1C8jF,EAAU/jF,EAAQ,MACnB,CAACA,EAASC,IAEb,MAEM+jF,EAAkBn9E,mBAAQ,IAAM7G,EAAQrE,KAAIsE,GAChD,yBAAqBhY,MAAOgY,EAA5B,SAAqCA,GAAxBA,MACX,CAACD,IAEL,OACE,uBAAK9O,MAAO,CAAEgzB,QAAS,OAAQC,cAAe,MAAOiF,WAAY,UAAjE,UACE,sBAAIp4B,UAAU,aAAaE,MAAO,CAAE+yF,WAAY,SAAUnhF,YAAa,IAAvE,UAAmG,IAArBsgF,EAAU3kG,OAAe,OAAS2kG,EAAU3kG,OAA1H,eACA,yBACEuS,UAAU,eACV/I,MAAOgY,EACP8E,SAAU/lB,GAAK+kG,EAAU/kG,EAAEkiB,cAAcjZ,OAH3C,SAKG+7F,IAEH,eAACvoE,GAAA,EAAD,CAAQ3d,QAhBU,IAAMgmF,EAAU7jF,GAgBF/O,MAAO,CAAE+rC,aAAc,EAAGp6B,WAAY,IAAtE,qBAkBS,MAAMqhF,WAA6Bz/D,GAChDx3B,YAAY8D,GACV0oB,MAAM1oB,GADsB,KAmE9BozF,sBAAyBnlG,IACvBJ,KAAKwlG,YAAYplG,EAAEkiB,cAAcjZ,QApEL,KAuE9Bo8F,sBAAyBrlG,IACvB,MAAMyd,EAAW7d,KAAK0lG,cACjB7nF,GAGL7d,KAAK2lG,YAAY9nF,EAAUzd,EAAEkiB,cAAcjZ,QA5Ef,KA+E9Bu8F,uBAA0Br1E,IACxBvwB,KAAKo7B,SAAS,CAAE7K,UAhFY,KAmF9Bs1E,qBAAuB,KACrB,MAAM,iBAAEC,EAAF,KAAoBv1E,GAASvwB,KAAK2K,MACnCm7F,GAGLxhE,GAAIhU,iBAAiBw1E,EAAiB73F,KAAMsiB,GAAM1F,MAAKhnB,IAC/B,OAAlBA,EAAOqC,OAKXlG,KAAK8lC,QAAQxB,GAAI7T,aAAaq1E,EAAiB73F,KAAMsiB,GAAO9qB,EAAE,kCAC3DolB,MAAKhnB,GAAU7D,KAAKo7B,SAAS,CAAEv3B,SAAQ2gG,UAAW,OALnDxkG,KAAKo7B,SAAS,CAAEyT,OAAQhrC,EAAOnD,MAAQ,SA1Ff,KAmG9BqlG,0BAA4B,KAC1B,MAAM,iBAAED,EAAF,KAAoBv1E,GAASvwB,KAAK2K,MACnCm7F,GAGLxhE,GAAIhU,iBAAiBw1E,EAAiB73F,KAAMsiB,GAAM1F,MAAKhnB,IACrD,GAAsB,OAAlBA,EAAOqC,OAAX,CAKA,IAAI8/F,EAAY,CACZl4D,OAAQ,UACRpjB,OAAQ,kBACR7T,OAAQmT,KAAKQ,UAAU,CACrBjB,MAAO+a,GAAI/a,MACXtb,KAAM63F,EAAiB73F,KACvBuiB,UAAWD,KAGbxH,EAAMub,GAAIvb,IAAM,IAAM9pB,IAAE2G,MAAMogG,GAClC3mG,OAAO83D,KAAKpuC,EAAK,eAdf/oB,KAAKo7B,SAAS,CAAEyT,OAAQhrC,EAAOnD,MAAQ,SA1Gf,KA4H9B2iE,eAAiB,CAAC/0D,EAAYkW,KAC5B,MAAMyhF,EAAezhF,EACjB,IAAIxkB,KAAK2K,MAAM65F,UAAWl2F,GAC1BtO,KAAK2K,MAAM65F,UAAUxlF,QAAOjW,GAAKA,IAAMuF,IAC3CtO,KAAKo7B,SAAS,CAAEopE,UAAWyB,KAhIC,KAmI9BC,oBAAsBt6D,UACpB,MAAM,iBAAEk6D,EAAF,UAAoBtB,GAAcxkG,KAAK2K,MACxCm7F,UAGCxhE,GAAI5T,YAAYo1E,EAAiB73F,KAAMoT,EAAQmjF,GACrDxkG,KAAKo7B,SAAS,CAAEopE,UAAW,OAtI3BxkG,KAAK2K,MAAQ,CACXL,KAAM,CACJgE,GAAIoG,GAAOkE,iBACXvG,KAAMG,GAAK2zF,SACXnxF,MAAOvP,EAAE,gCAGX2gG,WAAY,GACZC,gBAAiB,GACjBC,gBAAiB,GACjBC,iBAAkB,GAClBh2E,KAAM,GACNse,OAAQ,GAER21D,UAAW,IAIfr+D,cACEnmC,KAAK8lC,QAAQxB,GAAIlU,eAAgB3qB,EAAE,oCAChColB,MAAKu7E,IACJpmG,KAAKo7B,SAAS,CACZgrE,aACAC,gBAAiBD,EAAWrpF,KAAIc,GAC9B,yBAEExU,MAAOwU,EAASA,SAFlB,SAIGD,GAA+BC,EAASA,WAHpCA,EAASA,cAMjB,IAAM7d,KAAKwlG,YAAYY,EAAW,GAAGvoF,eAI9C6nF,cACE,MAAM,WAAEU,EAAF,iBAAcG,GAAqBvmG,KAAK2K,MAC9C,OAAOy7F,EAAWtlG,MAAK+c,GAAYA,EAASA,WAAa0oF,IAG3Df,YAAYgB,GACV,MAAM,WAAEJ,GAAepmG,KAAK2K,MACtBkT,EAAWuoF,EAAWtlG,MAAK4nB,GAAKA,EAAE7K,WAAa2oF,KAAiBJ,EAAW,GAC5EvoF,IAGL7d,KAAKo7B,SAAS,CACZmrE,iBAAkB1oF,EAASA,SAC3ByoF,gBAAiBzoF,EAAS4oF,UAAU1pF,KAAI2pF,GACtC,yBAAsBr9F,MAAOq9F,EAAGz4F,KAAhC,SAAuCy4F,EAAG1gE,aAA7B0gE,EAAGz4F,UAGpBjO,KAAK2lG,YAAY9nF,EAAUA,EAAS4oF,UAAU,GAAGx4F,OAGnD03F,YAAY9nF,EAAoC8oF,GAC9C,MAAMD,EAAK7oF,EAAS4oF,UAAU3lG,MAAK8lG,GAAKA,EAAE34F,OAAS04F,IACnD3mG,KAAKo7B,SAAS,CACZ0qE,iBAAkBY,EAClBn2E,KAAMnS,GAAoBsoF,GAC1B73D,OAAQ,KA6EZpI,gBACE,MAAM,QAAE4E,GAAYrrC,KAAKmS,OACnB,gBACJk0F,EADI,gBAEJC,EAFI,iBAGJC,EAHI,iBAIJT,EAJI,KAKJv1E,EALI,OAMJse,EANI,OAOJhrC,EAPI,UAQJ2gG,GACExkG,KAAK2K,MAET,OAAO,uCACL,eAACkgD,GAAD,CACEx4C,KAAMG,GAAKq0F,KACX7xF,MAAOvP,EAAE,mCACT6M,MAAO,CAAE+pB,UAAW,OAHtB,SAKE,gBAACqW,GAAA,EAAD,WACE,gBAACN,GAAA,EAAD,CAAKE,GAAI,EAAT,UACE,gCAAI,oBAAGlgC,UAAWI,GAAKU,UAAvB,IAAoCzN,EAAE,qCACtC,yBACE2M,UAAU,eACV/I,MAAOk9F,EACPpgF,SAAUnmB,KAAKulG,sBACf3qE,KAAM,EAJR,SAMGyrE,OAGL,gBAACj0D,GAAA,EAAD,CAAKE,GAAI,EAAT,UACE,gCAAI,oBAAGlgC,UAAWI,GAAKq0F,OAAvB,IAAiCphG,EAAE,qCACnC,yBACE2M,UAAU,eACV/I,MAAOy8F,EAAmBA,EAAiB73F,KAAO,GAClDkY,SAAUnmB,KAAKylG,sBACf7qE,KAAM,EAJR,SAMG0rE,OAGJR,GAAoB,eAAC1zD,GAAA,EAAD,CAAKE,GAAI,EAAT,SACnB,eAAC6hD,GAAD,CAAcn9C,QAAS8uD,EAAiB13F,qBAI9C,gBAACy8C,GAAD,CACEx4C,KAAMG,GAAKs0F,MACX9xF,MAAOvP,EAAE,oCAFX,UAIGqgG,GACC,eAACxC,GAAD,CACE/yE,KAAMA,EACNlS,KAAMynF,EACNj3D,OAAQA,EACR00D,kBAAmBvjG,KAAK4lG,yBAG5B,gBAACnqE,GAAD,WACE,eAACoB,GAAA,EAAD,CAAQ3d,QAASlf,KAAK+lG,0BAAtB,SACGtgG,EAAE,wCAEL,eAACo3B,GAAA,EAAD,CAAQ3d,QAASlf,KAAK6lG,qBAAtB,SACGpgG,EAAE,yCAIR5B,GACC,gBAACgnD,GAAD,CACEx4C,KAAMG,GAAK+4E,OACXv2E,MAAOvP,EAAE,iCACTmlD,QAAyB,UAAhB/mD,EAAO0G,WAAuC5J,IAAnBkD,EAAOud,SACzC,eAAC6jF,GAAD,CAAcT,UAAWA,EAAWpjF,QAASvd,EAAOud,SAAW,GAAI8jF,UAAWllG,KAAKkmG,sBAJvF,UAOmB,SAAhBriG,EAAO0G,MAAmB,6BAAI1G,EAAOmzC,UACrB,UAAhBnzC,EAAO0G,MACN,eAACg6F,GAAD,CACE1gG,OAAQA,EACRwnC,QAASA,EACTm5D,UAAWA,EACX9jD,WAAY1gD,KAAKqjE,wBClR/B,MAAMznD,GAAuB,CAC3B,CACElW,IAAK,sBACLkW,OAAQ,CACN,KACA,OACA,mBACA,SACA,eAGJ,CACElW,IAAK,mBACLkW,OAAQ,CACN,YACA,kBACA,kBACA,oBACA,qBACA,sBACA,YACA,eAGJ,CACElW,IAAK,qBACLkW,OAAQ,CACN,cACA,oBACA,oBACA,qBACA,uBACA,wBACA,cACA,eACA,cACA,qBAGJ,CACElW,IAAK,mBACLkW,OAAQ,CACN,YACA,kBACA,kBACA,oBACA,qBACA,sBACA,YACA,aACA,mBACA,oBAGJ,CACElW,IAAK,oBACLkW,OAAQ,CACN,aACA,mBACA,mBACA,qBACA,sBACA,uBACA,aACA,cACA,oBAGJ,CACElW,IAAK,gCACLkW,OAAQ,CACN,yBACA,+BACA,+BACA,iCACA,kCACA,mCACA,yBACA,0BACA,gCAGJ,CACElW,IAAK,6BACLkW,OAAQ,CACN,sBACA,4BACA,4BACA,8BACA,+BACA,gCACA,sBACA,uBACA,6BAGJ,CACElW,IAAK,gCACLkW,OAAQ,CACN,gBACA,sBACA,sBACA,wBACA,yBACA,0BACA,gBACA,gBACA,oBACA,gBACA,oBACA,kBACA,eACA,yBACA,gBACA,mBAGJ,CACElW,IAAK,+BACLkW,OAAQ,CACN,qBACA,2BACA,2BACA,6BACA,8BACA,+BACA,qBACA,qBACA,yBACA,qBACA,yBACA,uBACA,oBACA,8BACA,qBACA,wBAGJ,CACElW,IAAK,6BACLkW,OAAQ,CACN,qBACA,2BACA,qBACA,2BACA,6BACA,8BACA,+BACA,qBACA,qBACA,yBACA,qBACA,yBACA,uBACA,oBACA,8BACA,qBACA,wBAGJ,CACElW,IAAK,sBACLkW,OAAQ,CACN,eACA,qBACA,qBACA,uBACA,wBACA,yBACA,eACA,gBACA,gBACA,kBAGJ,CACElW,IAAK,2BACLkW,OAAQ,CACN,oBACA,0BACA,0BACA,4BACA,6BACA,8BACA,oBACA,uBAGJ,CACElW,IAAK,mBACLkW,OAAQ,CACN,YACA,kBACA,kBACA,oBACA,qBACA,sBACA,YACA,aACA,aAGJ,CACElW,IAA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","file":"static/js/main.0cee925b.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"ChoosePhotoModal_header__p6GBz\",\"gallery\":\"ChoosePhotoModal_gallery__3jT6H\",\"photoItem\":\"ChoosePhotoModal_photoItem__2Hvuk\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"buttonRow\":\"ButtonRow_buttonRow__mEknb\",\"buttonRowTop\":\"ButtonRow_buttonRowTop__MAiR6\",\"bottomRow\":\"ButtonRow_bottomRow__3NvXU\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"StoryView_wrapper__1brsF\",\"image\":\"StoryView_image__3CVe2\",\"name\":\"StoryView_name__29Rzy\",\"firstName\":\"StoryView_firstName__1PL7t\",\"lastName\":\"StoryView_lastName__dzOWc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"section\":\"Search_section__1WK1v\",\"label\":\"Search_label__2au2g\",\"input\":\"Search_input__2BuOV\",\"clear\":\"Search_clear__Sipjp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"nodrag\":\"FullscreenImageView_nodrag__2nluI\",\"closebutton\":\"FullscreenImageView_closebutton__3qxpb\",\"zoomButtons\":\"FullscreenImageView_zoomButtons__13s7A\",\"caption\":\"FullscreenImageView_caption__1z4G-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"uploadGroup\":\"FileUploader_uploadGroup__2Okat\",\"fileinputButton\":\"FileUploader_fileinputButton__1b6Sd\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tagtitle\":\"TagView_tagtitle__3ztjj\",\"tagsubtitle\":\"TagView_tagsubtitle__1rIc3\",\"deleteButton\":\"TagView_deleteButton__TNKC5\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"splitpane\":\"ResizableSplitPane_splitpane__2q_bU\",\"dividerWrapper\":\"ResizableSplitPane_dividerWrapper__1RqcZ\",\"divider\":\"ResizableSplitPane_divider__P1YTM\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"title\":\"ListPersonFeedback_title__R2fg0\",\"name\":\"ListPersonFeedback_name__xwR-q\",\"card\":\"ListPersonFeedback_card__i-ygP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"languageSelector\":\"AppBar_languageSelector__2Ogxq\",\"user\":\"AppBar_user__2O4ia\",\"page_title\":\"AppBar_page_title__1cYNH\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tile\":\"Home_tile__TX2p2\",\"tileInner\":\"Home_tileInner__3W9Lq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"checkboxWrapper\":\"CheckboxInput_checkboxWrapper__3_dV6\",\"checkboxCheck\":\"CheckboxInput_checkboxCheck__y1RcA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"editbutton\":\"EditModeButton_editbutton__1Mxpf\",\"inverted\":\"EditModeButton_inverted__16hnn\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"backdrop\":\"Backdrop_backdrop__2_G-Y\",\"dark\":\"Backdrop_dark__164Ty\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"iconbutton\":\"IconButton_iconbutton__K6Ngx\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"btn\":\"PublicButton_btn__DJpXq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"PublicViewStoryPair_header__I_-7r\",\"story\":\"PublicViewStoryPair_story__V9OFf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"contactMoment\":\"AppSideBar_contactMoment__JS1BN\",\"contactMomentMain\":\"AppSideBar_contactMomentMain__2xR1P\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"PublicViewKeyLocation_header__2M3ZS\",\"storyPreview\":\"PublicViewKeyLocation_storyPreview__3EQQT\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"ViewPersonPublic_header__3XDFu\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"story\":\"StoryView_story__DLSav\",\"storyWrapper\":\"StoryView_storyWrapper__2V_cj\",\"storyIconWrapper\":\"StoryView_storyIconWrapper__2X08u\",\"storyLine\":\"StoryView_storyLine__2zN6C\",\"storyIcon\":\"StoryView_storyIcon__muuup\",\"storyPersonPhoto\":\"StoryView_storyPersonPhoto__Zxol5\",\"fadeLeft\":\"StoryView_fadeLeft__1lb4P\",\"fadeRight\":\"StoryView_fadeRight__1dSGU\",\"fadeTop\":\"StoryView_fadeTop__30WEm\",\"fadeBottom\":\"StoryView_fadeBottom__yjZm1\",\"storyContent\":\"StoryView_storyContent__9tqG7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"PublicViewPersonStory_header__1gBoC\",\"event\":\"PublicViewPersonStory_event__1LjTG\",\"eventLineTop\":\"PublicViewPersonStory_eventLineTop__1wOYR\",\"eventLineBottom\":\"PublicViewPersonStory_eventLineBottom__3OZdx\",\"eventIconWrapper\":\"PublicViewPersonStory_eventIconWrapper__3jD6T\",\"eventIcon\":\"PublicViewPersonStory_eventIcon__eA7jI\",\"eventInfo\":\"PublicViewPersonStory_eventInfo__m3Bjk\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"panel\":\"CenteredPane_panel__17RD5\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"markdowncontent\":\"ContactPersonEventView_markdowncontent__3ng0h\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"TopTabs_wrapper__3TrD7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"eventHeader\":\"EditPerson_eventHeader__BwIUO\",\"addEventIcon\":\"EditPerson_addEventIcon__3WtGj\",\"editDocumentDescriptionIcon\":\"EditPerson_editDocumentDescriptionIcon__19Wi7\",\"documentsLayout\":\"EditPerson_documentsLayout__3SXz-\",\"documentThumbnailList\":\"EditPerson_documentThumbnailList__1gCHx\",\"documentThumbnail\":\"EditPerson_documentThumbnail__Z1PTQ\",\"documentThumbnailInner\":\"EditPerson_documentThumbnailInner__3cB-p\",\"documentThumbnailInnerSelected\":\"EditPerson_documentThumbnailInnerSelected__2Cva9\",\"documentThumbnailHeader\":\"EditPerson_documentThumbnailHeader__26tlP\",\"documentThumbnailImages\":\"EditPerson_documentThumbnailImages__2-wvL\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"text\":\"TextView_text__S0UQW\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"LabelView_label__27qRg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"addEventTitle\":\"EditMilitaryEntity_addEventTitle__3qq9A\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"remove\":\"TagView_remove__2JVRQ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"version\":\"SideBar_version__18xel\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"layout\":\"PublicLayout_layout__1zDfl\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"erased\":\"ListPlaces_erased__10X9E\",\"personNumberBadge\":\"ListPlaces_personNumberBadge__3U8R0\",\"personEventBadge\":\"ListPlaces_personEventBadge__1B9tC\",\"textEllipsis\":\"ListPlaces_textEllipsis__3onaO\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"photo\":\"AddPhotoControl_photo__3NddG\",\"photoSelector\":\"AddPhotoControl_photoSelector__qQbc6\",\"wrapper\":\"AddPhotoControl_wrapper__25wfM\",\"delete\":\"AddPhotoControl_delete__2p8bH\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"clickableRow\":\"Table_clickableRow__2zlUu\",\"clickableCell\":\"Table_clickableCell__2Q-iC\",\"sortableHeader\":\"Table_sortableHeader__2cAUV\",\"ellipsize\":\"Table_ellipsize__1A-Py\",\"noValue\":\"Table_noValue__1V8a4\",\"table\":\"Table_table__3qmb0\",\"filterPopout\":\"Table_filterPopout__1Osm2\",\"filterButton\":\"Table_filterButton__1jDmF\",\"filterButtonActive\":\"Table_filterButtonActive__zyufC\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"outer\":\"DocumentElementPreview_outer__2yQtV\",\"elements\":\"DocumentElementPreview_elements__21xud\",\"central\":\"DocumentElementPreview_central__3tBmP\",\"subdocumentInner\":\"DocumentElementPreview_subdocumentInner__9r9Ct\",\"center\":\"DocumentElementPreview_center__2evsj\",\"centerTop\":\"DocumentElementPreview_centerTop__1Zl8y\",\"checkbox\":\"DocumentElementPreview_checkbox__2xNMG\",\"pageInfo\":\"DocumentElementPreview_pageInfo__2XLte\",\"expandIcon\":\"DocumentElementPreview_expandIcon__2DVBN\",\"nodrag\":\"DocumentElementPreview_nodrag__1cJ_8\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"content\":\"PublicSearch_content__uTJsR\",\"filtericon\":\"PublicSearch_filtericon__3uJSy\",\"advancedSearchRow\":\"PublicSearch_advancedSearchRow__2wpdL\",\"actions\":\"PublicSearch_actions__1PzFO\",\"erased\":\"PublicSearch_erased__3gg06\",\"memorialTag\":\"PublicSearch_memorialTag__312m8\",\"ellipsized\":\"PublicSearch_ellipsized__zIZNN\",\"militaryInfoColumn\":\"PublicSearch_militaryInfoColumn__mcMWC\",\"nowrap\":\"PublicSearch_nowrap__1px_G\",\"table\":\"PublicSearch_table__1G5ej\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"event\":\"ViewPerson_event__AGGaw\",\"eventIconWrapper\":\"ViewPerson_eventIconWrapper__2E8wC\",\"eventIcon\":\"ViewPerson_eventIcon__f55wo\",\"eventInfo\":\"ViewPerson_eventInfo__3k8yq\",\"personInfo\":\"ViewPerson_personInfo__2VQZR\"};","/*!\n =========================================================\n * Light Bootstrap Dashboard - v2.0.1\n =========================================================\n\n * Product Page: http://www.creative-tim.com/product/light-bootstrap-dashboard\n * Copyright 2019 Creative Tim (http://www.creative-tim.com)\n * License (https://www.creative-tim.com/license)\n\n =========================================================\n\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n */\n\nimport $ from 'jquery';\n\nvar mobile_menu_visible = 0,\n mobile_menu_initialized = false,\n toggle_initialized = false,\n $sidebar,\n $sidebar_wrapper,\n $navbar,\n isWindows;\n\n$(document).ready(function() {\n const window_width = $(window).width();\n\n // check if there is an image set for the sidebar's background\n lbd.checkSidebarImage();\n\n // Init navigation toggle for small screens\n if (window_width <= 991) {\n lbd.initRightMenu();\n }\n\n lbd.initMinimizeSidebar();\n\n // Init Collapse Areas\n lbd.initCollapseArea();\n\n // Activate the tooltips\n $('[rel=\"tooltip\"]').tooltip();\n\n // Init Tags Input\n // if($(\".tagsinput\").length != 0){\n // $(\".tagsinput\").tagsInput();\n // }\n\n // Activate regular switches\n if ($(\"[data-toggle='switch']\").length !== 0) {\n $(\"[data-toggle='switch']\").bootstrapSwitch();\n }\n\n $('.form-control').on(\"focus\", function() {\n $(this).parent('.input-group').addClass(\"input-group-focus\");\n }).on(\"blur\", function() {\n $(this).parent(\".input-group\").removeClass(\"input-group-focus\");\n });\n\n\n // Fixes sub-nav not working as expected on IOS\n $('body').on('touchstart.dropdown', '.dropdown-menu', function(e) {\n e.stopPropagation();\n });\n});\n\n// activate collapse right menu when the windows is resized\n$(window).resize(function() {\n if ($(window).width() <= 991) {\n lbd.initRightMenu();\n }\n});\n\nconst lbd = {\n misc: {\n navbar_menu_visible: 0\n },\n checkSidebarImage: function() {\n $sidebar = $('.sidebar');\n const image_src = $sidebar.data('image');\n\n if (image_src !== undefined) {\n const sidebar_container = '
'\n $sidebar.append(sidebar_container);\n } else if (mobile_menu_initialized === true) {\n // reset all the additions that we made for the sidebar wrapper only if the screen is bigger than 991px\n $sidebar_wrapper.find('.navbar-form').remove();\n $sidebar_wrapper.find('.nav-mobile-menu').remove();\n\n mobile_menu_initialized = false;\n }\n },\n\n initRightMenu: function() {\n $sidebar_wrapper = $('.sidebar-wrapper');\n\n //console.log('aici se face meniu in dreapta');\n\n if (!mobile_menu_initialized) {\n\n $navbar = $('nav').find('.navbar-collapse').first().clone(true);\n\n let nav_content = '';\n\n //add the content from the regular header to the mobile menu\n //pas = 1;\n $navbar.children('ul').each(function() {\n const content_buff = $(this).html();\n nav_content = nav_content + content_buff;\n });\n\n nav_content = '';\n\n const $sidebar_nav = $sidebar_wrapper.find(' > .nav');\n\n // insert the navbar form before the sidebar list\n const $nav_content = $(nav_content);\n $nav_content.insertBefore($sidebar_nav);\n\n $(\".sidebar-wrapper .dropdown .dropdown-menu > li > a\").click(function(event) {\n event.stopPropagation();\n });\n\n mobile_menu_initialized = true;\n } else {\n if ($(window).width() > 991) {\n // reset all the additions that we made for the sidebar wrapper only if the screen is bigger than 991px\n $sidebar_wrapper.find('.navbar-form').remove();\n $sidebar_wrapper.find('.nav-mobile-menu').remove();\n\n mobile_menu_initialized = false;\n }\n }\n\n if (!toggle_initialized) {\n const $toggle = $('.navbar-toggler');\n\n $toggle.click(function() {\n\n if (mobile_menu_visible === 1) {\n $('html').removeClass('nav-open');\n\n $('.close-layer').remove();\n setTimeout(function() {\n $toggle.removeClass('toggled');\n }, 400);\n\n mobile_menu_visible = 0;\n } else {\n setTimeout(function() {\n $toggle.addClass('toggled');\n }, 430);\n\n\n const main_panel_height = $('.main-panel')[0].scrollHeight;\n const $layer = $('
');\n $layer.css('height', main_panel_height + 'px');\n $layer.appendTo(\".main-panel\");\n\n setTimeout(function() {\n $layer.addClass('visible');\n }, 100);\n\n $layer.click(function() {\n $('html').removeClass('nav-open');\n mobile_menu_visible = 0;\n\n $layer.removeClass('visible');\n\n setTimeout(function() {\n $layer.remove();\n $toggle.removeClass('toggled');\n }, 400);\n });\n\n $('html').addClass('nav-open');\n mobile_menu_visible = 1;\n\n }\n });\n\n toggle_initialized = true;\n }\n },\n\n initMinimizeSidebar: function() {\n\n // when we are on a Desktop Screen and the collapse is triggered we check if the sidebar mini is active or not. If it is active then we don't let the collapse to show the elements because the elements from the collapse are showing on the hover state over the icons in sidebar mini, not on the click.\n $('.sidebar .collapse').on('in.bs.collapse', function() {\n if ($(window).width() > 991) {\n if (lbd.misc.sidebar_mini_active === true) {\n return false;\n } else {\n return true;\n }\n }\n });\n\n $('#minimizeSidebar').click(function() {\n if (lbd.misc.sidebar_mini_active === true) {\n $('body').removeClass('sidebar-mini');\n lbd.misc.sidebar_mini_active = false;\n\n if (isWindows) {\n $('.sidebar .sidebar-wrapper').perfectScrollbar();\n }\n\n } else {\n\n $('.sidebar .collapse').collapse('hide').on('hidden.bs.collapse', function() {\n $(this).css('height', 'auto');\n });\n\n if (isWindows) {\n $('.sidebar .sidebar-wrapper').perfectScrollbar('destroy');\n }\n\n setTimeout(function() {\n $('body').addClass('sidebar-mini');\n\n $('.sidebar .collapse').css('height', 'auto');\n lbd.misc.sidebar_mini_active = true;\n }, 300);\n }\n\n // we simulate the window Resize so the charts will get updated in realtime.\n var simulateWindowResize = setInterval(function() {\n window.dispatchEvent(new Event('resize'));\n }, 180);\n\n // we stop the simulation of Window Resize after the animations are completed\n setTimeout(function() {\n clearInterval(simulateWindowResize);\n }, 1000);\n });\n },\n\n initCollapseArea: function() {\n $('[data-toggle]').each(function() {\n var thisdiv = $(this).hasClass('card-collapse');\n $(thisdiv).addClass('collapse-preview');\n });\n\n $('[data-toggle=\"collapse-hover\"]').hover(function() {\n var thisdiv = $(this).attr(\"data-target\");\n if (!$(this).hasClass('state-open')) {\n $(this).addClass('state-hover');\n $(thisdiv).css({\n 'height': '30px',\n 'display': 'block',\n 'overflow': 'hidden'\n });\n }\n\n },\n function() {\n var thisdiv = $(this).attr(\"data-target\");\n $(this).removeClass('state-hover');\n\n if (!$(this).hasClass('state-open')) {\n $(thisdiv).css({\n 'height': '0px'\n });\n }\n }).click(function(event) {\n event.preventDefault();\n\n var thisdiv = $(this).attr(\"data-target\");\n var height = $(thisdiv).children('.card-body').height();\n\n if ($(this).hasClass('state-open')) {\n $(thisdiv).css({\n 'height': '0px',\n\n });\n $(this).removeClass('state-open');\n } else {\n $(thisdiv).css({\n 'height': height + 30,\n });\n $(this).addClass('state-open');\n }\n });\n }\n}\n\n\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\n\n// eslint-disable-next-line\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function() {\n var context = this,\n args = arguments;\n clearTimeout(timeout);\n timeout = setTimeout(function() {\n timeout = null;\n if (!immediate) func.apply(context, args);\n }, wait);\n if (immediate && !timeout) func.apply(context, args);\n };\n};\n","import moment from 'moment';\nimport NL from './translations/nl.json';\nimport EN from './translations/en.json';\nimport FR from './translations/fr.json';\nimport DE from './translations/de.json';\n\nconst languages = {\n 'nl': NL,\n 'en': EN as Partial,\n 'fr': FR as Partial,\n 'de': DE as Partial\n};\nexport type Language = keyof typeof languages;\nexport type TranslationKey = keyof typeof NL;\n\nexport const getLanguageStringForLanguage = (languageCode: string): string => {\n if (['nl', 'fr', 'de', 'en'].indexOf(languageCode) > -1) {\n return T(('language.' + languageCode) as TranslationKey)\n } else {\n return '???'\n }\n}\n\ninterface INoun {\n singular: TranslationKey;\n plural: TranslationKey;\n}\nfunction noun(singular: TranslationKey, plural: TranslationKey): INoun {\n return { singular, plural };\n}\n\nconst nouns = {\n collection: noun('noun.collection', 'noun.collections'),\n document: noun('noun.document', 'noun.documents'),\n documentTag: noun('noun.documentTag', 'noun.documentTags'),\n person: noun('noun.person', 'noun.persons'),\n militaryEntity: noun('noun.militaryEntity', 'noun.militaryEntities'),\n militaryUnit: noun('noun.militaryUnit', 'noun.militaryUnits'),\n memorial: noun('noun.memorial', 'noun.memorials'),\n place: noun('noun.place', 'noun.places'),\n project: noun('noun.project', 'noun.projects'),\n user: noun('noun.user', 'noun.users'),\n result: noun('noun.result', 'noun.results'),\n personFeedback: noun('noun.personFeedback', 'noun.personFeedbacks'),\n contactPerson: noun('noun.contactPerson', 'noun.contactPersons'),\n contactPersonEvent: noun('noun.contactPersonEvent', 'noun.contactPersonEvents'),\n contactMoment: noun('noun.contactMoment', 'noun.contactMoments'),\n personEvent: noun('noun.personEvent', 'noun.personEvents'),\n personStory: noun('noun.personStory', 'noun.personStories'),\n keyLocation: noun('noun.keyLocation', 'noun.keyLocations')\n};\nexport type Noun = keyof typeof nouns;\n\nvar languageCodes: Language[] = ['en', 'nl', 'fr', 'de'];\n\nexport const getActiveLanguage = () => {\n const storedLanguage = localStorage.getItem('language') as Language;\n if (storedLanguage === null || storedLanguage === undefined) {\n const browserLanguage = navigator.language;\n if (browserLanguage) {\n // languages can be in format en-US. We only need first part\n const splittedLanguage = browserLanguage.split('-');\n const languageString = splittedLanguage[0];\n try {\n const language = languageString.toString().trim().toLowerCase() as Language\n if (languageCodes.includes(language)) {\n return language\n } else {\n // as the language is not one of the standard supported languages,\n // we think `en` might the most appropriate.\n return 'en' as Language\n }\n } catch (e) {\n return 'nl' as Language\n }\n } else {\n return 'nl' as Language\n }\n } else {\n return storedLanguage;\n }\n\n}\nvar selectedLanguage = languages[getActiveLanguage()];\n\nexport const setLanguage = (langcode: Language) => {\n selectedLanguage = languages[langcode];\n localStorage.setItem('language', langcode);\n moment.locale(langcode);\n}\n\nexport const getLanguages = () => languageCodes;\nexport const getUILanguages = () => ['nl', 'en', 'fr', 'de'] as Language[];\n\nexport const T = (key: TranslationKey, parameters?: {[key: string]: string}) => {\n let result = (selectedLanguage[key] || key) as string;\n if (parameters !== undefined) {\n for (var param in parameters) {\n result = result.replace(`{${param}}`, parameters[param]);\n }\n }\n return result;\n}\n\nexport const singular = (noun: Noun) => {\n return T(nouns[noun].singular);\n}\n\nexport const plural = (noun: Noun) => {\n return T(nouns[noun].plural);\n}\n\nexport const pluralize = (noun: Noun, amount: number) => {\n return amount === 1 ? singular(noun) : plural(noun);\n}\n\nexport const listOf = (items: string[]) => {\n if (items.length === 0)\n return '';\n if (items.length === 1)\n return items[0];\n\n return T('and', {\n a: items.slice(0, items.length - 1).join(', '),\n b: items[items.length - 1]\n });\n}\n","import {T, TranslationKey} from \"../Translate\";\n\nexport interface IValidationResult {\n status: 'OK'|'NOK';\n data?: {[key: string]: ValidationError};\n extra?: {}\n}\n\nexport function isValidationResult(obj: any): obj is IValidationResult {\n return typeof obj.status === \"string\" && typeof obj.extra === \"object\" && typeof obj.data === \"object\";\n}\n\n\nexport enum ValidationError {\n Ok = 'OK',\n InvalidFormat = 'INVALID_FORMAT',\n InvalidLength = 'INVALID_FORMAT_LENGTH',\n SpacesNotAllowed = \"INVALID_FORMAT_SPACE_NOT_ALLOWED\",\n TooMany = \"INVALID_TOO_MANY\",\n\n DataAlreadyExists = \"INVALID_DATA_ALREADY_EXIST\",\n ConnectionAlreadyExists = \"INVALID_CONNECTION_ALREADY_EXISTS\",\n DataRequired = \"INVALID_DATA_REQUIRED\",\n GoogleNotFound = \"INVALID_DATA_GOOGLE_NOT_FOUND\",\n GoogleTooManyResults = \"INVALID_DATA_GOOGLE_TOO_MUCH\",\n\n UsernameAlreadyExists = \"INVALID_DATA_USERNAME_ALREADY_EXISTS\",\n EmailAlreadyExists = \"INVALID_DATA_EMAIL_ALREADY_EXISTS\",\n\n AtLeastOne = \"INVALID_AT_LEAST_ONE\",\n\n InvalidOption = 'INVALID_OPTION',\n InvalidDateOrder = 'INVALID_DATE_ORDER',\n EventsOverlap = 'EVENT_OVERLAP',\n Required = 'REQUIRED',\n\n DoesNotExist = 'DOES_NOT_EXIST',\n InvalidReference = 'INVALID_REFERENCE',\n InvalidData = 'INVALID_DATA',\n AlreadyExists = 'ALREADY_EXISTS',\n\n ShouldBeEmpty = 'SHOULD_BE_EMPTY',\n ChildrenShouldBeEmpty = 'CHILDREN_SHOULD_BE_EMPTY',\n DocumentReferenceExist = 'DOCUMENT_REFERENCES_EXIST',\n EventReferenceExist = 'EVENT_REFERENCES_EXIST',\n ContactReferencesExist = 'CONTACT_REFERENCES_EXIST',\n ContactPersonReferencesExist = 'CONTACT_PERSON_REFERENCES_EXIST',\n MemorialReferencesExist = 'MEMORIAL_REFERENCES_EXIST',\n RelationsExist = 'RELATIONS_EXIST',\n PersonStoriesExist = 'PERSONSTORY_REFERENCES_EXIST',\n\n InvalidStatusOption = 'INVALID_STATUS_OPTION',\n InvalidPublishStatusOption = 'INVALID_PUBLISH_STATUS_OPTION',\n PersonAlreadyHasPersonStory = 'PERSON_ALREADY_HAS_STORY',\n PersonStoryCannotBeDeletedIsPublished = 'PERSONSTORY_CANNOT_BE_DELETED_IS_PUBLISHED',\n PersonStoryCannotBeDeletedIsReferenced = 'PERSONSTORY_CANNOT_BE_DELETED_IS_REFERENCED',\n KeyLocationCannotBeDeletedIsReferenced = 'KEY_LOCATION_CANNOT_BE_DELETED_IS_REFERENCED',\n\n InvalidBritishTrenchCoordinates = 'INVALID_BRITISH_TRENCH_COORDINATES',\n\n InvalidYear = 'INVALID_YEAR',\n InvalidYear2000 = 'INVALID_YEAR_2000',\n InvalidPosition = 'INVALID_POSITION'\n}\n\nconst ErrorNames: [ValidationError, TranslationKey][] = [\n [ValidationError.Ok, 'generic.ok'],\n [ValidationError.InvalidFormat, 'validationError.invalidFormat'],\n [ValidationError.InvalidData, 'validationError.invalidData'],\n [ValidationError.InvalidLength, 'validationError.invalidLength'],\n [ValidationError.SpacesNotAllowed, 'validationError.spacesNotAllowed'],\n [ValidationError.TooMany, 'validationError.tooMany'],\n [ValidationError.DataAlreadyExists, 'validationError.dataAlreadyExists'],\n [ValidationError.ConnectionAlreadyExists, 'validationError.ConnectionAlreadyExists'],\n [ValidationError.DataRequired, 'validationError.dataRequired'],\n [ValidationError.GoogleNotFound, 'validationError.googleNotFound'],\n [ValidationError.GoogleTooManyResults, 'validationError.googleTooManyResults'],\n [ValidationError.InvalidOption, 'validationError.invalidOption'],\n [ValidationError.InvalidDateOrder, 'validationError.invalidDateOrder'],\n [ValidationError.EventsOverlap, 'validationError.eventsOverlap'],\n [ValidationError.Required, 'validationError.required'],\n [ValidationError.DoesNotExist, 'validationError.doesNotExist'],\n [ValidationError.InvalidReference, 'validationError.invalidReference'],\n [ValidationError.UsernameAlreadyExists, 'validationError.usernameAlreadyExists'],\n [ValidationError.EmailAlreadyExists, 'validationError.emailAlreadyExists'],\n [ValidationError.AtLeastOne, 'validationError.atLeastOne'],\n [ValidationError.ShouldBeEmpty, 'validationError.shouldBeEmpty'],\n [ValidationError.ChildrenShouldBeEmpty, 'validationError.ChildrenShouldBeEmpty'],\n [ValidationError.DocumentReferenceExist, 'validationError.DocumentReferenceExist'],\n [ValidationError.EventReferenceExist, 'validationError.EventReferenceExist'],\n [ValidationError.ContactReferencesExist, 'validationError.ContactReferencesExist'],\n [ValidationError.ContactPersonReferencesExist, 'validationError.ContactPersonReferencesExist'],\n [ValidationError.MemorialReferencesExist, 'validationError.MemorialReferencesExist'],\n [ValidationError.RelationsExist, 'validationError.RelationsExist'],\n [ValidationError.PersonStoriesExist, 'validationError.PersonStoriesExist'],\n [ValidationError.AlreadyExists, 'validationError.militaryEntityAlreadyExists'],\n [ValidationError.InvalidStatusOption, 'validationError.InvalidStatusOption'],\n [ValidationError.InvalidPublishStatusOption, 'validationError.InvalidPublishStatusOption'],\n [ValidationError.PersonAlreadyHasPersonStory, 'validationError.PersonAlreadyHasPersonStory'],\n [ValidationError.PersonStoryCannotBeDeletedIsPublished, 'validationError.PersonStoryCannotBeDeletedIsPublished'],\n [ValidationError.PersonStoryCannotBeDeletedIsReferenced, 'validationError.PersonStoryCannotBeDeletedIsReferenced'],\n [ValidationError.KeyLocationCannotBeDeletedIsReferenced, 'validationError.KeyLocationCannotBeDeletedIsReferenced'],\n [ValidationError.InvalidBritishTrenchCoordinates, 'memorial.britishTrenchCoordinates.invalid'],\n [ValidationError.InvalidYear, 'validationError.invalidYear'],\n [ValidationError.InvalidYear2000, 'validationError.invalidYear2000']\n]\n\nexport function getErrorName(error: ValidationError) {\n return T((\n ErrorNames.find(x => x[0] === error)\n || [ValidationError.Ok, \"validationError.unknown\"]\n )[1]);\n}\n\nexport function getErrorDescription(error?: ValidationError, overrides?: [ValidationError, string][]): string|undefined {\n if (error === undefined || error === ValidationError.Ok)\n return undefined;\n\n const override = (overrides || []).find(x => x[0] === error);\n return override ? override[1] : getErrorName(error)\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { ValidationError, getErrorDescription } from \"../models/ValidationResult\";\nimport { AppState } from \"../redux/State\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { Dispatch } from \"redux\";\nimport { AnyAppAction } from \"../redux/Actions\";\n\nexport function useStateWithError(initialValue: T): [\n T,\n (value: T) => void,\n string|undefined,\n (error: ValidationError|undefined) => void\n] {\n const [value, setValue] = useState(initialValue);\n const [error, setError] = useState();\n\n const wrappedSetValue = (value: T) => {\n setValue(value);\n setError(undefined);\n };\n const setValidationError = (error: ValidationError|undefined) => {\n setError(getErrorDescription(error));\n };\n\n return [value, wrappedSetValue, error, setValidationError];\n}\n\nexport function useAppDispatch() {\n return useDispatch>();\n}\n\nexport function useAppSelector(projection: (state: AppState) => T) {\n return useSelector(projection);\n}\n\n/**\n * This hook will always return the same function object, even if the callback\n * object changes. The call to the returned function object will be forwarded\n * to the callback that was last provided to this hook.\n * \n * This solves the problem where a function dependency is needed in a hook\n * (eg. useEffect) and where the function should be able to change without\n * re-running the effect.\n * \n * @param callback the target callback\n */\nexport function useRefresh(callback: () => void): () => void {\n const memo = useRef(callback);\n memo.current = callback;\n return useCallback(() => memo.current(), [memo]);\n}\n","import { PagesState, ActivePageState, ISharedPageState, TabState, IExportModalState } from './State';\nimport { ActiveContactMoment } from '../models/ActiveContactMoment';\nimport { ContactMomentContribution } from '../models/ContactPerson';\nimport { useAppSelector, useAppDispatch } from '../utils/Functional';\nimport { useCallback } from 'react';\n\nexport enum AppActionType {\n DocumentEditorSetRatio = 'DOCUMENT_EDITOR_SET_RATIO',\n LoadDocumentTags = 'LOAD_DOCUMENT_TAGS',\n DocumentSetTagFieldValue = 'DOCUMENT_SET_TAG_FIELD_VALUE',\n LoadCollectionDocuments = 'LOAD_COLLECTION_DOCUMENTS',\n UpdatePagesState = 'UPDATE_PAGES_STATE',\n UpdateTabState = 'UPDATE_PAGES_STATE',\n StartContactMoment = 'START_CONTACT_MOMENT',\n UpdateContactMoment = 'UPDATE_CONTACT_MOMENT',\n RegisterContactMomentContribution = 'REGISTER_CONTACT_MOMENT_CONTRIBUTION',\n EndContactMoment = 'END_CONTACT_MOMENT',\n SetActivePage = 'SET_ACTIVE_PAGE',\n SetSharedPageState = 'SET_SHARED_PAGE_STATE',\n UpdateExportModalState = 'UPDATE_EXPORT_MODAL_STATE'\n}\n\nexport interface SetDocumentEditorRatioAction {\n type: AppActionType.DocumentEditorSetRatio;\n payload: {\n ratio: number;\n }\n}\nexport const setDocumentEditorRatio = (ratio: number): SetDocumentEditorRatioAction => {\n return {\n type: AppActionType.DocumentEditorSetRatio,\n payload: { ratio }\n };\n}\n\nexport interface UpdatePagesStateAction {\n type: AppActionType.UpdatePagesState;\n payload: {\n page: keyof PagesState;\n value: any;\n }\n}\nexport function updatePagesStateAction(page: K, value: Partial): UpdatePagesStateAction {\n return {\n type: AppActionType.UpdatePagesState,\n payload: { page, value }\n };\n}\n\n\nexport interface UpdateTabStateAction {\n type: AppActionType.UpdateTabState;\n payload: {\n page: string;\n value: string;\n }\n}\n\nexport function updateTabStateAction(page: string, value: string): UpdateTabStateAction {\n return {\n type: AppActionType.UpdateTabState,\n payload: { page, value }\n };\n}\n\n\nexport interface UpdateExportModalStateAction {\n type: AppActionType.UpdateExportModalState;\n payload: {\n updates: Partial\n }\n}\n\nexport function updateExportModalStateAction(updates: Partial): UpdateExportModalStateAction {\n return {\n type: AppActionType.UpdateExportModalState,\n payload: {\n updates\n }\n };\n}\n\n\nexport function usePageState(page: K): [PagesState[K], (updates: Partial) => void] {\n const state = useAppSelector(state => state.pagesState[page]);\n const dispatch = useAppDispatch();\n const update = useCallback((updates: Partial) => {\n dispatch(updatePagesStateAction(page, updates));\n }, [dispatch, page]);\n return [state, update];\n}\n\nexport function useTabState(pageKey: string | undefined, initialValue: string | undefined): [string | undefined, (update: string) => void ] {\n const state = useAppSelector(state => {\n const index: keyof TabState = pageKey as keyof TabState;\n if (!pageKey || !index) {\n return initialValue\n } else {\n return state.tabsState[index]\n }\n })\n const dispatch = useAppDispatch()\n const update = (update: string) => {\n if (pageKey) {\n dispatch(updateTabStateAction(pageKey, update))\n }\n }\n return [state, update]\n}\n\nexport interface StartContactMomentAction {\n type: AppActionType.StartContactMoment,\n payload: ActiveContactMoment\n}\nexport function startContactMomentAction(contactMoment: ActiveContactMoment)\n : StartContactMomentAction {\n return {\n type: AppActionType.StartContactMoment,\n payload: contactMoment\n };\n}\n\nexport interface UpdateContactMomentAction {\n type: AppActionType.UpdateContactMoment,\n payload: Partial\n}\nexport function updateContactMomentAction(\n updates: Partial\n) : UpdateContactMomentAction {\n return {\n type: AppActionType.UpdateContactMoment,\n payload: updates\n };\n}\n\nexport interface RegisterContactMomentContributionAction {\n type: AppActionType.RegisterContactMomentContribution,\n payload: ContactMomentContribution\n}\nexport function registerContactMomentContributionAction(\n contribution: ContactMomentContribution\n): RegisterContactMomentContributionAction {\n return {\n type: AppActionType.RegisterContactMomentContribution,\n payload: contribution\n };\n}\n\nexport interface EndContactMomentAction {\n type: AppActionType.EndContactMoment,\n payload: {}\n}\nexport function endContactMomentAction(): EndContactMomentAction {\n return {\n type: AppActionType.EndContactMoment,\n payload: {}\n };\n}\n\nexport interface SetActivePageAction {\n type: AppActionType.SetActivePage,\n payload: ActivePageState\n}\nexport function setActivePage(state: ActivePageState): SetActivePageAction {\n return {\n type: AppActionType.SetActivePage,\n payload: state\n };\n}\n\nexport interface SetSharedPageStateAction {\n type: AppActionType.SetSharedPageState,\n payload: ISharedPageState\n}\nexport function setSharedPageState(state: ISharedPageState): SetSharedPageStateAction {\n return {\n type: AppActionType.SetSharedPageState,\n payload: state\n };\n}\n\nexport type AnyAppAction\n = SetDocumentEditorRatioAction\n | UpdatePagesStateAction\n | UpdateTabStateAction\n | StartContactMomentAction\n | UpdateContactMomentAction\n | RegisterContactMomentContributionAction\n | EndContactMomentAction\n | SetActivePageAction\n | SetSharedPageStateAction\n | UpdateExportModalStateAction;\n","import { TranslationKey, T } from \"../Translate\";\n\nexport enum UserType {\n Anonymous = 'anonymous',\n Admin = 'admin',\n Revisor = 'revisor',\n Normal = 'normal',\n NormalCivilian = 'normal-civilian',\n ApiRead = 'api-read',\n ApiWrite = 'api-write',\n ReadOnly = 'readonly',\n ReadBESoldiers = 'read-be-soldiers'\n}\n\nexport const UserTypeNames: [UserType, TranslationKey][] = [\n [UserType.Admin, 'usertype.admin'],\n [UserType.Revisor, 'usertype.revisor'],\n [UserType.Normal, 'usertype.normal'],\n [UserType.NormalCivilian, 'usertype.normalCivilian'],\n [UserType.ApiRead, 'usertype.apiRead'],\n [UserType.ApiWrite, 'usertype.apiWrite'],\n [UserType.ReadOnly, 'usertype.readOnly'],\n [UserType.ReadBESoldiers, 'usertype.readBeSoldiers']\n];\n\nconst AllUserTypes: [UserType, TranslationKey][] = [\n [UserType.Anonymous, 'usertype.anonymous'],\n ...UserTypeNames\n];\n\nexport function getUsertypeName(type: UserType) {\n return T((AllUserTypes.find(t => t[0] === type) || AllUserTypes[0])[1]);\n}\n\nexport enum Dataset {\n Any = 'any',\n Deaths = 'deaths',\n Namelist = 'namenlijst',\n IMR = 'irish_memorial_records',\n Survivors = 'survivors',\n Stories = 'stories',\n Stories1 = 'stories_1',\n Stories2 = 'stories_2',\n Stories3 = 'stories_3',\n Stories4 = 'stories_4',\n WithDocumentation = 'with_documentation',\n Contacts = 'contacts',\n Military = 'military'\n}\n\nexport const AccessibleDatasets: Dataset[] = [\n Dataset.Any,\n Dataset.Namelist,\n Dataset.Deaths,\n Dataset.Survivors,\n Dataset.WithDocumentation,\n Dataset.Stories,\n Dataset.Contacts,\n Dataset.IMR,\n Dataset.Military\n];\n\nexport const DatasetNames : [Dataset, TranslationKey][] = [\n [Dataset.Any, 'dataset.any'],\n [Dataset.Namelist, 'dataset.namelist'],\n [Dataset.Deaths, 'dataset.deaths'],\n [Dataset.Survivors, 'dataset.survivors'],\n [Dataset.IMR, 'dataset.imr'],\n [Dataset.Stories, 'dataset.stories'],\n [Dataset.Stories1, 'dataset.stories1'],\n [Dataset.Stories2, 'dataset.stories2'],\n [Dataset.Stories3, 'dataset.stories3'],\n [Dataset.Stories4, 'dataset.stories4'],\n [Dataset.WithDocumentation, 'dataset.withDocumentation'],\n [Dataset.Contacts, 'dataset.contacts'],\n [Dataset.Military, 'dataset.military']\n];\n\nexport function translateDataset(dataset: Dataset) {\n const translation = DatasetNames.find(x => x[0] === dataset);\n return translation ? T(translation[1]) : dataset;\n}\n\nexport interface IUserFields {\n type: UserType;\n dataset: Dataset;\n account: string;\n name: string;\n email: string;\n phone: string;\n description: string;\n language: string;\n}\n\n\nexport interface IUser extends IUserFields {\n _id: string;\n\n deleted: boolean;\n confirmed: boolean;\n}\n\nexport class User {\n static fromJSON(json: IUser) {\n return new User(\n json._id,\n json.type,\n json.account,\n json.name,\n json.email,\n json.phone,\n json.description,\n json.language);\n }\n\n id: string|null;\n type: UserType;\n username: string;\n name: string;\n email: string;\n phone: string;\n description: string;\n language: string;\n army: string;\n dataset: string;\n deleted: boolean;\n\n constructor(\n id: string|null,\n type: UserType,\n username: string,\n name: string,\n email: string,\n phone: string,\n description: string,\n language: string,\n army?: string,\n dataset?: string,\n deleted?: boolean)\n {\n this.id = id;\n this.type = type;\n this.username = username;\n this.name = name || username;\n this.email = email || '';\n this.phone = phone || '';\n this.description = description || '';\n this.language = language || 'en';\n this.army = army || '';\n this.dataset = dataset || 'any';\n this.deleted = deleted || false;\n }\n\n isAdmin() {\n return this.type === UserType.Admin;\n }\n\n isRevisor() {\n return this.type === UserType.Revisor;\n }\n\n isAtLeastRevisor() {\n return this.type === UserType.Admin || this.type === UserType.Revisor;\n }\n\n isAtLeastNormal() {\n return this.type === UserType.Normal || this.isAtLeastRevisor();\n }\n\n isReadOnly() {\n return this.type !== UserType.Admin\n && this.type !== UserType.Normal\n && this.type !== UserType.NormalCivilian\n && this.type !== UserType.Revisor;\n }\n\n isGuest() {\n return this.type === UserType.Anonymous;\n }\n\n canEdit() {\n return !this.isReadOnly();\n }\n\n toJSON() {\n return {\n _id: this.id,\n type: this.type,\n account: this.username,\n name: this.name,\n email: this.email,\n phone: this.phone,\n description: this.description,\n language: this.language\n };\n }\n}\n\nexport const AnonymousUser = new User(null, UserType.Anonymous, '', '', '', '', '', 'nl');\n","import { getActiveLanguage, T } from \"../Translate\";\n\nexport enum PlaceType {\n Unknown = 'unknown',\n Topo = 'topo',\n Sublocality = 'sublocality',\n Locality = 'locality',\n Neighborhood = 'neighborhood',\n ColloquialArea = 'colloquial_area',\n AdministrativeAreaLevel2 = 'administrative_area_level_2',\n AdministrativeAreaLevel1 = 'administrative_area_level_1',\n Country = 'country'\n}\n\nexport const PlaceTypes = [\n PlaceType.Unknown,\n PlaceType.Topo,\n PlaceType.Sublocality,\n PlaceType.Locality,\n PlaceType.Neighborhood,\n PlaceType.ColloquialArea,\n PlaceType.AdministrativeAreaLevel2,\n PlaceType.AdministrativeAreaLevel1,\n PlaceType.Country\n];\n\nexport enum ResolutionStatus {\n Ambiguous = 'ambiguous',\n Found = 'found',\n NotFound = 'not_found',\n Custom = 'not_resolved',\n Unresolved = 'unresolved',\n\n All = '__all__'\n}\n\nexport function getResolutionStatusName(status: ResolutionStatus): string {\n switch (status) {\n case ResolutionStatus.Ambiguous: return T('resolutionStatus.ambiguous');\n case ResolutionStatus.Found: return T('resolutionStatus.found');\n case ResolutionStatus.Custom: return T('resolutionStatus.notResolved');\n case ResolutionStatus.NotFound: return T('resolutionStatus.notFound');\n case ResolutionStatus.All: return T('resolutionStatus.all');\n default:\n return T('resolutionStatus.unresolved');\n }\n}\n\nexport function getResolutionStatusColor(status: ResolutionStatus): string {\n switch (status) {\n case ResolutionStatus.Ambiguous: return '#fd7e14';\n case ResolutionStatus.Found: return '#28a745';\n case ResolutionStatus.NotFound: return '#dc3545';\n case ResolutionStatus.Custom: return '#007bff';\n default: return '#cccccc';\n }\n}\n\nexport interface IPlaceLanguage {\n name: string;\n sublocality: string|null;\n locality: string|null;\n administrative_area_level_2: string|null;\n administrative_area_level_1: string|null;\n country: string;\n}\n\nexport const createEmptyPlaceLanguage = (): IPlaceLanguage => {\n return {\n name: '',\n sublocality: '',\n locality: '',\n administrative_area_level_1: '',\n administrative_area_level_2: '',\n country: ''\n }\n}\n\nexport const createEmptyLanguages = (): {[language: string]: IPlaceLanguage} => {\n return {\n 'nl': createEmptyPlaceLanguage(),\n 'en': createEmptyPlaceLanguage(),\n 'de': createEmptyPlaceLanguage(),\n 'fr': createEmptyPlaceLanguage(),\n }\n}\n\nexport interface IPlaceFields {\n type: PlaceType;\n country_code: string;\n languages: {[language: string]: IPlaceLanguage};\n alternative_names: string[];\n resolution_status: ResolutionStatus;\n loc?: { lat: number, lon: number };\n}\n\nexport function toLatLng(value?: { lat: number, lon: number }) {\n return value && (value.lat || value.lon) ? { lat: value.lat, lng: value.lon } : undefined;\n}\nexport function toLatLon(value?: { lat: number, lng: number }) {\n return value && { lat: value.lat, lon: value.lng };\n}\n\nexport interface IPlace extends IPlaceFields {\n _id: string;\n\n memorials?: {_id: string, name: string}[];\n extend_events_by_type?: {[key: string]: number}; // keys are PersonEventType\n}\n\nexport interface IPlaceSearchResult {\n match: IPlaceSearchResultEntry[];\n suggestions: IPlaceSearchResultEntry[];\n}\n\nexport interface IPlaceSearchResultEntry {\n name: string;\n address: {\n sublocality?: string;\n locality?: string;\n administrative_area_level_2?: string;\n administrative_area_level_1?: string;\n country: string;\n country_code: string;\n },\n location: [number, number],\n type: PlaceType\n}\n\nexport function isPlace(place: IPlace|{}|undefined): place is IPlace {\n return place && (place as any).type;\n}\n\nexport class Place {\n place: IPlace;\n\n constructor(place: IPlace) {\n this.place = place;\n }\n\n get id() {\n return this.place._id;\n }\n\n get name() {\n return this.getTranslation().name;\n }\n\n get nameWithAlternatives() {\n const firstPart = this.name\n if (this.place.alternative_names.some(x => x.trim().length > 0)) {\n return firstPart + ` ( ${\n this.place.alternative_names.join(', ')\n } )`\n } else {\n return firstPart\n }\n }\n\n get status() {\n return this.place.resolution_status;\n }\n\n get type() {\n return this.place.type;\n }\n\n get countryCode() {\n return this.place.country_code;\n }\n\n describe(language?: string) {\n const translation = language ? this.place.languages[language] : this.getTranslation();\n let result = translation.name;\n if (translation.locality && translation.locality !== translation.name)\n result += ', ' + translation.locality;\n if (translation.administrative_area_level_2)\n result += ', ' + translation.administrative_area_level_2;\n if (translation.administrative_area_level_1)\n result += ', ' + translation.administrative_area_level_1;\n result += ', ' + this.place.country_code;\n return result;\n }\n\n describeHierarchy(language?: string) {\n const translation = language ? this.place.languages[language] : this.getTranslation();\n const components: string[] = [];\n if (translation.locality && translation.locality !== translation.name)\n components.push(translation.locality);\n if (translation.administrative_area_level_2)\n components.push(translation.administrative_area_level_2);\n if (translation.administrative_area_level_1)\n components.push(translation.administrative_area_level_1);\n components.push(this.place.country_code);\n return components.join(', ');\n }\n\n getTranslation() {\n return this.place.languages[getActiveLanguage()]\n || this.place.languages[Place.getPrimaryLanguage(this.place.country_code)];\n }\n\n hasLocation() {\n const { loc } = this.place;\n return loc && (loc.lat !== 0 || loc.lon !== 0);\n }\n\n static getPrimaryLanguage(countryCode: string) {\n switch (countryCode) {\n case 'BE':\n case 'NL':\n return 'nl';\n case 'FR':\n return 'fr';\n case 'DE':\n return 'de';\n default:\n return 'en';\n }\n }\n}\n\nexport function getPlaceTypeName(placeType: PlaceType) {\n switch (placeType) {\n case PlaceType.Topo: return T('placeType.topo');\n case PlaceType.Sublocality: return T('placeType.sublocality');\n case PlaceType.Locality: return T('placeType.locality');\n case PlaceType.Neighborhood: return T('placeType.neighborhood');\n case PlaceType.ColloquialArea: return T('placeType.colloquialArea');\n case PlaceType.AdministrativeAreaLevel2: return T('placeType.area2');\n case PlaceType.AdministrativeAreaLevel1: return T('placeType.area1');\n case PlaceType.Country: return T('placeType.country');\n case PlaceType.Unknown:\n default:\n return T('placeType.unknown');\n }\n}\n\nexport interface PlaceData {\n place_id?: string;\n topo?: string;\n original_place_name?: string;\n original_region?: string;\n original_country?: string;\n place_country_code?: string;\n}\n\nexport const EXAMPLE_PLACE: IPlace = {\n \"languages\":{\n \"fr\":{\n \"name\":\"Ypres\",\n \"locality\":\"Ypres\",\n \"country\":\"\",\n \"administrative_area_level_2\":\"Flandre Occidentale\",\n \"administrative_area_level_1\":\"R\\u00e9gion Flamande\",\n \"sublocality\":\"\"\n },\n \"en\":{\n \"name\":\"Ypres\",\n \"locality\":\"Ypres\",\n \"country\":\"\",\n \"administrative_area_level_2\":\"West Flanders\",\n \"administrative_area_level_1\":\"Flanders\",\n \"sublocality\":\"\"\n },\n \"nl\":{\n \"name\":\"Ieper\",\n \"locality\":\"Ieper\",\n \"country\":\"\",\n \"administrative_area_level_2\":\"West-Vlaanderen\",\n \"administrative_area_level_1\":\"Vlaanderen\",\n \"sublocality\":\"Ieper\"\n },\n \"de\":{\n \"name\":\"Ypern\",\n \"locality\":\"Ypern\",\n \"country\":\"\",\n \"administrative_area_level_2\":\"Westflandern\",\n \"administrative_area_level_1\":\"Flanders\",\n \"sublocality\":\"\"\n }\n },\n \"loc\":{\n \"lat\":50.8492265,\n \"lon\":2.8779465\n },\n \"country_code\":\"BE\",\n \"resolution_status\": ResolutionStatus.Found,\n \"_id\":\"1ba98a3a-a5ca-4e5e-bc5a-981bac76437a\",\n \"type\": PlaceType.Sublocality,\n \"alternative_names\":[\n\n ]\n};\n","import React, { CSSProperties } from 'react';\n\ninterface IconProps {\n icon: Icon;\n style?: CSSProperties;\n}\nexport const IconElement = (props: IconProps) => ;\nexport const LoadingIcon = () => ;\n\nexport enum Icon {\n Page = 'fa fa-file',\n Home = 'far fa-home',\n Box = 'fas fa-box',\n Documentation = 'fas fa-file-invoice',\n Users = 'fas fa-users',\n Search = 'fas fa-search',\n QuoteRight = 'fas fa-quote-right',\n Monument = 'fas fa-monument',\n MapMarker = 'fas fa-map-marker-alt',\n Sitemap = 'fas fa-sitemap',\n Cogs = 'fas fa-cogs',\n Database = 'fas fa-database',\n Books = 'fas fa-books',\n Sort = 'fas fa-sort',\n SortUp = 'fas fa-sort-up',\n SortDown = 'fas fa-sort-down',\n ListUl = 'fal fa-list-ul',\n Tools = 'fas fa-tools',\n SignOut = 'fas fa-sign-out-alt',\n Times = 'fas fa-times',\n TimesCircle = 'fas fa-times-circle',\n SearchMinus = 'far fa-search-minus',\n SearchPlus = 'far fa-search-plus',\n AngleLeft = 'far fa-angle-left',\n AngleRight = 'far fa-angle-right',\n AngleLeftLight = 'fal fa-angle-left',\n AngleRightLight = 'fal fa-angle-right',\n ChevronLeftLight = 'fal fa-chevron-left',\n ChevronRightLight = 'fal fa-chevron-right',\n User = 'fas fa-user',\n Book = 'fas fa-book',\n Question = 'fas fa-question',\n Edit = 'fas fa-edit',\n ChevronLeft = 'fas fa-chevron-left',\n ChevronRight = 'fas fa-chevron-right',\n ChevronDoubleLeft = 'fas fa-chevron-double-left',\n ChevronDoubleRight = 'fas fa-chevron-double-right',\n Info = 'far fa-info-circle',\n PlusSquare = 'fas fa-plus-square',\n Images = 'fas fa-images',\n Merge = 'fas fa-compress-alt',\n FolderTree = 'fas fa-folder-tree',\n Copy = 'fas fa-copy',\n Link = 'far fa-link',\n Cross = 'far fa-cross',\n Circle = 'far fa-circle',\n House = 'far fa-house',\n Comment = 'far fa-comment',\n GraduationCap = 'far fa-graduation-cap',\n Shield = 'far fa-shield',\n Medkit = 'far fa-medkit',\n Ambulance = 'far fa-ambulance',\n RingsWedding = 'far fa-rings-wedding',\n Medal = 'far fa-medal',\n Tag = 'far fa-tag',\n Loading = 'fa fa-spin fa-circle-notch',\n Paperclip = 'far fa-paperclip',\n ExternalLink = 'far fa-external-link',\n Comments = 'far fa-comments',\n Document = 'fas fa-file',\n Eye = 'fas fa-eye',\n Plus = 'far fa-plus',\n Route = 'far fa-route',\n Gear = 'far fa-cog',\n Gears = 'far fa-cogs',\n Check = 'far fa-check',\n CheckSquare = 'far fa-check-square',\n CheckCircle = 'far fa-check-circle',\n Pencil = 'far fa-pencil',\n Square = 'far fa-square',\n LightSquare = 'fal fa-square',\n SolidSquare = 'fas fa-square',\n Switch = 'far fa-exchange-alt',\n Refresh = 'far fa-redo-alt',\n Tags = 'far fa-tags',\n AddressBook = 'far fa-address-book',\n Start = 'far fa-play',\n Stop = 'far fa-stop',\n Lock = 'far fa-lock',\n FileAlt = 'far fa-file-alt',\n AlignJustify = 'far fa-align-justify',\n ExpandArrowsAlt = 'far fa-expand-arrows-alt',\n FilesMedical = 'far fa-files-medical',\n PersonStory = 'far fa-book',\n Male = 'far fa-mars',\n Female = 'far fa-venus',\n Google = 'fab fa-google',\n Child = 'fas fa-child',\n Man = 'fas fa-male',\n Baby = 'fas fa-baby',\n ProfileDocument = 'fal fa-file-user',\n LockAlt = 'fas fa-lock-alt',\n UnlockAlt = 'fas fa-unlock-alt',\n Print = 'fas fa-print',\n Clock = 'far fa-clock',\n Mailbox = 'far fa-mailbox',\n Inbox = 'far fa-inbox',\n ContactMoment = 'far fa-comments-alt',\n Key = 'far fa-key-skeleton',\n Filter = 'fas fa-filter',\n Download = 'fas fa-download',\n QR = 'fas fa-qrcode',\n}\n","import { IPlace, PlaceData } from \"./Place\";\nimport { T } from \"../Translate\";\nimport { Icon } from \"../components/Icons\";\n\nexport interface IMilitaryEntityFields {\n type: MilitaryEntityType;\n army: string;\n division?: string;\n brigade?: string;\n corps?: string;\n regiment?: string;\n unit?: string;\n unit_nr?: string;\n history?: MilitaryEntityEvent[];\n}\nexport interface IMilitaryEntity extends IMilitaryEntityFields {\n _id: string;\n}\n\nexport type MilitaryEntityEvent = IMilitaryEntityStructureEvent|IMilitaryEntityTrackEvent;\n\nexport interface IMilitaryEntityQuery {\n type: MilitaryEntityType|{'$in': MilitaryEntityType[]};\n}\n\nexport interface IMilitaryEntityStructureEvent {\n type: 'structure'|'attached';\n army: string;\n entity_id: string;\n entity?: IMilitaryEntity;\n from_date: string;\n to_date: string;\n description: string;\n}\n\nexport interface IMilitaryEntityTrackEvent extends PlaceData {\n type: 'track';\n from_date: string;\n to_date: string;\n description: string;\n track_type: MilitaryTrackType;\n place?: IPlace;\n}\n\nexport interface IMilitaryEntityChild {\n _id: string;\n from_date: string;\n to_date: string;\n military_entity: IMilitaryEntity;\n}\n\nexport enum MilitaryEntityType {\n Corps = 'corps',\n Division = 'division',\n Brigade = 'brigade',\n Regiment = 'regiment',\n Unit = 'unit'\n}\n\nexport const MilitaryEntityTypes: MilitaryEntityType[] = [\n MilitaryEntityType.Division,\n MilitaryEntityType.Brigade,\n MilitaryEntityType.Regiment,\n MilitaryEntityType.Unit\n];\n\nexport function getMilitaryEntityTypeName(type: MilitaryEntityType): string {\n switch (type) {\n case MilitaryEntityType.Corps: return T('militaryEntityType.corps');\n case MilitaryEntityType.Division: return T('militaryEntityType.division');\n case MilitaryEntityType.Brigade: return T('militaryEntityType.brigade');\n case MilitaryEntityType.Regiment: return T('militaryEntityType.regiment');\n case MilitaryEntityType.Unit: return T('militaryEntityType.unit');\n default: return type;\n }\n}\n\nexport function getMilitaryEntityEventIcon(type: 'structure'|'track'|'attached'): Icon {\n switch (type) {\n case 'structure': return Icon.Sitemap;\n case 'track': return Icon.Route;\n case 'attached': return Icon.Sitemap;\n default: return Icon.Info;\n }\n}\n\nexport function getMilitaryEntityEventTypeName(type: 'structure'|'track'|'attached'): string {\n switch (type) {\n case 'structure':\n case 'attached':\n return T('militaryEntityEventType.main.structure');\n case 'track':\n return T('militaryEntityEventType.main.track');\n default:\n return '';\n }\n}\n\n\nexport enum MilitaryTrackType {\n FrontierService = 'frontier_service',\n Support = 'support',\n HalfRest = 'half_rest',\n Rest = 'rest'\n}\n\nexport function getMilitaryTrackTypeName(type: MilitaryTrackType) {\n switch (type) {\n case MilitaryTrackType.FrontierService:\n return T('militaryEntityTrackType.frontierService');\n case MilitaryTrackType.Support:\n return T('militaryEntityTrackType.support');\n case MilitaryTrackType.HalfRest:\n return T('militaryEntityTrackType.halfRest');\n case MilitaryTrackType.Rest:\n return T('militaryEntityTrackType.rest');\n default:\n return '?';\n }\n}\n\nexport const Armies: string[] = [\n 'A.F.',\n 'A.B.L.',\n 'B.E.F.',\n 'N.Z.E.F.',\n 'A.I.F.',\n 'Indian Army',\n 'S.Afr.',\n 'C.E.F.',\n 'ANZAC',\n 'D.K.H.',\n 'U.S.A.',\n 'C.E.P.',\n 'E.I.',\n 'R.I.A.'\n];\n\nexport const ArmyNames: {[key: string]: string} = {\n 'A.F.': 'Armée Française',\n 'A.B.L.': 'Armée Belge / Belgisch Leger',\n 'D.K.H.': 'Deutsches Kaiserliches Heer',\n 'B.E.F.': 'British Expeditionary Force',\n 'C.E.F.': 'Canadian Expeditionary Force',\n 'A.I.F.': 'Australian Imperial Force',\n 'N.Z.E.F.': 'New Zealand Expeditionary Force',\n 'S.Afr.': 'South African Force',\n 'U.S.A.': 'United States Army',\n 'C.E.P.': 'Corpo Expedicionário Português',\n 'E.I.': 'Esercito Italiano',\n 'R.I.A.': 'Ruska Imperatorska Armija'\n};\n\nexport class MilitaryEntity {\n entity: IMilitaryEntity;\n\n constructor(entity: IMilitaryEntity) {\n this.entity = entity;\n }\n\n get id() {\n return this.entity._id;\n }\n\n get name() {\n switch (this.entity.type) {\n case MilitaryEntityType.Division:\n return (this.entity.division || '') + ', ' + this.entity.army;\n case MilitaryEntityType.Brigade:\n return (this.entity.brigade || '') + ', ' + this.entity.army;\n case MilitaryEntityType.Regiment:\n return (this.entity.regiment || '') + ', ' + this.entity.army;\n case MilitaryEntityType.Unit:\n return (this.entity.unit_nr || '')+ ' ' + (this.entity.unit || '')\n + ', ' + (this.entity.regiment || '')\n + ', ' + this.entity.army;\n default:\n console.log('Getting default name of ', this, this.entity);\n return '?, ' + this.entity.army;\n }\n }\n\n get type() {\n return this.entity.type;\n }\n\n get army() {\n return this.entity.army;\n }\n\n get regiment() {\n return this.entity.regiment;\n }\n\n get unit() {\n return this.entity.unit;\n }\n\n get unitNr() {\n return this.entity.unit_nr;\n }\n}\n","import { IPerson } from \"./Person\";\n\nexport enum DocumentCollectionType {\n Box = 'box'\n}\n\nexport enum DocumentCollectionStatus {\n Todo = 'todo',\n InProgress = 'in_progress',\n Done = 'done'\n}\n\nexport interface IDocumentCollection {\n _id: string;\n type: DocumentCollectionType;\n title: string;\n description: string;\n status: DocumentCollectionStatus;\n adlibId: string;\n adlibCode: string;\n personId: string|null;\n person?: IPerson|null;\n deleted?: boolean;\n}\n\nexport enum DocumentCollectionLoadOption {\n Person = 'EXTEND_PERSON'\n}\n\nexport class DocumentCollection {\n id: string;\n type: DocumentCollectionType;\n title: string;\n description: string;\n status: DocumentCollectionStatus;\n adlibId: string;\n adlibCode: string;\n person?: IPerson|null;\n deleted: boolean;\n\n static fromJSON(json: IDocumentCollection) {\n return new DocumentCollection(\n json._id,\n json.type,\n json.title,\n json.description,\n json.status,\n json.adlibId,\n json.adlibCode,\n json.person,\n json.deleted\n );\n }\n\n static empty() {\n return new DocumentCollection(\n '',\n DocumentCollectionType.Box,\n '',\n '',\n DocumentCollectionStatus.Todo,\n '',\n '',\n undefined,\n false\n );\n }\n\n constructor(\n id: string,\n type?: DocumentCollectionType,\n title?: string,\n description?: string,\n status?: DocumentCollectionStatus,\n adlibId?: string,\n adlibCode?: string,\n person?: IPerson|null,\n deleted?: boolean\n ) {\n this.id = id;\n this.type = type || DocumentCollectionType.Box;\n this.title = title || '';\n this.description = description || '';\n this.status = status || DocumentCollectionStatus.Todo;\n this.adlibId = adlibId || '';\n this.adlibCode = adlibCode || '';\n this.person = person;\n this.deleted = deleted || false;\n }\n\n toJSON(): IDocumentCollection {\n return {\n _id: this.id,\n type: this.type,\n title: this.title,\n description: this.description,\n status: this.status,\n personId: this.person ? this.person._id : null,\n adlibId: this.adlibId,\n adlibCode: this.adlibCode\n };\n }\n\n composedTitle(): string {\n return this.adlibCode + ' - ' + this.title;\n }\n}\n","export enum PageID {\n None = 'none',\n\n ActivateAccount = 'aa',\n AdvancedSearch = 'as',\n CreateCollection = 'cc',\n CreateDocument = 'dc',\n CreateContactPerson = 'cpc',\n CreateMemorial = 'mc',\n CreateMilitaryEntity = 'mec',\n CreatePerson = 'pc',\n CreatePlace = 'plc',\n EditCollection = 'ce',\n EditDocument = 'de',\n EditContactMoment = 'cme',\n EditContactPerson = 'cpe',\n EditDocumentPage = 'dpe',\n EditKeyLocation = 'kle',\n EditMemorial = 'me',\n EditMilitaryEntity ='mee',\n EditPerson = 'pe',\n EditPersonStory = 'pse',\n EditPlace = 'ple',\n Home = 'h',\n ListCollections = 'cl',\n ListContactPersons = 'cpl',\n ListContactMoments = 'cml',\n ListDocumentation = 'dl',\n ListKeyLocations = 'kll',\n ListMemorials = 'ml',\n ListMilitaryEntities = 'mel',\n ListPersonFeedback = 'pfl',\n ListPersons = 'pl',\n ListPersonStories = 'psl',\n ListPlaces = 'pll',\n ListProjects = 'prl',\n ListUsers = 'ul',\n Login = 'l',\n PublicSearch = 'ps',\n PublicViewPerson = 'pvp',\n PublicViewPersonStory = 'pvps',\n PublicViewKeyLocation = 'pvkl',\n PublicViewPersonKeyStory = 'pvpk',\n PublicViewProject = 'pvpr',\n PublicViewStoryPair = 'pvsp',\n RecordContactMoment = 'cmr',\n RequestPasswordReset = 'prr',\n ResetPassword = 'rp',\n SpecialFunctions = 'sf',\n ViewCollection = 'cv',\n ViewMemorial = 'mv',\n ViewMilitaryEntity = 'mev',\n ViewPerson = 'pv',\n ViewPlace = 'plv',\n ViewProject = 'prv',\n ViewDocument='dv',\n}\n\nexport class LinkToPage {\n page: PageID;\n param: string;\n\n constructor(page: PageID, param?: string) {\n this.page = page;\n this.param = param || '';\n }\n}\n\nexport function getPageLinkWithVia(toPage: PageID, toParam: string, viaPage: PageID, viaParam?: string) {\n return [getPageLink(toPage, toParam), getPageVia(viaPage, viaParam)].join('?via=')\n}\n\nexport function getPageVia(page: PageID, param?: string) {\n return param ? page + '~' + param : page;\n}\n\nexport function getViaLink(via: string): string {\n if (via.includes('~')) {\n return getPageLink(via as PageID, '');\n } else {\n const parts = via.split('~', 2);\n return getPageLink(parts[0] as PageID, parts[1]);\n }\n}\n\nexport function getPageLink(page: PageID, param: string) {\n switch (page) {\n case PageID.ActivateAccount:\n return '/activateAccount';\n case PageID.AdvancedSearch:\n return '/persons/search';\n case PageID.CreateCollection:\n return '/collections/create';\n case PageID.CreateDocument:\n return '/documents/create';\n case PageID.CreateContactPerson:\n return '/contact_persons/create';\n case PageID.CreateMemorial:\n return '/memorials/create'\n case PageID.CreateMilitaryEntity:\n return '/military_entities/create';\n case PageID.CreatePerson:\n return '/persons/create';\n case PageID.CreatePlace:\n return '/places/create';\n case PageID.EditCollection:\n return `/collections/${param}/edit`;\n case PageID.EditDocument:\n return `/documents/${param}`;\n case PageID.EditContactMoment:\n return `/contact_moments/${param}`;\n case PageID.EditContactPerson:\n return `/contact_persons/${param}`;\n case PageID.EditDocumentPage:\n const params = param.split('+');\n return `/documents/${params[0]}/${params[1]}`;\n case PageID.EditKeyLocation:\n return `/key_locations/${param}/edit`;\n case PageID.EditMemorial:\n return `/memorials/${param}/edit`;\n case PageID.EditMilitaryEntity:\n return `/military_entities/${param}/edit`;\n case PageID.EditPerson:\n return `/persons/${param}/edit`;\n case PageID.EditPersonStory:\n return `/personstories/${param}/edit`;\n case PageID.PublicViewKeyLocation:\n return `/public/key_locations/${param}`;\n case PageID.PublicViewPerson:\n return `/person/_id=${param}`;\n case PageID.PublicViewPersonStory:\n return `/public/personstories/${param}`;\n case PageID.PublicViewPersonKeyStory:\n return `/public/remembrancekey/${param}`;\n case PageID.PublicViewStoryPair:\n return `/public/storypair?${param}`;\n case PageID.EditPlace:\n return `/places/${param}/edit`;\n case PageID.Home:\n return '/';\n case PageID.ListCollections:\n return `/collections`;\n case PageID.ListContactPersons:\n return `/contact_persons`;\n case PageID.ListContactMoments:\n return `/contact_moments`;\n case PageID.ListDocumentation:\n return `/documentation`;\n case PageID.ListKeyLocations:\n return `/key_locations`;\n case PageID.ListMemorials:\n return `/memorials`;\n case PageID.ListMilitaryEntities:\n return `/military_entities`;\n case PageID.ListPersonFeedback:\n return `/persons/feedback`;\n case PageID.ListPersons:\n return `/persons`;\n case PageID.ListPersonStories:\n return `/personStories`;\n case PageID.ListPlaces:\n return `/places`;\n case PageID.ListProjects:\n return `/projects`;\n case PageID.ListUsers:\n return `/users`;\n case PageID.Login:\n return `/login`;\n case PageID.PublicSearch:\n return `/search`;\n case PageID.RecordContactMoment:\n return `/record_contact_moment`;\n case PageID.RequestPasswordReset:\n return `/requestPasswordReset`;\n case PageID.ResetPassword:\n return `/resetPassword`;\n case PageID.SpecialFunctions:\n return `/functions`;\n case PageID.ViewCollection:\n return `/collections/${param}`;\n case PageID.ViewMemorial:\n return `/memorials/${param}`;\n case PageID.ViewMilitaryEntity:\n return `/military_entities/${param}`;\n case PageID.ViewPerson:\n return `/persons/${param}`;\n case PageID.ViewPlace:\n return `/places/${param}`;\n case PageID.ViewProject:\n return `/projects/${param}`;\n case PageID.ViewDocument:\n return `/documents/${param}`;\n default:\n console.log('Unknown page ID:' + page);\n return ``; // fallback\n }\n}\n","import { Icon } from \"../components/Icons\";\nimport { LinkToPage, PageID } from \"../utils/PageLinking\";\n\nexport enum DocumentReferenceType {\n Person = 'person',\n Place = 'place',\n Toponym = 'toponym',\n Project = 'project',\n MilityEntity = 'military_entity',\n Memorial = 'memorial',\n Document = 'document',\n DibornDocument = 'diborn-document',\n ContactPerson = 'contact-person',\n KeyLocation = 'key_location',\n\n Empty = 'empty'\n}\n\nexport enum DocumentReferenceRelation {\n Mention = 'mention',\n Author = 'author',\n AddressedTo = 'addressed_to',\n ServedIn = 'served_in',\n WrittenLocation = 'written_location',\n\n None = '' // not yet filled in\n}\n\nexport interface IDocumentReference {\n _id?: string;\n type: DocumentReferenceType;\n name: string;\n relation: DocumentReferenceRelation;\n comment: string;\n info?: PersonInfo;\n}\n\nexport interface IDocumentRefReference {\n ref_id?: string;\n ref_type: DocumentReferenceType;\n ref_name: string;\n ref_relation: DocumentReferenceRelation;\n}\n\nexport interface PersonInfo {\n army?: string;\n serviceNumber?: string;\n diedDate?: { day: number, month: number, year: number }\n}\n\nexport class DocumentReference {\n static fromJSON(json: IDocumentReference) {\n return new DocumentReference(\n json._id,\n json.type,\n json.name,\n json.relation,\n json.comment,\n json.info);\n }\n\n static fromJSONRef(json: IDocumentRefReference) {\n return new DocumentReference(\n json.ref_id,\n json.ref_type,\n json.ref_name,\n json.ref_relation,\n '');\n }\n\n toJSON(): IDocumentReference {\n return {\n _id: this.id,\n type: this.type,\n name: this.name,\n relation: this.relation,\n comment: this.comment,\n };\n }\n\n toJSONRef(): IDocumentRefReference {\n return {\n ref_id: this.id,\n ref_type: this.type,\n ref_name: this.name,\n ref_relation: this.relation\n }\n }\n\n static empty() {\n return new DocumentReference('', DocumentReferenceType.Empty, '', DocumentReferenceRelation.None, '');\n }\n\n static emptyWithName(name: string) {\n return new DocumentReference('', DocumentReferenceType.Empty, name, DocumentReferenceRelation.None, '');\n }\n\n id: string|undefined;\n type: DocumentReferenceType;\n name: string;\n relation: DocumentReferenceRelation;\n comment: string;\n info?: PersonInfo;\n\n constructor(\n id: string|undefined,\n type: DocumentReferenceType,\n name: string,\n relation?: DocumentReferenceRelation,\n comment?: string,\n info?: PersonInfo\n ) {\n this.id = id;\n this.type = type;\n this.name = name;\n this.relation = relation || DocumentReferenceRelation.None;\n this.comment = comment || '';\n this.info = info;\n }\n\n getIcon(): Icon {\n switch (this.type) {\n case DocumentReferenceType.Person: return Icon.User;\n case DocumentReferenceType.Place: return Icon.MapMarker;\n case DocumentReferenceType.MilityEntity: return Icon.Sitemap;\n case DocumentReferenceType.Project: return Icon.Book;\n case DocumentReferenceType.Memorial: return Icon.Monument;\n case DocumentReferenceType.ContactPerson: return Icon.User;\n case DocumentReferenceType.KeyLocation: return Icon.Key;\n default: return Icon.Question;\n }\n }\n\n getLink(): LinkToPage {\n switch (this.type) {\n case DocumentReferenceType.Person: return new LinkToPage(PageID.ViewPerson, this.id);\n case DocumentReferenceType.Place: return new LinkToPage(PageID.ViewPlace, this.id);\n case DocumentReferenceType.MilityEntity: return new LinkToPage(PageID.ViewMilitaryEntity, this.id);\n case DocumentReferenceType.Project: return new LinkToPage(PageID.ViewProject, this.id);\n case DocumentReferenceType.Memorial: return new LinkToPage(PageID.ViewMemorial, this.id);\n case DocumentReferenceType.ContactPerson: return new LinkToPage(PageID.EditContactPerson, this.id);\n case DocumentReferenceType.KeyLocation: return new LinkToPage(PageID.EditKeyLocation, this.id);\n default: return new LinkToPage(PageID.Home);\n }\n }\n\n toString() {\n if (this.type === DocumentReferenceType.Person) {\n const info = this.info;\n\n let result = this.name;\n if (info && info.army) {\n result += ' (' + info.army;\n if (info.serviceNumber)\n result += ' N°' + info.serviceNumber;\n result += ')';\n }\n if (info && info.diedDate)\n result += ' †' + info.diedDate.day + '/' + info.diedDate.month + '/' + info.diedDate.year;\n return result;\n } else {\n return this.name;\n }\n }\n\n isEmpty() {\n return this.type === DocumentReferenceType.Empty;\n }\n\n\n}\n","import { getActiveLanguage, T, TranslationKey } from '../Translate';\nimport { DocumentTag, isReferenceFieldObject, getAllTagFields } from './DocumentTag';\nimport { IndexedList } from './IndexedList';\n\nexport interface IDocumentTagDefinition {\n id: string;\n translations: { [key: string]: string };\n fields: IDocumentTagField[];\n parent: string;\n selectable: boolean;\n validForDocument: boolean;\n validForContent: boolean;\n}\n\nexport enum DocumentTagFieldType {\n String = 'string',\n Text = 'text',\n Person = 'person',\n Place = 'place',\n MilitaryEntity = 'military_entity'\n}\n\nexport enum DocumentTagFieldPreposition {\n Colon = 'colon',\n From = 'from',\n To = 'to',\n Of = 'of',\n About = 'about'\n}\n\n\nexport function translateTagFieldPreposition(preposition: DocumentTagFieldPreposition) {\n return T(('preposition.' + preposition) as TranslationKey);\n}\n\nexport interface IDocumentTagField {\n key: string;\n type: DocumentTagFieldType;\n preposition: DocumentTagFieldPreposition;\n translations: { [language: string]: string };\n}\n\nexport class DocumentTagDefinition {\n static fromJSON(json: IDocumentTagDefinition) {\n return new DocumentTagDefinition(\n json.id,\n json.translations,\n json.fields.map(field => DocumentTagField.fromJSON(field)),\n json.parent,\n json.selectable,\n json.validForDocument,\n json.validForContent\n );\n }\n\n id: string;\n translations: { [key: string]: string };\n fields: DocumentTagField[];\n parent: string|null;\n selectable: boolean;\n validForDocument: boolean;\n validForContent: boolean;\n allFields?: DocumentTagField[];\n\n constructor(\n id: string,\n translations: { [key: string]: string },\n fields: DocumentTagField[],\n parent: string|null,\n selectable: boolean,\n validForDocument: boolean,\n validForContent: boolean\n ) {\n this.id = id;\n this.translations = translations;\n this.fields = fields;\n this.parent = parent;\n this.selectable = selectable;\n this.validForDocument = validForDocument;\n this.validForContent = validForContent;\n }\n\n completeFields(definitions: IndexedList) {\n this.allFields = getAllTagFields(this, definitions);\n }\n\n generateDescription(tag: DocumentTag) {\n let description = this.translations[getActiveLanguage()];\n if (this.allFields === undefined)\n return description;\n\n for (let field of this.allFields) {\n let fieldValue = tag.fields[field.key];\n if (fieldValue) {\n let value = isReferenceFieldObject(fieldValue) ? fieldValue.name : fieldValue;\n description += ' ' + translateTagFieldPreposition(field.preposition) + ' ' + value;\n }\n }\n return description;\n }\n}\n\nexport const DummyDocumentTagDefinition = new DocumentTagDefinition('_', {}, [], null, false, false, false);\n\nexport class DocumentTagField {\n static fromJSON(json: IDocumentTagField) {\n return new DocumentTagField(json.key, json.type, json.preposition, json.translations);\n }\n\n key: string;\n type: DocumentTagFieldType;\n preposition: DocumentTagFieldPreposition;\n translations: { [key: string]: string };\n\n constructor(\n key: string,\n type: DocumentTagFieldType,\n preposition: DocumentTagFieldPreposition,\n translations: { [key: string]: string }\n ) {\n this.key = key;\n this.type = type;\n this.preposition = preposition;\n this.translations = translations;\n }\n}\n","import { DocumentReference, IDocumentReference } from \"./DocumentReference\";\nimport { DocumentTagDefinition, DocumentTagField, DummyDocumentTagDefinition } from \"./DocumentTagDefinition\";\nimport { IndexedList } from \"./IndexedList\";\nimport { getActiveLanguage } from \"../Translate\";\n\nexport function getFullTagName(tags: IndexedList, tag: DocumentTagDefinition): string {\n const name = tag.translations[getActiveLanguage()];\n const parentTag = tag.parent && tags.indexed[tag.parent];\n if (parentTag) {\n const parentName = getFullTagName(tags, parentTag);\n return parentName + ' > ' + name;\n } else {\n return name;\n }\n}\n\nexport function getTagName(tag: IDocumentTag, tagDefinitions: IndexedList): string {\n return tagDefinitions.indexed[tag.tag].translations[getActiveLanguage()]\n}\n\ntype IDocumentTagFieldValue = string | IDocumentReference | null;\ntype IDocumentTagFields = { [key: string]: IDocumentTagFieldValue };\n\nexport interface IDocumentTag {\n tag: string;\n fields: IDocumentTagFields;\n}\n\nexport type DocumentTagFieldValue = string | DocumentReference | null;\ntype DocumentTagFields = { [key: string]: DocumentTagFieldValue };\n\nexport function isReferenceFieldValue(value: IDocumentTagFieldValue): value is IDocumentReference {\n return value !== undefined && value !== null && (value as any).type !== undefined;\n}\nexport function isReferenceFieldObject(value: DocumentTagFieldValue): value is DocumentReference {\n return value !== undefined && value !== null && (value as any).toJSON !== undefined;\n}\n\nexport class DocumentTag {\n static fromJSON(json: IDocumentTag, tagDefinitions: IndexedList) {\n\n let fields = json.fields;\n const transformedFields: DocumentTagFields = {};\n for (let key in fields) {\n const value = fields[key];\n transformedFields[key] = isReferenceFieldValue(value)\n ? DocumentReference.fromJSON(value)\n : value;\n }\n\n const definition = tagDefinitions.indexed[json.tag] || DummyDocumentTagDefinition;\n const allFields = getAllTagFields(definition, tagDefinitions);\n return new DocumentTag(\n definition,\n transformedFields,\n allFields,\n getFullTagName(tagDefinitions, definition)\n );\n }\n\n static create(tag: DocumentTagDefinition, tagDefinitions: IndexedList) {\n const allFields = getAllTagFields(tag, tagDefinitions);\n return new DocumentTag(\n tag,\n {},\n allFields,\n getFullTagName(tagDefinitions, tag)\n );\n }\n\n tag: DocumentTagDefinition;\n fields: DocumentTagFields;\n allFields: DocumentTagField[];\n parent?: DocumentTagDefinition;\n\n fullName: string;\n\n constructor(\n tag: DocumentTagDefinition,\n fields: DocumentTagFields,\n allFields: DocumentTagField[],\n fullName: string) {\n\n this.tag = tag;\n this.fields = fields;\n this.allFields = allFields;\n this.fullName = fullName;\n }\n\n equals(other: DocumentTag) {\n if (this.tag !== other.tag)\n return false;\n\n for (var property of this.allFields) {\n const valueA = this.fields[property.key];\n const valueB = other.fields[property.key];\n if (valueA && valueB && typeof(valueA) === 'object' && typeof(valueB) === 'object') {\n if (valueA.type !== valueB.type || valueA.id !== valueB.id)\n return false;\n } else if (valueA !== valueB) {\n return false;\n }\n }\n\n return true;\n }\n\n withFieldValue(field: string, value: DocumentTagFieldValue) {\n const update: DocumentTagFields = {};\n update[field] = value;\n return new DocumentTag(\n this.tag,\n Object.assign({}, this.fields, update),\n this.allFields,\n this.fullName\n );\n }\n\n toJSON(): IDocumentTag {\n let fields: IDocumentTagFields = {};\n for (let key in this.fields) {\n let field = this.fields[key];\n if (field && isReferenceFieldObject(field)) {\n fields[key] = field.toJSON();\n } else {\n fields[key] = field;\n }\n }\n\n return {\n tag: this.tag.id,\n fields: fields\n };\n }\n}\n\nexport function getAllTagFields(\n tag: DocumentTagDefinition,\n tags: IndexedList\n): DocumentTagField[] {\n const parent = tag.parent && tags.indexed[tag.parent];\n if (!parent)\n return tag.fields;\n\n return getAllTagFields(parent, tags).concat(tag.fields);\n}\n","import { T } from \"../Translate\";\nimport { ValidationError } from \"./ValidationResult\";\n\nexport interface ISpecialFunctionCategory {\n category: SpecialFunctionCategory;\n functions: ISpecialFunction[];\n}\n\nexport enum SpecialFunctionCategory {\n General = 'GENERAL',\n Logs = 'LOGS',\n Memorials = 'MEMORIALS',\n Persons = 'PERSONS',\n Places = 'PLACES',\n PersonStories = 'PERSONSTORIES'\n}\n\nexport function getSpecialFunctionCategoryName(category: SpecialFunctionCategory) {\n switch (category) {\n case SpecialFunctionCategory.General:\n return T('specialFunctionCategory.general');\n case SpecialFunctionCategory.Logs:\n return T('specialFunctionCategory.logs');\n case SpecialFunctionCategory.Memorials:\n return T('specialFunctionCategory.memorials');\n case SpecialFunctionCategory.Persons:\n return T('specialFunctionCategory.persons');\n case SpecialFunctionCategory.Places:\n return T(\"specialFunctionCategory.places\");\n case SpecialFunctionCategory.PersonStories:\n return T('specialFunctionCategory.personStories');\n default:\n return category;\n }\n}\n\nexport interface ISpecialFunction {\n name: string;\n displayName: string;\n description: string;\n columns: ISpecialFunctionColumn[],\n inputs: SpecialFunctionInput[]\n}\n\nexport interface ISpecialFunctionColumn {\n field: string;\n title: string;\n sortable?: boolean;\n type?: 'date';\n width?: number;\n}\n\nexport type SpecialFunctionInput = IBaseSpecialFunctionInput\n | IRepeatableSpecialFunctionInput\n | ISelectSpecialFunctionInput\n | ITextSpecialFunctionInput;\n\nexport interface IBaseSpecialFunctionInput {\n type: 'checkbox'|'country'|'date'|'datetime'|'location'|'repeatable'|'select'|'text';\n name: string;\n info: string;\n required: boolean;\n placeholder?: string;\n}\n\nexport interface IBasicSpecialFunctionInput extends IBaseSpecialFunctionInput {\n type: 'checkbox'|'country'|'date'|'datetime'|'location';\n}\n\nexport interface IRepeatableSpecialFunctionInput extends IBaseSpecialFunctionInput {\n type: 'repeatable';\n types: { name: string, inputs: SpecialFunctionInput[] }[]; // for repeatable\n}\n\nexport interface ISelectSpecialFunctionInput extends IBaseSpecialFunctionInput {\n type: 'select';\n options: string[]; // for select\n titles?: {[key: string]: string};\n}\n\nexport interface ITextSpecialFunctionInput extends IBaseSpecialFunctionInput {\n type: 'text';\n tailOption: boolean;\n autocomplete?: AutocompleteType;\n}\n\nexport enum AutocompleteType {\n Place = 'place',\n Memorial = 'memorial'\n}\n\n\nexport type SpecialFunctionArguments = {[key: string]: SpecialFunctionArgument};\n\nexport type SpecialFunctionArgument = \n boolean\n | string\n | ISpecialFunctionDateArgument\n | ISpecialFunctionDateTimeArgument\n | ISpecialFunctionLocationArgument\n | ISpecialFunctionRepeatableArgument[]\n | ISpecialFunctionTextArgument;\n\nexport interface ISpecialFunctionDateArgument {\n day: string;\n month: string;\n year: string;\n}\nexport interface ISpecialFunctionDateTimeArgument {\n day: string;\n month: string;\n year: string;\n hour: string;\n minute: string;\n}\nexport interface ISpecialFunctionLocationArgument {\n lat: string;\n lon: string;\n}\nexport interface ISpecialFunctionRepeatableArgument {\n type: string;\n inputs: SpecialFunctionArguments;\n}\nexport interface ISpecialFunctionTextArgument {\n value: string;\n id?: string;\n mode: TextMode;\n}\n\nexport enum TextMode {\n Complete = 'complete',\n Tail = 'tail',\n Head = 'head',\n Contains = 'contains',\n Selected = 'selected',\n NotEqual = 'not_equal',\n Empty = 'empty'\n}\n\nexport type SpecialFunctionResult = ISpecialFunctionTextResult|ISpecialFunctionTableResult;\n\nexport interface ISpecialFunctionTextResult {\n type: 'text';\n content: string;\n}\nexport interface ISpecialFunctionTableResult {\n type: 'table';\n elementType?: 'person'|'place'|'memorial'|'personStory';\n columns: ISpecialFunctionColumn[];\n data: SpecialFunctionTableItem[];\n total: number;\n actions?: string[];\n}\n\nexport type SpecialFunctionTableItem = { [key: string]: SpecialFunctionTableElement };\nexport type SpecialFunctionTableElement = string|{}|{ day: number, month: number, year: number};\n\nexport interface ISpecialFunctionValidationResult {\n status: 'OK'|'NOK';\n data?: ValidationErrors;\n extra?: {}\n}\n\nexport type ValidationErrors = {[key: string]: ValidationError|ValidationErrors[]};\n\nexport function getDefaultArguments(func?: ISpecialFunction): SpecialFunctionArguments {\n const result: SpecialFunctionArguments = {};\n if (!func)\n return result;\n \n func.inputs.forEach(input => {\n switch (input.type) {\n case 'checkbox': result[input.name] = false; break;\n case 'country': result[input.name] = '__'; break;\n case 'date': result[input.name] = { day: '', month: '', year: '' }; break;\n case 'datetime': result[input.name] = { day: '', month: '', year: '', hour: '', minute: '' }; break;\n case 'location': result[input.name] = { lat: '', lon: '' }; break;\n case 'repeatable': result[input.name] = []; break;\n case 'select': result[input.name] = (input as ISelectSpecialFunctionInput).options[0]; break;\n case 'text': result[input.name] = { value: '', mode: TextMode.Head }; break;\n }\n });\n return result;\n}\n","export const classes = (...cls: (string|undefined)[]) => {\n return cls.filter(cls => cls !== undefined).join(' ');\n}\n","import React, { ReactNode, CSSProperties } from 'react';\n\ninterface ButtonLinkProps {\n className?: string;\n onClick?: () => void;\n title?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\nexport const ButtonLink = (props: ButtonLinkProps) => {\n const { className, onClick, title, style, children } = props;\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n onClick && onClick();\n };\n return (\n // eslint-disable-next-line jsx-a11y/anchor-is-valid\n \n {children}\n \n );\n}\n","import React, { CSSProperties } from 'react';\nimport { PageID, getPageLink } from '../utils/PageLinking';\nimport { Link } from 'react-router-dom';\nimport { useAppSelector } from '../utils/Functional';\n\ninterface PageLinkProps {\n page: PageID;\n param?: string;\n className?: string;\n title?: string;\n style?: CSSProperties;\n target?: string;\n children: React.ReactNode;\n}\nexport default (props: PageLinkProps) => {\n const { page, param, children, style, ...otherProps } = props;\n const link = getPageLink(page, param || '');\n const currentPage = useAppSelector(state => state.activePageState);\n const via = currentPage.id + (currentPage.entity ? ('~' + currentPage.entity) : '');\n return {children};\n}\n","import React, { CSSProperties, ReactNode } from 'react';\nimport { Icon } from '../Icons';\nimport { classes } from '../../utils/Styles';\nimport styles from './Table.module.scss';\nimport { ButtonLink } from '../ButtonLink';\nimport PageLink from '../PageLink';\nimport { PageID } from '../../utils/PageLinking';\n\nexport enum ColumnAlign {\n Left,\n Right\n}\nexport interface ICellProps {\n onClick?: (e: React.SyntheticEvent) => void;\n className?: string;\n style?: CSSProperties;\n}\nexport interface IColumnOptions {\n sortable: boolean;\n align: ColumnAlign;\n clickable: boolean;\n width?: number;\n maxWidth?: number;\n ellipsize: boolean;\n className?: string;\n filter?: IFilterOption[];\n icon?: string;\n}\n\nexport interface IFilterOption {\n key: string,\n value: any,\n label: string\n}\n\nexport const DefaultColumnOptions: IColumnOptions = {\n sortable: true,\n align: ColumnAlign.Left,\n clickable: true,\n ellipsize: false\n}\n\nexport interface ITableColumn {\n id: string;\n title: string;\n options: IColumnOptions;\n\n render(item: T, props: ICellProps, state: S): JSX.Element;\n\n sort: (a: T, b: T) => number;\n}\n\nexport class StringTableColumn implements ITableColumn {\n id: string;\n title: string;\n getter: (item: T) => string|undefined;\n options: IColumnOptions;\n\n constructor(\n id: string,\n title: string,\n getter: (item: T) => string|undefined,\n options?: Partial\n ) {\n this.id = id;\n this.title = title;\n this.getter = getter;\n this.options = Object.assign({}, DefaultColumnOptions, options);\n }\n\n render(item: T, props: ICellProps): JSX.Element {\n const value = this.getter(item);\n if (value === undefined)\n props.className = classes(styles.noValue, props.className);\n \n return {value === undefined ? 'N/A' : value};\n }\n\n sort = (a: T, b: T): number => {\n return (this.getter(a) || '').localeCompare(this.getter(b) || '');\n }\n}\n\nexport class StringFieldTableColumn implements ITableColumn {\n id: string & keyof T;\n title: string;\n options: IColumnOptions;\n\n constructor(\n id: string & keyof T,\n title: string,\n options?: Partial\n ) {\n this.id = id;\n this.title = title;\n this.options = Object.assign({}, DefaultColumnOptions, options);\n }\n\n render(item: T, props: ICellProps): JSX.Element {\n return {item[this.id]};\n }\n\n sort = (a: T, b: T): number => {\n return (a[this.id] as any).toString().localeCompare(b[this.id] as any).toString();\n }\n}\n\nexport class IntegerFieldTableColumn implements ITableColumn {\n id: string & keyof T;\n title: string;\n options: IColumnOptions;\n\n constructor(\n id: string & keyof T,\n title: string,\n options?: Partial\n ) {\n this.id = id;\n this.title = title;\n this.options = Object.assign({}, DefaultColumnOptions, options);\n }\n\n render(item: T, props: ICellProps): JSX.Element {\n return {item[this.id]};\n }\n\n sort = (a: T, b: T): number => {\n return (a[this.id] as any) - (b[this.id] as any);\n }\n}\n\nexport class IntegerCalculatedTableColumn implements ITableColumn {\n id: string;\n title: string;\n projection: (item: T) => number;\n options: IColumnOptions;\n\n constructor(\n id: string & keyof T,\n title: string,\n projection: (item: T) => number,\n options?: Partial\n ) {\n this.id = id;\n this.title = title;\n this.projection = projection;\n this.options = Object.assign({}, DefaultColumnOptions, options);\n }\n\n render(item: T, props: ICellProps): JSX.Element {\n return {this.getValue(item)};\n }\n\n private getValue(item: T): number {\n return this.projection(item);\n }\n\n sort = (a: T, b: T): number => {\n return (this.getValue(a) - this.getValue(b));\n }\n}\n\n\n\n\nexport class ComponentTableColumn implements ITableColumn {\n id: string;\n title: string;\n renderer: (item: T) => ReactNode;\n options: IColumnOptions;\n sort: (a: T, b: T) => number;\n\n constructor(\n id: string,\n title: string,\n renderer: (item: T) => ReactNode,\n options?: Partial,\n sorter?: (a: T, b: T) => number\n ) {\n this.id = id;\n this.title = title;\n this.renderer = renderer;\n this.sort = sorter || ((a, b) => 0);\n this.options = Object.assign({}, DefaultColumnOptions, { sortable: false, clickable: false }, options);\n }\n\n render(item: T, props: ICellProps): JSX.Element {\n return {this.renderer(item)};\n }\n}\n\nexport enum TableRowActionStyle {\n Info = 'btn btn-info btn-link btn-xs',\n Success = 'btn btn-success btn-link btn-xs',\n Danger = 'btn btn-danger btn-link btn-xs',\n Warning = 'btn btn-warning btn-link btn-xs'\n}\nexport interface ITableRowAction {\n icon: Icon|((state: S) => JSX.Element);\n tooltip?: string;\n style?: TableRowActionStyle;\n onClick?: (item: T, state: S) => void;\n page?: PageID;\n pageParam?: string;\n}\nexport function tableRowActions(...actions: (false|null|undefined|ITableRowAction)[]): ITableRowAction[] {\n return actions.filter(action => action !== false && action !== null && action !== undefined) as ITableRowAction[];\n}\n\nfunction isIcon(icon: Icon|((state: S) => JSX.Element)): icon is Icon {\n return typeof(icon) === 'string';\n}\nexport class ActionsTableColumn implements ITableColumn {\n id: string;\n title: string;\n options: IColumnOptions;\n items: (item: T) => ITableRowAction[];\n\n constructor(\n id: string,\n title: string,\n items: (item: T) => ITableRowAction[],\n options?: Partial\n ) {\n this.id = id;\n this.title = title;\n this.options = Object.assign({}, DefaultColumnOptions, { sortable: false, align: ColumnAlign.Right }, options);\n this.items = items;\n }\n\n render(item: T, props: ICellProps, state: S): JSX.Element {\n const actions = this.items(item).map((action, index) => {\n const { icon, tooltip, style = TableRowActionStyle.Success, onClick, page, pageParam } = action;\n return page ? (\n \n {isIcon(icon) ? : icon(state)}\n \n ) : (\n onClick(item, state))} title={tooltip}>\n {isIcon(icon) ? : icon(state)}\n \n );\n });\n const style = Object.assign({ cursor: 'default' }, props.style);\n return (\n \n {actions}\n \n );\n }\n\n sort = (a: T, b: T) => 0;\n}\n","import React from 'react';\nimport { Pagination } from 'react-bootstrap';\nimport { Icon } from './Icons';\nimport { Noun, T, pluralize } from '../Translate';\n\ninterface PaginatorProps {\n page: number;\n pageSize: number;\n shownItems: number;\n totalItems: number;\n maxItems?: number;\n onPageSelected: (page: number) => void;\n noun: Noun;\n}\nexport class Paginator extends React.PureComponent {\n handleClickedFirst = () => {\n const { onPageSelected } = this.props;\n onPageSelected(0);\n }\n\n handleClickedPrevious = () => {\n const { page, onPageSelected } = this.props;\n onPageSelected(page - 1);\n }\n\n handleClickedPage = (e: React.SyntheticEvent) => {\n const { onPageSelected } = this.props;\n onPageSelected(parseInt(e.currentTarget.dataset.page || '0'));\n }\n\n handleClickedNext = () => {\n const { page, onPageSelected } = this.props;\n onPageSelected(page + 1);\n }\n\n handleClickedLast = () => {\n const { totalItems, pageSize, onPageSelected } = this.props;\n const numPages = Math.ceil(totalItems / pageSize);\n onPageSelected(numPages - 1);\n }\n\n render() {\n const { page, shownItems, totalItems, pageSize, maxItems = 9, noun } = this.props;\n const numPages = Math.ceil(totalItems / pageSize);\n if (numPages === 0)\n return
;\n\n const items: JSX.Element[] = [];\n items.push(\n \n \n \n );\n items.push(\n \n \n \n );\n\n let start: number;\n let end: number;\n if (numPages <= maxItems) {\n start = 0;\n end = numPages;\n } else if (page <= maxItems / 2) {\n start = 0;\n end = maxItems - 2;\n } else if (page >= numPages - (maxItems / 2)) {\n end = numPages;\n start = end - (maxItems - 2);\n } else {\n start = page - (maxItems - 5) / 2;\n end = start + maxItems - 4;\n }\n \n if (start > 0) {\n //items.push({1});\n items.push();\n }\n for (let i = start; i < end; i++) {\n if (i < 99)\n items.push({(i + 1)});\n }\n if (end < numPages) {\n items.push();\n //if (numPages < 99)\n // items.push({(numPages + 1)});\n }\n\n items.push(\n \n \n \n );\n items.push(\n \n \n \n );\n\n const fromItem = page * pageSize;\n const toItem = fromItem + shownItems;\n const label = T('table.showingXofY', {\n from: (fromItem + 1).toString(),\n to: toItem.toString(),\n noun: pluralize(noun, shownItems),\n total: totalItems.toString()\n });\n return (\n
\n {label}\n
\n \n {items}\n \n
\n );\n }\n}\n","import React, { CSSProperties, useMemo, useCallback, useState, useEffect, useRef } from 'react';\nimport { ITableColumn, ColumnAlign, IFilterOption } from './Fields';\nimport { Icon } from '../Icons';\nimport { classes } from '../../utils/Styles';\nimport styles from './Table.module.scss';\nimport { Paginator } from '../Paginator';\nimport { Noun, T } from '../../Translate';\nimport { usePopper } from 'react-popper';\nimport { Form } from 'react-bootstrap';\n\nexport enum SortDirection {\n Up = 'up',\n Down = 'down'\n}\n\nexport interface ITableFilter {\n column: string,\n value: string\n}\n\ninterface TableProps {\n displayedItems: T[];\n state?: S;\n columns: ITableColumn[];\n className?: string;\n rowKey?: (item: T, index: number) => string|number;\n onClickItem?: (item: T) => void;\n onPageChanged: (page: number) => void;\n onSortChanged: (column: string, direction: SortDirection) => void;\n onFilter?: (column: string, value: string|null) => void;\n noun: Noun;\n\n sortColumn: string;\n sortDirection: SortDirection;\n filters?: ITableFilter[];\n page: number;\n pageSize: number;\n totalItems: number;\n}\n\nfunction renderTH(\n column: ITableColumn,\n sortColumn: string,\n sortDirection: SortDirection,\n filter: string|undefined,\n onClickedSort: (column: ITableColumn) => void,\n onClickedFilter?: (column: string, option: string|null) => void\n) {\n let style: CSSProperties|undefined = undefined;\n if (column.options.align === ColumnAlign.Right)\n style = { textAlign: 'right' };\n if (column.options.width) {\n style = style || {};\n style.width = column.options.width;\n }\n if (column.options.maxWidth) {\n style = style || {};\n style.maxWidth = column.options.maxWidth;\n }\n\n if (column.options.sortable || column.options.filter) {\n const icon = sortColumn === column.id ? (sortDirection === SortDirection.Up ? Icon.SortUp : Icon.SortDown) : Icon.Sort;\n\n return (\n \n onClickedSort(column)}>{column.options.icon ? : column.title} {column.options.sortable && }\n {column.options.filter && onClickedFilter && (\n onClickedFilter(column.id, option)}\n />\n )}\n \n );\n } else {\n return {column.options.icon ? : column.title};\n }\n}\n\ninterface FilterIconProps {\n column: string,\n selected: string|null,\n filterOptions: IFilterOption[],\n onFilter: (value: string|null) => void\n}\nfunction FilterIcon(props: FilterIconProps) {\n const { column, selected, filterOptions, onFilter } = props;\n\n const [referenceElement, setReferenceElement] = useState(null);\n const [popperElement, setPopperElement] = useState(null);\n const [filterOpen, setFilterOpen] = useState(false);\n \n const { styles: popperStyles, attributes } = usePopper(referenceElement, popperElement, {});\n\n const windowClickedHandler = useRef<((e: MouseEvent) => void)|null>(null);\n useEffect(() => {\n if (filterOpen) {\n windowClickedHandler.current = (e: MouseEvent) => {\n console.log(e);\n if (popperElement && !popperElement.contains(e.target as Node) && referenceElement && !referenceElement.contains(e.target as Node)) {\n setFilterOpen(false);\n }\n };\n window.addEventListener('click', windowClickedHandler.current);\n\n return () => {\n if (windowClickedHandler.current) {\n window.removeEventListener('click', windowClickedHandler.current);\n windowClickedHandler.current = null;\n }\n }\n }\n }, [filterOpen, popperElement, referenceElement]);\n\n const handleClickedFilter = () => {\n setFilterOpen(!filterOpen);\n };\n\n const handleCheckedFilter = (checked: boolean, value: string|null) => {\n if (checked) {\n setFilterOpen(false);\n onFilter(value);\n }\n };\n\n return <>\n
\n \n
\n {filterOpen && (\n
\n handleCheckedFilter(e.currentTarget.checked, null)}\n />\n {filterOptions.map(option => (\n handleCheckedFilter(e.currentTarget.checked, option.value)}\n />\n ))}\n
\n )}\n ;\n}\n\nfunction renderRow(\n columns: ITableColumn[],\n rowKey: (item: T, index: number) => string|number,\n state: S,\n item: T,\n index: number,\n onClickItem?: ((item: T) => void)\n): JSX.Element {\n\n return (\n \n {columns.map(column => {\n const style: CSSProperties = { maxWidth: column.options.maxWidth, width: column.options.width };\n if (column.options.align === ColumnAlign.Right)\n style.textAlign = 'right';\n\n return column.render(\n item,\n {\n onClick: onClickItem && column.options.clickable ? () => onClickItem(item) : undefined,\n className: classes(\n onClickItem && column.options.clickable ? styles.clickableCell : undefined,\n column.options.ellipsize ? styles.ellipsize : undefined,\n column.options.className\n ),\n style\n },\n state\n );\n })}\n \n );\n}\n\nfunction renderHeader(\n columns: ITableColumn[],\n sortColumn: string,\n sortDirection: SortDirection,\n filters: ITableFilter[],\n onClickedSort: (column: ITableColumn) => void,\n onClickedFilter?: (column: string, option: string|null) => void\n) {\n return {columns.map(column => renderTH(\n column,\n sortColumn,\n sortDirection,\n filters.find(filter => filter.column === column.id)?.value,\n onClickedSort,\n onClickedFilter\n ))};\n}\n\nconst NO_FILTERS: ITableFilter[] = [];\n\nexport function Table(props: TableProps) {\n const {\n displayedItems,\n columns,\n className,\n rowKey = (_: T, index: number) => index,\n state = {} as S,\n onClickItem,\n onPageChanged,\n onSortChanged,\n onFilter,\n sortColumn,\n sortDirection,\n filters,\n page,\n pageSize,\n totalItems,\n noun\n } = props;\n\n\n const handleClickedSort = useCallback((column: ITableColumn) => {\n if (column.id === sortColumn) {\n const newDirection = sortDirection === SortDirection.Up ? SortDirection.Down : SortDirection.Up;\n onSortChanged(column.id, newDirection);\n } else {\n onSortChanged(column.id, SortDirection.Up);\n }\n }, [sortColumn, sortDirection, onSortChanged]);\n\n const renderedHeader = useMemo(() => renderHeader(columns, sortColumn, sortDirection, filters || NO_FILTERS, handleClickedSort, onFilter), [columns, sortColumn, sortDirection, handleClickedSort]);\n const renderedRows = useMemo(() => displayedItems.map((item, index) => renderRow(columns, rowKey, state, item, index, onClickItem)), [columns, displayedItems, rowKey, onClickItem, state]);\n\n return (\n <>\n \n \n {renderedHeader}\n \n \n {renderedRows}\n \n
\n
\n \n
\n \n );\n}\n\nexport function TableCardBody(props: TableProps & { tableClassName?: string }) {\n return (\n
\n \n \n );\n};\n\nexport function sortItems(\n columns: ITableColumn[],\n items: T[],\n sortColumn: string,\n sortDirection: SortDirection\n) {\n const column = columns.find(c => c.id === sortColumn);\n if (!column)\n return items;\n\n const result = [...items];\n result.sort(sortDirection === SortDirection.Up ? column.sort : (a, b) => column.sort(b, a));\n return result;\n}\n","export class IndexedList {\n static empty(): IndexedList {\n return new IndexedList([], (item => ''));\n }\n\n list: T[];\n indexed: {[key: string]: T};\n\n constructor(items: T[], indexer: (item: T) => string) {\n this.list = items;\n this.indexed = {};\n items.forEach(item => this.indexed[indexer(item)] = item);\n }\n}\n","import { User, IUser, AnonymousUser, IUserFields, Dataset } from './models/User';\nimport { DocumentCollection, IDocumentCollection, DocumentCollectionLoadOption } from './models/Collection';\nimport { IDocument, IDocumentElement, IDocumentFields } from './models/Document';\nimport { DocumentTagDefinition } from './models/DocumentTagDefinition';\nimport { DocumentReference, DocumentReferenceType } from './models/DocumentReference';\nimport { IPerson, IPersonWithEnlistedInfo, IPersonFields, IPersonMergeSuggestion, IPersonMilitaryInfo, IPersonMemoratedInfo, PersonQueryOptions } from './models/Person';\nimport { IPlace, IPlaceSearchResult, IPlaceFields } from './models/Place';\nimport $ from 'jquery';\nimport { IMemorial, GetMemorialOption, IMemorialFields } from './models/Memorial';\nimport { IPersonFeedback, IPersonFeedbackFields, PersonFeedbackLoadOptions, PersonFeedbackStatus } from './models/PersonFeedback';\nimport { IAttachment } from './models/Attachment';\nimport { IValidationResult } from './models/ValidationResult';\nimport { PersonEvent, PersonEventType, PersonEventLoadOption } from './models/PersonEvent';\nimport { ISpecialFunction, SpecialFunctionArguments, ISpecialFunctionCategory, SpecialFunctionResult, ISpecialFunctionValidationResult, TextMode } from './models/SpecialFunction';\nimport { IMilitaryEntity, IMilitaryEntityChild, IMilitaryEntityFields, IMilitaryEntityQuery, MilitaryEntityEvent } from './models/MilitaryEntity';\nimport { IQueryResult } from './models/Generic';\nimport { IPersonDocument, IPersonDocumentFields } from './models/PersonDocument';\nimport { IProject, IProjectFields } from './models/Project';\nimport { IPersonStoryFields, IPersonStory, PersonStoryLoadOption } from './models/PersonStory';\nimport { IPersonStory2, IPublishedPersonStory } from './models/PersonStory2';\n\nimport {\n IContactPersonFields,\n IContactPerson,\n ContactPersonEvent,\n BaseContactPersonEvent\n} from './models/ContactPerson';\nimport { SortDirection } from './components/table/Table';\nimport { IndexedList } from './models/IndexedList';\nimport { convertNonJSONRPCRequestError } from './utils/ErrorConverter'\nimport { CheckAdlibCodeResult } from './models/CheckAdlibCodeResult';\nimport { IPhotoMetadata } from './pages/EditPersonStory/Photos/PhotoSource';\nimport { ICountry } from './models/ICountry';\nimport { IKeyLocation } from './models/KeyLocation';\n\nexport interface IAPIError {\n code: number | string;\n data?: string;\n message: string;\n}\n\nexport interface IAuthenticationResponse {\n token: string;\n user: IUser;\n}\n\ninterface DocumentQuery {\n\n}\n\nexport enum GetPlaceOptions {\n Memorials = 'EMBED_MEMORIALS',\n EventsByType = 'EXTEND_EVENTS_BY_TYPE'\n}\n\nexport type ActionType = 'create'|'update';\n\nclass KnowledgeCenterAPI {\n baseUrl: string;\n url: string;\n uploadAttachmentUrl: string;\n uploadPageUrl: string;\n uploadDocumentUrl: string;\n id: number;\n token: string | null;\n user: User;\n refreshingToken: Promise | null;\n\n onRequireLogin?: () => Promise;\n onError?: (error: IAPIError) => void;\n failHandler?: (error: IAPIError) => void;\n\n documentTagDefinitions?: DocumentTagDefinition[];\n documentTagsIndexed?: IndexedList;\n\n constructor(url: string) {\n this.baseUrl = url;\n this.url = url + \"/v2\";\n this.uploadAttachmentUrl = url + '/file/uploadImage';\n this.uploadPageUrl = url + '/uploadpage/uploadImage';\n this.uploadDocumentUrl = url + '/uploaddocument/uploadImage';\n this.id = 1;\n this.token = localStorage.getItem('token') || null;\n this.user = this._loadUserFromLocalStorage();\n\n this.refreshingToken = null;\n }\n\n _loadUserFromLocalStorage() {\n let userJson = localStorage.getItem('user');\n if (userJson) {\n return User.fromJSON(JSON.parse(userJson));\n } else {\n return AnonymousUser;\n }\n }\n\n setToken(token: string) {\n this.token = token;\n\n localStorage.setItem('token', token);\n }\n\n useGuestToken() {\n this.token = 'GUEST';\n }\n\n logout() {\n this.token = null;\n this.user = AnonymousUser;\n\n localStorage.removeItem('token');\n localStorage.removeItem('user');\n }\n\n loginWith(authResponse: IAuthenticationResponse) {\n this.setToken(authResponse.token);\n this.user = User.fromJSON(authResponse.user);\n\n localStorage.setItem('user', JSON.stringify(authResponse.user));\n }\n\n _requestTyped(method: string, parameters: any, deserializer: (value: any) => T): Promise {\n return this._request(method, parameters).then(result => deserializer(result));\n }\n\n async _request(method: string, parameters: any): Promise {\n const id = this.id++;\n\n let parametersWithToken = parameters;\n if (method !== 'authenticate2' && !parameters.token)\n parametersWithToken = {...parameters, token: this.token || 'GUEST'};\n\n const data = {\n id: id,\n jsonrpc: '2.0',\n method: method,\n params: parametersWithToken\n };\n try {\n const success = await this._doRequest(data);\n if (success.result !== undefined) {\n return success.result;\n } else if (success.error) {\n throw success.error;\n } else {\n throw Error('Unexpected response');\n }\n } catch (errorResponse) {\n const error = convertNonJSONRPCRequestError(errorResponse)\n\n if ((error.code === 1009 || error.code === 1000) && this.onRequireLogin) {\n // 1009 = token to old\n // 1000 = invalid token\n // ask for login and try again\n const loginInfo = await this.onRequireLogin()\n if (loginInfo)\n return this._request(method, parameters);\n } else if (this.onError) {\n this.onError(error);\n }\n if (this.failHandler)\n this.failHandler(error);\n\n throw error;\n }\n }\n\n _doRequest(request: any) {\n // actually equivalent (and doesn't need jquery) - but would need to be tested for error handling conditions\n /*return fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json;charset=utf-8'\n },\n body: JSON.stringify(request),\n }).then(response => response.json());*/\n\n return Promise.resolve($.ajax({\n url: this.url,\n headers: {},\n type: 'POST',\n data: JSON.stringify(request),\n dataType: 'json',\n contentType: 'application/json; charset=utf-8'\n }));\n }\n\n _translateSort(sort: [string, SortDirection][]) {\n return sort.map(entry => [entry[0], entry[1] === SortDirection.Up ? 1 : -1]);\n }\n\n isLoggedIn() {\n return this.user.type !== 'anonymous';\n }\n\n isAdmin() {\n return this.user.type === 'admin';\n }\n\n /* === Global search === */\n\n search(query: string): Promise {\n return new Promise((resolve, reject) => resolve([]));\n }\n\n /* === Attachments === */\n\n updateAttachment(attachment: Partial & { _id: string }): Promise {\n return this._request(\n 'updateAttachment',\n { document: attachment }\n ) as Promise;\n }\n\n getAttachment(id: string): Promise {\n return this._request(\n 'getAttachment',\n { _id: id }\n ) as Promise;\n }\n\n validateAttachment(attachment: IAttachment, action: 'create'|'update'): Promise {\n return this._request(\n 'validateAttachment',\n { document: attachment, action }\n ) as Promise;\n }\n\n removeAttachment(id: string): Promise {\n return this._request('removeAttachment', { _id: id }) as Promise;\n }\n\n findAttachment(\n collection: string,\n collectionId: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = []\n ): Promise> {\n return this._request(\n 'findAttachment',\n {\n document: { collection, collection_id: collectionId },\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1\n }\n ) as Promise>;\n }\n\n /* === Authentication === */\n\n login(username: string, password: string): Promise {\n return this._request('authenticate2', {\n account: username,\n password: password\n }) as Promise;\n }\n\n activateUser(key: string, password: string): Promise<'OK'|'INVALID_KEY'> {\n return this._request('activateUser', {\n key,\n password\n }) as Promise<'OK'>;\n }\n\n resendUserInvitationMail(id: string) {\n return this._request('resendUserInvitationMail', { id });\n }\n\n requestUserPasswordReset(email: string): Promise<'OK'|'NOT_FOUND'> {\n return this._request('requestUserPasswordReset', { email }) as Promise<'OK'|'NOT_FOUND'>;\n }\n\n resetUserPassword(key: string, password: string): Promise<'OK'|'INVALID_KEY'> {\n return this._request('resetUserPassword', { key, password }) as Promise<'OK'|'INVALID_KEY'>;\n }\n\n getAuthenticatedUser(): Promise {\n return this._request('getAuthenticatedUser', {}) as Promise;\n }\n\n /* === Collection documents === */\n\n createCollectionDocument(document: IDocumentFields): Promise {\n return this._request('createCollectionDocument', { document }) as Promise;\n }\n\n updateCollectionDocument(document: Partial & { _id: string }): Promise {\n return this._request('updateCollectionDocument', { document: document }) as Promise;\n }\n\n updateCollectionDocumentElement(\n documentId: string,\n elementIndex: number,\n element: Partial,\n newElementIndex?: number\n ): Promise {\n return this._request('updateCollectionDocumentElement', {\n documentId,\n elementIndex,\n element,\n newElementIndex\n }) as Promise;\n }\n\n addCollectionDocumentSubdocument(documentId: string, index?: number): Promise<{main: IDocument, subdocument: IDocument}> {\n return this._request('addCollectionDocumentSubdocument', {\n documentId,\n index\n }) as Promise<{main: IDocument, subdocument: IDocument}>;\n }\n\n moveCollectionDocumentElements(\n fromDocumentId: string, toDocumentId: string | null, elements: number[]\n ): Promise<{from: IDocument, to: IDocument}> {\n return this._request('moveCollectionDocumentElements', {\n fromDocumentId,\n toDocumentId,\n elements\n }) as Promise<{from: IDocument, to: IDocument}>;\n }\n\n removeCollectionDocumentElements(documentId: string, elements: number[]): Promise {\n return this._request('removeCollectionDocumentElements', {\n documentId,\n elements\n }) as Promise;\n }\n\n getCollectionDocument(id: string) {\n return this._request('getCollectionDocument', { _id: id }) as Promise;\n }\n\n validateCollectionDocument(\n document: IDocument,\n action: 'create'|'update' | 'delete'\n ): Promise {\n\n return this._request(\n 'validateCollectionDocument',\n { document, action }\n ) as Promise;\n }\n\n removeCollectionDocument(id: string) {\n return this._request('removeCollectionDocument', { _id: id });\n }\n\n restoreCollectionDocument(id: string) {\n return this._request('restoreCollectionDocument', { _id: id });\n }\n\n findCollectionDocuments(\n query: any,\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n options: string[] | undefined = undefined,\n ref_type: 'person'|'place'|'memorial'|'military_entity'| undefined = undefined,\n ref_id: string | undefined = undefined\n ): Promise> {\n return this._request('findCollectionDocument', {\n document: query || {},\n filterValue: filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1,\n ref_id: ref_id,\n ref_type: ref_type,\n options: options\n }) as Promise>;\n }\n\n getCollectionDocuments(collectionId: string, includeRemoved: boolean = false) {\n return this._request(\n 'getCollectionDocuments',\n { collection: collectionId, includeDeleted: includeRemoved }\n ) as Promise;\n }\n\n getDocumentsRelatedTo(type: 'person'|'place'|'memorial'|'military_entity', id: string, options?: 'generateUrl'[]) {\n return this._request(\n 'getDocumentsRelatedTo',\n { type, id, options }\n ) as Promise;\n }\n\n countDocumentsRelatedTo(type: 'person'|'place'|'memorial'|'military_entity', id: string) {\n return this._request(\n 'countDocumentsRelatedTo',\n { type, id }\n ) as Promise;\n }\n\n getCollectionDocumentTags(): Promise {\n if (this.documentTagDefinitions)\n return Promise.resolve(this.documentTagDefinitions);\n\n return this._requestTyped(\n 'getCollectionDocumentTags',\n {},\n tags => {\n const result = tags.map(DocumentTagDefinition.fromJSON);\n this.documentTagDefinitions = result;\n return result;\n });\n }\n\n getCollectionDocumentTagsIndexed(): Promise> {\n if (this.documentTagsIndexed)\n return Promise.resolve(this.documentTagsIndexed);\n\n return this.getCollectionDocumentTags().then(tags => {\n const result = this.documentTagsIndexed = new IndexedList(tags, tag => tag.id);\n tags.forEach(tag => tag.completeFields(result));\n this.documentTagsIndexed = result;\n return result;\n });\n }\n\n getCollectionReference(type: DocumentReferenceType, id: string) {\n return this._requestTyped('getCollectionReference', {\n type: type,\n id: id\n }, DocumentReference.fromJSON);\n }\n\n searchCollectionReferences(type: DocumentReferenceType, query: string): Promise {\n return this._requestTyped('searchCollectionReferences', {\n type: type,\n query: query,\n limit:100\n }, references => references.map(DocumentReference.fromJSON));\n }\n\n /* === Document collections === */\n\n importDocumentCollection(\n adlibCode: string,\n type: 'box' = 'box'\n ): Promise {\n return this._request(\n 'importDocumentCollection',\n { adlibCode, type }\n ) as Promise;\n }\n\n createCollection(collection: DocumentCollection) {\n return this._requestTyped('createDocumentCollection', {\n document: collection.toJSON()\n }, DocumentCollection.fromJSON);\n }\n\n updateCollection(collection: DocumentCollection) {\n return this._requestTyped('updateDocumentCollection', {\n document: collection.toJSON()\n }, DocumentCollection.fromJSON);\n }\n\n getDocumentCollection(id: string, options: DocumentCollectionLoadOption[] = []) {\n return this._requestTyped('getDocumentCollection', {\n _id: id,\n options\n }, DocumentCollection.fromJSON);\n }\n\n getDocumentCollectionsForPerson(id: string) {\n return this._request(\n 'getDocumentCollectionsForPerson',\n { personId: id }\n ) as Promise;\n }\n\n validateDocumentCollection(\n collection: IDocumentCollection,\n action: 'create'|'update'\n ): Promise {\n return this._request('validateDocumentCollection', {\n document: collection,\n action\n }) as Promise;\n }\n\n removeCollection(id: string) {\n return this._request('removeDocumentCollection', { _id: id });\n }\n\n restoreCollection(id: string) {\n return this._request('restoreDocumentCollection', { _id: id });\n }\n\n findDocumentCollections(\n query: DocumentQuery,\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n includeRemoved: boolean = false\n ) {\n return this._request(\n 'findDocumentCollection',\n {\n document: query,\n filterValue: filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1,\n includeRemoved\n }) as Promise>;\n }\n\n /* === Person events === */\n\n createEvent(event: PersonEvent): Promise {\n return this._request(\n 'createEvent',\n { document: event }\n ) as Promise;\n }\n\n updateEvent(event: Partial & { _id: string }): Promise {\n return this._request(\n 'updateEvent',\n { document: event }\n ) as Promise;\n }\n\n getEvent(id: String, options: (PersonEventLoadOption|PersonQueryOptions)[] = []): Promise {\n return this._request(\n 'getEvent',\n { _id: id, options: options }\n ) as Promise;\n }\n\n validateEvent(\n document: PersonEvent,\n action: 'create'|'update'\n ): Promise {\n return this._request(\n 'validateEvent',\n { document, action }\n ) as Promise;\n }\n\n removeEvent(id: string): Promise {\n return this._request('removeEvent', { _id: id }) as Promise;\n }\n\n removeEventsForPerson(personId: string): Promise {\n return this._request(\n 'removeEvents',\n { document: { 'person_id': personId } }\n ) as Promise;\n }\n\n findEvents(\n document: { person_id?: string, type?: PersonEventType, place_id?: string },\n filter: string|undefined = undefined,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n options: (PersonEventLoadOption|PersonQueryOptions)[] = []\n ) {\n return this._request(\n 'findEvent',\n {\n document,\n filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1,\n options\n }\n ) as Promise>;\n }\n\n /* === Functions === */\n\n getFunctions(): Promise {\n return this._request('getFunctions', {}) as Promise;\n }\n\n getFunction(name: string): Promise {\n return this._request('getFunction', { name }) as Promise;\n }\n\n validateFunction(\n name: string,\n args: SpecialFunctionArguments\n ): Promise {\n return this._request(\n 'validateFunction',\n { name, arguments: args }\n ) as Promise;\n }\n\n callFunction(name: string, args: SpecialFunctionArguments): Promise {\n return this._request(\n 'callFunction',\n { name, arguments: args }\n ) as Promise;\n }\n\n applyAction(name: string, action: string, ids: string[]): Promise {\n return this._request(\n 'applyAction',\n { name, action, ids }\n ) as Promise;\n }\n\n callFunctionCsv(name: string, args: SpecialFunctionArguments): Promise {\n return this._request(\n 'callFunctionCsv',\n { name, arguments: args }\n ) as Promise;\n }\n\n /* === Memorials === */\n\n createMemorial(memorial: IMemorialFields): Promise {\n return this._request('createMemorial', { document: memorial }) as Promise;\n }\n\n updateMemorial(memorial: Partial & { _id: string }): Promise {\n return this._request('updateMemorial', { document: memorial }) as Promise;\n }\n\n getMemorial(id: string, options: GetMemorialOption[] = []): Promise {\n return this._request('getMemorial', { _id: id, options }) as Promise;\n }\n\n getMemorials(ids: string[]): Promise {\n return this._request('getMemorials', { ids }) as Promise;\n }\n\n validateMemorial(memorial: IMemorialFields & { _id?: string }, action: 'create'|'update') {\n return this._request(\n 'validateMemorial',\n { document: memorial, action }\n ) as Promise;\n }\n\n removeMemorial(id: string): Promise {\n return this._request(\n 'removeMemorial',\n { _id: id }\n ) as Promise;\n }\n\n findMemorials(\n filter: string = '',\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n options: GetMemorialOption[] = [],\n filterMode?: TextMode\n ) {\n return this._request('findMemorial', {\n document: {},\n skip,\n limit,\n sort: this._translateSort(sort),\n filterValue: filter,\n total: 1,\n options,\n filterMode\n }) as Promise>;\n }\n\n addPersonToMemorial(personId: string, memorialId: string) {\n return this._request('addPersonToMemorial', {\n person_id: personId,\n memorial_id: memorialId\n });\n }\n\n findPersonOnMemorial(\n memorialId: string,\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n options: string[] = []\n ) {\n return this._request('findPersonOnMemorial', {\n document: {},\n memorial_id: memorialId,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1,\n options,\n filterValue: filter\n }) as Promise>;\n }\n\n addNewPersonToMemorial(person: IPerson, memorialId: string) {\n return this._request(\n 'addNewPersonToMemorial',\n { document, memorial_id: memorialId }\n ) as Promise;\n }\n\n removePersonFromMemorial(personId: string, memorialId: string) {\n return this._request(\n 'removePersonFromMemorial',\n { person_id: personId, memorial_id: memorialId }\n ) as Promise;\n }\n\n /* === Military entities === */\n\n createMilitaryEntity(document: IMilitaryEntityFields) {\n return this._request(\n 'createMilitaryEntity',\n { document }\n ) as Promise;\n }\n\n updateMilitaryEntity(document: Partial & { _id: string }) {\n return this._request(\n 'updateMilitaryEntity',\n { document }\n ) as Promise;\n }\n\n getMilitaryEntity(id: string, options: ('history.entity'|'history.place')[] = []) {\n return this._request(\n 'getMilitaryEntity',\n { _id: id, fields: options }\n ) as Promise;\n }\n\n validateMilitaryEntity(document: IMilitaryEntityFields, action: 'create'|'update') {\n return this._request(\n 'validateMilitaryEntity',\n { document, action }\n ) as Promise;\n }\n\n validateMilitaryEntityHistory(\n document: MilitaryEntityEvent,\n action: 'create'|'update',\n militaryEntityId?: string,\n index?: number\n ) {\n return this._request(\n 'validateMilitaryEntityHistory',\n { document, action, _id: militaryEntityId, index }\n ) as Promise;\n }\n\n getMilitaryEntitiesIn(militaryEntityId: string) {\n return this._request(\n 'getMilitaryEntitiesIn',\n { entity_id: militaryEntityId }\n ) as Promise;\n }\n\n mergeMilitaryEntities(id1: string, id2: string) {\n return this._request(\n 'mergeMilitaryEntities',\n { _id1: id1, _id2: id2 }\n ) as Promise;\n }\n\n removeMilitaryEntity(id: string) {\n return this._request(\n 'removeMilitaryEntity',\n { _id: id }\n ) as Promise;\n }\n\n findMilitaryEntities(\n query: IMilitaryEntityQuery,\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = []\n ) {\n return this._request(\n 'findMilitaryEntity',\n {\n document: query,\n filterValue: filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1\n }\n ) as Promise>;\n }\n\n hasMilitaryEntity(query: IMilitaryEntityFields) {\n return this._request(\n 'hasMilitaryEntity',\n { document: query }\n ) as Promise;\n }\n\n getArmyList(\n query: Partial|undefined,\n filter: string|undefined,\n skip: number = 0,\n limit: number = 0\n ) {\n return this._request(\n 'getArmyList',\n { document: query, skip, limit, filterValue: filter }\n ) as Promise;\n }\n\n getRegimentList(\n query: Partial|undefined,\n filter: string|undefined,\n skip: number = 0,\n limit: number = 0\n ) {\n return this._request(\n 'getRegimentList',\n { document: query, skip, limit, filterValue: filter }\n ) as Promise;\n }\n\n getUnitList(\n query: Partial|undefined,\n filter: string|undefined,\n skip: number = 0,\n limit: number = 0\n ) {\n return this._request(\n 'getUnitList',\n { document: query, skip, limit, filterValue: filter }\n ) as Promise;\n }\n\n getUnitNumberList(\n query: Partial|undefined,\n filter: string|undefined,\n skip: number = 0,\n limit: number = 0\n ) {\n return this._request(\n 'getUnitNumberList',\n { document: query, skip, limit, filterValue: filter }\n ) as Promise;\n }\n\n getMilitaryEntitySoldiers(\n army: string,\n regiment: string,\n unit: string|null,\n unitNr: string|null,\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n options: PersonQueryOptions[] = []\n ) {\n return this._request(\n 'getMilitaryEntitySoldiers',\n {\n army,\n regiment,\n unit,\n unit_nr: unitNr,\n filterValue: filter,\n skip,\n limit,\n total: 1,\n sort: this._translateSort(sort),\n options: options\n }\n ) as Promise>;\n }\n\n /* === Persons === */\n\n createPerson(person: IPersonFields) {\n return this._request('createPerson', {\n document: person\n }) as Promise;\n }\n\n updatePerson(person: Partial & { _id: string }) {\n return this._request('updatePerson', {\n document: person\n }) as Promise;\n }\n\n getPerson(id: string, options: PersonQueryOptions[] = [], token?: string): Promise {\n return this._request('getPerson', { _id: id, options, token }) as Promise;\n }\n\n getPersons(ids: string[], options: string[] = []): Promise {\n return this._request('getPersons', { _ids: ids, options }) as Promise;\n }\n\n validatePerson(document: IPersonFields, action: 'create'|'update') {\n return this._request(\n 'validatePerson',\n { document, action }\n ) as Promise;\n }\n\n getMergeSuggestions(fromDate?: string, toDate?: string, limit?: number, offset?: number) {\n return this._request(\n 'getMergeSuggestions',\n { fromDate, toDate, limit, offset }\n ) as Promise>;\n }\n\n clearMergeSuggestion(personId: string) {\n return this._request(\n 'clearMergeSuggestion',\n { _id: personId }\n ) as Promise;\n }\n\n mergePersons(id1: string, id2: string) {\n return this._request(\n 'mergePersons',\n { _id1: id1, _id2: id2 }\n ) as Promise;\n }\n\n removePerson(id: string) {\n return this._request(\n 'removePerson',\n { _id: id }\n ) as Promise;\n }\n\n findPersons(\n queryDocument: { memorials?: string, 'project_memberships.project'?: string },\n filter: string = '',\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n options: PersonQueryOptions[] = [],\n dataset?: Dataset\n ): Promise> {\n return this._request('findPerson', {\n document: queryDocument,\n filterValue: filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n options,\n total: 1,\n dataset\n }) as Promise>;\n }\n\n findPersonAdvanced(query: SpecialFunctionArguments) {\n return this._request(\n 'findPersonAdvanced',\n { query }\n ) as Promise;\n }\n\n getPersonsDetails(ids: string[]) {\n return this._request(\n 'getPersonsDetails',\n { ids }\n ) as Promise<{[key: string]: IPersonMilitaryInfo}>;\n }\n\n getPersonsMemorated(ids: string[]) {\n return this._request(\n 'getPersonsMemorated',\n { ids }\n ) as Promise<{[key: string]: IPersonMemoratedInfo[]}>;\n }\n\n /* === Person documents === */\n\n createPersonDocument(document: IPersonDocumentFields) {\n return this._request(\n 'createDocument',\n { document }\n ) as Promise;\n }\n\n updatePersonDocument(document: Partial & { _id: string }) {\n return this._request(\n 'updateDocument',\n { document }\n ) as Promise;\n }\n\n\n getPersonDocument(id: string) {\n return this._request('getDocument', { _id: id }) as Promise;\n }\n\n getDocumentsForPerson(personId: string, options: string[] = []) {\n return this._request(\n 'getDocumentsForPerson',\n { personId, options }\n ) as Promise;\n }\n\n validatePersonDocument(document: IPersonDocumentFields & { _id?: string }, action: ActionType) {\n return this._request(\n 'validateDocument',\n { document, action }\n ) as Promise;\n }\n\n removePersonDocument(id: string) {\n return this._request(\n 'removeDocument',\n { _id: id }\n ) as Promise;\n }\n\n removeDocumentsForPerson(personId: string) {\n return this._request(\n 'removeDocumentsForPerson',\n { personId }\n ) as Promise;\n }\n\n findPersonDocuments(\n query: { person_id: string },\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][]\n ) {\n return this._request(\n 'findDocument',\n { document: query, skip, limit, sort, total: 1}\n ) as Promise>;\n }\n\n findAttachmentsForPersonDocument(id: string) {\n return this._request(\n 'findAttachmentsForDocument',\n { _id: id }\n ) as Promise;\n }\n\n /* === Places === */\n\n createPlace(place: IPlaceFields) {\n return this._request('createPlace', {\n document: place\n }) as Promise;\n }\n\n updatePlace(place: Partial & { _id: string }): Promise {\n return this._request('updatePlace', {\n document: place\n }) as Promise;\n }\n\n getPlace(id: string, options: GetPlaceOptions[] = []): Promise {\n return this._request('getPlace', {\n _id: id,\n options\n }) as Promise;\n }\n\n getCountries() {\n return this._request('getCountries', {}) as Promise;\n }\n\n validatePlace(\n place: IPlaceFields & { _id?: string },\n action: 'create'|'update'\n ): Promise {\n return this._request('validatePlace', {\n document: place,\n action\n }) as Promise;\n }\n\n canRemovePlace(id: string) {\n return this._request('canRemovePlace', { _id: id }) as Promise<0|1>;\n }\n\n mergePlaces(id1: string, id2: string) {\n return this._request(\n 'mergePlaces',\n { _id1: id1, _id2: id2 }\n ) as Promise;\n }\n\n removePlace(id: string) {\n return this._request(\n 'removePlace',\n { _id: id }\n ) as Promise;\n }\n\n findPlaces(\n filter: string,\n skip: number = 0,\n take: number = 100,\n sort: [string, SortDirection][] = [],\n options: GetPlaceOptions[] = [],\n filterMode?: TextMode|TextMode[],\n query?: Partial\n ) {\n return this._request('findPlace', {\n document: query || {},\n skip,\n limit: take,\n total: 1,\n filterValue: filter,\n sort: this._translateSort(sort),\n options: options,\n filterMode: filterMode || [TextMode.Head, TextMode.Contains],\n }) as Promise>;\n }\n\n findPlaceByNameAndCountryCode(name: string, language: string, countryCode: string) {\n return this._request(\n 'findPlaceByNameAndCountryCode',\n { name, lang: language, country_code: countryCode }\n ) as Promise;\n }\n\n findPlaceByRegion(\n name: string,\n region: string,\n countryCode: string,\n language: string = 'en'\n ) {\n return this._request(\n 'findPlaceByRegion',\n { name, region, country_code: countryCode, lang: language }\n ) as Promise;\n }\n\n geonamesAPI(name: string, countryCode: string, language: string) {\n return this._request('geonamesAPI', {\n name: name,\n country_code: countryCode,\n language: language\n }) as Promise<{ match: IPlace[], suggestions: IPlace[] }>;\n }\n\n googleMapsAPI(name: string, countryCode: string, language: string) {\n return this._request('googleMapsAPI', {\n name: name,\n country_code: countryCode,\n language: language\n }) as Promise;\n }\n\n googleMapsAPIMulti(name: string, countryCode: string, languages: string[]) {\n return this._request('googleMapsAPIMulti', {\n name,\n country_code: countryCode,\n languages\n }) as Promise<{[key: string]: IPlaceSearchResult}>;\n }\n\n /* === Projects === */\n\n createProject(document: IProjectFields) {\n return this._request('createProject', { document }) as Promise;\n }\n\n updateProject(document: Partial & { _id: string }) {\n return this._request('updateProject', { document }) as Promise;\n }\n\n getProject(id: string) {\n return this._request('getProject', { _id: id }) as Promise;\n }\n\n validateProject(document: IProjectFields, action: 'create'|'update') {\n return this._request(\n 'validateProject',\n { document, action }\n ) as Promise;\n }\n\n removeProject(id: string) {\n return this._request('removeProject', { _id: id });\n }\n\n findProjects(\n filter: string = '',\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][],\n document?: {}\n ) {\n return this._request('findProject', {\n document: document || {},\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1,\n filterValue: filter\n }) as Promise>;\n }\n\n /* == Stories === */\n\n createPersonStory(document: IPersonStoryFields) {\n return this._request('createStory', { document }) as Promise;\n }\n\n updatePersonStory(document: Partial & { _id: string }) {\n return this._request('updateStory', { document }) as Promise;\n }\n\n getPersonStory(id: string) {\n return this._request('getStory', { _id: id }) as Promise;\n }\n\n getStoriesForPerson(personId: string, options: PersonStoryLoadOption[]) {\n return this._request(\n 'getStoriesForPerson',\n { personId, options }\n ) as Promise;\n }\n\n validatePersonStory(document: IPersonStoryFields, action: 'create'|'update') {\n return this._request(\n 'validateStory',\n { document, action }\n ) as Promise;\n }\n\n removePersonStory(id: string) {\n return this._request('removePersonStory', { _id: id }) as Promise<'OK'>;\n }\n\n removeStoriesForPerson(personId: string) {\n return this._request('removeStoriesForPerson', { personId }) as Promise<'OK'>;\n }\n\n findPersonStories(\n document: Partial<{personId: string}> = {},\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = []\n ) {\n return this._request('findPersonStories', {\n document,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1\n }) as Promise>;\n }\n\n /* === Person Stories version 2 === */\n\n findPersonStories2(\n document: Partial<{_id: string}> = {},\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n filter: string | undefined = undefined,\n options?: ('linked_stories'|'person')[]\n ) {\n return this._request('findPersonStories', {\n document,\n skip,\n limit,\n sort: this._translateSort(sort),\n filterValue: filter,\n total: 1,\n options\n }) as Promise>;\n }\n\n\n findMatchingPersonStories(\n personStoryId: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = [],\n filter: string | undefined = undefined,\n options?: ('linked_stories'|'person')[]\n ) {\n return this._request('findMatchingPersonStories', {\n personStoryId,\n skip,\n limit,\n sort: this._translateSort(sort),\n filterValue: filter,\n total: 1,\n options\n }) as Promise>;\n }\n\n findPersonStoriesForPerson(\n personId: string,\n ): Promise> {\n let document = {person_id_ref: personId}\n return this._request('findPersonStories', {\n document,\n total: 1\n }) as Promise>;\n }\n\n\n getPersonStory2(id: string, options?: ('linked_stories'|'person'|'key_location'|'contact_persons')[]) {\n return this._request('getPersonStory', { _id: id, options }) as Promise;\n }\n\n validatePersonStory2(document: IPersonStory2, action: 'create'|'update'|'publish') {\n return this._request(\n 'validatePersonStory',\n { document, action }\n ) as Promise;\n }\n\n publishPersonStory2(id: string, target: string) {\n return this._request('publishPersonStory', { _id: id, target }) as Promise;\n }\n\n unpublishPersonStory2(id: string) {\n return this._request('unpublishPersonStory', { _id: id }) as Promise;\n }\n\n updatePersonStory2(document: Partial, options?: ('linked_stories'|'person'|'key_location'|'contact_persons')[]) {\n return this._request('updatePersonStory', { document: document, options: options }) as Promise;\n }\n\n createPersonStory2(document: Partial) {\n return this._request('createPersonStory', { document }) as Promise;\n }\n\n getPublishedPersonStory(id: string) {\n return this._request('getPublishedStoryFromMuseum', { id: id, token: 'GUEST' }) as Promise;\n }\n\n importDocumentPhotoToPersonStory(\n personStoryId: string,\n target: number|'profile'|'new',\n documentId: string,\n page: number,\n metadata?: IPhotoMetadata\n ) {\n return this._request('importDocumentPhotoToPersonStory', {\n personStoryId,\n target,\n documentId,\n page,\n metadata\n }) as Promise;\n }\n\n importAttachmentToPersonStory(\n personStoryId: string,\n target: number|'profile'|'new',\n attachmentId: string,\n metadata?: IPhotoMetadata\n ) {\n return this._request('importAttachmentToPersonStory', {\n personStoryId,\n target,\n attachmentId,\n metadata\n }) as Promise;\n }\n\n updatePersonStoryPhoto(\n personStoryId: string,\n target: number|'profile',\n metadata?: IPhotoMetadata\n ) {\n return this._request('updatePersonStoryPhoto', {\n personStoryId,\n target,\n metadata\n }) as Promise;\n }\n\n deletePersonStoryPhoto(personStoryId: string, target: number|'profile') {\n return this._request(\n 'deletePersonStoryPhoto',\n { personStoryId, target }\n ) as Promise;\n }\n\n /* === Person feedback === */\n\n createPersonFeedback(document: IPersonFeedbackFields) {\n return this._request(\n 'createSubmittedData',\n { document }\n ) as Promise;\n }\n\n updatePersonFeedback(document: Partial & { _id: string }) {\n return this._request(\n 'updateSubmittedData',\n { document }\n ) as Promise;\n }\n\n getPersonFeedback(id: string) {\n return this._request(\n 'getSubmittedData',\n { _id: id }\n ) as Promise;\n }\n\n validatePersonFeedback(document: IPersonFeedbackFields, action: 'create'|'update') {\n return this._request(\n 'validateSubmittedData',\n { document, action }\n ) as Promise;\n }\n\n removePersonFeedback(id: string) {\n return this._request('removeSubmittedData', { _id: id }) as Promise<'OK'>;\n }\n\n findPersonFeedback(\n filter: string,\n skip: number = 0,\n take: number = 0,\n sort: [string, SortDirection][] = [],\n options: PersonFeedbackLoadOptions[] = []\n ) {\n return this._request('findSubmittedData', {\n filterValue: filter,\n document: {},\n skip,\n limit: take,\n sort: this._translateSort(sort),\n total: 1,\n options\n }) as Promise>;\n }\n\n markPersonFeedback(id: string, status: PersonFeedbackStatus) {\n return this._request('markPersonFeedback', { _id: id, status }) as Promise;\n }\n\n /* === Users === */\n\n createUser(document: IUserFields) {\n return this._request('createUser', { document });\n }\n\n updateUser(document: Partial & { _id: string }) {\n return this._request('updateUser', { document });\n }\n\n getUser(id: string) {\n return this._request('getUser', { _id: id });\n }\n\n validateUser(document: IUserFields & { _id?: string }, action: 'create'|'update') {\n return this._request(\n 'validateUser',\n { document, action }\n ) as Promise;\n }\n\n removeUser(id: string) {\n return this._request('removeUser', { _id: id });\n }\n\n findUser(\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][]\n ) {\n return this._request('findUser', {\n document: {},\n filterValue: filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1\n }) as Promise>;\n }\n\n /* === Contact persons === */\n\n createContactPerson(document: IContactPersonFields): Promise {\n return this._request(\n 'createContactPerson',\n { document }\n ) as Promise;\n }\n\n updateContactPerson(document: { _id: string } & Partial) {\n return this._request(\n 'updateContactPerson',\n { document }\n ) as Promise;\n }\n\n deleteContactPerson(_id: string) {\n return this._request(\n 'removeContactPerson',\n { _id }\n ) as Promise<'OK'>;\n }\n\n getContactPerson(_id: string, options?: string[]): Promise {\n return this._request(\n 'getContactPerson',\n { _id, options }\n ) as Promise;\n }\n\n validateContactPerson(\n document: { id?: string } & Partial,\n action: ActionType\n ) {\n return this._request(\n 'validateContactPerson',\n { document, action }\n ) as Promise;\n }\n\n findContactPersons(\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = []\n ) {\n return this._request('findContactPerson', {\n document: {},\n filterValue: filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1\n }) as Promise>;\n }\n\n findContactPersonsByName(firstName: string, lastName: string) {\n return this._request(\n 'findContactPersonByName',\n { firstName, lastName }\n ) as Promise;\n }\n\n findContactPersonEvents(\n filter: string,\n skip: number = 0,\n limit: number = 0,\n sort: [string, SortDirection][] = []\n ) {\n return this._request('findContactPersonEvents', {\n document: {},\n filterValue: filter,\n skip,\n limit,\n sort: this._translateSort(sort),\n total: 1\n }) as Promise>;\n }\n\n createContactPersonEvent(document: ContactPersonEvent) {\n return this._request(\n 'createContactPersonEvent',\n { document }\n ) as Promise;\n }\n\n updateContactPersonEvent(document: { _id: string } & Partial) {\n return this._request(\n 'updateContactPersonEvent',\n { document }\n ) as Promise;\n }\n\n getContactPersonEvent(id: string) {\n return this._request(\n 'getContactPersonEvent',\n { _id: id }\n ) as Promise;\n }\n\n deleteContactPersonEvent(id: string) {\n return this._request(\n 'removeContactPersonEvent',\n { _id: id }\n ) as Promise<'OK'>;\n }\n\n getContactPersonEventsForPerson(contactPersonId: string) {\n return this._request(\n 'getContactPersonEventsForPerson',\n { contact_person_id: contactPersonId }\n ) as Promise;\n }\n\n findContactMomentsForPerson(personId: string) {\n return this._request(\n 'findContactMomentsForPerson',\n { person_id: personId }\n ) as Promise;\n }\n\n findContactMomentsForDocument(documentId: string) {\n return this._request(\n 'findContactMomentsForDocument',\n { document_id: documentId }\n ) as Promise;\n }\n\n checkAdlibCode(code: string) {\n return this._request(\n 'checkAdlibCode',\n { code }\n ) as Promise;\n }\n\n /* === Key locations === */\n\n createKeyLocation(document: Omit) {\n return this._request(\n 'createKeyLocation',\n { document }\n ) as Promise;\n }\n\n updateKeyLocation(document: Partial & { _id: string }) {\n return this._request(\n 'updateKeyLocation',\n { document }\n ) as Promise;\n }\n\n getKeyLocation(id: string, options: string[] = []) {\n return this._request(\n 'getKeyLocation',\n { _id: id, options }\n ) as Promise;\n }\n\n removeKeyLocation(id: string) {\n return this._request(\n 'removeKeyLocation',\n { _id: id }\n ) as Promise;\n }\n\n validateKeyLocation(document: Partial, action: ActionType) {\n return this._request(\n 'validateKeyLocation',\n { document, action }\n ) as Promise;\n }\n\n findKeyLocations(filter: string, skip: number, limit: number, sort: [string, SortDirection][] = [], options: string[] = []) {\n return this._request(\n 'findKeyLocations',\n { document: {}, filterValue: filter, skip, limit, sort: this._translateSort(sort), total: 1, options }\n ) as Promise>;\n }\n}\n\nlet url = \"/api\";\nif (document.location.host.indexOf(\"localhost\") === 0)\n url = \"http://localhost:8080\";\n\nexport default new KnowledgeCenterAPI(url);\n","import { IAPIError } from \"../api\";\n\n\nexport function convertNonJSONRPCRequestError(error: any) {\n if (\"readyState\" in error && error.readyState === 0) {\n const noConnectionError: IAPIError = {\n code: \"network\",\n message: \"No Network Response\",\n data: undefined\n }\n return noConnectionError;\n }\n // handle http errors\n if (\"status\" in error && error.status >= 400) {\n const httpError: IAPIError = {\n code: 'http',\n message: error.statusText,\n data: undefined\n }\n return httpError\n }\n return error;\n}\n","import React, { useCallback, useState } from 'react';\nimport { Modal } from 'react-bootstrap';\n\nexport interface ModalProps {\n key?: number;\n resolve: (value: T) => void;\n reject: () => void;\n onClosed: () => void;\n}\n\nexport function useModal(props: ModalProps)\n : [boolean, (result: T) => void]\n{\n const [isOpen, setOpen] = useState(true);\n const resolve = useCallback((result: T) => {\n props.resolve(result);\n setOpen(false);\n props.onClosed();\n }, [props.resolve, props.onClosed]); // eslint-disable-line react-hooks/exhaustive-deps\n return [isOpen, resolve];\n}\n\nexport interface BaseModalState {\n visible: boolean;\n}\nexport default class BaseModal, S extends BaseModalState> extends React.Component {\n accepted: boolean;\n size: 'sm'|'lg'|'xl'|undefined = undefined;\n\n constructor(props: P, size: 'sm'|'lg'|'xl'|undefined = undefined) {\n super(props);\n\n this.size = size;\n\n this.state = {\n visible: true,\n } as S;\n\n this.accepted = false;\n\n this.handleHide = this.handleHide.bind(this);\n }\n\n componentWillReceiveProps(newProps: P) {\n this.setState({ visible: true });\n }\n\n resolve(result: T) {\n this.accepted = true;\n\n this.setState({ visible: false });\n this.props.resolve(result);\n }\n\n close() {\n this.props.reject();\n this.setState({ visible: false });\n \n if (this.props.onClosed)\n this.props.onClosed();\n }\n\n handleHide() {\n if (!this.accepted)\n this.props.reject();\n\n this.setState({ visible: false });\n\n if (this.props.onClosed)\n this.props.onClosed();\n }\n\n renderModal(): JSX.Element {\n // implemented by subclass\n throw Error(\"not implemented\");\n }\n\n render() {\n return (\n \n {this.renderModal()}\n \n );\n }\n}\n","import React, { ReactNode } from 'react';\nimport styles from './ButtonRow.module.scss';\nimport { ModalFooter } from 'react-bootstrap';\n\nexport const ButtonRow = (props: { children: ReactNode }) => {\n const { children } = props;\n return (\n
\n {children}\n
\n );\n}\n\nexport const ButtonRowTop = (props: { children: ReactNode }) => {\n const { children } = props;\n return (\n
\n {children}\n
\n );\n}\n\nexport const BottomButtonRow = (props: { children: ReactNode }) => {\n const { children } = props;\n return (\n
\n
\n
\n {children}\n
\n
\n
\n );\n}\n\nexport const ButtonRowModalFooter = (props: { children: ReactNode }) => {\n const { children } = props;\n return (\n \n {children}\n \n );\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\n\ninterface ModalHeaderProps {\n children: string|JSX.Element;\n}\nexport const ModalHeader = (props: ModalHeaderProps) => {\n const { children } = props;\n\n return (\n \n {children}\n \n );\n}\n","import React from 'react';\nimport { ModalProps, useModal } from './BaseModal';\nimport { T } from '../Translate';\nimport { Button, Modal } from 'react-bootstrap';\nimport { ButtonRowModalFooter } from '../components/ButtonRow';\nimport { ModalHeader } from './ModalHeader';\n\ntype ButtonStyle = 'primary'\n | 'secondary'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info'\n | 'dark'\n | 'light'\n | 'link'\n | 'outline-primary'\n | 'outline-secondary'\n | 'outline-success'\n | 'outline-danger'\n | 'outline-warning'\n | 'outline-info'\n | 'outline-dark'\n | 'outline-light';\n\ninterface ConfirmationModalProps extends ModalProps {\n title: string;\n message: string;\n warning?: string;\n\n acceptStyle?: ButtonStyle;\n acceptText?: string;\n rejectText?: string;\n}\n\nexport const ConfirmationModal = (props: ConfirmationModalProps) => {\n const { title, message, warning, acceptStyle, acceptText, rejectText } = props;\n\n const [isOpen, resolve] = useModal(props);\n const handleClickedNo = () => resolve(false);\n const handleClickedYes = () => resolve(true);\n\n return (\n \n {title}\n \n

{message}

\n {warning &&

{warning}

}\n
\n \n \n \n \n
\n );\n}\n","import { IPlace } from \"./Place\";\nimport { IMilitaryEvent, PersonEvent, MemoratedKind } from \"./PersonEvent\";\nimport { T, TranslationKey } from \"../Translate\";\nimport { IPersonDocument } from \"./PersonDocument\";\nimport { IPersonStory } from \"./PersonStory\";\nimport { IMemorial } from \"./Memorial\";\n\nexport enum Gender {\n Undefined = 'UNDEFINED',\n Male = 'MALE',\n Female = 'FEMALE'\n}\n\nexport enum VictimType {\n Civilian = 'CIVILIAN',\n Military = 'MILITARY',\n None = 'NONE'\n}\n\nexport function translateVictimType(type: VictimType) {\n switch (type) {\n case VictimType.Civilian:\n return T('personType.civilian');\n case VictimType.Military:\n return T('personType.military');\n default:\n return T('personType.unknown');\n }\n}\n\nexport function translateWarCasualty(isWarCasualty: Boolean) {\n if (isWarCasualty) {\n return T('person.victim');\n } else {\n return T('person.survivor');\n }\n}\n\nexport enum VictimSubType {\n None = 'NONE',\n Unknown = 'UNKNOWN',\n Deportated = 'DEPORTATED',\n Executed = 'EXECUTED'\n}\n\nexport function translateVictimSubType(victimSubType: VictimSubType) {\n switch (victimSubType) {\n case VictimSubType.Deportated:\n return T('victimSubType.deportated');\n case VictimSubType.Executed:\n return T('victimSubType.executed');\n case VictimSubType.Unknown:\n return T('victimSubType.unknown');\n default:\n return T('victimSubType.none');\n }\n}\n\nexport function translateGender(gender: Gender) {\n switch (gender) {\n case Gender.Undefined:\n return T('gender.undefined');\n case Gender.Female:\n return T('gender.female');\n case Gender.Male:\n return T('gender.male');\n default:\n return T('gender.undefined');\n }\n}\n\nexport enum PersonRelationType {\n __Select__ = '__',\n Married = 'married',\n Parent = 'parent',\n Child = 'child',\n Sibling = 'sibling',\n Friend = 'friend',\n Fieldmate = 'fieldmate',\n Cousin = 'cousin',\n Other = 'other',\n Grandchild = 'grandchild',\n Grandparent = 'grandparent',\n Family = 'family'\n}\n\nexport interface IPersonRelation {\n person_id: string;\n relation: PersonRelationType;\n person?: IPerson;\n comments: string;\n}\n\nexport interface IPersonProjectMembership {\n project: string; // project ID\n notes: string;\n}\n\nexport enum PersonQueryOptions {\n MemorialIdsAndNames = 'EXTEND_MEMORIAL_IDS_NAMES',\n Memorials = 'EXTEND_MEMORIALS',\n Memorial = 'EXTEND_MEMORIAL',\n BornDate = 'EXTEND_BORN_DATE',\n BornPlaceId = 'EXTEND_BORN_PLACE_ID',\n DiedPlaceId = 'EXTEND_DIED_PLACE_ID',\n BornPlace = 'EXTEND_BORN_PLACE',\n DiedPlace = 'EXTEND_DIED_PLACE',\n DiedDate = 'EXTEND_DIED_DATE',\n MilitaryEvents = 'EXTEND_EVENTS_ENLISTED',\n Documents = 'EXTEND_DOCUMENTS',\n Storied = 'EXTEND_STORIES',\n EventsWithPlaces = 'EXTEND_EVENTS_WITH_PLACES',\n PhotoUrls = 'EXTEND_PHOTO_URLS',\n\n RelationPersons = 'EXTEND_RELATIONS'\n}\n\nexport interface IPersonFields {\n surname: string; // misnomer; actually first name\n familyname: string;\n gender: Gender;\n victim_type: VictimType;\n victim_type_details: string;\n\n born_day: string|null;\n born_month: string|null;\n born_year: string|null;\n sort_born_date: string;\n\n died_day: string|null;\n died_month: string|null;\n died_year: string|null;\n sort_died_date: string;\n died_age: number;\n\n alternative_surnames: string[];\n alternative_familynames: string[];\n nationality: string;\n initials: string;\n\n description: string;\n relations: IPersonRelation[];\n project_memberships: IPersonProjectMembership[];\n\n memorials: string[]; // memorial IDs\n extend_memorials?: IMemorial[];\n\n war_casualty: boolean;\n in_namelist: boolean;\n cwxrm_remembered: boolean;\n import_info?: unknown;\n}\n\nexport interface IPerson extends IPersonFields {\n _id: string;\n\n // extended information, available upon request\n extend_memorial_ids_names?: [string, string][];\n extend_born_date?: string;\n extend_born_place_id?: string;\n extend_died_place_id?: string;\n extend_born_place?: IPlace;\n extend_died_place?: IPlace;\n extend_died_date?: string;\n extend_events_enlisted?: IMilitaryEvent[];\n documents?: IPersonDocument[];\n stories?: IPersonStory[];\n events?: PersonEvent[];\n photo_urls?: { original: string, xs: string, l: string, xl: string }[];\n}\n\nexport interface IPersonWithEnlistedInfo extends IPerson {\n enlisted_day: number;\n enlisted_month: number;\n enlisted_year: number;\n enlisted_rank: string;\n enlisted_number: string;\n}\n\nexport class Person {\n id: string;\n firstName: string;\n lastName: string;\n alternativeFirstNames: string[];\n alternativeLastNames: string[];\n gender: Gender;\n bornDay: string|null;\n bornMonth: string|null;\n bornYear: string|null;\n bornDateSortable: string|null;\n diedDay: string|null;\n diedMonth: string|null;\n diedYear: string|null;\n diedDateSortable: string|null;\n diedAge: string|null;\n victimType: VictimType;\n victimTypeDetails: string;\n warCasualty: boolean;\n inNamelist: boolean;\n familyInfo: string;\n events: PersonEvent[];\n relations: IPersonRelation[];\n\n projects?: IPersonProjectMembership[];\n militaryEvents?: IMilitaryEvent[];\n memorialIdsAndNames?: { id: string, name: string }[];\n memorials?: IMemorial[];\n\n constructor(person: IPerson) {\n this.id = person._id || '';\n this.firstName = person.surname;\n this.lastName = person.familyname;\n this.alternativeFirstNames = person.alternative_surnames;\n this.alternativeLastNames = person.alternative_familynames;\n this.gender = person.gender;\n this.events = person.events || [];\n this.familyInfo = person.description;\n\n this.bornDay = person.born_day;\n this.bornMonth = person.born_month;\n this.bornYear = person.born_year;\n this.bornDateSortable = person.sort_born_date;\n\n this.diedDay = person.died_day;\n this.diedMonth = person.died_month;\n this.diedYear = person.died_year;\n this.diedAge = person.died_age.toString();\n this.diedDateSortable = person.sort_died_date;\n\n this.victimType = person.victim_type;\n this.victimTypeDetails = person.victim_type_details;\n this.warCasualty = person.war_casualty;\n this.inNamelist = person.in_namelist;\n\n this.projects = person.project_memberships;\n this.relations = person.relations;\n this.militaryEvents = person.extend_events_enlisted;\n this.memorials = person.extend_memorials || [];\n\n if (person.extend_memorial_ids_names) {\n this.memorialIdsAndNames = person.extend_memorial_ids_names\n .map(entry => ({ id: entry[0], name: entry[1] }));\n }\n }\n\n get name() {\n return this.firstName + ' ' + this.lastName;\n }\n\n get nameSortable() {\n return this.lastName + ' ' + this.firstName;\n }\n\n get birthDateFormatted(): string|undefined {\n if (this.bornDay || this.bornMonth || this.bornYear)\n return (this.bornDay || '?') + '/' + (this.bornMonth || '?') + '/' + (this.bornYear || '?');\n else\n return '';\n }\n\n get diedDateFormatted(): string|undefined {\n if (this.diedDay || this.diedMonth || this.diedYear)\n return (this.diedDay || '?') + '/' + (this.diedMonth || '?') + '/' + (this.diedYear || '?');\n else\n return '';\n }\n\n get hasBornDate(): boolean {\n return (this.bornDay || this.bornMonth || this.bornYear) != null;\n }\n\n get hasDiedDate(): boolean {\n return (this.diedDay || this.diedMonth || this.diedYear) != null;\n }\n\n describeType(): string {\n return translateVictimType(this.victimType) + ' ' + translateWarCasualty(this.warCasualty);\n }\n\n describeNameLister(): string {\n return this.inNamelist ? T('person.isNamelist') : '';\n }\n\n describeVictimSubtype(): string {\n return translateVictimSubType(this.victimTypeDetails as VictimSubType)\n }\n\n describeGender(): string {\n return translateGender(this.gender);\n }\n\n describeAge(): string {\n if (this.diedAge !== null) {\n let ageAsNumber = parseInt(this.diedAge)\n if (isNaN(ageAsNumber)) {\n return this.diedAge\n } else {\n if (ageAsNumber > 0) {\n return this.diedAge\n }\n }\n }\n return \"\"\n }\n\n static describePersonalRelationType(relationType: PersonRelationType, gender: Gender) : string {\n return T(gender === Gender.Undefined\n ? `relation.${relationType}` as TranslationKey\n : `relation.${relationType}.${gender.toLocaleLowerCase()}` as TranslationKey);\n }\n}\n\n\n\nexport interface IPersonMergeSuggestion {\n first: IPerson;\n second: IPerson;\n}\n\nexport interface IPersonMilitaryInfo {\n army?: string;\n rank?: string;\n number?: string;\n regiment?: string;\n unit?: string;\n unit_nr?: string;\n sub?: string;\n}\n\nexport interface IPersonMemoratedInfo {\n memorialId: string;\n memorialName: string;\n memorialReference: string;\n memorialKind: MemoratedKind;\n}\n","import { IDocumentCollection } from './Collection';\nimport { IDocumentReference, IDocumentRefReference } from './DocumentReference';\nimport { IDocumentTag } from './DocumentTag';\nimport { T, TranslationKey } from '../Translate';\n\nexport enum DocumentStatus {\n Todo = 'todo',\n InProgress = 'in_progress',\n Done = 'done'\n}\n\nexport enum DocumentCategory {\n Archive = 'ARCHIVE',\n Web = 'WEB',\n Wise = 'WISE',\n Digital = 'DIBORN',\n Adlib = 'ADLIBD',\n AdlibCollectionDocument = 'ADLIBC'\n}\n\nexport enum DocumentKind {\n Original = 'original',\n Copy = 'copy',\n Digital = 'digital',\n Reproduction = 'reproduction'\n}\n\nexport function getDocumentCategoryName(category: DocumentCategory) {\n return T(('document.category.' + category.toLowerCase()) as TranslationKey);\n}\n\nexport interface IBaseDocumentFields {\n category: DocumentCategory;\n kind: DocumentKind;\n parentId?: string;\n status: DocumentStatus;\n disclosed: boolean;\n\n title: string|null;\n description: string|null;\n\n // AdlibCollectionDocument\n filename?: string;\n collection_id?: string;\n\n // Adlib\n adlibId?: string;\n adlibCode?: string;\n\n // Archive\n institution?: string;\n inventoryId?: string;\n\n // Diborn\n source?: string;\n counter?: number\n\n // Web\n url?: string;\n\n // Wise\n wiseProfile?: string;\n wiseBranch?: string;\n wiseLocation?: string;\n wiseId?: string;\n pages?: string;\n}\n\n/**\n * Adds reference fields\n */\nexport interface IDocumentFields extends IBaseDocumentFields {\n tags: IDocumentTag[];\n references: IDocumentReference[];\n}\n\nexport interface IDocument extends IDocumentFields {\n _id: string;\n created?: number;\n modified?: number;\n elements: IDocumentElement[];\n referenced_entities: IDocumentRefReference[];\n\n collection?: IDocumentCollection;\n parent?: IDocument;\n deleted?: boolean;\n}\n\n\nexport interface IDocumentPage {\n type: 'page';\n tags: IDocumentTag[];\n references: IDocumentReference[];\n transcription: string;\n url_original: string;\n url_resized: string|null;\n original_filename?: string;\n mimetype: string;\n}\n\n\nexport interface IDocumentSubdocument {\n type: 'subdocument';\n documentId: string;\n document?: IDocument;\n}\n\nexport type IDocumentElement = IDocumentPage|IDocumentSubdocument;\n","export const zeroPad = (num: number, places: number) => {\n const zero = places - num.toString().length + 1;\n return Array(+(zero > 0 && zero)).join(\"0\") + num;\n}\n","import moment from 'moment';\nimport { DocumentCollection } from './Collection';\nimport { DocumentReference } from './DocumentReference';\nimport { IndexedList } from './IndexedList';\nimport { DocumentTagDefinition } from './DocumentTagDefinition';\nimport { DocumentTag } from './DocumentTag';\nimport { T, TranslationKey } from '../Translate';\nimport {\n DocumentCategory,\n DocumentKind,\n DocumentStatus,\n IDocument,\n IDocumentElement\n} from './IDocument'\nimport { zeroPad } from \"../utils/Formatting\";\n\n\nexport function getDocumentCategoryName(category: DocumentCategory) {\n return T(('document.category.' + category.toLowerCase()) as TranslationKey);\n}\n\n\nexport interface DocumentProps {\n category: DocumentCategory;\n kind: DocumentKind;\n parentId?: string;\n status: DocumentStatus;\n disclosed: boolean;\n\n description: string|null;\n\n // AdlibCollectionDocument\n filename?: string;\n collectionId?: string;\n\n // Adlib\n adlibId?: string;\n adlibCode?: string;\n\n // Archive\n institution?: string;\n inventoryId?: string;\n\n // Diborn\n source?: string;\n counter?: number\n\n // Web\n url?: string;\n\n // Wise\n wiseProfile?: string;\n wiseBranch?: string;\n wiseLocation?: string;\n wiseId?: string;\n pages?: string;\n id: string\n parent?: Document\n tags?: DocumentTag[],\n elements?: IDocumentElement[],\n references?: DocumentReference[],\n referenced_entities?: DocumentReference[],\n title?: string,\n created?: moment.Moment\n modified?: moment.Moment\n deleted?: boolean\n collection?: DocumentCollection\n\n\n}\n\nexport class Document {\n\n static fromProps(params: DocumentProps): Document {\n return new Document(\n params.id,\n params.category,\n params.kind,\n params.parentId,\n params.parent,\n params.tags,\n params.status,\n params.disclosed,\n params.elements,\n params.references,\n params.referenced_entities,\n params.title || undefined,\n params.description || undefined,\n params.created,\n params.modified,\n params.deleted,\n params.collectionId,\n params.collection,\n params.filename,\n params.adlibId,\n params.adlibCode,\n params.institution,\n params.inventoryId,\n params.source,\n params.counter,\n params.url,\n params.wiseProfile,\n params.wiseBranch,\n params.wiseLocation,\n params.wiseId,\n params.pages\n )\n }\n\n\n static fromJSON(json: IDocument, definitions: IndexedList): Document {\n return new Document(\n json._id,\n json.category,\n json.kind,\n json.parentId,\n json.parent && Document.fromJSON(json.parent, definitions),\n json.tags.map(tag => DocumentTag.fromJSON(tag, definitions)),\n json.status,\n json.disclosed,\n json.elements,\n json.references.map(reference => DocumentReference.fromJSON(reference)),\n json.referenced_entities.map(reference => DocumentReference.fromJSONRef(reference)),\n json.title || undefined,\n json.description || undefined,\n moment(json.created),\n moment(json.modified),\n json.deleted || false,\n\n // AdlibCollectionDocument\n json.collection_id,\n json.collection && DocumentCollection.fromJSON(json.collection),\n json.filename,\n // Adlib\n json.adlibId,\n json.adlibCode,\n // Archive\n json.institution,\n json.inventoryId,\n // Digital\n json.source,\n json.counter,\n // Web\n json.url,\n // Wise\n json.wiseProfile,\n json.wiseBranch,\n json.wiseLocation,\n json.wiseId,\n json.pages\n );\n }\n\n static empty() {\n return new Document(\n '',\n DocumentCategory.Adlib,\n DocumentKind.Original,\n undefined,\n undefined,\n [],\n DocumentStatus.Todo,\n false,\n [],\n [],\n [],\n undefined,\n undefined,\n moment(),\n moment(),\n undefined,\n );\n }\n\n id: string;\n category: DocumentCategory;\n kind: DocumentKind;\n parentId: string | null;\n parent: Document | undefined;\n tags: DocumentTag[];\n status: DocumentStatus;\n disclosed: boolean;\n elements: IDocumentElement[];\n references: DocumentReference[];\n referenced_entities: DocumentReference[];\n description?: string;\n created: moment.Moment;\n modified: moment.Moment;\n deleted: boolean;\n\n filename: string;\n collectionId: string | null;\n collection?: DocumentCollection;\n\n adlibId?: string;\n adlibCode?: string;\n\n institution?: string;\n inventoryId?: string;\n\n source?: string;\n counter?: number;\n\n url?: string;\n\n wiseProfile?: string;\n wiseBranch?: string;\n wiseLocation?: string;\n wiseId?: string;\n pages?: string;\n\n _title?: string;\n filterLower?: string;\n\n constructor(\n id: string,\n category: DocumentCategory,\n kind: DocumentKind,\n parentId?: string,\n parent?: Document,\n tags?: DocumentTag[],\n status?: DocumentStatus,\n disclosed?: boolean,\n elements?: IDocumentElement[],\n references?: DocumentReference[],\n referenced_entities?: DocumentReference[],\n title?: string,\n description?: string,\n created?: moment.Moment,\n modified?: moment.Moment,\n deleted?: boolean,\n collectionId?: string | null,\n collection?: DocumentCollection,\n filename?: string,\n adlibId?: string,\n adlibCode?: string,\n institution?: string,\n inventoryId?: string,\n source?: string,\n counter?: number,\n url?: string,\n wiseProfile?: string,\n wiseBranch?: string,\n wiseLocation?: string,\n wiseId?: string,\n pages?: string\n ) {\n this.id = id;\n this.category = category;\n this.kind = kind;\n this.parentId = parentId || null;\n this.parent = parent;\n this.tags = tags || [];\n this.status = status || DocumentStatus.Todo;\n this.disclosed = disclosed || false;\n this.elements = elements || [];\n this.references = references || [];\n this.referenced_entities = referenced_entities || [];\n this._title = title;\n this.description = description;\n this.created = created || moment();\n this.modified = modified || this.created;\n this.deleted = deleted || false;\n\n this.collectionId = collectionId || null;\n this.filename = filename || '';\n this.collection = collection;\n\n this.adlibId = adlibId;\n this.adlibCode = adlibCode;\n\n this.institution = institution;\n this.inventoryId = inventoryId;\n\n this.source = source;\n this.counter = counter;\n\n this.url = url;\n\n this.wiseProfile = wiseProfile;\n this.wiseBranch = wiseBranch;\n this.wiseLocation = wiseLocation;\n this.wiseId = wiseId;\n this.pages = pages;\n }\n\n matchesFilterLower(filter: string) {\n if (this.filterLower === undefined)\n this.filterLower = this.title.toLowerCase();\n\n return this.filterLower.indexOf(filter) >= 0;\n }\n\n clone() {\n return new Document(\n this.id,\n this.category,\n this.kind,\n this.parentId || undefined,\n this.parent,\n this.tags,\n this.status,\n this.disclosed,\n this.elements,\n this.references,\n this.referenced_entities,\n this.title,\n this.description,\n this.created,\n this.modified,\n this.deleted,\n\n this.collectionId,\n this.collection,\n this.filename,\n\n this.adlibId,\n this.adlibCode,\n\n this.institution,\n this.inventoryId,\n\n this.source,\n this.counter,\n\n this.url,\n\n this.wiseProfile,\n this.wiseBranch,\n this.wiseLocation,\n this.wiseId,\n this.pages\n );\n }\n\n\n toJSON(): IDocument {\n return {\n\n // diborn\n _id: this.id,\n category: this.category,\n title: this.title || null,\n description: this.description || null,\n source: this.source,\n tags: this.tags.map(tag => tag.toJSON()),\n kind: this.kind,\n status: this.status,\n elements: this.elements,\n references: this.references.map(reference => reference.toJSON()),\n parentId: this.parentId ?? undefined,\n deleted: this.deleted,\n disclosed: this.disclosed,\n created: 0,\n modified: 0,\n referenced_entities: this.referenced_entities.map(entity => entity.toJSONRef()),\n\n // archive\n institution: this.institution,\n inventoryId: this.inventoryId,\n\n // web\n url: this.url,\n\n // Diborn\n counter: this.counter,\n\n // wise\n wiseProfile: this.wiseProfile,\n wiseBranch: this.wiseBranch,\n wiseLocation: this.wiseLocation,\n wiseId: this.wiseId,\n pages: this.pages\n }\n }\n\n get documentId() {\n return (this.collection && this.collection.adlibCode) || this.adlibCode || this.wiseLocation || this.inventoryId || '';\n }\n\n get title() {\n if (this._title === undefined || this._title === '')\n if (this.category === DocumentCategory.Adlib ||\n this.category === DocumentCategory.AdlibCollectionDocument) {\n return ''\n } else {\n return ''\n }\n return this._title;\n }\n\n static renderDocumentCounter(counter: number | undefined) {\n let result: string = ''\n if (counter === undefined || counter < 0) {\n result = ''\n } else {\n result = 'DIBO' + zeroPad(counter, 6)\n }\n return result\n }\n\n\n static generateTitle(tags: DocumentTag[]) {\n let result = \"\";\n let first = true;\n\n for (let i = 0; i < tags.length; i++) {\n let tag = tags[i];\n let tagDefinition = tag.tag;\n\n if (first) {\n first = false;\n } else {\n result += \", \";\n }\n\n result += tagDefinition.generateDescription(tag);\n }\n return result;\n }\n}\n\nexport * from './IDocument'\n","import { T } from \"../../Translate\";\nimport { IPersonStory2 } from \"../PersonStory2\";\n\nexport class PersonStoryHelper {\n\n static personName = (personStory: IPersonStory2 | undefined): string => {\n if (!personStory) {\n return '...'\n }\n let result: string = ''\n if (personStory.first_name.length > 0)\n result = result + personStory.first_name + ' '\n if (personStory.family_name.length > 0)\n result = result + personStory.family_name\n return result.length > 0 ? result : T('personstories.messages.noNamesSet')\n }\n}\n","import { useEffect, useState, useMemo } from 'react';\nimport { T } from '../Translate';\nimport { Person } from '../models/Person';\nimport { Document } from '../models/Document';\nimport { Place } from '../models/Place';\nimport api from '../api';\nimport { PageID } from '../utils/PageLinking';\nimport { MilitaryEntity } from '../models/MilitaryEntity';\nimport { PersonStoryHelper } from \"../models/wrappers/PersonStoryHelper\";\n\nexport enum PageLayout {\n Regular, // default\n NoFrames // used by login\n}\n\nfunction useBaseBreadcrumbs(via: string, viaTitle?: string): Breadcrumb[] {\n const [viaEntity, viaId] = via.split('~', 2);\n const [title, setTitle] = useState(viaTitle || '...');\n const [intermediateId, setIntermediateId] = useState('');\n\n useEffect(() => {\n if (viaTitle !== undefined) {\n setTitle(viaTitle);\n return;\n }\n\n setTitle('...');\n switch (viaEntity as PageID) {\n case PageID.ViewMilitaryEntity:\n case PageID.EditMilitaryEntity:\n if (viaId) {\n api.getMilitaryEntity(viaId)\n .then(entity => setTitle(new MilitaryEntity(entity).name));\n }\n break;\n case PageID.ViewCollection:\n case PageID.EditCollection:\n if (viaId) {\n api.getDocumentCollection(viaId)\n .then(collection => setTitle(collection.composedTitle()));\n }\n break;\n case PageID.EditDocument:\n if (viaId) {\n Promise.all([\n api.getCollectionDocument(viaId),\n api.getCollectionDocumentTagsIndexed()\n ]).then(([document, tags]) => {\n setTitle(Document.fromJSON(document, tags).title);\n });\n }\n break;\n case PageID.ViewPerson:\n case PageID.EditPerson:\n case PageID.PublicViewPerson:\n api.getPerson(viaId).then(person => setTitle(new Person(person).name));\n break;\n case PageID.EditPersonStory:\n if (viaId) {\n api.getPersonStory2(viaId)\n .then(personStory => setTitle(PersonStoryHelper.personName(personStory)));\n }\n break;\n case PageID.ViewPlace:\n case PageID.EditPlace:\n if (viaId) {\n api.getPlace(viaId).then(place => setTitle(new Place(place).name));\n }\n break;\n case PageID.ViewMemorial:\n case PageID.EditMemorial:\n if (viaId) {\n api.getMemorial(viaId).then(memorial => setTitle(memorial.name));\n }\n break;\n case PageID.EditContactPerson:\n if (viaId) {\n api.getContactPerson(viaId)\n .then(person => setTitle(person.firstName + ' ' + person.lastName));\n }\n break;\n case PageID.EditContactMoment:\n if (viaId) {\n api.getContactPersonEvent(viaId)\n .then(contactMoment => {\n setIntermediateId(contactMoment.contactPersonId);\n setTitle((contactMoment.personFirstName || '')\n + ' ' + (contactMoment.personLastName || ''));\n });\n }\n break;\n case PageID.ViewProject:\n if (viaId) {\n api.getProject(viaId)\n .then(project => setTitle(project.title));\n }\n break;\n }\n }, [viaEntity, viaId, viaTitle]);\n\n return useMemo(() => {\n switch (viaEntity as PageID) {\n case PageID.None:\n return [];\n case PageID.ListMilitaryEntities:\n return [new Breadcrumb(T('page.militaryEntities.title'), '/military_entities')];\n case PageID.ViewMilitaryEntity:\n case PageID.EditMilitaryEntity:\n return [\n new Breadcrumb(T('page.militaryEntities.title'), '/military_entities'),\n new Breadcrumb(title, `/military_entities/${viaId}`)\n ];\n case PageID.ListCollections:\n return [new Breadcrumb(T('page.collections.title'), '/collections')];\n case PageID.ViewCollection:\n case PageID.EditCollection:\n return [\n new Breadcrumb(T('page.collections.title'), '/collections'),\n new Breadcrumb(title, `/collections/${viaId}`)\n ];\n case PageID.ListDocumentation:\n return [new Breadcrumb(T('page.documentation.title'), '/documentation')];\n case PageID.EditDocument:\n return [\n new Breadcrumb(T('page.documentation.title'), '/documentation'),\n new Breadcrumb(title || T('page.document.untyped'), `/documents/${viaId}`)\n ];\n case PageID.ListPersonStories:\n return [new Breadcrumb(T('personstories.title'), '/personstories')];\n case PageID.ListPersons:\n return [new Breadcrumb(T('listPersons.title'), '/persons')];\n case PageID.ViewPerson:\n case PageID.EditPerson:\n return [\n new Breadcrumb(T('listPersons.title'), '/persons'),\n new Breadcrumb(title, `/persons/${viaId}`)\n ];\n case PageID.EditPersonStory:\n return [\n new Breadcrumb(T('personstories.title'), '/personstories'),\n new Breadcrumb(title, `/personstories/${viaId}`)\n ];\n case PageID.ListPlaces:\n return [new Breadcrumb(T('page.places.title'), '/places')]\n case PageID.ViewPlace:\n case PageID.EditPlace:\n return [\n new Breadcrumb(T('page.places.title'), '/places'),\n new Breadcrumb(title, `/places/${viaId}`)\n ];\n case PageID.ListMemorials:\n return [new Breadcrumb(T('memorials.title'), '/memorials')];\n case PageID.ViewMemorial:\n case PageID.EditMemorial:\n return [\n new Breadcrumb(T('memorials.title'), '/memorials'),\n new Breadcrumb(title, `/memorials/${viaId}`)\n ];\n case PageID.ListContactPersons:\n return [new Breadcrumb(T('page.listContactPersons.title'), '/contact_persons')];\n case PageID.ListContactMoments:\n return [new Breadcrumb(T('page.listContactMoments.title'), '/contact_moments')];\n case PageID.EditContactPerson:\n return [\n new Breadcrumb(T('page.listContactPersons.title'), '/contact_persons'),\n new Breadcrumb(title, `/contact_persons/${viaId}`)\n ];\n case PageID.EditContactMoment:\n console.log('intermediate:', intermediateId);\n return [\n new Breadcrumb(T('page.listContactPersons.title'), '/contact_persons'),\n new Breadcrumb(title, `/contact_persons/${intermediateId}`),\n new Breadcrumb(T('noun.contactMoment'), `/contact_moments/${viaId}`)\n ];\n case PageID.ViewProject:\n return [\n new Breadcrumb(T('page.projects.title'), '/projects'),\n new Breadcrumb(title, `/projects/${viaId}`)\n ];\n case PageID.ViewDocument:\n return [\n new Breadcrumb(T('page.document.title'), '/documents'),\n new Breadcrumb(title, `/documents/${viaId}`)\n ];\n case PageID.PublicSearch:\n return [\n new Breadcrumb(T('publicSearch.title'), '/search') \n ];\n }\n\n console.log('Unknown page in via: ', viaEntity);\n return [];\n }, [viaEntity, viaId, title, intermediateId]);\n}\n\nexport function useBreadcrumbs(title: string, via: string, viaTitle?: string) {\n const base = useBaseBreadcrumbs(via, viaTitle);\n return useMemo(\n () => via === 'none' ? [] : [...base, new Breadcrumb(title, '', true)],\n [base, title, via]\n );\n}\n\nexport class Breadcrumb {\n title: string;\n to: string;\n active: boolean;\n\n constructor(title: string, to: string, active: boolean = false) {\n this.title = title;\n this.to = to;\n this.active = active;\n }\n}\n","import React, { CSSProperties, ReactNode, useEffect } from 'react';\nimport { History } from 'history';\nimport { ModalProps } from '../modals/BaseModal';\nimport { Icon } from '../components/Icons';\nimport { ModalTarget } from '../modals/ModalTarget';\nimport { Loading, LoadingItem } from '../utils/Loading';\nimport { useDispatch } from 'react-redux';\nimport { AnyAppAction, setActivePage, setSharedPageState } from '../redux/Actions';\nimport { ISharedPageState } from '../redux/State';\nimport { useAppDispatch } from '../utils/Functional';\nimport { PageID } from '../utils/PageLinking';\nimport { Breadcrumb, useBreadcrumbs } from './PageBreadcrumb';\n\nexport enum PageLayout {\n Regular, // default\n Public, // public pages (public search, story pair)\n PublicPerson, // public person or person story (different title fonts)\n PublicPersonKey, // public person key story (additional logo)\n PublicMapKeyLocations,\n NoFrames // used by login\n}\n\nexport interface BaseContextPageProps {\n history: History;\n modals: ModalTarget;\n loading: Loading;\n}\n\nexport interface ContextPageProps extends BaseContextPageProps {\n pending: LoadingItem[];\n}\n\nexport interface PageProps extends ContextPageProps {\n via?: string;\n}\n\nexport interface PagePropsNoPending extends BaseContextPageProps {\n via?: string;\n}\n\nexport interface PageState {\n page: BasePageInfo;\n}\n\nexport interface PageInfo {\n page?: string;\n icon?: Icon;\n title: string;\n subtitles?: string[];\n via?: string;\n hasBackButton?: boolean;\n breadcrumbs: Breadcrumb[],\n confirmNavigation?: () => Promise;\n}\n\ninterface BasePageInfo {\n id: PageID;\n entity?: string;\n page?: string;\n icon?: Icon;\n title: string;\n subtitles?: string;\n shortTitle?: string;\n via?: string;\n viaTitle?: string;\n hasBackButton?: boolean;\n layout?: PageLayout;\n confirmNavigation?: () => Promise;\n}\n\nexport function usePageHeader(\n id: PageID,\n entity: string|undefined,\n icon: Icon|undefined,\n title: string,\n shortTitle: string,\n via?: string,\n viaTitle?: string,\n confirmNavigation?: () => Promise,\n subtitles?: string[]\n) {\n const dispatch = useDispatch<(action: AnyAppAction) => void>();\n const breadcrumbs = useBreadcrumbs(shortTitle, via || 'none', viaTitle);\n useEffect(() => {\n dispatch(setActivePage({ id, entity, icon, title, subtitles, via, breadcrumbs, confirmNavigation }));\n }, [dispatch, icon, title, breadcrumbs, confirmNavigation, entity, id, via]);\n}\n\nexport interface PageComponentProps {\n id: PageID;\n entity?: string;\n icon: Icon;\n title: string;\n shortTitle?: string;\n via?: string;\n viaTitle?: string;\n containerStyle?: CSSProperties;\n confirmNavigation?: () => Promise;\n children: ReactNode;\n sharedPageState?: ISharedPageState;\n}\n\nconst defaultContainerStyle: CSSProperties = {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column'\n};\n\nexport const Page = (props: PageComponentProps) => {\n const {\n id,\n entity,\n icon,\n title,\n shortTitle = title,\n via,\n viaTitle,\n containerStyle = defaultContainerStyle,\n confirmNavigation,\n children,\n sharedPageState = {},\n } = props;\n\n\n usePageHeader(id, entity, icon, title, shortTitle, via, viaTitle, confirmNavigation);\n\n const dispatch = useAppDispatch();\n useEffect(() => {\n dispatch(setSharedPageState(sharedPageState));\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n // -- this behavior is intentional: we only intend to submit an update when the page is first loaded\n\n return (\n
\n
\n {children}\n
\n
\n );\n}\n\nexport class BasePage

extends React.Component {\n containerStyle: CSSProperties;\n\n constructor(props: P) {\n super(props);\n\n this.containerStyle = {\n flexGrow: 1\n };\n }\n\n loading(promise: Promise, displayName: string): Promise {\n const { loading } = this.props;\n return loading.loading(promise, displayName);\n }\n\n saving(promise: Promise, displayName: string): Promise {\n const { loading } = this.props;\n return loading.saving(promise, displayName);\n }\n\n componentDidMount() {\n this.loadContent();\n }\n\n componentDidUpdate(oldProps: P, oldState: S) {\n if (this.shouldLoadContent(oldProps, this.props))\n this.loadContent();\n }\n\n shouldLoadContent(oldProps: P, newProps: P) {\n return false;\n }\n\n getTitle(): string {\n return this.state.page.title || '';\n }\n\n loadContent() {\n // Implemented by page\n }\n\n renderContent(): JSX.Element {\n // Implemented by page\n return

Please implement

;\n }\n\n showModal(modal: (props: ModalProps) => JSX.Element) {\n return this.props.modals.show(modal);\n }\n\n render() {\n const { page } = this.state;\n\n return (\n \n {this.renderContent()}\n \n );\n }\n}\n","import { CSSProperties as ReactCSSProperties } from \"react\";\nimport { Properties } from 'csstype';\n\n// because of incompatibilities between different declarations of CSSProperties\ntype CSSProperties = ReactCSSProperties & Properties;\n\nexport const Colors = {\n lightGray: '#9A9A9A',\n lighterGray: '#CCCCCC',\n verylightGray: '#FAFAFA',\n darkGray: '#565656',\n linkBlue: '#447DF7',\n errorRed: '#FB404B',\n white: '#FFFFFF',\n black: '#2b2d42',\n}\n\n\nconst labelTextSmallStyle : CSSProperties= {\n fontSize:'0.75rem',\n textTransform: 'uppercase',\n color: Colors.lightGray,\n}\n\nconst labelTextMediumStyle: CSSProperties = {\n fontSize:'0.75rem',\n textTransform: 'uppercase',\n color: Colors.lightGray,\n}\n\nconst labelTextLargeStyle: CSSProperties = {\n fontSize:'1rem',\n textTransform: 'uppercase',\n color: Colors.lightGray,\n}\n\nconst textSmallStyle : CSSProperties= {\n fontSize:'0.75rem',\n color: Colors.lightGray,\n}\n\nconst textMediumStyle: CSSProperties = {\n fontSize:'0.875rem',\n color: Colors.lightGray,\n}\n\nconst textLargeStyle: CSSProperties = {\n fontSize:'1rem',\n color: Colors.lightGray,\n}\n\nconst textMediumBoldStyle: CSSProperties = {\n fontSize:'0.875rem',\n fontWeight: 750,\n color: Colors.lightGray,\n}\n\nconst blockTextMediumStyle : CSSProperties= {\n fontSize:'0.875rem',\n color: Colors.darkGray,\n}\n\nconst titleTextCapitalsStyle : CSSProperties= {\n fontSize:'1.2rem',\n color: Colors.darkGray,\n textTransform: 'uppercase'\n}\n\nconst titleBoldTextCapitalsStyle: CSSProperties = {...titleTextCapitalsStyle, fontWeight: 'bold'}\n\nconst subtitleTextCapitalsStyle : CSSProperties= {\n fontSize:'1.0rem',\n color: Colors.darkGray,\n textTransform: 'uppercase'\n}\nconst flatlinkTextSmallStyle : CSSProperties= {\n fontSize:'0.75rem',\n color: Colors.linkBlue,\n}\n\nconst flatlinkTextMediumStyle : CSSProperties= {\n fontSize:'0.875rem',\n color: Colors.linkBlue,\n}\n\nconst linkTextSmallStyle = {...flatlinkTextMediumStyle, textDecorationLine: \"underline\"}\nconst linkTextMediumStyle = {...flatlinkTextMediumStyle, textDecorationLine: \"underline\"}\n\n\n\nexport const TextStyles = {\n label: {\n small: labelTextSmallStyle,\n medium: labelTextMediumStyle,\n large: labelTextLargeStyle\n },\n text: {\n small: textSmallStyle,\n medium: textMediumStyle,\n mediumBold: textMediumBoldStyle,\n large: textLargeStyle\n },\n block: {\n medium: blockTextMediumStyle\n },\n title: {\n capitals: titleTextCapitalsStyle,\n fatcapitals: titleBoldTextCapitalsStyle\n },\n subtitle: {\n capitals: subtitleTextCapitalsStyle\n },\n link: {\n small: linkTextSmallStyle,\n medium: linkTextMediumStyle\n },\n flatlink: {\n small: flatlinkTextSmallStyle,\n medium: flatlinkTextMediumStyle\n }\n}\n","import React, { CSSProperties } from 'react';\nimport { T } from '../Translate';\nimport { classes } from '../utils/Styles';\nimport styles from './Search.module.scss';\nimport { Icon } from './Icons';\nimport { Button } from 'react-bootstrap';\nimport { TextStyles } from \"../config/styles\";\n\ninterface SearchProps {\n className?: string;\n name: string;\n margin?: number|string;\n placeholder?: string;\n style?: CSSProperties;\n iconTop?: string; // TODO: why don't things just stay in place?\n\n value: string;\n onChange: (value: string) => void;\n}\n\nexport const Search = (props: SearchProps) => {\n const {\n className,\n name,\n iconTop,\n placeholder,\n style,\n value,\n onChange\n } = props;\n const handleClear = React.useCallback(() => onChange(\"\"), [onChange]);\n\n return (\n
\n \n onChange(e.currentTarget.value)}\n />\n {value && (\n \n {T('component.search.clear')}\n \n )}\n
\n );\n}\n","/**\n * A custom useEffect hook that only triggers on updates, not on initial mount\n * Idea stolen from: https://stackoverflow.com/a/55075818/1526448\n * @param {Function} effect\n * @param {Array} dependencies\n */\nimport { DependencyList, EffectCallback, useEffect, useRef } from \"react\";\n\nexport default function useUpdateEffect(effect: EffectCallback, deps?: DependencyList) {\n const isInitialMount = useRef(true);\n\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false;\n } else {\n effect();\n }\n }, deps); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport function useDelayedUpdateEffect(\n callback: EffectCallback,\n delay: number,\n deps?: DependencyList\n) {\n const isInitialMount = useRef(true);\n\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false;\n } else {\n const timeout = setTimeout(callback, delay);\n return () => clearTimeout(timeout);\n }\n }, deps); // eslint-disable-line react-hooks/exhaustive-deps\n}\n","import React, { useState } from 'react';\nimport { Page } from './Page';\nimport { IQueryResult } from '../models/Generic';\nimport { ITableFilter, SortDirection, Table } from '../components/table/Table';\nimport { ITableColumn } from '../components/table/Fields';\nimport { Noun, T } from '../Translate';\nimport { Search } from '../components/Search';\nimport { Button, Card } from 'react-bootstrap';\nimport { Icon } from '../components/Icons';\nimport { PageID } from '../utils/PageLinking';\nimport { useDelayedUpdateEffect } from \"../utils/UpdateEffects\";\n\nexport interface ListState {\n filter: string;\n tablePage: number;\n sortDirection: SortDirection;\n sortColumn: string;\n filters: ITableFilter[];\n}\n\nconst defaultRowKey = (item: T, index: number): number|string => index;\n\ninterface ListPageProps {\n id: PageID;\n entity?: string;\n icon: Icon;\n title: string;\n via?: string;\n noun: Noun;\n columns: ITableColumn[];\n items: IQueryResult|undefined;\n state: ListState;\n tableState?: TS;\n updateState: (updates: Partial) => void;\n rowKey?: (item: T, index: number) => number|string;\n pageSize?: number;\n onClickedRow?: (item: T) => void;\n onClickedAdd?: () => void;\n header?: JSX.Element;\n additionalHeader?: JSX.Element;\n}\nexport function ListPage(props: ListPageProps) {\n const {\n id,\n entity,\n icon,\n title,\n via,\n noun,\n columns,\n items,\n state,\n tableState = {} as TS,\n updateState,\n rowKey = defaultRowKey,\n pageSize = 10,\n onClickedRow,\n onClickedAdd,\n header,\n additionalHeader\n } = props;\n\n\n const { filter, tablePage, sortDirection, sortColumn, filters } = state;\n const [filterInput, setFilterInput] = useState(filter);\n\n const handlePageChanged = (page: number) => {\n updateState({ tablePage: page });\n };\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n updateState({ sortColumn: column, sortDirection: direction });\n };\n\n const handleFilter = (column: string, value: string|null) => {\n const newFilters = filters.filter(x => x.column !== column);\n if (value !== null) {\n newFilters.push({ column, value });\n }\n updateState({ filters: newFilters });\n };\n\n useDelayedUpdateEffect(\n () => updateState({ filter: filterInput, tablePage: 0 }),\n 750,\n [filterInput]\n );\n\n const actualHeader = header || (\n
\n \n {additionalHeader}\n
\n {onClickedAdd && (\n \n )}\n
\n );\n\n return (\n \n \n \n {actualHeader}\n \n \n {items && (\n \n )}\n \n \n \n );\n}\n","import React, { useContext } from 'react';\nimport { ModalTarget } from './ModalTarget';\n\nconst ModalContext = React.createContext({ show: () => Promise.reject() });\n\nexport function useModalContext(): ModalTarget {\n return useContext(ModalContext);\n}\n\nexport const ModalContextProvider = ModalContext.Provider;\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { IMilitaryEntity, IMilitaryEntityQuery, MilitaryEntityType } from '../../models/MilitaryEntity';\nimport { IQueryResult } from '../../models/Generic';\nimport api from '../../api';\nimport { Icon } from '../../components/Icons';\nimport { T, plural } from '../../Translate';\nimport {\n ITableColumn,\n StringTableColumn,\n StringFieldTableColumn,\n ActionsTableColumn,\n TableRowActionStyle, ComponentTableColumn\n} from '../../components/table/Fields';\nimport { Button, ButtonGroup } from 'react-bootstrap';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { ListState, ListPage } from '../ListPage';\nimport { usePageState } from '../../redux/Actions';\nimport { PageProps } from '../Page';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { useRefresh } from '../../utils/Functional';\nimport { PageID } from '../../utils/PageLinking';\n\nexport enum ListMilitaryEntityKind {\n RegimentOrUnit = 'minor',\n Division = 'division',\n Brigade = 'brigade'\n}\n\nexport interface ListMilitaryEntitiesStateProps extends ListState {\n kind: ListMilitaryEntityKind;\n}\n\nfunction getQuery(kind: ListMilitaryEntityKind): IMilitaryEntityQuery {\n switch (kind) {\n default:\n case ListMilitaryEntityKind.RegimentOrUnit:\n return { type: { '$in': [MilitaryEntityType.Regiment, MilitaryEntityType.Unit] } };\n case ListMilitaryEntityKind.Brigade:\n return { type: MilitaryEntityType.Brigade };\n case ListMilitaryEntityKind.Division:\n return { type: MilitaryEntityType.Division };\n }\n}\n\nfunction getSortColumn(column: string, kind: ListMilitaryEntityKind) {\n if (column === 'name') {\n switch (kind) {\n default:\n case ListMilitaryEntityKind.RegimentOrUnit:\n return 'regiment';\n case ListMilitaryEntityKind.Brigade:\n return 'brigade';\n case ListMilitaryEntityKind.Division:\n return 'division';\n }\n }\n\n return column;\n}\n\nconst PageSize = 10;\nconst rowKey = (item: IMilitaryEntity) => item._id;\n\nexport default (props: PageProps) => {\n const { history, loading, via } = props;\n const modals = useModalContext();\n const [pageState, updatePageState] = usePageState('militaryEntities');\n const { filter, tablePage, sortColumn, sortDirection, kind } = pageState;\n\n const [items, setItems] = useState>();\n\n const user = api.user;\n const refresh = useRefresh(() => {\n loading.loading(api.findMilitaryEntities(\n getQuery(kind),\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn, kind), sortDirection]]\n ), plural('militaryEntity'))\n .then(setItems);\n });\n useEffect(refresh, [kind, filter, tablePage, sortColumn, sortDirection]);\n\n const handleClickedAdd = () => {\n history.push('/military_entities/create');\n }\n\n const columns = useMemo(() => {\n const handleClickedRemove = async (item: IMilitaryEntity) => {\n const confirmed = await modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n\n await api.removeMilitaryEntity(item._id);\n refresh();\n };\n\n let columns: ITableColumn[] = [];\n switch (kind) {\n case ListMilitaryEntityKind.RegimentOrUnit:\n columns = [\n new ComponentTableColumn('name', 'Regiment/Korps', item => {item.regiment || item.corps || ''}, {clickable: true, sortable: true}),\n new ComponentTableColumn('unit', 'Eenheid', item => {(item.unit_nr || '') + ' ' + (item.unit || '')}, {clickable: true, sortable: true}),\n new StringFieldTableColumn('army', 'Strijdmacht', { width: 120 })\n ];\n break;\n case ListMilitaryEntityKind.Brigade:\n columns = [\n new ComponentTableColumn('name', 'Brigade/Groepering', item => {item.brigade || item.corps || ''}, {clickable: true}),\n new StringFieldTableColumn('army', 'Strijdmacht', { width: 120 })\n ];\n break;\n case ListMilitaryEntityKind.Division:\n columns = [\n new ComponentTableColumn('name', 'Divisie', item => {item.division || ''}, {clickable: true}),\n new StringFieldTableColumn('army', 'Strijdmacht', { width: 120 })\n ];\n break;\n }\n\n if (user.canEdit()) {\n columns.push(\n new ActionsTableColumn('actions', 'Acties', item => [\n { icon: Icon.Edit, page: PageID.EditMilitaryEntity, pageParam: item._id },\n { icon: Icon.TimesCircle, onClick: handleClickedRemove, style: TableRowActionStyle.Danger }\n ], { width: 100 })\n );\n }\n return columns;\n }, [modals, refresh, kind, user])\n\n\n const handleClickedRow = (item: IMilitaryEntity) => {\n history.push(`/military_entities/${item._id}`);\n };\n\n const handleClickedRegimentsAndUnits = () => {\n updatePageState({ kind: ListMilitaryEntityKind.RegimentOrUnit });\n };\n\n const handleClickedBrigades = () => {\n updatePageState({ kind: ListMilitaryEntityKind.Brigade });\n };\n\n const handleClickedDivisions = () => {\n updatePageState({ kind: ListMilitaryEntityKind.Division });\n };\n\n const additionalHeader = (\n \n \n {T('page.militaryEntities.kind.regimentOrUnit')}\n \n \n {T('page.militaryEntities.kind.brigades')}\n \n \n {T('page.militaryEntities.kind.divisions')}\n \n \n );\n\n return (\n \n );\n}\n","import { useState, useEffect } from \"react\";\nimport { Loading } from \"./utils/Loading\";\nimport api from \"./api\";\nimport { singular, plural } from \"./Translate\";\nimport { DocumentCollection, DocumentCollectionLoadOption, IDocumentCollection } from \"./models/Collection\";\nimport { IDocument } from \"./models/Document\";\nimport { IndexedList } from \"./models/IndexedList\";\nimport { DocumentTagDefinition } from \"./models/DocumentTagDefinition\";\nimport { IContactPerson, ContactPersonEvent } from \"./models/ContactPerson\";\nimport { PersonQueryOptions, Person } from \"./models/Person\";\nimport { IPlace } from \"./models/Place\";\nimport { IMilitaryEntity } from \"./models/MilitaryEntity\";\nimport { ISpecialFunction } from \"./models/SpecialFunction\";\nimport { IProject } from \"./models/Project\";\nimport { IMemorial, GetMemorialOption } from \"./models/Memorial\";\nimport { IPersonStory2, IPublishedPersonStory } from \"./models/PersonStory2\";\nimport { IKeyLocation } from \"./models/KeyLocation\";\n\ntype FunctionalFetchResult = [T, () => void, (value: T) => void];\n\nexport function useDocumentCollection(\n loading: Loading,\n id: string\n): FunctionalFetchResult {\n const [result, setResult] = useState(DocumentCollection.empty());\n const refresh = () => {\n loading.loading(api.getDocumentCollection(id, [DocumentCollectionLoadOption.Person]), singular('collection'))\n .then(setResult);\n };\n useEffect(refresh, [loading, id]);\n return [result, refresh, setResult];\n}\n\nexport function useOptionalDocumentCollection(\n loading: Loading,\n id?: string\n): FunctionalFetchResult {\n const [result, setResult] = useState();\n const refresh = () => {\n if (!id) {\n setResult(undefined);\n return;\n }\n\n loading.loading(api.getDocumentCollection(id), singular('collection'))\n .then(setResult);\n };\n useEffect(refresh, [loading, id]);\n return [result, refresh, setResult];\n}\n\n\nexport function useCollectionDocuments(\n loading: Loading,\n collectionId: string,\n includeRemoved: boolean\n): FunctionalFetchResult {\n const [result, setResult] = useState([]);\n const refresh = () => {\n loading.loading(\n api.getCollectionDocuments(collectionId, includeRemoved),\n plural('document')\n )\n .then(setResult);\n };\n useEffect(refresh, [loading, collectionId, includeRemoved]);\n return [result, refresh, setResult];\n}\n\nexport function useDocumentTagDefinitions(loading?: Loading) {\n const [result, setResult] = useState>(IndexedList.empty());\n const deps = loading ? [loading] : []\n useEffect(() => {\n if (loading) {\n loading.loading(api.getCollectionDocumentTagsIndexed(), plural('documentTag'))\n .then(setResult);\n } else {\n api.getCollectionDocumentTagsIndexed()\n .then(setResult);\n }\n }, deps); // eslint-disable-line react-hooks/exhaustive-deps\n return result;\n}\n\nexport function useDocument(loading: Loading, id?: string): FunctionalFetchResult {\n const [result, setResult] = useState();\n const refresh = () => {\n if (!id) {\n setResult(undefined);\n return;\n }\n\n loading.loading(api.getCollectionDocument(id), singular('document'))\n .then(setResult);\n };\n useEffect(refresh, [loading, id]);\n return [result, refresh, setResult];\n}\n\nexport function useContactPerson(loading: Loading, id?: string): IContactPerson|undefined {\n const [result, setResult] = useState();\n const refresh = () => {\n if (!id) {\n setResult(undefined);\n return;\n }\n\n loading.loading(api.getContactPerson(id, ['EXTEND_PLACE']), singular('contactPerson'))\n .then(setResult);\n };\n useEffect(refresh, [loading, id]);\n return result;\n}\n\nexport function useContactPersonEvents(\n loading: Loading,\n contactPersonId?: string\n): [ContactPersonEvent[], () => void, (events: ContactPersonEvent[]) => void] {\n const [result, setResult] = useState([]);\n const refresh = () => {\n if (!contactPersonId) {\n setResult([]);\n return;\n }\n\n loading.loading(api.getContactPersonEventsForPerson(contactPersonId), plural('contactPersonEvent'))\n .then(events => {\n events.sort((a, b) => b.start.localeCompare(a.start));\n setResult(events);\n });\n }\n useEffect(refresh, [loading, contactPersonId]);\n return [result, refresh, setResult];\n}\n\nexport function useContactPersonEventsForDocument(\n loading: Loading,\n documentId?: string\n): [ContactPersonEvent[], () => void, (events: ContactPersonEvent[]) => void] {\n const [result, setResult] = useState([]);\n const refresh = () => {\n if (!documentId) {\n setResult([]);\n return;\n }\n\n loading.loading(api.findContactMomentsForDocument(documentId), plural('contactPersonEvent'))\n .then(setResult);\n }\n useEffect(refresh, [loading, documentId]);\n return [result, refresh, setResult];\n}\n\nexport function usePerson(\n loading: Loading,\n id?: string,\n options: PersonQueryOptions[] = [PersonQueryOptions.EventsWithPlaces, PersonQueryOptions.Documents, PersonQueryOptions.RelationPersons],\n token?: string\n): Person|undefined {\n const [result, setResult] = useState();\n const refresh = () => {\n if (!id) {\n setResult(undefined);\n } else {\n loading.loading(api.getPerson(id, options, token), singular('person'))\n .then(person => setResult(new Person(person)));\n }\n };\n useEffect(refresh, [loading, id]);\n return result;\n}\n\nexport function usePersonContactMoments(loading: Loading, personId: string|undefined): ContactPersonEvent[] {\n const [result, setResult] = useState([]);\n const refresh = () => {\n if (!personId) {\n setResult([]);\n return;\n }\n\n loading.loading(api.findContactMomentsForPerson(personId), plural('contactMoment'))\n .then(setResult);\n };\n useEffect(refresh, [loading, personId]);\n return result;\n}\n\nexport function usePersonStories(loading: Loading, personId: string|undefined): IPersonStory2[] {\n const [result, setResult] = useState([]);\n const refresh = () => {\n if (!personId) {\n setResult([]);\n return;\n }\n loading.loading(api.findPersonStoriesForPerson(personId), plural('personStory'))\n .then(queryResult => {\n setResult(queryResult.data)\n });\n };\n useEffect(refresh, [loading, personId]);\n return result;\n}\n\nexport function usePersonStory(loading: Loading, storyId: string|undefined): IPersonStory2|undefined {\n const [result, setResult] = useState();\n const refresh = () => {\n if (!storyId) {\n setResult(undefined);\n return;\n }\n loading.loading(api.getPersonStory2(storyId), plural('personStory'))\n .then(setResult);\n };\n useEffect(refresh, [loading, storyId]);\n return result;\n}\n\nexport function usePublishedPersonStory(loading: Loading, storyId: string|undefined): IPublishedPersonStory|undefined {\n const [result, setResult] = useState();\n const refresh = () => {\n if (!storyId) {\n setResult(undefined);\n return;\n }\n loading.loading(api.getPublishedPersonStory(storyId), plural('personStory'))\n .then(setResult);\n };\n useEffect(refresh, [loading, storyId]);\n return result;\n}\n\nexport function usePersonDocumentCollections(loading: Loading, personId: string) {\n const [result, setResult] = useState([]);\n useEffect(() => {\n loading\n .loading(api.getDocumentCollectionsForPerson(personId), plural('collection'))\n .then(setResult);\n }, [loading, personId]);\n return result;\n}\n\nexport function usePersonRelatedDocuments(loading: Loading, personId: string) {\n const [result, setResult] = useState([]);\n useEffect(() => {\n loading.loading(api.getDocumentsRelatedTo('person', personId), plural('document'))\n .then(setResult);\n }, [loading, personId]);\n return result;\n}\n\nexport function usePlace(loading: Loading, id?: string): IPlace|undefined {\n const [result, setResult] = useState();\n useEffect(() => {\n if (!id) {\n setResult(undefined);\n return;\n }\n\n loading.loading(api.getPlace(id), singular('place'))\n .then(setResult);\n }, [loading, id]);\n return result;\n}\n\nexport function useMemorial(loading : Loading, id?: string, options?: GetMemorialOption[]): IMemorial|undefined {\n const [result, setResult] = useState();\n useEffect(() => {\n if (!id) {\n setResult(undefined);\n return;\n }\n\n loading.loading(api.getMemorial(id, options), singular('memorial'))\n .then(setResult);\n }, [loading, id, options]);\n return result;\n}\n\nexport function useKeyLocation(loading : Loading, id?: string, options?: ('photos'|'stories')[]): IKeyLocation|undefined {\n const [result, setResult] = useState();\n useEffect(() => {\n if (!id) {\n setResult(undefined);\n return;\n }\n\n loading.loading(api.getKeyLocation(id, options), singular('keyLocation'))\n .then(setResult);\n }, [loading, id, options]);\n return result;\n}\n\nconst NoOptions: [] = [];\nexport function useMilitaryEntity(\n loading: Loading,\n id?: string,\n options: ('history.place'|'history.entity')[] = NoOptions\n): IMilitaryEntity|undefined {\n const [result, setResult] = useState();\n useEffect(() => {\n if (!id) {\n setResult(undefined);\n return;\n }\n\n loading.loading(api.getMilitaryEntity(id, options), singular('militaryEntity'))\n .then(setResult);\n }, [loading, id, options]);\n return result;\n}\n\nexport function useFunctionDefinition(id: string): ISpecialFunction|undefined {\n const [result, setResult] = useState();\n useEffect(() => {\n api.getFunction(id).then(setResult);\n }, [id]);\n return result;\n}\n\nexport function useProject(loading: Loading, id: string) {\n const [result, setResult] = useState();\n useEffect(\n () => { loading.loading(api.getProject(id), 'project').then(setResult) },\n [loading, id]\n );\n return result;\n}\n\nexport function useProjects(loading: Loading) {\n const [result, setResult] = useState([]);\n useEffect(\n () => {\n loading.loading(api.findProjects(undefined, undefined, undefined, []), plural('project'))\n .then(projects => setResult(projects.data));\n },\n [loading]\n );\n return result;\n}\n\nexport function useNumberOfRelatedDocuments(ref_type: 'person'|'place'|'memorial'|'military_entity', ref_id: string | undefined) {\n const [numberOfDocuments, setNumberOfDocuments] = useState(0)\n useEffect(() => {\n if (ref_id) {\n api.countDocumentsRelatedTo(ref_type, ref_id).then(setNumberOfDocuments);\n } else {\n setNumberOfDocuments(0)\n }\n },\n [ref_id, ref_type]\n );\n return numberOfDocuments\n}\n","import React from 'react';\nimport { DocumentReference } from \"../../models/DocumentReference\";\nimport PageLink from \"../../components/PageLink\";\nimport { Colors, TextStyles } from \"../../config/styles\";\n\n\ninterface DocumentReferencesViewProps {\n documentReferences: DocumentReference[]\n}\n\nexport const DocumentReferencesView = (props: DocumentReferencesViewProps) => {\n const { documentReferences } = props;\n\n return (\n <>\n {documentReferences.map((value, index) => (\n \n \n {value.toString()}\n \n \n ))}\n \n );\n}\n","import React from 'react';\nimport { DocumentReferencesView } from \"./DocumentReferencesView\";\nimport { Colors, TextStyles } from \"../../config/styles\";\nimport { Document } from \"../../models/Document\";\nimport { T } from '../../Translate';\n\n\ninterface TitleCellProps {\n document: Document\n}\n\nexport const TitleCell = (props: TitleCellProps) => {\n const { document } = props;\n\n return (\n
\n {document.title ? (\n {document.title}\n ) : (\n {T('documents.noTitle')}\n )}\n
\n \n
\n );\n}\n","import React from 'react';\nimport { TextStyles } from \"../../config/styles\";\nimport { Document, getDocumentCategoryName } from \"../../models/Document\";\nimport { Badge } from \"react-bootstrap\";\n\n\ninterface CategoryCellProps {\n document: Document\n}\n\nexport const CategoryCell = (props: CategoryCellProps) => {\n const { document } = props;\n\n return (\n
\n {getDocumentCategoryName(document.category)}
\n {document.parentId &&\n {document.parentId ? 'SUB' : ''}\n }\n
\n );\n}\n","import { ColumnAlign, ComponentTableColumn, ITableColumn, StringTableColumn } from \"../../components/table/Fields\";\nimport { T, TranslationKey } from \"../../Translate\";\nimport { Document, DocumentCategory } from \"../../models/Document\";\nimport React from \"react\";\nimport { TitleCell } from \"./TitleCell\";\nimport { CategoryCell } from \"./CategoryCell\";\n\nconst getDocumentIdPresentation = (document: Document) => {\n return (document.collection && document.filename) || document.filename || document.wiseLocation || document.inventoryId || '';\n}\n\nexport function getColumns(): ITableColumn[] {\n return [\n new ComponentTableColumn('category', T('documents.column.category'), document => {\n return ()\n }, {sortable: true, clickable: true}),\n new StringTableColumn('id', T('documents.column.documentid'), document => {\n if (document.category === DocumentCategory.Digital) {\n return Document.renderDocumentCounter(document.counter)\n } else {\n return getDocumentIdPresentation(document)\n }\n }, {sortable: false}),\n new ComponentTableColumn('title', T('documents.column.title'), document => {\n return ()\n }, { width: 400, sortable: true}),\n new StringTableColumn('status', T('documents.column.status'), document => T('document.status.' + document.status as TranslationKey)),\n new StringTableColumn('modified', T('documents.column.modified'), document => document.modified.format('YYYY-MM-DD HH:mm')),\n new StringTableColumn('pages', T('documents.column.pages'), document => document.elements.length.toString(), { align: ColumnAlign.Right, sortable: false, width: 100 })\n ];\n}\n\nexport const rowKey = (document: Document) => document.id;\n","import React, { useMemo } from 'react';\nimport { Alert, Card, Button } from 'react-bootstrap';\nimport { T, singular } from '../../Translate';\nimport API from '../../api';\nimport { Document } from '../../models/Document';\nimport { PageProps, Page } from '../Page';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { AnyAppAction, updatePagesStateAction } from '../../redux/Actions';\nimport { AppState } from '../../redux/State';\nimport { Dispatch } from 'redux';\nimport { TableCardBody, SortDirection } from '../../components/table/Table';\nimport api from '../../api';\nimport { Icon } from '../../components/Icons';\nimport { useDocumentCollection, useDocumentTagDefinitions, useCollectionDocuments } from '../../FunctionalAPI';\nimport { rowKey, getColumns } from './Columns';\nimport { ButtonLink } from '../../components/ButtonLink';\nimport { PageID } from '../../utils/PageLinking';\n\n\nexport interface ViewCollectionStateProps {\n search: string;\n showRemoved: boolean;\n\n tablePage: number;\n sortColumn: string;\n sortDirection: SortDirection;\n}\nexport const ViewCollectionDefaultState: ViewCollectionStateProps = {\n search: '',\n showRemoved: false,\n\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up\n};\n\ninterface ViewCollectionPageOwnProps extends PageProps {\n id: string;\n}\n\nconst PageSize = 10;\n\nexport default (props: ViewCollectionPageOwnProps) => {\n const { id, history, loading, via } = props;\n const pageState = useSelector(state => state.pagesState.collection);\n\n const columns = useMemo(getColumns, []);\n\n const [collection, refreshCollection] = useDocumentCollection(loading, id);\n const tags = useDocumentTagDefinitions(loading);\n const [documentsJson] = useCollectionDocuments(loading, id, collection.deleted);\n const documents = useMemo(\n () => documentsJson.map(document => Document.fromJSON(document, tags)),\n [documentsJson, tags]\n );\n\n const handleClickedDocument = (document: Document) => {\n history.push(`/documents/${document.id}?via=c`);\n };\n\n const handleClickedEdit = () => {\n history.push(`/collections/${id}/edit`);\n };\n\n const dispatch = useDispatch>();\n const updateState = (state: Partial) => {\n dispatch(updatePagesStateAction('collection', state));\n };\n\n const handleClickedRestore = async () => {\n await loading.saving(API.restoreCollection(id), singular('collection'));\n refreshCollection();\n };\n\n const handlePageChanged = (page: number) => {\n updateState({ tablePage: page });\n };\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n updateState({ sortColumn: column, sortDirection: direction });\n };\n\n const handleClickedCreate = () => {\n history.push(`/documents/create?code=${collection.adlibCode}`);\n };\n\n const user = api.user;\n const header = <>\n
\n

\n {collection.description}\n

\n {user.canEdit() && (\n
\n \n \n
\n )}\n\n {user.canEdit() && collection.deleted && (\n \n {T('collection.showingRemoved')} {T('collection.restore')}\n \n )}\n
\n ;\n\n const { search, tablePage, sortColumn, sortDirection } = pageState;\n const filteredDocuments = documents\n .filter(document => document.matchesFilterLower(search));\n const pageDocuments = filteredDocuments\n .slice(tablePage * PageSize, (tablePage + 1) * PageSize);\n\n return (\n \n
\n \n \n {header}\n \n \n \n
\n \n );\n}\n","import { combineReducers } from 'redux';\nimport { AppActionType, AnyAppAction } from './Actions';\nimport { IDocumentEditorSettings, PagesState, ActivePageState, ISharedPageState, TabState, IExportModalState } from './State';\nimport { Dataset } from '../models/User';\nimport { ResolutionStatus } from '../models/Place';\nimport { ListMilitaryEntityKind } from '../pages/ListMilitaryEntities';\nimport { ViewCollectionDefaultState } from '../pages/ViewCollection';\nimport { ContactMomentState } from '../models/ActiveContactMoment';\nimport { SortDirection } from '../components/table/Table';\nimport { Icon } from '../components/Icons';\nimport { PageLayout } from '../pages/Page';\n\nfunction documentEditorSettings(state: IDocumentEditorSettings, action: AnyAppAction) {\n switch (action.type) {\n case AppActionType.DocumentEditorSetRatio:\n return Object.assign({}, state, {ratio: action.payload.ratio});\n default:\n return state || {ratio: +(localStorage.getItem('documentEditorRatio') || 0.5)};\n }\n}\n\nconst DefaultPagesState: PagesState = {\n advancedSearch: {\n args: {},\n errors: {},\n result: undefined,\n tab: 'parameters'\n },\n collection: ViewCollectionDefaultState,\n collections: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n filters: [],\n showRemoved: false\n },\n persons: {\n filter: '',\n tablePage: 0,\n sortColumn: 'filter',\n sortDirection: SortDirection.Up,\n filters: [],\n dataset: Dataset.Namelist\n },\n memorials: {\n filter: '',\n tablePage: 0,\n sortColumn: 'filter',\n sortDirection: SortDirection.Up,\n filters: []\n },\n personStories: {\n filter: '',\n tablePage: 0,\n sortColumn: 'calculated_full_name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n militaryEntities: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n kind: ListMilitaryEntityKind.RegimentOrUnit,\n filters: []\n },\n places: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filterStatus: ResolutionStatus.All,\n filters: []\n },\n project: {\n filter: '',\n tablePage: 0,\n sortColumn: 'filter',\n sortDirection: SortDirection.Up,\n filters: []\n },\n projects: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n filters: []\n },\n users: {\n filter: '',\n tablePage: 0,\n sortColumn: 'account',\n sortDirection: SortDirection.Up,\n filters: []\n },\n contactPersons: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n contactPersonEvents: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n documentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n militaryEntityPersons: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n memorialPersons: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n personStoryMatches: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n placeDocumentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n editPlaceDocumentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n militaryDocumentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n editMilitaryDocumentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n editPersonDocumentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n memorialDocumentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n editMemorialDocumentation: {\n filter: '',\n tablePage: 0,\n sortColumn: 'title',\n sortDirection: SortDirection.Up,\n tagFilter: null,\n filters: []\n },\n publicSearch: {\n selectedTab: 'basic',\n basicInput: {},\n advancedInput: {},\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n keyLocations: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n },\n publicViewProject: {\n filter: '',\n tablePage: 0,\n sortColumn: 'name',\n sortDirection: SortDirection.Up,\n filters: []\n }\n};\n\nfunction pagesState(state: PagesState, action: AnyAppAction): PagesState {\n switch (action.type) {\n case AppActionType.UpdatePagesState:\n const index = action.payload.page as keyof PagesState\n const value = Object.assign({}, state[index], action.payload.value);\n return Object.assign({}, state, { [action.payload.page]: value });\n default:\n return state || DefaultPagesState;\n }\n}\n\nconst DefaultTabState = {\n editPlace: '',\n viewPlace: '',\n editMemorial: '',\n viewMemorial: '',\n editPerson: '',\n viewPerson: '',\n editMilitary: '',\n viewMilitary: '',\n editPersonStory: '',\n}\n\nfunction tabsState(state: TabState, action: AnyAppAction): TabState {\n switch (action.type) {\n case AppActionType.UpdateTabState:\n const value = action.payload.value;\n return Object.assign({}, state, { [action.payload.page]: value });\n default:\n return state || DefaultTabState;\n }\n}\n\nfunction activeContactMoment(state: ContactMomentState, action: AnyAppAction) {\n switch (action.type) {\n case AppActionType.StartContactMoment:\n localStorage.setItem('activeContactMoment', JSON.stringify(action.payload));\n return { current: action.payload };\n case AppActionType.UpdateContactMoment: {\n if (!state.current)\n return state;\n\n const value = Object.assign({}, state.current, action.payload);\n localStorage.setItem('activeContactMoment', JSON.stringify(value));\n return { current: value };\n }\n case AppActionType.RegisterContactMomentContribution: {\n if (!state.current)\n return state;\n\n const updates = { contributions: [...state.current.contributions, action.payload] };\n const value = Object.assign({}, state.current, updates);\n localStorage.setItem('activeContactMoment', JSON.stringify(value));\n return { current: value };\n }\n case AppActionType.EndContactMoment:\n localStorage.removeItem('activeContactMoment');\n return { current: undefined };\n default:\n const stored = localStorage.getItem('activeContactMoment');\n return state || (stored && { current: JSON.parse(stored) }) || {};\n }\n}\n\nfunction activePageState(state: ActivePageState, action: AnyAppAction): ActivePageState {\n switch (action.type) {\n case AppActionType.SetActivePage:\n return action.payload;\n default:\n return state || { title: '', subtitles: '', icon: Icon.Page, layout: PageLayout.Regular, breadcrumbs: [] };\n }\n}\n\nfunction sharedPageState(state: ISharedPageState, action: AnyAppAction): ISharedPageState {\n switch (action.type) {\n case AppActionType.SetSharedPageState:\n return action.payload;\n default:\n return state || {};\n }\n}\n\nfunction exportModalState(state: IExportModalState, action: AnyAppAction): IExportModalState {\n switch (action.type) {\n case AppActionType.UpdateExportModalState:\n return Object.assign({}, state, action.payload.updates);\n default:\n return state || {};\n }\n}\n\nconst appReducers = combineReducers({\n documentEditorSettings,\n pagesState,\n tabsState,\n activeContactMoment,\n activePageState,\n sharedPageState,\n exportModalState\n});\nexport default appReducers;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport { T } from '../../Translate';\nimport API from '../../api';\nimport { PageProps, usePageHeader } from '../Page';\nimport { Row, Col } from 'react-bootstrap';\nimport { Link } from 'react-router-dom';\nimport styles from './index.module.scss';\nimport { Icon } from '../../components/Icons';\nimport { PageID } from '../../utils/PageLinking';\n\ninterface TileProps {\n icon: Icon;\n title: string;\n to: string;\n}\nconst Tile = (props: TileProps) => {\n const { icon, title, to } = props;\n return (\n
\n \n \n
\n {title}\n \n \n );\n}\n\nconst HomePage = (props: PageProps) => {\n const { history } = props;\n\n usePageHeader(PageID.Home, undefined, Icon.Home, T('app.title'), T('app.title'));\n\n if (!API.isLoggedIn()) {\n window.setTimeout(() => history.push('/login'));\n return
;\n }\n\n return (\n
\n
\n \n \n \n \n \n \n \n
\n
\n );\n}\nexport default HomePage;\n\n","import { useState } from \"react\";\n\nlet id = 0;\n\nexport function useElementID(prefix: string) {\n const [ elementID ] = useState(() => generateElementID(prefix));\n return elementID;\n}\n\nexport function generateElementID(prefix: string) {\n return prefix + (++id);\n}\n","import React, { CSSProperties } from 'react';\n\ninterface InvalidFeedbackProps {\n error: string;\n style?: CSSProperties\n}\n\nexport const InvalidFeedback = (props: InvalidFeedbackProps) => {\n const { error, style } = props;\n return (\n
\n {error}\n
\n );\n};\n\n","import React, { CSSProperties } from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useElementID } from '../../utils/ElementID';\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface VerticalInputProps {\n name: string;\n label: string;\n value: string;\n error?: string;\n plainText?: boolean;\n validated?: boolean;\n placeholder?: string;\n style?: CSSProperties;\n info?: string;\n type?: 'text'|'password';\n\n onChange: (value: string) => void;\n onPressedEnter?: () => void;\n}\nexport const VerticalInput = (props: VerticalInputProps) => {\n const {\n name,\n label,\n value,\n error,\n plainText,\n validated,\n placeholder,\n info,\n type = 'text',\n \n onChange,\n onPressedEnter\n } = props;\n\n const handleKeyPress = onPressedEnter && ((e: React.KeyboardEvent) => {\n if (e.key === 'Enter')\n onPressedEnter();\n });\n const id = useElementID('input');\n const inputClass = plainText ? 'form-control-plaintext' : (error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control'));\n return (\n \n {label}\n onChange(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n placeholder={placeholder}\n />\n {error && }\n {info && {info}}\n \n ); \n}\n","import React, { useState } from 'react';\nimport API, { IAuthenticationResponse } from '../../api';\nimport { T } from '../../Translate';\nimport { LoadingIcon, Icon } from '../../components/Icons';\nimport { Alert, Button, Card, Container, Form, Row } from 'react-bootstrap';\nimport { PageProps, usePageHeader } from '../Page';\nimport { VerticalInput } from '../../components/inputs/VerticalInput';\nimport { Link } from 'react-router-dom';\nimport { PageID } from '../../utils/PageLinking';\n\nexport default (props: PageProps) => {\n const { loading, pending, history } = props;\n\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n usePageHeader(PageID.Login, undefined, Icon.Page, 'login', 'login');\n\n const handleClickedLogin = async () => {\n try {\n const loginData = await loading.pending(\n API.login(username, password),\n 'pending.loggingIn',\n ''\n );\n API.loginWith(loginData);\n setError('');\n history.push('/');\n } catch (error: any) {\n if (error.code === 2)\n setError(T('page.login.invalidLogin'));\n else if (error.code === 8)\n setError(T('page.login.accountNotActivated'));\n }\n };\n\n return (\n \n \n \n \n

{T('page.login.title')}

\n
\n

{T('page.login.message')}

\n
\n \n \n

{T('page.login.forgotPassword')}

\n {error && {error}}\n
\n \n
\n \n
\n
\n
\n
\n
\n );\n}\n","import React, { CSSProperties } from 'react';\n\ninterface FormCheckProps {\n label: string;\n checked: boolean;\n style?: CSSProperties;\n onChange: (e: React.SyntheticEvent) => void;\n}\nexport const FormCheck = (props: FormCheckProps) => {\n const { label, checked, style, onChange } = props;\n\n return (\n
\n \n
\n );\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { T, plural } from '../../Translate';\nimport { DocumentCollection } from '../../models/Collection';\nimport { FormCheck } from '../../components/theme/FormCheck';\nimport { StringFieldTableColumn, ITableColumn, ComponentTableColumn } from '../../components/table/Fields';\nimport api from '../../api';\nimport { Icon } from '../../components/Icons';\nimport { ListState, ListPage } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { usePageState } from '../../redux/Actions';\nimport { IQueryResult } from '../../models/Generic';\nimport { PageID } from '../../utils/PageLinking';\n\nexport interface ListCollectionsStateProps extends ListState {\n showRemoved: boolean;\n}\n\nconst rowKey = (collection: DocumentCollection) => collection.id;\nconst PageSize = 10;\n\nexport default (props: PageProps) => {\n const { loading, history } = props;\n\n const columns: ITableColumn[] = useMemo(() => [\n new StringFieldTableColumn('adlibCode', T('collections.column.adlibcode'), {width: 120}),\n new ComponentTableColumn('title', T('collections.column.title'), (documentCollection) => {\n return {documentCollection.title}\n })\n ], []);\n\n const [pageState, updatePageState] = usePageState('collections');\n const { filter, tablePage, sortColumn, sortDirection, showRemoved } = pageState;\n const [items, setItems] = useState>();\n\n useEffect(() => {\n loading.loading(api.findDocumentCollections(\n {},\n filter,\n tablePage * PageSize,\n PageSize,\n [[sortColumn, sortDirection]],\n showRemoved\n ), plural('collection'))\n .then(result => setItems({\n data: result.data.map(DocumentCollection.fromJSON),\n total: result.total\n }));\n }, [loading, filter, tablePage, sortColumn, sortDirection, showRemoved]);\n\n const handleClickedCreate = () => {\n history.push('/collections/create');\n };\n\n const handleCheckedRemoved = (e: React.SyntheticEvent) => {\n let checked = e.currentTarget.checked;\n updatePageState({ showRemoved: checked });\n };\n\n const handleClickedRow = (item: DocumentCollection) => {\n history.push(`/collections/${item.id}`);\n };\n\n const user = api.user;\n const header = <>\n {user.canEdit() && (\n \n )}\n
\n \n \n ;\n\n return (\n \n );\n}\n","import React, { CSSProperties } from 'react';\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface InputGroupProps {\n id: string;\n style?: CSSProperties;\n label: string;\n labelColumns?: number;\n inputColumns?: number;\n children: React.ReactNode;\n error?: string;\n info?: string;\n}\n\n/**\n * Adds a label and optionally an error message and info text to an input\n * component.\n */\nexport const InputGroup = (props: InputGroupProps) => {\n const {\n id,\n style,\n label,\n labelColumns = 4,\n inputColumns,\n children,\n error,\n info\n } = props;\n\n return (\n
\n \n
\n {children}\n {error && }\n {info && {info}}\n
\n
\n );\n}\n","import React, { useMemo, CSSProperties, useCallback } from 'react';\nimport { useElementID } from '../../utils/ElementID';\nimport { InputGroup } from './InputGroup';\n\ninterface SelectInputProps {\n options?: ISelectOption[];\n optionElements?: JSX.Element[];\n labelColumns?: number;\n inputColumns?: number;\n\n name: string;\n label: string;\n value: string;\n error?: string;\n readOnly?: boolean;\n validated?: boolean;\n controlStyle?: CSSProperties;\n style?: CSSProperties;\n\n onChange: (value: string) => void;\n}\n\nexport interface ISelectOption {\n value: string;\n title: string;\n}\nexport const SelectInput = (props: SelectInputProps) => {\n const {\n labelColumns = 4,\n inputColumns,\n name,\n label,\n value,\n error,\n readOnly,\n validated,\n controlStyle,\n style,\n options = [],\n optionElements,\n onChange,\n } = props;\n\n const id = useElementID('input');\n //const inputClass = readOnly ? 'form-control-plaintext' : (error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control'));\n const inputClass = error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control');\n const renderedOptions = useMemo(\n () => optionElements || options.map(option => (\n \n )), [options, optionElements]);\n const handleChange = useCallback((e: React.SyntheticEvent) => {\n onChange(e.currentTarget.value)\n }, [onChange]);\n\n return (\n \n {renderedOptions}\n \n );\n};\n\ninterface SelectInputOnlyProps {\n options?: ISelectOption[];\n optionElements?: JSX.Element[];\n\n value: string;\n readOnly?: boolean;\n validated?: boolean;\n\n onChange: (value: string) => void;\n\n style?: CSSProperties;\n}\n\nexport const SelectInputOnly = (props: SelectInputOnlyProps) => {\n const {\n options = [],\n optionElements,\n value,\n readOnly,\n validated,\n onChange,\n style\n } = props;\n\n const id = useElementID('input');\n const inputClass = validated ? 'form-control is-valid' : 'form-control';\n const renderedOptions = useMemo(\n () => optionElements || options.map(option => (\n \n )), [options, optionElements]);\n const handleChange = useCallback((e: React.SyntheticEvent) => {\n onChange(e.currentTarget.value)\n }, [onChange]);\n\n return (\n {renderedOptions}\n );\n}\n","import React, { CSSProperties } from 'react';\nimport { useElementID } from '../../utils/ElementID';\nimport { InputGroup } from './InputGroup';\n\ninterface TextInputProps {\n labelColumns?: number;\n inputColumns?: number;\n\n name: string;\n label: string;\n value: string;\n error?: string;\n readOnly?: boolean;\n plainText?: boolean;\n validated?: boolean;\n placeholder?: string;\n style?: CSSProperties;\n info?: string;\n\n onChange?: (value: string) => void;\n onPressedEnter?: () => void;\n onBlur?: () => void;\n}\n\nexport const TextInput = (props: TextInputProps) => {\n const {\n name,\n label,\n value,\n error,\n readOnly,\n plainText,\n validated,\n placeholder = label,\n onChange,\n onPressedEnter,\n onBlur\n } = props;\n\n const handleKeyPress = onPressedEnter && ((e: React.KeyboardEvent) => {\n if (e.key === 'Enter')\n onPressedEnter();\n });\n const id = useElementID('input');\n const inputClass = plainText ? 'form-control-plaintext' : (error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control'));\n return (\n \n onChange && onChange(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n onBlur={onBlur}\n placeholder={placeholder}\n />\n \n );\n};\n","import React from 'react';\nimport { useElementID } from '../../utils/ElementID';\n\ninterface TextareaInputProps {\n labelColumns?: number;\n inputColumns?: number;\n\n name: string;\n label: string;\n value: string;\n error?: string;\n readOnly?: boolean;\n plainText?: boolean;\n validated?: boolean;\n placeholder?: string;\n rows?: number;\n vertical?: boolean;\n\n onChange?: (value: string) => void;\n}\n\nexport const TextareaInput = (props: TextareaInputProps) => {\n const {\n labelColumns = 4,\n inputColumns,\n name,\n label,\n value,\n error,\n readOnly,\n plainText,\n validated,\n placeholder = label,\n vertical,\n rows,\n onChange,\n } = props;\n\n const id = useElementID('input');\n const inputClass = plainText\n ? 'form-control-plaintext'\n : (error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control'));\n\n if (vertical) {\n return (\n
\n \n onChange && onChange(e.currentTarget.value)}\n placeholder={placeholder}\n rows={rows}\n />\n {error && (\n \n {error}\n
\n )}\n
\n );\n }\n\n return (\n
\n \n
\n onChange && onChange(e.currentTarget.value)}\n placeholder={placeholder}\n rows={rows}\n />\n {error &&
{error}
}\n
\n
\n );\n};\n","import React, { CSSProperties, useRef } from 'react';\nimport { InvalidFeedback } from './InvalidFeedback';\nimport { useElementID } from '../../utils/ElementID';\nimport moment from 'moment';\n\nexport const emptyDate = () => ({ day: '', month: '', year: '' });\n\nexport interface DateInputValue {\n day: string;\n month: string;\n year: string;\n}\nexport function inputDateToSortable(date: DateInputValue) {\n const yearPart = date.year === '' ? '????' : date.year.toString().padStart(4, '0');\n const monthPart = date.month === '' ? '??' : date.month.toString().padStart(2, '0');\n const dayPart = date.day === '' ? '??' : date.day.toString().padStart(2, '0');\n return yearPart + monthPart + dayPart;\n}\nexport function parseInputDateFromSortable(date: string): DateInputValue {\n const year = date.substring(0, 4);\n const month = date.substring(4, 6);\n const day = date.substring(6, 8);\n return {\n year: year === '????' ? '' : year,\n month: month === '??' ? '' : month,\n day: day === '??' ? '' : day\n };\n}\n\nexport function inputDateToISO(value: DateInputValue): string|undefined {\n const { day, month, year } = value;\n if (!/^[0-9]{1,2}$/.test(day))\n return undefined;\n if (!/^[0-9]{1,2}$/.test(month))\n return undefined;\n if (!/^[0-9]{4}$/.test(year))\n return undefined;\n\n const isoString = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n\n // make sure the iso string is valid\n const momentISOString = moment(isoString);\n if (!momentISOString.isValid()) {\n return undefined;\n }\n\n return isoString\n}\n\nexport function inputDateFromISO(value: string): DateInputValue {\n const date = moment(value);\n return {\n year: date.year().toString(),\n month: (date.month() + 1).toString(), // month is in 0..11\n day: date.date().toString(),\n };\n}\n\n\ninterface DateInputProps {\n name: string;\n label: string;\n value: DateInputValue;\n onChange: (date: DateInputValue) => void;\n style?: CSSProperties;\n\n labelColumns?: number;\n error?: string;\n readOnly?: boolean;\n validated?: boolean;\n}\nexport const DateInput = (props: DateInputProps) => {\n const {\n name,\n labelColumns = 4,\n label,\n value,\n error,\n readOnly,\n validated,\n style,\n onChange,\n } = props;\n\n const monthRef = useRef(null);\n const yearRef = useRef(null);\n\n const isDigit = (value:string):Boolean => {\n const numberValue = Number(value)\n return !isNaN(numberValue);\n }\n\n const handleDayChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 2)\n return;\n\n if (!isDigit(v))\n return;\n\n const monthElement = monthRef.current;\n onChange(Object.assign({}, value, { day: v }));\n\n if (v.length === 2 && monthElement)\n monthElement.focus();\n };\n\n const handleMonthChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 2)\n return;\n\n if (!isDigit(v))\n return;\n\n const yearElement = yearRef.current;\n onChange(Object.assign({}, value, { month: v }));\n\n if (v.length === 2 && yearElement)\n yearElement.focus();\n };\n\n const handleYearChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 4)\n return;\n\n if (!isDigit(v))\n return;\n\n onChange(Object.assign({}, value, { year: v }));\n };\n\n const id = useElementID('dateInput');\n const inputClass = error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control');\n return (\n
\n \n
\n
\n \n \n \n
\n {error && }\n
\n
\n );\n};\n","import React from 'react';\nimport { ISelectOption } from './SelectInput';\nimport { Col, FormLabel } from 'react-bootstrap';\nimport { useElementID } from '../../utils/ElementID';\n\ninterface RadioInputProps {\n label?: string;\n value: string;\n options: ISelectOption[];\n onChange: (value: string) => void;\n horizontal?: boolean;\n error?: string;\n labelCols?: number;\n valueCols?: number;\n}\nexport const RadioInput = (props: RadioInputProps) => {\n const {\n label,\n labelCols = 4,\n value,\n valueCols = 4,\n options,\n onChange,\n horizontal = false\n } = props;\n\n const handleChanged = (e: React.SyntheticEvent) => {\n if (e.currentTarget.checked)\n onChange(e.currentTarget.value);\n };\n\n const name = useElementID('options');\n const optionsRendered = options.map(option => {\n const content = (\n \n );\n if (horizontal) {\n return (\n
\n {content}\n \n )\n } else {\n return (\n
\n {content}\n
\n );\n }\n });\n\n if (horizontal) {\n return (\n
\n {label && {label}}\n {optionsRendered}\n
\n );\n } else {\n return (\n
\n
\n {optionsRendered}\n
\n
\n );\n }\n}\n","import React, { useMemo } from 'react';\nimport { Modal, Form, Button } from 'react-bootstrap';\nimport { ModalProps, useModal } from './BaseModal';\nimport { T } from '../Translate';\nimport API from '../api';\nimport { Gender, VictimType, IPerson, IPersonFields } from '../models/Person';\nimport { ModalHeader } from './ModalHeader';\nimport { TextInput } from '../components/inputs/TextInput';\nimport { DateInput, emptyDate } from \"../components/inputs/DateInput\";\nimport { isValidationResult, IValidationResult } from \"../models/ValidationResult\";\nimport { NotificationManager } from \"react-notifications\";\nimport { SelectInput } from \"../components/inputs/SelectInput\";\nimport { RadioInput } from \"../components/inputs/RadioInput\";\nimport { useStateWithError } from '../utils/Functional';\nimport { ButtonRowModalFooter } from '../components/ButtonRow';\n\ninterface CreatePersonModalProps extends ModalProps {\n value: string;\n}\n\nfunction splitName(name: string) {\n let space = name.indexOf(' ');\n if (space >= 0) {\n return {\n firstName: name.substring(0, space),\n lastName: name.substring(space + 1)\n };\n } else {\n return {\n firstName: '',\n lastName: name\n };\n }\n}\n\nexport const CreatePersonModal = (props: CreatePersonModalProps) => {\n const { value } = props;\n const [isOpen, resolve] = useModal(props);\n const name = splitName(value);\n\n const genderOptions = useMemo(() => [\n { value: Gender.Male, title: T('gender.male') },\n { value: Gender.Female, title: T('gender.female') },\n { value: Gender.Undefined, title: T('gender.undefined') }\n ], []);\n const warCasualtyOptions = useMemo(() => [\n { value: 'N', title: T('person.survivor') },\n { value: 'Y', title: T('person.victim') }\n ], []);\n const victimTypeOptions = useMemo(() => [\n { value: VictimType.Military, title: T('victimType.military')},\n { value: VictimType.Civilian, title: T('victimType.civilian') }\n ], []);\n const namelisterOptions = useMemo(() => [\n { value: 'Y', title: T('yes') },\n { value: 'N', title: T('no') }\n ], []);\n\n const [firstName, setFirstName, firstNameError, setFirstNameError]\n = useStateWithError(name.firstName);\n const [lastName, setLastName, lastNameError, setLastNameError]\n = useStateWithError(name.lastName);\n const [gender, setGender, genderError]\n = useStateWithError(Gender.Undefined);\n const [warCasualty, setWarCasualty, warCasualtyError]\n = useStateWithError(true);\n const [isNamelister, setNamelister, isNamelisterError]\n = useStateWithError(true);\n const [diedDate, setDiedDate, diedDateError, setDiedDateError]\n = useStateWithError(emptyDate());\n const [victimType, setVictimType, victimTypeError]\n = useStateWithError(VictimType.Civilian);\n \n const handleChangedGender = (value: string) => {\n setGender(value as Gender);\n };\n\n const handleWarCasualtyChanged = (value: string) => {\n setWarCasualty(value === 'Y');\n };\n\n const handleVictimTypeChanged = (value: string) => {\n setVictimType(value as VictimType);\n };\n\n const handleNamelisterChanged = (value: string) => {\n setNamelister(value === 'Y');\n };\n\n const personObjectFromState = (): IPersonFields => {\n const newPerson: IPersonFields = {\n surname: firstName,\n familyname: lastName,\n initials: '',\n alternative_familynames: [],\n alternative_surnames: [],\n gender: gender,\n nationality: '',\n description: '',\n memorials: [],\n relations: [],\n project_memberships: [],\n born_day: '?',\n born_month: '?',\n born_year: '?',\n sort_born_date: '', // not actually needed here\n died_age: 0,\n died_day: diedDate.day,\n died_month: diedDate.month,\n died_year: diedDate.year,\n sort_died_date: '', // not actually needed here\n victim_type: victimType,\n victim_type_details: 'NONE',\n war_casualty: warCasualty,\n in_namelist: isNamelister,\n cwxrm_remembered: false\n };\n return newPerson\n }\n\n const setValidationErrors = (result: IValidationResult): boolean => {\n if (result.status === 'OK')\n return false;\n\n const errors = result.data || {};\n setFirstNameError(errors.surname);\n setLastNameError(errors.familyname);\n setDiedDateError(errors.died_date);\n\n // emailError: getErrorDescription(errors.email),\n // phoneError: getErrorDescription(errors.phone),\n // streetError: getErrorDescription(errors.street),\n // streetNumberError: getErrorDescription(errors.streetNumber),\n // placeError: getErrorDescription(errors.placeId),\n // notesError: getErrorDescription(errors.notes)\n return true;\n };\n\n const handleClickedCreate = async () => {\n try {\n const newPerson: IPersonFields = personObjectFromState()\n const result = await API.validatePerson(newPerson,'create')\n if (result.status !== 'OK') {\n throw (result)\n }\n const person = await API.createPerson(newPerson);\n NotificationManager.success(T('page.contactPerson.save.success'));\n resolve(person)\n }\n catch(result) {\n if (isValidationResult(result)) {\n setValidationErrors(result);\n } else {\n NotificationManager.error(T('page.contactPerson.save.failure'));\n }\n }\n }\n\n const handleClickedCancel = () => {\n resolve(undefined);\n };\n\n return (\n \n {T('modal.createperson.title')}\n \n
\n \n \n \n \n \n \n {warCasualty && (\n \n )}\n \n
\n \n \n \n \n
\n );\n}\n","import React from 'react';\nimport { T } from './Translate';\nimport { ISelectOption } from './components/inputs/SelectInput';\n\nexport const COUNTRY_LIST: { code: string, name: string }[] = [\n {\n code: \"__\",\n name: T('country.select')\n },\n {\n code: \"AF\",\n name: \"Afghanistan\"\n },\n {\n code: \"AL\",\n name: \"Albania\"\n },\n {\n code: \"DZ\",\n name: \"Algeria\"\n },\n {\n code: \"AS\",\n name: \"American Samoa\"\n },\n {\n code: \"AD\",\n name: \"Andorra\"\n },\n {\n code: \"AO\",\n name: \"Angola\"\n },\n {\n code: \"AI\",\n name: \"Anguilla\"\n },\n {\n code: \"AQ\",\n name: \"Antarctica\"\n },\n {\n code: \"AG\",\n name: \"Antigua and Barbuda\"\n },\n {\n code: \"AR\",\n name: \"Argentina\"\n },\n {\n code: \"AM\",\n name: \"Armenia\"\n },\n {\n code: \"AW\",\n name: \"Aruba\"\n },\n {\n code: \"AU\",\n name: \"Australia\"\n },\n {\n code: \"AT\",\n name: \"Austria\"\n },\n {\n code: \"AZ\",\n name: \"Azerbaijan\"\n },\n {\n code: \"BS\",\n name: \"Bahamas\"\n },\n {\n code: \"BH\",\n name: \"Bahrain\"\n },\n {\n code: \"BD\",\n name: \"Bangladesh\"\n },\n {\n code: \"BB\",\n name: \"Barbados\"\n },\n {\n code: \"BY\",\n name: \"Belarus\"\n },\n {\n code: \"BE\",\n name: \"Belgium\"\n },\n {\n code: \"BZ\",\n name: \"Belize\"\n },\n {\n code: \"BJ\",\n name: \"Benin\"\n },\n {\n code: \"BM\",\n name: \"Bermuda\"\n },\n {\n code: \"BT\",\n name: \"Bhutan\"\n },\n {\n code: \"BO\",\n name: \"Bolivia, Plurinational State Of\"\n },\n {\n code: \"BQ\",\n name: \"Bonaire, Sint Eustatius and Saba\"\n },\n {\n code: \"BA\",\n name: \"Bosnia and Herzegovina\"\n },\n {\n code: \"BW\",\n name: \"Botswana\"\n },\n {\n code: \"BV\",\n name: \"Bouvet Island\"\n },\n {\n code: \"BR\",\n name: \"Brazil\"\n },\n {\n code: \"IO\",\n name: \"British Indian Ocean Territory\"\n },\n {\n code: \"BN\",\n name: \"Brunei Darussalam\"\n },\n {\n code: \"BG\",\n name: \"Bulgaria\"\n },\n {\n code: \"BF\",\n name: \"Burkina Faso\"\n },\n {\n code: \"BI\",\n name: \"Burundi\"\n },\n {\n code: \"KH\",\n name: \"Cambodia\"\n },\n {\n code: \"CM\",\n name: \"Cameroon\"\n },\n {\n code: \"CA\",\n name: \"Canada\"\n },\n {\n code: \"CV\",\n name: \"Cape Verde\"\n },\n {\n code: \"KY\",\n name: \"Cayman Islands\"\n },\n {\n code: \"CF\",\n name: \"Central African Republic\"\n },\n {\n code: \"TD\",\n name: \"Chad\"\n },\n {\n code: \"CL\",\n name: \"Chile\"\n },\n {\n code: \"CN\",\n name: \"China\"\n },\n {\n code: \"CX\",\n name: \"Christmas Island\"\n },\n {\n code: \"CC\",\n name: \"Cocos (Keeling) Islands\"\n },\n {\n code: \"CO\",\n name: \"Colombia\"\n },\n {\n code: \"KM\",\n name: \"Comoros\"\n },\n {\n code: \"CG\",\n name: \"Congo\"\n },\n {\n code: \"CD\",\n name: \"Congo The Democratic Republic Of The\"\n },\n {\n code: \"CK\",\n name: \"Cook Islands\"\n },\n {\n code: \"CR\",\n name: \"Costa Rica\"\n },\n {\n code: \"HR\",\n name: \"Croatia\"\n },\n {\n code: \"CU\",\n name: \"Cuba\"\n },\n {\n code: \"CW\",\n name: \"Curaçao\"\n },\n {\n code: \"CY\",\n name: \"Cyprus\"\n },\n {\n code: \"CZ\",\n name: \"Czech Republic\"\n },\n {\n code: \"CI\",\n name: \"Côte D'Ivoire\"\n },\n {\n code: \"DK\",\n name: \"Denmark\"\n },\n {\n code: \"DJ\",\n name: \"Djibouti\"\n },\n {\n code: \"DM\",\n name: \"Dominica\"\n },\n {\n code: \"DO\",\n name: \"Dominican Republic\"\n },\n {\n code: \"EC\",\n name: \"Ecuador\"\n },\n {\n code: \"EG\",\n name: \"Egypt\"\n },\n {\n code: \"SV\",\n name: \"El Salvador\"\n },\n {\n code: \"GQ\",\n name: \"Equatorial Guinea\"\n },\n {\n code: \"ER\",\n name: \"Eritrea\"\n },\n {\n code: \"EE\",\n name: \"Estonia\"\n },\n {\n code: \"ET\",\n name: \"Ethiopia\"\n },\n {\n code: \"FK\",\n name: \"Falkland Islands (Malvinas)\"\n },\n {\n code: \"FO\",\n name: \"Faroe Islands\"\n },\n {\n code: \"FJ\",\n name: \"Fiji\"\n },\n {\n code: \"FI\",\n name: \"Finland\"\n },\n {\n code: \"FR\",\n name: \"France\"\n },\n {\n code: \"GF\",\n name: \"French Guiana\"\n },\n {\n code: \"PF\",\n name: \"French Polynesia\"\n },\n {\n code: \"TF\",\n name: \"French Southern Territories\"\n },\n {\n code: \"GA\",\n name: \"Gabon\"\n },\n {\n code: \"GM\",\n name: \"Gambia\"\n },\n {\n code: \"GE\",\n name: \"Georgia\"\n },\n {\n code: \"DE\",\n name: \"Germany\"\n },\n {\n code: \"GH\",\n name: \"Ghana\"\n },\n {\n code: \"GI\",\n name: \"Gibraltar\"\n },\n {\n code: \"GR\",\n name: \"Greece\"\n },\n {\n code: \"GL\",\n name: \"Greenland\"\n },\n {\n code: \"GD\",\n name: \"Grenada\"\n },\n {\n code: \"GP\",\n name: \"Guadeloupe\"\n },\n {\n code: \"GU\",\n name: \"Guam\"\n },\n {\n code: \"GT\",\n name: \"Guatemala\"\n },\n {\n code: \"GG\",\n name: \"Guernsey\"\n },\n {\n code: \"GN\",\n name: \"Guinea\"\n },\n {\n code: \"GW\",\n name: \"Guinea-Bissau\"\n },\n {\n code: \"GY\",\n name: \"Guyana\"\n },\n {\n code: \"HT\",\n name: \"Haiti\"\n },\n {\n code: \"HM\",\n name: \"Heard Island and McDonald Islands\"\n },\n {\n code: \"VA\",\n name: \"Holy See (Vatican City State)\"\n },\n {\n code: \"HN\",\n name: \"Honduras\"\n },\n {\n code: \"HK\",\n name: \"Hong Kong\"\n },\n {\n code: \"HU\",\n name: \"Hungary\"\n },\n {\n code: \"IS\",\n name: \"Iceland\"\n },\n {\n code: \"IN\",\n name: \"India\"\n },\n {\n code: \"ID\",\n name: \"Indonesia\"\n },\n {\n code: \"IR\",\n name: \"Iran, Islamic Republic Of\"\n },\n {\n code: \"IQ\",\n name: \"Iraq\"\n },\n {\n code: \"IE\",\n name: \"Ireland\"\n },\n {\n code: \"IM\",\n name: \"Isle of Man\"\n },\n {\n code: \"IL\",\n name: \"Israel\"\n },\n {\n code: \"IT\",\n name: \"Italy\"\n },\n {\n code: \"JM\",\n name: \"Jamaica\"\n },\n {\n code: \"JP\",\n name: \"Japan\"\n },\n {\n code: \"JE\",\n name: \"Jersey\"\n },\n {\n code: \"JO\",\n name: \"Jordan\"\n },\n {\n code: \"KZ\",\n name: \"Kazakhstan\"\n },\n {\n code: \"KE\",\n name: \"Kenya\"\n },\n {\n code: \"KI\",\n name: \"Kiribati\"\n },\n {\n code: \"KP\",\n name: \"Korea, Democratic People's Republic Of\"\n },\n {\n code: \"KR\",\n name: \"Korea, Republic of\"\n },\n {\n code: \"KW\",\n name: \"Kuwait\"\n },\n {\n code: \"KG\",\n name: \"Kyrgyzstan\"\n },\n {\n code: \"LA\",\n name: \"Lao People's Democratic Republic\"\n },\n {\n code: \"LV\",\n name: \"Latvia\"\n },\n {\n code: \"LB\",\n name: \"Lebanon\"\n },\n {\n code: \"LS\",\n name: \"Lesotho\"\n },\n {\n code: \"LR\",\n name: \"Liberia\"\n },\n {\n code: \"LY\",\n name: \"Libya\"\n },\n {\n code: \"LI\",\n name: \"Liechtenstein\"\n },\n {\n code: \"LT\",\n name: \"Lithuania\"\n },\n {\n code: \"LU\",\n name: \"Luxembourg\"\n },\n {\n code: \"MO\",\n name: \"Macao\"\n },\n {\n code: \"MK\",\n name: \"Macedonia, the Former Yugoslav Republic Of\"\n },\n {\n code: \"MG\",\n name: \"Madagascar\"\n },\n {\n code: \"MW\",\n name: \"Malawi\"\n },\n {\n code: \"MY\",\n name: \"Malaysia\"\n },\n {\n code: \"MV\",\n name: \"Maldives\"\n },\n {\n code: \"ML\",\n name: \"Mali\"\n },\n {\n code: \"MT\",\n name: \"Malta\"\n },\n {\n code: \"MH\",\n name: \"Marshall Islands\"\n },\n {\n code: \"MQ\",\n name: \"Martinique\"\n },\n {\n code: \"MR\",\n name: \"Mauritania\"\n },\n {\n code: \"MU\",\n name: \"Mauritius\"\n },\n {\n code: \"YT\",\n name: \"Mayotte\"\n },\n {\n code: \"MX\",\n name: \"Mexico\"\n },\n {\n code: \"FM\",\n name: \"Micronesia, Federated States Of\"\n },\n {\n code: \"MD\",\n name: \"Moldova, Republic of\"\n },\n {\n code: \"MC\",\n name: \"Monaco\"\n },\n {\n code: \"MN\",\n name: \"Mongolia\"\n },\n {\n code: \"ME\",\n name: \"Montenegro\"\n },\n {\n code: \"MS\",\n name: \"Montserrat\"\n },\n {\n code: \"MA\",\n name: \"Morocco\"\n },\n {\n code: \"MZ\",\n name: \"Mozambique\"\n },\n {\n code: \"MM\",\n name: \"Myanmar\"\n },\n {\n code: \"NA\",\n name: \"Namibia\"\n },\n {\n code: \"NR\",\n name: \"Nauru\"\n },\n {\n code: \"NP\",\n name: \"Nepal\"\n },\n {\n code: \"NL\",\n name: \"Netherlands\"\n },\n {\n code: \"NC\",\n name: \"New Caledonia\"\n },\n {\n code: \"NZ\",\n name: \"New Zealand\"\n },\n {\n code: \"NI\",\n name: \"Nicaragua\"\n },\n {\n code: \"NE\",\n name: \"Niger\"\n },\n {\n code: \"NG\",\n name: \"Nigeria\"\n },\n {\n code: \"NU\",\n name: \"Niue\"\n },\n {\n code: \"NF\",\n name: \"Norfolk Island\"\n },\n {\n code: \"MP\",\n name: \"Northern Mariana Islands\"\n },\n {\n code: \"NO\",\n name: \"Norway\"\n },\n {\n code: \"OM\",\n name: \"Oman\"\n },\n {\n code: \"PK\",\n name: \"Pakistan\"\n },\n {\n code: \"PW\",\n name: \"Palau\"\n },\n {\n code: \"PS\",\n name: \"Palestinian Territory, Occupied\"\n },\n {\n code: \"PA\",\n name: \"Panama\"\n },\n {\n code: \"PG\",\n name: \"Papua New Guinea\"\n },\n {\n code: \"PY\",\n name: \"Paraguay\"\n },\n {\n code: \"PE\",\n name: \"Peru\"\n },\n {\n code: \"PH\",\n name: \"Philippines\"\n },\n {\n code: \"PN\",\n name: \"Pitcairn\"\n },\n {\n code: \"PL\",\n name: \"Poland\"\n },\n {\n code: \"PT\",\n name: \"Portugal\"\n },\n {\n code: \"PR\",\n name: \"Puerto Rico\"\n },\n {\n code: \"QA\",\n name: \"Qatar\"\n },\n {\n code: \"RO\",\n name: \"Romania\"\n },\n {\n code: \"RU\",\n name: \"Russian Federation\"\n },\n {\n code: \"RW\",\n name: \"Rwanda\"\n },\n {\n code: \"RE\",\n name: \"Réunion\"\n },\n {\n code: \"BL\",\n name: \"Saint Barthélemy\"\n },\n {\n code: \"SH\",\n name: \"Saint Helena, Ascension and Tristan Da Cunha\"\n },\n {\n code: \"KN\",\n name: \"Saint Kitts And Nevis\"\n },\n {\n code: \"LC\",\n name: \"Saint Lucia\"\n },\n {\n code: \"MF\",\n name: \"Saint Martin (French Part)\"\n },\n {\n code: \"PM\",\n name: \"Saint Pierre And Miquelon\"\n },\n {\n code: \"VC\",\n name: \"Saint Vincent And The Grenadines\"\n },\n {\n code: \"WS\",\n name: \"Samoa\"\n },\n {\n code: \"SM\",\n name: \"San Marino\"\n },\n {\n code: \"ST\",\n name: \"Sao Tome and Principe\"\n },\n {\n code: \"SA\",\n name: \"Saudi Arabia\"\n },\n {\n code: \"SN\",\n name: \"Senegal\"\n },\n {\n code: \"RS\",\n name: \"Serbia\"\n },\n {\n code: \"SC\",\n name: \"Seychelles\"\n },\n {\n code: \"SL\",\n name: \"Sierra Leone\"\n },\n {\n code: \"SG\",\n name: \"Singapore\"\n },\n {\n code: \"SX\",\n name: \"Sint Maarten (Dutch part)\"\n },\n {\n code: \"SK\",\n name: \"Slovakia\"\n },\n {\n code: \"SI\",\n name: \"Slovenia\"\n },\n {\n code: \"SB\",\n name: \"Solomon Islands\"\n },\n {\n code: \"SO\",\n name: \"Somalia\"\n },\n {\n code: \"ZA\",\n name: \"South Africa\"\n },\n {\n code: \"GS\",\n name: \"South Georgia and the South Sandwich Islands\"\n },\n {\n code: \"SS\",\n name: \"South Sudan\"\n },\n {\n code: \"ES\",\n name: \"Spain\"\n },\n {\n code: \"LK\",\n name: \"Sri Lanka\"\n },\n {\n code: \"SD\",\n name: \"Sudan\"\n },\n {\n code: \"SR\",\n name: \"Suriname\"\n },\n {\n code: \"SJ\",\n name: \"Svalbard And Jan Mayen\"\n },\n {\n code: \"SZ\",\n name: \"Swaziland\"\n },\n {\n code: \"SE\",\n name: \"Sweden\"\n },\n {\n code: \"CH\",\n name: \"Switzerland\"\n },\n {\n code: \"SY\",\n name: \"Syrian Arab Republic\"\n },\n {\n code: \"TW\",\n name: \"Taiwan, Province Of China\"\n },\n {\n code: \"TJ\",\n name: \"Tajikistan\"\n },\n {\n code: \"TZ\",\n name: \"Tanzania, United Republic of\"\n },\n {\n code: \"TH\",\n name: \"Thailand\"\n },\n {\n code: \"TL\",\n name: \"Timor-Leste\"\n },\n {\n code: \"TG\",\n name: \"Togo\"\n },\n {\n code: \"TK\",\n name: \"Tokelau\"\n },\n {\n code: \"TO\",\n name: \"Tonga\"\n },\n {\n code: \"TT\",\n name: \"Trinidad and Tobago\"\n },\n {\n code: \"TN\",\n name: \"Tunisia\"\n },\n {\n code: \"TR\",\n name: \"Turkey\"\n },\n {\n code: \"TM\",\n name: \"Turkmenistan\"\n },\n {\n code: \"TC\",\n name: \"Turks and Caicos Islands\"\n },\n {\n code: \"TV\",\n name: \"Tuvalu\"\n },\n {\n code: \"UG\",\n name: \"Uganda\"\n },\n {\n code: \"UA\",\n name: \"Ukraine\"\n },\n {\n code: \"AE\",\n name: \"United Arab Emirates\"\n },\n {\n code: \"GB\",\n name: \"United Kingdom\"\n },\n {\n code: \"US\",\n name: \"United States\"\n },\n {\n code: \"UM\",\n name: \"United States Minor Outlying Islands\"\n },\n {\n code: \"UY\",\n name: \"Uruguay\"\n },\n {\n code: \"UZ\",\n name: \"Uzbekistan\"\n },\n {\n code: \"VU\",\n name: \"Vanuatu\"\n },\n {\n code: \"VE\",\n name: \"Venezuela, Bolivarian Republic of\"\n },\n {\n code: \"VN\",\n name: \"Viet Nam\"\n },\n {\n code: \"VG\",\n name: \"Virgin Islands, British\"\n },\n {\n code: \"VI\",\n name: \"Virgin Islands, U.S.\"\n },\n {\n code: \"WF\",\n name: \"Wallis and Futuna\"\n },\n {\n code: \"EH\",\n name: \"Western Sahara\"\n },\n {\n code: \"YE\",\n name: \"Yemen\"\n },\n {\n code: \"ZM\",\n name: \"Zambia\"\n },\n {\n code: \"ZW\",\n name: \"Zimbabwe\"\n },\n {\n code: \"AX\",\n name: \"Åland Islands\"\n }\n];\n\nexport const COUNTRY_OPTIONS = COUNTRY_LIST.map(country => );\nexport const COUNTRY_SELECT_OPTIONS: ISelectOption[] = COUNTRY_LIST.map(country => ({ value: country.code, title: country.name }));\n","import React, { ReactNode, CSSProperties } from 'react';\n\ninterface SecondaryButtonProps {\n variant?: 'primary'|'secondary'|'success'|'danger'|'warning'|'info';\n onClick: () => void;\n style?: CSSProperties;\n children: ReactNode;\n}\nexport const SecondaryButton = (props: SecondaryButtonProps) => {\n const { variant = 'primary', onClick, style, children } = props;\n const handleClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n onClick();\n };\n return (\n \n {children}\n \n );\n}\n","import React from 'react';\nimport { Icon } from '../../components/Icons';\nimport { ResolutionStatus, getResolutionStatusColor } from '../../models/Place';\nimport { useElementID } from '../../utils/ElementID';\nimport { SecondaryButton } from '../../components/SecondaryButton';\nimport { T } from \"../../Translate\";\n\ninterface PlaceSearchInputProps {\n resolutionStatus: ResolutionStatus;\n name: string;\n value: string;\n onChange: (value: string) => void;\n onClickedGoogle: () => void;\n onClickedGeonames: () => void;\n error?: string;\n}\nexport const PlaceSearchInput = (props: PlaceSearchInputProps) => {\n const {\n resolutionStatus,\n name,\n value,\n onChange,\n onClickedGoogle,\n error,\n } = props;\n\n const id = useElementID('input');\n const resolutionStatusColor = getResolutionStatusColor(resolutionStatus);\n\n return (\n
\n \n
\n onChange(e.currentTarget.value)}\n placeholder='Naam'\n />\n {error && (\n
\n {error}\n
\n )}\n
\n
\n \n Google!\n \n
\n
\n );\n}\n","import React, { DependencyList, EffectCallback, useEffect, useState } from \"react\";\n\nexport function useDelayedEffect(\n callback: React.EffectCallback,\n dependencies: React.DependencyList,\n delay: number) {\n return useEffect(() => {\n const timeout = setTimeout(callback, delay);\n return () => clearTimeout(timeout);\n }, dependencies); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport function useDelayedEffectWithLoading(\n callback: () => Promise,\n dependencies: React.DependencyList,\n delay: number\n): boolean {\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n setLoading(true);\n const timeout = setTimeout(() => {\n callback().then(() => setLoading(false));\n }, delay);\n return () => clearTimeout(timeout);\n }, dependencies); // eslint-disable-line react-hooks/exhaustive-deps\n return loading;\n}\n","import { T, TranslationKey } from \"../Translate\";\nimport { IContactPerson } from \"./ContactPerson\";\nimport { IKeyLocation } from \"./KeyLocation\";\nimport { IPerson } from \"./Person\";\n\nexport enum StoryStatus {\n IN_PROGRESS = 'in progress',\n IN_REVIEW = 'in review',\n DONE = 'done'\n}\n\nexport enum Template {\n TEMPLATE_1 = 1,\n TEMPLATE_2 = 2,\n TEMPLATE_3 = 3\n}\n\nexport enum ImageType {\n PROFILE = 'profile',\n EXTRA = 'extra'\n}\n\nexport enum Language {\n NL = 'nl',\n FR = 'fr',\n EN = 'en',\n DE = 'de',\n}\n\nexport interface IPersonStoryText {\n story_part_1: string,\n story_part_2: string,\n story_status: StoryStatus,\n story_child_part_1: string,\n story_child_part_2: string,\n story_child_status: StoryStatus,\n language: Language\n}\n\nexport interface IPersonStoryImage {\n source_image_url: string,\n processed_image_url: string,\n image_type: ImageType,\n x: number,\n y: number,\n width: number,\n height: number,\n grayscale: boolean,\n contrast: number,\n template: Template,\n upscaled: boolean,\n legend?: {[key: string]: string}|null\n}\n\nexport interface IPersonStoryTextForLanguage {\n nl?: IPersonStoryText | null\n fr?: IPersonStoryText | null\n en?: IPersonStoryText | null\n de?: IPersonStoryText | null\n}\n\nexport interface IPersonStory2 {\n _id: string;\n person_id_ref: string;\n person?: IPerson;\n first_name: string;\n family_name: string;\n born_year: string;\n died_year: string;\n community: string;\n area: string;\n country_code: string;\n place_source_event_ref?: string;\n story_status: StoryStatus;\n story_child_option: boolean;\n story_text?: IPersonStoryTextForLanguage | null;\n profile_image?: IPersonStoryImage | null;\n map_image?: string|null;\n extra_images?: IPersonStoryImage[] | null;\n coupling_use_events_with_places_refs?: string[] | null;\n coupling_use_died_date?: boolean | null;\n coupling_tags?: string[] | null;\n coupling_story_refs?: string[] | null;\n coupling_stories?: IPersonStory2[];\n published_date?: string;\n calculated_full_name?: string;\n calculated_filter?: string;\n key_location_id?: string | null;\n key_location?: IKeyLocation;\n key_date?: string;\n key_organisation_title?: string;\n linked_contact_persons?: ILinkedContactPerson[];\n targets: string[];\n}\n\nexport interface ILinkedContactPerson {\n person: IContactPerson;\n title: string;\n}\n\nexport enum PersonStoryTag {\n Art = 'art',\n Education = 'education',\n Science = 'science',\n Sport = 'sport',\n Politics = 'politics',\n Economy = 'economy',\n Religion = 'religion',\n Colonialism = 'colonialism',\n MedicalCare = 'medical_care',\n Aviation = 'aviation',\n PrisonerOfWar = 'prisoner_of_war',\n Dwangarbeid = 'forced_labor',\n Verzet = 'resistance',\n Desertie = 'desertion',\n Gas = 'gas',\n Battle1 = 'battle1',\n XMas1914 = 'xmas1914',\n Battle2 = 'battle2',\n MineBattle = 'mine_battle',\n Battle3 = 'battle3',\n SpringOffensive = 'spring_offensive',\n LiberationOffensive = 'liberation_offensive',\n MinorOperation = 'minor_operation',\n Reconstruction='reconstruction',\n Accident = 'accident',\n}\n\nexport function translatePersonStoryTag(tag: PersonStoryTag) {\n return T('storytag.' + tag as TranslationKey);\n}\n\nexport interface IPublishedPersonStory {\n _id: string;\n person_id_ref: string;\n first_name: string;\n family_name: string;\n born_year: string;\n died_year: string;\n community: string;\n area: string;\n country_code: string;\n story_child_option: boolean;\n story_text: IPersonStoryTextForLanguage;\n location: {\n type: 'Point',\n coordinates: [number, number]\n },\n profile_image_url: string;\n map_image_url: string;\n extra_images: {\n url: string;\n legend: {[key: string]: string};\n }[];\n event_type: string;\n name: string;\n}\n\nfunction removeWhitespaceLines(value: string): string {\n return value.split(/\\n[ \\t]+\\n/g).join('\\n\\n');\n}\n\nexport function fixWhitespaceLines(story: IPersonStory2): IPersonStory2 {\n if (story.story_text) {\n const keys = ['nl', 'en', 'fr', 'de'] as (keyof IPersonStoryTextForLanguage)[];\n for (var key of keys) {\n const text = story.story_text[key];\n if (!text)\n continue;\n \n text.story_part_1 = removeWhitespaceLines(text.story_part_1);\n text.story_part_2 = removeWhitespaceLines(text.story_part_2);\n text.story_child_part_1 = removeWhitespaceLines(text.story_child_part_1);\n text.story_child_part_2 = removeWhitespaceLines(text.story_child_part_2);\n }\n }\n return story;\n}\n","import React, { useState } from 'react';\nimport { Language } from \"../../../models/PersonStory2\";\nimport { T, TranslationKey } from \"../../../Translate\";\nimport { Badge, Dropdown } from \"react-bootstrap\";\n\n\nexport interface LanguageSelectorProps {\n onUpdateLanguage: (language: Language) => void\n errors?: Language[] // array of the languages that should present an error indicator\n}\n\nexport const LanguageSelector = (props: LanguageSelectorProps) => {\n /** Props */\n const { onUpdateLanguage, errors } = props;\n\n /** State **/\n const [currentLanguage, setCurrentLanguage] = useState(Language.NL);\n\n /** event handling **/\n\n const onLanguageChanged = (newLanguage: Language) => {\n onUpdateLanguage(newLanguage)\n setCurrentLanguage(newLanguage)\n }\n\n /** Helper methods **/\n\n const generateLanguageString = (language: Language): string => {\n switch (language) {\n case Language.NL: return T('language.nl')\n case Language.FR: return T('language.fr')\n case Language.EN: return T('language.en')\n case Language.DE: return T('language.de')\n }\n }\n\n const hasError = (language: Language): boolean => {\n return errors?.includes(language) ?? false\n }\n\n const hasErrors = (): boolean => {\n if (!errors)\n return false;\n\n return errors.length > 0\n }\n\n const CustomToggle = React.forwardRef(\n // @ts-ignore\n ({ children, onClick }, ref) => (\n \n {children}\n ▼\n \n ));\n\n return (\n <>\n \n \n {hasErrors() &&\n !\n }\n {generateLanguageString(currentLanguage)}\n \n\n \n {Object.values(Language).map(language => {\n onLanguageChanged(language as Language);\n e.preventDefault();\n }}>\n {T(('language.' + language) as TranslationKey)}\n {hasError(language) &&\n !\n }\n )}\n \n \n \n )\n};\n","import React from 'react';\nimport {\n withGoogleMap,\n GoogleMap,\n Marker\n} from \"react-google-maps\";\nimport { useElementID } from '../../utils/ElementID';\n\nexport interface ILatLon {\n lat: number;\n lng: number;\n}\n\nexport class MapMarkerInputValue {\n static empty() {\n return new MapMarkerInputValue('', '', undefined, undefined);\n }\n\n static fromValue(value?: ILatLon) {\n if (value === undefined) {\n return this.empty();\n }\n \n return new MapMarkerInputValue(\n value.lat.toFixed(4),\n value.lng.toFixed(4),\n value.lat,\n value.lng,\n value\n );\n }\n\n static fromPosition(value: { lat: number, lon: number }) {\n return new MapMarkerInputValue(\n value.lat.toFixed(4),\n value.lon.toFixed(4),\n value.lat,\n value.lon,\n { lat: value.lat, lng: value.lon }\n );\n }\n\n latAsString: string;\n lonAsString: string;\n latAsNumber?: number;\n lonAsNumber?: number;\n lastValidPosition?: ILatLon;\n\n constructor(\n latAsString: string,\n lonAsString: string,\n latAsNumber?: number,\n lonAsNumber?: number,\n value?: ILatLon\n ) {\n this.lastValidPosition = value;\n this.latAsString = latAsString;\n this.lonAsString = lonAsString;\n this.latAsNumber = latAsNumber;\n this.lonAsNumber = lonAsNumber;\n }\n\n get valid(): boolean {\n return this.latAsNumber !== undefined && this.lonAsNumber !== undefined;\n }\n\n withLatValue(value: string): MapMarkerInputValue {\n if (!/^[0-9.,]+$/.test(value)) {\n return new MapMarkerInputValue(value, this.lonAsString, undefined, this.lonAsNumber, this.lastValidPosition);\n }\n\n const latAsNumber = parseFloat(value.replace(',', '.'));\n if (Number.isNaN(latAsNumber)) {\n return new MapMarkerInputValue(value, this.lonAsString, undefined, this.lonAsNumber, this.lastValidPosition);\n } else {\n return new MapMarkerInputValue(value, this.lonAsString, latAsNumber, this.lonAsNumber, this.lonAsNumber === undefined ? undefined : {\n lat: latAsNumber,\n lng: this.lonAsNumber\n });\n }\n }\n\n withLonValue(value: string): MapMarkerInputValue {\n if (!/^[0-9.,]+$/.test(value)) {\n return new MapMarkerInputValue(this.latAsString, value, this.latAsNumber, undefined, this.lastValidPosition);\n }\n\n const lonAsNumber = parseFloat(value.replace(',', '.'));\n if (Number.isNaN(lonAsNumber)) {\n return new MapMarkerInputValue(this.latAsString, value, this.latAsNumber, undefined, this.lastValidPosition);\n } else {\n return new MapMarkerInputValue(this.latAsString, value, this.latAsNumber, lonAsNumber, this.latAsNumber === undefined ? undefined : {\n lat: this.latAsNumber,\n lng: lonAsNumber\n });\n }\n }\n}\n\ninterface MapMarkerInputProps {\n labelColumns?: number;\n\n label?: string;\n position: MapMarkerInputValue;\n defaultCenter?: ILatLon;\n defaultZoom?: number;\n info?: string;\n readOnly?: boolean;\n\n onChange: (position: MapMarkerInputValue) => void;\n}\n\nexport const MapMarkerInputMap = withGoogleMap((props: MapMarkerInputProps) => {\n const {\n position,\n defaultCenter = position.lastValidPosition,\n defaultZoom = 8,\n onChange,\n readOnly = false\n } = props;\n\n const handleDragEnd = (e: any) => {\n if (readOnly)\n return;\n \n onChange(MapMarkerInputValue.fromValue({ lat: e.latLng.lat(), lng: e.latLng.lng() }));\n };\n\n const handleClick = (e: any) => {\n if (readOnly)\n return;\n \n onChange(MapMarkerInputValue.fromValue({ lat: e.latLng.lat(), lng: e.latLng.lng() }));\n };\n\n return (\n \n {position.lastValidPosition && (\n \n )}\n \n );\n});\n\nexport const MapMarkerInput = (props: MapMarkerInputProps) => {\n const {\n labelColumns = 4,\n label,\n info,\n readOnly\n } = props;\n\n let labelColumnsCount = labelColumns;\n if (!label) {\n labelColumnsCount = 0;\n }\n const id = useElementID('input');\n return (\n
\n {((labelColumnsCount > 0) && )}\n
\n }\n mapElement={
}\n readOnly={readOnly}\n {...props}\n />\n {info && {info}}\n
\n
\n );\n}\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { Form, Row, Col, Card } from 'react-bootstrap';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { SelectInput } from '../../components/inputs/SelectInput';\nimport { COUNTRY_SELECT_OPTIONS } from '../../Countries';\nimport {\n Place,\n PlaceType,\n PlaceTypes,\n getPlaceTypeName,\n ResolutionStatus,\n toLatLng,\n IPlace,\n IPlaceSearchResultEntry,\n IPlaceLanguage\n} from '../../models/Place';\nimport { getLanguageStringForLanguage, T } from '../../Translate';\nimport api from '../../api';\nimport { PlaceSearchInput } from './PlaceSearchInput';\nimport { ButtonLink } from '../../components/ButtonLink';\nimport { useDelayedEffect } from '../../utils/DelayedEffect';\nimport { SortDirection } from '../../components/table/Table';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\nimport { Colors, TextStyles } from \"../../config/styles\";\nimport { LanguageSelector } from \"../EditPersonStory/Stories/LanguageSelector\";\nimport { NotificationManager } from \"react-notifications\";\nimport { MapMarkerInputValue } from '../../components/inputs/MapMarkerInput';\n\n\nexport interface PlaceFormState {\n resolutionStatus: ResolutionStatus;\n country: string;\n type: PlaceType;\n alternativeNames: string;\n location: MapMarkerInputValue;\n languages: {[language: string]: IPlaceLanguage};\n\n suggestions: IPlace[];\n similar: IPlace[];\n}\n\ninterface PlaceFormProps {\n placeId?: string\n formState: PlaceFormState;\n setFormState: (transform: (state: PlaceFormState) => PlaceFormState) => void;\n onClickedSimilar?: (place: IPlace) => void;\n}\n\n\nexport const PlaceForm = (props: PlaceFormProps) => {\n const { formState, setFormState, onClickedSimilar } = props;\n\n const [currentLanguage, setCurrentLanguage] = useState('nl')\n\n\n const placeTypes = useMemo(\n () => PlaceTypes.map(type => (\n \n )),\n []\n );\n const googleMatchCounter = useMemo<[number]>(() => [0], []);\n const [geolocationError, setGeolocationError] = useState();\n\n const {\n resolutionStatus,\n country,\n type,\n alternativeNames,\n languages,\n suggestions,\n similar\n } = formState;\n\n const updatePlace = useCallback((update: Partial) => {\n setFormState(state => {\n if (update.country || update.type || update.languages) {\n if (state.resolutionStatus !== ResolutionStatus.Custom) {\n update.resolutionStatus = ResolutionStatus.Custom;\n }\n }\n const newObject = Object.assign({}, state, update);\n return newObject\n });\n }, [setFormState]);\n\n\n const updatePlaceLanguage = useCallback((language: string, update: Partial) => {\n setFormState(state => {\n const newLanguageInfo = Object.assign({}, state.languages[language], update);\n const newLanguages = Object.assign({}, state.languages, {[language]: newLanguageInfo});\n const newObject = Object.assign({}, state, {languages: newLanguages, resolutionStatus: ResolutionStatus.Custom});\n return newObject\n });\n }, [setFormState]);\n\n\n\n useDelayedEffect(() => {\n if (!languages[currentLanguage].name) {\n updatePlace({ similar: [] });\n return;\n }\n\n api.findPlaces(\n languages[currentLanguage].name,\n 0, 10,\n [['filter', SortDirection.Up]],\n undefined,\n undefined,\n { country_code: country }\n ).then(places => {\n const similarWithoutCurrent = places.data.filter( similarPlace =>\n {\n return similarPlace._id !== props.placeId\n })\n updatePlace({ similar: similarWithoutCurrent })\n });\n }, [languages[currentLanguage].name, country], 500);\n\n const setSuggestions = (suggestions: IPlace[]) => {\n updatePlace({ suggestions });\n };\n\n\n\n const handleNameChanged = (newName: string) => {\n updatePlaceLanguage(currentLanguage, {name: newName})\n }\n\n const handleCountryChanged = (value: string) => {\n updatePlace({ country: value });\n }\n\n const handleTypeChanged = (value: string) => {\n updatePlace({ type: value as PlaceType });\n }\n\n const handleAlternativeNamesChanged = (alternativeNames: string) => {\n updatePlace({ alternativeNames });\n }\n\n const handleSublocalityChanged = (sublocality: string) => {\n updatePlaceLanguage(currentLanguage, {'sublocality': sublocality})\n }\n\n const handleLocalityChanged = (locality: string) => {\n updatePlaceLanguage(currentLanguage, {'locality': locality})\n }\n\n const handleArea2Changed = (area2: string) => {\n updatePlaceLanguage(currentLanguage, {'administrative_area_level_2': area2})\n }\n\n const handleArea1Changed = (area1: string) => {\n updatePlaceLanguage(currentLanguage, {'administrative_area_level_1': area1})\n }\n\n const handleCopyToOtherLanguages = () => {\n setFormState( state => {\n let languages = state.languages\n const allLanguages = ['nl', 'fr', 'en', 'de']\n for (var index in allLanguages) {\n const language = allLanguages[index]\n languages[language] = state.languages[currentLanguage]\n }\n return Object.assign({}, state, {languages: languages});\n })\n NotificationManager.success(T('page.editPlace.notificatons.data.copied'));\n }\n\n const handleClickedGoogle = async () => {\n const result = await api.googleMapsAPI(languages[currentLanguage].name, country, Place.getPrimaryLanguage(country));\n let googleSuggestions: IPlace[] = []\n googleSuggestions = googleSuggestions.concat(result.match.map(suggestion => convertGoogleMatch(suggestion, undefined)))\n googleSuggestions = googleSuggestions.concat(result.suggestions.map(suggestion => convertGoogleMatch(suggestion, undefined)))\n setSuggestions(googleSuggestions);\n const noResults = googleSuggestions.length === 0;\n setGeolocationError(noResults ? T('page.editPlace.noResults') : undefined);\n };\n\n const handleClickedGeonames = async () => {\n const result = await api.geonamesAPI(languages[currentLanguage].name, country, Place.getPrimaryLanguage(country))\n if (result.match.length > 0) {\n setSuggestions(result.match);\n } else {\n setSuggestions(result.suggestions);\n }\n const noResults = result.suggestions.length === 0 && result.match.length === 0;\n setGeolocationError(noResults ? T('page.editPlace.noResults') : undefined);\n };\n\n const handleClickedSuggestion = async (suggestion: IPlace) => {\n try {\n const allLanguages = ['nl', 'fr', 'de', 'en']\n for (var index in allLanguages ) {\n let suggestion: IPlace | undefined = undefined\n let language = allLanguages[index];\n const result = await api.googleMapsAPI(languages[currentLanguage].name, country, language);\n if (result.match.length > 0)\n suggestion = convertGoogleMatch(result.match[0], language);\n else if (result.suggestions.length > 0)\n suggestion = convertGoogleMatch(result.suggestions[0], language);\n if (suggestion)\n loadMatchForLanguage(suggestion);\n }\n setFormState(state=> {\n return Object.assign({}, state, {resolutionStatus: ResolutionStatus.Found})\n })\n NotificationManager.success(T('page.editPlace.notificatons.google.names.loaded'));\n } catch (e) {\n NotificationManager.error(T('page.editPlace.notificatons.google.names.failed'));\n }\n };\n\n const convertGoogleMatch = (match: IPlaceSearchResultEntry, language: string | undefined ): IPlace => {\n const primaryLanguage = language || Place.getPrimaryLanguage(match.address.country_code);\n return {\n _id: 'google' + (googleMatchCounter[0]++),\n type: match.type,\n country_code: match.address.country_code,\n languages: {\n [primaryLanguage]: {\n name: match.name,\n sublocality: match.address.sublocality || null,\n locality: match.address.locality || null,\n administrative_area_level_2: match.address.administrative_area_level_2 || null,\n administrative_area_level_1: match.address.administrative_area_level_1 || null,\n country: match.address.country\n }\n },\n alternative_names: [],\n resolution_status: ResolutionStatus.Found,\n loc: { lat: match.location[0], lon: match.location[1] }\n };\n }\n\n const loadMatchForLanguage = (match: IPlace) => {\n setFormState(state => {\n let newLanguages = Object.assign({}, state.languages, match.languages )\n return ({\n resolutionStatus: state.resolutionStatus,\n country: state.country,\n type: state.type,\n alternativeNames: state.alternativeNames,\n location: MapMarkerInputValue.fromValue(toLatLng(match.loc)),\n languages: newLanguages,\n suggestions: [],\n similar\n })});\n };\n\n return (<>\n
\n
\n
\n {setCurrentLanguage(language.toString())}}/>\n
\n
\n
\n
\n \n \n \n \n {suggestions.length > 0 && \n
\n

{T('page.editPlace.suggestions')}

\n
    \n {suggestions.map(place => (\n
  • \n handleClickedSuggestion(place)}>\n {new Place(place).describe()}\n \n
  • \n ))}\n
\n \n }\n {similar.length > 0 && \n
\n

{T('page.editPlace.similar')}

\n
    \n {similar.map(place => (\n
  • \n {onClickedSimilar ? (\n onClickedSimilar(place)}>\n {new Place(place).describe()}\n \n ) : (\n \n {new Place(place).describe()}\n \n )}\n
  • \n ))}\n
\n \n }\n \n \n \n \n \n \n \n
\n
\n \n {T('page.editPlace.copy', {language: getLanguageStringForLanguage(currentLanguage)})}\n \n
\n
\n \n );\n}\n","import React, { useState } from 'react';\nimport { Modal, Button } from 'react-bootstrap';\nimport { ModalProps, useModal } from './BaseModal';\nimport { T } from '../Translate';\nimport {\n IPlace,\n PlaceType,\n IPlaceFields,\n ResolutionStatus,\n toLatLon,\n createEmptyLanguages\n} from '../models/Place';\nimport { ModalHeader } from './ModalHeader';\nimport { PlaceFormState, PlaceForm } from '../pages/EditPlace/PlaceForm';\nimport api from '../api';\nimport { NotificationManager } from 'react-notifications';\nimport { ButtonRowModalFooter } from '../components/ButtonRow';\nimport { MapMarkerInputValue } from '../components/inputs/MapMarkerInput';\n\ninterface CreatePlaceModalProps extends ModalProps {\n value: string;\n}\n\nexport const CreatePlaceModal = (props: CreatePlaceModalProps) => {\n const [isOpen, resolve] = useModal(props);\n\n /*** States ***/\n\n const [formState, setFormState] = useState({\n resolutionStatus: ResolutionStatus.Custom,\n alternativeNames:'',\n country: 'BE',\n type: PlaceType.Locality,\n languages: createEmptyLanguages(),\n suggestions: [],\n similar: [],\n location: MapMarkerInputValue.empty()\n });\n\n /*** Handlers ***/\n\n /**\n * Create Button handler\n */\n const handleClickedCreate = async () => {\n const {\n resolutionStatus,\n country,\n type,\n alternativeNames,\n location\n } = formState;\n\n const fields: IPlaceFields = {\n type,\n country_code: country,\n languages: formState.languages,\n alternative_names: alternativeNames.split(','),\n resolution_status: resolutionStatus,\n loc: toLatLon(location.lastValidPosition)\n };\n const result = await api.validatePlace(fields, 'create');\n if (result.status === 'NOK') {\n // errors... I don't see any validation requirements on server?\n return;\n }\n\n const place = await api.createPlace(fields);\n NotificationManager.success(T('page.editPlace.create.success'));\n resolve(place);\n };\n\n /**\n * Cancel Button handler\n */\n const handleClickedCancel = () => {\n resolve(undefined);\n };\n\n /**\n * Clicked a similar place\n * @param place\n */\n const handleClickedSimilar = (place: IPlace) => {\n resolve(place);\n };\n\n return (\n \n {T('modal.createplace.title')}\n \n \n \n \n \n \n \n \n );\n}\n","import React from 'react';\n\nimport { DocumentReference, DocumentReferenceType } from '../../models/DocumentReference';\nimport { T, TranslationKey } from \"../../Translate\";\nimport { Badge } from \"react-bootstrap\";\n\n\ninterface ReferenceInputCellProps {\n document: DocumentReference,\n documentType: DocumentReferenceType,\n currentValue: string,\n highlighted?: boolean, // when undefined, no highlight background colors are set\n renderName?: boolean // when undefined or false, no name will be shown\n}\n\nfunction renderName(document: DocumentReference) {\n return {document.name};\n}\n\nfunction renderDiedDate(document: DocumentReference) {\n let style = { marginLeft: 5 }\n const diedDate = document.info?.diedDate;\n if (diedDate && diedDate.year) {\n return (\n \n {' † ' + diedDate.day + '/' + diedDate.month + '/' + diedDate.year}\n \n )\n } else {\n return \n }\n}\n\nfunction renderServicerNumber(document: DocumentReference) {\n let style = { marginLeft: 5 }\n if (document.info?.serviceNumber) {\n return (\n \n {document.info?.serviceNumber}\n \n )\n } else {\n return \n }\n}\n\nconst ReferenceInputPersonCell = (props: ReferenceInputCellProps) => {\n const backgroundColor = props.highlighted === undefined ? undefined : props.highlighted === true ? 'lightgray' : 'white'\n return (\n
\n {(props.renderName === true || props.renderName === undefined) && renderName(props.document)}\n {renderServicerNumber(props.document)}\n {renderDiedDate(props.document)}\n
)\n}\n\nconst ReferenceInputOtherCell = (props: ReferenceInputCellProps) => {\n const backgroundColor = props.highlighted === undefined ? undefined : props.highlighted === true ? 'lightgray' : 'white'\n return (
\n {props.document.toString()}\n
)\n}\n\nexport const ReferenceInputCell = (props: ReferenceInputCellProps) => {\n const backgroundColor = props.highlighted === undefined ? undefined : props.highlighted === true ? 'lightgray' : 'white'\n if (props.document.id && props.documentType === DocumentReferenceType.Person) {\n return ;\n } else if (props.document.id) {\n return ;\n } else {\n return (\n
\n \n {T(`reference.create.${props.documentType}` as TranslationKey) + ' ' + props.currentValue}\n
\n );\n }\n}\n","import React, { useMemo } from 'react';\nimport { Form } from 'react-bootstrap';\nimport { SelectInput } from '../../components/inputs/SelectInput';\nimport {\n MilitaryEntityType,\n getMilitaryEntityTypeName,\n MilitaryEntityTypes,\n Armies\n} from '../../models/MilitaryEntity';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { T } from \"../../Translate\";\n\nexport interface MilitaryEntityFormState {\n type: MilitaryEntityType;\n regiment: string;\n regimentError?: string;\n unitNr: string;\n unitNrError?: string;\n unit: string;\n unitError?: string;\n brigade: string;\n brigadeError?: string;\n division: string;\n divisionError?: string;\n army: string;\n armyError?: string;\n}\n\ninterface MilitaryEntityFormProps {\n formState: MilitaryEntityFormState;\n setFormState: (state: MilitaryEntityFormState) => void;\n}\nexport const MilitaryEntityForm = (props: MilitaryEntityFormProps) => {\n const { formState, setFormState } = props;\n\n const {\n type,\n regiment,\n regimentError,\n unitNr,\n unitNrError,\n unit,\n unitError,\n brigade,\n brigadeError,\n division,\n divisionError,\n army,\n armyError,\n } = formState;\n\n const typeOptions = useMemo(() => MilitaryEntityTypes\n .map(type => ({ value: type, title: getMilitaryEntityTypeName(type) })), []);\n const armyOptions = useMemo(() => Armies.map(army => ({ value: army, title: army })), []);\n\n const updateFormState = (updates: Partial) => {\n setFormState(Object.assign({}, formState, updates));\n };\n\n const handleTypeChanged = (value: string) => {\n updateFormState({ type: value as MilitaryEntityType });\n };\n\n const handleRegimentChanged = (regiment: string) => {\n updateFormState({ regiment });\n };\n\n const handleUnitNrChanged = (unitNr: string) => {\n updateFormState({ unitNr });\n };\n\n const handleUnitChanged = (unit: string) => {\n updateFormState({ unit });\n };\n\n const handleBrigadeChanged = (brigade: string) => {\n updateFormState({ brigade });\n };\n\n const handleDivisionChanged = (division: string) => {\n updateFormState({ division });\n };\n\n const handleArmyChanged = (army: string) => {\n updateFormState({ army });\n };\n\n return (\n
\n \n {type === MilitaryEntityType.Division && (\n \n )}\n {type === MilitaryEntityType.Brigade && (\n \n )}\n {(type === MilitaryEntityType.Unit || type === MilitaryEntityType.Regiment) && (\n \n )}\n {type === MilitaryEntityType.Unit && (\n \n )}\n {type === MilitaryEntityType.Unit && (\n \n )}\n \n \n );\n}\n","import React, { useState } from 'react';\nimport { Modal, Button } from 'react-bootstrap';\nimport { ModalProps, useModal } from './BaseModal';\nimport { T } from '../Translate';\nimport { ModalHeader } from './ModalHeader';\nimport api from '../api';\nimport { IMilitaryEntity, MilitaryEntityType, IMilitaryEntityFields, Armies } from '../models/MilitaryEntity';\nimport { MilitaryEntityFormState, MilitaryEntityForm } from '../pages/EditMilitaryEntity/MilitaryEntityForm';\nimport { NotificationManager } from 'react-notifications';\nimport { getErrorDescription } from '../models/ValidationResult';\nimport { ButtonRowModalFooter } from '../components/ButtonRow';\n\ninterface CreateMilitaryEntityModalProps extends ModalProps {\n value: string;\n}\n\nexport const CreateMilitaryEntityModal = (props: CreateMilitaryEntityModalProps) => {\n const { value } = props;\n const [isOpen, resolve] = useModal(props);\n\n const [formState, setFormState] = useState({\n type: MilitaryEntityType.Regiment,\n regiment: value,\n regimentError: undefined,\n unitNr: '',\n unitNrError: undefined,\n unit: '',\n unitError: undefined,\n brigade: '',\n brigadeError: undefined,\n division: '',\n divisionError: undefined,\n army: Armies[0],\n armyError: undefined\n });\n\n const handleClickedSave = async () => {\n const {\n type,\n regiment,\n unitNr,\n unit,\n brigade,\n division,\n army\n } = formState;\n\n const fields: IMilitaryEntityFields = {\n type,\n army\n };\n switch (type) {\n case MilitaryEntityType.Brigade:\n fields.brigade = brigade;\n break;\n case MilitaryEntityType.Division:\n fields.division = division;\n break;\n case MilitaryEntityType.Unit:\n fields.unit_nr = unitNr;\n fields.unit = unit;\n fields.regiment = regiment;\n break;\n case MilitaryEntityType.Regiment:\n fields.regiment = regiment;\n break;\n }\n const result = await api.validateMilitaryEntity(fields, 'create');\n if (result.status === 'OK') {\n const entity = await api.createMilitaryEntity(fields);\n NotificationManager.success(T('page.militaryEntity.created'));\n resolve(entity);\n return;\n }\n\n const errors = result.data || {};\n setFormState(Object.assign({}, formState, {\n regimentError: getErrorDescription(errors.regiment),\n unitError: getErrorDescription(errors.unit),\n unitNrError: getErrorDescription(errors.unit_nr),\n brigadeError: getErrorDescription(errors.brigade),\n divisionError: getErrorDescription(errors.division),\n armyError: getErrorDescription(errors.army)\n }));\n };\n\n const handleClickedCancel = () => resolve(undefined);\n\n return (\n \n {T('modal.createplace.title')}\n \n \n \n \n \n \n \n \n );\n}\n","import React, { Fragment, useEffect, useState } from 'react';\nimport API from '../../api';\nimport { CreatePersonModal } from '../../modals/CreatePerson';\nimport { CreatePlaceModal } from '../../modals/CreatePlace';\nimport { DocumentReference, DocumentReferenceRelation, DocumentReferenceType } from '../../models/DocumentReference';\nimport { IPerson } from '../../models/Person';\nimport { IPlace } from '../../models/Place';\nimport { useElementID } from '../../utils/ElementID';\nimport { ReferenceInputCell } from './ReferenceInputCell';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { IMilitaryEntity, MilitaryEntity } from '../../models/MilitaryEntity';\nimport { CreateMilitaryEntityModal } from '../../modals/CreateMilitaryEntity';\nimport { AsyncTypeahead, Highlighter, TypeaheadMenuProps } from \"react-bootstrap-typeahead\";\nimport { T, getActiveLanguage } from \"../../Translate\";\n\ninterface ReferenceInputProps {\n placeHolder?: string\n type: DocumentReferenceType;\n onSelected: (value: DocumentReference) => void;\n}\n\nexport const ReferenceInput = (props: ReferenceInputProps) => {\n\n const { type, onSelected, placeHolder } = props;\n const modals = useModalContext();\n\n const [options, setOptions] = useState([]);\n const [value, setValue] = useState('');\n const [loadingCounter, setLoadingCounter] = useState(0)\n\n const isValidValue = value !== '' && !value.match(/^[0-9]+/);\n\n /** effects **/\n\n useEffect(() => {\n if (!isValidValue)\n setOptions([]);\n }, [isValidValue]);\n\n useEffect(() => {\n setOptions([]);\n }, [loadingCounter])\n\n\n const search = (query: string) => {\n if (query === '')\n return;\n\n // update state for loading indicator\n setLoadingCounter(loadingCounter => loadingCounter + 1)\n\n API.searchCollectionReferences(type, query)\n .then(references => {\n // When working with one of these DocumentReferenceType's, add the option\n // in front of the references to create a new entity\n if (type === DocumentReferenceType.Person\n || type === DocumentReferenceType.Place\n || type === DocumentReferenceType.MilityEntity) {\n references.splice(0, 0, DocumentReference.emptyWithName(''));\n }\n // fill the typeahead optoins\n setOptions(references);\n })\n .finally(() => {\n setLoadingCounter(loadingCounter => loadingCounter - 1)\n });\n }\n\n /** utils **/\n\n const showModalCreatePerson = () => {\n let creating = modals.show(props => (\n \n ));\n creating.then(person => {\n if (!person)\n return;\n\n onSelected(new DocumentReference(\n person._id,\n DocumentReferenceType.Person,\n person.surname + ' ' + person.familyname,\n DocumentReferenceRelation.None,\n ''\n ));\n });\n }\n\n const showModalCreateMilitaryEntity = () => {\n let creating = modals.show(props => (\n \n ));\n creating.then(entity => {\n if (!entity)\n return;\n\n onSelected(new DocumentReference(\n entity._id,\n DocumentReferenceType.MilityEntity,\n new MilitaryEntity(entity).name,\n DocumentReferenceRelation.None,\n ''\n ));\n });\n }\n\n const showModalCreatePlace = () => {\n let creating = modals.show(props => (\n \n ));\n creating.then(place => {\n if (!place)\n return;\n\n onSelected(new DocumentReference(\n place._id,\n DocumentReferenceType.Place,\n place.languages[getActiveLanguage()].name,\n DocumentReferenceRelation.None,\n ''\n ));\n });\n }\n\n /**\n * Will show a modal to create an element. The onSelected callback\n * will be called when the modal closes with OK button\n */\n const showModalCreate = () => {\n switch (type) {\n case DocumentReferenceType.Person: {\n showModalCreatePerson()\n break;\n }\n case DocumentReferenceType.Place: {\n showModalCreatePlace()\n break;\n }\n case DocumentReferenceType.MilityEntity:\n showModalCreateMilitaryEntity()\n break;\n\n case DocumentReferenceType.Project:\n case DocumentReferenceType.Memorial:\n // Not supported\n break;\n default:\n break;\n }\n }\n\n /*** handlers ***/\n\n const handleSelected = (item: DocumentReference) => {\n if (!item) {\n return\n }\n\n // if the empty element was selected\n if (item.isEmpty()) {\n showModalCreate()\n } else {\n onSelected(item);\n }\n\n setValue('');\n setOptions(value ? [DocumentReference.empty()] : []);\n }\n\n\n let typeAheadProps = {\n renderMenuItemChildren : (reference: DocumentReference, props: TypeaheadMenuProps, index: number) => {\n const search = reference.name\n return (\n \n \n {search}\n \n
\n \n
\n
\n )\n }\n };\n\n return (\n true}\n id={'typeahead-id-xxkjkdl'}\n options={options}\n labelKey='name'\n selected= {value === '' ? [] : []}\n placeholder={placeHolder || T('component.search.typeToSearch')}\n onSearch={search}\n onChange={(selected => {handleSelected(selected[0])})}\n isLoading={loadingCounter > 0}\n />\n )\n}\n\n\ninterface ReferenceInputGroupProps extends ReferenceInputProps {\n label: string;\n labelColumns?: number;\n}\nexport const ReferenceInputGroup = (props: ReferenceInputGroupProps) => {\n const { label, labelColumns = 4, ...otherProps } = props;\n\n const id = useElementID('referenceInput');\n return (\n
\n \n
\n \n
\n
\n );\n};\n","import React from 'react';\nimport { Form, Col, Row } from 'react-bootstrap';\nimport { getActiveLanguage } from '../../Translate';\nimport { DocumentReference, DocumentReferenceType } from '../../models/DocumentReference';\nimport { ReferenceInput } from '../../components/inputs/ReferenceTypeaheadInput';\nimport { DocumentTagFieldType, DocumentTagField } from '../../models/DocumentTagDefinition';\nimport { DocumentTagFieldValue } from '../../models/DocumentTag';\nimport { Icon } from '../../components/Icons';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { ButtonLink } from '../../components/ButtonLink';\nimport PageLink from '../../components/PageLink';\n\ninterface ReferenceInputProps {\n name: string;\n label: string;\n type: DocumentReferenceType;\n value: DocumentReference|null;\n onChange: (value: DocumentReference|null) => void;\n readOnly?: boolean;\n labelColumns?: number;\n}\nexport const ReferenceInputField = (props: ReferenceInputProps) => {\n const { label, type, value, onChange, readOnly, labelColumns = 3 } = props;\n const handleSelected = (item: DocumentReference) => onChange(item);\n const handleClickedRemove = () => onChange(null);\n\n const item = value || DocumentReference.empty();\n const link = item.getLink();\n return (\n \n \n
\n {!item.isEmpty() ? (\n \n \n {item.name}\n {!readOnly && (\n \n \n \n )}\n \n ) : (\n !readOnly && \n )}\n \n \n );\n}\n\ninterface TagFieldProps {\n tag: string;\n field: DocumentTagField;\n value: DocumentTagFieldValue|null;\n readOnly: boolean;\n onChange: (value: DocumentTagFieldValue) => void;\n}\nexport const TagField = (props: TagFieldProps) => {\n const { field, value, onChange, readOnly } = props;\n const label = field.translations[getActiveLanguage()];\n\n switch (field.type) {\n case DocumentTagFieldType.String:\n return (\n \n );\n\n case DocumentTagFieldType.Text:\n return (\n \n );\n\n case DocumentTagFieldType.Person:\n return (\n \n );\n\n case DocumentTagFieldType.Place:\n return (\n \n );\n\n case DocumentTagFieldType.MilitaryEntity:\n return (\n \n );\n\n default:\n return
;\n }\n};\n","import React, { useState, useEffect } from 'react';\nimport { Button, Form, Col, Row } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport API from '../../api';\nimport { DocumentCollection, DocumentCollectionType, DocumentCollectionStatus } from '../../models/Collection';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { History } from 'history';\nimport { SelectInput } from '../../components/inputs/SelectInput';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { DocumentReferenceType, DocumentReference, DocumentReferenceRelation } from '../../models/DocumentReference';\nimport { IPerson } from '../../models/Person';\nimport api from '../../api';\nimport { ReferenceInputField } from '../EditCollectionDocument/TagField';\nimport { useModalContext } from '../../modals/ModalContext';\n\nfunction getPersonReference(person: IPerson): DocumentReference {\n return new DocumentReference(\n person._id,\n DocumentReferenceType.Person,\n person.surname + ' ' + person.familyname,\n DocumentReferenceRelation.None,\n ''\n );\n}\n\ninterface CollectionEditorProps {\n collection: DocumentCollection;\n history: History;\n onSave: (collection: DocumentCollection) => void;\n onCancel: () => void;\n}\nexport const CollectionEditor = (props: CollectionEditorProps) => {\n const { collection, history, onSave, onCancel } = props;\n const modals = useModalContext();\n\n const [type, setType] = useState(DocumentCollectionType.Box);\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n const [status, setStatus] = useState(DocumentCollectionStatus.Todo);\n const [adlibId, setAdlibId] = useState('');\n const [adlibCode, setAdlibCode] = useState('');\n const [person, setPerson] = useState(null);\n\n useEffect(() => {\n setType(collection.type);\n setTitle(collection.title);\n setDescription(collection.description);\n setStatus(collection.status);\n setAdlibId(collection.adlibId);\n setAdlibCode(collection.adlibCode);\n setPerson(collection.person ? getPersonReference(collection.person) : null);\n }, [collection]);\n\n const handleTypeChanged = (v: string) => setType(v as DocumentCollectionType);\n const handleStatusChanged = (v: string) => setStatus(v as DocumentCollectionStatus);\n\n const handleClickedSave = async () => {\n const personObject = person && person.id ? await api.getPerson(person.id) : undefined;\n collection.type = type;\n collection.title = title;\n collection.description = description;\n collection.status = status;\n collection.adlibId = adlibId;\n collection.adlibCode = adlibCode;\n collection.person = personObject || null;\n onSave(collection);\n };\n\n const handleClickedRemove = async () => {\n const result = await modals.show(props => (\n \n ));\n if (!result)\n return;\n\n await API.removeCollection(collection.id || '');\n history.push('/collections');\n };\n\n const handlePersonSelected = (value: DocumentReference|null) => {\n setPerson(value);\n };\n\n const handleClickedCancel = () => onCancel();\n\n const hasChanged =\n collection.type !== type\n || collection.title !== title\n || collection.description !== description\n || collection.status !== status\n || collection.adlibId !== adlibId\n || collection.adlibCode !== adlibCode\n || (collection.person && collection.person._id) !== (person ? person.id : undefined);\n\n return (\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n {T('collection.save')}\n \n \n \n \n \n );\n}\n","import React, { useMemo } from 'react';\nimport { Col, Row, Card } from 'react-bootstrap';\nimport { T, singular } from '../../Translate';\nimport API from '../../api';\nimport { DocumentCollection } from '../../models/Collection';\nimport { PageProps, Page } from '../Page';\nimport { CollectionEditor } from '../EditCollection/CollectionEditor';\nimport { Icon } from '../../components/Icons';\nimport { PageID } from '../../utils/PageLinking';\n\nexport default (props: PageProps) => {\n const { history, loading, via } = props;\n\n const collection = useMemo(() => DocumentCollection.empty(), []);\n\n const handleSave = async (collection: DocumentCollection) => {\n const saved = await loading.saving(API.createCollection(collection), singular('collection'));\n history.push('/collections/' + saved.id);\n };\n const handleCancel = () => history.push('/collections');\n\n return (\n \n \n \n \n \n {T('page.collection.create.title')}\n \n \n \n \n \n \n \n \n );\n}\n","import React from 'react';\nimport { Col, Row, Card } from 'react-bootstrap';\nimport { T, singular } from '../../Translate';\nimport API from '../../api';\nimport { DocumentCollection } from '../../models/Collection';\nimport { PageProps, Page } from '../Page';\nimport { CollectionEditor } from './CollectionEditor';\nimport { Icon } from '../../components/Icons';\nimport { useDocumentCollection } from '../../FunctionalAPI';\nimport { PageID } from '../../utils/PageLinking';\n\ninterface EditCollectionPageProps extends PageProps {\n id: string;\n}\n\nexport default (props: EditCollectionPageProps) => {\n const { id, history, loading, via } = props;\n const [collection,,setCollection] = useDocumentCollection(loading, id);\n\n const handleSave = async (collection: DocumentCollection) => {\n const saved = await loading.saving(\n API.updateCollection(collection),\n singular('collection')\n );\n setCollection(saved);\n };\n\n const handleCancel = () => history.push('/collections');\n\n return (\n \n \n \n \n \n {T('page.collection.edit.title')}\n \n \n \n \n \n \n \n \n );\n}\n","export default __webpack_public_path__ + \"static/media/audio.2b2b34eb.png\";","export default __webpack_public_path__ + \"static/media/binary.e16709a0.png\";","export default __webpack_public_path__ + \"static/media/compressed.82616a1d.png\";","export default __webpack_public_path__ + \"static/media/html.1e1cc118.png\";","export default __webpack_public_path__ + \"static/media/image.09d7af5f.png\";","export default __webpack_public_path__ + \"static/media/video.e9b9cee8.png\";","export default __webpack_public_path__ + \"static/media/word.da417892.png\";","import audioIcon from '../assets/images/mimetypes/128/audio.png';\nimport binaryIcon from '../assets/images/mimetypes/128/binary.png';\nimport compressedIcon from '../assets/images/mimetypes/128/compressed.png';\nimport csvIcon from '../assets/images/mimetypes/128/csv.png';\nimport emptyIcon from '../assets/images/mimetypes/128/empty.png';\nimport excelIcon from '../assets/images/mimetypes/128/excel.png';\nimport htmlIcon from '../assets/images/mimetypes/128/html.png';\nimport imageIcon from '../assets/images/mimetypes/128/image.png';\nimport pdfIcon from '../assets/images/mimetypes/128/pdf.png';\nimport powerpointIcon from '../assets/images/mimetypes/128/powerpoint.png';\nimport svgIcon from '../assets/images/mimetypes/128/svg.png';\nimport textIcon from '../assets/images/mimetypes/128/text.png';\nimport unknownIcon from '../assets/images/mimetypes/128/unknown.png';\nimport videoIcon from '../assets/images/mimetypes/128/video.png';\nimport wordIcon from '../assets/images/mimetypes/128/word.png';\n\nimport audioIconTiny from '../assets/images/mimetypes/32/audio.png';\nimport binaryIconTiny from '../assets/images/mimetypes/32/binary.png';\nimport compressedIconTiny from '../assets/images/mimetypes/32/compressed.png';\nimport csvIconTiny from '../assets/images/mimetypes/32/csv.png';\nimport emptyIconTiny from '../assets/images/mimetypes/32/empty.png';\nimport excelIconTiny from '../assets/images/mimetypes/32/excel.png';\nimport htmlIconTiny from '../assets/images/mimetypes/32/html.png';\nimport imageIconTiny from '../assets/images/mimetypes/32/image.png';\nimport pdfIconTiny from '../assets/images/mimetypes/32/pdf.png';\nimport powerpointIconTiny from '../assets/images/mimetypes/32/powerpoint.png';\nimport svgIconTiny from '../assets/images/mimetypes/32/svg.png';\nimport textIconTiny from '../assets/images/mimetypes/32/text.png';\nimport unknownIconTiny from '../assets/images/mimetypes/32/unknown.png';\nimport videoIconTiny from '../assets/images/mimetypes/32/video.png';\nimport wordIconTiny from '../assets/images/mimetypes/32/word.png';\n\n// only contains mimetypes known to us\nexport enum FileType {\n PDF,\n Word,\n Excel,\n PowerPoint,\n Compressed,\n Audio,\n Empty,\n Image,\n ImageSVG,\n Video,\n CSV,\n HTML,\n Text,\n Unknown,\n Binary,\n}\n\nconst extensions: {[extension: string]: FileType} = {\n 'pdf': FileType.PDF,\n 'doc': FileType.Word,\n 'docx': FileType.Word,\n 'ppt': FileType.PowerPoint,\n 'pptx': FileType.PowerPoint,\n 'zip': FileType.Compressed,\n '7z': FileType.Compressed,\n 'rar': FileType.Compressed,\n 'tar': FileType.Compressed,\n 'gz': FileType.Compressed,\n 'tgz': FileType.Compressed,\n 'mp3': FileType.Audio,\n 'wav': FileType.Audio,\n 'ogg': FileType.Audio,\n 'jpg': FileType.Image,\n 'png': FileType.Image,\n 'jpeg': FileType.Image,\n 'tif': FileType.Image,\n 'tiff': FileType.Image,\n 'svg': FileType.ImageSVG,\n 'mp4': FileType.Video,\n 'csv': FileType.CSV,\n 'tsv': FileType.CSV,\n 'html': FileType.HTML,\n 'htm': FileType.HTML,\n 'txt': FileType.Text,\n 'dat': FileType.Binary\n}\n\nexport function isImageType(filetype: FileType) {\n return filetype === FileType.Image || filetype === FileType.ImageSVG;\n}\n\nconst mimetypes: {[mimetype: string]: FileType} = {\n 'application/pdf': FileType.PDF,\n 'application/msword': FileType.Word,\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': FileType.Word,\n 'application/vnd.ms-powerpoint': FileType.PowerPoint,\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': FileType.PowerPoint,\n 'application/zip': FileType.Compressed,\n 'application/x-7z-compressed': FileType.Compressed,\n 'application/vnd.rar': FileType.Compressed,\n 'application/x-tar': FileType.Compressed,\n 'application/gzip': FileType.Compressed,\n 'image/svg+xml': FileType.ImageSVG,\n 'text/csv': FileType.CSV,\n 'text/html': FileType.HTML,\n 'text/plain': FileType.Text,\n 'application/octet-stream': FileType.Binary\n}\n\nexport function guessFileType(filename: string): FileType {\n const dot = filename.lastIndexOf('.');\n if (dot < 0)\n return FileType.Empty;\n\n const extension = filename.substring(dot + 1).toLocaleLowerCase();\n const type = extensions[extension];\n return type === undefined ? FileType.Unknown : type;\n}\n\nexport function getFileTypeFromMimeType(mimetype: string | undefined): FileType {\n if (!mimetype) {\n return FileType.Unknown\n }\n\n const knownType = mimetypes[mimetype];\n if (knownType !== undefined)\n return knownType;\n\n if (mimetype.startsWith('image/'))\n return FileType.Image;\n else if (mimetype.startsWith('audio/'))\n return FileType.Audio;\n else if (mimetype.startsWith('video/'))\n return FileType.Video;\n else\n return FileType.Unknown;\n}\n\nexport function getLargeIcon(type: FileType): string {\n switch (type) {\n case FileType.PDF:\n return pdfIcon;\n case FileType.Word:\n return wordIcon;\n case FileType.Excel:\n return excelIcon;\n case FileType.PowerPoint:\n return powerpointIcon;\n case FileType.Compressed:\n return compressedIcon;\n case FileType.Audio:\n return audioIcon;\n case FileType.Empty:\n return emptyIcon;\n case FileType.Image:\n return imageIcon;\n case FileType.ImageSVG:\n return svgIcon;\n case FileType.CSV:\n return csvIcon;\n case FileType.HTML:\n return htmlIcon;\n case FileType.Text:\n return textIcon;\n case FileType.Binary:\n return binaryIcon;\n case FileType.Video:\n return videoIcon;\n case FileType.Unknown:\n default:\n return unknownIcon;\n }\n}\n\nexport function getTinyIcon(type: FileType): string {\n switch (type) {\n case FileType.PDF:\n return pdfIconTiny;\n case FileType.Word:\n return wordIconTiny;\n case FileType.Excel:\n return excelIconTiny;\n case FileType.PowerPoint:\n return powerpointIconTiny;\n case FileType.Compressed:\n return compressedIconTiny;\n case FileType.Audio:\n return audioIconTiny;\n case FileType.Empty:\n return emptyIconTiny;\n case FileType.Image:\n return imageIconTiny;\n case FileType.ImageSVG:\n return svgIconTiny;\n case FileType.CSV:\n return csvIconTiny;\n case FileType.HTML:\n return htmlIconTiny;\n case FileType.Text:\n return textIconTiny;\n case FileType.Binary:\n return binaryIconTiny;\n case FileType.Video:\n return videoIconTiny;\n case FileType.Unknown:\n default:\n return unknownIconTiny;\n }\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React, { ReactNode } from 'react';\nimport styles from './DocumentElementPreview.module.scss';\nimport { Colors, TextStyles } from \"../../config/styles\";\n\n\ninterface DocumentElementPreviewErrorHeaderProps {\n children: ReactNode\n}\nexport const DocumentElementPreviewErrorHeaderView = (props: DocumentElementPreviewErrorHeaderProps) => {\n return (\n
\n {props.children}\n
)\n};\n\n\n","import React from 'react';\nimport { IDocumentElement, IDocumentSubdocument, IDocumentPage } from '../../models/Document';\nimport styles from './DocumentElementPreview.module.scss';\nimport { Icon } from '../../components/Icons';\nimport { classes } from '../../utils/Styles';\nimport { getLargeIcon, getFileTypeFromMimeType } from '../../utils/MimeTypes';\nimport { T } from '../../Translate';\nimport { Colors, TextStyles } from \"../../config/styles\";\nimport { Badge } from \"react-bootstrap\";\nimport { IndexedList } from \"../../models/IndexedList\";\nimport { DocumentTagDefinition } from \"../../models/DocumentTagDefinition\";\nimport { getTagName } from '../../models/DocumentTag';\nimport { DocumentElementPreviewErrorHeaderView } from \"./DocumentElementPreviewErrorHeader\";\n\nfunction getPages(element: IDocumentSubdocument): IDocumentPage[] {\n if (element.document === undefined)\n return [];\n\n return element.document.elements.filter(e => e.type === 'page') as IDocumentPage[];\n}\n\ninterface DocumentElementPreviewProps {\n index: number;\n element: IDocumentElement;\n selected: boolean;\n readOnly: boolean;\n onClick: () => void;\n onSelected: (selected: boolean) => void;\n onPreview?: (selected: IDocumentPage) => void;\n showTitle?: boolean\n tagDefinitions?: IndexedList\n}\n\nexport const DocumentElementPreview = (props: DocumentElementPreviewProps) => {\n const {\n index,\n element,\n selected,\n readOnly,\n onClick,\n onSelected,\n onPreview,\n showTitle,\n tagDefinitions\n } = props;\n\n const badgeContent = (): string => {\n if (element.type === 'page') {\n return (index + 1).toString()\n } else {\n if (tagDefinitions && element.document && element.document.tags.length > 0) {\n return getTagName(element.document.tags[0], tagDefinitions)\n }\n }\n return T('document.no.tags')\n }\n\n return (\n <>\n
\n {/*page background*/}\n
\n {/*content of the page */}\n {/*
*/}\n {element.type === 'page' && }\n {element.type === 'subdocument' && }\n {!readOnly && (\n {\n e.stopPropagation(); // otherwise will act as a click on the page\n onSelected(!selected);\n }}\n >\n \n \n \n )}\n {/*
*/}\n
\n { showTitle &&\n
\n \n {badgeContent()}\n \n
}\n
\n \n );\n};\n\ninterface PagePreviewProps {\n page: IDocumentPage;\n onPreview?: (selected: IDocumentPage) => void;\n}\nconst PageElementPreview = (props: PagePreviewProps) => {\n const { page, onPreview } = props;\n\n\n const onClickedExpand = (e: React.SyntheticEvent) => {\n e.stopPropagation();\n if (onPreview) {\n onPreview(page)\n }\n }\n\n const errorMessage = (): string | undefined => {\n if (!page.url_resized && !page.mimetype) {\n return `Error: No URL or Mimetype`\n } else {\n return undefined\n }\n }\n\n return <>\n
\n {errorMessage() &&\n \n Error: No URL or Mimetype\n \n }\n { e.stopPropagation(); e.preventDefault(); }}\n onMouseDown={e => { e.stopPropagation(); e.preventDefault(); }}\n className={styles.nodrag}\n draggable={false}\n />\n \n {page.tags.length > 0 && (\n \n \n \n {page.tags.length}\n \n )}\n {page.transcription && (\n \n \n \n \n \n )}\n\n \n
\n {page.mimetype && (\n \n \n \n )}\n
\n
\n ;\n}\n\ninterface SubdocumentPreviewProps {\n subdocument: IDocumentSubdocument;\n}\nconst SubdocumentElementPreview = (props: SubdocumentPreviewProps) => {\n const { subdocument } = props;\n const pages = getPages(subdocument);\n const numberOfPages= pages.length\n if (numberOfPages === 0) {\n return (\n <>\n
\n {T('document.subdocument.empty.part1')}\n {T('document.subdocument.empty.part2')}\n
\n \n )\n } else {\n const showPages = pages.slice(0, 3)\n return (\n <>\n
\n {showPages.map((element, index) => {\n return (\n
\n {\n e.stopPropagation();\n e.preventDefault();\n }}\n onMouseDown={e => {\n e.stopPropagation();\n e.preventDefault();\n }}\n className={styles.nodrag}\n draggable={false}\n />\n
)\n })}\n {numberOfPages > 3 &&\n
\n +{numberOfPages - 3}\n
\n }\n
\n \n );\n }\n}\n","import React from 'react';\nimport { ModalProps, useModal } from './BaseModal';\nimport { T } from '../Translate';\nimport { Button, Modal } from 'react-bootstrap';\nimport { ButtonRowModalFooter } from '../components/ButtonRow';\nimport { ModalHeader } from './ModalHeader';\n\ninterface NotificationModalProps extends ModalProps {\n title: string;\n message: string;\n okText?: string;\n}\n\nexport const NotificationModal = (props: NotificationModalProps) => {\n const { title, message, okText } = props;\n const [isOpen, resolve] = useModal(props);\n const handleClose = () => resolve();\n\n return (\n \n {title}\n \n

{message}

\n
\n \n \n \n
\n );\n}\n","import React from 'react';\nimport { ModalProps } from './BaseModal';\nimport { T } from '../Translate';\nimport { NotificationModal } from './NotificationModal';\n\nexport const UnsavedChangesModal = (props: ModalProps) => {\n return (\n \n );\n}\n","import React, { CSSProperties, useState } from 'react';\nimport $ from 'jquery';\nimport 'blueimp-file-upload';\nimport { T } from '../Translate';\nimport { IAttachment } from '../models/Attachment';\nimport api from '../api';\nimport { ProgressBar } from 'react-bootstrap';\n\nimport styles from './FileUploader.module.scss';\nimport { Icon } from './Icons';\nimport { classes } from '../utils/Styles';\nimport { IDocument } from '../models/Document';\nimport { IDocumentTag } from '../models/DocumentTag';\nimport { IDocumentReference } from '../models/DocumentReference';\n\n/**\n * Initializes the upload component.\n *\n * The upload component should be a piece of HTML with this structure: (for example)\n * \n * Add Files\n * \n * \n *\n * params: {\n * formData: { data to be sent with the upload },\n * start: function(data) to be called upon upload start,\n * progress: function(data) to be called upon upload progress,\n * success: function(data) to be called upon successful completion,\n * fail: function(data) to be called upon upload failure,\n * finish: function(data) to be called upon finish no matter the status\n * }\n *\n * @param target target element\n * @param params upload parameters\n */\n\n($ as any).widget('blueimp.fileupload', ($ as any).blueimp.fileupload, {\n processActions: {\n validate: function (data: any, options: any) {\n if (options.disabled)\n return data;\n\n var dfd = $.Deferred();\n var file = data.files[data.index];\n\n if (!options.acceptFileTypes.test(file.type)) {\n file.error = 'Invalid file type.';\n dfd.rejectWith(this, [data]);\n }\n else {\n dfd.resolveWith(this, [data]);\n }\n return dfd.promise();\n }\n }\n});\n\n\nexport interface FileUploadParams {\n token: string;\n _id?: string;\n collection?: string;\n position?: string;\n}\ninterface FileUploaderComponentProps {\n url: string;\n data: any;\n\n error?: string;\n prompt?: string;\n\n style?: CSSProperties;\n onStart?: (e: unknown) => void;\n onProgress?: (e: unknown) => void;\n onSuccess?: (e: unknown) => void;\n onFail?: (e: unknown) => void;\n onFinish?: (e: unknown) => void;\n disabled?: boolean;\n}\nexport class FileUploaderComponent extends React.PureComponent {\n ref: React.RefObject;\n\n constructor(props: FileUploaderComponentProps) {\n super(props);\n\n this.ref = React.createRef();\n }\n\n componentDidMount() {\n const target = this.ref.current;\n if (target)\n this.initUpload(target);\n }\n\n componentDidUpdate(oldProps: FileUploaderComponentProps) {\n if (oldProps.disabled !== this.props.disabled) {\n this.ref.current && ($(this.ref.current) as any).fileupload(this.props.disabled ? 'disable' : 'enabled');\n }\n }\n\n initUpload(target: HTMLInputElement) {\n const {\n url,\n data,\n\n onStart,\n onProgress,\n onSuccess,\n onFail,\n onFinish\n } = this.props;\n\n ($(target) as any).fileupload({\n url,\n dataType: 'json',\n paramName: 'file',\n formData: data,\n submit: function (e: any, data: any) {\n var $this = $(this) as any;\n api.getAuthenticatedUser().then(() => {\n data.jqXHR = $this.fileupload('send', data);\n });\n return false;\n }, \n progress: (e: any, data: any) => {\n onProgress && onProgress(data);\n }\n });\n\n //Bind upload event callbacks\n $(target)\n .bind('fileuploaddone', function (e, data) {\n onSuccess && onSuccess(data);\n })\n .bind('fileuploadsend', function (e, data) {\n onStart && onStart(data);\n })\n .bind('fileuploadalways', function (e, data) {\n onFinish && onFinish(data);\n })\n .bind('fileuploadfail', function (e, data) {\n onFail && onFail(data);\n });\n }\n\n render() {\n const { style, prompt } = this.props;\n return (\n
\n \n {prompt || T('component.fileUploader.addFiles')}\n \n
\n );\n }\n}\n\ninterface FileUploaderProps {\n url: string;\n data: any;\n style?: CSSProperties;\n prompt?: string;\n buttonStyle?: CSSProperties;\n onSaved: (result: any) => void;\n}\nexport const FileUploader = (props: FileUploaderProps) => {\n const {\n url,\n data,\n style,\n buttonStyle,\n prompt,\n onSaved\n } = props;\n const [uploading, setUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n const [failed, setFailed] = useState(false);\n const handleStart = () => {\n setUploading(true);\n setFailed(false);\n };\n const handleProgress = (e: any) => {\n setProgress(e.loaded / e.total * 100);\n };\n const handleSuccess = (e: any) => {\n setUploading(false);\n onSaved(e.result);\n };\n const handleFail = () => {\n setUploading(false);\n setFailed(true);\n };\n\n return (\n
\n \n {uploading &&
\n \n \n {T('component.fileUploader.uploading') + ': ' + progress.toFixed(0) + '%'}\n \n
}\n
\n );\n}\n\ninterface AttachmentFileUploaderProps {\n collectionId?: string;\n collection?: string;\n position?: string;\n style?: CSSProperties;\n prompt?: string;\n buttonStyle?: CSSProperties;\n onSaved: (attachment: IAttachment[]|'NOK') => void;\n}\nexport const AttachmentFileUploader = (props: AttachmentFileUploaderProps) => {\n const {\n collectionId,\n collection,\n position,\n style,\n prompt,\n buttonStyle,\n onSaved\n } = props;\n\n const data = {\n _id: collectionId,\n collection,\n position\n } as any;\n if (api.token)\n data.token = api.token;\n \n return (\n \n );\n}\n\ninterface PageFileUploaderProps {\n documentId: string;\n documentElement: number;\n feedbackSession?: string;\n style?: CSSProperties;\n prompt?: string;\n buttonStyle?: CSSProperties;\n onSaved: (document: IDocument|'NOK') => void;\n}\nexport const PageFileUploader = (props: PageFileUploaderProps) => {\n const {\n documentId,\n documentElement,\n feedbackSession,\n style,\n prompt,\n buttonStyle,\n onSaved\n } = props;\n\n const data = {\n document_id: documentId,\n document_element: documentElement,\n feedback_session: feedbackSession\n } as any;\n if (api.token)\n data.token = api.token;\n\n return (\n \n );\n}\n\ninterface DocumentFileUploaderProps {\n tags: IDocumentTag[];\n references?: IDocumentReference[];\n feedbackSession?: string;\n style?: CSSProperties;\n prompt?: string;\n buttonStyle?: CSSProperties;\n onSaved: (document: IDocument|'NOK') => void;\n}\nexport const DocumentFileUploader = (props: DocumentFileUploaderProps) => {\n const {\n tags,\n references,\n feedbackSession,\n style,\n prompt,\n buttonStyle,\n onSaved\n } = props;\n\n const data = {\n token: api.token,\n tags: JSON.stringify(tags),\n references: references && JSON.stringify(references),\n feedback_session: feedbackSession\n };\n\n return (\n \n );\n}\n","import React, { ReactNode } from 'react';\nimport styles from './CenteredPane.module.scss';\n\ninterface CenteredPaneProps {\n children: ReactNode;\n}\nexport const CenteredPane = (props: CenteredPaneProps) => {\n const { children } = props;\n return (\n
\n {children}\n
\n );\n}\n","import { DocumentKind, Document, DocumentStatus } from \"../../models/Document\";\nimport { DocumentTag } from \"../../models/DocumentTag\";\nimport { DocumentReference } from \"../../models/DocumentReference\";\n\nexport interface IDocumentFormState {\n kind: DocumentKind;\n status: DocumentStatus;\n title: string;\n description: string;\n source: string;\n institution: string;\n inventoryId: string;\n url: string;\n wiseProfile: string;\n wiseBranch: string;\n wiseLocation: string;\n wiseId: string;\n pages: string;\n disclosed: boolean;\n tags: DocumentTag[];\n references: DocumentReference[];\n titleError?: string\n urlError?: string\n}\n\nexport function getFormStateForDocument(document: Document): IDocumentFormState {\n return {\n kind: document.kind,\n source: document.source || '',\n title: document.title || '',\n description: (document.collection && document.collection.description) || document.description || '',\n institution: document.institution || '',\n inventoryId: document.inventoryId || '',\n url: document.url || '',\n wiseProfile: document.wiseProfile || 'ieper',\n wiseBranch: document.wiseBranch || '',\n wiseLocation: document.wiseLocation || '',\n wiseId: document.wiseId || '',\n pages: document.pages || '',\n status: document.status,\n disclosed: document.disclosed,\n tags: document.tags,\n references: document.references,\n titleError: '',\n urlError: ''\n };\n}\n\nexport function didFormStateChange(\n original: IDocumentFormState,\n changed: IDocumentFormState\n) {\n return original.kind !== changed.kind\n || original.source !== changed.source\n || original.title !== changed.title\n || original.description !== changed.description\n || original.institution !== changed.institution\n || original.inventoryId !== changed.inventoryId\n || original.url !== changed.url\n || original.wiseProfile !== changed.wiseProfile\n || original.wiseBranch !== changed.wiseBranch\n || original.wiseLocation !== changed.wiseLocation\n || original.wiseId !== changed.wiseId\n || original.pages !== changed.pages\n || original.status !== changed.status\n || original.disclosed !== changed.disclosed;\n}\n","import React, { ReactNode } from 'react';\nimport { Icon } from './Icons';\nimport { Card } from 'react-bootstrap';\n\ninterface CardHeaderProps {\n icon: Icon;\n title: string;\n buttons?: ReactNode;\n children?: ReactNode\n}\nexport const CardHeader = (props: CardHeaderProps) => {\n const { icon, title, buttons, children } = props;\n return (\n \n {buttons &&
{buttons}
}\n

\n {' '}\n {title}\n

\n {children}\n
\n );\n}\n","import React, {CSSProperties, ReactNode} from 'react';\nimport {Icon} from './Icons';\nimport {classes} from '../utils/Styles';\nimport {Card} from 'react-bootstrap';\nimport {isChildrenEmpty} from '../utils/ReactUtils';\nimport {CardHeader} from './CardHeader';\n\n\ninterface FormCardProps {\n icon: Icon;\n title: string;\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n buttons?: ReactNode;\n}\n\nexport const FormCard = (props: FormCardProps) => {\n const {icon, title, className, style, children, buttons} = props;\n const empty = isChildrenEmpty(children);\n const bodyStyle: CSSProperties | undefined = empty ? {paddingTop: 5} : undefined;\n\n return (\n \n \n \n {children}\n \n \n )\n};\n","import { ReactNode } from \"react\";\n\nexport function isChildrenEmpty(node: ReactNode) {\n if (node === null || node === false)\n return true;\n if (Array.isArray(node))\n return !node.some(x => x !== null && x !== false);\n \n return false;\n}\n","import React, { CSSProperties, useCallback } from 'react';\nimport { useElementID } from '../../utils/ElementID';\nimport styles from './CheckboxInput.module.scss';\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface CheckboxInputProps {\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n value: boolean;\n error?: string;\n readOnly?: boolean;\n validated?: boolean;\n placeholder?: string;\n style?: CSSProperties;\n\n onChange?: (checked: boolean) => void;\n}\n\nexport const CheckboxInput = (props: CheckboxInputProps) => {\n const {\n labelColumns = 4,\n inputColumns,\n label,\n value,\n error,\n readOnly,\n validated,\n style,\n onChange,\n } = props;\n\n const id = useElementID('input');\n const inputClass = error ? 'form-check-input is-invalid' : (validated ? 'form-check-input is-valid' : 'form-check-input');\n return (\n
\n \n
\n \n {error && }\n
\n
\n );\n};\n\ninterface CheckboxProps {\n id: string;\n readOnly?: boolean;\n value: boolean;\n onChange?: (checked: boolean) => void;\n inputClass?: string;\n}\n\nexport const Checkbox = (props: CheckboxProps) => {\n const {\n id,\n readOnly,\n value,\n onChange,\n inputClass = 'form-check-input'\n } = props;\n\n return (\n
\n \n
\n );\n}\n","import React from 'react';\nimport { Button } from 'react-bootstrap';\nimport { Icon } from './Icons';\nimport styles from './EditModeButton.module.scss';\nimport { classes } from '../utils/Styles';\n\ninterface EditModeButtonProps {\n inverted: boolean;\n disabled: boolean;\n onClick: () => void;\n}\nexport const EditModeButton = (props: EditModeButtonProps) => {\n const { inverted, disabled, onClick } = props;\n return (\n \n );\n}\n","import React, { useCallback } from 'react';\nimport { DocumentReference } from '../../models/DocumentReference';\nimport { Icon } from '../../components/Icons';\nimport { ButtonLink } from '../../components/ButtonLink';\nimport PageLink from '../../components/PageLink';\nimport { TextStyles } from \"../../config/styles\";\n\ninterface ReferenceViewProps {\n item: DocumentReference;\n onClickedRemove: (item: DocumentReference) => void;\n readOnly: boolean;\n}\nexport const ReferenceView = (props: ReferenceViewProps) => {\n const { item, onClickedRemove, readOnly } = props;\n const handleClickedRemove = useCallback(\n () => onClickedRemove(item),\n [onClickedRemove, item]\n );\n const link = item.getLink();\n\n return (\n
\n \n {item.name}\n {!readOnly && (\n \n \n \n )}\n
\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { DocumentReference, DocumentReferenceType } from '../../models/DocumentReference';\nimport { ReferenceView } from './ReferenceView';\nimport { Form, Row, Col, Alert } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { ReferenceInput } from '../../components/inputs/ReferenceTypeaheadInput';\nimport { NotificationManager } from 'react-notifications';\nimport { TextStyles } from \"../../config/styles\";\n\ninterface DocumentReferencesProps {\n references: DocumentReference[];\n setReferences: (references: DocumentReference[]) => void;\n readOnly: boolean;\n}\nexport const DocumentReferences = (props: DocumentReferencesProps) => {\n const { references, setReferences, readOnly } = props;\n\n const [addingReferenceType, setAddingReferenceType] = useState(DocumentReferenceType.Empty);\n\n const handleReferenceSelected = (item: DocumentReference) => {\n let already_added = references.find(\n i => i.id === item.id\n )\n\n if (!already_added) {\n setReferences([...references, item]);\n } else {\n NotificationManager.info(T('validationError.ConnectionAlreadyExists'));\n }\n };\n\n const referenceViews = useMemo(() => {\n const handleRemoveReference = (item: DocumentReference) => {\n let index = references.indexOf(item);\n if (index < 0)\n return;\n\n const newReferences = [...references];\n newReferences.splice(index, 1);\n setReferences(newReferences);\n };\n\n return references.map(reference => (\n \n ));\n }, [references, setReferences, readOnly]);\n\n return (\n \n \n
\n {referenceViews.length > 0 &&
{referenceViews}
}\n {referenceViews.length === 0 && {T('document.references.none')}}\n {!readOnly &&

{T('document.references.callToAction')}:

}\n {!readOnly && (\n \n
\n setAddingReferenceType(e.currentTarget.value as DocumentReferenceType)}\n >\n \n \n \n \n \n \n \n \n {addingReferenceType !== DocumentReferenceType.Empty && (\n \n )}\n \n \n )}\n \n \n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { Typeahead } from 'react-bootstrap-typeahead';\nimport { DocumentTagDefinition } from '../../models/DocumentTagDefinition';\nimport api from '../../api';\nimport { getActiveLanguage } from '../../Translate';\nimport { useElementID } from '../../utils/ElementID';\nimport { IndexedList } from '../../models/IndexedList';\n\nexport function getFullTagName(tags: IndexedList, tag: DocumentTagDefinition): string {\n const name = tag.translations[getActiveLanguage()];\n const parentTag = tag.parent && tags.indexed[tag.parent];\n if (parentTag) {\n const parentName = getFullTagName(tags, parentTag);\n return parentName + ' > ' + name;\n } else {\n return name;\n }\n}\n\nclass FilterableDocumentTagType {\n id: string;\n tag: DocumentTagDefinition;\n name: string;\n\n constructor(tag: DocumentTagDefinition, tags: IndexedList) {\n this.id = tag.id;\n this.tag = tag;\n this.name = getFullTagName(tags, tag);\n }\n}\n\ninterface DocumentTagTypeInputProps {\n selected?: DocumentTagDefinition;\n onSelected: (selected: DocumentTagDefinition|undefined) => void;\n disabledTags?: string[];\n placeholder?: string;\n}\nconst NoDisabledTags: string[] = [];\nexport const DocumentTagTypeInput = (props: DocumentTagTypeInputProps) => {\n const { selected, onSelected, placeholder, disabledTags = NoDisabledTags } = props;\n const [availableTags, setAvailableTags] = useState([]);\n useEffect(() => {\n api.getCollectionDocumentTagsIndexed().then(tags => {\n setAvailableTags(\n tags.list\n .filter(tag => tag.selectable && !disabledTags.includes(tag.id))\n .map(tag => new FilterableDocumentTagType(tag, tags))\n );\n });\n }, [disabledTags]);\n\n const id = useElementID('input');\n const selectedItem = selected && availableTags.find(x => x.id === selected.id);\n\n return (\n onSelected(items[0] ? items[0].tag : undefined)}\n placeholder={placeholder}\n />\n );\n};\n","import React from 'react';\nimport { getActiveLanguage } from '../../Translate';\nimport { Card } from 'react-bootstrap';\nimport { DocumentTag, DocumentTagFieldValue } from '../../models/DocumentTag';\nimport styles from './TagView.module.scss';\nimport { Colors, TextStyles } from \"../../config/styles\";\n\n/*function getTagFields(\n tag: DocumentTag,\n readOnly: boolean,\n onChangeField: (field: string, value: DocumentTagFieldValue) => void\n): JSX.Element[] {\n return tag.allFields.map(field => (\n onChangeField(field.key, value)}\n />\n ));\n}*/\n\ninterface TagViewProps {\n tag: DocumentTag;\n removeTag: () => void;\n onChangeField: (field: string, value: DocumentTagFieldValue) => void;\n readOnly: boolean;\n}\nexport const TagView = (props: TagViewProps) => {\n const { tag, removeTag, readOnly } = props;\n //const fields = getTagFields(tag, readOnly, onChangeField);\n\n return (\n \n \n
\n {!readOnly && (\n \n )}\n
\n \n { (tag.tag.translations[getActiveLanguage()] || props.tag)}{' '}\n \n
{tag.fullName}
\n {/* KURT: I putted the rendering of the tag fields. Dries wil dit, maar dit soort zaken knn wel eens veranderen */}\n {/**/}\n {/* {fields}*/}\n {/**/}\n
\n
\n );\n};\n\n\n","import React, { useMemo } from 'react';\nimport { T } from '../../Translate';\nimport { Form } from 'react-bootstrap';\nimport { DocumentTag, DocumentTagFieldValue } from '../../models/DocumentTag';\nimport { FormCard } from \"../../components/FormCard\";\nimport { Icon } from \"../../components/Icons\";\nimport { DocumentTagTypeInput } from \"../../components/inputs/DocumentTagTypeInput\";\nimport { Document, DocumentCategory } from \"../../models/Document\";\nimport { DocumentTagDefinition } from \"../../models/DocumentTagDefinition\";\nimport styles from './index.module.scss';\nimport { TagView } from \"./TagView\";\n\n\ninterface TagsListViewProps {\n document: Document;\n tags: DocumentTag[];\n handleAddTag: (tag: DocumentTagDefinition|undefined) => void\n handleRemoveTag: (tag: DocumentTag) => void\n handleFieldValueUpdated: (tag: DocumentTag, field: string, value: DocumentTagFieldValue) => void\n readOnly: boolean;\n}\nexport const TagsListView = (props: TagsListViewProps) => {\n const { document, tags, handleAddTag, handleRemoveTag, handleFieldValueUpdated, readOnly } = props;\n \n const documentCategory = document.category;\n const hasTypes = documentCategory === DocumentCategory.AdlibCollectionDocument || documentCategory === DocumentCategory.Digital;\n\n const tagViews = useMemo(() => {\n\n return tags.map((tag, index) => (\n handleRemoveTag(tag)}\n readOnly={readOnly}\n onChangeField={(field, value) => handleFieldValueUpdated(tag, field, value)}\n />\n ));\n }, [tags, readOnly]);\n\n\n return (\n \n
\n {!readOnly && hasTypes && <>\n
{T('document.addTags').toUpperCase()}
\n
\n tag.tag.id)}\n />\n
\n }\n {tagViews}\n \n \n );\n};\n\n\n","import { T } from \"../Translate\";\nimport { IPlace } from \"./Place\";\n\nexport interface IContactPersonFields {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n street: string;\n streetNumber: string;\n placeId: string;\n notes: string;\n}\n\nexport interface IContactPerson extends IContactPersonFields {\n _id: string;\n place?: IPlace;\n}\n\nexport interface BaseContactPersonEvent {\n _id: string,\n type: string,\n contactPersonId: string,\n start: string, // ISO 6801 datetime string\n end: string, // ISO 6801 datetime string\n\n personFirstName?: string;\n personLastName?: string;\n}\n\nexport interface ContactPersonEventData extends BaseContactPersonEvent {\n contactMethod?: string;\n}\n\nexport enum ContactMomentType {\n Email = 'email',\n Phone = 'phone',\n Visit = 'visit',\n Feedback = 'feedback',\n Post = 'post'\n}\n\nexport const ContactMomentTypes = [\n ContactMomentType.Email,\n ContactMomentType.Phone,\n ContactMomentType.Visit,\n ContactMomentType.Feedback,\n ContactMomentType.Post\n];\nexport function translateContactMomentType(type: ContactMomentType): string {\n switch (type) {\n case ContactMomentType.Email:\n return T('contactMomentType.email');\n case ContactMomentType.Phone:\n return T('contactMomentType.phone');\n case ContactMomentType.Visit:\n return T('contactMomentType.visit');\n case ContactMomentType.Feedback:\n return T('contactMomentType.feedback');\n case ContactMomentType.Post:\n return T('contactMomentType.post');\n default:\n return type;\n }\n}\n\nexport interface ContactMomentContactPersonEvent extends BaseContactPersonEvent {\n type: 'contact_moment',\n contactMethod: ContactMomentType,\n contributions: ContactMomentContribution[],\n transcript: string\n}\n\nexport interface KeyStoryContactPersonEvent extends BaseContactPersonEvent {\n type: 'key_story',\n storyId: string\n}\n\nexport interface ContactMomentContribution {\n type: 'person'|'document',\n targetId: string,\n name?: string\n}\n\nexport type ContactPersonEvent = ContactMomentContactPersonEvent | KeyStoryContactPersonEvent;\n\n\nexport class ContactPersonEventHelper {\n static getContributionsForType(contactPersonEvent: ContactMomentContactPersonEvent, type: 'person'|'document'): ContactMomentContribution[] {\n return contactPersonEvent.contributions.filter(contribution => contribution.type === type)\n }\n}\n","import React from 'react';\nimport { ContactMomentContribution } from '../../models/ContactPerson';\nimport { Icon } from '../../components/Icons';\nimport { Button } from 'react-bootstrap';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\n\ninterface ContributionViewProps {\n contribution: ContactMomentContribution;\n onClickedDelete?: () => void;\n}\nexport const ContributionView = (props: ContributionViewProps) => {\n const { contribution, onClickedDelete } = props;\n const icon = contribution.type === 'person' ? Icon.User : Icon.Document;\n const linkPage = contribution.type === 'person' ? PageID.ViewPerson : PageID.EditDocument;\n return (\n
\n \n \n {' '}\n {contribution.name || contribution.targetId}\n \n {onClickedDelete && (\n \n )}\n
\n );\n};\n","import commonmark from 'commonmark';\n\nconst markdownReader = new commonmark.Parser();\nconst markdownRenderer = new commonmark.HtmlRenderer();\n\n\nfunction duplicateNewLines(input: string): string {\n // eslint-disable-next-line no-control-regex\n return input.replace(new RegExp('\\n', 'g'), '\\n\\n');\n}\n\nexport function markdown2html(markdown: string): { __html: string } {\n\n // Some hacking to convert a single newline to a new paragraph.\n // We just replace a single newline by a double newline before we\n // let is be parsed by the MarkdownReader.\n const newMarkdown = duplicateNewLines(markdown)\n const parsed = markdownReader.parse(newMarkdown);\n const rendered = markdownRenderer.render(parsed);\n\n return {__html: rendered };\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport moment from 'moment';\nimport {\n ContactMomentContactPersonEvent,\n ContactMomentContribution,\n ContactPersonEvent,\n ContactPersonEventHelper,\n KeyStoryContactPersonEvent,\n translateContactMomentType\n} from '../../models/ContactPerson';\nimport { Card } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { ContributionView } from '../RecordContactMoment/ContributionView';\nimport { Icon } from '../../components/Icons';\nimport { markdown2html } from '../../utils/Markdown';\nimport { ButtonLink } from '../../components/ButtonLink';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\nimport { TextStyles } from \"../../config/styles\";\nimport styles from './ContactPersonEventView.module.scss';\nimport { usePersonStory } from '../../FunctionalAPI';\nimport { Loading } from '../../utils/Loading';\nimport { IPersonStory } from '../../models/PersonStory';\nimport api from '../../api';\nimport { IPersonStory2 } from '../../models/PersonStory2';\n\ninterface ContactPersonEventViewProps {\n event: ContactPersonEvent;\n onClickedDelete?: () => void;\n readonly?: boolean\n compact?: boolean\n}\n\n\nconst ContactPersonActionButtonsView = (props: ContactPersonEventViewProps) => {\n const {event, onClickedDelete} = props;\n\n const handleClickedDelete = () => {\n if (onClickedDelete) {\n onClickedDelete();\n }\n }\n\n const actionsDiv = () => {\n return (\n
\n \n \n \n \n
)\n }\n\n return (\n props.readonly === false ? actionsDiv() : <>\n )\n}\n\n\nconst ContactPersonTitleView = (props: ContactPersonEventViewProps) => {\n const { event } = props;\n\n const readonlyTitle = () => {\n const contactPersonName = `${event.personFirstName || ''} ${event.personLastName || ''}`;\n\n return (\n

\n {contactPersonName}\n {event.type === 'contact_moment' && (': ' + T('page.person.contactAt', {\n type: translateContactMomentType(event.contactMethod),\n moment: moment(event.start).format('DD/MM/YYYY')\n }))}\n

)\n }\n\n const readwriteTitle = () => {\n return (\n

\n {moment(event.start).format('DD/MM/YYYY')} · {event.type === 'contact_moment' ? translateContactMomentType(event.contactMethod) : T('page.contactPerson.event.keyStory')}\n

)\n }\n\n return (\n props.readonly === false ? readwriteTitle() : readonlyTitle()\n )\n}\n\ninterface ContributionListViewProps {\n labelText: string\n contributionsList: ContactMomentContribution[]\n}\n\nconst ContributionListView = (props: ContributionListViewProps) => {\n\n const {contributionsList, labelText} = props;\n\n return (\n <>\n {contributionsList.length > 0 && (\n
\n

{labelText}:

\n
\n {contributionsList.map(contribution => (\n \n ))}\n
\n
\n )}\n )\n}\n\nexport const ContactPersonEventView = (props: ContactPersonEventViewProps) => {\n const { event, onClickedDelete, readonly, compact } = props;\n const showCompact = compact && compact === true\n\n return (\n \n \n \n \n \n {!showCompact && (\n \n {event.type === 'contact_moment' && }\n {event.type === 'key_story' && }\n \n )}\n \n );\n}\n\ninterface ContactMomentCardBodyProps {\n event: ContactMomentContactPersonEvent;\n}\n\nfunction ContactMomentCardBody(props: ContactMomentCardBodyProps) {\n const { event } = props;\n\n const transcription = useMemo(\n () => event.transcript\n ?

\n :

{T('page.contactPerson.event.noTranscription')}

,\n [event.transcript]\n );\n\n const personContributions = ContactPersonEventHelper.getContributionsForType(event, 'person')\n const documentContributions = ContactPersonEventHelper.getContributionsForType(event, 'document')\n\n return <>\n \n
\n

{T('contactPerson.event.contributions.transcription')}:

\n
\n {transcription}\n
\n
\n \n ;\n}\n\ninterface KeyStoryCardBodyProps {\n event: KeyStoryContactPersonEvent;\n}\n\nfunction KeyStoryCardBody(props: KeyStoryCardBodyProps) {\n const { event } = props;\n\n const [story, setStory] = useState();\n useEffect(() => {\n api.getPersonStory2(event.storyId).then(setStory);\n }, [event.storyId]);\n\n return <>\n {story && (\n {story.first_name + ' ' + story.family_name}\n )}\n ;\n}\n","import React from 'react';\nimport api from '../../api';\nimport {\n Document,\n DocumentCategory,\n DocumentKind,\n DocumentStatus,\n getDocumentCategoryName\n} from '../../models/Document';\nimport { Col, Form, Row } from 'react-bootstrap';\nimport { singular, T } from '../../Translate';\nimport { DocumentTagDefinition } from '../../models/DocumentTagDefinition';\nimport { DocumentTag, DocumentTagFieldValue } from '../../models/DocumentTag';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { SelectInput } from '../../components/inputs/SelectInput';\nimport { FormCard } from '../../components/FormCard';\nimport { Icon } from '../../components/Icons';\nimport { CheckboxInput } from '../../components/inputs/CheckboxInput';\nimport { EditModeButton } from '../../components/EditModeButton';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { InputGroup } from '../../components/inputs/InputGroup';\nimport { IDocumentFormState } from './DocumentFormState';\nimport { IndexedList } from '../../models/IndexedList';\nimport { DocumentReferences } from \"./DocumentReferences\";\nimport { TagsListView } from \"./TagsListView\";\nimport { zeroPad } from \"../../utils/Formatting\";\nimport { ContactPersonEventView } from \"../EditContactPerson/ContactPersonEventView\";\nimport { ContactPersonEvent } from \"../../models/ContactPerson\";\n\ninterface EditDocumentFormProps {\n tagDefinitions: IndexedList;\n document: Document;\n contactEvent?: ContactPersonEvent;\n readOnly: boolean;\n formState: IDocumentFormState;\n updateFormState: (updates: Partial) => void;\n contentHasChanged: boolean;\n onClickedEdit: () => void;\n}\n\nexport default (props: EditDocumentFormProps) => {\n const {\n tagDefinitions,\n document,\n contactEvent,\n readOnly,\n formState,\n updateFormState,\n contentHasChanged,\n onClickedEdit\n } = props;\n\n const documentCategory = document.category;\n const adlibCode = document.adlibCode || (document.collection && document.collection.adlibCode);\n const titleReadonly = documentCategory === DocumentCategory.Adlib || documentCategory === DocumentCategory.AdlibCollectionDocument;\n\n const {\n kind,\n source,\n title,\n description,\n institution,\n inventoryId,\n url,\n wiseProfile,\n wiseBranch,\n wiseLocation,\n pages,\n status,\n disclosed,\n tags,\n references\n } = formState;\n\n const collectionObject = document && document.collection;\n\n const handleAddTag = (tag: DocumentTagDefinition|undefined) => {\n if (!tag)\n return;\n\n updateFormState({ tags: [...tags, DocumentTag.create(tag, tagDefinitions)] });\n };\n\n const editButton = !api.user.isReadOnly() && (\n \n );\n\n /*** handlers ***/\n\n const handleRemoveTag = (tag: DocumentTag) => {\n updateFormState({ tags: tags.filter(t => t !== tag) });\n };\n\n const handleFieldValueUpdated = (tag: DocumentTag, field: string, value: DocumentTagFieldValue) => {\n const newTag = tag.withFieldValue(field, value);\n const newTags = tags.map(t => t === tag ? newTag : t);\n updateFormState({ tags: newTags });\n }\n\n\n /*** rendering ***/\n\n const renderCategory = () => {\n return (\n \n );\n }\n\n const renderCounter = () => {\n const renderDocumentCounter = (counter: number) => 'DIBO' + zeroPad(counter, 6);\n const counterValue: string = document.counter && document.counter > 0\n ? renderDocumentCounter(document.counter)\n : T('document.counter.savefirst');\n \n return (\n \n );\n }\n\n const renderKind = () => {\n return (\n updateFormState({ kind: value as DocumentKind })}\n readOnly={readOnly || documentCategory === DocumentCategory.Digital}\n options={[\n { value: DocumentKind.Original, title: T('document.kind.original') },\n { value: DocumentKind.Copy, title: T('document.kind.copy') },\n { value: DocumentKind.Digital, title: T('document.kind.digital') },\n { value: DocumentKind.Reproduction, title: T('document.kind.reproduction') }\n ]}/>\n )\n }\n\n const renderCollectionTitle = () => {\n return (\n {}}\n readOnly={readOnly || titleReadonly}\n />\n )\n }\n\n const renderDocumentTitle = () => {\n return (\n updateFormState({ title })}\n readOnly={readOnly || titleReadonly}\n error={formState.titleError}\n />\n )\n }\n\n const renderDocumentDescription = () => {\n return (\n updateFormState({ description })}\n readOnly={readOnly || titleReadonly}\n rows={5}\n />\n )\n }\n\n const renderDocumentSource = () => {\n return (\n updateFormState({ source })}\n readOnly={readOnly}\n />\n )\n }\n\n const renderDocumentAdlibCode = () => {\n return (\n \n )\n }\n\n const renderDocumentFilename = () => {\n return (\n \n )\n }\n\n const renderCollectionObjectLink = () => {\n return (\n \n {singular('collection')}:\n
\n {collectionObject!.adlibCode}\n \n \n )\n }\n\n const renderInstitution = () => {\n return (\n updateFormState({ institution })}\n readOnly={readOnly}\n />\n );\n }\n\n const renderInventory = () => {\n return (\n updateFormState({ inventoryId })}\n readOnly={readOnly}\n />\n );\n }\n\n const renderUrl = () => {\n return (\n readOnly ? (\n \n {url}\n \n ) : (\n updateFormState({ url })}\n readOnly={readOnly}\n error={formState.urlError}\n />\n )\n )\n }\n\n const renderWiseProfile = () => {\n return (\n updateFormState({ wiseProfile })}\n readOnly={readOnly}\n options={[\n { value: 'ieper', title: 'Stad Ieper' }\n ]}\n />\n )\n }\n\n const renderWiseBranch = () => {\n return (\n updateFormState({ wiseBranch })}\n readOnly={readOnly}\n options={[\n { value: 'Ieper/Kenniscentrum In Flanders Fields Museum', title: 'Kenniscentrum' },\n { value: 'Ieper/Hoofdbibliotheek', title: 'Hoofdbibliotheek' },\n //{ value: 'Ieper/Elverdinge', title: 'Elverdinge' },\n //{ value: 'Ieper/Vlamertinge', title: 'Vlamertinge' },\n { value: 'Ieper/Stadsarchief', title: 'Stadsarchief' },\n { value: 'Ieper/Dé Academie', title: 'Dé Academie' }\n ]}\n />\n )\n }\n\n const renderWiseLocation = () => {\n return (\n updateFormState({ wiseLocation })}\n readOnly={readOnly}\n />\n )\n }\n\n const renderDocumentPages = () => {\n return (\n updateFormState({ pages })}\n readOnly={readOnly}\n />\n )\n }\n\n const renderStatus = () => {\n return (\n updateFormState({ status: status as DocumentStatus })}\n readOnly={readOnly}\n options={[\n { value: 'todo', title: T('document.status.todo') },\n { value: 'in_progress', title: T('document.status.in_progress') },\n { value: 'done', title: T('document.status.done') }\n ]}\n />\n )\n }\n\n const renderDisclosed = () => {\n return (\n updateFormState({ disclosed })}\n />\n )\n }\n\n const renderReferences = () => {\n return (\n \n
\n updateFormState({references: newReferences})}\n readOnly={readOnly}\n />\n \n \n )\n }\n\n const renderContactEvent = () => {\n if (!contactEvent) {\n return <>\n } else\n return (\n \n );\n }\n\n const renderTags = () => {\n return (\n \n );\n }\n\n const renderWebDocument = () => {\n return (\n <>\n \n
\n {renderCategory()}\n {renderUrl()}\n {renderDocumentTitle()}\n {renderDocumentDescription()}\n {renderDisclosed()}\n \n \n {renderReferences()}\n \n )\n }\n\n const renderWiseDocument = () => (\n <>\n \n
\n {renderCategory()}\n {renderWiseProfile()}\n {renderWiseBranch()}\n {renderWiseLocation()}\n {/*renderWiseId() -- hidden until available */}\n {renderDocumentTitle()}\n {renderDocumentPages()}\n {renderDocumentDescription()}\n {renderDisclosed()}\n \n \n {renderReferences()}\n \n );\n\n const renderDibornDocument = () => (\n <>\n \n
\n {renderCategory()}\n {renderCounter()}\n { !contactEvent && renderDocumentSource()}\n {renderStatus()}\n {renderDisclosed()}\n \n \n {renderContactEvent()}\n {renderReferences()}\n {renderTags()}\n \n );\n\n const renderArchiveDocument = () => (\n <>\n \n
\n {renderCategory()}\n {renderInstitution()}\n {renderInventory()}\n {renderDocumentTitle()}\n {renderDocumentDescription()}\n {renderDisclosed()}\n \n \n {renderReferences()}\n \n );\n\n const renderAdlibDocument = () => (\n <>\n \n
\n {renderCategory()}\n {renderDocumentFilename()}\n {renderKind()}\n {collectionObject && renderCollectionObjectLink()}\n {document.adlibCode && renderDocumentAdlibCode()}\n {document.collection && renderCollectionTitle()}\n {renderStatus()}\n {renderDisclosed()}\n \n \n {renderReferences()}\n {renderTags()}\n \n );\n\n switch (documentCategory) {\n case DocumentCategory.Web:\n return renderWebDocument()\n case DocumentCategory.Wise:\n return renderWiseDocument()\n case DocumentCategory.Digital:\n return renderDibornDocument()\n case DocumentCategory.Archive:\n return renderArchiveDocument()\n case DocumentCategory.AdlibCollectionDocument:\n case DocumentCategory.Adlib:\n return renderAdlibDocument()\n default:\n return <>\n }\n\n}\n","import React, { ReactNode } from 'react';\nimport styles from './Backdrop.module.scss';\nimport { classes } from '../utils/Styles';\n\ninterface BackdropProps extends React.DOMAttributes {\n dark?: boolean;\n children: ReactNode;\n}\nexport const Backdrop = (props: BackdropProps) => {\n const { children, dark, ...other } = props;\n return (\n
\n {children}\n
\n );\n}\n","import React from 'react';\nimport { Icon } from './Icons';\nimport styles from './IconButton.module.scss';\nimport { classes } from '../utils/Styles';\n\ninterface IconButtonProps {\n icon: Icon;\n onClick: (e: React.MouseEvent) => void;\n}\nexport const IconButton = (props: IconButtonProps) => {\n const { icon, onClick } = props;\n return (\n \n );\n}\n\ninterface IconLinkProps {\n icon: Icon;\n href: string;\n}\nexport const IconLink = (props: IconLinkProps) => {\n const { icon, href } = props;\n return (\n \n \n \n );\n}\n","import React, { useState, CSSProperties } from 'react';\nimport { Backdrop } from './Backdrop';\nimport styles from './FullscreenImageView.module.scss';\nimport { Icon } from './Icons';\nimport { IconButton } from './IconButton';\n\ninterface FullscreenImageViewProps {\n src: string;\n caption?: string;\n onClick: () => void;\n}\n\ntype DragState = { dragging: false } | {\n dragging: true;\n dragStartX: number;\n dragStartY: number;\n dragStartMouseX: number;\n dragStartMouseY: number;\n}\ninterface Offsets {\n offsetX: number;\n offsetY: number;\n scale: number;\n}\n\nexport const FullscreenImageView = (props: FullscreenImageViewProps) => {\n const { src, caption, onClick } = props;\n\n const [dragState, setDragState] = useState({ dragging: false });\n const [offsets, setOffsets] = useState({\n offsetX: 0,\n offsetY: 0,\n scale: 1\n });\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n setDragState({\n dragging: true,\n dragStartX: offsets.offsetX,\n dragStartY: offsets.offsetY,\n dragStartMouseX: e.pageX,\n dragStartMouseY: e.pageY\n });\n }\n\n const handleMouseUp = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n if (dragState.dragging) {\n setDragState({ dragging: false });\n }\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (dragState.dragging) {\n const offsetX = e.pageX - dragState.dragStartMouseX + dragState.dragStartX;\n const offsetY = e.pageY - dragState.dragStartMouseY + dragState.dragStartY;\n setOffsets({ offsetX, offsetY, scale: offsets.scale });\n }\n }\n\n const handleMouseOut = (e: React.MouseEvent) => {\n if (dragState.dragging) {\n setDragState({ dragging: false });\n }\n }\n\n const zoom = (relativeX: number, relativeY: number, scale: number) => {\n // Calculation to zoom in at the cursor position:\n // the pixel at the given pointer position must point to the same before and after scaling\n // relativeX = offsetX + scale * documentX\n // relativeX = newOffsetX + newScale * documentX\n // we can substitute documentX:\n // documentX = (relativeX - offsetX) / scale = (relativeX - newOffsetX) / newScale\n // <=> (relativeX - offsetX) * newScale / scale = relativeX - newOffsetX\n // <=> newOffsetX = relativeX - (relativeX - offsetX) * newScale / scale\n // -- same calculation is valid for Y\n\n const offsetX = relativeX - (relativeX - offsets.offsetX) * scale / offsets.scale;\n const offsetY = relativeY - (relativeY - offsets.offsetY) * scale / offsets.scale;\n setOffsets({ offsetX, offsetY, scale });\n };\n\n const handleScroll = (e: React.WheelEvent) => {\n e.preventDefault(); // prevent scrolling the page\n\n let rect = e.currentTarget.getBoundingClientRect();\n let relativeX = e.clientX - (rect.left + rect.right) / 2;\n let relativeY = e.clientY - (rect.top + rect.bottom) / 2;\n\n let newScale = e.deltaY > 0 ? offsets.scale * 0.9 : offsets.scale / 0.9;\n zoom(relativeX, relativeY, newScale);\n\n // if we're dragging while zooming, make sure things don't jump around\n // (this will \"reset\" drag variables as if a new drag operation has been started)\n if (dragState.dragging) {\n setDragState({\n dragging: true,\n dragStartX: offsets.offsetX,\n dragStartY: offsets.offsetY,\n dragStartMouseX: e.pageX,\n dragStartMouseY: e.pageY\n });\n }\n };\n\n const zoomAtCenter = (scale: number) => {\n setOffsets({ offsetX: offsets.offsetX, offsetY: offsets.offsetY, scale });\n };\n\n const handleClickedZoomIn = (e: React.MouseEvent) => {\n e.stopPropagation();\n zoomAtCenter(offsets.scale / 0.8);\n };\n\n const handleClickedZoomOut = (e: React.MouseEvent) => {\n e.stopPropagation();\n zoomAtCenter(offsets.scale * 0.8);\n };\n\n const style: CSSProperties = {\n maxWidth: '90%',\n maxHeight: '90%',\n position: 'relative',\n left: offsets.offsetX,\n top: offsets.offsetY,\n transform: `scale(${offsets.scale})`\n };\n\n return (\n \n e.stopPropagation()}\n onDrag={e => e.preventDefault()}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseMove={handleMouseMove}\n onMouseOut={handleMouseOut}\n onWheel={handleScroll}\n className={styles.nodrag}\n style={style}\n draggable={false}\n alt=''\n />\n
\n \n \n
\n {caption &&
{caption}
}\n
\n \n
\n
\n );\n};\n","\nimport React from 'react';\nimport styles from './ImageBrowser.module.scss';\nimport Measure, { BoundingRect, ContentRect } from 'react-measure';\nimport { Icon } from '../../components/Icons';\nimport { FullscreenImageView } from '../../components/FullscreenImageView';\nimport { IconButton, IconLink } from '../../components/IconButton';\nimport { getLargeIcon, FileType, isImageType } from '../../utils/MimeTypes';\nimport { T } from '../../Translate';\n\ninterface ImageViewerProps {\n filetype: FileType;\n url: string|null;\n originalUrl: string;\n}\ninterface ImageViewerState {\n dimensions?: BoundingRect\n fullscreenOpen: boolean;\n}\nexport class ImageViewer extends React.Component {\n canvas: HTMLCanvasElement|null;\n image: HTMLImageElement;\n\n dragging: boolean;\n offsetX: number;\n offsetY: number;\n scale: number;\n dragStartX: number;\n dragStartY: number;\n dragStartMouseX: number;\n dragStartMouseY: number;\n\n constructor(props: ImageViewerProps) {\n super(props);\n\n this.state = {\n fullscreenOpen: false\n };\n\n this.canvas = null;\n\n this.image = new Image();\n this.image.width = 200;\n this.image.height = 200;\n this.image.addEventListener('load', () => this.paint());\n if (this.props.url) {\n this.image.src = this.props.url;\n }\n\n this.dragging = false;\n this.offsetX = 0;\n this.offsetY = 0;\n this.scale = 1;\n\n this.dragStartX = 0;\n this.dragStartY = 0;\n this.dragStartMouseX = 0;\n this.dragStartMouseY = 0;\n }\n\n componentDidUpdate(prevProps: ImageViewerProps) {\n if (this.props.url && this.props.url !== prevProps.url) {\n this.image.src = this.props.url;\n }\n }\n\n setCanvas = (canvas: HTMLCanvasElement|null) => {\n this.canvas = canvas;\n if (!this.canvas)\n return;\n\n this.canvas.addEventListener('wheel', ((e: React.WheelEvent) => {\n e.preventDefault(); // prevent scrolling the page\n\n let rect = e.currentTarget.getBoundingClientRect();\n let relativeX = e.clientX - rect.left;\n let relativeY = e.clientY - rect.top;\n\n let newScale = e.deltaY > 0 ? this.scale * 0.9 : this.scale / 0.9;\n this.zoom(relativeX, relativeY, newScale);\n\n // if we're dragging while zooming, make sure things don't jump around\n // (this will \"reset\" drag variables as if a new drag operation has been started)\n this.dragStartX = this.offsetX;\n this.dragStartY = this.offsetY;\n this.dragStartMouseX = e.pageX;\n this.dragStartMouseY = e.pageY;\n }) as any); // here, swallow!\n this.paint();\n }\n\n zoom(relativeX: number, relativeY: number, scale: number) {\n // Calculation to zoom in at the cursor position:\n // the pixel at the given pointer position must point to the same before and after scaling\n // relativeX = offsetX + scale * documentX\n // relativeX = newOffsetX + newScale * documentX\n // we can substitute documentX:\n // documentX = (relativeX - offsetX) / scale = (relativeX - newOffsetX) / newScale\n // <=> (relativeX - offsetX) * newScale / scale = relativeX - newOffsetX\n // <=> newOffsetX = relativeX - (relativeX - offsetX) * newScale / scale\n // -- same calculation is valid for Y\n\n this.offsetX = relativeX - (relativeX - this.offsetX) * scale / this.scale;\n this.offsetY = relativeY - (relativeY - this.offsetY) * scale / this.scale;\n this.scale = scale;\n\n this.paint();\n }\n\n paint() {\n if (this.canvas === null)\n return;\n\n let context = this.canvas.getContext('2d');\n if (context === null)\n return;\n\n context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n let width = this.canvas.width * this.scale;\n let height = width * this.image.naturalHeight / this.image.naturalWidth;\n context.drawImage(this.image, this.offsetX, this.offsetY, width, height);\n }\n\n handleClickedZoomIn = () => {\n if (this.canvas === null)\n return;\n\n this.zoom(this.canvas.clientWidth / 2, this.canvas.clientHeight / 2, this.scale / 0.9);\n }\n\n handleClickedZoomOut = () => {\n if (this.canvas === null)\n return;\n\n this.zoom(this.canvas.clientWidth / 2, this.canvas.clientHeight / 2, this.scale * 0.9);\n }\n\n handleClickedFullscreen = () => {\n this.setState({ fullscreenOpen: true });\n }\n\n handleClickedFullscreenClose = () => {\n this.setState({ fullscreenOpen: false });\n }\n\n handleMouseDown = (e: React.MouseEvent) => {\n this.dragging = true;\n this.dragStartX = this.offsetX;\n this.dragStartY = this.offsetY;\n this.dragStartMouseX = e.pageX;\n this.dragStartMouseY = e.pageY;\n }\n\n handleMouseUp = (e: React.MouseEvent) => {\n this.dragging = false;\n this.paint();\n }\n\n handleMouseMove = (e: React.MouseEvent) => {\n if (this.dragging) {\n this.offsetX = e.pageX - this.dragStartMouseX + this.dragStartX;\n this.offsetY = e.pageY - this.dragStartMouseY + this.dragStartY;\n this.paint();\n }\n }\n\n handleMouseOut = (e: React.MouseEvent) => {\n this.dragging = false;\n }\n\n handleDimensionsChanged = (contentRect: ContentRect) => {\n this.setState({ dimensions: contentRect.bounds });\n this.paint();\n }\n\n render() {\n const { filetype, url, originalUrl } = this.props;\n const { fullscreenOpen, dimensions } = this.state;\n const { width, height } = dimensions || { width: -1, height: -1 };\n const isImage = isImageType(filetype);\n return <>\n \n {({ measureRef }) => (\n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n {isImage && }\n {!isImage && (\n
\n \n

{T('imageView.notPreviewable')}

\n

{T('imageView.download')}

\n
\n )}\n \n )}\n
\n {fullscreenOpen && url && }\n ;\n }\n}\n","import React from 'react';\nimport styles from './ResizableSplitPane.module.scss';\nimport { connect } from 'react-redux';\nimport { setDocumentEditorRatio, AnyAppAction } from '../../redux/Actions';\nimport { Dispatch } from 'redux';\nimport { AppState } from '../../redux/State';\n\ninterface ResizableLeftProps {\n setRef: (element: HTMLDivElement) => void;\n width: number|string;\n children: JSX.Element;\n}\nconst ResizableLeft = (props: ResizableLeftProps) => (\n
\n {props.children}\n
\n);\n\ninterface ResizableDividerProps {\n setRef: (element: HTMLDivElement) => void;\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerUp: (e: React.PointerEvent) => void;\n onPointerMove: (e: React.PointerEvent) => void;\n}\nconst ResizableDivider = (props: ResizableDividerProps) => (\n \n
\n
\n);\n\ninterface ResizableRightProps {\n children: JSX.Element;\n}\nconst ResizableRight = (props: ResizableRightProps) => (\n
\n {props.children}\n
\n);\n\ninterface ResizableComponentProps {\n ratio: number;\n left: JSX.Element;\n right: JSX.Element;\n setRatio: (ratio: number) => void;\n}\ninterface ResizableComponentState {\n dragging: boolean;\n draggingStartWidth: number;\n draggingStartX: number;\n draggingWidth: number;\n}\nclass ResizableComponent extends React.Component {\n parentRef: HTMLElement|null;\n dividerRef: HTMLElement|null;\n leftRef: HTMLElement|null;\n\n constructor(props: ResizableComponentProps) {\n super(props);\n\n this.state = {\n dragging: false,\n draggingStartWidth: 0,\n draggingStartX: 0,\n draggingWidth: 0\n };\n\n this.parentRef = null;\n this.dividerRef = null;\n this.leftRef = null;\n }\n\n setParentRef = (element: HTMLElement|null) => {\n this.parentRef = element;\n }\n\n setDividerRef = (element: HTMLElement|null) => {\n this.dividerRef = element;\n }\n\n setLeftRef = (element: HTMLElement|null) => {\n this.leftRef = element;\n }\n\n handlePointerDown = (e: React.PointerEvent) => {\n if (this.dividerRef === null || this.leftRef === null)\n return;\n \n this.dividerRef.setPointerCapture(e.pointerId);\n\n this.setState({\n dragging: true,\n draggingStartWidth: this.leftRef.clientWidth,\n draggingStartX: e.clientX,\n draggingWidth: this.leftRef.clientWidth\n });\n }\n\n handlePointerMove = (e: React.PointerEvent) => {\n if (!this.state.dragging)\n return;\n\n this.setState({\n draggingWidth: this.state.draggingStartWidth + e.clientX - this.state.draggingStartX\n });\n }\n\n handlePointerUp = (e: React.PointerEvent) => {\n if (this.dividerRef === null || this.parentRef === null)\n return;\n \n this.dividerRef.releasePointerCapture(e.pointerId);\n let ratio = this.state.draggingWidth / this.parentRef.clientWidth;\n this.props.setRatio(ratio);\n localStorage.setItem('documentEditorRatio', ratio.toString());\n\n this.setState({\n dragging: false\n });\n }\n\n render() {\n let width = this.props.ratio * 100 + '%';\n return (\n
\n \n {this.props.left}\n \n \n {this.props.right}\n
\n );\n }\n}\n\nconst mapStateToProps = (state: AppState) => ({\n ratio: state.documentEditorSettings.ratio\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n setRatio: (ratio: number) => dispatch(setDocumentEditorRatio(ratio))\n});\n\nexport const ResizableSplitPane = connect(mapStateToProps, mapDispatchToProps)(ResizableComponent);\n","import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { PageProps, Page } from '../Page';\nimport api from '../../api';\nimport { Document, IDocumentPage } from '../../models/Document';\nimport { Button, Form, Card } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { DocumentTag } from '../../models/DocumentTag';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { FormCard } from '../../components/FormCard';\nimport { Icon } from '../../components/Icons';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { UnsavedChangesModal } from '../../modals/UnsavedChangesModal';\nimport styles from './ImageBrowser.module.scss';\nimport { ImageViewer } from './ImageBrowser';\nimport { ResizableSplitPane } from './ResizableSplitPane';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { useDocument, useDocumentTagDefinitions } from '../../FunctionalAPI';\nimport { ISharedPageState } from '../../redux/State';\nimport { useAppSelector, useAppDispatch } from '../../utils/Functional';\nimport { setSharedPageState } from '../../redux/Actions';\nimport { NotificationManager } from 'react-notifications';\nimport { EditModeButton } from '../../components/EditModeButton';\nimport { guessFileType, getFileTypeFromMimeType, FileType } from '../../utils/MimeTypes';\nimport { DocumentReference } from '../../models/DocumentReference';\nimport { DocumentReferences } from '../EditCollectionDocument/DocumentReferences';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\n\ninterface DocumentAnnotatorPageProps extends PageProps {\n id: string;\n page: number;\n}\n\nfunction getNextPage(document: Document|undefined, pageNumber: number) {\n if (!document)\n return undefined;\n\n let nextPage = pageNumber + 1;\n while (nextPage < document.elements.length && document.elements[nextPage].type !== 'page')\n nextPage++;\n return nextPage >= document.elements.length ? undefined : nextPage;\n}\n\nfunction getPreviousPage(document: Document|undefined, pageNumber: number) {\n if (!document)\n return undefined;\n\n let nextPage = pageNumber - 1;\n while (nextPage >= 0 && document.elements[nextPage].type !== 'page')\n nextPage--;\n return nextPage < 0 ? undefined : nextPage;\n}\n\nexport function getFiletype(page: IDocumentPage): FileType {\n if (page.original_filename)\n return guessFileType(page.original_filename);\n else\n return getFileTypeFromMimeType(page.mimetype);\n}\n\nexport default (props: DocumentAnnotatorPageProps) => {\n const { id, page: elementIndex, history, loading, modals, via } = props;\n\n const readOnlyFromState = useAppSelector(state => state.sharedPageState.editingDocumentId) !== id;\n const readOnly = api.user.isReadOnly() || readOnlyFromState;\n const dispatch = useAppDispatch();\n\n const [documentJson,,setDocumentJson] = useDocument(loading, id);\n const tagDefinitions = useDocumentTagDefinitions(loading);\n\n const [pageNumberInput, setPageNumberInput] = useState('');\n const [pageNumberError, setPageNumberError] = useState();\n const [transcription, setTranscription] = useState('');\n const [tags, setTags] = useState([]);\n const [references, setReferences] = useState([]);\n\n const saved = useRef(false);\n useEffect(() => { saved.current = true; }, [id, elementIndex]);\n\n const document = useMemo(\n () => documentJson ? Document.fromJSON(documentJson, tagDefinitions) : undefined,\n [documentJson, tagDefinitions]\n );\n const page = useMemo(\n () => {\n const element = document && document.elements[elementIndex];\n if (element && element.type === 'page') {\n return element;\n } else {\n return undefined;\n }\n },\n [document, elementIndex]\n );\n const originalPageTags = useMemo(\n () => page ? page.tags.map(tag => DocumentTag.fromJSON(tag, tagDefinitions)) : [],\n [page, tagDefinitions]\n );\n\n useEffect(() => {\n setTags(page ? page.tags.map(tag => DocumentTag.fromJSON(tag, tagDefinitions)) : []);\n setReferences(page ? page.references.map(reference => DocumentReference.fromJSON(reference)): []);\n setTranscription(page ? page.transcription : '');\n }, [document, tagDefinitions, page]);\n\n useEffect(\n () => setPageNumberInput((elementIndex + 1).toString()),\n [elementIndex]\n );\n\n const nextPage = getNextPage(document, elementIndex);\n const previousPage = getPreviousPage(document, elementIndex);\n\n const handleClickedNext = () => {\n if (nextPage === undefined)\n return;\n\n history.push(`/documents/${id}/${nextPage}`);\n };\n\n const handleClickedPrevious = () => {\n if (previousPage === undefined)\n return;\n\n history.push(`/documents/${id}/${previousPage}`);\n };\n\n const handlePageNumberChanged = (pageNumber: string) => {\n let error: string|undefined = undefined;\n if (isNaN(parseInt(pageNumber))) {\n error = T('validationError.invalidFormat');\n }\n setPageNumberInput(pageNumber);\n setPageNumberError(error);\n };\n\n const referencesHaveChanged = useMemo(() => {\n if (!page)\n return false;\n\n if (page.references.length !== references.length)\n return true;\n\n for (let i = 0; i < references.length; i++) {\n if (page.references[i]._id !== references[i].id)\n return true;\n }\n\n return false;\n }, [page, references]);\n\n const hasChanged = () => {\n if (!page)\n return true;\n if (referencesHaveChanged)\n return true;\n\n if (pageNumberInput !== (elementIndex + 1).toString())\n return true;\n if (transcription !== page.transcription)\n return true;\n if (tags.length !== originalPageTags.length)\n return true;\n\n for (let i = 0; i < tags.length; i++) {\n const oldAnnotation = originalPageTags[i];\n const newAnnotation = tags[i];\n\n if (!oldAnnotation.equals(newAnnotation))\n return true;\n }\n\n return false;\n };\n const changed = hasChanged();\n\n const confirmNavigation = useCallback(() => {\n if (!changed || saved.current)\n return Promise.resolve(true);\n\n modals.show(UnsavedChangesModal);\n return Promise.resolve(false);\n }, [changed, modals]);\n\n const documentTitle = document ? (document.title || T('page.document.untyped')) : '';\n const title = T('documentPage.title', {\n title: documentTitle,\n page: (elementIndex + 1).toString()\n });\n const shortTitle = T('documentPage.shortTitle', { page: (elementIndex + 1).toString() });\n\n const parsedPageNumberInput = parseInt(pageNumberInput);\n const isValid = document !== undefined\n && /^[0-9]+$/.test(pageNumberInput)\n && parsedPageNumberInput > 0\n && parsedPageNumberInput <= document.elements.length;\n\n const handleClickedSave = async () => {\n if (!document)\n return;\n\n const updates: Partial = {\n tags: tags.map(tag => tag.toJSON()),\n references: references.map(reference => reference.toJSON()),\n transcription\n };\n const newElementIndex = parsedPageNumberInput - 1;\n const newDocument = await api.updateCollectionDocumentElement(\n document.id,\n elementIndex,\n updates,\n newElementIndex\n );\n NotificationManager.success(T('page.document.pageSaved'));\n setDocumentJson(newDocument);\n if (elementIndex !== newElementIndex) {\n saved.current = true;\n history.replace(`/documents/${id}/${newElementIndex}`);\n }\n };\n\n const handleClickedCancel = () => {\n const tags = page ? page.tags.map(tag => DocumentTag.fromJSON(tag, tagDefinitions)) : [];\n setTags(tags);\n setTranscription(page ? page.transcription : '');\n setPageNumberInput((elementIndex + 1).toString());\n setReferences(page ? page.references.map(reference => DocumentReference.fromJSON(reference)): []);\n };\n\n const handleClickedEdit = () => {\n const newReadOnly = !readOnly;\n dispatch(setSharedPageState(newReadOnly ? {} : { editingDocumentId: id }));\n }\n\n const editButton = !api.user.isReadOnly() && (\n \n );\n\n if (!page)\n return
; // still loading\n\n const pageViewer = <>\n \n {previousPage !== undefined && (\n \n )}\n {nextPage !== undefined && (\n \n )}\n
\n
{page.original_filename}
\n
\n ;\n\n const leftPanel = (\n \n \n \n {' '}\n {T('document.title.scans')}\n \n \n {pageViewer}\n \n \n \n );\n const rightPanel = <>\n \n
\n {!readOnly && (\n \n )}\n \n \n \n \n ;\n\n const sharedPageState: ISharedPageState = readOnly ? {} : { editingDocumentId: id };\n return (\n \n \n {!readOnly && (\n \n \n {T('generic.action.cancel')}\n \n \n {T('document.save')}\n \n \n )}\n \n );\n}\n","import React, { ReactNode } from 'react';\nimport { Colors } from \"../../../config/styles\";\n\nconst textStyle = {\n fontSize:18,\n textDecorationLine: 'uppercase',\n color: Colors.lightGray,\n}\n\ninterface EmptyMessageProps {\n message: string\n height?: string | number\n children?: ReactNode\n}\n\nconst EmptyMessage = (props: EmptyMessageProps) => {\n const { message, children } = props;\n\n const height = props.height ?? '100%'\n\n return (\n
\n

\n {children ? children : message}\n

\n
)\n}\n\nexport default EmptyMessage;\n","import React, { CSSProperties } from 'react';\nimport { IDocument } from \"../../models/IDocument\";\nimport { Badge, Card } from \"react-bootstrap\";\nimport { Colors, TextStyles } from \"../../config/styles\";\nimport EmptyMessage from \"../../pages/EditPerson/components/EmptyMessage\";\nimport { T } from \"../../Translate\";\nimport { LoadingIcon } from \"../../components/Icons\";\n\n\n\nconst styleColumn: CSSProperties = {width: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'flex-start', alignItems: 'flex-start'}\nconst styleRow: CSSProperties = {width: '100%', display: 'flex', flexDirection: 'row', justifyContent: 'flex-start', alignItems: 'center'}\n\n\n\ninterface MoveDocumentPreviewProps {\n document?: IDocument\n isLoading: boolean\n}\n\nconst MoveDocumentPreview = (props: MoveDocumentPreviewProps) => {\n\n const { document, isLoading } = props\n\n if (!document)\n return (\n \n \n \n {isLoading &&  }\n \n \n \n )\n\n return (\n \n \n
\n
\n
\n
{document.title}
\n
\n
\n \n
{document._id}
\n
\n
\n
\n

\n {document?.description ?? '...'}\n

\n
\n
\n
\n
\n
\n );\n}\n\nexport default MoveDocumentPreview\n","import React, { useEffect, useState } from 'react';\nimport { ModalProps, useModal } from '../BaseModal';\nimport { T } from '../../Translate';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { Modal, Button } from 'react-bootstrap';\nimport { ModalHeader } from '../ModalHeader';\nimport { IDocument } from \"../../models/IDocument\";\nimport { ButtonLink } from \"../../components/ButtonLink\";\nimport { TextStyles } from \"../../config/styles\";\nimport MoveDocumentPreview from \"./MoveDocumentPreview\";\nimport api from \"../../api\";\nimport { CheckboxInput } from \"../../components/inputs/CheckboxInput\";\n\n\n\nexport interface IMoveToDocumentResult {\n document?: IDocument,\n root?: boolean\n}\n\ninterface IMoveToDocumentModalProps extends ModalProps{\n isSubDocument: boolean\n}\n\nconst MoveToDocumentModal = (props: IMoveToDocumentModalProps) => {\n const [isOpen, resolve] = useModal(props);\n\n const [isLoading, setIsLoading] = useState(false);\n const [inputDocumentId, setInputDocumentId] = useState('');\n const [selectedDocumentId, setSelectedDocumentId] = useState(undefined)\n const [documentForId, setDocumentForId] = useState(undefined)\n const [checkRoot, setCheckRoot] = useState(false)\n\n /*** api ***/\n\n const loadDocument = async (id: string | undefined) => {\n if (!id) {\n setDocumentForId(undefined)\n return\n }\n\n try {\n setIsLoading(true)\n const loadedDocument = await api.getCollectionDocument(id)\n setDocumentForId(loadedDocument)\n } catch (e) {\n setDocumentForId(undefined)\n } finally {\n setIsLoading(false)\n }\n }\n\n /*** effects ***/\n\n useEffect( () => {\n loadDocument(selectedDocumentId)\n },[selectedDocumentId])\n\n useEffect(() => setSelectedDocumentId(undefined), [inputDocumentId, checkRoot]);\n\n /*** Handlers ***/\n\n const handleSearchButtonPressed = async () => {\n if (inputDocumentId) {\n setSelectedDocumentId(inputDocumentId)\n }\n }\n\n const handleClose = () => resolve({document: undefined, root: false});\n\n const handleClickedExecute = () => resolve({document: documentForId, root: checkRoot})\n\n /*** Rendering ***/\n\n return (\n \n {T('modal.movedocument.title')}\n\n \n {/*Intro text */}\n \n {props.isSubDocument ? T('modal.movedocument.subdocument.message') : T('modal.movedocument.page.message')}\n \n\n
\n\n {/* Checkbox for root */}\n \n\n {/*UUID input with error indication*/}\n {\n setInputDocumentId(input)\n }}\n placeholder={T('model.movedocument.documentId.placeholder')}\n readOnly={checkRoot}\n />\n\n {/*Check button*/}\n
\n \n {T('model.movedocument.documentId.search')}\n \n
\n\n {/*Document Preview*/}\n \n\n \n
\n\n \n \n \n \n
\n );\n}\n\nexport default MoveToDocumentModal;\n","import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport moment from 'moment';\nimport { Page, PageProps } from '../Page';\nimport api from '../../api';\nimport {\n Document,\n DocumentStatus,\n IDocument,\n IDocumentSubdocument,\n DocumentCategory,\n DocumentKind,\n IDocumentPage\n} from '../../models/Document';\nimport { Button, Col, Row, Card, Dropdown, DropdownButton, ButtonGroup, Badge } from 'react-bootstrap';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { Dispatch } from 'redux';\nimport { T } from '../../Translate';\nimport { AnyAppAction, registerContactMomentContributionAction, setSharedPageState } from '../../redux/Actions';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { DocumentReference, DocumentReferenceType } from '../../models/DocumentReference';\nimport { AppState, ISharedPageState } from '../../redux/State';\nimport { Icon } from '../../components/Icons';\nimport { ActiveContactMoment } from '../../models/ActiveContactMoment';\nimport { BottomButtonRow, ButtonRowTop } from '../../components/ButtonRow';\nimport { DocumentElementPreview } from './DocumentElementPreview';\nimport { UnsavedChangesModal } from '../../modals/UnsavedChangesModal';\nimport styles from './index.module.scss';\nimport { PageFileUploader } from '../../components/FileUploader';\nimport { classes } from '../../utils/Styles';\nimport { CenteredPane } from '../../components/CenteredPane';\nimport { useContactPersonEventsForDocument, useDocument, useDocumentTagDefinitions } from '../../FunctionalAPI';\nimport { DocumentCollection } from '../../models/Collection';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { NotificationManager } from 'react-notifications';\nimport { useAppSelector } from '../../utils/Functional';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\nimport { CheckAdlibCodeResult } from '../../models/CheckAdlibCodeResult';\nimport { getFormStateForDocument, didFormStateChange, IDocumentFormState } from './DocumentFormState';\nimport EditDocumentForm from './EditDocumentForm';\nimport { ImageViewer } from \"../EditDocumentPage/ImageBrowser\";\nimport { ButtonLink } from \"../../components/ButtonLink\";\nimport { Colors, TextStyles } from \"../../config/styles\";\nimport { getFiletype } from \"../EditDocumentPage\";\nimport { getErrorDescription, getErrorName, IValidationResult } from \"../../models/ValidationResult\";\nimport MoveToDocumentModal, { IMoveToDocumentResult } from \"../../modals/MoveDocument/MoveToDocumentModal\";\nimport PageLink from \"../../components/PageLink\";\n\nfunction createEmptyDocument(\n category: DocumentCategory,\n adlibInfo: CheckAdlibCodeResult = { type: 'invalid' },\n references: DocumentReference[] = []\n) {\n const title = adlibInfo.type === 'document' ? adlibInfo.title : undefined;\n const description = adlibInfo.type === 'document' ? adlibInfo.description : undefined;\n const adlibId = adlibInfo.type !== 'invalid' ? adlibInfo.id : undefined;\n const adlibCode = adlibInfo.type !== 'invalid' ? adlibInfo.code : undefined;\n\n const collection = adlibInfo.type === 'collection'\n ? DocumentCollection.fromJSON(adlibInfo.collection)\n : undefined;\n\n return new Document(\n '',\n category,\n DocumentKind.Digital,\n undefined,\n undefined,\n [],\n DocumentStatus.Todo,\n false,\n [],\n references,\n [],\n title,\n description,\n moment(),\n moment(),\n false,\n collection && collection.id,\n collection,\n undefined,\n adlibId,\n adlibCode\n );\n}\n\ninterface DocumentAnnotatorPageProps extends PageProps {\n id?: string;\n collection?: string;\n category?: DocumentCategory;\n code?: string;\n ref_type?: 'person'|'place'|'memorial'|'military_entity'\n ref_id?: string\n ref_name?: string\n}\n\n\nexport default (props: DocumentAnnotatorPageProps) => {\n\n const {\n id,\n history,\n category = DocumentCategory.Adlib,\n code,\n loading,\n via,\n ref_id,\n ref_type,\n ref_name\n } = props;\n\n /*** provider ***/\n\n const modals = useModalContext();\n\n /*** state & variables ***/\n\n const readOnlyFromState = useAppSelector(state => state.sharedPageState.editingDocumentId) !== id;\n const readOnly = api.user.isReadOnly() || readOnlyFromState;\n\n const [adlibInfo, setAdlibInfo] = useState();\n const [fullscreenPage, setFullScreenPage] = useState(undefined)\n\n\n const [ignoreNavigationCheck, setIgnoreNavigationCheck] = useState(false);\n const [selectedIndexes, setSelectedIndexes] = useState([]);\n const [references, setReferences] = useState([]);\n const contactMoment = useSelector(\n state => state.activeContactMoment.current\n );\n const tagDefinitions = useDocumentTagDefinitions(loading);\n const [loadedDocument,, setLoadedDocument] = useDocument(loading, id);\n const [contactEvent] = useContactPersonEventsForDocument(loading, id);\n\n const document = useMemo(\n () => (loadedDocument && Document.fromJSON(loadedDocument, tagDefinitions))\n || createEmptyDocument(category, adlibInfo, references),\n [loadedDocument, tagDefinitions, category, adlibInfo/*, references*/]\n );\n\n const originalFormState = useMemo(() => {\n return getFormStateForDocument(document);\n }, [document]);\n const [formState, setFormState] = useState(getFormStateForDocument(document));\n\n const documentCategory = document.category;\n const hasFiles = documentCategory === DocumentCategory.AdlibCollectionDocument || documentCategory === DocumentCategory.Digital;\n\n const dispatch = useDispatch>();\n\n /*** effects **/\n\n useEffect(() => {\n if (!code)\n return;\n\n api.checkAdlibCode(code).then((newAdlibInfo) => {\n setAdlibInfo(newAdlibInfo)\n });\n }, [code]);\n\n\n useEffect(() => {\n setFormState(originalFormState)\n }, [originalFormState]);\n\n useEffect(() => {\n setReferences(document.references);\n setSelectedIndexes([]);\n }, [document]);\n\n const updateFormState = useCallback((updates: Partial) => {\n setFormState(state => Object.assign({}, state, updates));\n }, []);\n\n useEffect(() => {\n if (ref_id && ref_name && ref_type) {\n const newReferences = [new DocumentReference(ref_id, ref_type as DocumentReferenceType, ref_name)]\n updateFormState({references: newReferences })\n }\n }, [ref_id, ref_name, ref_type, updateFormState]);\n\n useEffect(() => {\n setReferences(formState.references)\n }, [formState])\n\n const {\n kind,\n source,\n title,\n description,\n institution,\n inventoryId,\n url,\n wiseProfile,\n wiseBranch,\n wiseLocation,\n wiseId,\n pages,\n status,\n disclosed,\n tags,\n } = formState;\n\n const tagsHaveChanged = useMemo(() => {\n if (document.tags.length !== tags.length)\n return true;\n\n for (let i = 0; i < tags.length; i++) {\n if (!document.tags[i].equals(tags[i]))\n return true;\n }\n\n return false;\n }, [document, tags]);\n\n const referencesHaveChanged = useMemo(() => {\n if (document.references.length !== references.length)\n return true;\n\n for (let i = 0; i < references.length; i++) {\n if (document.references[i].id !== references[i].id)\n return true;\n }\n\n return false;\n }, [document, references]);\n\n const contentHasChanged = (\n didFormStateChange(originalFormState, formState)\n || tagsHaveChanged\n || referencesHaveChanged\n );\n\n const confirmNavigation = useCallback(() => {\n // Do not warn the user to save the content before navigating to another page\n // when content has not changed or when we just saved a new document and\n // navigate to it.\n if (!contentHasChanged || ignoreNavigationCheck)\n {\n setIgnoreNavigationCheck(false)\n return Promise.resolve(true);\n }\n\n modals.show(UnsavedChangesModal);\n setIgnoreNavigationCheck(false)\n return Promise.resolve(false);\n }, [modals, contentHasChanged, ignoreNavigationCheck]);\n\n const handleDocumentUpdated = (newDocumentJson: IDocument) => {\n setLoadedDocument(newDocumentJson);\n };\n\n const handleClickedSaveNew = async () => {\n const validationResult = await api.validateCollectionDocument(stateToDocument() as IDocument, 'create')\n if (validationResult.status !== 'OK') {\n setValidationErrors(validationResult)\n NotificationManager.error(T('documents.messages.saveFailed'))\n return\n }\n const created = await api.createCollectionDocument({\n category: category || DocumentCategory.Adlib,\n collection_id: document.collectionId || undefined,\n kind,\n status,\n disclosed,\n tags: tags.map(tag => tag.toJSON()),\n references: references.map(reference => reference.toJSON()),\n title: title || null,\n description: description || null,\n source,\n\n adlibId: document.adlibId,\n adlibCode: document.adlibCode,\n\n institution,\n inventoryId,\n\n url,\n\n wiseProfile,\n wiseBranch,\n wiseLocation,\n wiseId,\n pages\n });\n setIgnoreNavigationCheck(true);\n NotificationManager.success(T('page.document.saved'));\n history.push(`/documents/${created._id}`);\n };\n\n /**\n * Make an IDocument instance from this component state\n */\n const stateToDocument = (): IDocument => {\n const newDocument: Document = Document.fromProps({\n id: document.id,\n kind,\n category: document.category,\n status,\n disclosed,\n tags,\n references,\n title: title || '',\n description: description || null,\n institution,\n inventoryId,\n source,\n url,\n referenced_entities: document.referenced_entities,\n elements: document.elements,\n wiseProfile,\n wiseBranch,\n wiseLocation,\n wiseId,\n pages})\n const jsonDocument: IDocument = newDocument.toJSON()\n return jsonDocument\n }\n\n const setValidationErrors = (result: IValidationResult | undefined): boolean => {\n if (result && result.status !== 'OK') {\n // reset the error state variables\n const errors = result.data || {}\n setFormState(Object.assign({}, formState, {\n titleError: getErrorDescription(errors.title),\n urlError: getErrorDescription(errors.url)\n }));\n }\n return true;\n };\n\n const handleClickedSaveExisting = async () => {\n const validationResult = await api.validateCollectionDocument(stateToDocument() as IDocument, 'update')\n if (validationResult.status !== 'OK') {\n setValidationErrors(validationResult)\n NotificationManager.error(T('documents.messages.saveFailed'))\n return\n }\n\n const savedDocument = await api.updateCollectionDocument(stateToDocument());\n\n setLoadedDocument(savedDocument);\n NotificationManager.success(T('page.document.saved'));\n\n if (contactMoment) {\n const confirm = await modals.show(props => (\n \n ));\n if (confirm) {\n dispatch(registerContactMomentContributionAction({\n type: 'document',\n targetId: savedDocument._id,\n name: Document.generateTitle(tags)\n }));\n }\n }\n };\n\n const handleClickedSave = () => {\n if (id === undefined)\n handleClickedSaveNew();\n else\n handleClickedSaveExisting();\n };\n\n const handleClickedCancel = () => {\n if (!id) {\n setIgnoreNavigationCheck(true);\n history.goBack();\n } else {\n setFormState(originalFormState);\n setReferences(document.references);\n }\n };\n\n const handleClickedRemove = async () => {\n if (!id)\n return;\n\n const validationResult = await api.validateCollectionDocument(stateToDocument() as IDocument, 'delete')\n if (validationResult.status !== 'OK') {\n for (let key in validationResult.data) {\n NotificationManager.error(getErrorName(validationResult.data[key]),\n T('documents.messages.saveFailed'),\n 5000)\n }\n return\n }\n\n const result = await modals.show(props => (\n \n ));\n if (!result)\n return;\n\n await api.removeCollectionDocument(id);\n\n history.push(`/documentation`);\n }\n\n const handleClickedRestore = async () => {\n await api.restoreCollectionDocument(document.id);\n history.push(`/collections/${document.collectionId}`);\n };\n\n const handleClickedMoveToNewSubdocument = async () => {\n if (!id)\n return;\n\n // Add the new subdocument to the start of the elements\n const { subdocument } = await api.addCollectionDocumentSubdocument(id, selectedIndexes[0]);\n\n // Because we added the new index to the start of the elements, all existing elements shift to the right\n // and we have to increase the selected indeces by 1.\n const newIndexes = selectedIndexes.map(index => index + 1);\n const { from } = await api.moveCollectionDocumentElements(id, subdocument._id, newIndexes)\n handleDocumentUpdated(from);\n setSelectedIndexes([]);\n }\n\n const handleClickedMoveToSubdocument = async (subdocument: IDocumentSubdocument) => {\n if (!id)\n return;\n\n const { from } = await api.moveCollectionDocumentElements(\n id,\n subdocument.documentId,\n selectedIndexes\n );\n handleDocumentUpdated(from);\n setSelectedIndexes([]);\n }\n\n const handleClickedMoveToMainDocument = async () => {\n if (!id)\n return;\n\n if (!document.parentId)\n return;\n\n const { from } = await api.moveCollectionDocumentElements(\n id,\n document.parentId,\n selectedIndexes\n );\n setSelectedIndexes([]);\n handleDocumentUpdated(from);\n };\n\n const handleClickedMoveDocument = async () => {\n if (!id)\n return;\n\n modals.show(props =>\n (\n // isSubDocument will enable or disable the root checkbox.\n // This should only be enabled if the selection only contains subdocuments.\n \n ))\n .then(result => {\n if (result.root) {\n return api.moveCollectionDocumentElements(id, null, selectedIndexes)\n }\n if (result.document) {\n return api.moveCollectionDocumentElements(id, result.document._id, selectedIndexes)\n }\n })\n .then(documents => {\n if (documents) {\n handleDocumentUpdated(documents.from);\n }\n setSelectedIndexes([]);\n })\n .catch(e => {\n\n })\n }\n\n\n const handleClickedElement = (index: number) => {\n const element = document.elements[index];\n if (element.type === 'page') {\n history.push(`/documents/${id}/${index}`);\n } else if (element.type === 'subdocument') {\n history.push(`/documents/${element.documentId}`);\n }\n };\n\n const handlePageUpdated = (document: IDocument|'NOK') => {\n if (document === 'NOK') {\n NotificationManager.error(T('page.document.pageUploadFailed'));\n } else {\n handleDocumentUpdated(document);\n NotificationManager.success(T('page.document.pageUploaded'));\n }\n };\n\n const handleClickedAddSubdocument = async () => {\n if (!id)\n return;\n\n const { main } = await api.addCollectionDocumentSubdocument(id);\n handleDocumentUpdated(main);\n };\n\n const handleSelectedIndex = (index: number, selected: boolean) => {\n if (selected) {\n setSelectedIndexes([...selectedIndexes, index]);\n } else {\n setSelectedIndexes(selectedIndexes.filter(i => i !== index));\n }\n };\n\n const handleClickedRemovePages = async () => {\n if (!id)\n return;\n\n const result = await modals.show(props => (\n \n ));\n if (!result)\n return;\n\n const document = await api.removeCollectionDocumentElements(id, selectedIndexes);\n setSelectedIndexes([]);\n handleDocumentUpdated(document);\n }\n\n const handleClickedEdit = () => {\n const newReadOnly = !readOnly;\n dispatch(setSharedPageState(newReadOnly ? {} : { editingDocumentId: id }));\n }\n\n const hasSelectedSubdocuments = selectedIndexes.some(\n index => index < document.elements.length && document.elements[index].type === 'subdocument'\n );\n\n const hasOnlySelectedSubdocuments = selectedIndexes.every(\n index => index < document.elements.length && document.elements[index].type === 'subdocument'\n );\n\n /*** rendering ***/\n const pageTitle = formState.title //loadedDocument ? document.title || T('page.document.untyped') : T('page.document.create.title');\n\n\n const rightPanelFullScreenPreview = () => {\n if (!fullscreenPage)\n return <>\n\n return (\n \n \n setFullScreenPage(undefined)}>\n {T('document.title.scans')}\n \n \n \n \n \n \n );\n }\n\n const rightPanelElementsCollectionView = () => {\n return (\n \n \n \n {' '}\n {T('document.title.scans')}\n \n {selectedIndexes.length > 0 && (\n \n

\n Kies een actie op jouw selectie(s):\n

\n \n {!hasSelectedSubdocuments && document.parentId === null && (\n \n \n {T('document.newSubdocument')}\n \n {document.elements.filter(element => element.type === 'subdocument').map(element => {\n const subdocument = element as IDocumentSubdocument;\n const key = subdocument.documentId;\n const title = (subdocument.document && Document.fromJSON(subdocument.document, tagDefinitions).title) || T('document.noTitle');\n return (\n handleClickedMoveToSubdocument(subdocument)}>{title}\n );\n })}\n \n )}\n {document.parentId !== null && (\n \n )}\n {(\n \n )}\n \n \n
\n )}\n \n {document.elements.map((element, index) => (\n handleClickedElement(index)}\n onSelected={selected => handleSelectedIndex(index, selected)}\n onPreview={selected => setFullScreenPage(selected)}\n tagDefinitions={tagDefinitions}\n showTitle={true}\n />\n ))}\n {!hasFiles && (\n \n {T('page.document.uploadsNotSupported')}\n \n )}\n {hasFiles && id === undefined && (\n \n {T('document.saveBeforeAddingPages')}\n \n )}\n {hasFiles && !readOnly && id && <>\n \n {document.parentId === null && (\n \n )}\n }\n \n
\n\n
\n )\n }\n\n const leftPanel = (\n \n );\n\n const rightPanel = fullscreenPage ? rightPanelFullScreenPreview() : rightPanelElementsCollectionView()\n\n const sharedPageState: ISharedPageState = readOnly ? {} : { editingDocumentId: id };\n let translatedVia = via;\n let viaTitle = undefined;\n if (via === 'c') {\n if (loadedDocument && loadedDocument.collection) {\n translatedVia = `${PageID.ViewCollection}+${loadedDocument.collection._id}`;\n viaTitle = DocumentCollection.fromJSON(loadedDocument.collection).composedTitle();\n } else {\n translatedVia = PageID.None;\n viaTitle = '...';\n }\n }\n\n return (\n \n {document.parentId && (\n
\n SUB{T('document.subdocument.open.parent')}\n
\n )}\n \n
{leftPanel}\n {rightPanel}\n \n\n {!readOnly && (\n \n {id && (document.deleted\n ? (\n \n ) : (\n \n )\n )}\n \n {T('generic.action.cancel')}\n \n \n {T('document.save')}\n \n \n )}\n \n );\n}\n\ninterface AddPageControlProps {\n documentId: string;\n documentElement: number;\n onPageUploaded: (document: IDocument|'NOK') => void;\n}\nconst AddPageControl = (props: AddPageControlProps) => {\n const { documentId, documentElement, onPageUploaded } = props;\n return (\n
\n \n
\n );\n};\n\ninterface AddSubdocumentControlProps {\n onClickedAddSubdocument: () => void;\n}\nconst AddSubdocumentControl = (props: AddSubdocumentControlProps) => {\n const { onClickedAddSubdocument } = props;\n return (\n
\n
\n \n {T('document.addSubdocument')}\n
\n
\n );\n}\n","import { getActiveLanguage, T, TranslationKey } from \"../Translate\";\nimport { IPlace, Place } from \"./Place\";\nimport { IAttachment } from \"./Attachment\";\n\nexport enum MemorialType {\n FieldGrave = 'fieldgrave',\n Plate = 'plate',\n Cemetery = 'cemetery',\n Document = 'document',\n}\nexport const MemorialTypes = [\n MemorialType.Plate,\n MemorialType.Cemetery,\n MemorialType.FieldGrave,\n MemorialType.Document\n];\nconst MemorialTypeTranslations: { [key: string]: TranslationKey } = {\n [MemorialType.FieldGrave]: 'memorial.type.fieldgrave',\n [MemorialType.Plate]: 'memorial.type.plate',\n [MemorialType.Cemetery]: 'memorial.type.cemetery',\n [MemorialType.Document]: 'memorial.type.document'\n}\nexport function translateMemorialType(type: MemorialType): string {\n return T(MemorialTypeTranslations[type]) || type;\n}\n\nexport enum CemeteryKind {\n Military = 'military',\n Civilian = 'civilian'\n}\nexport function translateCemeteryKind(kind: CemeteryKind): string {\n return kind === CemeteryKind.Military ? T('memorial.cemeteryKind.military') : T('memorial.cemeteryKind.civilian');\n}\n\nexport enum PlateDetails {\n Private = 'private',\n Organisation = 'organisation',\n Community = 'community',\n Military = 'military'\n}\nconst PlateDetailTranslations: { [key: string]: TranslationKey } = {\n [PlateDetails.Private]: 'memorial.plateKind.private',\n [PlateDetails.Organisation]: 'memorial.plateKind.organisation',\n [PlateDetails.Community]: 'memorial.plateKind.community',\n [PlateDetails.Military]: 'memorial.plateKind.military'\n}\nexport function translatePlateDetails(plate: PlateDetails): string {\n return T(PlateDetailTranslations[plate]) || plate;\n}\n\nconst PlateDetailTranslationsShort: { [key: string]: TranslationKey } = {\n [PlateDetails.Private]: 'memorial.plateKind.private',\n [PlateDetails.Organisation]: 'memorial.plateKind.organisationShort',\n [PlateDetails.Community]: 'memorial.plateKind.community',\n [PlateDetails.Military]: 'memorial.plateKind.military'\n}\nfunction translatePlateDetailsShort(plate: PlateDetails): string {\n return T(PlateDetailTranslationsShort[plate]) || plate;\n}\n\nexport function describeMemorialKind(memorial: IMemorial): string {\n switch (memorial.type) {\n case MemorialType.Plate:\n return (memorial.type_plate_details ? translatePlateDetailsShort(memorial.type_plate_details) + ' ' : '') + T('memorial.type.plate');\n case MemorialType.Cemetery:\n // TODO: FORMER?\n return (memorial.type_cemetery_details ? translateCemeteryKind(memorial.type_cemetery_details.kind) + ' ' : '') + T('memorial.type.cemetery');\n default:\n return translateMemorialType(memorial.type);\n }\n}\n\nexport function desribeMemorialPlace(memorial: IMemorial): string {\n if (!memorial.extend_place)\n return ''\n return new Place(memorial.extend_place).describe(getActiveLanguage())\n}\n\nexport enum GetMemorialOption {\n NumberOfPersons = 'EXTEND_NBR_OF_PERSONS',\n PlaceNames = 'EXTEND_PLACE_NAMES',\n Place = 'EXTEND_PLACE',\n Attachments = 'EXTEND_ATTACHMENTS'\n}\n\nexport interface IMemorialFields {\n type: MemorialType;\n type_cemetery_details: {\n kind: CemeteryKind,\n exists: boolean;\n nationality: string;\n }\n type_plate_details?: PlateDetails;\n name: string;\n alternative_names: string[];\n address: string;\n address_loc: { lat: number, lon: number };\n position_locked: boolean;\n description: string;\n start_day: string|null;\n start_month: string|null;\n start_year: string|null;\n start_date: string|null;\n calc_place_name: string;\n calc_place_loc: { lat: number, lon: number };\n calc_place_country: string;\n address_positioned: boolean;\n place_id?: string;\n british_trench_coordinates?: string;\n}\n\nexport interface IMemorial extends IMemorialFields {\n _id: string;\n\n filter: string;\n\n extend_nbr_of_persons?: number;\n extend_place_names?: { [key: string]: string };\n extend_place?: IPlace;\n attachments?: IAttachment[];\n}\n","import React from \"react\";\nimport { IMemorial } from \"../../models/Memorial\";\nimport { Place } from \"../../models/Place\";\nimport { getActiveLanguage } from \"../../Translate\";\nimport { Badge } from \"react-bootstrap\";\n\ninterface MemorialPlaceViewProps {\n memorial: IMemorial;\n}\n\nexport const MemorialPlaceView = (props: MemorialPlaceViewProps) => {\n const { memorial } = props;\n\n const memorialPlaceViewWithoutPlace = (memorial: IMemorial) => {\n return - \n }\n\n const memorialPlaceViewWithPlace = (memorial: IMemorial) => {\n // Show nothing if the memorial does not hold any place information\n if (!memorial.extend_place) {\n return <>\n }\n\n // We will split the place description ( a comma separated list of strings ) on 2 lines\n const commaSeparatedString: string = new Place(memorial.extend_place).describe(getActiveLanguage())\n const elements = commaSeparatedString.split(', ')\n\n // We make a two views that we will show on these separate lines\n // the first view holds the first 2 elements of the place description\n // the second view holds the rest\n let firstViews: JSX.Element[] = [];\n let secondViews: JSX.Element[] = [];\n\n if (elements.length <= 2) {\n // just show the full place description if it does not exist of more then 2 elements\n firstViews.push({commaSeparatedString})\n } else {\n // join the first 2 elements with `, `\n const firstViewText = elements.slice(0,2).join(', ')\n\n // join all elements after the first 2 with `, `\n const secondViewText = elements.slice(2,elements.length).join(', ')\n\n // make a component view for it\n firstViews.push({firstViewText})\n secondViews.push({secondViewText})\n }\n\n return (\n <>\n
{firstViews}
{secondViews}
\n \n )\n }\n\n // 2 different ways to display place info, \n // based on if place info is available\n if (memorial.extend_place) {\n return memorialPlaceViewWithPlace(memorial);\n } else {\n return memorialPlaceViewWithoutPlace(memorial);\n }\n\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Icon } from '../../components/Icons';\nimport { plural, T } from '../../Translate';\nimport {\n ActionsTableColumn,\n ColumnAlign, ComponentTableColumn,\n ITableColumn,\n StringFieldTableColumn,\n StringTableColumn,\n tableRowActions,\n TableRowActionStyle\n} from '../../components/table/Fields';\nimport { describeMemorialKind, desribeMemorialPlace, GetMemorialOption, IMemorial } from '../../models/Memorial';\nimport api from '../../api';\nimport { IQueryResult } from '../../models/Generic';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { NotificationManager } from 'react-notifications';\nimport { ListPage, ListState } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { usePageState } from '../../redux/Actions';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { PageID } from '../../utils/PageLinking';\nimport { MemorialPlaceView } from \"./MemorialPlaceView\";\n\nexport type ListMemorialsStateProps = ListState;\n\nfunction getSortColumn(column: string) {\n return column === 'place' ? 'calc_place_name' : column;\n}\n\nconst rowKey = (memorial: IMemorial) => memorial._id;\nconst PageSize = 10;\n\nexport default (props: PageProps) => {\n const { history, loading, via } = props;\n\n const modals = useModalContext();\n const user = api.user;\n\n const [pageState, updatePageState] = usePageState('memorials');\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n const [items, setItems] = useState>();\n\n const refresh = useCallback(() => {\n loading.loading(api.findMemorials(\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]],\n [GetMemorialOption.NumberOfPersons, GetMemorialOption.PlaceNames, GetMemorialOption.Place]\n ), plural('memorial'))\n .then(setItems);\n }, [loading, filter, tablePage, sortColumn, sortDirection]);\n useEffect(refresh, [refresh]);\n\n const columns = useMemo(() => {\n const handleClickedDelete = (memorial: IMemorial) => {\n modals.show(props => (\n \n )).then(confirmed => {\n if (!confirmed)\n return;\n\n api.removeMemorial(memorial._id).then(() => {\n NotificationManager.success(T('modal.removeMemorial.removed'));\n refresh();\n });\n });\n }\n\n const columns: ITableColumn[] = [\n new ComponentTableColumn('name', T('memorial.name'),memorial => {memorial.name} , { ellipsize: true, sortable: true, clickable: true }),\n new StringTableColumn('type', T('memorial.type'), memorial => describeMemorialKind(memorial), { sortable: false }),\n new ComponentTableColumn('place', T('memorial.place'), memorial => , {sortable: true, clickable: true}),\n new StringTableColumn('numPersons', '#', memorial => (memorial.extend_nbr_of_persons || 0).toString(), { sortable: false, width: 120, align: ColumnAlign.Right })\n ];\n if (user.canEdit()) {\n columns.push(new ActionsTableColumn('actions', T('generic.list.actions'), memorial => tableRowActions(\n { icon: Icon.Edit, style: TableRowActionStyle.Success, page: PageID.EditMemorial, pageParam: memorial._id },\n { icon: Icon.TimesCircle, style: TableRowActionStyle.Danger, onClick: handleClickedDelete }\n ), { width: 100 }));\n }\n return columns;\n }, [user, modals, refresh]);\n\n const handleClickedAdd = () => {\n history.push('/memorials/create');\n };\n\n const handleClickedRow = (memorial: IMemorial) => {\n history.push(`/memorials/${memorial._id}`);\n };\n\n return (\n \n );\n}\n","import React from 'react';\nimport { Place, getResolutionStatusColor, getResolutionStatusName } from '../../models/Place';\nimport { T } from '../../Translate';\nimport { Icon } from '../Icons';\nimport styles from './PlaceInput.module.scss';\n\ninterface PlaceInputOptionProps {\n value: string;\n item?: Place;\n searching: boolean;\n}\n// has to be a class because of the autocomplete input breaking on functional components\n// (functional components don't support refs)\nexport default class PlaceInputOption extends React.PureComponent {\n render() {\n const { value, item, searching } = this.props;\n return item === undefined ? (\n
{\n value.length === 0\n ? T('component.search.typeToSearch')\n : (searching ? T('component.search.searching') : T('component.search.noResults'))\n }
\n ) : (\n
\n
\n \n
\n
\n
{item.name} ({getResolutionStatusName(item.status)})
\n
{item.describeHierarchy()}
\n
\n
\n );\n }\n}\n","import React, { useMemo } from 'react';\nimport { IPlace, Place, getResolutionStatusColor } from '../../models/Place';\nimport styles from './PlaceInput.module.scss';\nimport { Icon } from '../Icons';\nimport PageLink from '../PageLink';\nimport { PageID } from '../../utils/PageLinking';\nimport { ButtonLink } from '../ButtonLink';\n\ninterface PlaceInfoProps {\n place: IPlace;\n target?: string;\n onClickedClear?: () => void;\n}\n\nexport default (props: PlaceInfoProps) => {\n const { place, target, onClickedClear } = props;\n const name = useMemo(() => new Place(place).describe(), [place]);\n\n return (\n
\n \n {name}\n \n {onClickedClear && (\n \n \n \n )}\n
\n );\n}\n","import React, { useState, CSSProperties, Fragment, useEffect } from 'react';\nimport { IPlace, Place } from '../../models/Place';\nimport { Icon } from '../Icons';\nimport { InputGroup } from 'react-bootstrap';\n\nimport styles from './PlaceInput.module.scss';\nimport { useElementID } from '../../utils/ElementID';\nimport api from '../../api';\nimport { TextMode } from '../../models/SpecialFunction';\nimport { InvalidFeedback } from './InvalidFeedback';\nimport { SortDirection } from '../table/Table';\nimport PlaceInputOption from './PlaceInputOption';\nimport PlaceInfo from './PlaceInfo';\nimport { AsyncTypeahead, Highlighter, TypeaheadMenuProps } from \"react-bootstrap-typeahead\";\nimport { T } from \"../../Translate\";\nimport { useModalContext } from '../../modals/ModalContext';\nimport { CreatePlaceModal } from '../../modals/CreatePlace';\n\ninterface PlaceInputProps {\n labelColumns?: number;\n\n label: string;\n value: IPlace|undefined;\n name: string;\n placeholder?: string;\n error?: string;\n target?: string\n\n onChange: (place: IPlace|undefined) => void;\n}\n\nexport const PlaceInput = (props: PlaceInputProps) => {\n const {\n labelColumns = 4,\n label,\n value,\n placeholder = label,\n onChange,\n error,\n target\n } = props;\n\n const modals = useModalContext();\n\n const handleClickedAdd = async () => {\n const place = await modals.show(props => (\n \n ));\n\n if (place) {\n onChange(place);\n }\n };\n\n const [inputText, setInputText] = useState(value ? new Place(value).name : '');\n\n useEffect(() => {\n setInputText(value ? new Place(value).name : '');\n }, [value])\n\n const handleSelected = (selected: Place) => onChange(selected.place);\n const handleClickedClear = () => onChange(undefined);\n\n const id = useElementID('input');\n return (\n
\n \n
\n \n {\n setInputText(text)\n }}\n onSelected={handleSelected}\n />\n
\n
\n \n
\n
\n
\n {value && }\n {error && }\n
\n
\n );\n};\n\ninterface PlaceInputComponentProps {\n place: Place|undefined;\n value: string;\n placeholder?: string;\n onChange: (value: string) => void;\n onSelected: (value: Place) => void;\n style?: CSSProperties;\n searchMode?: TextMode;\n}\ninterface PlaceInputComponentState {\n options: Place[];\n inputValue?: string;\n modal: null|JSX.Element;\n isLoading: boolean;\n}\n\nconst labelKey = (object: Object): string => {\n const place = object as Place\n if (place) {\n return place.nameWithAlternatives;\n } else {\n return '???'\n }\n}\n\nexport class PlaceInputComponent extends React.PureComponent {\n requestTimer?: NodeJS.Timer;\n\n constructor(props: PlaceInputComponentProps) {\n super(props);\n\n this.state = {\n options: [],\n modal: null,\n inputValue: props.value,\n isLoading: false\n };\n }\n\n componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot?: any): void {\n this.setState({...this.state, inputValue: this.props.value})\n }\n\n handleValueChanged = (newValue: string) => {\n let value = newValue;\n // is this a valid uuid?\n let match = value.match(/.*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})/);\n if (match) {\n this.setState({ isLoading: true, options: [] });\n api.getPlace(match[1])\n .then(result => {\n if (match && result)\n this.handleSelected('', new Place(result));\n })\n .finally(\n () => {\n this.setState({isLoading: false})\n }\n );\n } else {\n this.scheduleSearch(value);\n }\n\n this.props.onChange(value);\n }\n\n handleSelected = (value: string, object: Object) => {\n const item = object as Place;\n if (item) {\n this.props.onSelected(item);\n this.setState({options: []});\n }\n }\n\n scheduleSearch(value: string) {\n if (this.requestTimer) {\n clearTimeout(this.requestTimer);\n this.requestTimer = undefined;\n }\n\n if (!value) {\n this.setState({ options: [] });\n } else {\n this.requestTimer = setTimeout(() => this.searchPlaces(), 500);\n }\n }\n\n searchPlaces() {\n this.requestTimer = undefined;\n const { searchMode } = this.props || TextMode.Head;\n api.findPlaces(this.props.value, 0, 100, [['name', SortDirection.Up]], undefined, searchMode)\n .then(places => {\n\n // only use the first 100 places\n let maxNumberOfPlaces = places.data.length > 100 ? 100 : places.data.length;\n\n this.setState({\n options: places.data.slice(0,maxNumberOfPlaces).map(place => new Place(place))\n })});\n }\n\n render() {\n const { value } = this.props;\n const { options } = this.state;\n\n let typeAheadProps = {\n renderMenuItemChildren : (reference: Place, props: TypeaheadMenuProps, index: number) => {\n const search = reference.nameWithAlternatives\n return (\n \n \n {search}\n \n
\n \n
\n
\n )\n }\n };\n\n return (\n true}\n options={options}\n defaultInputValue={this.state.inputValue}\n labelKey={labelKey}\n selected= {this.state.inputValue === '' ? [] : undefined}\n placeholder={this.state.inputValue}\n emptyLabel={T('component.search.noResults')}\n onSearch={this.handleValueChanged}\n onChange={(selected => {this.handleSelected('', selected[0])})}\n isLoading={this.state.isLoading}\n />\n )\n\n }\n}\n","import React from \"react\";\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface FormGroupProps {\n id?: string;\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n error?: string;\n\n children: React.ReactNode;\n}\n\nexport default function FormGroup(props: FormGroupProps) {\n const { id, labelColumns = 4, inputColumns, label, error, children } = props;\n return (\n
\n \n
\n {children}\n {error && }\n
\n
\n );\n}\n","import { Form } from 'react-bootstrap';\n\nimport { MapMarkerInputValue } from './MapMarkerInput';\nimport { useElementID } from '../../utils/ElementID';\nimport FormGroup from './FormGroup';\n\ninterface MapCoordinatesInputProps {\n labelColumns?: number;\n\n name: string;\n label: string;\n position: MapMarkerInputValue;\n placeholderLat?: string;\n placeholderLon?: string;\n error?: string;\n disabled?: boolean;\n\n /**\n * callback when lat & lon changes\n * @param place is undefined if lat and lon are empty\n */\n onChange: (position: MapMarkerInputValue) => void;\n}\n\nexport const MapCoordinatesInput = (props: MapCoordinatesInputProps) => {\n const {\n labelColumns = 4,\n name,\n label,\n position,\n placeholderLat,\n placeholderLon,\n onChange,\n error,\n disabled\n } = props;\n\n const id = useElementID('input');\n return (\n \n
\n
\n onChange(position.withLatValue(e.currentTarget.value))}\n isInvalid={error !== undefined}\n disabled={disabled}\n />\n
\n
\n onChange(position.withLonValue(e.currentTarget.value))}\n isInvalid={error !== undefined}\n disabled={disabled}\n />\n
\n
\n
\n );\n};\n","import 'bootstrap-notify';\nimport { Icon } from \"../components/Icons\";\nimport { NotificationManager } from 'react-notifications';\nimport '../components/Notifications.scss';\n\ninterface NotificationSettings {\n icon?: Icon;\n message: string;\n timeout?: number;\n style?: 'primary'|'info'|'success'|'warning'|'danger';\n}\n\nexport function showNotification(settings: NotificationSettings) {\n const { message, timeout = 3000, style = 'primary' } = settings;\n switch (style) {\n case 'primary':\n case 'success':\n NotificationManager.success(message, undefined, timeout);\n break;\n case 'info':\n NotificationManager.info(message, undefined, timeout);\n break;\n case 'warning':\n NotificationManager.warning(message, undefined, timeout);\n break;\n case 'danger':\n NotificationManager.error(message, undefined, timeout);\n break;\n }\n}\n","import React, { ReactNode, useMemo } from 'react';\nimport styles from './TopTabs.module.scss';\nimport { Icon } from './Icons';\nimport { Badge, Nav, Tab } from 'react-bootstrap';\nimport { useTabState } from \"../redux/Actions\";\n\nexport type BadgeVariant =\n| 'primary'\n| 'secondary'\n| 'success'\n| 'danger'\n| 'warning'\n| 'info'\n| 'light'\n| 'dark';\n\ninterface TopTabsProps {\n id: string;\n defaultActiveKey?: string;\n activeKey?: string;\n onSelect?: (tab: string) => void;\n storeKey?: string\n tabs: TopTab[];\n}\nexport interface TopTab {\n id: string;\n title: string;\n icon: Icon;\n badgeContent?: () => string|undefined;\n badgeVariant?: BadgeVariant;\n content: () => ReactNode;\n}\n\nexport const TopTabs = (props: TopTabsProps) => {\n const { id, defaultActiveKey, tabs, activeKey, onSelect } = props;\n\n const [tabKey, setTabKey] = useTabState(props.storeKey, defaultActiveKey)\n\n const handleSelect = (tab: string|null) => {\n if (tab === null)\n return;\n \n setTabKey(tab)\n if (onSelect) {\n onSelect(tab)\n }\n }\n\n const renderedTabs = useMemo(() => tabs.map(tab => {\n const badgeVariant = tab.badgeVariant || 'secondary'\n return (\n \n \n \n {' '}\n {tab.title}\n {tab.badgeContent !== undefined && <>\n {' '}\n {tab.badgeContent()}\n }\n \n \n )}), [tabs]);\n\n const renderedContent = tabs.map(tab => (\n \n {tab.content()}\n \n ));\n \n return (\n \n
\n \n
\n \n {renderedContent}\n \n \n );\n}\n","import React, { useMemo } from 'react';\nimport { Dropdown, DropdownButton, ButtonGroup } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { DocumentCategory, getDocumentCategoryName } from '../../models/Document';\n\nconst DocumentCategories: DocumentCategory[] = [\n DocumentCategory.Archive,\n DocumentCategory.Wise,\n DocumentCategory.Digital,\n DocumentCategory.Web,\n DocumentCategory.Adlib\n];\n\ninterface AddDocumentationControlProps {\n onClickedAdd: (type: DocumentCategory) => void;\n}\nexport default (props: AddDocumentationControlProps) => {\n const { onClickedAdd } = props;\n\n const items = useMemo(() => DocumentCategories.map(type => (\n onClickedAdd(type)}>\n {getDocumentCategoryName(type)}\n \n )), [onClickedAdd]);\n return (\n \n {items}\n \n );\n}\n","import React, { useState } from 'react';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { Modal, Button, Form, Alert } from 'react-bootstrap';\nimport { ModalHeader } from '../../modals/ModalHeader';\nimport { T } from '../../Translate';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport api from '../../api';\nimport { CheckAdlibCodeResult } from '../../models/CheckAdlibCodeResult';\n\ninterface AddAdlibDocumentModalProps extends ModalProps {\n \n}\n\nexport default (props: AddAdlibDocumentModalProps) => {\n const [isOpen, resolve] = useModal(props);\n const handleClose = () => resolve(undefined);\n const [adlibCode, setAdlibCode] = useState('');\n const [error, setError] = useState();\n\n const handleClickedCreate = async () => {\n setError(undefined);\n try {\n const result = await api.checkAdlibCode(adlibCode);\n if (result.type === 'invalid') {\n setError(T('page.documentation.addAdlibDocument.invalidCode'));\n } else {\n resolve(result);\n }\n }\n catch (err) {\n if (err.code === '404.10') {\n setError(T('page.documentation.addAdlibDocument.codeNotFound'));\n } else {\n setError(err.message);\n }\n }\n };\n\n return (\n \n {T('page.documentation.addAdlibDocument.title')}\n \n
\n \n \n {error && {error}}\n
\n \n \n \n \n
\n );\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { IQueryResult } from '../../models/Generic';\nimport api from '../../api';\nimport { T, plural } from '../../Translate';\nimport { Card } from 'react-bootstrap';\nimport { updatePagesStateAction } from '../../redux/Actions';\nimport { PagePropsNoPending } from '../Page';\nimport { useAppDispatch, useAppSelector, useRefresh } from '../../utils/Functional';\nimport { SortDirection, Table } from \"../../components/table/Table\";\nimport { Search } from \"../../components/Search\";\nimport { useDelayedUpdateEffect } from \"../../utils/UpdateEffects\";\nimport { Document, DocumentCategory } from \"../../models/Document\";\nimport { useDocumentTagDefinitions } from \"../../FunctionalAPI\";\nimport { TextStyles } from \"../../config/styles\";\nimport { DocumentTagTypeInput, getFullTagName } from \"../../components/inputs/DocumentTagTypeInput\";\nimport { classes } from \"../../utils/Styles\";\nimport { Icon } from \"../../components/Icons\";\nimport AddDocumentationControl from \"../ListDocumentation/AddDocumentationControl\";\nimport { DocumentTagDefinition } from \"../../models/DocumentTagDefinition\";\nimport { CheckAdlibCodeResult } from \"../../models/CheckAdlibCodeResult\";\nimport AddAdlibDocumentModal from \"../ListDocumentation/AddAdlibDocumentModal\";\nimport { getColumns } from \"../ViewCollection/Columns\";\nimport { PagesState } from \"../../redux/State\";\nimport { ListState } from \"../ListPage\";\nimport { ListDocumentationPageState } from \"../ListDocumentation\";\nimport { getPageLinkWithVia, PageID } from \"../../utils/PageLinking\";\n\n\nconst PageSize = 10;\nconst rowKey = (item: Document) => item.id;\n\ninterface ListTabProps extends PagePropsNoPending {\n ref_id: string;\n ref_name: string;\n readonly: boolean;\n ref_type: 'person'|'place'|'memorial'|'military_entity';\n pageStateKey: K;\n}\n\nfunction useListDocumentationPageState(page: K): [ListDocumentationPageState, (updates: Partial) => void] {\n const state = useAppSelector(state => state.pagesState[page]);\n const dispatch = useAppDispatch();\n const update = (updates: Partial) => {\n dispatch(updatePagesStateAction(page, updates as Partial));\n };\n return [state as ListDocumentationPageState, update];\n}\n\n\n/**\n *\n */\nconst ListDocumentsTab = (props: ListTabProps) => {\n\n\n const { history, loading, via, modals, readonly, ref_type, ref_name, ref_id, pageStateKey } = props;\n\n /*** state ***/\n\n const [pageState, updatePageState] = useListDocumentationPageState(pageStateKey) ;\n const [items, setItems] = useState | undefined>(undefined);\n const tagDefinitions = useDocumentTagDefinitions(loading);\n const [filterInput, setFilterInput] = useState(pageState.filter);\n const currentPage = useAppSelector(state => state.activePageState);\n\n /*** variables ***/\n\n const { filter, tablePage, sortColumn, sortDirection, tagFilter } = pageState as ListDocumentationPageState;\n const tag = tagFilter === null ? undefined : tagDefinitions.indexed[tagFilter];\n\n const columns = useMemo(() => getColumns(), []);\n\n\n /*** api ***/\n\n const loadDocuments = (skip: number, limit: number): Promise|undefined> => {\n const { filter, sortColumn, sortDirection } = pageState as ListState;\n\n loading.loading(api.findCollectionDocuments(\n tagFilter ? { 'tags.tag': tagFilter } : {},\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]],\n ['collection'],\n props.ref_type,\n props.ref_id,\n ), plural('document'))\n .then(result => {\n setItems({\n total: result.total,\n data: result.data.map(document => {\n const newDocument = Document.fromJSON(document, tagDefinitions);\n return newDocument;\n })\n });\n });\n return Promise.resolve(undefined);\n }\n\n /*** effects ***/\n\n const refresh = useRefresh(() => {\n loadDocuments(tablePage * PageSize, PageSize).then(data => {\n setItems(data);\n })});\n\n useEffect(refresh, [tablePage, sortColumn, sortDirection, filter, tagFilter, ref_id]);\n\n useDelayedUpdateEffect(() => {\n refresh();\n updatePageState({filter: filterInput, tablePage: 0})},\n 500,\n [filterInput])\n\n\n /*** table handlers ***/\n\n const handlePageChanged = (page: number) => {\n updatePageState({ tablePage: page });\n };\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n updatePageState({ sortColumn: column, sortDirection: direction });\n };\n\n const handleClickedRow = (row: Document) => {\n history.push(getPageLinkWithVia(PageID.ViewDocument, row.id, currentPage.id, currentPage.entity));\n };\n\n const handleTagSelected = (tag: DocumentTagDefinition|undefined) => {\n updatePageState({ tagFilter: tag ? tag.id : null });\n };\n\n const handleClickedClearTag = () => {\n updatePageState({ tagFilter: null });\n };\n\n const handleClickedAdd = async (category: DocumentCategory) => {\n if (category === DocumentCategory.Adlib) {\n const check = await modals.show(\n props => \n );\n if (check === undefined)\n return;\n\n if (check.type === 'document') {\n history.push(`/documents/create?category=${DocumentCategory.Adlib}&code=${check.code}&via=${via}`);\n } else if (check.type === 'collection') {\n history.push(`/documents/create?category=${DocumentCategory.AdlibCollectionDocument}&code=${check.code}&via=${via}`);\n }\n } else {\n history.push(`/documents/create?category=${category}&ref_id=${ref_id}&ref_type=${ref_type}&ref_name=${ref_name}&via=${via}`);\n }\n };\n\n /*** table helpers ***/\n\n const getSortColumn = (column: string) => {\n switch (column) {\n case 'title':\n return 'filter'\n default:\n return column;\n }\n }\n\n /*** rendering ***/\n\n const renderPersonsHeader = () => {\n return (\n <>\n
\n
\n \n
\n {tag ? (\n
\n {T('generic.filter') + ':'}\n {getFullTagName(tagDefinitions, tag)}\n {' '}\n \n
\n ) : (\n
\n \n
\n )}\n
\n
\n {!readonly &&\n
\n \n
\n }\n
\n\n \n );\n }\n\n\n return (\n \n \n {renderPersonsHeader()}\n \n \n \n \n \n );\n}\n\n\nexport default ListDocumentsTab;\n","import { IPlace, toLatLng } from \"../../models/Place\";\nimport { T } from \"../../Translate\";\n\nconst DefaultLocation = { lat: 50.8486, lng: 4.3742 };\n\nexport interface Position {\n lat: number,\n lng: number\n}\n\nexport enum ActualPositionSource {\n NONE = 0,\n CUSTOM = 1,\n ADDRESS = 2,\n PLACE = 3\n}\n\n/**\n * Which location is the actual location. custom > address > place > DefaultLocation\n *\n * @param customPosition\n * @param addressPosition\n * @param place\n */\nexport const actualPosition = (customPosition: Position | undefined,\n addressPosition: Position | undefined,\n place: IPlace | undefined) : Position => {\n return customPosition\n || addressPosition\n || (place && toLatLng(place.loc))\n || DefaultLocation;\n}\n\nexport const actualPositionSource = (customPosition: Position | undefined,\n addressPosition: Position | undefined,\n place: IPlace | undefined): ActualPositionSource => {\n if (customPosition)\n return ActualPositionSource.CUSTOM\n if (addressPosition)\n return ActualPositionSource.ADDRESS\n if (place && toLatLng(place.loc))\n return ActualPositionSource.PLACE\n return ActualPositionSource.NONE\n}\n\nexport const actualPositionSourceText = (source: ActualPositionSource) : string => {\n switch (source) {\n case ActualPositionSource.NONE:\n return T('memorial.position.source.none')\n case ActualPositionSource.ADDRESS:\n return T('memorial.position.source.address')\n case ActualPositionSource.PLACE:\n return T('memorial.position.source.place')\n case ActualPositionSource.CUSTOM:\n return T('memorial.position.source.custom')\n }\n}\n\n\nexport const isAddressPositioned = (source: ActualPositionSource): boolean => {\n return source === ActualPositionSource.CUSTOM;\n}\n\n","// Format of trench coordinates:\n// - First digits (and optionally letter) indicate the map number -> see https://library.mcmaster.ca/maps/ww1/ndx5to40.htm\n// (12 = Oostende, 19 = Dunkerque, 20 = Roulers, 27 = Poperinge, 28 = Ypres, 29 = Kortrijk, 51b = Arras ...)\n// - The maps are divided in areas indicated with a capital letter\n// - Each of these areas is subdivided in up to 36 squares indicated with a number 1-36. Each of these squares is always 1000x1000 yards\n// - These are then further subdivided in 4 500x500 yard sections indicated by lowercase letters a-d\n// Thus each of these 500x500 yard locations is indicated with the map number followed by the subdivision eg. 57c.B14d\n// Convention seems that these parts can be separated by a space or a dot.\n// In this regex, both the 1000x1000 and 500x500 yard notations are accepted. So 57c.T1 and 57c.T1b are both fine.\n// \n// If more accuracy is desired, these grids can be further divided into 10x10 areas indicated with two digits separated by a dot.\n// The coordinates are in format x.y so that 0.0 is the bottomleft square and 9.0 is the bottomright square.\n//\n// If even more accuracy is needed, a 100x100 subgrid can be used instead. In this cases the areas are indicated using digits 00.00 - 99.99\n//\n// Thus the following are all valid coordinates:\n// 57c S10\n// 57c S.10\n// 57c S.10.c\n// 57c.S10c\n// 57c.S10c.0.0\n// 57c.S10c.01.10\n// \n// Source: https://www.longlongtrail.co.uk/battlefields/how-to-read-a-british-trench-map/\n\nconst TRENCH_COORDINATE_REGEX = /^([0-9]{1,2}[a-z]?)[ .]([A-Z])\\.?([0-9]{1,2})(\\.?([a-d])(([ .]([0-9])\\.([0-9]))|([ .]([0-9]{2})\\.([0-9]{2})))?)?$/;\n\nexport function validateTrenchCoordinate(value: string) {\n return TRENCH_COORDINATE_REGEX.test(value);\n}\n\nexport class BritishTrenchCoordinates {\n private map: string; // map name\n private level1grid: string; // A - Z (area in map)\n private level2grid: number; // 1 - 36 (1000x1000 yard grid)\n private level3grid?: string; // a - d (500x500 yard subgrid)\n private subgrid10?: { x: number, y: number }; // 10x10 subgrid coordinate\n private subgrid100?: { x: number, y: number }; // 100x100 subgrid coordinate\n\n static parse(coordinate: string): BritishTrenchCoordinates|null {\n const match = coordinate.match(TRENCH_COORDINATE_REGEX);\n if (!match)\n return null;\n \n const map = match[1];\n const level1grid = match[2];\n const level2grid = parseInt(match[3]);\n const level3grid = match[5];\n const subgrid10x = match[8] ? parseInt(match[8]) : undefined;\n const subgrid10y = match[9] ? parseInt(match[9]) : undefined;\n const subgrid100x = match[11] ? parseInt(match[11]) : undefined;\n const subgrid100y = match[12] ? parseInt(match[12]) : undefined;\n const subgrid10 = subgrid10x !== undefined && subgrid10y !== undefined ? { x: subgrid10x, y: subgrid10y } : undefined;\n const subgrid100 = subgrid100x !== undefined && subgrid100y !== undefined ? { x: subgrid100x, y: subgrid100y } : undefined;\n\n return new BritishTrenchCoordinates(map, level1grid, level2grid, level3grid, subgrid10, subgrid100);\n }\n\n constructor(map: string, level1grid: string, level2grid: number, level3grid?: string, subgrid10?: { x: number, y: number }, subgrid100?: { x: number, y: number }) {\n this.map = map;\n this.level1grid = level1grid;\n this.level2grid = level2grid;\n this.level3grid = level3grid;\n this.subgrid10 = subgrid10;\n this.subgrid100 = subgrid100;\n }\n\n toString(): string {\n let result = this.map + ' ' + this.level1grid + this.level2grid;\n if (this.level3grid)\n result += this.level3grid;\n \n if (this.subgrid10)\n result += ' ' + this.subgrid10.x + '.' + this.subgrid10.y;\n else if (this.subgrid100)\n result += ' ' + this.subgrid100.x.toString().padStart(2, '0')\n + '.' + this.subgrid100.y.toString().padStart(2, '0');\n\n return result;\n }\n}\n","import React, { useMemo, useState, useEffect } from 'react';\nimport { PageProps, Page } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport { Form, Row, Col, Button } from 'react-bootstrap';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport {\n MemorialType,\n translateMemorialType,\n MemorialTypes,\n PlateDetails,\n CemeteryKind,\n translateCemeteryKind,\n translatePlateDetails,\n IMemorialFields, GetMemorialOption\n} from '../../models/Memorial';\nimport { RadioInput } from '../../components/inputs/RadioInput';\nimport { SelectInput, ISelectOption } from '../../components/inputs/SelectInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { PlaceInput } from '../../components/inputs/PlaceInput';\nimport { MapMarkerInput, MapMarkerInputValue } from '../../components/inputs/MapMarkerInput';\nimport { MapCoordinatesInput } from '../../components/inputs/MapCoordinatesInput';\nimport { FormCard } from '../../components/FormCard';\nimport { T } from '../../Translate';\nimport { IPlace, Place } from '../../models/Place';\nimport api from '../../api';\nimport { CheckboxInput } from '../../components/inputs/CheckboxInput';\nimport { showNotification } from '../../utils/Notification';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { useMemorial, useNumberOfRelatedDocuments } from '../../FunctionalAPI';\nimport { useStateWithError } from '../../utils/Functional';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { NotificationManager } from 'react-notifications';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\nimport { TopTab, TopTabs } from \"../../components/TopTabs\";\nimport ListDocumentsTab from \"../ViewPlace/ListDocumentsTab\";\nimport { actualPosition, actualPositionSource, actualPositionSourceText, isAddressPositioned } from \"./LocationUtils\";\nimport { BritishTrenchCoordinates } from '../../utils/BritishTrenchCoordinate';\nimport { ValidationError } from '../../models/ValidationResult';\n\ninterface EditMemorialProps extends PageProps {\n id?: string;\n}\n\nconst LoadOptions = [GetMemorialOption.Place];\n\nexport default function EditMemorial(props: EditMemorialProps) {\n const { loading, id, history, via } = props;\n const modals = useModalContext();\n\n const memorialTypeOptions: JSX.Element[] = useMemo(() => MemorialTypes.map(type => (\n \n )), []);\n const cemeteryKindOptions: ISelectOption[] = useMemo(() => [CemeteryKind.Civilian, CemeteryKind.Military].map(kind => (\n { value: kind, title: translateCemeteryKind(kind) }\n )), []);\n const plateTypeOptions: ISelectOption[] = useMemo(() => [\n PlateDetails.Community,\n PlateDetails.Private,\n PlateDetails.Organisation,\n PlateDetails.Military\n ].map(type => (\n { value: type, title: translatePlateDetails(type) }\n )), []);\n\n const memorial = useMemorial(loading, id, LoadOptions);\n const title = id ? T('page.memorial.title.edit') : T('page.memorial.title.create');\n const icon = Icon.Monument;\n\n const [name, setName, nameError, setNameError] = useStateWithError('');\n const [otherNames, setOtherNames, otherNamesError, setOtherNamesError] = useStateWithError('');\n const [type, setType, typeError, setTypeError] = useStateWithError(MemorialType.Plate);\n const [plateKind, setPlateKind, plateKindError, setPlateKindError] = useStateWithError(PlateDetails.Community);\n const [cemeteryExists, setCemeteryExists] = useState(true);\n const [cemeteryKind, setCemeteryKind, cemeteryKindError, setCemeteryKindError] = useStateWithError(CemeteryKind.Civilian);\n const [place, setPlace, placeError, setPlaceError] = useStateWithError(undefined);\n const [description, setDescription, descriptionError, setDescriptionError] = useStateWithError('');\n const [address, setAddress, addressError, setAddressError] = useStateWithError('');\n // position when draging pin on google map\n const [customPosition, setCustomPosition] = useState(MapMarkerInputValue.empty());\n // position that matches the address\n const [addressPosition, setAddressPosition] = useState<{ lat: number, lng: number }>();\n const [addressLastSearched, setAddressLastSearched] = useState('');\n const [britishTrenchCoordinates, setBritishTrenchCoordinates, britishTrenchCoordinatesError, setBritishTrenchCoordinatesError] = useStateWithError('');\n const [coordinatesLocked, setCoordinatesLocked] = useState(false);\n\n const numberOfDocuments = useNumberOfRelatedDocuments('memorial', memorial?._id);\n\n\n const clearForm = () => {\n setName('');\n setOtherNames('');\n setType(MemorialType.Plate);\n setPlateKind(PlateDetails.Community);\n setCemeteryKind(CemeteryKind.Civilian);\n setCemeteryExists(true);\n setPlace(undefined);\n setDescription('');\n setAddress('');\n setCustomPosition(MapMarkerInputValue.empty());\n setAddressPosition(undefined);\n setAddressLastSearched('');\n setCoordinatesLocked(false);\n };\n\n useEffect(() => {\n const setLocations = () => {\n // locations set by dragging the pin or entering an address are passed as memorial.address_loc.\n setAddressPosition(undefined);\n setCustomPosition(MapMarkerInputValue.empty);\n\n // check if memorial does exist\n if (!memorial)\n return;\n\n // check if there are locations\n if (!memorial.address_loc)\n return;\n\n // check if location has valid values\n if (memorial.address_loc.lat === 0.0 || memorial.address_loc.lon === 0.0)\n return;\n\n if (memorial.address.length === 0\n && (memorial.address_loc.lon !== memorial.calc_place_loc.lon || memorial.address_loc.lat !== memorial.calc_place_loc.lat)\n && memorial.address_positioned === false)\n memorial.address_positioned = true;\n\n // if there is an address this location is not a custom location (address_position is true)\n // then use the address_positions\n if (memorial.address && memorial.address_positioned === false) {\n setAddressPosition({\n lat: memorial.address_loc.lat,\n lng: memorial.address_loc.lon\n });\n return;\n }\n\n // we have overruled the location with a custom position\n if (memorial.address_positioned) {\n setCustomPosition(MapMarkerInputValue.fromValue({\n lat: memorial.address_loc.lat,\n lng: memorial.address_loc.lon\n }));\n }\n }\n\n if (memorial) {\n setName(memorial.name);\n setOtherNames(memorial.alternative_names.join(','));\n setType(memorial.type);\n setPlateKind(memorial.type_plate_details || PlateDetails.Community);\n setCemeteryKind((memorial.type_cemetery_details && memorial.type_cemetery_details.kind) || CemeteryKind.Civilian);\n setCemeteryExists(memorial.type_cemetery_details && memorial.type_cemetery_details.exists);\n setPlace(memorial.extend_place);\n setDescription(memorial.description);\n setAddress(memorial.address);\n setAddressLastSearched(memorial.address);\n setLocations();\n setCoordinatesLocked(memorial.position_locked);\n setBritishTrenchCoordinates(memorial.british_trench_coordinates || '');\n } else {\n clearForm();\n }\n }, [memorial]); // eslint-disable-line react-hooks/exhaustive-deps\n // dependencies verified - and not necessary here:\n // - setters never change\n // - clearForm only uses setters, too, thus all instances of clearForm are equivalent\n\n const geocodeAddress = () => {\n if (!address || address === addressLastSearched)\n return;\n\n if (!(address && address.length > 2)) {\n setAddressPosition(undefined);\n NotificationManager.error(T('memorial.position.notification.message.invalidAddress'))\n return;\n }\n\n if (!place) {\n NotificationManager.error(T('memorial.position.notification.message.needPlace'))\n return;\n }\n\n var geocoder = new google.maps.Geocoder();\n geocoder.geocode(\n {\n address,\n componentRestrictions: {\n country: place.country_code,\n locality: new Place(place).getTranslation().name\n }\n },\n (results, status) => {\n setAddressLastSearched(address);\n\n if (status === google.maps.GeocoderStatus.OK) {\n const position = results[0].geometry.location;\n setAddressPosition({ lat: position.lat(), lng: position.lng() });\n setCustomPosition(MapMarkerInputValue.empty());\n NotificationManager.success(T('memorial.position.notification.message.addressFound'))\n }\n else {\n setAddressPosition(undefined);\n NotificationManager.success(T('memorial.position.notification.message.addressNotFound'))\n }\n });\n }\n\n const handleAddressEnterPressed = () => {\n if (!address) {\n setAddressPosition(undefined);\n } else {\n geocodeAddress();\n }\n }\n\n const handleMemorialTypeChanged = (value: string) => {\n setType(value as MemorialType);\n };\n\n const handleMemorialCemeteryTypeChanged = (value: string) => {\n setCemeteryKind(value as CemeteryKind);\n }\n\n const handlePlateKindChanged = (value: string) => {\n setPlateKind(value as PlateDetails);\n }\n\n const createNewMemorial = () => {\n if (id) {\n history.push('/memorials/create');\n } else {\n clearForm();\n }\n };\n\n const save = (createNew: boolean) => {\n const actualAddressPosition = addressPosition || { lat: 0, lng: 0 };\n const actualCustomPosition = customPosition?.lastValidPosition || addressPosition || undefined;\n\n const positionSource = actualPositionSource(customPosition?.lastValidPosition, addressPosition, place);\n const addressPositioned: boolean = isAddressPositioned(positionSource);\n\n const data: IMemorialFields & { _id?: string } = {\n _id: id,\n type,\n type_cemetery_details: {\n kind: cemeteryKind,\n exists: cemeteryExists,\n nationality: ''\n },\n type_plate_details: type === MemorialType.Plate ? plateKind: undefined,\n name,\n alternative_names: otherNames ? otherNames.split(',') : [],\n address,\n address_loc: actualCustomPosition ? { lat: actualCustomPosition.lat, lon: actualCustomPosition.lng } : { lat: 0, lon: 0 },\n position_locked: coordinatesLocked,\n description,\n start_day: null,\n start_month: null,\n start_year: null,\n start_date: null,\n calc_place_name: '', // not used at server side\n calc_place_loc: { lat: actualAddressPosition.lat, lon: actualAddressPosition.lng }, // not used at server side\n calc_place_country: place ? place.country_code : '', // not used as server side\n address_positioned: addressPositioned,\n place_id: place ? place._id : undefined\n };\n \n api.validateMemorial(data, id ? 'update' : 'create').then(result => {\n if (result.status === 'NOK') {\n const errors = result.data || {};\n setNameError(errors.name);\n setOtherNamesError(errors.alternative_names);\n setAddressError(errors.address);\n setDescriptionError(errors.description);\n setTypeError(errors.type);\n setPlateKindError(errors.type_plate_details);\n setCemeteryKindError(errors.cemetery_kind);\n setPlaceError(errors.place_id);\n setBritishTrenchCoordinatesError(errors.british_trench_coordinates);\n return;\n }\n\n if (id) {\n const dataWithId = Object.assign(data, { _id: id });\n api.updateMemorial(dataWithId)\n .then(() => {\n showNotification({ message: T('page.memorial.updated') });\n if (createNew)\n createNewMemorial();\n });\n } else {\n api.createMemorial(data)\n .then(memorial => {\n showNotification({ message: T('page.memorial.created') });\n if (createNew) {\n createNewMemorial();\n } else {\n history.push(`/memorials/${memorial._id}`);\n }\n });\n }\n });\n }\n\n const validateBritishTrenchCoordinates = () => {\n if (britishTrenchCoordinates.length === 0)\n return;\n \n const coordinates = BritishTrenchCoordinates.parse(britishTrenchCoordinates);\n if (coordinates) {\n setBritishTrenchCoordinates(coordinates.toString());\n } else {\n setBritishTrenchCoordinatesError(ValidationError.InvalidBritishTrenchCoordinates);\n }\n };\n\n const handleClickedSave = () => {\n save(false);\n };\n\n const leftForm = (\n
\n \n \n \n {type === MemorialType.Cemetery && (\n \n )}\n {type === MemorialType.Plate && (\n \n )}\n {(type === MemorialType.Cemetery || type === MemorialType.Plate) && (\n \n )}\n \n \n );\n\n const actualPositionOnMap = MapMarkerInputValue.fromValue(actualPosition(customPosition?.lastValidPosition, addressPosition, place));\n const actualPositionOnMapSource = actualPositionSource(customPosition?.lastValidPosition, addressPosition, place);\n const actualPositionOnMapSourceText = actualPositionSourceText(actualPositionOnMapSource)\n\n const rightForm = (\n
\n \n \n \n \n\n \n \n \n );\n\n /*** rendering ***/\n const generateTabs = (): TopTab[] => {\n return [\n {\n icon: Icon.Monument,\n title: T('field.memorated.memorial.name'),\n id: 'persons',\n content: () => renderMemorialTab(),\n badgeContent: () => '',\n },\n {\n icon: Icon.Document,\n title: T('page.place.tab.documents'),\n id: 'documents',\n content: () => renderDocumentsTab(),\n badgeContent: () => numberOfDocuments.toString(),\n }\n ]\n }\n\n const renderMemorialTab = () => {\n return (\n <>\n \n
\n \n {leftForm}\n \n \n \n \n {rightForm}\n \n \n \n \n \n \n \n )\n }\n\n const renderDocumentsTab = () => {\n if (!memorial) {\n return ''\n } else {\n return (\n \n );\n }\n }\n\n return (\n \n \n\n \n );\n}\n","import React, { CSSProperties } from 'react';\nimport { IPlace, Place } from '../models/Place';\nimport { Icon } from './Icons';\nimport { T } from '../Translate';\nimport PageLink from './PageLink';\nimport { PageID } from '../utils/PageLinking';\n\ninterface PlaceLinkProps {\n place: IPlace;\n style?: CSSProperties\n}\nexport const PlaceLink = (props: PlaceLinkProps) => {\n const { place, style } = props;\n return (\n \n {' '}\n \n {new Place(place).describe()}\n \n {place.loc && <>\n {' '}\n \n ( {T('external.links.google.maps')} )\n \n }\n \n );\n}\n","export function distinct(values: T[]): T[] {\n return Array.from(new Set(values).values());\n}\n\nexport function equals(a: T[], b: T[]): boolean {\n if (a.length !== b.length)\n return false;\n\n for (let i = 0; i < a.length; i++)\n if (a[i] !== b[i])\n return false;\n \n return true;\n}\n\nexport function isEmptyObject(value: any): value is {} {\n return Object.keys(value).length === 0 && value.constructor === Object;\n}\n","import React, { useState } from 'react';\nimport { Person, translateVictimType } from '../../models/Person';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { Modal, Button, Table } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { Icon } from '../../components/Icons';\nimport styles from './index.module.scss';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { ModalHeader } from '../../modals/ModalHeader';\n\nexport interface MergePersonsModalResult {\n confirmed: boolean;\n openResult: boolean;\n personA: Person;\n personB: Person;\n}\ninterface MergePersonsModalProps extends ModalProps {\n personA: Person;\n personB: Person;\n}\nexport const MergePersonsModal = (props: MergePersonsModalProps) => {\n const [isOpen, resolve] = useModal(props);\n const [personA, setPersonA] = useState(props.personA);\n const [personB, setPersonB] = useState(props.personB);\n\n const handleClickedSwitch = () => {\n setPersonA(personB);\n setPersonB(personA);\n };\n\n const handleClickedCancel = () => {\n resolve({\n personA,\n personB,\n confirmed: false,\n openResult: false\n });\n };\n\n const handleClickedConfirm = () => {\n resolve({\n personA,\n personB,\n confirmed: true,\n openResult: false\n });\n };\n\n const handleClickedConfirmAndOpen = () => {\n resolve({\n personA,\n personB,\n confirmed: true,\n openResult: true\n });\n };\n\n const nameA = personA.name;\n const nameB = personB.name;\n const bornA = personA.birthDateFormatted;\n const bornB = personB.birthDateFormatted;\n const diedA = personA.diedDateFormatted;\n const diedB = personB.diedDateFormatted;\n const willEraseName = nameA !== nameB;\n const willEraseBorn = bornA !== '' && (bornA !== bornB);\n const willEraseDied = diedA !== '' && (diedA !== diedB);\n const willEraseType = personA.victimType !== personB.victimType;\n\n return (\n \n {T('modal.mergePerson.title')}\n \n

{T('modal.mergePerson.message')}

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{T('person.name')}{nameA}{nameB}
{T('person.born')}{bornA}{bornB}
{T('person.died')}{diedA}{diedB}
{T('person.type')}{translateVictimType(personA.victimType)}{translateVictimType(personB.victimType)}
\n \n \n \n
\n \n \n \n \n \n );\n}\n","import React from 'react';\nimport { Icon } from './Icons';\n\ninterface MergeIconProps {\n item: { id: string };\n selected: { id: string }[];\n}\nexport const MergeIcon = (props: MergeIconProps) => {\n const { item, selected } = props;\n const active = selected.find(x => x.id === item.id);\n return active ? (\n \n \n \n \n ) : ;\n}\n","import React from 'react';\n\nimport { IPlace, isPlace, Place } from \"./Place\";\nimport { IPerson } from \"./Person\";\nimport { IMemorial, MemorialType } from \"./Memorial\";\nimport { Icon } from \"../components/Icons\";\nimport { T, TranslationKey } from \"../Translate\";\nimport PageLink from '../components/PageLink';\nimport { PageID } from '../utils/PageLinking';\nimport { markdown2html } from '../utils/Markdown';\n\nexport enum PersonEventLoadOption {\n Place = 'EXTEND_PLACE',\n PlaceName = 'EXTEND_PLACE_NAME',\n Person = 'EXTEND_PERSON'\n}\n\nexport enum PersonEventType {\n Where = 'where',\n School = 'school',\n Work = 'work',\n Extra = 'extra',\n Marriage = 'marriage',\n Injured = 'injured',\n Decorated = 'decorated',\n Military = 'enlisted',\n Died = 'died',\n Born = 'born',\n Memorated = 'memorated',\n Jailed = 'jailed',\n Hospitalized = 'hospitalized',\n CWXRM = 'cwxrm'\n}\n\nexport interface IBaseEvent {\n _id: string;\n person_id: string;\n type: PersonEventType;\n start_day: number | null;\n start_month: number | null;\n start_year: number | null;\n sort_start_date: string;\n end_day: number | null;\n end_month: number | null;\n end_year: number | null;\n sort_end_date?: string;\n\n place_id?: string;\n topo?: string;\n description: string;\n place_name_original?: string;\n original_region?: string;\n original_country?: string;\n\n extend_place?: {} | IPlace;\n extend_place_name?: string;\n extend_person?: IPerson;\n}\n\nexport interface IBornEvent extends IBaseEvent {\n type: PersonEventType.Born;\n}\n\nexport interface IDiedEvent extends IBaseEvent {\n type: PersonEventType.Died;\n death_reason: string;\n}\n\nexport interface IExtraEvent extends IBaseEvent {\n type: PersonEventType.Extra;\n}\n\nexport interface IHospitalizedEvent extends IBaseEvent {\n type: PersonEventType.Hospitalized;\n}\n\nexport interface IInjuredEvent extends IBaseEvent {\n type: PersonEventType.Injured;\n injured_wound: string;\n injured_cause: string;\n}\n\n\nexport enum JailedType {\n Jailed = 'jailed',\n Captive = 'captive'\n}\nexport function translateJailedEventType(type: JailedType) {\n return T(type === JailedType.Captive ? 'jailedType.captive' : 'jailedType.jailed');\n}\n\nexport interface IJailedEvent extends IBaseEvent {\n type: PersonEventType.Jailed;\n jailed_type: JailedType;\n}\n\nexport interface IMarriageEvent extends IBaseEvent {\n type: PersonEventType.Marriage;\n marriage_partner: string;\n}\n\nexport enum MemoratedKind {\n Original = 'original',\n Current = 'current',\n None = 'none'\n}\nconst MemoratedKindTranslations: { [key: string]: TranslationKey } = {\n [MemoratedKind.Original]: 'memoratedKind.original',\n [MemoratedKind.Current]: 'memoratedKind.current',\n [MemoratedKind.None]: 'memoratedKind.none'\n}\nexport function translateMemoratedKind(type: MemoratedKind) {\n return T(MemoratedKindTranslations[type]) || ('!' + type);\n}\n\nexport interface IMemoratedEvent extends IBaseEvent {\n type: PersonEventType.Memorated;\n memorial_id: string | null;\n memorial_kind: MemoratedKind;\n memorial_ref: string;\n memorial_document?: string;\n\n extend_memorial?: IMemorial & { loc: { lat: number, lon: number }, place_name: string };\n}\n\nexport enum MilitaryEventType {\n Enlisted = 'enlisted',\n ActiveService = 'active service',\n PostedTo = 'posted to',\n AttachedTo = 'attached to',\n Renumbered = 'renumbered',\n TransferredTo = 'transferred to',\n Promoted = 'promoted'\n}\nconst MilitaryEventTypeTranslations: { [key: string]: TranslationKey } = {\n [MilitaryEventType.Enlisted]: 'militaryEventType.enlisted',\n [MilitaryEventType.ActiveService]: 'militaryEventType.activeService',\n [MilitaryEventType.PostedTo]: 'militaryEventType.postedTo',\n [MilitaryEventType.AttachedTo]: 'militaryEventType.attachedTo',\n [MilitaryEventType.Renumbered]: 'militaryEventType.renumbered',\n [MilitaryEventType.TransferredTo]: 'militaryEventType.transferredTo',\n [MilitaryEventType.Promoted]: 'militaryEventType.promoted'\n};\n\nexport function translateMilitaryEventType(type: MilitaryEventType) {\n return T(MilitaryEventTypeTranslations[type]) || ('!' + type);\n}\n\nexport function describeMilitaryEventUnit(event: IMilitaryEvent): string {\n let entity = event.enlisted_army;\n if (event.enlisted_regt)\n entity += ' ' + event.enlisted_regt;\n if (event.enlisted_nr)\n entity += ', ' + event.enlisted_nr;\n if (event.enlisted_unit)\n entity += ' ' + event.enlisted_unit;\n return entity;\n}\n\nexport interface IMilitaryEvent extends IBaseEvent {\n type: PersonEventType.Military;\n\n enlisted_reason: MilitaryEventType;\n enlisted_army: string;\n enlisted_regt: string;\n enlisted_unit: string;\n enlisted_nr: string; // unit nr\n enlisted_number: string; // service number\n enlisted_sub: string;\n enlisted_rank: string;\n military_entity_id: string | null;\n military_regiment_id: string | null;\n}\n\nexport interface ISchoolEvent extends IBaseEvent {\n type: PersonEventType.School;\n\n school_name: string;\n school_direction: string;\n}\n\nexport enum WhereEventType {\n HomeAddress = 'homeaddress',\n Fugitive = 'fugitive',\n Evacuated = 'evacuated',\n Deportated = 'deportated',\n Moved = 'moved'\n}\n\nconst WhereEventTypeTranslations: { [key: string]: TranslationKey } = {\n [WhereEventType.HomeAddress]: 'whereEventType.homeAddress',\n [WhereEventType.Fugitive]: 'whereEventType.fugitive',\n [WhereEventType.Deportated]: 'whereEventType.deportated',\n [WhereEventType.Evacuated]: 'whereEventType.evacuated',\n [WhereEventType.Moved]: 'whereEventType.moved'\n};\nexport function translateWhereEventType(type: WhereEventType) {\n return T(WhereEventTypeTranslations[type]) || ('!' + type);\n}\n\nexport interface IWhereEvent extends IBaseEvent {\n type: PersonEventType.Where;\n\n where_reason: WhereEventType;\n}\n\nexport interface IWorkEvent extends IBaseEvent {\n type: PersonEventType.Work;\n\n work_company_name: string;\n work_profession: string;\n}\n\nexport interface IDecoratedEvent extends IBaseEvent {\n type: PersonEventType.Decorated;\n\n decoration: string;\n citation: string;\n}\n\nexport interface ICWXRMEvent extends IBaseEvent {\n type: PersonEventType.CWXRM;\n\n batch?: string;\n csv_id?: number;\n first_name?: string;\n last_name?: string;\n email?: string;\n group?: string;\n}\n\nexport type PersonEvent =\n IBornEvent\n | IDiedEvent\n | IExtraEvent\n | IHospitalizedEvent\n | IInjuredEvent\n | IJailedEvent\n | IMarriageEvent\n | IMemoratedEvent\n | IMilitaryEvent\n | ISchoolEvent\n | IWhereEvent\n | IWorkEvent\n | IDecoratedEvent\n | ICWXRMEvent;\n\nexport function isRemovablePersonEvent(event: PersonEvent) {\n return event.type !== PersonEventType.Born && event.type !== PersonEventType.Died;\n}\n\ninterface PersonEventTypeInfo {\n type: PersonEventType;\n icon: Icon;\n name: TranslationKey;\n nameIn: TranslationKey;\n plural: TranslationKey;\n}\nconst EVENT_TYPES: PersonEventTypeInfo[] = [\n {\n type: PersonEventType.Born,\n icon: Icon.Circle,\n name: 'event.born',\n nameIn: 'event.born.in',\n plural: 'events.born'\n },\n {\n type: PersonEventType.School,\n icon: Icon.GraduationCap,\n name: 'event.school',\n nameIn: 'event.school.in',\n plural: 'events.school'\n },\n {\n type: PersonEventType.Work,\n icon: Icon.Tools,\n name: 'event.work',\n nameIn: 'event.work.in',\n plural: 'events.work'\n },\n {\n type: PersonEventType.Where,\n icon: Icon.House,\n name: 'event.where',\n nameIn: 'event.where.in',\n plural: 'events.where'\n },\n {\n type: PersonEventType.Marriage,\n icon: Icon.RingsWedding,\n name: 'event.marriage',\n nameIn: 'event.marriage.in',\n plural: 'events.marriage'\n },\n {\n type: PersonEventType.Military,\n icon: Icon.Shield,\n name: 'event.military',\n nameIn: 'event.military.in',\n plural: 'events.military'\n },\n {\n type: PersonEventType.Injured,\n icon: Icon.Medkit,\n name: 'event.injured',\n nameIn: 'event.injured.in',\n plural: 'events.injured'\n },\n {\n type: PersonEventType.Hospitalized,\n icon: Icon.Ambulance,\n name: 'event.hospitalized',\n nameIn: 'event.hospitalized.in',\n plural: 'events.hospitalized'\n },\n {\n type: PersonEventType.Died,\n icon: Icon.Cross,\n name: 'event.died',\n nameIn: 'event.died.in',\n plural: 'events.died'\n },\n {\n type: PersonEventType.Memorated,\n icon: Icon.Monument,\n name: 'event.memorated',\n nameIn: 'event.memorated.in',\n plural: 'events.memorated'\n },\n {\n type: PersonEventType.Decorated,\n icon: Icon.Medal,\n name: 'event.decorated',\n nameIn: 'event.decorated.in',\n plural: 'events.decorated'\n },\n {\n type: PersonEventType.Extra,\n icon: Icon.Comment,\n name: 'event.extra',\n nameIn: 'event.extra.in',\n plural: 'events.extra'\n },\n {\n type: PersonEventType.Jailed,\n icon: Icon.Lock,\n name: 'event.jailed',\n nameIn: 'event.jailed.in',\n plural: 'events.jailed'\n },\n {\n type: PersonEventType.CWXRM,\n icon: Icon.Tag,\n name: 'event.cwxrm',\n nameIn: 'event.cwxrm.in',\n plural: 'events.cwxrm'\n }\n];\n\nconst DEFAULT_EVENT_FIELDS = {\n _id: '',\n start_day: null,\n start_month: null,\n start_year: null,\n sort_start_date: '????????',\n end_day: null,\n end_month: null,\n end_year: null,\n sort_end_date: '????????',\n description: ''\n};\n\nexport function createNewEvent(personId: string, eventType: PersonEventType): PersonEvent {\n switch (eventType) {\n case PersonEventType.Born:\n return Object.assign({\n type: PersonEventType.Born as PersonEventType.Born,\n person_id: personId\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.School:\n return Object.assign({\n type: PersonEventType.School as PersonEventType.School,\n person_id: personId,\n school_name: '',\n school_direction: ''\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Work:\n return Object.assign({\n type: PersonEventType.Work as PersonEventType.Work,\n person_id: personId,\n work_company_name: '',\n work_profession: ''\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Where:\n return Object.assign({\n type: PersonEventType.Where as PersonEventType.Where,\n person_id: personId,\n where_reason: WhereEventType.HomeAddress,\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Marriage:\n return Object.assign({\n type: PersonEventType.Marriage as PersonEventType.Marriage,\n person_id: personId,\n marriage_partner: ''\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Military:\n return Object.assign({\n type: PersonEventType.Military as PersonEventType.Military,\n person_id: personId,\n enlisted_reason: MilitaryEventType.ActiveService,\n enlisted_army: '',\n enlisted_regt: '',\n enlisted_unit: '',\n enlisted_nr: '',\n enlisted_number: '',\n enlisted_sub: '',\n enlisted_rank: '',\n military_entity_id: null,\n military_regiment_id: null\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Jailed:\n return Object.assign({\n type: PersonEventType.Jailed as PersonEventType.Jailed,\n person_id: personId,\n jailed_type: JailedType.Jailed\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Injured:\n return Object.assign({\n type: PersonEventType.Injured as PersonEventType.Injured,\n person_id: personId,\n injured_wound: '',\n injured_cause: ''\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Hospitalized:\n return Object.assign({\n type: PersonEventType.Hospitalized as PersonEventType.Hospitalized,\n person_id: personId,\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Died:\n return Object.assign({\n type: PersonEventType.Died as PersonEventType.Died,\n person_id: personId,\n death_reason: ''\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Memorated:\n return Object.assign({\n type: PersonEventType.Memorated as PersonEventType.Memorated,\n person_id: personId,\n memorial_id: null,\n memorial_kind: MemoratedKind.Current,\n memorial_ref: ''\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Decorated:\n return Object.assign({\n type: PersonEventType.Decorated as PersonEventType.Decorated,\n person_id: personId,\n decoration: '',\n citation: ''\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.Extra:\n return Object.assign({\n type: PersonEventType.Extra as PersonEventType.Extra,\n person_id: personId,\n }, DEFAULT_EVENT_FIELDS);\n case PersonEventType.CWXRM:\n }\n throw Error(\"Unknown event type: \" + eventType);\n}\n\nexport function getEventTypeInfo(eventType: PersonEventType): PersonEventTypeInfo {\n return EVENT_TYPES.find(x => x.type === eventType)\n || {\n type: eventType,\n icon: Icon.Comment,\n name: 'event.unknown',\n nameIn: 'event.unknown.in',\n plural: 'events.unknown'\n };\n}\n\nexport function getEventIcon(eventType: PersonEventType): Icon {\n return getEventTypeInfo(eventType).icon;\n}\n\nexport function getEventTypeName(eventType: PersonEventType): string {\n return T(getEventTypeInfo(eventType).name);\n}\n\nexport function getEventTypePlural(eventType: PersonEventType): string {\n return T(getEventTypeInfo(eventType).plural);\n}\n\nexport function getEventNameForPlace(eventType: PersonEventType, place: string): string {\n return T(getEventTypeInfo(eventType).nameIn, { place });\n}\n\nexport function getEventSubType(event: PersonEvent): string | undefined {\n switch (event.type) {\n case PersonEventType.Where:\n return translateWhereEventType(event.where_reason);\n case PersonEventType.Military:\n return translateMilitaryEventType(event.enlisted_reason);\n case PersonEventType.Jailed:\n return translateJailedEventType(event.jailed_type);\n case PersonEventType.Memorated:\n if (event.memorial_kind === 'none' || (event.extend_memorial && event.extend_memorial.type !== 'cemetery'))\n return undefined;\n else\n return translateMemoratedKind(event.memorial_kind);\n default:\n return undefined;\n }\n}\n\nexport interface EventInfoLine {\n key: string;\n title: string;\n value: string | JSX.Element;\n}\nexport function getEventInfo(event: PersonEvent, links: boolean = true): EventInfoLine[] {\n const result: EventInfoLine[] = [];\n const { type } = event;\n if (type === PersonEventType.Decorated\n || type === PersonEventType.CWXRM\n || type === PersonEventType.Military\n || type === PersonEventType.Born\n || type === PersonEventType.Died) {\n if (event.start_day || event.start_month || event.start_year) {\n result.push({\n key: 'date',\n title: T('event.date'),\n value: (event.start_day || '?') + '/' + (event.start_month || '?') + '/' + (event.start_year || '?')\n });\n }\n } else {\n if (event.start_day || event.start_month || event.start_year) {\n result.push({\n key: 'dateFrom',\n title: T('event.startDate'),\n value: (event.start_day || '?') + '/' + (event.start_month || '?') + '/' + (event.start_year || '?')\n });\n }\n if (event.end_day || event.end_month || event.end_year) {\n result.push({\n key: 'dateTo',\n title: T('event.endDate'),\n value: (event.end_day || '?') + '/' + (event.end_month || '?') + '/' + (event.end_year || '?')\n });\n }\n }\n\n if (isPlace(event.extend_place)) {\n result.push({\n key: 'place',\n title: T('event.place'),\n value: links ? (\n \n {new Place(event.extend_place).describe()}\n \n ) : new Place(event.extend_place).describe()\n });\n }\n if (event.topo) {\n result.push({\n key: 'topo',\n title: T('event.address'),\n value: event.topo\n });\n }\n if (event.type === PersonEventType.School) {\n if (event.school_name) {\n result.push({\n key: 'schoolName',\n title: T('event.schoolName'),\n value: event.school_name\n });\n }\n if (event.school_direction) {\n result.push({\n key: 'schoolDirection',\n title: T('event.schoolDirection'),\n value: event.school_direction\n });\n }\n }\n if (event.type === PersonEventType.Work) {\n if (event.work_company_name) {\n result.push({\n key: 'workCompanyName',\n title: T('event.workCompanyName'),\n value: event.work_company_name\n });\n }\n if (event.work_profession) {\n result.push({\n key: 'workProfession',\n title: T('event.workProfession'),\n value: event.work_profession\n });\n }\n }\n if (event.type === PersonEventType.Military) {\n if (event.enlisted_army) {\n result.push({\n key: 'militaryArmy',\n title: T('event.militaryArmy'),\n value: event.enlisted_army\n });\n }\n if (event.enlisted_rank) {\n result.push({\n key: 'militaryRank',\n title: T('event.militaryRank'),\n value: event.enlisted_rank\n });\n }\n if (event.enlisted_number) {\n result.push({\n key: 'militaryNumber',\n title: T('event.militaryServiceNumber'),\n value: event.enlisted_number\n });\n }\n if (event.enlisted_regt) {\n result.push({\n key: 'militaryRegt',\n title: T('event.militaryRegiment'),\n value: (links && event.military_regiment_id)\n ? {event.enlisted_regt}\n : event.enlisted_regt\n });\n }\n if (event.enlisted_unit || event.enlisted_nr) {\n const unit = event.enlisted_nr + ' ' + event.enlisted_unit;\n result.push({\n key: 'militaryUnit',\n title: T('event.militaryUnitAndNr'),\n value: (links && event.military_entity_id)\n ? {unit}\n : unit\n });\n }\n if (event.enlisted_sub) {\n result.push({\n key: 'militarySub',\n title: T('event.militaryUnitSub'),\n value: event.enlisted_sub\n });\n }\n }\n if (event.type === PersonEventType.Injured) {\n if (event.injured_wound) {\n result.push({\n key: 'injuredWound',\n title: T('event.injuredWound'),\n value: event.injured_wound\n });\n }\n if (event.injured_cause) {\n result.push({\n key: 'injuredCause',\n title: T('event.injuredCause'),\n value: event.injured_cause\n });\n }\n }\n if (event.type === PersonEventType.Died) {\n if (event.death_reason) {\n result.push({\n key: 'reason',\n title: T('event.diedReason'),\n value: event.death_reason\n });\n }\n }\n if (event.type === PersonEventType.Memorated) {\n if (event.memorial_id) {\n const memorialName = event.extend_memorial ? event.extend_memorial.name : '#' + event.memorial_id;\n result.push({\n key: 'memorial',\n title: T('event.memoratedMemorial'),\n value: links ? (\n \n {memorialName}\n \n ) : memorialName\n });\n }\n if (event.memorial_ref) {\n result.push({\n key: 'memorialRef',\n title: T('event.memoratedRef'),\n value: event.memorial_ref\n });\n }\n }\n if (event.type === PersonEventType.Decorated) {\n if (event.decoration) {\n result.push({\n key: 'decoratedDecoration',\n title: T('event.decoratedDecoration'),\n value: event.decoration\n });\n }\n if (event.citation) {\n result.push({\n key: 'decoratedCitation',\n title: T('event.decoratedCitation'),\n value: event.citation\n });\n }\n }\n\n if (event.type === PersonEventType.CWXRM) {\n if (event.first_name) {\n result.push({\n key: 'cwxrmFirstName',\n title: T('event.cwxrmFirstName'),\n value: event.first_name\n });\n }\n if (event.last_name) {\n result.push({\n key: 'cwxrmFirstName',\n title: T('event.cwxrmLastName'),\n value: event.last_name\n });\n }\n if (event.email) {\n result.push({\n key: 'cwxrmFirstName',\n title: T('event.cwxrmMail'),\n value: event.email\n });\n }\n if (event.group) {\n result.push({\n key: 'cwxrmFirstName',\n title: T('event.cwxrmGroup'),\n value: event.group\n });\n }\n }\n\n if (event.description) {\n result.push({\n key: 'description',\n title: T('event.description'),\n value:
\n });\n }\n return result;\n}\n\nexport const personEventSorter = (a: PersonEvent, b: PersonEvent) => {\n const ta = getEventTypeMajorPriority(a);\n const tb = getEventTypeMajorPriority(b);\n\n if (ta !== tb)\n return ta - tb;\n\n if (!(a.start_year === b.start_year || !a.start_year || !b.start_year))\n return a.start_year - b.start_year;\n\n if (!(a.start_month === b.start_month || !a.start_month || !b.start_month))\n return a.start_month - b.start_month;\n\n if (!(a.start_day === b.start_day || !a.start_day || !b.start_day))\n return a.start_day - b.start_day;\n\n const ma = getEventTypeMinorPriority(a);\n const mb = getEventTypeMinorPriority(b);\n if (ma !== mb)\n return ma - mb;\n\n if (a.type === PersonEventType.Military && b.type === PersonEventType.Military) {\n const xa = getEnlistedPriority(a);\n const xb = getEnlistedPriority(b);\n return xa - xb;\n } else if (a.type === PersonEventType.Where && b.type === PersonEventType.Where) {\n const xa = getWherePriority(a);\n const xb = getWherePriority(b);\n return xa - xb;\n } else if (a.type === PersonEventType.Memorated && b.type === PersonEventType.Memorated) {\n const xa = getMemoratedPriority(a);\n const xb = getMemoratedPriority(b);\n return xa - xb;\n }\n\n return 0;\n};\n\n// Major priority is main sorting criterion - events will always be sorted with this priority\nexport function getEventTypeMajorPriority(event: PersonEvent) {\n return getMajorPriorityForEventType(event.type)\n};\n\nexport function getMajorPriorityForEventType(eventType: PersonEventType) {\n switch (eventType) {\n case PersonEventType.Born:\n return 0;\n case PersonEventType.School:\n return 1;\n case PersonEventType.Work:\n return 1;\n case PersonEventType.Where:\n return 1;\n case PersonEventType.Marriage:\n return 1;\n case PersonEventType.Military:\n return 2;\n case PersonEventType.Jailed:\n return 2;\n case PersonEventType.Injured:\n return 2;\n case PersonEventType.Hospitalized:\n return 2;\n case PersonEventType.Died:\n return 5;\n case PersonEventType.Memorated:\n return 6;\n case PersonEventType.Decorated:\n return 7;\n case PersonEventType.CWXRM:\n return 8;\n case PersonEventType.Extra:\n return 9;\n default:\n return -1;\n }\n};\n\n\n// Minor priority is sorting used when dates are equal or unknown\nexport function getEventTypeMinorPriority(event: PersonEvent) {\n switch (event.type) {\n case PersonEventType.Born:\n return 0;\n case PersonEventType.School:\n return 1;\n case PersonEventType.Work:\n return 2;\n case PersonEventType.Where:\n return 3;\n case PersonEventType.Marriage:\n return 4;\n case PersonEventType.Military:\n return 5;\n case PersonEventType.Jailed:\n return 6;\n case PersonEventType.Injured:\n return 7;\n case PersonEventType.Hospitalized:\n return 8;\n case PersonEventType.Died:\n return 9;\n case PersonEventType.Memorated:\n return 10;\n case PersonEventType.Decorated:\n return 11;\n case PersonEventType.CWXRM:\n return 12;\n case PersonEventType.Extra:\n return 13;\n default:\n return -1;\n }\n};\n\n\nfunction getWherePriority(event: IWhereEvent) {\n switch (event.where_reason) {\n case 'homeaddress':\n return 1;\n default:\n return 2;\n }\n};\n\n\nfunction getEnlistedPriority(event: IMilitaryEvent) {\n switch (event.enlisted_reason) {\n case 'enlisted':\n return 1;\n case 'posted to':\n return 2;\n case 'active service':\n return 3;\n case 'attached to':\n return 4;\n default:\n return 5;\n }\n};\n\n\nfunction getMemoratedPriority(event: IMemoratedEvent) {\n if (event.extend_memorial && event.extend_memorial.type === MemorialType.Cemetery) {\n switch (event.memorial_kind) {\n case 'original':\n return 1;\n case 'current':\n return 2;\n default:\n return 3;\n }\n } else {\n return 4;\n }\n};\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { Badge, Button, ButtonGroup } from 'react-bootstrap';\nimport { Icon } from '../../components/Icons';\nimport { T, plural } from '../../Translate';\nimport {\n ITableColumn,\n StringTableColumn,\n ActionsTableColumn,\n TableRowActionStyle,\n ComponentTableColumn,\n ITableRowAction\n} from '../../components/table/Fields';\nimport { Person, VictimType, PersonQueryOptions } from '../../models/Person';\nimport { distinct } from '../../utils/Arrays';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport api from '../../api';\nimport { IQueryResult } from '../../models/Generic';\nimport { Dataset, AccessibleDatasets, translateDataset } from '../../models/User';\nimport { MergePersonsModal, MergePersonsModalResult } from './MergePersonsModal';\nimport { showNotification } from '../../utils/Notification';\nimport { MergeIcon } from '../../components/MergeIcon';\nimport styles from './index.module.scss';\nimport { ListState, ListPage } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { usePageState } from '../../redux/Actions';\nimport { useRefresh } from '../../utils/Functional';\nimport { NotificationManager } from 'react-notifications';\nimport { IMemorial, MemorialType } from '../../models/Memorial';\nimport { MilitaryEventType, IMilitaryEvent } from '../../models/PersonEvent';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\n\nfunction selectDisplayedMemorials(memorials: IMemorial[]) {\n const memorial = memorials.find(memorial => memorial.type === MemorialType.Cemetery && memorial.type_cemetery_details.exists)\n || memorials.find(memorial => memorial.type === MemorialType.Plate && memorial.type_cemetery_details.exists);\n return memorial ? [memorial] : [];\n}\n\nfunction getMilitaryEntityName(event: IMilitaryEvent) {\n const elements: string[] = [];\n if (event.enlisted_nr)\n elements.push(event.enlisted_nr);\n if (event.enlisted_unit)\n elements.push(event.enlisted_unit);\n\n if (elements.length === 0) {\n return event.enlisted_regt;\n } else {\n return elements.join(' ') + ', ' + event.enlisted_regt;\n }\n}\n\nexport interface PersonListState {\n selectedForMerge: Person[];\n}\n\nexport function generatePersonsColumns(\n onClickedRemove?: (person: Person) => void,\n onClickedMerge?: (person: Person, state: PersonListState) => void\n): ITableColumn[] {\n\n const user = api.user;\n const result: ITableColumn[] = [\n new ComponentTableColumn('name', T('listPersons.column.name'), person => {\n const altFirstNames = person.alternativeFirstNames.length > 0 ? ' (' + person.alternativeFirstNames.join(', ') + ')' : '';\n const altLastNames = person.alternativeLastNames.length > 0 ? ' (' + person.alternativeLastNames.join(', ') + ')' : '';\n return (\n \n {person.lastName}{altLastNames}\n
\n {person.firstName}{altFirstNames}\n
\n );\n }, { sortable: true, clickable: true }, (a, b) => a.name.localeCompare(b.name)),\n new StringTableColumn('birthDate', T('listPersons.column.birthDate'), person => person.birthDateFormatted, { width: 110 }),\n new StringTableColumn('diedDate', T('listPersons.column.diedDate'), person => person.diedDateFormatted, { width: 110 }),\n new ComponentTableColumn('type', T('listPersons.column.type'), person => {\n const militaryEvents = person.militaryEvents || [];\n const army = militaryEvents.length > 0 ? militaryEvents[0].enlisted_army : undefined;\n return <>\n {person.describeType()}\n
\n {army && `(${army}) `}{person.inNamelist ? T('person.isNamelist') : ''}\n ;\n }, { sortable: false, width: 140, className: styles.nowrap, clickable: true }),\n new ComponentTableColumn('details', T('listPersons.column.details'), person => {\n if (person.victimType === VictimType.Military) {\n const militaryEvents = person.militaryEvents || [];\n const activeService = militaryEvents.find(e => e.enlisted_reason === MilitaryEventType.ActiveService);\n const serviceNumbers = distinct(\n militaryEvents\n .map(ev => ev.enlisted_number)\n .filter(n => n)\n );\n const ranks = distinct(\n militaryEvents\n .map(ev => ev.enlisted_rank)\n .filter(rank => rank)\n );\n const name = activeService && getMilitaryEntityName(activeService);\n return (\n <>\n {serviceNumbers.join(' / ')}\n {' '}\n {ranks.join(', ')}\n
\n {name && {name}}\n \n );\n } else {\n return ;\n }\n }, { clickable: true, sortable: false, className: styles.militaryInfoColumn }),\n new ComponentTableColumn('memorials', T('listPersons.column.memorials'), person => {\n const memorials = selectDisplayedMemorials(person.memorials || []);\n const links = memorials.map(memorial => (\n \n \n {' '}\n {memorial.name}\n \n ));\n return (\n \n {links}\n \n )\n }, { sortable: false })\n ];\n if (user.canEdit()) {\n result.push(\n new ActionsTableColumn('actions', T('listPersons.column.actions'), person => {\n const result: ITableRowAction[] = [];\n result.push({\n icon: Icon.Edit,\n style: TableRowActionStyle.Success,\n tooltip: T('generic.action.edit'),\n page: PageID.EditPerson,\n pageParam: person.id\n });\n if (onClickedMerge) {\n result.push({\n icon: state => ,\n style: TableRowActionStyle.Warning,\n tooltip: T('generic.action.merge'),\n onClick: (person, state) => onClickedMerge(person, state)\n });\n }\n if (onClickedRemove) {\n result.push({\n icon: Icon.TimesCircle,\n style: TableRowActionStyle.Danger,\n tooltip: T('generic.action.remove'),\n onClick: person => onClickedRemove(person)\n });\n }\n return result;\n }, { width: 120 })\n );\n }\n return result;\n}\n\nexport function getSortColumn(column: string) {\n switch (column) {\n default:\n return 'filter';\n case 'birthDate':\n return 'sort_born_date';\n case 'diedDate':\n return 'sort_died_date';\n }\n}\n\nexport interface ListPersonsStateProps extends ListState {\n dataset: Dataset;\n mergingFirst?: Person;\n mergingSecond?: Person;\n}\n\ninterface ListPersonsPageProps extends PageProps {\n dataset?: Dataset\n}\n\nexport const rowKey = (item: Person) => item.id;\nconst PageSize = 10;\n\nexport default (props: ListPersonsPageProps) => {\n const { history, loading, modals, via } = props;\n\n const [pageState, updatePageState] = usePageState('persons');\n const { filter, tablePage, sortColumn, sortDirection, dataset, mergingFirst, mergingSecond } = pageState;\n const datasetOptions = useMemo(\n () => AccessibleDatasets.map(dataset => (\n \n )),\n []\n );\n\n useEffect(\n () => updatePageState({ dataset: props.dataset || Dataset.Any }),\n [updatePageState, props.dataset]\n );\n\n const [items, setItems] = useState>();\n const refresh = useRefresh(() => {\n loading.loading(\n api.findPersons(\n {},\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]],\n [PersonQueryOptions.Memorials, PersonQueryOptions.MilitaryEvents],\n dataset\n ), plural('person'))\n .then(results => setItems({\n total: results.total,\n data: results.data.map(x => new Person(x))\n }));\n });\n useEffect(refresh, [filter, tablePage, sortColumn, sortDirection, dataset]);\n\n const handleDatasetChanged = (e: React.SyntheticEvent) => {\n updatePageState({ dataset: e.currentTarget.value as Dataset });\n };\n\n const handleClickedAdd = () => {\n history.push('/persons/create');\n };\n\n const handleClickedRow = (person: Person) => {\n history.push(`/persons/${person.id}`);\n };\n\n const handleClickedCancelMerge = () => {\n updatePageState({\n mergingFirst: undefined,\n mergingSecond: undefined,\n });\n }\n\n const columns = useMemo(\n () => {\n const handleClickedRemove = async (person: Person) => {\n const confirmed = await modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n\n await api.removePerson(person.id)\n NotificationManager.success(T('modal.removePerson.removed', { name: person.name }));\n refresh();\n };\n\n const handleClickedMerge = async (person: Person, state: PersonListState) => {\n const mergingFirst = state.selectedForMerge[0];\n if (!mergingFirst) {\n updatePageState({ mergingFirst: person });\n return;\n }\n if (mergingFirst.id === person.id) {\n updatePageState({ mergingFirst: undefined });\n return;\n }\n\n updatePageState({ mergingSecond: person });\n const result = await modals.show(props => (\n \n ));\n if (!result.confirmed) {\n updatePageState({\n mergingSecond: undefined\n });\n return;\n }\n\n updatePageState({\n mergingFirst: undefined,\n mergingSecond: undefined\n });\n\n await api.mergePersons(result.personA.id, result.personB.id);\n showNotification({\n message: T('modal.mergePerson.merged', { a: mergingFirst.name, b: person.name })\n });\n if (result.openResult) {\n history.push(`/persons/${result.personA.id}`);\n } else {\n refresh();\n }\n };\n\n return generatePersonsColumns(handleClickedRemove, handleClickedMerge);\n },\n [history, modals, refresh, updatePageState]\n );\n\n const tableState = useMemo(() => {\n const merging: Person[] = [];\n if (mergingFirst)\n merging.push(mergingFirst);\n if (mergingSecond)\n merging.push(mergingSecond);\n return { selectedForMerge: merging };\n }, [mergingFirst, mergingSecond]);\n\n const additionalHeader = <>\n \n {datasetOptions}\n \n {mergingFirst && (\n \n \n \n \n )}\n ;\n\n return (\n \n );\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { IQueryResult } from '../../models/Generic';\nimport api from '../../api';\nimport { T } from '../../Translate';\nimport { Card } from 'react-bootstrap';\nimport { usePageState } from '../../redux/Actions';\nimport { PageProps } from '../Page';\nimport { useRefresh } from '../../utils/Functional';\nimport { getPageLink, PageID } from '../../utils/PageLinking';\nimport { SortDirection, Table } from \"../../components/table/Table\";\nimport { generatePersonsColumns } from \"../ListPersons\";\nimport { Person, PersonQueryOptions } from \"../../models/Person\";\nimport { Search } from \"../../components/Search\";\nimport { useDelayedUpdateEffect } from \"../../utils/UpdateEffects\";\nimport { IMemorial } from \"../../models/Memorial\";\nimport { ITableColumn } from \"../../components/table/Fields\";\nimport { ConfirmationModal } from \"../../modals/Confirmation\";\nimport { NotificationManager } from \"react-notifications\";\n\n\nconst PageSize = 10;\nconst rowKey = (item: Person, index: number) => item.id;\n\ninterface ListPersonsTabProps extends PageProps {\n memorial?: IMemorial\n readonly: boolean\n}\n\n/**\n *\n */\nconst ListPersonsOnMemorial = (props: ListPersonsTabProps) => {\n\n /*** state ***/\n\n const [pageState, updatePageState] = usePageState('memorialPersons');\n const [items, setItems] = useState>();\n const [memorial, setMemorial] = useState(props.memorial)\n\n /*** variables ***/\n\n const { history, loading, modals } = props;\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n /*** api ***/\n\n const loadData = (skip: number, limit: number): Promise|undefined> => {\n const {filter, sortColumn, sortDirection} = pageState;\n return loading.loading(\n api.findPersons(\n {memorials: memorial?._id},\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]],\n [PersonQueryOptions.MilitaryEvents])\n .then((queryResult) => {\n return {\n data: queryResult.data.map(iPerson => new Person(iPerson)),\n total: queryResult.total\n }\n }),\n 'persons'\n );\n }\n\n /*** effects ***/\n useEffect(() => {\n setMemorial(props.memorial)\n }, [props.memorial])\n\n const refresh = useRefresh(() => {\n if (!props.memorial?._id)\n return;\n loadData(tablePage * PageSize, PageSize).then(data => {\n setItems(data);\n })\n });\n\n useEffect(refresh, [tablePage, sortColumn, sortDirection]);\n\n useDelayedUpdateEffect(\n () => {\n refresh();\n updatePageState({tablePage: 0});\n },\n 500,\n [filter]\n );\n\n useEffect(refresh, [memorial])\n\n /*** table handlers ***/\n\n const handlePageChanged = (page: number) => {\n updatePageState({ tablePage: page });\n };\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n updatePageState({ sortColumn: column, sortDirection: direction });\n };\n\n const handleClickedRow = (item: Person) => {\n history.push(getPageLink(PageID.ViewPerson, item.id));\n }\n\n const handlePersonFilterChanged = (value: string) => {\n updatePageState({...pageState, filter: value})\n }\n\n /*** table helpers ***/\n\n const columns: ITableColumn[] = useMemo(() => {\n\n const handleClickedRemovePerson = async (person: Person) => {\n if (!memorial)\n return\n\n const confirmed = await modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n\n await api.removePersonFromMemorial(person.id, memorial?._id);\n NotificationManager.success(T('modal.removePersonFromMemorial.removed', {name: person.name}));\n refresh();\n }\n\n // copy the column definitions from the list persons page and filter out the 'memorials' column\n let columns = generatePersonsColumns(handleClickedRemovePerson);\n if (props.readonly === true) {\n columns = columns.filter(column => column.id !=='actions' && column.id !== 'memorials')\n }\n return columns\n }, [memorial, modals, props.readonly, refresh]);\n\n const getSortColumn = (column: string) => {\n switch (column) {\n default:\n return 'filter';\n case 'birthDate':\n return 'sort_born_date';\n case 'diedDate':\n return 'sort_died_date';\n }\n }\n\n /*** rendering ***/\n\n return (\n <>\n \n
\n \n
\n
\n \n \n \n \n );\n}\n\nexport default ListPersonsOnMemorial;\n","import React from 'react';\nimport { Page, PageProps } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport { Card } from 'react-bootstrap';\nimport api from '../../api';\nimport { PlaceLink } from '../../components/PlaceLink';\nimport { T } from '../../Translate';\nimport { GetMemorialOption, describeMemorialKind } from '../../models/Memorial';\nimport { useMemorial, useNumberOfRelatedDocuments } from '../../FunctionalAPI';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\nimport { TextStyles } from \"../../config/styles\";\nimport { TopTab, TopTabs } from \"../../components/TopTabs\";\nimport ListDocumentsTab from \"../ViewPlace/ListDocumentsTab\";\nimport ListPersonsOnMemorial from \"./ListPersonsOnMemorial\";\n\ninterface ViewMemorialPageProps extends PageProps {\n id: string;\n}\n\nconst LoadOptions = [GetMemorialOption.Place];\n\nconst ViewMemorial = (props: ViewMemorialPageProps) => {\n\n const { loading, id, history, modals, via } = props;\n\n const memorial = useMemorial(loading, id, LoadOptions);\n const numberOfDocuments = useNumberOfRelatedDocuments('memorial', memorial?._id )\n\n const user = api.user;\n\n /*** rendering ***/\n const generateTabs = (): TopTab[] => {\n return [\n {\n icon: Icon.Monument,\n title: T('field.memorated.memorial.name'),\n id: 'memorial',\n content: () => renderMemorialTab(),\n badgeContent: () => '',\n },\n {\n icon: Icon.Document,\n title: T('page.place.tab.documents'),\n id: 'documents',\n content: () => renderDocumentsTab(),\n badgeContent: () => numberOfDocuments.toString() }\n ]\n }\n\n const renderHeader = () => {\n return (\n \n
\n
\n {memorial &&

{memorial?.name}

}\n {memorial &&\n

{describeMemorialKind(memorial)}

}\n {memorial && memorial.extend_place &&\n

}\n
\n {user.canEdit() && (\n
\n \n \n \n
\n )}\n
\n
\n )\n }\n\n const renderMemorialTab = () => {\n return (<>\n {renderHeader()}\n {renderPersons()}\n );\n };\n\n const renderPersons = () => {\n return (\n \n \n \n );\n }\n\n const renderDocumentsTab = () => {\n if (!memorial) {\n return ''\n } else {\n return (\n <>\n {renderHeader()}\n \n \n );\n }\n }\n\n if (!memorial) {\n return (<>)\n } else {\n return (\n \n \n \n )\n }\n}\n\nexport default ViewMemorial\n","import React from 'react';\nimport { NotificationManager } from 'react-notifications';\nimport { IPersonStory2 } from \"../../models/PersonStory2\";\nimport { ConfirmationModal } from \"../../modals/Confirmation\";\nimport { ModalTarget } from \"../../modals/ModalTarget\";\nimport api from '../../api';\nimport { T } from \"../../Translate\";\n\n\nexport const deletePersonStory = (personStory: IPersonStory2, modals: ModalTarget, completed: () => void) => {\n modals.show(props => (\n \n )).then(confirmed => {\n if (!confirmed)\n return;\n\n api.removePersonStory(personStory._id).then(() => {\n NotificationManager.success(T('modal.removePersonStory.removed'));\n completed();\n });\n });\n}\n","import React, { CSSProperties } from 'react';\nimport { IPersonStory2, Language } from \"../../../models/PersonStory2\";\nimport { Form } from \"react-bootstrap\";\nimport { PersonStoryWrapper } from \"../../../models/wrappers/PersonStoryWrapper\";\nimport { InvalidFeedback } from \"../../../components/inputs/InvalidFeedback\";\n\n\nexport enum StoryIndex {\n STORY_1,\n STORY_2,\n STORY_CHILD_1,\n STORY_CHILD_2\n}\n\nexport interface StoryTextViewProps {\n name: string;\n personStory?: IPersonStory2;\n labelText: string;\n error?: string;\n language: Language;\n storyIndex: StoryIndex;\n readOnly: boolean;\n onUpdateStory: (personStory: Partial) => void;\n}\n\n\nexport const StoryTextView = (props: StoryTextViewProps) => {\n\n const labelStyle: CSSProperties = {\n fontSize: 14,\n color: '#9A9A9A',\n textTransform: \"uppercase\",\n }\n\n const textStyle: CSSProperties = {\n color: '#9A9A9A',\n }\n\n const { personStory, error, readOnly, onUpdateStory, labelText, language } = props;\n\n /** event handling **/\n\n const onTextChanged = (newText: string) => {\n const maxLength = getMaximumNumberOfChars(props.storyIndex)\n if (newText.length > maxLength)\n return\n\n updateStoryWithText(newText, props.storyIndex)\n if (personStory !== undefined) {\n onUpdateStory(personStory)\n }\n }\n\n /** Helper functions **/\n\n const updateStoryWithText = (newText: string, index: StoryIndex) => {\n if (personStory === undefined)\n return;\n const personStoryWrapper = new PersonStoryWrapper(personStory)\n personStoryWrapper.updateStoryWithText(newText, index, language)\n }\n\n const getCounter = (index: StoryIndex) => {\n if (!personStory)\n return '???'\n const textLength = getStory(index).length\n const maxLength = getMaximumNumberOfChars(index)\n return `${textLength}/${maxLength}`\n }\n\n const getStory = (index: StoryIndex) => {\n const personStoryWrapper = new PersonStoryWrapper(personStory!)\n return personStoryWrapper.getStory(index,language)\n }\n\n const getMaximumNumberOfChars = (index: StoryIndex) => {\n if (index === StoryIndex.STORY_1 || index === StoryIndex.STORY_2) {\n return 1000\n }\n return 750\n }\n\n const formControlClassName = error ? 'form-control is-invalid' : 'form-control';\n\n return (\n
\n \n {labelText}\n onTextChanged(e.currentTarget.value)}\n />\n \n {getCounter(props.storyIndex)}\n \n {error && }\n \n
\n )\n};\n","import { IPersonStory2, IPersonStoryText, Language, StoryStatus } from \"../PersonStory2\";\nimport { StoryIndex } from \"../../pages/EditPersonStory/Stories/StoryTextView\";\n\nexport class PersonStoryWrapper {\n personStory: IPersonStory2;\n\n constructor(personStory: IPersonStory2) {\n this.personStory = personStory\n }\n\n /** updates **/\n\n public updateStoryWithText(newText: string, index: StoryIndex, language: Language) {\n const storyTextFieldName = this.getStoryTextFieldName(index);\n let textForLanguage: IPersonStoryText = this.getOrCreateStoryText(language);\n textForLanguage[storyTextFieldName] = newText\n }\n\n public updateStoryWithStatus(newStatus: StoryStatus, index: StoryIndex, language: Language) {\n const storyStatusName = this.getStoryTextStatusName(index);\n let textForLanguage: IPersonStoryText = this.getOrCreateStoryText(language);\n textForLanguage[storyStatusName] = newStatus\n }\n\n /** get or create when not there **/\n\n public getOrCreateStoryText(language: Language): IPersonStoryText {\n if (this.personStory.story_text === null || this.personStory.story_text === undefined) {\n this.personStory.story_text = {};\n }\n\n let textForLanguage = (this.personStory.story_text[language])\n if (textForLanguage === undefined || textForLanguage === null) {\n let newStoryText = this.createEmptyStoryText(language)\n this.personStory.story_text[language] = newStoryText;\n return newStoryText;\n } else {\n return textForLanguage\n }\n }\n\n /** get **/\n\n public getStory(index: StoryIndex, language: Language): string {\n const storyTextFieldName = this.getStoryTextFieldName(index)\n if (this.personStory !== undefined) {\n const storyText = this.personStory.story_text\n if (storyText !== undefined && storyText !== null) {\n const t = storyText[language];\n if (t) {\n const story = t[storyTextFieldName] || ''\n return story;\n }\n }\n }\n return ''\n }\n\n public getStoryStatus(index: StoryIndex, language: Language): StoryStatus {\n const storyTextStatusName = this.getStoryTextStatusName(index)\n if (this.personStory !== undefined) {\n const storyText = this.personStory.story_text\n if (storyText !== undefined && storyText !== null) {\n const t = storyText[language];\n if (t) {\n const story = t[storyTextStatusName] || ''\n return story;\n }\n }\n }\n return StoryStatus.IN_PROGRESS\n }\n\n\n /** private helpers **/\n\n private getStoryTextFieldName(index: StoryIndex): 'story_part_1'|'story_part_2'|'story_child_part_1'|'story_child_part_2' {\n switch (index) {\n case StoryIndex.STORY_1:\n return 'story_part_1'\n case StoryIndex.STORY_2:\n return 'story_part_2'\n case StoryIndex.STORY_CHILD_1:\n return 'story_child_part_1'\n case StoryIndex.STORY_CHILD_2:\n return 'story_child_part_2'\n }\n }\n\n private getStoryTextStatusName(index: StoryIndex): 'story_status'|'story_child_status' {\n switch (index) {\n case StoryIndex.STORY_1:\n return 'story_status'\n case StoryIndex.STORY_2:\n return 'story_status'\n case StoryIndex.STORY_CHILD_1:\n return 'story_child_status'\n case StoryIndex.STORY_CHILD_2:\n return 'story_child_status'\n }\n }\n\n private createEmptyStoryText(language: Language): IPersonStoryText {\n return {\n story_part_1: '',\n story_part_2: '',\n story_status: StoryStatus.IN_PROGRESS,\n story_child_part_1: '',\n story_child_part_2: '',\n story_child_status: StoryStatus.IN_PROGRESS,\n language: language\n }\n }\n}\n","import React from \"react\";\nimport { IPersonStory2, Language, StoryStatus } from \"../../../models/PersonStory2\";\nimport { Badge } from \"react-bootstrap\";\nimport { StoryIndex } from \"./StoryTextView\";\nimport { PersonStoryWrapper } from \"../../../models/wrappers/PersonStoryWrapper\";\n\nconst badgeVariantForStatus = (status: StoryStatus) => {\n switch(status) {\n case StoryStatus.IN_PROGRESS:\n return 'secondary'\n case StoryStatus.IN_REVIEW:\n return 'warning';\n case StoryStatus.DONE:\n return 'success'\n }\n}\n\ninterface PersonStoryLanguageStatusBadgeProps {\n language: Language\n status: StoryStatus\n}\n\nconst PersonStoryLanguageStatusBadge = (props: PersonStoryLanguageStatusBadgeProps) => {\n const badgeText = props.language as string\n const badgeVariant = badgeVariantForStatus(props.status)\n return ({badgeText})\n}\n\nexport interface PersonStoryStatusViewForLanguagesProps {\n personStory: IPersonStory2\n storyIndex: StoryIndex\n}\n\nexport function PersonStoryStatusViewForLanguages(props: PersonStoryStatusViewForLanguagesProps) {\n const personStoryWrapper = new PersonStoryWrapper(props.personStory)\n return (\n
\n {Object.values(Language).map(language => (\n \n ))}\n
\n );\n}\n\n\nexport interface PersonStoryStatusViewForLanguageProps {\n personStory: IPersonStory2,\n storyIndex: StoryIndex,\n language: Language\n}\n\nexport function PersonStoryStatusViewForLanguage(props: PersonStoryStatusViewForLanguageProps) {\n const {language, personStory} = props;\n const personStoryWrapper = new PersonStoryWrapper(personStory)\n return (\n \n );\n}\n","import { Icon } from \"../../components/Icons\";\nimport { PersonStoryStatusViewForLanguage, PersonStoryStatusViewForLanguages } from \"../EditPersonStory/Stories/PersonStoryStatusForLanguagesView\";\nimport { StoryIndex } from \"../EditPersonStory/Stories/StoryTextView\";\nimport { IPersonStory2, Language } from \"../../models/PersonStory2\";\nimport { Badge } from \"react-bootstrap\";\nimport { T } from \"../../Translate\";\n\ninterface PersonStoryStatusViewProps {\n personStory: IPersonStory2\n}\nexport default function PersonStoryStatusView(props: PersonStoryStatusViewProps) {\n const {personStory} = props\n return (\n
\n
\n \n \n \n \n
\n
\n \n { personStory.story_child_option &&\n \n \n }\n { !personStory.story_child_option &&\n \n \n {T('personstories.no.storychild')}\n \n }\n
\n
\n );\n}\n\ninterface PersonStoryLanguageStatusViewProps {\n personStory: IPersonStory2,\n language: Language;\n}\nexport function PersonStoryLanguageStatusView(props: PersonStoryLanguageStatusViewProps) {\n const {personStory, language} = props\n return (\n
\n
\n \n \n \n \n
\n
\n );\n}\n\nexport function PersonStoryChildLanguageStatusView(props: PersonStoryLanguageStatusViewProps) {\n const {personStory, language} = props\n return (\n
\n
\n \n { personStory.story_child_option &&\n \n \n }\n { !personStory.story_child_option &&\n \n \n {T('personstories.no.storychild.short')}\n \n }\n
\n
\n );\n}\n","import React from \"react\";\nimport { Icon } from \"../../components/Icons\";\nimport { ActionsTableColumn, ComponentTableColumn, ITableColumn, StringFieldTableColumn, StringTableColumn, tableRowActions, TableRowActionStyle } from \"../../components/table/Fields\";\nimport { IPersonStory2, Language } from \"../../models/PersonStory2\";\nimport { T } from \"../../Translate\";\nimport { PersonStoryChildLanguageStatusView, PersonStoryLanguageStatusView } from \"./PersonStoryStatusView\";\n\nexport function getPersonStoryColumns(canEdit: boolean, onClickedDelete: (story: IPersonStory2) => void) {\n const columns: ITableColumn[] = [\n new StringFieldTableColumn('calculated_full_name', T('personstories.name'), { ellipsize: true, width: 200 }),\n ];\n\n for (const language of Object.values(Language)) {\n columns.push(new ComponentTableColumn(`story_text.${language}.story_status`, T('personstories.storyStatusForLanguage', {language: language}), personStory => (\n \n ), { sortable: false, width: 78, filter: [\n { key: 'in_progress', value: 'in progress', label: T('personstories.status.inprogress') },\n { key: 'in_review', value: 'in review', label: T('personstories.status.inreview') },\n { key: 'done', value: 'done', label: T('personstories.status.done') }\n ]\n }));\n }\n for (const language of Object.values(Language)) {\n columns.push(new ComponentTableColumn(`story_text.${language}.story_child_status`, T('personstories.storyChildStatusForLanguage', {language: language}), personStory => (\n \n ), { sortable: false, width: 78, filter: [\n { key: 'in_progress', value: 'in progress', label: T('personstories.status.inprogress') },\n { key: 'in_review', value: 'in review', label: T('personstories.status.inreview') },\n { key: 'done', value: 'done', label: T('personstories.status.done') }\n ]\n }));\n }\n\n columns.push(new ComponentTableColumn('keyStory', T('page.personstory.tab.keystory'), personStory => (\n personStory.key_location ? : \n ), { sortable: false, icon: 'far fa-key-skeleton', width: 30 }));\n\n columns.push(new ComponentTableColumn('photo_ok', T('personStories.storyStatusPhoto'), personStory => (\n personStory.profile_image ? : \n ), { sortable: false, icon: 'far fa-id-badge', width: 30 }));\n\n columns.push(new ComponentTableColumn('album', T('personStories.storyAlbum'), personStory => (\n personStory.extra_images?.length ? personStory.extra_images?.length : \n ), { icon: 'fas fa-images', width: 30 }));\n\n/* columns.push(new ComponentTableColumn('links', T('personStories.storyLinks'), personStory => (\n personStory.coupling_story_refs?.length ? personStory.coupling_story_refs.length : \n )));*/\n\n columns.push(new StringTableColumn('published_date', T('personstories.published.date'), personStory => (\n personStory.published_date ? new Date(personStory.published_date).toLocaleDateString() : T('personstories.notPublished')\n ), { width: 125 }));\n\n if (canEdit) {\n columns.push(new ActionsTableColumn('actions', T('generic.list.actions'), () => tableRowActions(\n { icon: Icon.TimesCircle, style: TableRowActionStyle.Danger, onClick: onClickedDelete }\n ), { width: 70 }));\n }\n return columns;\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { plural, T } from '../../Translate';\nimport api from '../../api';\nimport { IQueryResult } from '../../models/Generic';\nimport { ListPage, ListState } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { usePageState } from '../../redux/Actions';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { IPersonStory2 } from \"../../models/PersonStory2\";\nimport { deletePersonStory } from \"./actions\";\nimport { Icon } from \"../../components/Icons\";\nimport { PageID } from \"../../utils/PageLinking\";\nimport { getPersonStoryColumns } from './Columns';\n\nexport type ListPersonStoriesStateProps = ListState;\n\nfunction getSortColumn(column: string) {\n return column;\n}\n\nconst rowKey = (personStory: IPersonStory2) => personStory._id;\nconst PageSize = 10;\n\nexport default function ListPersonStories(props: PageProps) {\n const { history, loading, via } = props;\n\n const modals = useModalContext();\n const user = api.user;\n\n const [pageState, updatePageState] = usePageState('personStories');\n const { filter, tablePage, sortColumn, sortDirection, filters } = pageState;\n const [items, setItems] = useState>();\n\n const refresh = useCallback(() => {\n const document = {} as any;\n for (const filter of filters) {\n if (filter.value) {\n document[filter.column] = filter.value;\n }\n }\n console.log('document', document);\n loading.loading(api.findPersonStories2(\n document,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection], ['calculated_full_name', sortDirection]],\n filter,\n ['linked_stories']\n ), plural('personStory'))\n .then( (items) => {\n setItems(items);\n });\n }, [loading, filter, tablePage, sortColumn, sortDirection, filters]);\n useEffect(refresh, [refresh]);\n\n const columns = useMemo(() => {\n const handleClickedDelete = (personStory: IPersonStory2) => {\n deletePersonStory(personStory, modals, () => {refresh();})\n };\n\n return getPersonStoryColumns(user.canEdit(), handleClickedDelete);\n }, [user, modals, refresh]);\n\n const handleClickedRow = (personStory: IPersonStory2) => {\n const via = PageID.ListPersonStories\n history.push(`/personstories/${personStory._id}/edit?via=${via}`);\n };\n\n return (\n \n );\n}\n","import React, { useState } from 'react';\nimport { T } from '../../Translate';\nimport Autocomplete from 'react-autocomplete';\n\ninterface SimpleAutocompleteProps {\n placeholder?: string;\n loading: boolean;\n inputValue: string;\n onInputChange: (value: string) => void;\n onSelect: (value: string, item: T) => void;\n onBlur?: () => void;\n\n itemValue: (value: T) => string;\n itemKey: (value: T) => string|number;\n renderItem: (value: T) => React.ReactNode;\n options: T[];\n\n invalid?: boolean;\n readOnly?: boolean;\n}\n/**\n * This autocomplete component accepts an input value, options list and item\n * renderer to build the autocomplete input component.\n * \n * Easier to use (and appriopriately styled) in comparison to the\n * react-autocomplete component. Also shows the loading state and a message if\n * there are no results.\n */\nexport const SimpleAutocomplete = (props: SimpleAutocompleteProps) => {\n const {\n placeholder,\n loading,\n inputValue,\n onInputChange,\n onSelect,\n onBlur,\n itemValue,\n itemKey,\n renderItem,\n options,\n invalid,\n readOnly\n } = props;\n const [changed, setChanged] = useState(false);\n\n const handleChange = (e: React.ChangeEvent) => {\n setChanged(true);\n onInputChange(e.currentTarget.value);\n };\n\n return (\n \n item === undefined ? (\n
{\n inputValue.length === 0\n ? T('component.search.typeToSearch')\n : (loading ? T('component.search.searching') : T('component.search.noResults'))\n }
\n ) : (\n
\n {renderItem(item)}\n
\n )\n }\n value={inputValue}\n onChange={handleChange}\n onSelect={onSelect}\n />\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport api from '../../api';\nimport { useElementID } from '../../utils/ElementID';\nimport { IMemorial } from '../../models/Memorial';\nimport { TextMode } from '../../models/SpecialFunction';\nimport { SortDirection } from '../table/Table';\nimport { InputGroup } from './InputGroup';\nimport { SimpleAutocomplete } from './SimpleAutocomplete';\nimport { IPlace } from '../../models/Place';\nimport { PlaceLink } from \"../PlaceLink\";\n\ninterface MemorialInputProps {\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n error?: string;\n\n value: IMemorial|undefined;\n onChange: (memorial: IMemorial) => void;\n}\n\nexport const MemorialInput = (props: MemorialInputProps) => {\n const {\n label,\n onChange,\n value,\n error\n } = props;\n const id = useElementID('input');\n const [inputText, setInputText] = useState(value ? value.name : '');\n useEffect(() => setInputText(value ? value.name : ''), [value]);\n\n const handleSelected = (selected: IMemorial) => {\n setInputText(selected.name);\n onChange(selected);\n };\n\n const [place, setPlace] = useState();\n const placeId = value && value.place_id;\n useEffect(() => {\n if (!placeId) {\n setPlace(undefined);\n return;\n }\n\n api.getPlace(placeId).then(setPlace);\n }, [placeId]);\n\n return (\n \n \n {place && }\n \n );\n}\n\ninterface MemorialInputComponentProps {\n memorial: IMemorial|undefined;\n value: string\n onSelected: (value: IMemorial) => void;\n onChange: (value: string) => void;\n searchMode?: TextMode;\n invalid?: boolean;\n placeholder?: string;\n}\ninterface MemorialInputComponentState {\n options: IMemorial[],\n modal: null | JSX.Element;\n}\n\nexport class MemorialInputComponent extends React.PureComponent {\n requestTimer?: NodeJS.Timer;\n\n constructor(props: MemorialInputComponentProps) {\n super(props);\n\n this.state = {\n options: [],\n modal: null\n };\n }\n\n handleValueChanged = (value: string) => {\n // is this a valid uuid?\n let match = value.match(/.*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})/);\n if (match) {\n this.setState({ options: [] });\n api.getMemorial(match[1])\n .then(result => {\n if (match && result)\n this.handleSelected(match[1], result);\n });\n } else {\n this.scheduleSearch(value);\n }\n\n this.props.onChange(value);\n }\n\n handleSelected = (value: string, item: IMemorial) => {\n this.props.onSelected(item);\n\n this.setState({\n options: []\n });\n }\n\n scheduleSearch(value: string) {\n if (this.requestTimer) {\n clearTimeout(this.requestTimer);\n this.requestTimer = undefined;\n }\n\n if (!value) {\n this.setState({ options: [] });\n } else {\n this.requestTimer = setTimeout(() => this.searchMemorials(), 500);\n }\n }\n\n searchMemorials() {\n const { value, searchMode } = this.props;\n this.requestTimer = undefined;\n api.findMemorials(value, 0, 10, [['filter', SortDirection.Up]], [], searchMode)\n .then(entities => this.setState({\n options: entities.data\n }));\n }\n\n render() {\n const { value, placeholder, invalid = false } = this.props;\n const { options } = this.state;\n return <>\n item.name}\n itemKey={item => item._id}\n renderItem={item => item.name}\n options={options}\n invalid={invalid}\n />\n {this.state.modal}\n ;\n }\n}\n","import React, { useState } from 'react';\nimport { SimpleAutocomplete } from './SimpleAutocomplete';\nimport { useDelayedEffectWithLoading } from '../../utils/DelayedEffect';\n\ninterface StringAutocompleteProps {\n placeholder?: string;\n value: string;\n onChange: (value: string) => void;\n search: (value: string) => Promise;\n}\n\nfunction identity(value: string): string {\n return value;\n}\n\n/**\n * This (simplified) autocomplete component is used to autocomplete a string\n * input with multiple suggestions. Similar interface as a regular input field,\n * but has a search function with is used to load a list of suggestions.\n */\nexport const StringAutocomplete = (props: StringAutocompleteProps) => {\n const { placeholder, value, onChange, search } = props;\n\n const [options, setOptions] = useState([]);\n const [changed, setChanged] = useState(false);\n\n const handleChange = (value: string) => {\n setChanged(true);\n onChange(value);\n };\n\n const handleSelected = (value: string) => {\n setChanged(false);\n onChange(value);\n }\n\n const loading = useDelayedEffectWithLoading(() => {\n if (!changed)\n return Promise.resolve();\n \n return search(value).then(setOptions);\n }, [search, value], 500);\n\n return (\n \n );\n}\n","import React, { useCallback } from 'react';\nimport api from '../../../api';\nimport { useElementID } from '../../../utils/ElementID';\nimport { InputGroup } from '../../../components/inputs/InputGroup';\nimport { StringAutocomplete } from '../../../components/inputs/StringAutocomplete';\nimport { T } from '../../../Translate';\n\ninterface RegimentInputProps {\n value: string;\n onChange: (value: string) => void;\n army: string;\n}\n/**\n * Input field for a regiment name. Supports autocomplete, which suggests names\n * from existing regiments in the military entities collection with the\n * specified army.\n */\nexport const RegimentInput = (props: RegimentInputProps) => {\n const { value, onChange, army } = props;\n\n const search = useCallback(\n value => api.getRegimentList({ army }, value, 0, 10),\n [army]\n );\n\n return (\n \n );\n}\n\ninterface RegimentInputGroupProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n error?: string;\n army: string;\n}\nexport const RegimentInputGroup = (props: RegimentInputGroupProps) => {\n const { value, onChange, army } = props;\n const id = useElementID('regimentInput');\n return (\n \n \n \n );\n}\n","import React, { useCallback } from 'react';\nimport api from '../../../api';\nimport { StringAutocomplete } from '../../../components/inputs/StringAutocomplete';\nimport { useElementID } from '../../../utils/ElementID';\nimport { InputGroup } from '../../../components/inputs/InputGroup';\nimport { Row, Col } from 'react-bootstrap';\nimport { T } from '../../../Translate';\n\ninterface UnitInputProps {\n army: string;\n regiment: string;\n value: string;\n onChange: (value: string) => void;\n}\n/**\n * Input field for a military unit name. Supports autocomplete, which suggests names\n * from existing units in the military entities collection with the\n * specified army and regiment.\n */\nexport const UnitInput = (props: UnitInputProps) => {\n const { army, regiment, value, onChange } = props;\n\n const search = useCallback(\n value => api.getUnitList({ army, regiment }, value, 0, 10),\n [army, regiment]\n );\n\n return (\n \n );\n}\n\n/**\n * Input field for a military unit number. Supports autocomplete, which suggests names\n * from existing units in the military entities collection with the\n * specified army, regiment and unit.\n */\ninterface UnitNrInputProps {\n army: string;\n regiment: string;\n unit: string;\n value: string;\n onChange: (value: string) => void;\n}\nexport const UnitNrInput = (props: UnitNrInputProps) => {\n const { army, regiment, unit, value, onChange } = props;\n\n const search = useCallback(\n value => api.getUnitNumberList({ army, regiment, unit }, value, 0, 10),\n [army, regiment, unit]\n );\n\n return (\n \n );\n}\n\ninterface UnitInputGroupProps {\n label: string;\n unitValue: string;\n unitNrValue: string;\n onChangeUnit: (value: string) => void;\n onChangeUnitNr: (value: string) => void;\n error?: string;\n army: string;\n regiment: string;\n}\n/**\n * Unit input group - consisting of a label, a unit number input, and a unit\n * name input. The unit number and unit name have autocomplete functionality\n * which is loaded from the list of existing units in the database. Only units\n * in the given army and regiment will be suggested.\n */\nexport const UnitInputGroup = (props: UnitInputGroupProps) => {\n const { unitValue, unitNrValue, onChangeUnit, onChangeUnitNr, army, regiment } = props;\n const id = useElementID('regimentInput');\n return (\n \n \n \n \n \n \n \n \n \n \n );\n}\n","import React from 'react';\nimport BaseModal, { ModalProps, BaseModalState } from '../../modals/BaseModal';\nimport { T } from '../../Translate';\nimport { Button, Modal, Form, Row, Col } from 'react-bootstrap';\nimport {\n PersonEvent,\n PersonEventType,\n getEventIcon,\n getEventTypeName,\n WhereEventType,\n MilitaryEventType,\n JailedType,\n MemoratedKind,\n translateWhereEventType,\n translateMilitaryEventType,\n translateJailedEventType,\n translateMemoratedKind,\n ICWXRMEvent\n} from '../../models/PersonEvent';\nimport { PlaceInput } from '../../components/inputs/PlaceInput';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { DateInput, DateInputValue, inputDateToSortable } from '../../components/inputs/DateInput';\nimport { SelectInput } from '../../components/inputs/SelectInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\n\nimport styles from './index.module.scss';\nimport { IPlace, isPlace } from '../../models/Place';\nimport { Armies } from '../../models/MilitaryEntity';\nimport { IMemorial, MemorialType } from '../../models/Memorial';\nimport { MemorialInput } from '../../components/inputs/MemorialInput';\nimport api from '../../api';\nimport { getErrorDescription } from '../../models/ValidationResult';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { RegimentInputGroup } from './inputs/RegimentInput';\nimport { UnitInputGroup } from './inputs/UnitInput';\n\ninterface EditEventModalProps extends ModalProps {\n event: PersonEvent;\n}\ninterface EditEventModalState extends BaseModalState {\n startDate: DateInputValue;\n startDateError?: string;\n endDate: DateInputValue;\n endDateError?: string;\n place: IPlace|undefined;\n placeError?: string;\n address: string;\n addressError?: string;\n comments: string;\n commentsError?: string;\n\n schoolName: string;\n schoolNameError?: string;\n schoolDirection: string;\n schoolDirectionError?: string;\n\n whereType: WhereEventType;\n whereTypeError?: string;\n\n workCompanyName: string;\n workCompanyNameError?: string;\n workProfession: string;\n workProfessionError?: string;\n\n militaryType: MilitaryEventType;\n militaryTypeError?: string;\n militaryArmy: string;\n militaryArmyError?: string;\n militaryRegiment: string;\n militaryRegimentError?: string;\n militaryUnitNr: string;\n militaryUnitNrError?: string;\n militaryUnit: string;\n militaryUnitError?: string;\n militaryUnitSub: string;\n militaryUnitSubError?: string;\n militaryRank: string;\n militaryRankError?: string;\n militaryServiceNumber: string;\n militaryServiceNumberError?: string;\n\n jailedType: JailedType;\n jailedTypeError?: string;\n\n injuredWound: string;\n injuredWoundError?: string;\n injuredCause: string;\n injuredCauseError?: string;\n\n diedReason: string;\n diedReasonError?: string;\n\n memoratedMemorial: IMemorial|undefined;\n memoratedMemorialError?: string;\n memoratedKind: MemoratedKind;\n memoratedKindError?: string;\n memoratedRef: string;\n memoratedRefError?: string;\n memoratedPlace?: IPlace;\n\n decoratedDecoration: string;\n decoratedDecorationError?: string;\n decoratedCitation: string;\n decoratedCitationError?: string;\n\n cwxrmBatch: string;\n cwxrmBatchError?: string;\n cwxrmCsvId: string;\n cwxrmCsvIdError?: string;\n cwxrmFirstName: string;\n cwxrmFirstNameError?: string;\n cwxrmLastName: string;\n cwxrmLastNameError?: string;\n cwxrmMail: string;\n cwxrmMailError?: string;\n cwxrmGroup: string;\n cwxrmGroupError?: string;\n}\n\nconst ARMY_OPTIONS: JSX.Element[] = Armies.map(army => (\n \n));\n\nexport class EditEventModal extends BaseModal {\n whereTypeOptions: JSX.Element[];\n militaryTypeOptions: JSX.Element[];\n jailedOptions: JSX.Element[];\n memoratedKindOptions: JSX.Element[];\n\n constructor(props: EditEventModalProps) {\n super(props, 'xl');\n\n this.whereTypeOptions = Object.values(WhereEventType).map(type => (\n \n ));\n\n this.militaryTypeOptions = Object.values(MilitaryEventType).map(type => (\n \n ));\n\n this.jailedOptions = Object.values(JailedType).map(type => (\n \n ));\n\n this.memoratedKindOptions = [MemoratedKind.Original, MemoratedKind.Current].map(type => (\n \n ));\n\n this.state = {\n visible: true,\n\n startDate: { day: '', month: '', year: '' },\n endDate: { day: '', month: '', year: '' },\n place: undefined,\n address: '',\n comments: '',\n\n schoolName: '',\n schoolDirection: '',\n\n workCompanyName: '',\n workProfession: '',\n\n whereType: WhereEventType.Fugitive,\n\n militaryType: MilitaryEventType.ActiveService,\n militaryArmy: '',\n militaryRegiment: '',\n militaryUnit: '',\n militaryUnitNr: '',\n militaryUnitSub: '',\n militaryRank: '',\n militaryServiceNumber: '',\n\n jailedType: JailedType.Jailed,\n\n injuredWound: '',\n injuredCause: '',\n\n diedReason: '',\n\n memoratedMemorial: undefined,\n memoratedRef: '',\n memoratedKind: MemoratedKind.Current,\n\n decoratedDecoration: '',\n decoratedCitation: '',\n\n cwxrmBatch: '',\n cwxrmCsvId: '',\n cwxrmFirstName: '',\n cwxrmLastName: '',\n cwxrmMail: '',\n cwxrmGroup: ''\n };\n }\n\n componentDidMount() {\n this.load(this.props.event);\n }\n\n load(event: PersonEvent) {\n this.setState({\n startDate: {\n day: event.start_day === null ? '' : event.start_day.toString(),\n month: event.start_month === null ? '' : event.start_month.toString(),\n year: event.start_year === null ? '' : event.start_year.toString()\n },\n startDateError: undefined,\n endDate: {\n day: event.end_day === null ? '' : event.end_day.toString(),\n month: event.end_month === null ? '' : event.end_month.toString(),\n year: event.end_year === null ? '' : event.end_year.toString()\n },\n endDateError: undefined,\n place: isPlace(event.extend_place) ? event.extend_place : undefined,\n placeError: undefined,\n address: event.topo || '',\n addressError: undefined,\n comments: event.description,\n commentsError: undefined,\n\n schoolName: '',\n schoolNameError: undefined,\n schoolDirection: '',\n schoolDirectionError: undefined,\n\n workCompanyName: '',\n workCompanyNameError: undefined,\n workProfession: '',\n workProfessionError: undefined,\n\n whereType: WhereEventType.Fugitive,\n whereTypeError: undefined,\n\n militaryType: MilitaryEventType.ActiveService,\n militaryTypeError: undefined,\n militaryArmy: '',\n militaryArmyError: undefined,\n militaryRegiment: '',\n militaryRegimentError: undefined,\n militaryUnit: '',\n militaryUnitError: undefined,\n militaryUnitNr: '',\n militaryUnitNrError: undefined,\n militaryUnitSub: '',\n militaryUnitSubError: undefined,\n militaryRank: '',\n militaryRankError: undefined,\n militaryServiceNumber: '',\n militaryServiceNumberError: undefined,\n\n jailedType: JailedType.Jailed,\n jailedTypeError: undefined,\n\n injuredWound: '',\n injuredWoundError: undefined,\n injuredCause: '',\n injuredCauseError: undefined,\n\n diedReason: '',\n diedReasonError: undefined,\n\n memoratedMemorial: undefined,\n memoratedMemorialError: undefined,\n memoratedRef: '',\n memoratedRefError: undefined,\n memoratedKind: MemoratedKind.Current,\n memoratedKindError: undefined,\n\n decoratedDecoration: '',\n decoratedDecorationError: undefined,\n decoratedCitation: '',\n decoratedCitationError: undefined,\n\n cwxrmBatch: '',\n cwxrmBatchError: undefined,\n cwxrmCsvId: '',\n cwxrmCsvIdError: undefined,\n cwxrmFirstName: '',\n cwxrmFirstNameError: undefined,\n cwxrmLastName: '',\n cwxrmLastNameError: undefined,\n cwxrmMail: '',\n cwxrmMailError: undefined,\n cwxrmGroup: '',\n cwxrmGroupError: undefined\n });\n\n switch (event.type) {\n case PersonEventType.School:\n this.setState({\n schoolName: event.school_name,\n schoolDirection: event.school_direction\n });\n break;\n case PersonEventType.Where:\n this.setState({\n whereType: event.where_reason\n });\n break;\n case PersonEventType.Work:\n this.setState({\n workCompanyName: event.work_company_name,\n workProfession: event.work_profession\n });\n break;\n case PersonEventType.Military:\n this.setState({\n militaryType: event.enlisted_reason,\n militaryArmy: event.enlisted_army,\n militaryRegiment: event.enlisted_regt,\n militaryUnit: event.enlisted_unit,\n militaryUnitNr: event.enlisted_nr,\n militaryUnitSub: event.enlisted_sub,\n militaryServiceNumber: event.enlisted_number,\n militaryRank: event.enlisted_rank\n });\n break;\n case PersonEventType.Jailed:\n this.setState({\n jailedType: event.jailed_type\n });\n break;\n case PersonEventType.Injured:\n this.setState({\n injuredCause: event.injured_cause,\n injuredWound: event.injured_wound\n });\n break;\n case PersonEventType.Died:\n this.setState({\n diedReason: event.death_reason\n });\n break;\n case PersonEventType.Memorated:\n this.setState({\n memoratedMemorial: event.extend_memorial,\n memoratedRef: event.memorial_ref,\n memoratedKind: event.memorial_kind\n });\n break;\n case PersonEventType.Decorated:\n this.setState({\n decoratedDecoration: event.decoration,\n decoratedCitation: event.citation\n });\n break;\n case PersonEventType.CWXRM:\n this.setState({\n cwxrmBatch: event.batch || '',\n cwxrmCsvId: (event.csv_id || '').toString(),\n cwxrmFirstName: event.first_name || '',\n cwxrmLastName: event.last_name || '',\n cwxrmMail: event.email || '',\n cwxrmGroup: event.group || ''\n });\n api.getEvent(event._id).then(event => {\n const cwxrmEvent = event as ICWXRMEvent;\n this.setState({\n cwxrmBatch: cwxrmEvent.batch || '',\n cwxrmCsvId: (cwxrmEvent.csv_id || '').toString(),\n cwxrmFirstName: cwxrmEvent.first_name || '',\n cwxrmLastName: cwxrmEvent.last_name || '',\n cwxrmMail: cwxrmEvent.email || '',\n cwxrmGroup: cwxrmEvent.group || ''\n });\n });\n break;\n }\n }\n\n toEvent(): PersonEvent {\n const { event } = this.props;\n const {\n startDate,\n endDate,\n place,\n address,\n schoolName,\n schoolDirection,\n workCompanyName,\n workProfession,\n whereType,\n militaryType,\n militaryArmy,\n militaryRegiment,\n militaryUnitNr,\n militaryUnit,\n militaryUnitSub,\n militaryRank,\n militaryServiceNumber,\n jailedType,\n injuredWound,\n injuredCause,\n diedReason,\n memoratedMemorial,\n memoratedRef,\n memoratedKind,\n memoratedPlace,\n decoratedDecoration,\n decoratedCitation,\n cwxrmBatch,\n cwxrmCsvId,\n cwxrmFirstName,\n cwxrmLastName,\n cwxrmMail,\n cwxrmGroup,\n comments\n } = this.state;\n\n\n const startDay = startDate.day === '' ? null : parseInt(startDate.day);\n const startMonth = startDate.month === '' ? null : parseInt(startDate.month);\n const startYear = startDate.year === '' ? null : parseInt(startDate.year);\n const endDay = endDate.day === '' ? null : parseInt(endDate.day);\n const endMonth = endDate.month === '' ? null : parseInt(endDate.month);\n const endYear = endDate.year === '' ? null : parseInt(endDate.year);\n const sortStart = inputDateToSortable(startDate);\n const sortEnd = inputDateToSortable(endDate);\n\n const newEvent = Object.assign({}, event, {\n start_day: startDay,\n start_month: startMonth,\n start_year: startYear,\n sort_start_date: sortStart,\n end_day: endDay,\n end_month: endMonth,\n end_year: endYear,\n sort_end_date: sortEnd,\n place_id: place ? place._id: null,\n extend_place: place,\n topo: address,\n description: comments\n }) as PersonEvent; // TypeScript isn't that smart here\n switch (newEvent.type) {\n case PersonEventType.School:\n newEvent.school_name = schoolName;\n newEvent.school_direction = schoolDirection;\n break;\n case PersonEventType.Where:\n newEvent.where_reason = whereType;\n break;\n case PersonEventType.Work:\n newEvent.work_company_name = workCompanyName;\n newEvent.work_profession = workProfession;\n break;\n case PersonEventType.Military:\n newEvent.enlisted_reason = militaryType;\n newEvent.enlisted_army = militaryArmy;\n newEvent.enlisted_regt = militaryRegiment;\n newEvent.enlisted_unit = militaryUnit;\n newEvent.enlisted_nr = militaryUnitNr;\n newEvent.enlisted_sub = militaryUnitSub;\n newEvent.enlisted_rank = militaryRank;\n newEvent.enlisted_number = militaryServiceNumber;\n break;\n case PersonEventType.Jailed:\n newEvent.jailed_type = jailedType;\n break;\n case PersonEventType.Injured:\n newEvent.injured_wound = injuredWound;\n newEvent.injured_cause = injuredCause;\n break;\n case PersonEventType.Hospitalized:\n break;\n case PersonEventType.Died:\n newEvent.death_reason = diedReason;\n break;\n case PersonEventType.Memorated:\n newEvent.memorial_id = memoratedMemorial ? memoratedMemorial._id : null;\n newEvent.memorial_kind = memoratedKind;\n newEvent.memorial_ref = memoratedRef;\n if (memoratedMemorial) {\n newEvent.extend_memorial = {\n ...memoratedMemorial,\n loc: memoratedMemorial.calc_place_loc,\n place_name: memoratedMemorial.calc_place_name\n }\n newEvent.extend_place = memoratedPlace\n }\n break;\n case PersonEventType.Decorated:\n newEvent.decoration = decoratedDecoration;\n newEvent.citation = decoratedCitation;\n break;\n case PersonEventType.CWXRM:\n newEvent.batch = cwxrmBatch;\n newEvent.csv_id = parseInt(cwxrmCsvId);\n newEvent.first_name = cwxrmFirstName;\n newEvent.last_name = cwxrmLastName;\n newEvent.email = cwxrmMail;\n newEvent.group = cwxrmGroup;\n break;\n }\n return newEvent;\n }\n\n handleStartDateChanged = (date: DateInputValue) => {\n this.setState({\n startDate: date,\n startDateError: undefined\n });\n }\n\n handleEndDateChanged = (date: DateInputValue) => {\n this.setState({\n endDate: date,\n endDateError: undefined\n });\n }\n\n handlePlaceChanged = (newPlace: IPlace|undefined) => {\n this.setState({\n place: newPlace,\n placeError: undefined\n });\n\n }\n\n handleAddressChanged = (address: string) => {\n this.setState({\n address,\n addressError: undefined\n });\n }\n\n handleCommentsChanged = (comments: string) => {\n this.setState({\n comments,\n commentsError: undefined\n });\n }\n\n handleSchoolNameChanged = (schoolName: string) => {\n this.setState({\n schoolName,\n schoolNameError: undefined\n });\n }\n\n handleSchoolDirectionChanged = (schoolDirection: string) => {\n this.setState({\n schoolDirection,\n schoolDirectionError: undefined\n });\n }\n\n handleWhereTypeChanged = (value: string) => {\n this.setState({\n whereType: value as WhereEventType,\n whereTypeError: undefined\n });\n }\n\n handleWorkCompanyNameChanged = (workCompanyName: string) => {\n this.setState({\n workCompanyName,\n workCompanyNameError: undefined\n });\n }\n\n handleWorkProfessionChanged = (workProfession: string) => {\n this.setState({\n workProfession,\n workProfessionError: undefined\n });\n }\n\n handleMilitaryTypeChanged = (value: string) => {\n this.setState({\n militaryType: value as MilitaryEventType,\n militaryTypeError: undefined\n });\n }\n\n handleMilitaryArmyChanged = (value: string) => {\n this.setState({\n militaryArmy: value,\n militaryArmyError: undefined\n });\n }\n\n handleMilitaryRegimentChanged = (militaryRegiment: string) => {\n this.setState({\n militaryRegiment,\n militaryRegimentError: undefined\n });\n }\n\n handleMilitaryUnitNrChanged = (militaryUnitNr: string) => {\n this.setState({\n militaryUnitNr,\n militaryUnitNrError: undefined\n });\n }\n\n handleMilitaryUnitChanged = (militaryUnit: string) => {\n this.setState({\n militaryUnit,\n militaryUnitError: undefined\n });\n }\n\n handleMilitaryUnitSubChanged = (militaryUnitSub: string) => {\n this.setState({\n militaryUnitSub,\n militaryUnitSubError: undefined\n });\n }\n\n handleMilitaryRankChanged = (militaryRank: string) => {\n this.setState({\n militaryRank,\n militaryRankError: undefined\n });\n }\n\n handleMilitaryServiceNumberChanged = (militaryServiceNumber: string) => {\n this.setState({\n militaryServiceNumber,\n militaryServiceNumberError: undefined\n });\n }\n\n handleJailedTypeChanged = (value: string) => {\n this.setState({\n jailedType: value as JailedType,\n jailedTypeError: undefined\n });\n }\n\n handleInjuredWoundChanged = (injuredWound: string) => {\n this.setState({\n injuredWound,\n injuredWoundError: undefined\n });\n }\n\n handleInjuredCauseChanged = (injuredCause: string) => {\n this.setState({\n injuredCause,\n injuredCauseError: undefined\n });\n }\n\n handleDiedReasonChanged = (diedReason: string) => {\n this.setState({\n diedReason,\n diedReasonError: undefined\n });\n }\n\n handleMemoratedMemorialChanged = async (memorial: IMemorial) => {\n\n let place = memorial.place_id ? await api.getPlace(memorial.place_id) : undefined\n this.setState({\n memoratedMemorial: memorial,\n memoratedMemorialError: undefined,\n memoratedPlace: place\n });\n }\n\n handleMemoratedRefChanged = (memoratedRef: string) => {\n this.setState({\n memoratedRef,\n memoratedRefError: undefined\n });\n }\n\n handleMemoratedKindChanged = (value: string) => {\n this.setState({\n memoratedKind: value as MemoratedKind,\n memoratedKindError: undefined\n });\n }\n\n handleDecoratedDecorationChanged = (decoratedDecoration: string) => {\n this.setState({\n decoratedDecoration,\n decoratedDecorationError: undefined\n });\n }\n\n handleDecoratedCitationChanged = (decoratedCitation: string) => {\n this.setState({\n decoratedCitation,\n decoratedDecorationError: undefined\n });\n }\n\n handleCWXRMBatchChanged = (cwxrmBatch: string) => {\n this.setState({\n cwxrmBatch,\n cwxrmBatchError: undefined\n });\n }\n\n handleCWXRMCSVIdChanged = (cwxrmCsvId: string) => {\n this.setState({\n cwxrmCsvId,\n cwxrmCsvIdError: undefined\n });\n }\n\n handleCWXRMFirstNameChanged = (cwxrmFirstName: string) => {\n this.setState({\n cwxrmFirstName,\n cwxrmFirstNameError: undefined\n });\n }\n\n handleCWXRMLastNameChanged = (cwxrmLastName: string) => {\n this.setState({\n cwxrmLastName,\n cwxrmLastNameError: undefined\n });\n }\n\n handleCWXRMMailChanged = (cwxrmMail: string) => {\n this.setState({\n cwxrmMail,\n cwxrmMailError: undefined\n });\n }\n\n handleCWXRMGroupChanged = (cwxrmGroup: string) => {\n this.setState({\n cwxrmGroup,\n cwxrmGroupError: undefined\n });\n }\n\n handleClickedCancel = () => {\n this.close();\n }\n\n handleClickedSave = () => {\n const event = this.toEvent();\n api.validateEvent(event, event._id ? 'update' : 'create')\n .then(result => {\n if (result.status !== 'OK') {\n const errors = result.data || {};\n this.setState({\n startDateError: getErrorDescription(errors.start_day),\n endDateError: getErrorDescription(errors.end_day),\n placeError: getErrorDescription(errors.place_id),\n addressError: getErrorDescription(errors.topo),\n commentsError: getErrorDescription(errors.description),\n\n schoolNameError: getErrorDescription(errors.school_name),\n schoolDirectionError: getErrorDescription(errors.school_direction),\n whereTypeError: getErrorDescription(errors.where_reason),\n workCompanyNameError: getErrorDescription(errors.work_company_name),\n workProfessionError: getErrorDescription(errors.work_profession),\n militaryTypeError: getErrorDescription(errors.enlisted_reason),\n militaryArmyError: getErrorDescription(errors.enlisted_army),\n militaryRegimentError: getErrorDescription(errors.enlisted_regt),\n militaryUnitError: getErrorDescription(errors.enlisted_unit),\n militaryUnitNrError: getErrorDescription(errors.enlisted_nr),\n militaryUnitSubError: getErrorDescription(errors.enlisted_sub),\n militaryRankError: getErrorDescription(errors.enlisted_rank),\n militaryServiceNumberError: getErrorDescription(errors.enlisted_number),\n jailedTypeError: getErrorDescription(errors.jailed_type),\n injuredWoundError: getErrorDescription(errors.injured_wound),\n injuredCauseError: getErrorDescription(errors.injured_cause),\n diedReasonError: getErrorDescription(errors.reason),\n memoratedMemorialError: getErrorDescription(errors.memorial_id),\n memoratedRefError: getErrorDescription(errors.memorial_ref),\n memoratedKindError: getErrorDescription(errors.memorial_kind),\n decoratedDecorationError: getErrorDescription(errors.decoration),\n decoratedCitationError: getErrorDescription(errors.citation),\n cwxrmBatchError: getErrorDescription(errors.batch),\n cwxrmCsvIdError: getErrorDescription(errors.csv_id),\n cwxrmFirstNameError: getErrorDescription(errors.first_name),\n cwxrmLastNameError: getErrorDescription(errors.last_name),\n cwxrmMailError: getErrorDescription(errors.email),\n cwxrmGroupError: getErrorDescription(errors.group)\n });\n return;\n }\n this.resolve(event);\n });\n }\n\n getEventLeftFields() {\n const { event } = this.props;\n const {\n startDate,\n startDateError,\n endDate,\n endDateError,\n place,\n placeError,\n address,\n addressError,\n\n schoolName,\n schoolNameError,\n schoolDirection,\n schoolDirectionError,\n\n workCompanyName,\n workCompanyNameError,\n workProfession,\n workProfessionError,\n\n whereType,\n whereTypeError,\n\n militaryType,\n militaryTypeError,\n militaryArmy,\n militaryArmyError,\n militaryRegiment,\n militaryRegimentError,\n militaryUnitNr,\n militaryUnitNrError,\n militaryUnit,\n militaryUnitError,\n militaryUnitSub,\n militaryUnitSubError,\n militaryRank,\n militaryRankError,\n militaryServiceNumber,\n militaryServiceNumberError,\n\n jailedType,\n jailedTypeError,\n\n injuredWound,\n injuredWoundError,\n injuredCause,\n injuredCauseError,\n\n diedReason,\n diedReasonError,\n\n memoratedMemorial,\n memoratedMemorialError,\n memoratedRef,\n memoratedRefError,\n memoratedKind,\n memoratedKindError,\n\n decoratedDecoration,\n decoratedDecorationError,\n decoratedCitation,\n decoratedCitationError,\n\n cwxrmBatch,\n cwxrmBatchError,\n cwxrmCsvId,\n cwxrmCsvIdError,\n cwxrmFirstName,\n cwxrmFirstNameError,\n cwxrmLastName,\n cwxrmLastNameError,\n cwxrmMail,\n cwxrmMailError,\n cwxrmGroup,\n cwxrmGroupError,\n } = this.state;\n const { type } = event;\n\n const result: JSX.Element[] = [];\n if (type === PersonEventType.Decorated\n || type === PersonEventType.CWXRM\n || type === PersonEventType.Military\n || type === PersonEventType.Born\n || type === PersonEventType.Died) {\n // only start date\n result.push(\n \n );\n } else {\n // start and end date\n result.push(\n \n );\n result.push(\n \n );\n }\n if (type !== PersonEventType.Memorated\n && type !== PersonEventType.Decorated)\n result.push(\n \n );\n if ( type === PersonEventType.Born\n || type === PersonEventType.Where\n || type === PersonEventType.Military\n || type === PersonEventType.Jailed\n || type === PersonEventType.Injured\n || type === PersonEventType.Hospitalized\n || type === PersonEventType.Died) {\n result.push(\n \n );\n }\n if (type === PersonEventType.School) {\n result.push(\n ,\n \n );\n }\n if (type === PersonEventType.Where) {\n result.push(\n \n );\n }\n if (type === PersonEventType.Work) {\n result.push(\n ,\n \n );\n }\n if (type === PersonEventType.Military) {\n result.push(\n ,\n {T('army.selectOne')},\n ...ARMY_OPTIONS\n ]}\n error={militaryArmyError}\n />,\n ,\n ,\n ,\n ,\n \n );\n }\n if (type === PersonEventType.Jailed) {\n result.push(\n \n );\n }\n if (type === PersonEventType.Injured) {\n result.push(\n ,\n \n );\n }\n if (type === PersonEventType.Died) {\n result.push(\n \n );\n }\n if (type === PersonEventType.Memorated) {\n result.push(\n ,\n \n );\n if (memoratedMemorial?.type === MemorialType.Cemetery) {\n result.push(\n \n );\n }\n }\n if (type === PersonEventType.Decorated) {\n result.push(\n ,\n \n );\n }\n if (type === PersonEventType.CWXRM) {\n result.push(\n ,\n ,\n ,\n ,\n ,\n \n );\n }\n return result;\n }\n\n getEventRightFields() {\n const { comments } = this.state;\n const result: JSX.Element[] = [];\n result.push(\n \n );\n return result;\n }\n\n renderModal() {\n const { event } = this.props;\n\n return <>\n \n \n \n {' '}\n {getEventTypeName(event.type)}\n \n \n \n
\n \n \n {this.getEventLeftFields()}\n \n \n {this.getEventRightFields()}\n \n \n
\n
\n \n \n \n \n ;\n }\n}\n","import React, { useMemo } from 'react';\nimport { IPersonRelation, PersonRelationType, Person, Gender } from '../../models/Person';\nimport { Row, Col, Button, Card } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { Icon } from '../../components/Icons';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\n\ninterface LinkedPersonViewProps {\n gender: Gender;\n relation: IPersonRelation;\n index: number;\n onChange: (index: number, value: IPersonRelation) => void;\n onClickedDelete: (index: number) => void;\n}\nconst PersonRelationTypes = [\n PersonRelationType.Family,\n PersonRelationType.Married,\n PersonRelationType.Parent,\n PersonRelationType.Child,\n PersonRelationType.Sibling,\n PersonRelationType.Friend,\n PersonRelationType.Fieldmate,\n PersonRelationType.Cousin,\n PersonRelationType.Grandchild,\n PersonRelationType.Grandparent,\n PersonRelationType.Other\n];\n\n\nexport const LinkedPersonView = (props: LinkedPersonViewProps) => {\n const { gender, relation, index, onChange, onClickedDelete } = props;\n const relationTypeOptions = useMemo(\n () => [\n ...PersonRelationTypes.map(type => ({value: type, title: Person.describePersonalRelationType(type, gender)}))\n ].map(item => ),\n [gender]\n );\n\n const handleRelationChanged = (e: React.SyntheticEvent) => {\n const newRelation = Object.assign(\n {},\n relation,\n { relation: e.currentTarget.value as PersonRelationType }\n );\n onChange(index, newRelation);\n };\n const handleCommentsChanged = (e: React.SyntheticEvent) => {\n const newRelation = Object.assign(\n {},\n relation,\n { comments: e.currentTarget.value }\n );\n onChange(index, newRelation);\n };\n const handleClickedDelete = () => onClickedDelete(index);\n\n return <>\n \n \n \n \n {relation.person && (relation.person.surname + ' ' + relation.person.familyname)}\n \n \n \n \n \n {relationTypeOptions}\n \n \n \n \n \n \n \n ;\n}\n","import React from 'react';\nimport {\n PersonEvent,\n getEventIcon,\n getEventTypeName,\n getEventInfo,\n getEventSubType,\n isRemovablePersonEvent\n} from '../../models/PersonEvent';\n\nimport styles from './index.module.scss';\nimport { Card, Button } from 'react-bootstrap';\nimport { Icon } from '../../components/Icons';\nimport { classes } from '../../utils/Styles';\n\ninterface EventViewProps {\n event: PersonEvent;\n onClickedEdit?: (event: PersonEvent) => void;\n onClickedRemove?: (event: PersonEvent) => void;\n}\nexport const EventView = (props: EventViewProps) => {\n\n const { event, onClickedEdit, onClickedRemove } = props;\n const info: JSX.Element[] = [];\n\n getEventInfo(event).forEach(entry => {\n info.push(
{entry.title}:
);\n info.push(
{entry.value}
);\n });\n const subType = getEventSubType(event);\n\n const handleClickedEdit = () => onClickedEdit && onClickedEdit(event);\n const handleClickedRemove = () => onClickedRemove && onClickedRemove(event);\n\n return (\n
\n
\n
\n \n
\n
\n
\n \n \n
\n { onClickedEdit && (\n \n )}\n { onClickedRemove && isRemovablePersonEvent(event) && (\n \n )}\n
\n

{getEventTypeName(event.type)}{subType && {' '}·{' '}{subType}}

\n
\n \n
\n {info}\n
\n
\n
\n
\n
\n );\n}\n","import React, { useMemo } from 'react';\nimport { PersonEventType, getEventIcon, getEventTypeName } from '../../../models/PersonEvent';\nimport { Dropdown, DropdownButton, ButtonGroup } from 'react-bootstrap';\nimport { T } from '../../../Translate';\n\nconst PersonEventTypes: PersonEventType[] = [\n PersonEventType.School,\n PersonEventType.Work,\n PersonEventType.Where,\n PersonEventType.Military,\n PersonEventType.Jailed,\n PersonEventType.Injured,\n PersonEventType.Hospitalized,\n PersonEventType.Memorated,\n PersonEventType.Decorated,\n PersonEventType.Extra\n];\n\ninterface AddEventControlProps {\n onClickedAdd: (type: PersonEventType) => void;\n}\n\nconst AddEventControl = (props: AddEventControlProps) => {\n const { onClickedAdd } = props;\n\n const items = useMemo(() => PersonEventTypes.map(type => (\n onClickedAdd(type)}>\n \n {' '}\n {getEventTypeName(type)}\n \n )), [onClickedAdd]);\n return (\n \n {items}\n \n );\n}\n\nexport default AddEventControl;\n","import React from 'react';\nimport { PersonEvent, PersonEventType } from '../../models/PersonEvent';\nimport { EventView } from '../ViewPerson/EventView';\nimport AddEventControl from './components/AddEventControl';\nimport { Col, Row } from \"react-bootstrap\";\n\ninterface EventsTabProps {\n events: PersonEvent[];\n onClickedEdit: (event: PersonEvent) => void;\n onClickedRemove: (event: PersonEvent) => void;\n onClickedAdd: (type: PersonEventType) => void;\n}\nexport const PersonEventsTab = (props: EventsTabProps) => {\n const { onClickedEdit, onClickedRemove, onClickedAdd, events } = props;\n const eventsRendered = events.map(event => (\n \n ));\n\n return (\n
\n
\n \n \n \n
\n \n
\n \n
\n
\n {eventsRendered}\n
\n );\n}\n","import React from 'react';\nimport { IPersonProjectMembership } from '../../models/Person';\nimport { IProject } from '../../models/Project';\nimport { FormCard } from '../../components/FormCard';\nimport { Icon } from '../../components/Icons';\nimport { T } from '../../Translate';\nimport { CheckboxInput } from '../../components/inputs/CheckboxInput';\n\ninterface PersonProjectsTabProps {\n memberships: IPersonProjectMembership[];\n projects: IProject[];\n onMembershipsChanged: (memberships: IPersonProjectMembership[]) => void;\n}\nexport const PersonProjectsTab = (props: PersonProjectsTabProps) => {\n const { memberships, projects, onMembershipsChanged } = props;\n\n const handleChecked = (project: IProject, checked: boolean) => {\n const wasMember = memberships.find(m => m.project === project._id) !== undefined;\n if (checked === wasMember)\n return;\n\n if (checked) {\n const newMemberships = [...memberships, { project: project._id, notes: '' }];\n onMembershipsChanged(newMemberships);\n } else {\n const newMemberships = memberships.filter(m => m.project !== project._id);\n onMembershipsChanged(newMemberships);\n }\n };\n const checkboxes = projects.map(project => (\n m.project === project._id) !== undefined}\n onChange={checked => handleChecked(project, checked)}\n />\n ));\n return (\n \n {checkboxes}\n \n )\n};\n","import React from 'react';\nimport { FormCard } from '../../components/FormCard';\nimport { Icon } from '../../components/Icons';\nimport { T } from '../../Translate';\nimport { IPersonStory2 } from \"../../models/PersonStory2\";\nimport { ButtonLink } from \"../../components/ButtonLink\";\nimport { Button, Col, Row } from \"react-bootstrap\";\nimport { PersonStoryHelper } from \"../../models/wrappers/PersonStoryHelper\";\n\ninterface PersonStoriesTabProps {\n personStories: IPersonStory2[];\n onPersonStorySelected: (personStory?:IPersonStory2) => void;\n}\nexport const PersonStoriesTab = (props: PersonStoriesTabProps) => {\n\n const textStyle = {\n fontSize:18,\n textDecorationLine: 'uppercase',\n color: '#9A9A9A',\n }\n\n const { personStories, onPersonStorySelected } = props;\n\n const links = personStories.map(personStory => (\n {onPersonStorySelected(personStory)}}>\n {PersonStoryHelper.personName(personStory)}\n \n ));\n\n if (personStories.length > 0) {\n return (\n \n {links}\n \n )\n } else {\n return (<>\n \n \n \n

\n {T(\"page.person.tab.personStories.addPersonStory.description\")}\n

\n \n \n
\n \n \n \n \n \n \n \n \n )\n }\n};\n","import React from 'react';\nimport { BasePage, PageProps, PageState } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport { Row, Col, Form, FormGroup, Button, Card, Alert } from 'react-bootstrap';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { SelectInput, ISelectOption } from '../../components/inputs/SelectInput';\nimport {\n Gender,\n VictimType,\n VictimSubType,\n IPerson,\n PersonRelationType,\n PersonQueryOptions,\n IPersonFields,\n IPersonProjectMembership, Person\n} from '../../models/Person';\nimport { DateInput, DateInputValue, emptyDate, inputDateToSortable } from '../../components/inputs/DateInput';\nimport { FormCard } from '../../components/FormCard';\nimport { RadioInput } from '../../components/inputs/RadioInput';\nimport { TopTabs, TopTab } from '../../components/TopTabs';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { ReferenceInput } from '../../components/inputs/ReferenceTypeaheadInput';\nimport { DocumentReferenceType, DocumentReference } from '../../models/DocumentReference';\nimport {\n PersonEvent,\n PersonEventType,\n createNewEvent,\n personEventSorter, PersonEventLoadOption\n} from '../../models/PersonEvent';\nimport { IPersonRelation } from '../../models/Person';\n\nimport { IPersonDocument, IPersonDocumentFields } from '../../models/PersonDocument';\nimport { EditEventModal } from './EditEventModal';\nimport { T, singular, plural } from '../../Translate';\nimport { LinkedPersonView } from './LinkedPersonView';\nimport api from '../../api';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { IValidationResult, getErrorDescription } from '../../models/ValidationResult';\nimport { PersonEventsTab } from './PersonEventsTab';\nimport { showNotification } from '../../utils/Notification';\nimport { IAttachment } from '../../models/Attachment';\nimport { IProject } from '../../models/Project';\nimport { PersonProjectsTab } from './PersonProjectsTab';\nimport { ActiveContactMoment } from '../../models/ActiveContactMoment';\nimport { connect } from 'react-redux';\nimport { AppState } from '../../redux/State';\nimport { Dispatch } from 'redux';\nimport { AnyAppAction, registerContactMomentContributionAction } from '../../redux/Actions';\nimport { ContactMomentContribution } from '../../models/ContactPerson';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { NotificationManager } from 'react-notifications';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\nimport { IPersonStory2 } from \"../../models/PersonStory2\";\nimport { PersonStoriesTab } from \"./PersonStoriesTab\";\nimport ListDocumentsTab from \"../ViewPlace/ListDocumentsTab\";\nimport EmptyMessage from \"./components/EmptyMessage\";\n\n\ninterface EditPersonOwnProps extends PageProps {\n id?: string;\n}\ninterface EditPersonStateProps {\n contactMoment?: ActiveContactMoment;\n}\ninterface EditPersonDispatchProps {\n registerContribution: (contribution: ContactMomentContribution) => void;\n}\ntype EditPersonProps = EditPersonOwnProps & EditPersonStateProps & EditPersonDispatchProps;\n\ninterface EditPersonState extends PageState {\n person?: IPerson;\n\n firstName: string;\n firstNameError?: string;\n lastName: string;\n lastNameError?: string;\n firstNameAlt: string;\n firstNameAltError?: string;\n lastNameAlt: string;\n lastNameAltError?: string;\n gender: Gender;\n genderError?: string;\n bornDate: DateInputValue;\n bornDateError?: string;\n diedDate: DateInputValue;\n diedDateError?: string;\n age: string;\n ageError?: string;\n warCasualty: boolean;\n warCasualtyError?: string;\n victimType: VictimType;\n victimTypeError?: string;\n victimSubType: VictimSubType;\n victimSubTypeError?: string;\n isNamelister: boolean;\n isNamelisterError?: string;\n isIMR: boolean; // Irish Memorial Records (=> see the memorial)\n isIMRError?: string;\n familyInfo: string;\n familyInfoError?: string;\n relations: IPersonRelation[];\n projectMemberships: IPersonProjectMembership[];\n\n events: PersonEvent[];\n documents: IPersonDocument[];\n projects: IProject[];\n personStories: IPersonStory2[];\n\n /// The number of document related to this person\n numberOfDocuments: number\n}\n\nconst IMR_MEMORIAL_ID = '1c22d351-52e4-4067-bffa-778672073e99';\n\nclass EditPersonPage extends BasePage {\n genderOptions: ISelectOption[];\n warCasualtyOptions: ISelectOption[];\n victimTypeOptions: ISelectOption[];\n victimSubTypeOptions: ISelectOption[];\n namelisterOptions: ISelectOption[];\n isIMROptions: ISelectOption[];\n\n constructor(props: EditPersonProps) {\n super(props);\n\n this.genderOptions = [\n { value: Gender.Male, title: T('gender.male') },\n { value: Gender.Female, title: T('gender.female') },\n { value: Gender.Undefined, title: T('gender.undefined') }\n ];\n this.warCasualtyOptions = [\n { value: 'N', title: T('person.survivor') },\n { value: 'Y', title: T('person.victim') }\n ];\n this.victimTypeOptions = [\n { value: VictimType.Military, title: T('victimType.military')},\n { value: VictimType.Civilian, title: T('victimType.civilian') }\n ];\n this.victimSubTypeOptions = [\n { value: VictimSubType.Unknown, title: T('victimSubType.unknown') },\n { value: VictimSubType.Deportated, title: T('victimSubType.deportated') },\n { value: VictimSubType.Executed, title: T('victimSubType.executed') }\n ];\n this.namelisterOptions = [\n { value: 'Y', title: T('yes') },\n { value: 'N', title: T('no') }\n ];\n this.isIMROptions = [\n { value: 'Y', title: T('person.isIMR.yes') },\n { value: 'N', title: T('person.isIMR.no') }\n ];\n\n this.state = {\n page: {\n id: props.id ? PageID.EditPerson : PageID.CreatePerson,\n entity: props.id,\n icon: Icon.User,\n title: T('page.person.title.create'),\n via: props.via || 'persons'\n },\n\n firstName: '',\n lastName: '',\n firstNameAlt: '',\n lastNameAlt: '',\n gender: Gender.Undefined,\n bornDate: emptyDate(),\n diedDate: emptyDate(),\n age: '',\n warCasualty: false,\n isNamelister: true,\n isIMR: false,\n\n victimType: VictimType.Civilian,\n victimSubType: VictimSubType.Unknown,\n familyInfo: '',\n relations: [],\n\n projectMemberships: [],\n\n events: [],\n documents: [],\n projects: [],\n personStories:[],\n\n numberOfDocuments: 0\n };\n }\n\n /*** life cycle ***/\n\n async componentDidMount() {\n\n super.componentDidMount();\n await this.loadProjects();\n this.loadNumberOfDocuments();\n }\n\n async componentDidUpdate(oldProps: EditPersonProps, oldState: EditPersonState) {\n super.componentDidUpdate(oldProps, oldState);\n if (oldProps.id !== this.props.id) {\n if (this.props.id) {\n this.loadContent();\n } else {\n this.clear();\n }\n }\n\n if (this.state.person?._id !== oldState.person?._id) {\n this.loadNumberOfDocuments();\n }\n }\n\n clear() {\n this.setState({\n page: {\n id: this.props.id ? PageID.EditPerson : PageID.CreatePerson,\n entity: this.props.id,\n icon: Icon.User,\n title: T('page.person.title.create'),\n via: this.props.via || 'persons'\n },\n\n firstName: '',\n firstNameError: undefined,\n lastName: '',\n lastNameError: undefined,\n firstNameAlt: '',\n firstNameAltError: undefined,\n lastNameAlt: '',\n lastNameAltError: undefined,\n gender: Gender.Undefined,\n genderError: undefined,\n bornDate: emptyDate(),\n bornDateError: undefined,\n diedDate: emptyDate(),\n diedDateError: undefined,\n age: '',\n ageError: undefined,\n warCasualty: false,\n warCasualtyError: undefined,\n isNamelister: true,\n isNamelisterError: undefined,\n isIMR: false,\n isIMRError: undefined,\n\n victimType: VictimType.Civilian,\n victimTypeError: undefined,\n victimSubType: VictimSubType.Unknown,\n victimSubTypeError: undefined,\n familyInfo: '',\n familyInfoError: undefined,\n\n projectMemberships: [],\n\n relations: [],\n events: [],\n documents: []\n });\n }\n\n loadProjects() {\n this.loading(api.findProjects(undefined, undefined, undefined, []), plural('project'))\n .then(projects => this.setState({ projects: projects.data }));\n }\n\n loadPersonStories() {\n if (this.state.person === undefined) {\n return;\n }\n\n\n this.loading(api.findPersonStoriesForPerson(this.state.person._id), plural('person'))\n .then(personstories => {\n this.setState({ personStories: personstories.data })\n });\n }\n\n loadContent() {\n const { id, via } = this.props;\n if (!id)\n return;\n\n this.loading(api.getPerson(\n id,\n [PersonQueryOptions.EventsWithPlaces, PersonQueryOptions.Documents, PersonQueryOptions.RelationPersons]\n ), singular('person')).then(person => {\n const events = person.events || [];\n events.sort(personEventSorter);\n const name = person.surname + ' ' + person.familyname.toUpperCase();\n this.setState({\n page: {\n id: this.props.id ? PageID.EditPerson : PageID.CreatePerson,\n entity: this.props.id,\n icon: Icon.User,\n title: T('page.person.title.edit', { name }),\n shortTitle: T('generic.breadcrumb.edit'),\n via: via || 'person-' + id,\n viaTitle: name\n },\n person,\n\n firstName: person.surname,\n firstNameError: undefined,\n lastName: person.familyname,\n lastNameError: undefined,\n firstNameAlt: person.alternative_surnames.join(','),\n firstNameAltError: undefined,\n lastNameAlt: person.alternative_familynames.join(','),\n lastNameAltError: undefined,\n gender: person.gender,\n genderError: undefined,\n bornDate: {\n day: person.born_day || '',\n month: person.born_month || '',\n year: person.born_year || ''\n },\n bornDateError: undefined,\n diedDate: {\n day: person.died_day || '',\n month: person.died_month || '',\n year: person.died_year || ''\n },\n diedDateError: undefined,\n age: person.died_age === 0 ? '' : person.died_age.toString(),\n ageError: undefined,\n warCasualty: person.war_casualty,\n warCasualtyError: undefined,\n isNamelister: person.in_namelist,\n isNamelisterError: undefined,\n isIMR: person.memorials.includes(IMR_MEMORIAL_ID),\n isIMRError: undefined,\n\n victimType: person.victim_type,\n victimTypeError: undefined,\n victimSubType: person.victim_type_details as VictimSubType,\n victimSubTypeError: undefined,\n familyInfo: person.description,\n familyInfoError: undefined,\n\n projectMemberships: person.project_memberships,\n\n relations: person.relations,\n events: person.events || [],\n documents: person.documents || []\n });\n this.loadPersonStories();\n });\n }\n\n loadNumberOfDocuments = async () => {\n if (!this.state.person?._id)\n return\n\n const count = await api.countDocumentsRelatedTo('person', this.state.person._id);\n this.setState({...this.state, numberOfDocuments: count})\n }\n\n handleFirstNameChanged = (firstName: string) => {\n this.setState({\n firstName,\n firstNameError: undefined\n });\n }\n\n handleLastNameChanged = (lastName: string) => {\n this.setState({\n lastName,\n lastNameError: undefined\n });\n }\n\n handleFirstNameAltChanged = (firstNameAlt: string) => {\n this.setState({\n firstNameAlt,\n firstNameError: undefined\n });\n }\n\n handleLastNameAltChanged = (lastNameAlt: string) => {\n this.setState({\n lastNameAlt,\n lastNameAltError: undefined\n });\n }\n\n handleGenderChanged = (value: string) => {\n this.setState({\n gender: value as Gender,\n genderError: undefined\n });\n }\n\n handleBornDateChanged = (value: DateInputValue) => {\n this.setState({\n bornDate: value,\n bornDateError: undefined\n });\n }\n\n handleDiedDateChanged = (value: DateInputValue) => {\n this.setState({\n diedDate: value,\n diedDateError: undefined\n });\n }\n\n handleAgeChanged = (age: string) => {\n this.setState({\n age,\n ageError: undefined\n });\n }\n\n handleWarCasualtyChanged = (value: string) => {\n this.setState({\n warCasualty: value === 'Y',\n warCasualtyError: undefined\n });\n }\n\n handleVictimTypeChanged = (value: string) => {\n this.setState({\n victimType: value as VictimType,\n victimTypeError: undefined\n });\n }\n\n handleVictimSubTypeChanged = (value: string) => {\n this.setState({\n victimSubType: value as VictimSubType,\n victimSubTypeError: undefined\n });\n }\n\n handleNamelisterChanged = (value: string) => {\n this.setState({\n isNamelister: value === 'Y',\n isNamelisterError: undefined\n });\n }\n\n handleIsIMRChanged = (value: string) => {\n this.setState({\n isIMR: value === 'Y',\n isIMRError: undefined\n });\n }\n\n handleFamilyInfoChanged = (familyInfo: string) => {\n this.setState({\n familyInfo,\n familyInfoError: undefined\n });\n }\n\n handleRelationSelected = (reference: DocumentReference) => {\n if (!reference.id)\n return;\n\n const id = reference.id;\n api.getPerson(id).then(person => {\n const { relations } = this.state;\n const newRelation: IPersonRelation = {\n person_id: id,\n person,\n relation: PersonRelationType.Other,\n comments: ''\n };\n const newRelations = [...relations, newRelation];\n this.setState({ relations: newRelations });\n });\n }\n\n handleRelationChanged = (index: number, relation: IPersonRelation) => {\n const { relations } = this.state;\n const newRelations = relations.map((r, i) => i === index ? relation : r);\n this.setState({ relations: newRelations });\n }\n\n handleClickedRemoveRelation = (index: number) => {\n const { relations } = this.state;\n const newRelations = relations.filter((r, i) => i !== index);\n this.setState({ relations: newRelations });\n }\n\n requestContributionRegistration(person: IPerson): Promise {\n const { contactMoment } = this.props;\n if (contactMoment) {\n return this.showModal(props => (\n \n )).then(confirm => {\n if (confirm) {\n const { registerContribution } = this.props;\n registerContribution({\n type: 'person',\n targetId: person._id,\n name: person.surname + ' ' + person.familyname\n });\n }\n return person;\n });\n } else {\n return Promise.resolve(person);\n }\n }\n\n handleClickedSave = () => {\n this.save().then(result => {\n if (!result)\n return;\n\n NotificationManager.success(T('page.person.saved'));\n\n this.requestContributionRegistration(result).then(() => {\n const { history, id } = this.props;\n if (id === undefined) {\n // newly created person\n history.push('/persons/' + result._id);\n } else {\n // person data (eg events) may have been changed\n this.loadContent();\n }\n });\n });\n }\n\n handleClickedSaveAndNew = () => {\n this.save().then(result => {\n if (!result)\n return;\n\n NotificationManager.success(T('page.person.saved'));\n\n this.requestContributionRegistration(result).then(() => {\n if (this.props.id) {\n const { history } = this.props;\n history.push('/persons/create');\n } else {\n this.clear();\n }\n });\n });\n }\n\n save(): Promise {\n const {\n person,\n\n firstName,\n firstNameAlt,\n lastName,\n lastNameAlt,\n gender,\n victimType,\n victimSubType,\n bornDate,\n diedDate,\n age,\n warCasualty,\n isNamelister,\n isIMR,\n familyInfo,\n relations,\n projectMemberships\n } = this.state;\n if (person) {\n // update\n const updatedPerson = Object.assign({}, person, {\n surname: firstName,\n familyname: lastName,\n alternative_surnames: firstNameAlt.length > 0 ? firstNameAlt.split(',') : [],\n alternative_familynames: lastNameAlt.length > 0 ? lastNameAlt.split(',') : [],\n gender,\n victim_type: victimType,\n victim_type_details: victimSubType,\n born_day: bornDate.day,\n born_month: bornDate.month,\n born_year: bornDate.year,\n sort_born_date: inputDateToSortable(bornDate),\n died_day: diedDate.day,\n died_month: diedDate.month,\n died_year: diedDate.year,\n sort_died_date: inputDateToSortable(diedDate),\n died_age: age,\n description: familyInfo,\n relations,\n war_casualty: warCasualty,\n in_namelist: isNamelister && warCasualty,\n project_memberships: projectMemberships\n });\n if (person.memorials.includes(IMR_MEMORIAL_ID) !== isIMR) {\n // TODO: add/remove IMR\n }\n return api.validatePerson(updatedPerson, 'update').then(result => {\n if (result.status !== 'OK') {\n this.setValidationErrors(result);\n return undefined;\n }\n\n return api.updatePerson(updatedPerson);\n });\n } else {\n // create\n const newPerson: IPersonFields = {\n surname: firstName,\n familyname: lastName,\n alternative_surnames: firstNameAlt.split(','),\n alternative_familynames: lastNameAlt.split(','),\n gender,\n victim_type: victimType,\n victim_type_details: victimSubType,\n born_day: bornDate.day,\n born_month: bornDate.month,\n born_year: bornDate.year,\n died_day: diedDate.day,\n died_month: diedDate.month,\n died_year: diedDate.year,\n died_age: age ? parseInt(age) : 0,\n initials: '',\n description: familyInfo,\n relations,\n war_casualty: warCasualty,\n in_namelist: isNamelister && warCasualty,\n\n nationality: '',\n sort_born_date: inputDateToSortable(bornDate),\n sort_died_date: inputDateToSortable(diedDate),\n cwxrm_remembered: false,\n project_memberships: projectMemberships,\n memorials: []\n };\n return api.validatePerson(newPerson, 'create').then(result => {\n if (result.status !== 'OK') {\n this.setValidationErrors(result);\n return undefined;\n }\n\n return api.createPerson(newPerson);\n });\n }\n }\n\n setValidationErrors(result: IValidationResult) {\n const errors = result.data || {};\n this.setState({\n firstNameError: getErrorDescription(errors.surname),\n lastNameError: getErrorDescription(errors.familyname),\n genderError: getErrorDescription(errors.gender),\n victimTypeError: getErrorDescription(errors.victim_type),\n victimSubTypeError: getErrorDescription(errors.victim_type_details),\n bornDateError: getErrorDescription(errors.born_date),\n diedDateError: getErrorDescription(errors.died_date),\n ageError: getErrorDescription(errors.died_age),\n firstNameAltError: getErrorDescription(errors.alternative_surnames),\n lastNameAltError: getErrorDescription(errors.alternative_familynames),\n familyInfoError: getErrorDescription(errors.description)\n });\n }\n\n generateTabs(): TopTab[] {\n const { events, relations, projectMemberships } = this.state;\n return [\n {\n icon: Icon.User,\n title: T('page.person.tab.identity'),\n id: 'identity',\n content: this.renderIdentityTab\n },\n {\n icon: Icon.ListUl,\n title: T('page.person.tab.events'),\n id: 'events',\n content: this.renderEventsTab,\n badgeContent: () => events.length.toString()\n },\n {\n icon: Icon.Link,\n title: T('page.person.tab.relations'),\n id: 'relations',\n content: this.renderRelationsTab,\n badgeContent: () => relations.length.toString()\n },\n {\n icon: Icon.Copy,\n title: T('page.person.tab.documentation'),\n id: 'documents',\n content: this.renderDocumentsTab,\n badgeContent: () => this.state.numberOfDocuments.toString()\n },\n {\n icon: Icon.Books,\n title: T('page.person.tab.personStories'),\n id: 'personStories',\n content: this.renderPersonStoriesTab,\n badgeContent: () => this.state.personStories.length.toString()\n },\n {\n icon: Icon.Books,\n title: T('page.person.tab.projects'),\n id: 'projects',\n content: this.renderProjectsTab,\n badgeContent: () => projectMemberships.length.toString()\n },\n\n ];\n }\n\n renderIdentityForm() {\n const {\n firstName,\n firstNameError,\n lastName,\n lastNameError,\n firstNameAlt,\n firstNameAltError,\n lastNameAlt,\n lastNameAltError,\n gender,\n genderError,\n bornDate,\n bornDateError,\n diedDate,\n diedDateError,\n age,\n ageError\n } = this.state;\n\n return (\n
\n \n \n \n \n \n \n \n \n \n );\n }\n\n renderCategoryForm() {\n const {\n warCasualtyError,\n warCasualty,\n victimType,\n victimTypeError,\n victimSubType,\n victimSubTypeError,\n isNamelister,\n isNamelisterError,\n isIMR,\n isIMRError\n } = this.state;\n return (\n
\n \n \n {warCasualty && (\n \n )}\n {warCasualty && victimType === VictimType.Military && (\n \n )}\n \n \n );\n }\n\n renderFamilyInfoForm() {\n const { familyInfo, familyInfoError } = this.state;\n return (\n
\n \n \n );\n }\n\n renderRelationsForm() {\n const { relations, gender } = this.state;\n const relationViews = relations.map((relation, index) => (\n \n ));\n return (\n
\n \n \n {relationViews}\n \n \n \n \n \n {T('page.person.relation.tip')}\n \n \n \n \n \n \n \n \n \n\n
\n );\n }\n\n renderIdentityTab = () => {\n return <>\n \n \n \n {this.renderIdentityForm()}\n \n \n \n \n {this.renderCategoryForm()}\n \n \n {this.renderFamilyInfoForm()}\n \n \n \n {this.renderSaveButtons()}\n ;\n }\n\n handleClickedEditEvent = (event: PersonEvent) => {\n this.showModal(props => (\n \n )).then(event => {\n api.updateEvent(event).then(savedEvent => {\n const { events } = this.state;\n const newEvents = events.map(e => e._id === event._id ? savedEvent : e);\n newEvents.sort(personEventSorter);\n this.setState({ events: newEvents });\n });\n }).catch(() => {}); // ignore cancel\n }\n\n handleClickedRemoveEvent = (event: PersonEvent) => {\n this.showModal(props => (\n \n )).then(confirmation => {\n if (!confirmation)\n return;\n\n api.removeEvent(event._id).then(() => {\n const { events } = this.state;\n const newEvents = events.filter(e => e._id !== event._id);\n this.setState({ events: newEvents });\n });\n });\n }\n\n handleClickedAddEvent = (type: PersonEventType) => {\n const { id } = this.props;\n if (!id)\n return;\n\n const event = createNewEvent(id, type);\n this.showModal(props => (\n \n )).then(event => {\n api.createEvent(event)\n .then(result => {\n return api.getEvent(result._id, [PersonEventLoadOption.Place, PersonQueryOptions.Memorial])\n })\n .then(result => {\n const { events } = this.state;\n const newEvents = [...events, result];\n newEvents.sort(personEventSorter);\n this.setState({ events: newEvents });\n });\n }).catch(() => {}); // ignore cancel\n }\n\n handleDeleteDocument = (document: IPersonDocument): Promise => {\n return this.showModal(props => (\n \n )).then(confirmed => {\n if (!confirmed)\n return false;\n\n return api.removePersonDocument(document._id).then(() => {\n showNotification({\n message: T('modal.removePersonDocument.removed')\n });\n const { documents } = this.state;\n const newDocuments = documents.filter(x => x._id !== document._id);\n this.setState({ documents: newDocuments });\n return true;\n });\n });\n }\n\n handleDeleteAttachment = (attachment: IAttachment): Promise => {\n return this.showModal(props => (\n \n )).then(confirmed => {\n if (!confirmed)\n return false;\n\n return api.removeAttachment(attachment._id).then(() => {\n showNotification({\n message: T('modal.removeAttachment.removed')\n });\n return true;\n });\n });\n }\n\n handleProjectMembershipsChanged = (memberships: IPersonProjectMembership[]) => {\n this.setState({ projectMemberships: memberships });\n }\n\n handlePersonStorySelected = (personStory?: IPersonStory2) => {\n const via = PageID.EditPerson\n if (personStory !== undefined) {\n this.props.history.push(`/personstories/${personStory._id}/edit?via=${via}~${this.state.person?._id}`);\n } else {\n this.props.history.push(`/personstories/${this.state.person?._id}/create?via=${via}~${this.state.person?._id}`);\n }\n }\n\n handleSaveDocument = (document: IPersonDocument|undefined, data: IPersonDocumentFields): Promise => {\n const { id } = this.props;\n if (id)\n data.person_id = id;\n\n const dataWithId = Object.assign({ _id: document ? document._id : undefined }, data);\n return api.validatePersonDocument(dataWithId, document ? 'update' : 'create')\n .then((result: IValidationResult): Promise => {\n if (result.status === 'NOK')\n return Promise.resolve(result);\n\n if (document) {\n return api.updatePersonDocument(dataWithId as IPersonDocumentFields & { _id: string })\n .then(x => {\n const { documents } = this.state;\n x.attachments = document.attachments;\n const newDocuments = documents.map(d => d._id === document._id ? x : d);\n this.setState({ documents: newDocuments });\n return x;\n });\n } else {\n return api.createPersonDocument(data)\n .then(x => {\n const { documents } = this.state;\n const newDocuments = [...documents, x];\n this.setState({ documents: newDocuments });\n return x;\n });\n }\n });\n }\n\n renderSaveButtons() {\n return (\n \n \n \n );\n }\n\n renderEventsTab = () => {\n if (!this.state.person) {\n return (<>\n {this.renderSaveFirstRow(T(\"page.person.saveFirstBeforeAddingEvents\"))}\n )\n } else {\n return (\n \n )\n }\n };\n\n renderRelationsTab = () => {\n return <>\n \n \n \n {this.renderRelationsForm()}\n \n \n \n {this.renderSaveButtons()}\n ;\n }\n\n renderSaveFirstRow = (text: string) => {\n return (\n \n )\n }\n\n\n renderDocumentsTab = () => {\n if (!this.state.person) {\n return (<>\n {this.renderSaveFirstRow(T(\"page.person.saveFirstBeforeAddingEvents\"))}\n )\n } else {\n const personObject = new Person(this.state.person)\n return (\n \n );\n }\n }\n\n renderProjectsTab = () => {\n const { projects, projectMemberships } = this.state;\n return (\n
\n \n {this.renderSaveButtons()}\n
\n );\n }\n\n renderPersonStoriesTab = () => {\n return (\n
\n \n {this.renderSaveButtons()}\n
\n );\n }\n\n renderContent() {\n return (\n \n );\n }\n}\n\nconst mapState = (state: AppState): EditPersonStateProps => ({\n contactMoment: state.activeContactMoment.current\n});\nconst mapDispatch = (dispatch: Dispatch): EditPersonDispatchProps => ({\n registerContribution: (contribution: ContactMomentContribution) =>\n dispatch(registerContactMomentContributionAction(contribution))\n});\nconst ConnectedPage = connect(mapState, mapDispatch)(EditPersonPage);\nexport default ConnectedPage;\n","import React from 'react';\nimport { Icon } from './Icons';\nimport { PageID } from '../utils/PageLinking';\nimport PageLink from './PageLink';\n\ninterface EditLinkProps {\n page: PageID;\n param?: string;\n}\nexport const EditLink = (props: EditLinkProps) => {\n const { page, param } = props;\n return (\n
\n \n \n \n
\n );\n}\n","import React from 'react';\nimport { Person } from '../../models/Person';\nimport { T } from '../../Translate';\n\nimport styles from './index.module.scss';\nimport { TextStyles } from \"../../config/styles\";\n\n\ninterface PersonInfoViewProps {\n person: Person;\n}\n\nexport const PersonInfoView = (props: PersonInfoViewProps) => {\n const { person } = props;\n const hasBorn = person.hasBornDate;\n const hasDied = person.hasDiedDate;\n const age = person.describeAge();\n const hasAge = age.length > 0;\n return (\n
\n

\n {hasBorn && <>°{person.bornYear}}\n {hasBorn && hasDied && <> — }\n {hasDied && <>†{person.diedYear}}\n {hasAge && <> ({age})}\n {person.inNamelist && ` (${T('person.isNamelist')})`}\n

\n

{person.familyInfo}

\n
\n );\n}\n","import React from 'react';\nimport { Card, Button } from 'react-bootstrap';\n\nimport api from '../../api';\nimport { EditLink } from '../../components/EditLink';\nimport { T } from '../../Translate';\n\nimport { User } from '../../models/User';\nimport { Person, Gender } from '../../models/Person';\n\nimport { PersonInfoView } from './PersonInfoView';\nimport { Icon } from '../../components/Icons';\nimport { PageID } from '../../utils/PageLinking';\n\n\ninterface HeaderViewProps {\n user: User;\n person: Person;\n\n handleClickedFeedback: () => void;\n}\nexport const HeaderView = (props: HeaderViewProps) => {\n const { user, person, handleClickedFeedback } = props;\n\n return (\n \n \n {api.isLoggedIn() && user.canEdit() && }\n {!api.isLoggedIn() && (\n \n )}\n

\n {person.firstName}\n {' '}\n {person.gender !== Gender.Undefined && }\n

\n

\n {person.lastName}\n

\n \n
\n
\n );\n}\n","import { IAttachment } from \"./Attachment\";\n\nexport interface IPersonFeedbackFields {\n person_id: string;\n name?: string;\n firstName?: string;\n lastName?: string;\n email: string;\n description: string;\n timestamp: string;\n language: string;\n status: PersonFeedbackStatus;\n documentIds?: string[];\n feedback_session?: string;\n}\n\nexport interface IPersonFeedback extends IPersonFeedbackFields {\n _id: string;\n \n extend_person_name?: string;\n extend_attachments?: IAttachment[];\n}\n\nexport enum PersonFeedbackStatus {\n Writing = 'writing',\n Submitted = 'submitted',\n Reviewed = 'reviewed'\n}\n\nexport enum PersonFeedbackLoadOptions {\n PersonName = 'EXTEND_PERSON_NAME',\n Attachments = 'EXTEND_ATTACHMENTS'\n}\n","import React from 'react';\nimport { Icon } from './Icons';\nimport { Button } from 'react-bootstrap';\nimport { DocumentFileUploader, PageFileUploader } from './FileUploader';\nimport { IDocument, IDocumentElement } from '../models/Document';\nimport { DocumentElementPreview } from '../pages/EditCollectionDocument/DocumentElementPreview';\nimport { IDocumentTag } from '../models/DocumentTag';\nimport { NotificationManager } from 'react-notifications';\nimport { T } from '../Translate';\n\n\ninterface DocumentPreviewProps {\n index: number;\n element: IDocumentElement;\n onClickedDelete: () => void;\n}\nexport const DocumentPreview = (props: DocumentPreviewProps) => {\n const { index, element, onClickedDelete } = props;\n return (\n
\n {}}\n onSelected={() => {}}\n />\n \n \n \n
\n );\n}\n\ninterface DocumentUploadListViewProps {\n tags: IDocumentTag[];\n documents: IDocument[];\n feedbackSession: string;\n\n onClickedDelete: (document: IDocument, index: number) => void;\n onCreated: (document: IDocument) => void;\n onUpdated: (document: IDocument) => void;\n}\nexport const DocumentUploadListView = (props: DocumentUploadListViewProps) => {\n const { tags, documents, onClickedDelete, onCreated, onUpdated, feedbackSession } = props;\n\n const handleCreated = (document: IDocument|'NOK') => {\n if (document === 'NOK') {\n NotificationManager.error(T('generic.errors.fileUploadFailed'));\n } else {\n onCreated(document);\n }\n }\n\n const handleUpdated = (document: IDocument|'NOK') => {\n if (document === 'NOK') {\n NotificationManager.error(T('generic.errors.fileUploadFailed'));\n } else {\n onUpdated(document);\n }\n }\n\n const documentViews = documents.reduce((elements, document) => {\n document.elements.forEach((element, index) => {\n elements.push(\n onClickedDelete(document, index)}\n />\n );\n });\n return elements;\n }, []);\n\n return (\n
\n {documentViews}\n {documents.length === 0 ? (\n \n ) : (\n \n )}\n
\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { Modal, Form, Button } from 'react-bootstrap';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { T, getActiveLanguage } from '../../Translate';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { Icon } from '../../components/Icons';\nimport api from '../../api';\nimport { IPersonFeedbackFields, PersonFeedbackStatus } from '../../models/PersonFeedback';\nimport moment from 'moment';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { NotificationManager } from 'react-notifications';\nimport { useStateWithError } from '../../utils/Functional';\nimport { ModalHeader } from '../../modals/ModalHeader';\nimport { IDocument } from '../../models/Document';\nimport { IDocumentTag } from '../../models/DocumentTag';\nimport { DocumentUploadListView } from '../../components/DocumentUploadView';\nimport { DocumentReferenceType, DocumentReferenceRelation } from '../../models/DocumentReference';\nimport { Person } from '../../models/Person';\n\ninterface PersonFeedbackModalProps extends ModalProps {\n person: Person;\n}\n\nexport const PersonFeedbackModal = (props: PersonFeedbackModalProps) => {\n const { person } = props;\n const [isOpen, resolve] = useModal(props);\n const handleClose = () => resolve();\n\n const feedbackSession = useMemo(() => uuidv4(), []);\n const [firstName, setFirstName, firstNameError, setFirstNameError] = useStateWithError('');\n const [lastName, setLastName, lastNameError, setLastNameError] = useStateWithError('');\n const [email, setEmail, emailError, setEmailError] = useStateWithError('');\n const [message, setMessage, messageError, setMessageError] = useStateWithError('');\n const [documents, setDocuments] = useState([]);\n\n const tags: IDocumentTag[] = [\n {\n tag: 'unprocessedFeedback',\n fields: {\n person: {\n type: DocumentReferenceType.Person,\n _id: person.id,\n name: person.name,\n relation: DocumentReferenceRelation.None,\n comment: ''\n }\n }\n }\n ];\n\n const handleDeleteDocument = (document: IDocument) => {\n const newDocuments = documents.filter(x => x._id !== document._id);\n setDocuments(newDocuments);\n };\n\n const handleDocumentCreated = (document: IDocument) => {\n setDocuments([...documents, document]);\n };\n\n const handleDocumentUpdated = (document: IDocument) => {\n setDocuments(documents => documents.map(doc => doc._id === document._id ? document : doc));\n };\n\n const handleClickedSave = async () => {\n const data: IPersonFeedbackFields = {\n person_id: person.id,\n firstName,\n lastName,\n email,\n description: message,\n timestamp: moment().format('YYYY-MM-DDTHH:mm'),\n language: getActiveLanguage(),\n status: PersonFeedbackStatus.Submitted,\n documentIds: documents.map(document => document._id),\n feedback_session: feedbackSession\n };\n\n const result = await api.validatePersonFeedback(data, 'create');\n\n if (result.status === 'NOK') {\n const errors = result.data || {};\n setFirstNameError(errors.firstName);\n setLastNameError(errors.lastName);\n setEmailError(errors.email);\n setMessageError(errors.description);\n } else {\n await api.createPersonFeedback(data);\n NotificationManager.success(T('modal.personFeedback.submitted'));\n resolve();\n }\n };\n\n return (\n \n {T('modal.personFeedback.title')}\n \n

{T('modal.personFeedback.identity.intro')}

\n
\n \n \n \n \n \n

{T('modal.personFeedback.files.intro')}

\n \n
\n \n \n \n \n
\n );\n}\n","import React from 'react';\nimport { Card } from 'react-bootstrap';\n\ninterface NoDataViewProps {\n text: String;\n}\n\nexport const NoDataView = (props: NoDataViewProps) => {\n const { text } = props;\n return (\n \n \n \n {text}\n \n \n \n );\n}\n","import React, { useContext } from 'react';\nimport { History } from 'history';\nimport { Loading } from './Loading';\n\nexport interface IAppContext {\n history: History;\n loading: Loading;\n}\n\n// cheating here for the default value, as there should always be an AppContext\nconst Context = React.createContext({} as IAppContext);\n\nexport function useAppContext(): IAppContext {\n return useContext(Context);\n}\n\nexport const AppContextProvider = Context.Provider;\n","import React from 'react';\nimport { IPersonProjectMembership } from '../../../models/Person';\nimport { useProjects } from '../../../FunctionalAPI';\nimport { FormCard } from '../../../components/FormCard';\nimport { Icon } from '../../../components/Icons';\nimport { T } from '../../../Translate';\nimport { NoDataView } from '../NoDataView';\nimport { useAppContext } from '../../../utils/AppContext';\n\ninterface ProjectTabProps {\n projectMemberships: IPersonProjectMembership[];\n}\nexport default (props: ProjectTabProps) => {\n const { projectMemberships } = props;\n const { loading } = useAppContext();\n const projects = useProjects(loading);\n\n if (projectMemberships.length === 0)\n return ;\n \n return (\n \n
    \n {projectMemberships.map(membership => {\n const project = projects.find(p => p._id === membership.project);\n return
  • {project ? project.title : '...'}
  • \n })}\n
\n
\n );\n}\n","import React, { CSSProperties } from 'react';\nimport styles from './TextView.module.scss';\n\ninterface TextViewProps {\n text: String;\n style?: CSSProperties\n}\n\nexport const TextView = (props: TextViewProps) => {\n const { text, style } = props;\n return (\n {text}\n );\n}\n","import React, { CSSProperties } from 'react';\nimport styles from './LabelView.module.scss';\n\ninterface LabelViewProps {\n text: String;\n}\n\nexport const LabelView = (props: LabelViewProps) => {\n const { text } = props;\n return (\n {text}\n );\n}\n\nexport const TitleLabelView = (props: LabelViewProps) => {\n const style: CSSProperties = {\n fontSize: 14,\n color: '#9A9A9A',\n textTransform: \"uppercase\",\n }\n\n const { text } = props;\n return (\n {text}\n );\n}\n\nexport const TextLabelView = (props: LabelViewProps) => {\n const style: CSSProperties = {\n fontSize: 14,\n color: '#9A9A9A',\n }\n\n const { text } = props;\n return (\n {text}\n );\n}\n","import React from 'react';\nimport { IPersonRelation, Person, Gender } from '../../../models/Person';\nimport { Row, Col } from 'react-bootstrap';\nimport { TextView } from \"../TextView\";\nimport { LabelView } from \"../LabelView\";\nimport { PageID } from '../../../utils/PageLinking';\nimport PageLink from '../../../components/PageLink';\n\n\ninterface LinkedPersonViewProps {\n relation: IPersonRelation;\n gender: Gender;\n index: number;\n}\n\nexport const LinkedPersonView = (props: LinkedPersonViewProps) => {\n const { relation, gender } = props;\n\n return <>\n \n \n \n \n \n \n {relation.person && (relation.person.surname + ' ' + relation.person.familyname)}\n \n \n \n \n \n \n ;\n}\n","import React from 'react';\nimport { Card } from 'react-bootstrap';\nimport { T } from '../../../Translate';\nimport { IPersonRelation, Gender} from '../../../models/Person';\nimport { LinkedPersonView } from \"./LinkedPersonView\";\nimport { NoDataView } from \"../NoDataView\";\n\n\ninterface LinkedPersonListViewProps {\n relations: IPersonRelation[];\n gender: Gender;\n}\n\nexport default (props: LinkedPersonListViewProps) => {\n const { relations, gender } = props;\n\n if (relations.length === 0)\n return \n\n return (\n \n \n {\n relations.map((relation, index) =>\n )\n }\n \n \n )\n}\n","import React from 'react';\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { T } from \"../../../Translate\";\nimport { ButtonLink } from \"../../../components/ButtonLink\";\nimport { PersonStoryHelper } from \"../../../models/wrappers/PersonStoryHelper\";\n\ninterface PersonStoriesTabProps {\n personStories: IPersonStory2[];\n onPersonStorySelected: (personStory?:IPersonStory2) => void;\n}\nexport const PersonStoriesTab = (props: PersonStoriesTabProps) => {\n\n const textStyle = {\n fontSize:18,\n textDecorationLine: 'uppercase',\n color: '#9A9A9A',\n }\n\n const { personStories, onPersonStorySelected } = props;\n\n const links = personStories.map(personStory => (\n {onPersonStorySelected(personStory)}}>\n {PersonStoryHelper.personName(personStory)}\n \n ));\n\n if (personStories.length === 0) {\n return (\n \n \n \n

\n {T(\"page.person.tab.personStories.noStoriesAvailable\")}\n {links}\n

\n \n \n
\n )\n } else {\n return (\n \n \n \n

\n {T(\"page.person.tab.personStories.storyAvailable\")}\n {links}\n

\n \n \n
\n )\n }\n};\n","import React, { useMemo } from 'react';\n\nimport { PageProps, Page } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport { personEventSorter } from '../../models/PersonEvent';\nimport api from '../../api';\nimport { PersonQueryOptions, Gender } from '../../models/Person';\nimport { EventView } from './EventView';\nimport { HeaderView } from './HeaderView';\nimport { T } from '../../Translate';\nimport { PersonFeedbackModal } from './PersonFeedbackModal';\nimport { TopTabs, TopTab } from '../../components/TopTabs';\nimport { ContactPersonEventView } from \"../EditContactPerson/ContactPersonEventView\";\nimport {\n usePersonContactMoments,\n usePerson,\n usePersonRelatedDocuments,\n usePersonStories\n} from '../../FunctionalAPI';\nimport { NoDataView } from \"./NoDataView\"\nimport ProjectsTab from './tabs/ProjectsTab';\nimport RelatedPersonsTab from './tabs/RelatedPersonsTab';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\nimport { PersonStoriesTab } from \"./tabs/PersonStoriesTab\";\nimport { IPersonStory2 } from \"../../models/PersonStory2\";\nimport ListDocumentsTab from \"../ViewPlace/ListDocumentsTab\";\n\ninterface ViewPersonPageProps extends PageProps {\n id: string;\n}\n\nexport const ViewPersonPage = (props: ViewPersonPageProps) => {\n const { id, loading, modals, history, via } = props;\n\n const user = api.user;\n const person = usePerson(loading, id, [PersonQueryOptions.EventsWithPlaces, PersonQueryOptions.Documents, PersonQueryOptions.RelationPersons]);\n const contactMoments = usePersonContactMoments(loading, user.isGuest() ? undefined : id);\n const documents = usePersonRelatedDocuments(loading, id);\n const personStories = usePersonStories(loading, user.isGuest() ? undefined : id);\n\n const contactMomentViews = useMemo(() => {\n if (contactMoments.length === 0) {\n return (\n \n );\n }\n\n return contactMoments.map(cm => (\n \n ));\n }, [contactMoments]);\n\n const eventViews = useMemo(() => {\n if (!person)\n return
;\n\n person.events.sort(personEventSorter);\n return person.events.map(event => );\n }, [person]);\n\n const handleClickedFeedback = () => {\n if (!person)\n return;\n\n modals.show(props => );\n };\n\n const handlePersonStorySelected = (personStory?: IPersonStory2) => {\n if (!personStory)\n return;\n\n const via = PageID.ViewPerson\n history.push(`/personstories/${personStory._id}/edit?via=${via}~${person?.id}`);\n\n }\n\n const renderEventsTab = () => <>{eventViews};\n const renderContactsTab = () => contactMomentViews;\n const renderRelationsTab = () => {\n return ;\n }\n const renderDocumentationTab = () => {\n if (!person) {\n return (<>)\n } else {\n return (\n \n );\n }\n };\n const renderProjectsTab = () => {\n return ;\n }\n const renderStoriesTab = () => {\n return ;\n }\n\n const tabs: TopTab[] = [];\n tabs.push({\n id: 'events',\n title: T('page.person.tab.events'),\n icon: Icon.Info,\n content: renderEventsTab,\n badgeContent: () => person?.events ? person?.events?.length.toString() : \"0\"\n });\n tabs.push({\n icon: Icon.Link,\n title: T('page.person.tab.relations'),\n id: 'relations',\n content: renderRelationsTab,\n badgeContent: () => person?.relations.length.toString() ?? \"0\"\n });\n tabs.push({\n id: 'documentation',\n title: T('page.person.tab.documentation'),\n icon: Icon.Document,\n content: renderDocumentationTab,\n badgeContent: () => documents.length.toString()\n });\n if (!user.isGuest()) {\n tabs.push({\n id: 'contacts',\n title: T('page.person.tab.contacts'),\n icon: Icon.AddressBook,\n content: renderContactsTab,\n badgeContent: () => contactMoments.length.toString()\n });\n tabs.push({\n id: 'stories',\n title: T('page.person.tab.stories'),\n icon: Icon.Books,\n content: renderStoriesTab,\n badgeContent: () => personStories.length.toString()\n });\n tabs.push({\n id: 'projects',\n title: T('page.person.tab.projects'),\n icon: Icon.Book,\n content: renderProjectsTab,\n badgeContent: () => person && person.projects && person.projects.length.toString()\n });\n }\n\n const title = person ? person.firstName + ' ' + person.lastName.toUpperCase() : '';\n return (\n \n {person && (\n
\n \n \n
\n )}\n \n );\n}\n","import React, { useState } from 'react';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { Modal, Button, Table } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { Icon } from '../../components/Icons';\nimport styles from './index.module.scss';\nimport { Place, getResolutionStatusColor, getPlaceTypeName } from '../../models/Place';\nimport { classes } from '../../utils/Styles';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { ModalHeader } from '../../modals/ModalHeader';\n\nexport interface MergePlacesModalResult {\n confirmed: boolean;\n openResult: boolean;\n placeA: Place;\n placeB: Place;\n}\ninterface MergePlacesModalProps extends ModalProps {\n placeA: Place;\n placeB: Place;\n}\n\nexport const MergePlacesModal = (props: MergePlacesModalProps) => {\n const [isOpen, resolve] = useModal(props);\n const [placeA, setPlaceA] = useState(props.placeA);\n const [placeB, setPlaceB] = useState(props.placeB);\n\n const handleClickedSwitch = () => {\n setPlaceA(placeB);\n setPlaceB(placeA);\n };\n\n const handleClickedCancel = () => {\n resolve({\n placeA,\n placeB,\n confirmed: false,\n openResult: false\n });\n };\n\n const handleClickedConfirm = () => {\n resolve({\n placeA,\n placeB,\n confirmed: true,\n openResult: false\n });\n };\n\n const handleClickedConfirmAndOpen = () => {\n resolve({\n placeA,\n placeB,\n confirmed: true,\n openResult: true\n });\n };\n\n const nameA = placeA.name;\n const nameB = placeB.name;\n const translationA = placeA.getTranslation();\n const translationB = placeB.getTranslation();\n const sublocalityA = translationA.sublocality || '';\n const sublocalityB = translationB.sublocality || '';\n const localityA = translationA.locality || '';\n const localityB = translationB.locality || '';\n const area2A = translationA.administrative_area_level_2 || '';\n const area2B = translationB.administrative_area_level_2 || '';\n const area1A = translationA.administrative_area_level_1 || '';\n const area1B = translationB.administrative_area_level_1 || '';\n const willEraseName = nameA !== nameB;\n const willEraseStatus = placeA.status !== placeB.status;\n const willEraseType = placeA.type !== placeB.type;\n const willEraseSublocality = sublocalityA && sublocalityA !== sublocalityB;\n const willEraseLocality = localityA && localityA !== localityB;\n const willEraseArea2 = area2A && area2A !== area2B;\n const willEraseArea1 = area1A && area1A !== area1B;\n const willEraseCountry = placeA.countryCode !== placeB.countryCode;\n\n return (\n \n {T('modal.mergePlace.title')}\n \n

{T('modal.mergePlace.message')}

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{T('place.name')}\n {' '}{nameA}\n {' '}\n {nameB}\n
{T('place.type')}{getPlaceTypeName(placeA.type)}{getPlaceTypeName(placeB.type)}
{T('placeType.sublocality')}{sublocalityA}{sublocalityB}
{T('placeType.locality')}{localityA}{localityB}
{T('place.area2')}{area2A}{area2B}
{T('place.area1')}{area1A}{area1B}
{T('place.countryCode')}{placeA.countryCode}{placeB.countryCode}
\n
\n \n \n
\n \n \n \n \n \n );\n}\n","import React, { useMemo, useState, useEffect } from 'react';\nimport { History } from 'history';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { IQueryResult } from '../../models/Generic';\nimport { PersonEventType, PersonEventLoadOption, getEventTypePlural, MilitaryEventType, describeMilitaryEventUnit } from '../../models/PersonEvent';\nimport { Modal, Badge } from 'react-bootstrap';\nimport { Table, SortDirection } from '../../components/table/Table';\nimport api from '../../api';\nimport { ITableColumn, StringTableColumn, StringFieldTableColumn, ComponentTableColumn } from '../../components/table/Fields';\nimport { T } from '../../Translate';\nimport { IPlace, Place } from '../../models/Place';\nimport { ModalHeader } from '../../modals/ModalHeader';\nimport { PersonQueryOptions, Person, translateVictimType } from '../../models/Person';\nimport styles from './index.module.scss';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\n\ninterface EventListModalProps extends ModalProps {\n history: History;\n place: IPlace;\n type: PersonEventType;\n count: number;\n}\n\nconst PageSize = 10;\nconst rowKey = (item: Person) => item.id;\nconst MaxEvents = 1000;\n\nexport const PlaceEventListModal = (props: EventListModalProps) => {\n const { history, type, count } = props;\n const place = new Place(props.place)\n const [isOpen, resolve] = useModal(props);\n const handleClose = () => resolve();\n\n const columns: ITableColumn[] = useMemo(() => [\n new StringFieldTableColumn('nameSortable', T('person.name'), { width: 250 }),\n new StringTableColumn(\n 'bornDate',\n T('person.born'),\n person => person.birthDateFormatted,\n { width: 110 }\n ),\n new StringTableColumn(\n 'diedDate',\n T('person.died'),\n person => person.diedDateFormatted,\n { width: 110 }\n ),\n new ComponentTableColumn(\n 'details',\n T('listPersons.column.details'),\n person => {\n if ((person.militaryEvents || []).length > 0) {\n const militaryEvents = person.militaryEvents || [];\n const military = militaryEvents.find(e => e.enlisted_reason === MilitaryEventType.ActiveService)\n || militaryEvents.find(e => e.enlisted_reason === MilitaryEventType.Enlisted);\n if (military) {\n const entity = describeMilitaryEventUnit(military);\n return <>\n {military.enlisted_rank}\n {military.enlisted_number && <>{' - '}{military.enlisted_number}{' - '}}\n {entity}\n ;\n }\n }\n return translateVictimType(person.victimType);\n }\n ),\n ], []);\n\n const [page, setPage] = useState(0);\n const [allPersons, setAllPersons] = useState>({ data: [], total: 0 });\n const [sortColumn, setSortColumn] = useState('nameSortable');\n const [sortDirection, setSortDirection] = useState(SortDirection.Up);\n\n useEffect(() => {\n if (count > MaxEvents)\n return;\n\n api.findEvents(\n { type, place_id: place.id },\n undefined,\n 0,\n MaxEvents,\n [],\n [PersonEventLoadOption.Person, PersonQueryOptions.MilitaryEvents]\n ).then(result => {\n const persons: Person[] = [];\n for (const event of result.data) {\n if (event.extend_person === undefined)\n continue;\n\n persons.push(new Person(event.extend_person));\n }\n setAllPersons({ data: persons, total: result.total });\n });\n }, [place.id, type, count]);\n const sortedPersons = useMemo(() => {\n const result = [...allPersons.data];\n if (sortColumn === 'nameSortable') {\n result.sort((a, b) => a.nameSortable.localeCompare(b.nameSortable));\n } else if (sortColumn === 'bornDate') {\n result.sort((a, b) => (a.bornDateSortable || '????????').localeCompare(b.bornDateSortable || '????????'));\n } else if (sortColumn === 'diedDate') {\n result.sort((a, b) => (a.diedDateSortable || '????????').localeCompare(b.diedDateSortable || '????????'));\n }\n if (sortDirection === SortDirection.Down)\n result.reverse();\n return result;\n }, [allPersons, sortColumn, sortDirection]);\n const pagePersons = useMemo(() => {\n return sortedPersons.slice(PageSize * page, PageSize * page + PageSize);\n }, [sortedPersons, page]);\n\n const handleSortChanged = (sortColumn: string, sortDirection: SortDirection) => {\n setSortColumn(sortColumn);\n setSortDirection(sortDirection);\n };\n\n const handleClickedRow = (row: Person) => {\n history.push(`/persons/${row.id}`);\n };\n\n return (\n \n \n {T('page.places.events.title', {\n event: getEventTypePlural(type),\n place: place.name\n })}\n \n \n {count > MaxEvents ? <>\n

{T('page.places.events.toomany')}

\n

\n \n {T('page.advancedSearch.title')}\n \n

\n : (\n \n )}\n
\n
\n );\n}\n","import { Badge, OverlayTrigger, Popover } from \"react-bootstrap\";\nimport { IPlace } from \"../../models/Place\";\nimport {\n getEventIcon,\n getMajorPriorityForEventType,\n PersonEventType\n} from \"../../models/PersonEvent\";\nimport React from \"react\";\nimport { Colors, TextStyles } from \"../../config/styles\";\nimport { T } from \"../../Translate\";\nimport styles from './index.module.scss';\n\n\nexport interface PlaceEventsViewProps {\n place: IPlace\n onClickedPlaceEvent: (place: IPlace, type: PersonEventType, count: number) => void\n}\n\n\nexport const PlaceEventsView = (props: PlaceEventsViewProps) => {\n\n /** Props **/\n\n const { place, onClickedPlaceEvent } = props;\n\n\n /** event handling **/\n\n const handleClickedPlaceEvents = (place: IPlace, type: PersonEventType, count: number) => {\n onClickedPlaceEvent(place, type, count)\n }\n\n /** Helper functions **/\n\n const sortedEventKeys = (keys: string[]) : string[] => {\n const result = keys.sort( (obj1, obj2) => {\n if (getMajorPriorityForEventType(obj1 as PersonEventType) > getMajorPriorityForEventType(obj2 as PersonEventType))\n return 1\n else if (getMajorPriorityForEventType(obj1 as PersonEventType) < getMajorPriorityForEventType(obj2 as PersonEventType))\n return -1\n else\n return 0\n })\n return result;\n }\n\n /** Rendering **/\n\n const events = place.extend_events_by_type || {};\n const badges: JSX.Element[] = [];\n const eventKeys = sortedEventKeys(Object.keys(events))\n for (var key in eventKeys) {\n const type = eventKeys[key] as PersonEventType;\n const count = events[type];\n badges.push(\n ) => {\n e.preventDefault();\n e.stopPropagation();\n document.body.click();\n handleClickedPlaceEvents(place, type, count);\n }}\n >\n {' ' + events[type].toString()}\n \n );\n }\n const badgesComponent = <>
\n {badges}\n
;\n\n const popover = (\n \n \n {T('event.select')}\n \n \n {badgesComponent}\n \n \n );\n\n // place event view with popover for when there is more then 1 event\n\n if (eventKeys.length > 0) {\n\n const firstType = eventKeys[0] as PersonEventType;\n const firstCount = events[firstType];\n\n\n const firstEventBadge = (\n <>\n {/*Show the first event badge*/}\n ) => {\n e.preventDefault();\n e.stopPropagation();\n document.body.click();\n handleClickedPlaceEvents(place, firstType, firstCount);\n }}>\n {' ' + firstCount.toString()}\n {/*Show the second badge with the extra number of events*/}\n )\n\n const secondEventBadge = (eventKeys.length > 1) ?\n \n \n +{eventKeys.length - 1}\n \n :\n <>\n\n return (<>{firstEventBadge}{secondEventBadge})\n\n } else {\n\n // place event view when no events are connected to the place\n const badgeNoEvents = (\n \n {T('generic.none')}\n \n )\n\n return <>{badgeNoEvents}\n }\n\n};\n","import React, { useMemo, useState, useEffect } from 'react';\nimport {\n getPlaceTypeName,\n getResolutionStatusColor,\n getResolutionStatusName, IPlace, IPlaceLanguage,\n Place,\n ResolutionStatus,\n} from '../../models/Place';\nimport { Icon } from '../../components/Icons';\nimport { Button, ButtonGroup, Col, Row } from 'react-bootstrap';\nimport {\n ActionsTableColumn,\n ComponentTableColumn,\n DefaultColumnOptions,\n ICellProps,\n IColumnOptions,\n ITableColumn,\n StringTableColumn,\n TableRowActionStyle\n} from '../../components/table/Fields';\nimport api, {GetPlaceOptions} from '../../api';\nimport { showNotification } from '../../utils/Notification';\nimport { T, plural } from '../../Translate';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { PersonEventType } from '../../models/PersonEvent';\nimport { MergeIcon } from '../../components/MergeIcon';\nimport { MergePlacesModal, MergePlacesModalResult } from './MergePlacesModal';\nimport { PlaceEventListModal } from './PlaceEventListModal';\nimport { TextMode } from \"../../models/SpecialFunction\";\nimport { NotificationManager } from 'react-notifications';\nimport { ListState, ListPage } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { IQueryResult } from '../../models/Generic';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { usePageState } from '../../redux/Actions';\nimport { User } from '../../models/User';\nimport { useRefresh } from '../../utils/Functional';\nimport { PageID } from '../../utils/PageLinking';\nimport { getName, registerLocale } from 'i18n-iso-countries';\nimport { getActiveLanguage } from '../../Translate';\nimport { PlaceEventsView } from \"./PlaceEventsView\";\nimport { inspect } from \"util\";\nimport styles from './index.module.scss';\n\n\ninterface PlacesListState {\n selectedForMerge: Place[];\n}\nexport interface ListPlacesStateProps extends ListState {\n filterStatus: ResolutionStatus;\n mergingFirst?: Place;\n mergingSecond?: Place;\n}\n\n\n\n// !! You need to register the libraries before you can call the `getName()` function\n// from the i18n-iso-countries package !!\nregisterLocale(require(\"i18n-iso-countries/langs/de.json\"));\nregisterLocale(require(\"i18n-iso-countries/langs/nl.json\"));\nregisterLocale(require(\"i18n-iso-countries/langs/en.json\"));\nregisterLocale(require(\"i18n-iso-countries/langs/fr.json\"));\n\nexport class PlaceNameTableColumn implements ITableColumn {\n id: string;\n title: string;\n options: IColumnOptions;\n\n constructor(id: string, title: string, options?: Partial) {\n this.id = 'name';\n this.title = 'Naam';\n this.options = Object.assign({}, DefaultColumnOptions, { sortable: false, clickable: false }, options);\n }\n\n communityNames = (place: Place): string => {\n let resultArray: string[] = []\n const language: string = getActiveLanguage()\n const placefields: IPlaceLanguage | undefined = place.place.languages[language]\n if (placefields.locality)\n resultArray.push(placefields.locality)\n return resultArray.join(', ')\n }\n\n render(item: Place, props: ICellProps): JSX.Element {\n\n const communityTextStyle = {\n fontWeight: 500,\n fontSize: 12\n }\n\n return (\n <>\n \n \n \n \n {' '}\n {item.name}\n \n \n \n \n {' '}\n {this.communityNames(item)}\n \n \n \n \n );\n }\n\n sort = (a: Place, b: Place): number => {\n return a.name.localeCompare(b.name);\n }\n}\n\nfunction getSortColumn(column: string) {\n switch (column) {\n case 'countryCode':\n return 'country_code';\n case 'name':\n return 'filter';\n default:\n return column;\n }\n}\n\n\n\nfunction getColumns(\n user: User,\n handleClickedPlaceEvents: (place: IPlace, eventType: PersonEventType, count: number) => void,\n handleClickedRemove: (place: Place) => void,\n handleClickedMerge: (place: Place, state: PlacesListState) => void\n) {\n const columns: ITableColumn[] = [\n new PlaceNameTableColumn('name', T('person.name'), {clickable: true, sortable: true, width: 200}),\n new StringTableColumn('type', T('place.type'), place => getPlaceTypeName(place.place.type), {width: 100}),\n new StringTableColumn('area2', T('place.area2'), place => place.getTranslation().administrative_area_level_2 || '', { sortable: false }),\n new StringTableColumn('area1', T('place.area1'), place => place.getTranslation().administrative_area_level_1 || '', { sortable: false }),\n new ComponentTableColumn('countryCode', T('place.countryCode'), place => {\n return
\n {place.countryCode}
\n {getName(place.countryCode, getActiveLanguage())}\n
\n }, { clickable: true, sortable: false, width: 128 }),\n new ComponentTableColumn('events', T('place.events'), place => {\n return \n }, { clickable: false, sortable: false, width: 128 })\n ];\n if (user.canEdit()) {\n columns.push(\n new ActionsTableColumn('actions', T('generic.list.actions'), place => [\n { icon: Icon.Edit, page: PageID.EditPlace, pageParam: place.id },\n {\n icon: state => ,\n style: TableRowActionStyle.Warning,\n tooltip: T('generic.action.merge'),\n onClick: handleClickedMerge\n },\n {\n icon: Icon.TimesCircle,\n onClick: handleClickedRemove,\n style: TableRowActionStyle.Danger\n }\n ])\n );\n }\n return columns;\n}\n\nconst StatusOptions = [\n ResolutionStatus.All,\n ResolutionStatus.Found,\n ResolutionStatus.NotFound,\n ResolutionStatus.Unresolved,\n ResolutionStatus.Custom,\n ResolutionStatus.Ambiguous\n];\n\nconst PageSize = 10;\nconst rowKey = (item: Place) => item.id;\n\nexport default (props: PageProps) => {\n const { history, loading, via } = props;\n\n const modals = useModalContext();\n const user = api.user;\n\n const statusOptions = useMemo(() => StatusOptions.map(status => (\n \n )), []);\n\n const [pageState, updatePageState] = usePageState('places');\n const { filter, tablePage, sortColumn, sortDirection, filterStatus, mergingFirst, mergingSecond } = pageState;\n const [items, setItems] = useState>();\n const refresh = useRefresh(() => {\n loading.loading(api.findPlaces(\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]],\n [GetPlaceOptions.EventsByType],\n TextMode.Contains,\n { resolution_status: filterStatus === ResolutionStatus.All ? undefined : filterStatus }\n ), plural('place'))\n .then(result => {\n const places = result.data.map(place => new Place(place));\n return setItems({ data: places, total: result.total });\n });\n });\n useEffect(refresh, [filter, tablePage, sortColumn, sortDirection, filterStatus]);\n\n const handleClickedAdd = () => {\n history.push('/places/create');\n };\n\n const handleClickedRow = (place: Place) => {\n history.push(`/places/${place.id}`);\n };\n\n const columns = useMemo(\n () => {\n const handleClickedPlaceEvents = (place: IPlace, eventType: PersonEventType, count: number) => {\n modals.show(props => (\n \n ));\n }\n\n const handleClickedRemove = async (place: Place) => {\n const result = await api.canRemovePlace(place.id);\n if (result === 0) {\n showNotification({\n message: T('modal.removePlace.impossible'),\n style: 'warning'\n });\n return;\n }\n const confirmed = await modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n\n await api.removePlace(place.id);\n NotificationManager.success(T('modal.removePlace.removed', { name: place.name }));\n refresh();\n };\n\n const handleClickedMerge = async (place: Place, state: PlacesListState) => {\n const mergingFirst = state.selectedForMerge[0];\n if (!mergingFirst) {\n updatePageState({ mergingFirst: place });\n return;\n }\n if (place === mergingFirst) {\n updatePageState({ mergingFirst: undefined });\n return;\n }\n\n updatePageState({ mergingSecond: place });\n const result = await modals.show(props => (\n \n ));\n if (!result.confirmed) {\n // If the cancel button was pressed, then deselect the second or 'to' place to merge\n updatePageState({\n mergingSecond: undefined,\n });\n return;\n } else {\n\n // unselect the places\n updatePageState({\n mergingFirst: undefined,\n mergingSecond: undefined,\n });\n\n // start the merging\n await loading.loading(api.mergePlaces(result.placeA.id, result.placeB.id), 'Merging');\n const message = T('modal.mergePlace.merged', {a: mergingFirst.name, b: place.name});\n NotificationManager.success(message);\n if (result.openResult) {\n history.push(`/places/${result.placeA.id}`);\n } else {\n refresh();\n }\n }\n };\n\n return getColumns(\n user,\n handleClickedPlaceEvents,\n handleClickedRemove,\n handleClickedMerge\n );\n },\n [user, updatePageState, history, modals, refresh, loading]\n );\n\n const handleClickedCancelMerge = () => {\n updatePageState({\n mergingFirst: undefined,\n mergingSecond: undefined,\n });\n };\n\n const handleFilterStatusChanged = (e: React.SyntheticEvent) => {\n updatePageState({\n filterStatus: e.currentTarget.value as ResolutionStatus,\n tablePage: 0\n });\n };\n\n const additionalHeader = <>\n \n {statusOptions}\n \n {filterStatus !== ResolutionStatus.All && (\n \n )}\n {mergingFirst && (\n \n \n \n \n )}\n ;\n\n const tableState = useMemo(() => {\n const merging: Place[] = [];\n if (mergingFirst)\n merging.push(mergingFirst);\n if (mergingSecond)\n merging.push(mergingSecond);\n return { selectedForMerge: merging };\n }, [mergingFirst, mergingSecond]);\n\n return (\n \n );\n}\n","import React, { ReactNode } from 'react';\nimport { BasePage, PageProps, PageState } from '../Page';\nimport { IPlace, Place, getPlaceTypeName, PlaceType, ResolutionStatus, getResolutionStatusColor, getResolutionStatusName } from '../../models/Place';\nimport api from '../../api';\nimport { getActiveLanguage, T } from '../../Translate';\nimport { Badge, Card, Col, Row } from 'react-bootstrap';\nimport { Icon } from '../../components/Icons';\nimport { EditLink } from '../../components/EditLink';\nimport { MapMarkerInputMap, MapMarkerInputValue } from '../../components/inputs/MapMarkerInput';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\nimport { TextStyles } from \"../../config/styles\";\nimport { TopTab, TopTabs } from \"../../components/TopTabs\";\nimport { Language } from \"../../models/PersonStory2\";\nimport ListDocumentsTab from \"./ListDocumentsTab\";\n\n\ninterface StatusViewProps {\n status: ResolutionStatus;\n}\nconst StatusView = (props: StatusViewProps) => {\n const { status } = props;\n return (\n
\n
\n
\n {' '}\n {getResolutionStatusName(status)}\n
\n
\n
\n );\n}\n\ninterface InfoLineViewProps {\n label: string\n text?: string\n children?: ReactNode\n}\nconst InfoLineView = (props: InfoLineViewProps) => {\n const { label, text, children } = props;\n return (\n
\n
{label} :
\n { text &&
{text}
}\n { children &&
{children}
}\n
\n );\n}\n\n\ninterface ViewPlacePageProps extends PageProps {\n id: string;\n}\ninterface ViewPlacePageState extends PageState {\n place?: IPlace;\n numberOfDocuments: number\n}\nexport default class ViewPlacePage extends BasePage {\n constructor(props: ViewPlacePageProps) {\n super(props);\n\n this.state = {\n page: {\n id: PageID.ViewPlace,\n entity: props.id,\n icon: Icon.MapMarker,\n title: '...',\n via: props.via || PageID.ListPlaces\n },\n numberOfDocuments: 0\n };\n }\n\n async componentDidMount() {\n super.componentDidMount();\n\n await this.fetchData();\n\n if (!this.state.place?._id)\n return;\n\n const count = await api.countDocumentsRelatedTo('place', this.state.place?._id);\n this.setState({...this.state, numberOfDocuments: count})\n }\n\n async componentDidUpdate(oldProps: ViewPlacePageProps, oldState: ViewPlacePageState) {\n super.componentDidUpdate(oldProps, oldState);\n\n if (this.props.id !== oldProps.id) {\n await this.fetchData();\n }\n\n const placeId = this.state.place?._id;\n if (placeId && placeId !== oldState.place?._id) {\n const count = await api.countDocumentsRelatedTo('place', placeId);\n this.setState({...this.state, numberOfDocuments: count})\n }\n }\n\n async fetchData() {\n const place = await this.loading(api.getPlace(this.props.id, []), T('noun.place'));\n return this.setState({\n place,\n page: {\n id: PageID.ViewPlace,\n entity: this.props.id,\n icon: Icon.MapMarker,\n title: T('page.place.title'),\n via: this.props.via || PageID.ListPlaces\n }\n });\n }\n\n /** Tabs **/\n\n renderPlaceMapTab = (placeObject: Place) => {\n return <>\n {placeObject && placeObject.hasLocation() && (\n }\n mapElement={
}\n position={MapMarkerInputValue.fromValue(placeObject.place && placeObject.place.loc && { lat: placeObject.place.loc.lat, lng: placeObject.place.loc.lon })}\n onChange={() => {}}\n label=''\n />\n )}\n ;\n }\n\n renderPlaceDocumentsTab = (placeObject: Place) => {\n return (\n \n );\n }\n\n generateTabs(placeObject: Place | undefined): TopTab[] {\n if (!this.state.place?._id)\n return []\n\n if (!placeObject)\n return []\n\n return [\n {\n icon: Icon.ListUl,\n title: T('page.place.tab.map'),\n id: 'map',\n content: () => this.renderPlaceMapTab(placeObject),\n badgeContent: () => '',\n },\n {\n icon: Icon.ListUl,\n title: T('page.place.tab.documents'),\n id: 'documents',\n content: () => this.renderPlaceDocumentsTab(placeObject),\n badgeContent: () => this.state.numberOfDocuments.toString()\n }\n ]\n }\n\n\n renderContent() {\n const { place } = this.state;\n const placeObject = place && new Place(place);\n const user = api.user;\n\n return (\n <>\n \n \n
\n
\n {place &&

{placeObject?.describe(getActiveLanguage())}

}\n
\n
\n {place && user.canEdit() && }\n
\n
\n
\n \n
\n \n \n \n \n \n \n 0 ? place.alternative_names.join(', ') : '...'}/>\n \n \n \n
\n {Object.values(Language).map(language =>\n placeObject && place?.languages[language] &&

{`${language}:`}{placeObject.describe(language)}

\n )}\n\n
\n
\n \n
\n
\n
\n
\n \n \n );\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { PageProps, Page } from '../Page';\nimport { FormCard } from '../../components/FormCard';\nimport { Icon } from '../../components/Icons';\nimport { Button, Col, Row } from 'react-bootstrap';\nimport {\n Place,\n PlaceType,\n ResolutionStatus,\n toLatLng,\n IPlaceFields,\n toLatLon, createEmptyLanguages\n} from '../../models/Place';\nimport { getActiveLanguage, T } from '../../Translate';\nimport { MapMarkerInputMap, ILatLon, MapMarkerInputValue } from '../../components/inputs/MapMarkerInput';\nimport api from '../../api';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { useNumberOfRelatedDocuments, usePlace } from '../../FunctionalAPI';\nimport { PlaceFormState, PlaceForm } from './PlaceForm';\nimport { PageID, getPageVia } from '../../utils/PageLinking';\nimport { TopTab, TopTabs } from \"../../components/TopTabs\";\nimport ListDocumentsTab from \"../ViewPlace/ListDocumentsTab\";\nimport { MapCoordinatesInput } from '../../components/inputs/MapCoordinatesInput';\nimport { NotificationManager } from \"react-notifications\";\n\ninterface EditPlacePageProps extends PageProps {\n id?: string;\n}\n\nexport default function EditPlacePage(props: EditPlacePageProps) {\n const { history, loading, id, via } = props;\n\n /*** state ***/\n\n const [formState, setFormState] = useState({\n resolutionStatus: ResolutionStatus.Custom,\n country: 'BE',\n type: PlaceType.Locality,\n alternativeNames: '',\n languages: createEmptyLanguages(),\n suggestions: [],\n similar: [],\n location: MapMarkerInputValue.empty()\n });\n\n const {\n resolutionStatus,\n country,\n type,\n alternativeNames,\n location\n } = formState;\n\n const place = usePlace(loading, id);\n\n /// The number of document related to this place.\n const numberOfDocuments = useNumberOfRelatedDocuments('place', place?._id )\n\n /*** effects ***/\n\n useEffect(() => {\n if (place) {\n setFormState({\n resolutionStatus: place.resolution_status,\n country: place.country_code,\n type: place.type,\n alternativeNames: place.alternative_names.join(','),\n location: MapMarkerInputValue.fromValue(toLatLng(place.loc)),\n languages: place.languages || createEmptyLanguages(),\n\n suggestions: [],\n similar: []\n });\n } else {\n clearForm();\n }\n }, [place]);\n\n /*** handlers ***/\n\n const handlePositionChanged = (position: MapMarkerInputValue) => {\n updatePlace({ location: position });\n }\n\n const handleClickedSave = () => {\n save(false);\n }\n\n /*** helpers ***/\n\n const updatePlace = (update: Partial) => {\n if (resolutionStatus !== ResolutionStatus.Custom) {\n update.resolutionStatus = ResolutionStatus.Custom;\n }\n\n setFormState(Object.assign({}, formState, update));\n };\n\n const setLocation = (location: MapMarkerInputValue) => {\n updatePlace({ location });\n };\n\n const clearForm = () => {\n setFormState({\n resolutionStatus: ResolutionStatus.Custom,\n country: 'BE',\n type: PlaceType.Locality,\n alternativeNames: '',\n location: MapMarkerInputValue.empty(),\n languages: createEmptyLanguages(),\n\n suggestions: [],\n similar: []\n });\n }\n\n const save = async (createNew: boolean) => {\n const primaryLanguage = Place.getPrimaryLanguage(country);\n\n const fields: IPlaceFields & { _id?: string } = {\n _id: id,\n type,\n country_code: country,\n languages: formState.languages,\n alternative_names: alternativeNames.split(','),\n resolution_status: resolutionStatus,\n loc: toLatLon(location.lastValidPosition)\n };\n\n const result = await api.validatePlace(fields, id ? 'update' : 'create');\n if (result.status === 'NOK') {\n NotificationManager.success(T('page.editPlace.notificatons.saved.error',{name: fields.languages[primaryLanguage].name}));\n return;\n }\n\n if (id) {\n const placeWithId = Object.assign({ _id: id }, fields);\n await api.updatePlace(placeWithId);\n if (createNew)\n openNew();\n } else {\n const place = await api.createPlace(fields);\n if (createNew) {\n openNew();\n } else {\n history.push(`/places/${place._id}`);\n }\n }\n NotificationManager.success(T('page.editPlace.notificatons.saved',{name: fields.languages[primaryLanguage].name}));\n }\n\n const openNew = () => {\n if (id) {\n history.push('/places/create');\n } else {\n clearForm();\n }\n }\n\n /*** rendering ***/\n\n const title = place ? T('page.editPlace.title.edit') : T('page.editPlace.title.create');\n\n const generateTabs = (): TopTab[] => {\n return [\n {\n icon: Icon.ListUl,\n title: T('page.place.tab.map'),\n id: 'map',\n content: () => renderEditTab(),\n badgeContent: () => '',\n },\n {\n icon: Icon.ListUl,\n title: T('page.place.tab.documents'),\n id: 'documents',\n content: () => renderPlaceDocumentsTab(),\n badgeContent: () => numberOfDocuments.toString(),\n }\n ];\n }\n\n const renderEditTab = () => {\n return (\n <>\n \n \n \n \n \n \n \n \n }\n mapElement={
}\n position={location}\n defaultCenter={location.lastValidPosition || {lat: 52, lng: 3}}\n onChange={handlePositionChanged}\n label=''\n />\n
\n \n \n \n \n \n \n \n \n );\n }\n\n const renderPlaceDocumentsTab = () => {\n if (!place) {\n return (<>)\n } else {\n return (\n \n );\n }\n }\n\n return (\n \n \n \n )\n}\n","import React, { useMemo } from 'react';\nimport { markdown2html } from '../utils/Markdown';\n\ninterface MarkdownViewProps {\n content: string;\n}\nexport const MarkdownView = (props: MarkdownViewProps) => {\n const { content } = props;\n const rendered = useMemo(() => markdown2html(content), [content]);\n return
;\n}\n","import React from 'react';\nimport moment from 'moment';\nimport { BasePage, PageState, PageProps } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport api from '../../api';\nimport { IPersonFeedback, PersonFeedbackLoadOptions } from '../../models/PersonFeedback';\nimport { Card, ButtonGroup } from 'react-bootstrap';\nimport styles from './index.module.scss';\nimport { guessFileType, getLargeIcon } from '../../utils/MimeTypes';\nimport { IAttachment } from '../../models/Attachment';\nimport { MarkdownView } from '../../components/MarkdownView';\nimport { T } from '../../Translate';\nimport { Paginator } from '../../components/Paginator';\nimport { SortDirection } from '../../components/table/Table';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\n\ninterface AttachmentViewProps {\n attachment: IAttachment;\n onClickedAdd: (attachment: IAttachment) => void;\n}\nconst AttachmentView = (props: AttachmentViewProps) => {\n const { attachment, onClickedAdd } = props;\n return (\n
\n preview\n
\n \n \n \n \n onClickedAdd(attachment)}\n >\n \n \n \n
\n
\n );\n}\n\ninterface FeedbackViewProps {\n feedback: IPersonFeedback;\n onClickedAddAttachment: (feedback: IPersonFeedback, attachment: IAttachment) => void;\n}\nconst FeedbackView = (props: FeedbackViewProps) => {\n const { feedback, onClickedAddAttachment } = props;\n const attachments = (feedback.extend_attachments ?? []).map(attachment => \n onClickedAddAttachment(feedback, attachment)}\n />);\n return (\n \n \n {feedback.name} ({feedback.email}) - on {feedback.extend_person_name ?? '?'} ({moment(feedback.timestamp).format('DD/MM/YYYY HH:mm')})\n \n \n \n \n {feedback.extend_attachments && feedback.extend_attachments.length > 0 && (\n \n {attachments}\n \n )}\n \n );\n};\n\ninterface ListPersonFeedbackProps extends PageProps {\n\n}\ninterface ListPersonFeedbackState extends PageState {\n filter: string;\n tablePage: number;\n sortColumn: string;\n sortDirection: SortDirection;\n\n total: number;\n items: IPersonFeedback[];\n}\nconst PageSize = 10;\n\nexport default class ListPersonFeedback extends BasePage {\n refreshTimeout?: NodeJS.Timeout;\n\n constructor(props: ListPersonFeedbackProps) {\n super(props);\n\n this.state = {\n page: {\n id: PageID.ListPersonFeedback,\n icon: Icon.Comments,\n title: T('page.personFeedback.title'),\n },\n\n filter: '',\n tablePage: 0,\n sortColumn: 'timestamp',\n sortDirection: SortDirection.Down,\n\n total: 0,\n items: []\n };\n }\n\n componentDidMount() {\n super.componentDidMount();\n\n this.load();\n }\n\n getSortColumn(name: string) {\n return name;\n }\n\n load = () => {\n const { filter, tablePage, sortColumn, sortDirection } = this.state;\n return this.loading(api.findPersonFeedback(\n filter,\n tablePage * PageSize,\n PageSize,\n [[this.getSortColumn(sortColumn), sortDirection]],\n [PersonFeedbackLoadOptions.PersonName, PersonFeedbackLoadOptions.Attachments]\n ), 'feedback')\n .then(results => {\n this.setState({\n total: results.total,\n items: results.data\n })\n });\n }\n\n handlePageSelected = (page: number) => {\n this.setState({ tablePage: page }, this.load);\n }\n\n handleClickedAddAttachment = async (feedback: IPersonFeedback, attachment: IAttachment) => {\n /* functionality removed */\n }\n\n renderContent() {\n const { tablePage, items, total } = this.state;\n const itemViews = items.map(item => (\n \n ));\n return <>\n
\n {itemViews}\n
\n \n ;\n }\n}\n","import React from 'react';\nimport BaseModal, { ModalProps, BaseModalState } from '../../modals/BaseModal';\nimport { IUserFields, UserType, Dataset, IUser, UserTypeNames, DatasetNames } from '../../models/User';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { T } from '../../Translate';\nimport { Form, Modal, Button } from 'react-bootstrap';\nimport { SelectInput, ISelectOption } from '../../components/inputs/SelectInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport api from '../../api';\nimport { getErrorDescription } from '../../models/ValidationResult';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { ModalHeader } from '../../modals/ModalHeader';\n\ninterface EditUserModalProps extends ModalProps {\n user: IUser|undefined;\n}\ninterface EditUserModalState extends BaseModalState {\n username: string;\n usernameError?: string;\n type: UserType;\n typeError?: string;\n language: string;\n languageError?: string;\n dataset: Dataset;\n datasetError?: string;\n name: string;\n nameError?: string;\n email: string;\n emailError?: string;\n phone: string;\n phoneError?: string;\n description: string;\n descriptionError?: string;\n}\n\nexport class EditUserModal extends BaseModal {\n typeOptions: ISelectOption[];\n languageOptions: ISelectOption[];\n datasetOptions: ISelectOption[];\n\n constructor(props: EditUserModalProps) {\n super(props);\n\n this.typeOptions = UserTypeNames.map(t => ({ value: t[0], title: T(t[1]) }));\n\n this.languageOptions = [\n { value: 'nl', title: T('language.nl') },\n { value: 'fr', title: T('language.fr') },\n { value: 'en', title: T('language.en') },\n { value: 'de', title: T('language.de') }\n ];\n\n this.datasetOptions = DatasetNames.map(x => ({ value: x[0], title: T(x[1]) }));\n\n var user: IUserFields = props.user || {\n type: UserType.Normal,\n dataset: Dataset.Any,\n account: '',\n name: '',\n email: '',\n phone: '',\n description: '',\n language: 'nl',\n };\n this.state = {\n visible: true,\n\n username: user.account,\n type: user.type,\n language: user.language,\n dataset: user.dataset,\n name: user.name,\n email: user.email,\n phone: user.phone,\n description: user.description\n };\n }\n\n handleUsernameChanged = (username: string) => {\n this.setState({\n username,\n usernameError: undefined\n });\n }\n\n handleTypeChanged = (value: string) => {\n this.setState({\n type: value as UserType,\n typeError: undefined\n });\n }\n\n handleLanguageChanged = (value: string) => {\n this.setState({\n language: value,\n languageError: undefined\n });\n }\n\n handleDatasetChanged = (value: string) => {\n this.setState({\n dataset: value as Dataset,\n datasetError: undefined\n });\n }\n\n handleNameChanged = (name: string) => {\n this.setState({\n name,\n nameError: undefined\n });\n }\n\n handleEmailChanged = (email: string) => {\n this.setState({\n email,\n emailError: undefined\n });\n }\n\n handlePhoneChanged = (phone: string) => {\n this.setState({\n phone,\n phoneError: undefined\n });\n }\n\n handleDescriptionChanged = (description: string) => {\n this.setState({\n description,\n descriptionError: undefined\n });\n }\n\n handleClickedSave = () => {\n const { user } = this.props;\n const {\n type,\n dataset,\n username,\n name,\n email,\n phone,\n description,\n language\n } = this.state;\n\n const data: IUserFields & { _id?: string } = {\n _id: user ? user._id : undefined,\n type,\n dataset,\n account: username,\n name,\n email,\n phone,\n description,\n language\n };\n\n api.validateUser(data, user ? 'update' : 'create').then(result => {\n if (result.status === 'OK') {\n this.resolve(data);\n return;\n }\n\n const errors = result.data || {};\n this.setState({\n typeError: getErrorDescription(errors.type,),\n datasetError: getErrorDescription(errors.dataset),\n usernameError: getErrorDescription(errors.account),\n nameError: getErrorDescription(errors.name),\n emailError: getErrorDescription(errors.email),\n phoneError: getErrorDescription(errors.phone),\n descriptionError: getErrorDescription(errors.description),\n languageError: getErrorDescription(errors.language)\n });\n });\n }\n\n renderModal() {\n const { user } = this.props;\n const {\n username,\n usernameError,\n type,\n typeError,\n language,\n languageError,\n dataset,\n datasetError,\n name,\n nameError,\n email,\n emailError,\n phone,\n phoneError,\n description,\n descriptionError\n } = this.state;\n\n return <>\n \n {user ? T('createUser.editTitle') : T('createUser.createTitle')}\n \n \n
\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n ;\n }\n}\n","import React, { useMemo, useState, useEffect } from 'react';\nimport api from '../../api';\nimport { IUser, getUsertypeName, IUserFields } from '../../models/User';\nimport { IQueryResult } from '../../models/Generic';\nimport { EditUserModal } from './EditUserModal';\nimport { ITableColumn, StringFieldTableColumn, StringTableColumn, ActionsTableColumn, TableRowActionStyle, ITableRowAction } from '../../components/table/Fields';\nimport { Icon } from '../../components/Icons';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { T, plural } from '../../Translate';\nimport { NotificationManager } from 'react-notifications';\nimport { ListState, ListPage } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { usePageState } from '../../redux/Actions';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { useRefresh } from '../../utils/Functional';\nimport { PageID } from '../../utils/PageLinking';\n\nfunction createColumns(\n onClickedEdit: (user: IUser) => void,\n onClickedRemove: (user: IUser) => void,\n onClickedResend: (user: IUser) => void\n): ITableColumn[] {\n return [\n new StringFieldTableColumn('account', T('user.username'), { width: 150 }),\n new StringTableColumn('type', T('user.type'), user => getUsertypeName(user.type)),\n new StringFieldTableColumn('name', T('user.name')),\n new StringFieldTableColumn('email', T('user.email')),\n new StringFieldTableColumn('phone', T('user.phone'), { width: 120 }),\n new StringTableColumn('status', T('user.status'), user => user.confirmed ? T('user.status.checked') : T('user.status.pending')),\n new ActionsTableColumn('actions', T('generic.list.actions'), user => {\n const result: ITableRowAction[] = [\n { icon: Icon.Edit, onClick: onClickedEdit },\n { icon: Icon.TimesCircle, onClick: onClickedRemove, style: TableRowActionStyle.Danger }\n ];\n if (!user.confirmed) {\n result.splice(0, 0, {\n icon: Icon.Refresh,\n onClick: onClickedResend,\n tooltip: T('page.users.resendInvitation')\n });\n }\n return result;\n }, { width: 100 })\n ];\n}\n\nexport type ListUsersStateProps = ListState;\nexport const rowKey = (item: IUser) => item._id;\n\nconst PageSize = 10;\n\nexport default (props: PageProps) => {\n const { loading, via } = props;\n\n const modals = useModalContext();\n \n const [pageState, updatePageState] = usePageState('users');\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n const [items, setItems] = useState>();\n const refresh = useRefresh(() => {\n loading.loading(api.findUser(\n filter,\n tablePage * PageSize,\n PageSize,\n [[sortColumn, sortDirection]]\n ), plural('user'))\n .then(setItems);\n });\n useEffect(refresh, [loading, filter, tablePage, sortColumn, sortDirection]);\n\n const handleClickedAdd = async () => {\n const user = await modals.show(\n props => \n );\n await api.createUser(user);\n refresh();\n }\n\n const columns: ITableColumn[] = useMemo(() => {\n const handleClickedResendInvitation = (user: IUser) => {\n api.resendUserInvitationMail(user._id).then(() => {\n NotificationManager.success(T('page.users.resendSent'));\n });\n }\n \n const handleClickedEdit = (user: IUser) => {\n modals.show(\n props => \n ).then(editedUser => {\n var user2 = Object.assign(editedUser, { _id: user._id });\n api.updateUser(user2).then(refresh);\n });\n }\n \n const handleClickedRemove = (user: IUser) => {\n modals.show(props => (\n \n )).then(confirmed => {\n if (!confirmed)\n return;\n \n api.removeUser(user._id).then(refresh);\n });\n }\n\n return createColumns(\n handleClickedEdit,\n handleClickedRemove,\n handleClickedResendInvitation\n );\n }, [modals, refresh]);\n\n return (\n \n );\n}\n","export enum ProjectType {\n TemporaryExhibition = 'temporary_exhibition'\n}\n\nexport interface IProjectFields {\n title: string;\n type: ProjectType;\n fromDay: number|null;\n fromMonth: number|null;\n fromYear: number|null;\n toDay: number|null;\n toMonth: number|null;\n toYear: number|null;\n description: string;\n}\n\nexport interface IProject extends IProjectFields {\n _id: string;\n}\n","import React from 'react';\nimport BaseModal, { ModalProps, BaseModalState } from '../../modals/BaseModal';\nimport { IProject, IProjectFields, ProjectType } from '../../models/Project';\nimport { DateInputValue, DateInput } from '../../components/inputs/DateInput';\nimport { Modal, Form, Button } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { ISelectOption, SelectInput } from '../../components/inputs/SelectInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport api from '../../api';\nimport { getErrorDescription } from '../../models/ValidationResult';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { ModalHeader } from '../../modals/ModalHeader';\n\ninterface EditProjectModalProps extends ModalProps {\n project?: IProject;\n}\ninterface EditProjectModalState extends BaseModalState {\n title: string;\n titleError?: string;\n type: ProjectType;\n typeError?: string;\n fromDate: DateInputValue;\n fromDateError?: string;\n toDate: DateInputValue;\n toDateError?: string;\n description: string;\n descriptionError?: string;\n}\nexport default class EditProjectModal extends BaseModal {\n typeOptions: ISelectOption[];\n\n constructor(props: EditProjectModalProps) {\n super(props);\n\n const project = props.project || {\n title: '',\n type: ProjectType.TemporaryExhibition,\n fromDay: null,\n fromMonth: null,\n fromYear: null,\n toDay: null,\n toMonth: null,\n toYear: null,\n description: ''\n };\n\n this.typeOptions = [\n { value: ProjectType.TemporaryExhibition, title: T('projectType.temporaryExhibition') }\n ];\n\n this.state = {\n visible: true,\n\n title: project.title,\n type: project.type,\n fromDate: {\n day: project.fromDay === null ? '' : project.fromDay.toString(),\n month: project.fromMonth === null ? '' : project.fromMonth.toString(),\n year: project.fromYear === null ? '' : project.fromYear.toString()\n },\n toDate: {\n day: project.toDay === null ? '' : project.toDay.toString(),\n month: project.toMonth === null ? '' : project.toMonth.toString(),\n year: project.toYear === null ? '' : project.toYear.toString()\n },\n description: project.description\n };\n }\n\n handleTitleChanged = (title: string) => {\n this.setState({\n title,\n titleError: undefined\n });\n }\n\n handleTypeChanged = (value: string) => {\n this.setState({\n type: value as ProjectType,\n typeError: undefined\n });\n }\n\n handleFromDateChanged = (date: DateInputValue) => {\n this.setState({ fromDate: date, fromDateError: undefined });\n }\n\n handleToDateChanged = (date: DateInputValue) => {\n this.setState({ toDate: date, toDateError: undefined });\n }\n\n handleDescriptionChanged = (description: string) => {\n this.setState({\n description,\n descriptionError: undefined\n });\n }\n\n handleClickedSave = () => {\n const { project } = this.props;\n const {\n title,\n type,\n fromDate,\n toDate,\n description\n } = this.state;\n\n const data: IProjectFields & { _id?: string } = {\n _id: project ? project._id : undefined,\n title,\n type,\n fromDay: fromDate.day ? parseInt(fromDate.day) : null,\n fromMonth: fromDate.month ? parseInt(fromDate.month) : null,\n fromYear: fromDate.year ? parseInt(fromDate.year) : null,\n toDay: toDate.day ? parseInt(toDate.day) : null,\n toMonth: toDate.month ? parseInt(toDate.month) : null,\n toYear: toDate.year ? parseInt(toDate.year) : null,\n description\n };\n api.validateProject(data, project ? 'update' : 'create').then(result => {\n if (result.status === 'OK') {\n this.resolve(data);\n return;\n }\n\n const errors = result.data || {};\n this.setState({ \n titleError: getErrorDescription(errors.title),\n typeError: getErrorDescription(errors.type),\n fromDateError: getErrorDescription(errors.fromDay),\n toDateError: getErrorDescription(errors.toDay),\n descriptionError: getErrorDescription(errors.description)\n });\n });\n }\n\n renderModal() {\n const { project } = this.props;\n const {\n title,\n titleError,\n type,\n typeError,\n fromDate,\n fromDateError,\n toDate,\n toDateError,\n description,\n descriptionError\n } = this.state;\n\n return <>\n \n {T(project ? 'modal.editProject.editTitle' : 'modal.editProject.createTitle')}\n \n \n
\n \n \n \n \n \n \n
\n \n \n \n \n ;\n }\n}\n","import React, { useMemo, useState, useEffect } from 'react';\nimport { IProject, IProjectFields } from '../../models/Project';\nimport { Icon } from '../../components/Icons';\nimport { T, plural } from '../../Translate';\nimport { StringFieldTableColumn, ActionsTableColumn, TableRowActionStyle, ITableColumn } from '../../components/table/Fields';\nimport { IQueryResult } from '../../models/Generic';\nimport api from '../../api';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport EditProjectModal from './EditProjectModal';\nimport { ListState, ListPage } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { usePageState } from '../../redux/Actions';\nimport { useRefresh } from '../../utils/Functional';\nimport { PageID } from '../../utils/PageLinking';\n\nexport type ListProjectsStateProps = ListState;\n\nconst rowKey = (item: IProject) => item._id;\nconst PageSize = 10;\n\nexport default function ListProjects(props: PageProps) {\n const { history, loading, modals, via } = props;\n\n const [pageState, updatePageState] = usePageState('projects');\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n const [items, setItems] = useState>();\n const refresh = useRefresh(() => {\n loading.loading(api.findProjects(\n filter,\n tablePage * PageSize,\n PageSize,\n [[sortColumn, sortDirection]]\n ), plural('project'))\n .then(setItems);\n });\n useEffect(refresh, [filter, tablePage, sortColumn, sortDirection]);\n\n const handleClickedAdd = () => {\n modals.show(props => )\n .then(data => api.createProject(data))\n .then(refresh);\n }\n\n const handleClickedRow = (project: IProject) => {\n history.push('/projects/' + project._id);\n }\n\n const columns: ITableColumn[] = useMemo(\n () => {\n const handleClickedEdit = (project: IProject) => {\n modals.show(props => (\n \n )).then(data => {\n const request = Object.assign(data, { _id: project._id });\n api.updateProject(request).then(refresh);\n });\n }\n \n const handleClickedRemove = async (project: IProject) => {\n const confirmed = await modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n \n await api.removeProject(project._id);\n refresh();\n }\n\n return [\n new StringFieldTableColumn('title', T('project.title')),\n new ActionsTableColumn('actions', T('project.actions'), project => [\n { icon: Icon.Edit, onClick: handleClickedEdit },\n { icon: Icon.TimesCircle, onClick: handleClickedRemove, style: TableRowActionStyle.Danger }\n ])\n ];\n },\n [modals, refresh]\n );\n\n return (\n \n );\n}\n","import React, { useMemo, useState, useCallback, useEffect } from 'react';\nimport { Person } from '../../models/Person';\nimport { T, plural } from '../../Translate';\nimport { Icon } from '../../components/Icons';\nimport { rowKey, generatePersonsColumns } from '../ListPersons';\nimport { IQueryResult } from '../../models/Generic';\nimport api from '../../api';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { ITableColumn } from '../../components/table/Fields';\nimport { PageProps } from '../Page';\nimport { ListState, ListPage } from '../ListPage';\nimport { useProject } from '../../FunctionalAPI';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { usePageState } from '../../redux/Actions';\nimport { NotificationManager } from 'react-notifications';\nimport { PageID, getPageLink, getPageVia } from '../../utils/PageLinking';\n\nexport type ViewProjectStateProps = ListState;\n\ninterface ViewProjectPageOwnProps extends PageProps {\n id: string;\n}\n\nconst PageSize = 10;\nexport default (props: ViewProjectPageOwnProps) => {\n const { history, loading, id, via } = props;\n\n const modals = useModalContext();\n const [items, setItems] = useState>();\n const [pageState, updatePageState] = usePageState('project');\n const project = useProject(loading, id);\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n const refresh = useCallback(() => {\n loading.loading(\n api.findPersons(\n { 'project_memberships.project': id },\n filter,\n tablePage * PageSize,\n PageSize,\n [[sortColumn, sortDirection]]\n ),\n plural('person')\n ).then(x => setItems({\n total: x.total,\n data: x.data.map(y => new Person(y))\n }));\n }, [loading, filter, tablePage, sortColumn, sortDirection, id]);\n useEffect(refresh, [refresh]);\n\n const handleClickedRow = (person: Person) => {\n history.push(getPageLink(PageID.ViewPerson, person.id) + '?via=' + getPageVia(PageID.ViewProject, id));\n };\n\n const columns: ITableColumn[] = useMemo(\n () => {\n const handleDeletionConfirmed = async (person: Person) => {\n await api.removePerson(person.id);\n refresh();\n NotificationManager.success(T('modal.removePerson.removed', { name: person.name }));\n };\n\n const handleClickedRemove = (person: Person) => {\n modals.show(props => (\n \n )).then(confirmed => confirmed && handleDeletionConfirmed(person));\n };\n \n return generatePersonsColumns(handleClickedRemove);\n },\n [modals, refresh]\n );\n \n return (\n \n );\n}\n","export function formatSortableDate(date: string) {\n if (date === '')\n return '';\n\n const year = date.substring(0, 4);\n const month = date.substring(4, 6);\n const day = date.substring(6, 8);\n return `${day === '??' ? '?' : day}/${month === '??' ? '?' : month}/${year === '????' ? '?' : year}`;\n}\n\n\n\nexport function formatDayMonthYear(day: String | null, month: String | null, year: String | null) {\n let dayString = day ?? \"??\";\n let monthString = month ?? \"??\"\n let yearString = year ?? \"??\"\n\n return `${dayString}/${monthString}/${yearString}`\n}\n","import React from 'react';\nimport { EventInfoLine } from '../../models/PersonEvent';\n\nimport eventStyles from '../ViewPerson/index.module.scss';\nimport { Card, Button } from 'react-bootstrap';\nimport { Icon } from '../../components/Icons';\nimport {\n MilitaryEntityEvent,\n getMilitaryEntityEventTypeName,\n getMilitaryEntityEventIcon,\n getMilitaryEntityTypeName,\n getMilitaryTrackTypeName,\n MilitaryEntity,\n IMilitaryEntityStructureEvent\n} from '../../models/MilitaryEntity';\nimport { formatSortableDate } from '../../utils/Date';\nimport { T } from '../../Translate';\nimport { PageID } from '../../utils/PageLinking';\nimport PageLink from '../../components/PageLink';\nimport PlaceInfo from '../../components/inputs/PlaceInfo';\n\nexport function getMilitaryEntityEventInfo(event: MilitaryEntityEvent): EventInfoLine[] {\n const result: EventInfoLine[] = [];\n if (event.from_date && event.from_date !== '????????') {\n result.push({\n key: 'from',\n title: T('page.militaryEntity.event.from'),\n value: formatSortableDate(event.from_date)\n });\n }\n if (event.to_date && event.to_date !== '????????') {\n result.push({\n key: 'to',\n title: T('page.militaryEntity.event.to'),\n value: formatSortableDate(event.to_date)\n });\n }\n if (event.type === 'attached' || event.type === 'structure') {\n const entity = event.entity;\n if (entity) {\n result.push({\n key: 'entity',\n title: getMilitaryEntityTypeName(entity.type) + ':',\n value: (\n \n {new MilitaryEntity(entity).name}\n \n )\n });\n }\n }\n if (event.type === 'track') {\n const place = event.place;\n if (place) {\n result.push({\n key: 'place',\n title: T('page.militaryEntity.event.place'),\n value: \n });\n }\n if (event.topo)\n result.push({ key: 'topo', title: T('page.militaryEntity.event.topo'), value: event.topo });\n }\n if (event.description)\n result.push({ key: 'description', title: T('page.militaryEntity.event.description'), value: event.description });\n \n return result;\n}\n\nexport function getMilitaryEntitySubTypeName(event: MilitaryEntityEvent): string|undefined {\n switch (event.type) {\n case 'structure':\n return T('militaryEntityEventType.sub.structure');\n case 'attached':\n return T('militaryEntityEventType.sub.attached');\n case 'track':\n return getMilitaryTrackTypeName(event.track_type);\n default:\n return '';\n }\n}\n\ninterface MilitaryEntityEventViewProps {\n event: MilitaryEntityEvent;\n onClickedEdit?: (event: MilitaryEntityEvent) => void;\n onClickedRemove?: (event: MilitaryEntityEvent) => void;\n}\nexport const MilitaryEntityEventView = (props: MilitaryEntityEventViewProps) => {\n const { event, onClickedEdit, onClickedRemove } = props;\n const info: JSX.Element[] = [];\n getMilitaryEntityEventInfo(event).forEach(entry => {\n info.push(
{entry.title}
);\n info.push(
{entry.value}
);\n });\n\n const handleClickedEdit = () => onClickedEdit && onClickedEdit(event);\n const handleClickedRemove = () => onClickedRemove && onClickedRemove(event);\n const entity = (event as IMilitaryEntityStructureEvent).entity;\n const subHistory = entity\n && entity.history\n && entity.history.map((event, index) => (\n onClickedEdit(event))}\n onClickedRemove={onClickedRemove && (() => onClickedRemove(event))}\n />\n ));\n\n return <>\n
\n
\n
\n \n
\n
\n
\n \n \n
\n { onClickedEdit && (\n \n )}\n { onClickedRemove && (\n \n )}\n
\n

{getMilitaryEntityEventTypeName(event.type)} · {getMilitaryEntitySubTypeName(event)}

\n
\n {info}\n
\n
\n
\n
\n
\n
{subHistory}
\n ;\n}\n","import React, { useEffect, useState } from 'react';\nimport {MilitaryEntity, MilitaryEntityType } from '../../models/MilitaryEntity';\nimport { IQueryResult } from '../../models/Generic';\nimport api from '../../api';\nimport { plural } from '../../Translate';\nimport { Card } from 'react-bootstrap';\nimport { usePageState } from '../../redux/Actions';\nimport { PageProps } from '../Page';\nimport { useAppSelector, useRefresh } from '../../utils/Functional';\nimport { getPageLinkWithVia, PageID } from '../../utils/PageLinking';\nimport { SortDirection, Table } from \"../../components/table/Table\";\nimport { generatePersonsColumns } from \"../ListPersons\";\nimport { Person, PersonQueryOptions } from \"../../models/Person\";\nimport { Search } from \"../../components/Search\";\nimport { useDelayedUpdateEffect } from \"../../utils/UpdateEffects\";\n\n\nconst PageSize = 10;\nconst rowKey = (item: Person) => item.id;\n\ninterface ListPersonsTabProps extends PageProps {\n entity?: MilitaryEntity\n}\n\n/**\n *\n */\nexport default (props: ListPersonsTabProps) => {\n\n /*** state ***/\n\n const [pageState, updatePageState] = usePageState('militaryEntityPersons');\n const [items, setItems] = useState>();\n const currentPage = useAppSelector(state => state.activePageState);\n\n /*** variables ***/\n\n const { history, loading, entity } = props;\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n /*** api ***/\n\n const loadPersons = (skip: number, limit: number): Promise|undefined> => {\n const { filter, sortColumn, sortDirection } = pageState;\n if (entity && (entity.type === MilitaryEntityType.Unit || entity.type === MilitaryEntityType.Regiment)) {\n return loading.loading(api.getMilitaryEntitySoldiers(\n entity.army,\n entity.regiment || '',\n entity.unit || null,\n entity.unitNr || null,\n filter,\n skip,\n limit,\n [[getSortColumn(sortColumn), sortDirection]],\n [PersonQueryOptions.Memorials, PersonQueryOptions.MilitaryEvents],\n ), plural('person')).then(persons => ({\n total: persons.total,\n data: persons.data.map(person => new Person(person))\n }));\n }\n return Promise.resolve(undefined);\n }\n\n /*** effects ***/\n\n const refresh = useRefresh(() => {\n loadPersons(tablePage * PageSize, PageSize).then(data => {\n setItems(data);\n })});\n useEffect(refresh, [tablePage, sortColumn, sortDirection]);\n\n useDelayedUpdateEffect(() => {\n refresh();\n updatePageState({tablePage: 0})},\n 500,\n [filter])\n\n\n /*** table handlers ***/\n\n const handlePageChanged = (page: number) => {\n updatePageState({ tablePage: page });\n };\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n updatePageState({ sortColumn: column, sortDirection: direction });\n };\n\n const handleClickedRow = (item: Person) => {\n history.push(getPageLinkWithVia(PageID.ViewPerson, item.id, currentPage.id, currentPage.entity));\n }\n\n const handlePersonFilterChanged = (value: string) => {\n updatePageState({...pageState, filter: value})\n }\n\n /*** table helpers ***/\n\n const personColumns = generatePersonsColumns();\n\n const getSortColumn = (column: string) => {\n switch (column) {\n default:\n return 'filter';\n case 'birthDate':\n return 'sort_born_date';\n case 'diedDate':\n return 'sort_died_date';\n }\n }\n\n /*** rendering ***/\n\n const renderPersonsHeader = () => {\n return (\n
\n \n
\n );\n }\n\n return (\n <>\n \n {renderPersonsHeader()}\n \n \n \n \n \n );\n}\n","import React from 'react';\nimport { BasePage, PageProps, PageState } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport { T, plural, singular } from '../../Translate';\nimport api from '../../api';\nimport { MilitaryEntity, MilitaryEntityType, IMilitaryEntityChild, MilitaryEntityEvent } from '../../models/MilitaryEntity';\nimport { TopTabs, TopTab } from '../../components/TopTabs';\nimport { Person } from '../../models/Person';\nimport { IQueryResult } from '../../models/Generic';\nimport { ITableColumn, StringTableColumn } from '../../components/table/Fields';\nimport { generatePersonsColumns } from '../ListPersons';\nimport { Card } from 'react-bootstrap';\nimport { Table, SortDirection } from '../../components/table/Table';\nimport { MilitaryEntityEventView } from '../EditMilitaryEntity/MilitaryEntityEventView';\nimport { formatSortableDate } from '../../utils/Date';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { showNotification } from '../../utils/Notification';\nimport { EditLink } from '../../components/EditLink';\nimport { PageID, getPageLink, getPageVia } from '../../utils/PageLinking';\nimport ListPersonsTab from \"./ListPersonsTab\";\nimport ListDocumentsTab from \"../ViewPlace/ListDocumentsTab\";\n\ninterface ViewMilitaryEntityPageProps extends PageProps {\n id: string;\n}\ninterface ViewMilitaryEntityPageState extends PageState {\n entity?: MilitaryEntity;\n tabs: TopTab[];\n\n personFilter: string;\n personTablePage: number;\n personSortDirection: SortDirection;\n personSortColumn: string;\n\n subEntitiesTablePage: number;\n subEntitiesSortDirection: SortDirection;\n subEntitiesSortColumn: string;\n\n persons?: IQueryResult;\n subEntities: IMilitaryEntityChild[];\n\n numberOfDocuments: number\n}\n\nconst PageSize = 10;\nexport default class ViewMilitaryEntityPage extends BasePage {\n personFilterTimeout?: NodeJS.Timeout;\n personColumns: ITableColumn[];\n subEntityColumns: ITableColumn[];\n\n constructor(props: ViewMilitaryEntityPageProps) {\n super(props);\n\n this.personColumns = generatePersonsColumns(\n this.handleClickedRemovePerson\n );\n this.subEntityColumns = [\n new StringTableColumn(\n 'regiment',\n T('page.militaryEntity.subEntityColumn.regiment'),\n item => item.military_entity.regiment || ''\n ),\n new StringTableColumn(\n 'unit',\n T('page.militaryEntity.subEntityColumn.unit'),\n item => (item.military_entity.unit_nr || '') + ' ' + item.military_entity.unit\n ),\n new StringTableColumn(\n 'from',\n T('page.militaryEntity.subEntityColumn.from'),\n item => formatSortableDate(item.from_date) || '*'\n ),\n new StringTableColumn(\n 'to',\n T('page.militaryEntity.subEntityColumn.to'),\n item => formatSortableDate(item.to_date) || '*'\n )\n ];\n\n this.state = {\n page: {\n id: PageID.ViewMilitaryEntity,\n entity: props.id,\n icon: Icon.Sitemap,\n title: '...'\n },\n tabs: [],\n personFilter: '',\n personTablePage: 0,\n personSortDirection: SortDirection.Up,\n personSortColumn: 'filter',\n subEntitiesTablePage: 0,\n subEntitiesSortDirection: SortDirection.Up,\n subEntitiesSortColumn: 'regiment',\n subEntities: [],\n numberOfDocuments:0\n };\n }\n\n async componentDidUpdate(oldProps: ViewMilitaryEntityPageProps, oldState: ViewMilitaryEntityPageState) {\n super.componentDidUpdate(oldProps, oldState);\n\n if (oldProps.id !== this.props.id) {\n this.loadContent();\n }\n\n if (oldState.entity?.id !== this.state.entity?.id) {\n this.loadNumberOfDocuments()\n }\n\n\n }\n\n loadContent() {\n const { id, via } = this.props;\n this.loading(api.getMilitaryEntity(id, ['history.entity', 'history.place']), singular('militaryEntity'))\n .then(entity => {\n const entityObject = new MilitaryEntity(entity);\n this.setState({\n page: {\n id: PageID.ViewMilitaryEntity,\n entity: id,\n icon: Icon.Sitemap,\n title: entityObject.name,\n via: via || 'military_entities'\n },\n entity: entityObject,\n tabs: this.getTabsForEntity(entityObject),\n persons: undefined\n }, () => {\n this.updatePersons();\n this.updateSubEntities();\n });\n });\n }\n\n loadNumberOfDocuments = async () => {\n if (!this.state.entity?.id)\n return\n\n const count = await api.countDocumentsRelatedTo('military_entity', this.state.entity.id);\n this.setState({...this.state, numberOfDocuments: count})\n }\n\n\n updatePersons = () => {\n const { personTablePage, entity } = this.state;\n if (!entity)\n return;\n\n if (this.personFilterTimeout) {\n clearTimeout(this.personFilterTimeout);\n this.personFilterTimeout = undefined;\n }\n this.loadPersons(personTablePage * PageSize, PageSize).then(data => {\n this.setState({\n persons: data,\n tabs: this.getTabsForEntity(entity)\n });\n });\n }\n\n updateSubEntities = () => {\n const { entity } = this.state;\n if (!entity)\n return;\n this.loading(api.getMilitaryEntitiesIn(entity.id), plural('militaryUnit')).then(subEntities => {\n this.setState({\n subEntities,\n tabs: this.getTabsForEntity(entity)\n });\n });\n }\n\n handleClickedRemovePerson = (person: Person) => {\n this.showModal(props => (\n \n ))\n .then(confirmed => { confirmed && api.removePerson(person.id); })\n .then(() => {\n showNotification({ message: T('modal.removePerson.removed', { name: person.name }) });\n this.updatePersons();\n });\n }\n\n loadPersons = (skip: number, limit: number): Promise|undefined> => {\n const { entity, personFilter, personSortColumn, personSortDirection } = this.state;\n if (entity && (entity.type === MilitaryEntityType.Unit || entity.type === MilitaryEntityType.Regiment)) {\n return this.loading(api.getMilitaryEntitySoldiers(\n entity.army,\n entity.regiment || '',\n entity.unit || null,\n entity.unitNr || null,\n personFilter,\n skip,\n limit,\n [[personSortColumn, personSortDirection]]\n ), plural('person')).then(persons => ({\n total: persons.total,\n data: persons.data.map(person => new Person(person))\n }));\n }\n\n return Promise.resolve(undefined);\n }\n\n getTabsForEntity(entity: MilitaryEntity): TopTab[] {\n const tabs: TopTab[] = [];\n if (entity.type === MilitaryEntityType.Unit || entity.type === MilitaryEntityType.Regiment) {\n tabs.push({\n id: 'persons',\n title: T('page.militaryEntity.tab.persons'),\n icon: Icon.Users,\n badgeContent: () => this.state.persons === undefined ? '...' : this.state.persons.total.toString(),\n content: this.renderPersonsTab\n });\n }\n tabs.push({\n id: 'events',\n title: T('page.militaryEntity.tab.events'),\n icon: Icon.ListUl,\n badgeContent: () => (entity.entity.history || []).length.toString(),\n content: this.renderEventsTab\n });\n tabs.push({\n id: 'documents',\n title: T('page.militaryEntity.tab.documents'),\n icon: Icon.ListUl,\n badgeContent: () => this.state.numberOfDocuments.toString(),\n content: this.renderDocumentsTab\n });\n if (entity.type !== MilitaryEntityType.Unit) {\n tabs.push({\n id: 'subentities',\n title: T('page.militaryEntity.tab.subEntities'),\n icon: Icon.Sitemap,\n badgeContent: () => this.state.subEntities.length.toString(),\n content: this.renderSubEntitiesTab\n });\n }\n return tabs;\n }\n\n handleSubEntitiesPageChanged = (page: number) => {\n this.setState({ subEntitiesTablePage: page }, this.updateSubEntities);\n }\n\n handleSubEntitiesSortChanged = (column: string, direction: SortDirection) => {\n this.setState({ subEntitiesSortColumn: column, subEntitiesSortDirection: direction });\n }\n\n handleClickedSubEntitiesRow = (entity: IMilitaryEntityChild) => {\n const { history } = this.props;\n history.push(getPageLink(PageID.ViewMilitaryEntity, entity.military_entity._id) + '?via=' + getPageVia(PageID.ViewMilitaryEntity, this.props.id));\n }\n\n renderPersonsTab = () => {\n return (\n \n {api.user.canEdit() && }\n \n \n );\n }\n\n\n renderEventsTab = () => {\n const { entity } = this.state;\n if (!entity)\n return
;\n\n const history = entity.entity.history || [];\n const eventsRendered: JSX.Element[] = history.map(event => this.renderEvent(event));\n return (\n \n \n {api.user.canEdit() && }\n \n \n {eventsRendered}\n \n );\n }\n\n renderDocumentsTab = () => {\n return (\n
\n {api.user.canEdit() && }\n \n
\n\n );\n }\n\n renderEvent(event: MilitaryEntityEvent): JSX.Element {\n return (\n \n );\n }\n\n subEntityRowKey = (entity: IMilitaryEntityChild) => entity._id;\n\n renderSubEntitiesTab = () => {\n const {\n subEntities,\n subEntitiesSortColumn,\n subEntitiesSortDirection,\n subEntitiesTablePage\n } = this.state;\n const pageEntities = subEntities.slice(\n subEntitiesTablePage * PageSize,\n (subEntitiesTablePage + 1) * PageSize\n );\n\n return (\n \n \n {api.user.canEdit() && }\n \n \n \n \n \n );\n }\n\n renderContent() {\n return (\n x.id === 'persons') ? 'persons' : 'events'}\n tabs={this.state.tabs}\n storeKey='viewMilitary'\n />\n );\n }\n}\n","import React from 'react';\nimport Autocomplete from 'react-autocomplete';\nimport {\n IMilitaryEntity,\n MilitaryEntity,\n MilitaryEntityType\n} from '../../models/MilitaryEntity';\nimport api from '../../api';\nimport { useElementID } from '../../utils/ElementID';\nimport { T } from '../../Translate';\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface MilitaryEntityInputProps extends MilitaryEntityInputComponentProps {\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n error?: string;\n}\n\nexport const MilitaryEntityInput = (props: MilitaryEntityInputProps) => {\n const {\n types,\n onSelected,\n value,\n\n labelColumns = 4,\n inputColumns,\n label,\n error\n } = props;\n const id = useElementID('meinput');\n\n return (\n
\n \n
\n \n {error && }\n
\n
\n );\n}\n\ninterface MilitaryEntityInputComponentProps {\n types: MilitaryEntityType[];\n value: IMilitaryEntity|undefined;\n onSelected: (value: IMilitaryEntity) => void;\n invalid?: boolean;\n}\ninterface MilitaryEntityInputComponentState {\n options: MilitaryEntity[],\n value: string;\n modal: null | JSX.Element;\n}\n\nexport class MilitaryEntityInputComponent extends React.PureComponent {\n requestTimer?: NodeJS.Timer;\n\n constructor(props: MilitaryEntityInputComponentProps) {\n super(props);\n\n this.state = {\n options: [],\n value: props.value ? new MilitaryEntity(props.value).name : '',\n modal: null\n };\n }\n\n componentWillReceiveProps(newProps: MilitaryEntityInputComponentProps) {\n if (newProps.types !== this.props.types)\n this.scheduleSearch(newProps.types, this.state.value);\n }\n\n componentDidUpdate(oldProps: MilitaryEntityInputComponentProps) {\n if (this.props.value && this.props.value !== oldProps.value)\n this.setState({ value: new MilitaryEntity(this.props.value).name });\n }\n\n handleValueChanged = (e: React.SyntheticEvent) => {\n let value = e.currentTarget.value;\n // is this a valid uuid?\n let match = value.match(/.*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})/);\n if (match) {\n this.setState({ options: [] });\n api.getMilitaryEntity(match[1])\n .then(result => {\n if (match && result)\n this.handleSelected(match[1], new MilitaryEntity(result));\n });\n } else {\n this.scheduleSearch(this.props.types, value);\n }\n\n this.setState({ value });\n }\n\n handleSelected = (value: string, item: MilitaryEntity) => {\n this.props.onSelected(item.entity);\n\n this.setState({\n value: '',\n options: []\n });\n }\n\n scheduleSearch(types: MilitaryEntityType[], value: string) {\n if (this.requestTimer) {\n clearTimeout(this.requestTimer);\n this.requestTimer = undefined;\n }\n\n if (!value) {\n this.setState({ options: [] });\n } else {\n this.requestTimer = setTimeout(() => this.searchReferences(types), 500);\n }\n }\n\n searchReferences(types: MilitaryEntityType[]) {\n this.requestTimer = undefined;\n api.findMilitaryEntities({ type: { '$in': types } }, this.state.value, 0, 10)\n .then(entities => this.setState({\n options: entities.data.map(entity => new MilitaryEntity(entity))\n }));\n }\n\n render() {\n const { options, value } = this.state;\n const { invalid = false } = this.props;\n return <>\n item.name}\n items={options.length === 0 ? [undefined] : options}\n menuStyle={{ padding: '0.25em', position: 'fixed', background: 'white', border: '1px solid #ccc', zIndex: 100 }}\n renderItem={(item: MilitaryEntity|undefined, isHighlighted: boolean) =>\n item === undefined ? (\n
{\n value.length === 0\n ? T('component.search.typeToSearch')\n : (this.requestTimer ? T('component.search.searching') : T('component.search.noResults'))\n }
\n ) : (\n
\n {item.name}\n
\n )\n }\n value={value}\n onChange={this.handleValueChanged}\n onSelect={this.handleSelected}\n />\n {this.state.modal}\n ;\n }\n}\n","import React, { useState, useMemo } from 'react';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { IMilitaryEntityStructureEvent, MilitaryEntityType } from '../../models/MilitaryEntity';\nimport { emptyDate, DateInput, inputDateToSortable, parseInputDateFromSortable } from '../../components/inputs/DateInput';\nimport { Modal, Form, Button } from 'react-bootstrap';\nimport { SelectInput, ISelectOption } from '../../components/inputs/SelectInput';\nimport { T } from '../../Translate';\nimport { MilitaryEntityInput } from '../../components/inputs/MilitaryEntityInput';\nimport api from '../../api';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { ModalHeader } from '../../modals/ModalHeader';\nimport { useStateWithError } from '../../utils/Functional';\n\ninterface EditStructureEventModalProps extends ModalProps {\n index?: number;\n militaryEntityId?: string;\n event?: IMilitaryEntityStructureEvent;\n}\n\nconst SelectableTypes = [MilitaryEntityType.Division, MilitaryEntityType.Brigade, MilitaryEntityType.Regiment];\n\nexport const EditStructureEventModal = (props: EditStructureEventModalProps) => {\n const { index, militaryEntityId, event } = props;\n\n const [isOpen, resolve] = useModal(props);\n const handleClose = () => resolve(null);\n\n const typeOptions: ISelectOption[] = useMemo(() => [\n { value: 'structure', title: T('militaryEntityEventType.sub.structure') },\n { value: 'attached', title: T('militaryEntityEventType.sub.attached') }\n ], []);\n const [type, setType] = useState<'structure'|'attached'>(event ? event.type : 'structure');\n const [fromDate, setFromDate, fromDateError, setFromDateError]\n = useStateWithError(event ? parseInputDateFromSortable(event.from_date) : emptyDate());\n const [toDate, setToDate, toDateError, setToDateError]\n = useStateWithError(event ? parseInputDateFromSortable(event.to_date) : emptyDate());\n const [entity, setEntity, entityError, setEntityError]\n = useStateWithError(event ? event.entity : undefined);\n const [description, setDescription] = useState(event ? event.description : '');\n\n const handleTypeChanged = (value: string) => setType(value as 'structure'|'attached');\n\n const handleClickedSave = async () => {\n const document: IMilitaryEntityStructureEvent = {\n army: entity ? entity.army : '',\n type,\n from_date: inputDateToSortable(fromDate),\n to_date: inputDateToSortable(toDate),\n entity_id: entity ? entity._id : '',\n entity: entity,\n description\n };\n const result = await api.validateMilitaryEntityHistory(\n document,\n index ? 'update' : 'create',\n militaryEntityId,\n index\n );\n if (result.status === 'OK') {\n resolve(document);\n return;\n }\n\n const errors = result.data || {};\n setFromDateError(errors.from_date);\n setToDateError(errors.to_date);\n setEntityError(errors.entity_id || errors.army);\n }\n\n return (\n \n Gebeurtenis: militaire organisatie\n \n
\n \n \n \n \n \n \n
\n \n \n \n
\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { MilitaryTrackType, IMilitaryEntityTrackEvent, getMilitaryTrackTypeName } from '../../models/MilitaryEntity';\nimport { emptyDate, DateInput, inputDateToSortable, parseInputDateFromSortable } from '../../components/inputs/DateInput';\nimport { Modal, Form, Button } from 'react-bootstrap';\nimport { SelectInput, ISelectOption } from '../../components/inputs/SelectInput';\nimport { T } from '../../Translate';\nimport api from '../../api';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { PlaceInput } from '../../components/inputs/PlaceInput';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { ModalHeader } from '../../modals/ModalHeader';\nimport { useStateWithError } from '../../utils/Functional';\n\ninterface EditTrackEventModalProps extends ModalProps {\n index?: number;\n militaryEntityId?: string;\n event?: IMilitaryEntityTrackEvent;\n}\nconst trackTypes = [\n MilitaryTrackType.FrontierService,\n MilitaryTrackType.Support,\n MilitaryTrackType.HalfRest,\n MilitaryTrackType.Rest\n];\n\nexport const EditTrackEventModal = (props: EditTrackEventModalProps) => {\n const { index, militaryEntityId, event } = props;\n const [isOpen, resolve] = useModal(props);\n const handleClose = () => resolve(null);\n\n const typeOptions: ISelectOption[] = useMemo(() =>\n trackTypes.map(t => ({ value: t, title: getMilitaryTrackTypeName(t) })),\n []\n );\n\n const [type, setType] = useState(event ? event.track_type : MilitaryTrackType.FrontierService);\n const [fromDate, setFromDate, fromDateError, setFromDateError]\n = useStateWithError(event ? parseInputDateFromSortable(event.from_date) : emptyDate());\n const [toDate, setToDate, toDateError, setToDateError]\n = useStateWithError(event ? parseInputDateFromSortable(event.to_date) : emptyDate());\n const [place, setPlace, placeError, setPlaceError]\n = useStateWithError(event ? event.place : undefined);\n const [topo, setTopo, topoError, setTopoError]\n = useStateWithError(event ? event.topo || '' : '');\n const [description, setDescription] = useState(event ? event.description : '');\n\n const handleTypeChanged = (value: string) => setType(value as MilitaryTrackType);\n\n const handleClickedSave = async () => {\n const document: IMilitaryEntityTrackEvent = {\n type: 'track',\n track_type: type,\n from_date: inputDateToSortable(fromDate),\n to_date: inputDateToSortable(toDate),\n place_id: place ? place._id : undefined,\n place: place,\n topo,\n description\n };\n const result = await api.validateMilitaryEntityHistory(\n document,\n index ? 'update' : 'create',\n militaryEntityId,\n index\n );\n if (result.status === 'OK') {\n resolve(document);\n return;\n }\n\n const errors = result.data || {};\n setFromDateError(errors.from_date);\n setToDateError(errors.to_date);\n setPlaceError(errors.place_id);\n setTopoError(errors.topo);\n };\n\n return (\n \n {T('page.militaryEntity.editTrackEvent.title')}\n \n
\n \n \n \n \n \n \n \n
\n \n \n \n
\n );\n}\n","import React from 'react';\nimport {\n IMilitaryEntityStructureEvent,\n MilitaryEntityEvent,\n IMilitaryEntityTrackEvent\n} from '../../models/MilitaryEntity';\nimport api from '../../api';\nimport { T } from '../../Translate';\nimport { EditStructureEventModal } from './EditStructureEventModal';\nimport { MilitaryEntityEventView } from './MilitaryEntityEventView';\nimport { EditTrackEventModal } from './EditTrackEventModal';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { NotificationManager } from 'react-notifications';\nimport { useModalContext } from '../../modals/ModalContext';\n\ninterface MilitaryEventEditorProps {\n militaryEntityId?: string;\n index: number;\n events: MilitaryEntityEvent[];\n setEvents: (events: MilitaryEntityEvent[]) => void;\n}\nexport const MilitaryEventEditor = (props: MilitaryEventEditorProps) => {\n const { militaryEntityId, index, events, setEvents } = props;\n const modals = useModalContext();\n\n const updateEvent = async (index: number, event: MilitaryEntityEvent) => {\n const newEvents = [...events];\n newEvents[index] = event;\n if (militaryEntityId) {\n const updatedEntity = await api.updateMilitaryEntity({\n _id: militaryEntityId,\n history: newEvents\n });\n NotificationManager.success(T('page.militaryEntity.event.updated'));\n setEvents(updatedEntity.history || []);\n } else {\n setEvents(newEvents);\n }\n };\n \n const handleClickedEditEvent = async (event: MilitaryEntityEvent) => {\n const index = events.findIndex(x => x === event);\n if (index < 0)\n return;\n \n if (event.type === 'track') {\n const newEvent = await modals.show(props => (\n \n ));\n if (newEvent)\n updateEvent(index, newEvent);\n } else {\n const newEvent = await modals.show(props => (\n \n ));\n if (newEvent)\n updateEvent(index, newEvent);\n }\n };\n\n const handleClickedRemoveEvent = async (event: MilitaryEntityEvent) => {\n const confirmed = await modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n \n const index = events.indexOf(event);\n if (index < 0)\n return;\n \n const newEvents = events.filter((x, i) => i !== index);\n if (militaryEntityId) {\n await api.updateMilitaryEntity({\n _id: militaryEntityId,\n history: newEvents\n });\n NotificationManager.success(T('page.militaryEntity.removeEvent.done'));\n }\n setEvents(newEvents);\n };\n\n return (\n \n );\n}\n","import React, { useMemo, useState, useEffect, useCallback } from 'react';\nimport { PageProps, Page } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport { FormCard } from '../../components/FormCard';\nimport { Button } from 'react-bootstrap';\nimport {\n MilitaryEntityType,\n getMilitaryEntityTypeName,\n Armies,\n MilitaryEntity,\n IMilitaryEntityFields,\n IMilitaryEntityStructureEvent,\n MilitaryEntityEvent,\n IMilitaryEntityTrackEvent,\n IMilitaryEntity\n} from '../../models/MilitaryEntity';\nimport api from '../../api';\nimport { TopTab, TopTabs } from '../../components/TopTabs';\nimport { T } from '../../Translate';\nimport { getErrorDescription } from '../../models/ValidationResult';\nimport styles from './index.module.scss';\nimport { EditStructureEventModal } from './EditStructureEventModal';\nimport { EditTrackEventModal } from './EditTrackEventModal';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { NotificationManager } from 'react-notifications';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { useMilitaryEntity, useNumberOfRelatedDocuments } from '../../FunctionalAPI';\nimport { MilitaryEntityFormState, MilitaryEntityForm } from './MilitaryEntityForm';\nimport { MilitaryEventEditor } from './MilitaryEventEditor';\nimport { PageID, getPageVia, getPageLink } from '../../utils/PageLinking';\nimport ListDocumentsTab from \"../ViewPlace/ListDocumentsTab\";\n\ninterface EditMilitaryEntityPageProps extends PageProps {\n id?: string;\n}\n\nconst EmptyFormState: MilitaryEntityFormState = {\n type: MilitaryEntityType.Unit,\n regiment: '',\n regimentError: undefined,\n unitNr: '',\n unitNrError: undefined,\n unit: '',\n unitError: undefined,\n brigade: '',\n brigadeError: undefined,\n division: '',\n divisionError: undefined,\n army: Armies[0],\n armyError: undefined\n};\n\nfunction getFormStateFromMilitaryEntity(entity: IMilitaryEntity) {\n return {\n type: entity.type,\n regiment: entity.regiment || '',\n regimentError: undefined,\n unitNr: entity.unit_nr || '',\n unitNrError: undefined,\n unit: entity.unit || '',\n unitError: undefined,\n brigade: entity.brigade || '',\n brigadeError: undefined,\n division: entity.division || '',\n divisionError: undefined,\n army: entity.army || Armies[0],\n armyError: undefined\n };\n}\n\nconst LoadOptions: ('history.place'|'history.entity')[] = ['history.place', 'history.entity'];\n\nexport default (props: EditMilitaryEntityPageProps) => {\n const { id, loading, via, history } = props;\n\n const modals = useModalContext();\n\n const entity = useMilitaryEntity(loading, id, LoadOptions);\n const [formState, setFormState] = useState(EmptyFormState);\n const [events, setEvents] = useState([]);\n\n const numberOfDocuments= useNumberOfRelatedDocuments('military_entity', entity?._id )\n\n\n const eventViews = useMemo(() => {\n return events.map((_, index) => (\n \n ));\n }, [events, id]);\n\n const updateFormState = useCallback((updates: Partial) => {\n setFormState(formState => Object.assign({}, formState, updates));\n }, []);\n\n const clear = useCallback(() => {\n updateFormState(EmptyFormState);\n }, [updateFormState]); // satisfying linter here\n\n useEffect(() => {\n if (entity) {\n updateFormState(getFormStateFromMilitaryEntity(entity));\n setEvents(entity.history || []);\n } else {\n clear();\n }\n }, [entity, clear, updateFormState]);\n\n const addEvent = async (event: MilitaryEntityEvent) => {\n const newEvents = [...events, event];\n if (id) {\n const entity = await api.updateMilitaryEntity({\n _id: id,\n history: newEvents\n });\n NotificationManager.success(T('page.militaryEntity.event.created'));\n setEvents(entity.history || []);\n } else {\n setEvents(newEvents);\n }\n };\n\n const renderInfoTab = () => {\n return <>\n \n \n \n \n \n \n \n ;\n };\n\n const renderEventsTab = () => {\n return (\n
\n
\n \n {T('page.militaryEntity.event.add')}:\n \n \n \n
\n {eventViews}\n
\n );\n };\n\n const renderDocumentsTab = () => {\n if (!entity)\n return (<>)\n else {\n return (\n \n );\n }\n };\n\n const mytabs: TopTab[] = [\n {\n id: 'info',\n icon: Icon.Info,\n title: T('page.militaryEntity.event.entity'),\n badgeContent: () => '',\n content: renderInfoTab\n },\n {\n id: 'events',\n icon: Icon.ListUl,\n title: T('page.militaryEntity.tab.events'),\n badgeContent: () => events.length.toString(),\n content: renderEventsTab\n },\n {\n id: 'documents',\n icon: Icon.ListUl,\n title: T('page.place.tab.documents'),\n badgeContent: () => numberOfDocuments.toString(),\n content: renderDocumentsTab\n }\n ];\n\n const handleClickedAddStructureEvent = async () => {\n const event = await modals.show(props => (\n \n ));\n if (event)\n addEvent(event);\n };\n\n const handleClickedAddRouteEvent = async () => {\n if (!id)\n return;\n\n const event = await modals.show(props => (\n \n ));\n if (event)\n addEvent(event);\n };\n\n const handleClickedSave = async (): Promise => {\n const {\n type,\n regiment,\n unitNr,\n unit,\n brigade,\n division,\n army\n } = formState;\n\n const fields: IMilitaryEntityFields & { _id?: string } = {\n _id: id,\n type,\n army\n };\n switch (type) {\n case MilitaryEntityType.Brigade:\n fields.brigade = brigade;\n break;\n case MilitaryEntityType.Division:\n fields.division = division;\n break;\n case MilitaryEntityType.Unit:\n fields.unit_nr = unitNr;\n fields.unit = unit;\n fields.regiment = regiment;\n break;\n case MilitaryEntityType.Regiment:\n fields.regiment = regiment;\n break;\n }\n const result = await api.validateMilitaryEntity(fields, id ? 'update' : 'create');\n const errors = result.data || {};\n updateFormState({\n regimentError: getErrorDescription(errors.regiment),\n unitError: getErrorDescription(errors.unit),\n unitNrError: getErrorDescription(errors.unit_nr),\n brigadeError: getErrorDescription(errors.brigade),\n divisionError: getErrorDescription(errors.division),\n armyError: getErrorDescription(errors.army)\n });\n\n if (result.status === 'OK') {\n if (id) {\n await api.updateMilitaryEntity(Object.assign({ _id: id }, fields));\n NotificationManager.success(T('page.militaryEntity.updated'));\n } else {\n fields.history = events;\n const entity = await api.createMilitaryEntity(fields);\n NotificationManager.success(T('page.militaryEntity.created'));\n history.push(getPageLink(PageID.EditMilitaryEntity, entity._id));\n }\n return true;\n }\n\n return false;\n };\n\n const handleClickedSaveAndClear = () => {\n handleClickedSave().then(success => {\n if (!success)\n return;\n\n if (id === undefined) {\n clear();\n } else {\n history.push('/military_entities/create');\n }\n });\n };\n\n const entityTitle = entity\n ? getMilitaryEntityTypeName(entity.type) + ': ' + new MilitaryEntity(entity).name\n : '...';\n const title = id ? entityTitle : T('page.militaryEntity.title.create');\n\n return (\n \n \n \n );\n}\n","import React, { CSSProperties, useRef } from 'react';\nimport moment from 'moment';\nimport { InvalidFeedback } from './InvalidFeedback';\nimport { useElementID } from '../../utils/ElementID';\n\nexport const emptyDateTime = () => ({ day: '', month: '', year: '', hour: '', minute: '' });\n\nexport const currentDateTime = (): DateTimeInputValue => {\n const now = moment();\n\n const result = {\n day: now.date().toString(),\n month: (now.month()+1).toString(), // month is in 0..11\n year: now.year().toString(),\n hour: now.hour().toString(),\n minute: now.minute().toString()\n };\n\n return result\n};\n\nexport function inputDateTimeToISO(value: DateTimeInputValue): string|undefined {\n const { day, month, year, hour, minute } = value;\n if (!/^[0-9]{1,2}$/.test(day))\n return undefined;\n if (!/^[0-9]{1,2}$/.test(month))\n return undefined;\n if (!/^[0-9]{4}$/.test(year))\n return undefined;\n if (!/^[0-9]{1,2}$/.test(hour))\n return undefined;\n if (!/^[0-9]{1,2}$/.test(minute))\n return undefined;\n\n const isoString = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}T${hour.padStart(2, '0')}:${minute.padStart(2, '0')}:00`;\n\n // make sure the iso string is valid\n const momentISOString = moment(isoString);\n if (!momentISOString.isValid()) {\n return undefined;\n }\n\n return isoString\n}\n\nexport function inputDateTimeFromISO(value: string): DateTimeInputValue {\n const date = moment(value);\n return {\n year: date.year().toString(),\n month: (date.month() +1).toString(), // month is in 0..11\n day: date.date().toString(),\n hour: date.hour().toString(),\n minute: date.minute().toString()\n };\n}\n\nexport interface DateTimeInputValue {\n day: string;\n month: string;\n year: string;\n hour: string;\n minute: string;\n}\n\ninterface DateTimeInputProps {\n name: string;\n label: string;\n value: DateTimeInputValue;\n onChange: (date: DateTimeInputValue) => void;\n style?: CSSProperties;\n\n labelColumns?: number;\n error?: string;\n readOnly?: boolean;\n validated?: boolean;\n}\nexport const DateTimeInput = (props: DateTimeInputProps) => {\n const {\n name,\n labelColumns = 4,\n label,\n value,\n error,\n readOnly,\n validated,\n onChange,\n style\n } = props;\n\n const smallWidthInputStyle = {\n width: 52,\n marginRight: 4\n }\n\n const largeWidthInputStyle = {\n width: 68,\n marginRight: 10\n }\n\n const monthRef = useRef(null);\n const yearRef = useRef(null);\n const hourRef = useRef(null);\n const minuteRef = useRef(null);\n\n const handleDayChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 2)\n return;\n\n onChange(Object.assign({}, value, { day: v }));\n\n const monthElement = monthRef.current;\n if (v.length === 2 && monthElement)\n monthElement.focus();\n };\n\n const handleMonthChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 2)\n return;\n\n onChange(Object.assign({}, value, { month: v }));\n\n const yearElement = yearRef.current;\n if (v.length === 2 && yearElement)\n yearElement.focus();\n };\n\n const handleYearChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 4)\n return;\n\n onChange(Object.assign({}, value, { year: v }));\n\n const hourElement = hourRef.current;\n if (v.length === 4 && hourElement)\n hourElement.focus();\n };\n\n const handleHourChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 2)\n return;\n\n onChange(Object.assign({}, value, { hour: v }));\n\n const minuteElement = minuteRef.current;\n if (v.length === 2 && minuteElement)\n minuteElement.focus();\n }\n\n const handleMinuteChanged = (e: React.SyntheticEvent) => {\n const v = e.currentTarget.value;\n if (v.length > 2)\n return;\n\n onChange(Object.assign({}, value, { minute: v }));\n }\n\n const id = useElementID('dateInput');\n const inputClass = readOnly ? 'form-control-plaintext' : (error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control'));\n return (\n
\n \n
\n
\n \n \n \n \n \n
\n {error && }\n
\n
\n );\n};\n","import React, { useMemo } from 'react';\nimport { useElementID } from '../../utils/ElementID';\nimport { Button } from 'react-bootstrap';\nimport { Icon } from '../../components/Icons';\nimport { ISelectOption } from '../../components/inputs/SelectInput';\n\ninterface SelectInputProps {\n options: ISelectOption[];\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n value: string;\n\n onChange: (e: React.SyntheticEvent) => void;\n onClickedAdd: () => void;\n}\n\nexport const SpecialFunctionTypeSelector = (props: SelectInputProps) => {\n const {\n labelColumns = 4,\n inputColumns,\n label,\n value,\n onClickedAdd,\n options,\n onChange,\n } = props;\n\n const id = useElementID('input');\n const renderedOptions = useMemo(\n () => options.map(option => (\n \n )), [options]);\n return (\n
\n \n
\n
\n {renderedOptions}\n \n
\n
\n
\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport {\n IBasicSpecialFunctionInput,\n IRepeatableSpecialFunctionInput,\n ISelectSpecialFunctionInput,\n ISpecialFunctionDateArgument,\n ISpecialFunctionDateTimeArgument,\n ISpecialFunctionRepeatableArgument,\n ISpecialFunctionTextArgument,\n ITextSpecialFunctionInput,\n SpecialFunctionArgument,\n SpecialFunctionInput,\n TextMode,\n ValidationErrors\n} from '../../models/SpecialFunction';\nimport { CheckboxInput } from '../../components/inputs/CheckboxInput';\nimport { ISelectOption, SelectInput } from '../../components/inputs/SelectInput';\nimport { COUNTRY_SELECT_OPTIONS } from '../../Countries';\nimport { DateInput, DateInputValue, emptyDate } from '../../components/inputs/DateInput';\nimport { DateTimeInput, DateTimeInputValue, emptyDateTime } from '../../components/inputs/DateTimeInput';\nimport { T, TranslationKey } from '../../Translate';\nimport { SpecialFunctionTypeSelector } from './SpecialFunctionTypeSelector';\nimport { getErrorDescription, ValidationError } from '../../models/ValidationResult';\nimport { useElementID } from '../../utils/ElementID';\nimport { PlaceInputComponent } from '../../components/inputs/PlaceInput';\nimport { Place } from '../../models/Place';\nimport { IMemorial } from '../../models/Memorial';\nimport { MemorialInputComponent } from '../../components/inputs/MemorialInput';\nimport { Icon } from '../../components/Icons';\n\nconst nameTranslations: { [key: string]: TranslationKey } = {\n limit: \"specialFunctions.params.limit\",\n firstName: \"specialFunctions.params.firstName\",\n lastName: \"specialFunctions.params.lastName\",\n firstNameAlt: \"specialFunctions.params.firstNameAlt\",\n lastNameAlt: \"specialFunctions.params.lastNameAlt\",\n bornFrom: \"specialFunctions.params.bornFrom\",\n bornTo: \"specialFunctions.params.bornTo\",\n diedFrom: \"specialFunctions.params.diedFrom\",\n diedTo: \"specialFunctions.params.diedTo\",\n from: \"specialFunctions.params.from\",\n to: \"specialFunctions.params.to\",\n user: \"specialFunctions.params.user\",\n collection: \"specialFunctions.params.collection\",\n place: \"specialFunctions.params.place\",\n startFrom: \"specialFunctions.params.startFrom\",\n startTo: \"specialFunctions.params.startTo\",\n endFrom: \"specialFunctions.params.endFrom\",\n endTo: \"specialFunctions.params.endTo\",\n type: \"specialFunctions.params.type\",\n army: \"specialFunctions.params.army\",\n regiment: \"specialFunctions.params.regiment\",\n unit: \"specialFunctions.params.unit\",\n unit_nr: \"specialFunctions.params.unitNr\",\n victim_type: \"specialFunctions.params.victimType\",\n victim_type_details: \"specialFunctions.params.victimTypeDetails\",\n address: \"specialFunctions.params.address\",\n dateFrom: \"specialFunctions.params.dateFrom\",\n dateTo: \"specialFunctions.params.dateTo\",\n moveType: \"specialFunctions.params.moveType\",\n filters: \"specialFunctions.params.filters\",\n school: \"specialFunctions.params.school\",\n direction: \"specialFunctions.params.direction\",\n memorial: \"specialFunctions.params.memorial\",\n number: \"specialFunctions.params.number\",\n decoration: \"specialFunctions.params.decoration\",\n citation: \"specialFunctions.params.citation\",\n company: \"specialFunctions.params.company\",\n reason: \"specialFunctions.params.reason\", /*typologie van gebeurtenissen*/\n wound: \"specialFunctions.params.wound\",\n cause: \"specialFunctions.params.cause\",\n profession: \"specialFunctions.params.profession\",\n ageFrom: \"specialFunctions.params.ageFrom\",\n ageTo: \"specialFunctions.params.ageTo\",\n gender: \"specialFunctions.params.gender\",\n topo: \"specialFunctions.params.topo\",\n sub: \"specialFunctions.params.sub\",\n rank: \"specialFunctions.params.rank\",\n ref: \"specialFunctions.params.ref\",\n kind: \"specialFunctions.params.kind\",\n civilian: \"specialFunctions.params.civilian\",\n message: \"specialFunctions.params.message\",\n description: \"specialFunctions.params.description\",\n division: \"specialFunctions.params.division\",\n brigade: \"specialFunctions.params.brigade\",\n jailedType: \"specialFunctions.params.jailedType\",\n bornPlace: \"specialFunctions.params.bornPlace\",\n livingPlace: \"specialFunctions.params.livingPlace\",\n dataset: \"specialFunctions.params.dataset\",\n project: \"specialFunctions.params.project\",\n country: \"specialFunctions.params.country\",\n entityId: \"specialFunctions.params.entityId\",\n personId: \"specialFunctions.params.personId\"\n};\ninterface RepeatableTranslation {\n header: TranslationKey;\n typeHeader: TranslationKey;\n types: { [key: string]: TranslationKey };\n}\nconst repeatableTranslations: { [key: string]: RepeatableTranslation } = {\n filters: {\n header: 'specialFunctions.repeatable.filters.header',\n typeHeader: 'specialFunctions.repeatable.filters.typeHeader',\n types: {\n 'born': 'specialFunctions.repeatable.filters.type.born',\n 'injured': 'specialFunctions.repeatable.filters.type.injured',\n 'school': 'specialFunctions.repeatable.filters.type.school',\n 'memorated': 'specialFunctions.repeatable.filters.type.memorated',\n 'enlisted': 'specialFunctions.repeatable.filters.type.enlisted',\n 'decorated': 'specialFunctions.repeatable.filters.type.decorated',\n 'work': 'specialFunctions.repeatable.filters.type.work',\n 'where': 'specialFunctions.repeatable.filters.type.where',\n 'event': 'specialFunctions.repeatable.filters.type.event',\n 'died': 'specialFunctions.repeatable.filters.type.died',\n 'jailed': 'specialFunctions.repeatable.filters.type.jailed'\n }\n }\n};\ninterface RepeatableTranslated {\n header: string;\n typeHeader: string;\n types: { [key: string]: string };\n}\nfunction translateRepeatable(input: IRepeatableSpecialFunctionInput) {\n const translation = repeatableTranslations[input.name];\n if (translation) {\n const types: { [key: string]: string } = {};\n input.types.forEach(type => types[type.name] = translation.types[type.name]\n ? T(translation.types[type.name])\n : type.name);\n return {\n header: T(translation.header),\n typeHeader: T(translation.typeHeader),\n types\n };\n } else {\n const types: { [key: string]: string } = {};\n input.types.forEach(type => types[type.name] = type.name);\n\n return {\n header: input.name,\n typeHeader: input.name + ': ',\n types\n };\n }\n}\n\nconst selectInputTranslations: { [key: string]: { [key: string]: TranslationKey } } = {\n gender: {\n any: 'generic.filter.any',\n MALE: 'gender.male',\n FEMALE: 'gender.female',\n UNDEFINED: 'gender.undefined'\n },\n victim_type: {\n all: 'generic.filter.any',\n MILITARY: 'victimType.military',\n CIVILIAN: 'victimType.civilian'\n },\n victim_type_details: {\n all: 'generic.filter.any',\n UNKNOWN: 'victimSubType.unknown',\n DEPORTATED: 'victimSubType.deportated',\n EXECUTED: 'victimSubType.executed'\n },\n filters_type: {\n born: 'event.born',\n injured: 'event.injured',\n school: 'event.school',\n memorated: 'event.memorated',\n enlisted: 'event.military',\n decorated: 'event.decorated',\n work: 'event.work',\n where: 'event.where',\n event: 'page.advancedSearch.addFilter.event',\n died: 'event.died',\n jailed: 'event.jailed'\n },\n reason: {\n any: 'generic.filter.any',\n 'enlisted': 'militaryEventType.enlisted',\n 'active service': 'militaryEventType.activeService',\n 'posted to': 'militaryEventType.postedTo',\n 'attached to': 'militaryEventType.attachedTo',\n 'renumbered': 'militaryEventType.renumbered',\n 'transferred to': 'militaryEventType.transferredTo',\n 'promoted': 'militaryEventType.promoted',\n 'any active service': 'militaryEventType.anyActiveService'\n },\n moveType: {\n any: 'generic.filter.any',\n homeaddress: 'whereEventType.homeAddress',\n fugitive: 'whereEventType.fugitive',\n evacuated: 'whereEventType.evacuated',\n deportated: 'whereEventType.deportated',\n moved: 'whereEventType.moved'\n },\n kind: {\n any: 'generic.filter.any',\n none: 'memoratedKind.none',\n current: 'memoratedKind.current',\n original: 'memoratedKind.original'\n },\n military_event_type: {\n any: 'generic.filter.any',\n structure: 'militaryEntityEventType.sub.structure',\n attachment: 'militaryEntityEventType.sub.attached'\n },\n jailedType: {\n any: 'generic.filter.any',\n jailed: 'jailedType.jailed',\n captive: 'jailedType.captive'\n },\n dataset: {\n any: 'dataset.any',\n namenlijst: 'dataset.namelist',\n deaths: 'dataset.deaths',\n survivors: 'dataset.survivors',\n stories: 'dataset.stories',\n with_documentation: 'dataset.withDocumentation',\n contacts: 'dataset.contacts',\n irish_memorial_records: 'dataset.imr',\n military: 'dataset.military'\n },\n military_event_track_type: {\n frontier_service: 'militaryEntityTrackType.frontierService',\n support: 'militaryEntityTrackType.support',\n half_rest: 'militaryEntityTrackType.halfRest',\n rest: 'militaryEntityTrackType.rest'\n },\n kiosk: {\n '1': 'kiosk.1',\n '2': 'kiosk.2',\n '3': 'kiosk.3',\n '4': 'kiosk.4'\n },\n project: {\n 'any': 'generic.filter.any'\n },\n relation: {\n 'married': 'relation.married',\n 'parent': 'relation.parent',\n 'child': 'relation.child',\n 'sibling': 'relation.sibling',\n 'friend': 'relation.friend',\n 'fieldmate': 'relation.fieldmate',\n 'cousin': 'relation.cousin',\n 'other': 'relation.other',\n 'grandchild': 'relation.grandchild',\n 'grandparent': 'relation.grandparent',\n 'family': 'relation.family'\n }\n};\n\nfunction getInputLabel(input: SpecialFunctionInput) {\n return T(nameTranslations[input.name]) || input.name;\n}\n\ninterface InputProps {\n name: string;\n value?: SpecialFunctionArgument;\n onChange: (name: string, value: SpecialFunctionArgument) => void;\n errors: ValidationErrors;\n renderRepeatable?: (field: IRepeatableSpecialFunctionInput, onClickedAdd: (type: string) => void) => JSX.Element | undefined;\n}\nexport type InputClass = (props: InputProps) => JSX.Element;\n\nexport function getSpecialInputClass(input: SpecialFunctionInput): InputClass {\n switch (input.type) {\n case 'text':\n return TextFunctionInput(input as ITextSpecialFunctionInput);\n case 'checkbox':\n return CheckboxFunctionInput(input as IBasicSpecialFunctionInput);\n case 'country':\n return CountryFunctionInput(input as IBasicSpecialFunctionInput);\n case 'date':\n return DateFunctionInput(input as IBasicSpecialFunctionInput);\n case 'datetime':\n return DateTimeFunctionInput(input as IBasicSpecialFunctionInput);\n case 'location':\n return DummyInput;\n case 'select':\n return SelectFunctionInput(input as ISelectSpecialFunctionInput);\n case 'repeatable':\n return RepeatableInput(input as IRepeatableSpecialFunctionInput);\n default:\n return DummyInput;\n }\n}\n\nconst DummyInput = (props: InputProps) =>
;\n\nconst TextFunctionInput = (input: ITextSpecialFunctionInput) => {\n return (props: InputProps) => {\n const handleChange = (value: ISpecialFunctionTextArgument) =>\n props.onChange(input.name, value);\n\n return (\n \n );\n }\n}\n\ninterface TextFunctionInputComponentProps {\n input: ITextSpecialFunctionInput;\n value: ISpecialFunctionTextArgument;\n error?: string;\n onChange: (value: ISpecialFunctionTextArgument) => void;\n}\nconst TextFunctionInputComponent = (props: TextFunctionInputComponentProps) => {\n const { input, value, error, onChange } = props;\n const label = useMemo(() => getInputLabel(input), [input]);\n\n const id = useElementID('input');\n const handleModeChanged = (e: React.SyntheticEvent) => {\n onChange({ value: value.value, mode: e.currentTarget.value as TextMode });\n };\n\n return (\n
\n \n
\n \n {error &&
{error}
}\n
\n
\n {value.mode === TextMode.Selected ? (\n \n ) : (\n \n )}\n
\n
\n );\n}\n\ninterface TextFunctionInputInnerComponentProps {\n id: string;\n name: string;\n input: ITextSpecialFunctionInput;\n value: ISpecialFunctionTextArgument;\n error?: string;\n onChange: (value: ISpecialFunctionTextArgument) => void;\n}\nconst TextFunctionInputInnerComponent = (props: TextFunctionInputInnerComponentProps) => {\n const { id, name, input, value, error, onChange } = props;\n\n const inputClass = error ? 'form-control is-invalid' : 'form-control';\n const handleInputChanged = (e: React.SyntheticEvent) => {\n onChange({\n value: e.currentTarget.value,\n mode: value.mode === TextMode.Selected ? prevMode : value.mode\n });\n };\n const [place, setPlace] = useState(undefined);\n const [memorial, setMemorial] = useState(undefined);\n const [prevMode, setPrevMode] = useState(value.mode);\n\n if (input.autocomplete === 'place') {\n const handlePlaceSelected = (place: Place) => {\n setPlace(place);\n setPrevMode(value.mode);\n onChange({\n value: place.name,\n mode: TextMode.Selected,\n id: place.id\n });\n };\n return (\n onChange({ value: v, mode: value.mode })}\n style={{ width: '100%' }}\n onSelected={handlePlaceSelected}\n searchMode={value.mode}\n />\n );\n } else if (input.autocomplete === 'memorial') {\n const handleMemorialSelected = (memorial: IMemorial) => {\n setMemorial(memorial);\n setPrevMode(value.mode);\n onChange({\n value: memorial.name,\n mode: TextMode.Selected,\n id: memorial._id\n });\n };\n return (\n onChange({ value: v, mode: value.mode })}\n onSelected={handleMemorialSelected}\n searchMode={value.mode}\n />\n );\n } else {\n return (\n \n );\n }\n}\n\nconst CheckboxFunctionInput = (input: IBasicSpecialFunctionInput) => {\n const label = getInputLabel(input);\n return (props: InputProps) => {\n const onChange = (checked: boolean) => props.onChange(input.name, checked);\n return (\n \n );\n };\n};\n\nconst CountryFunctionInput = (input: IBasicSpecialFunctionInput) => {\n const label = getInputLabel(input);\n return (props: InputProps) => {\n const onChange = (value: string) => props.onChange(input.name, value);\n return (\n \n );\n };\n};\n\nconst DateFunctionInput = (input: IBasicSpecialFunctionInput) => {\n const label = getInputLabel(input);\n return (props: InputProps) => {\n const onChange = (value: DateInputValue) => props.onChange(input.name, value);\n return (\n \n );\n };\n};\n\nconst DateTimeFunctionInput = (input: IBasicSpecialFunctionInput) => {\n const label = getInputLabel(input);\n return (props: InputProps) => {\n const onChange = (value: DateTimeInputValue) => props.onChange(input.name, value);\n return (\n \n );\n };\n};\n\nfunction getSelectOptionLabel(field: string, value: string) {\n const key: TranslationKey|undefined = (selectInputTranslations[field] || {})[value];\n return key ? T(key) : value;\n}\nconst SelectFunctionInput = (input: ISelectSpecialFunctionInput) => {\n const label = getInputLabel(input);\n const titles = input.titles || {};\n const options = input.options.map(option => (\n \n ));\n return (props: InputProps) => {\n const onChange = (value: string) => props.onChange(input.name, value);\n return (\n \n );\n }\n}\n\nconst RepeatableInput = (input: IRepeatableSpecialFunctionInput) => {\n const translated = translateRepeatable(input);\n const typeOptions = input.types.map(type => ({ value: type.name, title: type.name }));\n return (props: InputProps) => (\n \n );\n}\n\ninterface RepeatableInputComponentProps {\n translation: RepeatableTranslated;\n input: IRepeatableSpecialFunctionInput;\n value: ISpecialFunctionRepeatableArgument[];\n typeOptions: ISelectOption[];\n errors: ValidationErrors[];\n onChange: (name: string, value: ISpecialFunctionRepeatableArgument[]) => void;\n renderRepeatable?: (field: IRepeatableSpecialFunctionInput, onClickedAdd: (type: string) => void) => JSX.Element | undefined;\n}\nconst RepeatableInputComponent = (props: RepeatableInputComponentProps) => {\n const { translation, input, value, typeOptions, onChange, errors, renderRepeatable } = props;\n\n const handleParameterChanged = (index: number, name: string, val: SpecialFunctionArgument) => {\n const element = value[index];\n const newInputs = Object.assign({}, element.inputs, { [name]: val });\n const newElement = { type: element.type, inputs: newInputs };\n const newValue = value.map((x, i) => i === index ? newElement : x);\n onChange(input.name, newValue);\n };\n const [type, setType] = useState(typeOptions[0].value);\n const handleTypeChanged = (e: React.SyntheticEvent) => {\n setType(e.currentTarget.value);\n };\n const handleClickedAdd = () => {\n const newValue = [...value, { type, inputs: {} }];\n onChange(input.name, newValue);\n };\n const handleClickedAdd2 = (type: string) => {\n const newValue = [...value, { type, inputs: {} }];\n onChange(input.name, newValue);\n }\n const handleDelete = (index: number) => {\n const newValue = value.filter((x, i) => i !== index);\n onChange(input.name, newValue);\n }\n return <>\n {value.map((value, index) => (\n \n ))}\n

{translation.header}

\n {(renderRepeatable && renderRepeatable(input, handleClickedAdd2)) || (\n \n )}\n ;\n}\n\ninterface RepeatableInputGroupProps {\n header: string;\n input: IRepeatableSpecialFunctionInput;\n value: ISpecialFunctionRepeatableArgument;\n errors: ValidationErrors;\n index: number;\n onChange: (index: number, parameter: string, value: SpecialFunctionArgument) => void;\n onDelete: (index: number) => void;\n}\nconst RepeatableInputGroup = (props: RepeatableInputGroupProps) => {\n const { header, input, value, index, onChange, onDelete, errors } = props;\n const type = value.type;\n\n const inputs: [SpecialFunctionInput, InputClass][] = useMemo(() => {\n const typeObject = input.types.find(t => t.name === type);\n if (!typeObject)\n return [];\n\n return typeObject.inputs.map(i => [i, getSpecialInputClass(i)]);\n }, [input, type]);\n const handleChange = (name: string, value: SpecialFunctionArgument) => {\n onChange(index, name, value);\n };\n const handleDelete = () => onDelete(index);\n return
\n

{header}

\n
\n {inputs.map(([input, Input]) => (\n \n ))}\n
\n
;\n}\n","import React, { useMemo } from 'react';\nimport { SpecialFunctionArguments, ISpecialFunction, ValidationErrors, SpecialFunctionArgument, SpecialFunctionInput, IRepeatableSpecialFunctionInput } from '../../models/SpecialFunction';\nimport { getSpecialInputClass, InputClass } from './SpecialFunctionInput';\n\ninterface SpecialFunctionFormProps {\n args: SpecialFunctionArguments;\n func: ISpecialFunction;\n errors: ValidationErrors;\n onArgumentsChange: (args: SpecialFunctionArguments) => void;\n renderRepeatable?: (field: IRepeatableSpecialFunctionInput, onClickedAdd: (type: string) => void) => JSX.Element|undefined;\n}\n\nexport const SpecialFunctionForm = (props: SpecialFunctionFormProps) => {\n const { args, func, errors, onArgumentsChange, renderRepeatable } = props;\n const inputs: [SpecialFunctionInput, InputClass][] = useMemo(\n () => func.inputs.map(input => [input, getSpecialInputClass(input)]),\n [func]\n );\n const handleParameterChanged = (name: string, value: SpecialFunctionArgument) => {\n const newArguments = Object.assign({}, args, { [name]: value });\n onArgumentsChange(newArguments);\n };\n return (\n
\n {inputs.map(([input, Input]) => (\n \n ))}\n
\n );\n}\n","import React from 'react';\nimport moment from 'moment';\nimport { ITableColumn, IColumnOptions, DefaultColumnOptions, ICellProps } from \"../../components/table/Fields\";\n\nexport class TimestampTableColumn implements ITableColumn {\n id: string;\n title: string;\n getter: (item: T) => string;\n options: IColumnOptions;\n\n constructor(\n id: string,\n title: string,\n getter: (item: T) => string,\n options?: Partial\n ) {\n this.id = id;\n this.title = title;\n this.getter = getter;\n this.options = Object.assign({}, DefaultColumnOptions, options);\n }\n\n render(item: T, props: ICellProps): JSX.Element {\n const value = this.getter(item);\n return {value === undefined ? 'N/A' : value};\n }\n\n _parseTimestamp(item: T) {\n const value = this.getter(item);\n return moment(value, 'DD-MM-YY HH:mm').unix();\n }\n\n sort = (a: T, b: T): number => {\n return this._parseTimestamp(a) - this._parseTimestamp(b);\n }\n}\n","import React, { useMemo, useState } from 'react';\nimport { History } from 'history';\nimport { ISpecialFunctionTableResult, SpecialFunctionTableItem } from '../../models/SpecialFunction';\nimport { Table, sortItems, SortDirection } from '../../components/table/Table';\nimport { StringTableColumn, ActionsTableColumn, ITableColumn, IColumnOptions, ICellProps, DefaultColumnOptions, ComponentTableColumn } from '../../components/table/Fields';\nimport { T, Noun, TranslationKey } from '../../Translate';\nimport { Icon } from '../../components/Icons';\nimport { TimestampTableColumn } from './TimestampTableColumn';\nimport { Checkbox } from '../../components/inputs/CheckboxInput';\nimport { PageID } from '../../utils/PageLinking';\nimport styles from '../../components/table/Table.module.scss';\nimport { classes } from '../../utils/Styles';\nimport { translateVictimType, translateWarCasualty, VictimType } from '../../models/Person';\n\nconst ColumnTitles: {[key: string]: TranslationKey} = {\n FIRST_NAME: 'person.firstName',\n FAMILY_NAME: 'person.lastName',\n BORN: 'person.born',\n DIED: 'person.died',\n VICTIM_TYPE: 'person.type',\n TITLE: 'document.title',\n NAME: 'memorial.name',\n TYPE: 'memorial.type'\n};\nfunction getColumnTitle(title: string): string {\n const translationKey = ColumnTitles[title];\n return translationKey ? T(translationKey) : title;\n}\n\ninterface SpecialFunctionResultTableProps {\n result: ISpecialFunctionTableResult;\n history: History;\n selection: string[];\n onSelected: (id: string, selected: boolean) => void;\n}\n\nfunction getNoun(result: ISpecialFunctionTableResult): Noun {\n switch (result.elementType) {\n case 'person':\n return 'person';\n case 'place':\n return 'place';\n case 'memorial':\n return 'memorial';\n case 'personStory':\n return 'personStory';\n default:\n return 'result';\n }\n}\n\nclass SelectColumn implements ITableColumn {\n id: string;\n title: string;\n options: IColumnOptions;\n onSelected: (id: string, selected: boolean) => void;\n\n public constructor(onSelected: (id: string, selected: boolean) => void) {\n this.id = 'selected';\n this.title = 'X';\n this.options = DefaultColumnOptions;\n this.onSelected = onSelected;\n }\n\n render(item: SpecialFunctionTableItem, props: ICellProps, state: string[]): JSX.Element {\n const id = item._id as string;\n const checked = state.includes(id);\n return \n this.onSelected(id, checked)} />\n \n }\n\n sort = (a: SpecialFunctionTableItem, b: SpecialFunctionTableItem) => 0;\n}\n\nexport class DateColumn implements ITableColumn {\n id: string;\n title: string;\n options: IColumnOptions;\n \n constructor(\n id: string,\n title: string,\n options?: Partial\n ) {\n this.id = id;\n this.title = title;\n this.options = Object.assign({}, DefaultColumnOptions, options);\n }\n\n getValue(item: SpecialFunctionTableItem) {\n const value = item[this.id] as { day: number, month: number, year: number};\n if (value.day === 0 && value.month === 0 && value.year === 0)\n return '';\n \n const day = value.day === 0 ? '?' : value.day;\n const month = value.month === 0 ? '?' : value.month;\n const year = value.year === 0 ? '?' : value.year;\n return `${day}/${month}/${year}`;\n }\n \n render(item: SpecialFunctionTableItem, props: ICellProps): JSX.Element {\n const value = this.getValue(item);\n if (value === undefined)\n props.className = classes(styles.noValue, props.className);\n \n return {value === undefined ? 'N/A' : value};\n }\n \n sort = (a: SpecialFunctionTableItem, b: SpecialFunctionTableItem): number => {\n const valueA = a[this.id] as { day: number, month: number, year: number};\n const valueB = b[this.id] as { day: number, month: number, year: number};\n if (valueA.year !== valueB.year)\n return valueA.year - valueB.year;\n else if (valueA.month !== valueB.month)\n return valueA.month - valueB.month;\n else\n return valueA.day - valueB.day;\n }\n }\n \n\nexport const SpecialFunctionResultTable = (props: SpecialFunctionResultTableProps) => {\n const { result, history, selection, onSelected } = props;\n\n const noun = getNoun(result);\n const columns = useMemo(() => {\n const cols: ITableColumn[] = result.columns.map(column => {\n const title = getColumnTitle(column.title);\n if (column.type === 'date') {\n return new DateColumn(column.field, title);\n } else if (column.type === 'timestamp') {\n return new TimestampTableColumn(\n column.field,\n title,\n item => item[column.field] as string\n );\n } else if (column.type === 'name') {\n return new ComponentTableColumn('name', T('listPersons.column.name'), person => {\n const altFirstNames = person.firstNameAlt ? ' (' + person.firstNameAlt + ')' : '';\n const altLastNames = person.lastNameAlt ? ' (' + person.lastNameAlt + ')' : '';\n return (\n \n {person.lastName}{altLastNames}\n
\n {person.firstName}{altFirstNames}\n
\n );\n }, { sortable: true, clickable: true }, (a, b) => (a.name as string).localeCompare(b.name as string));\n } else if (column.type === 'victimType') {\n return new ComponentTableColumn(column.field, title, person => {\n const army = (person.armies as any)[0];\n return <>\n {translateVictimType(person.victimType as VictimType) + ' ' + translateWarCasualty(person.warCasualty as boolean)}\n
\n {army && `(${army}) `}{person.inNamelist ? T('person.isNamelist') : ''}\n ;\n });\n } else {\n return new StringTableColumn(\n column.field,\n title,\n item => item[column.field] as string\n );\n }\n });\n if (result.actions && result.actions.length > 0) {\n cols.push(new SelectColumn(onSelected));\n }\n switch (result.elementType) {\n case 'person':\n cols.push(new ActionsTableColumn('actions', T('generic.list.actions'), person => [\n { icon: Icon.Edit, page: PageID.EditPerson, pageParam: person._id as string }\n ]));\n break;\n case 'place':\n cols.push(new ActionsTableColumn('actions', T('generic.list.actions'), place => [\n { icon: Icon.Edit, page: PageID.EditPlace, pageParam: place._id as string }\n ]));\n break;\n case 'memorial':\n cols.push(new ActionsTableColumn('actions', T('generic.list.actions'), memorial => [\n { icon: Icon.Edit, page: PageID.EditMemorial, pageParam: memorial._id as string }\n ]));\n break;\n case 'personStory':\n cols.push(new ActionsTableColumn('actions', T('generic.list.actions'), story => [\n { icon: Icon.Edit, page: PageID.EditPersonStory, pageParam: story._id as string }\n ]));\n break;\n }\n return cols;\n }, [result]);\n\n const [page, setPage] = useState(0);\n const [sortColumn, setSortColumn] = useState(columns[0].id);\n const [sortDirection, setSortDirection] = useState(SortDirection.Up);\n const handleSortUpdated = (column: string, direction: SortDirection) => {\n setSortColumn(column);\n setSortDirection(direction);\n };\n const sortedData = useMemo(\n () => sortItems(columns, result.data, sortColumn, sortDirection),\n [result, columns, sortColumn, sortDirection]\n );\n const onClickItem = useMemo(() => {\n let itemClickHandler: ((item: SpecialFunctionTableItem) => void)|undefined = undefined;\n switch (result.elementType) {\n case 'person':\n return (item: SpecialFunctionTableItem) => history.push('/persons/' + item._id);\n case 'place':\n return (item: SpecialFunctionTableItem) => history.push('/places/' + item._id);\n case 'memorial':\n return (item: SpecialFunctionTableItem) => history.push('/memorials/' + item._id);\n }\n return itemClickHandler;\n }, [result, history, onSelected]);\n\n return (\n \n );\n}\n","import React, { useEffect, useState, useMemo } from 'react';\nimport $ from 'jquery';\nimport { BasePage, PageProps, PageState } from '../Page';\nimport {\n ISpecialFunctionCategory,\n SpecialFunctionResult,\n getSpecialFunctionCategoryName,\n ISpecialFunction,\n SpecialFunctionArguments,\n ValidationErrors,\n getDefaultArguments\n} from '../../models/SpecialFunction';\nimport { Icon } from '../../components/Icons';\nimport { T } from '../../Translate';\nimport { FormCard } from '../../components/FormCard';\nimport { Row, Col, Button } from 'react-bootstrap';\nimport api from '../../api';\nimport { MarkdownView } from '../../components/MarkdownView';\nimport { SpecialFunctionForm } from './SpecialFunctionForm';\nimport { SpecialFunctionResultTable } from './SpecialFunctionResultTable';\nimport { ButtonRow } from '../../components/ButtonRow';\nimport { PageID } from '../../utils/PageLinking';\n\ninterface ActionButtonProps {\n selection: string[];\n actions: string[];\n onExecute: (action: string) => void;\n}\n\nconst ActionButton = (props: ActionButtonProps) => {\n const { selection, actions, onExecute } = props;\n const [action, setAction] = useState('');\n useEffect(() => {\n if (actions.length > 0 && !actions.includes(action))\n setAction(actions[0]);\n }, [actions, action]);\n\n const handleExecute = () => onExecute(action);\n\n const renderedActions = useMemo(() => actions.map(action => (\n \n )), [actions]);\n\n return (\n
\n

{selection.length === 0 ? 'None' : selection.length} Selected

\n setAction(e.currentTarget.value)}\n >\n {renderedActions}\n \n \n
\n );\n}\n\ninterface SpecialFunctionsPageState extends PageState {\n categories: ISpecialFunctionCategory[];\n result?: SpecialFunctionResult;\n selectedCategory: string;\n selectedFunction?: ISpecialFunction;\n\n categoryOptions: JSX.Element[];\n functionOptions: JSX.Element[];\n args: SpecialFunctionArguments;\n errors: ValidationErrors;\n\n selection: string[];\n}\nexport default class SpecialFunctionsPage extends BasePage {\n constructor(props: PageProps) {\n super(props);\n \n this.state = {\n page: {\n id: PageID.SpecialFunctions,\n icon: Icon.Database,\n title: T('page.specialFunctions.title')\n },\n\n categories: [],\n categoryOptions: [],\n functionOptions: [],\n selectedCategory: '',\n args: {},\n errors: {},\n\n selection: []\n };\n }\n\n loadContent() {\n this.loading(api.getFunctions(), T('page.specialFunctions.functions'))\n .then(categories => {\n this.setState({\n categories,\n categoryOptions: categories.map(category => (\n \n {getSpecialFunctionCategoryName(category.category)}\n \n ))\n }, () => this.setCategory(categories[0].category));\n });\n }\n\n getCategory(): ISpecialFunctionCategory|undefined {\n const { categories, selectedCategory } = this.state;\n return categories.find(category => category.category === selectedCategory);\n }\n\n setCategory(categoryName: string) {\n const { categories } = this.state;\n const category = categories.find(c => c.category === categoryName) || categories[0];\n if (!category) // can happen if categories aren't loaded yet\n return;\n \n this.setState({\n selectedCategory: category.category,\n functionOptions: category.functions.map(fn => (\n \n ))\n });\n this.setFunction(category, category.functions[0].name);\n }\n\n setFunction(category: ISpecialFunctionCategory, functionName: string) {\n const fn = category.functions.find(f => f.name === functionName);\n this.setState({\n selectedFunction: fn,\n args: getDefaultArguments(fn),\n errors: {}\n });\n }\n\n handleCategoryChanged = (e: React.SyntheticEvent) => {\n this.setCategory(e.currentTarget.value);\n }\n\n handleFunctionChanged = (e: React.SyntheticEvent) => {\n const category = this.getCategory();\n if (!category)\n return;\n \n this.setFunction(category, e.currentTarget.value);\n }\n\n handleArgumentsChanged = (args: SpecialFunctionArguments) => {\n this.setState({ args });\n }\n\n handleClickedExecute = () => {\n const { selectedFunction, args } = this.state;\n if (!selectedFunction)\n return;\n \n api.validateFunction(selectedFunction.name, args).then(result => {\n if (result.status !== 'OK') {\n this.setState({ errors: result.data || {} });\n return;\n }\n\n this.loading(api.callFunction(selectedFunction.name, args), T('page.specialFunctions.results'))\n .then(result => this.setState({ result, selection: [] }));\n });\n }\n\n handleClickedExecuteToCSV = () => {\n const { selectedFunction, args } = this.state;\n if (!selectedFunction)\n return;\n \n api.validateFunction(selectedFunction.name, args).then(result => {\n if (result.status !== 'OK') {\n this.setState({ errors: result.data || {} });\n return;\n }\n \n var urlParams = {\n format: 'csvfile',\n method: 'callFunctionCsv',\n params: JSON.stringify({\n token: api.token,\n name: selectedFunction.name,\n arguments: args\n })\n };\n var url = api.url + '?' + $.param(urlParams);\n window.open(url, '_blank');\n });\n }\n\n handleSelected = (id: string, selected: boolean) => {\n const newSelection = selected\n ? [...this.state.selection, id]\n : this.state.selection.filter(x => x !== id);\n this.setState({ selection: newSelection });\n };\n\n handleExecuteAction = async (action: string) => {\n const { selectedFunction, selection } = this.state;\n if (!selectedFunction)\n return;\n \n await api.applyAction(selectedFunction.name, action, selection);\n this.setState({ selection: [] });\n };\n\n renderContent() {\n const { history } = this.props;\n const {\n categoryOptions,\n functionOptions,\n selectedCategory,\n selectedFunction,\n args,\n errors,\n result,\n selection\n } = this.state;\n\n return <>\n \n \n \n
{T('page.specialFunctions.category')}
\n \n {categoryOptions}\n \n \n \n
{T('page.specialFunctions.function')}
\n \n {functionOptions}\n \n \n {selectedFunction && \n \n }\n
\n \n \n {selectedFunction && (\n \n )}\n \n \n \n \n \n {result && (\n \n )\n }>\n {result.type === 'text' &&

{result.content}

}\n {result.type === 'table' && (\n \n )}\n \n )}\n ;\n }\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { Modal, Button } from 'react-bootstrap';\nimport { T, TranslationKey } from '../../Translate';\nimport { ModalHeader } from '../../modals/ModalHeader';\nimport { CheckboxInput } from '../../components/inputs/CheckboxInput';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { Icon } from '../../components/Icons';\nimport { useAppDispatch, useAppSelector } from '../../utils/Functional';\nimport { updateExportModalStateAction } from '../../redux/Actions';\n\ninterface ExportFieldModalProps extends ModalProps {\n\n}\n\ninterface FieldGroup {\n key: TranslationKey;\n fields: string[];\n}\n\nconst fields: FieldGroup[] = [\n {\n key: 'exportgroup.general',\n fields: [\n 'id',\n 'name',\n 'alternativeNames',\n 'gender',\n 'familyInfo'\n ]\n },\n {\n key: 'exportgroup.born',\n fields: [\n 'born.date',\n 'born.date.split',\n 'born.place.name',\n 'born.place.region',\n 'born.place.country',\n 'born.place.position',\n 'born.topo',\n 'born.notes'\n ]\n },\n {\n key: 'exportgroup.school',\n fields: [\n 'school.date',\n 'school.date.split',\n 'school.place.name',\n 'where.place.region',\n 'school.place.country',\n 'school.place.position',\n 'school.topo',\n 'school.notes',\n 'school.name',\n 'school.direction'\n ]\n },\n {\n key: 'exportgroup.work',\n fields: [\n 'work.date',\n 'work.date.split',\n 'work.place.name',\n 'work.place.region',\n 'work.place.country',\n 'work.place.position',\n 'work.topo',\n 'work.notes',\n 'work.companyName',\n 'work.profession'\n ]\n },\n {\n key: 'exportgroup.where',\n fields: [\n 'where.date',\n 'where.date.split',\n 'where.place.name',\n 'where.place.region',\n 'where.place.country',\n 'where.place.position',\n 'where.topo',\n 'where.notes',\n 'where.placeType'\n ]\n },\n {\n key: 'exportgroup.where.homeaddress',\n fields: [\n 'where.homeaddress.date',\n 'where.homeaddress.date.split',\n 'where.homeaddress.place.name',\n 'where.homeaddress.place.region',\n 'where.homeaddress.place.country',\n 'where.homeaddress.place.position',\n 'where.homeaddress.topo',\n 'where.homeaddress.notes',\n 'where.homeaddress.placeType'\n ]\n },\n {\n key: 'exportgroup.where.evacuate',\n fields: [\n 'where.evacuate.date',\n 'where.evacuate.date.split',\n 'where.evacuate.place.name',\n 'where.evacuate.place.region',\n 'where.evacuate.place.country',\n 'where.evacuate.place.position',\n 'where.evacuate.topo',\n 'where.evacuate.notes',\n 'where.evacuate.placeType'\n ]\n },\n {\n key: 'exportgroup.military.enlisted',\n fields: [\n 'enlisted.date',\n 'enlisted.date.split',\n 'enlisted.place.name',\n 'enlisted.place.region',\n 'enlisted.place.country',\n 'enlisted.place.position',\n 'enlisted.topo',\n 'enlisted.army',\n 'enlisted.regiment',\n 'enlisted.unit',\n 'enlisted.unitType',\n 'enlisted.unitNr',\n 'enlisted.sub',\n 'enlisted.serviceNumber',\n 'enlisted.rank',\n 'enlisted.notes'\n ]\n },\n {\n key: 'exportgroup.military.service',\n fields: [\n 'activeService.date',\n 'activeService.date.split',\n 'activeService.place.name',\n 'activeService.place.region',\n 'activeService.place.country',\n 'activeService.place.position',\n 'activeService.topo',\n 'activeService.army',\n 'activeService.regiment',\n 'activeService.unit',\n 'activeService.unitType',\n 'activeService.unitNr',\n 'activeService.sub',\n 'activeService.serviceNumber',\n 'activeService.rank',\n 'activeService.notes'\n ]\n },\n {\n key: 'exportgroup.military.other',\n fields: [\n 'militaryOther.date',\n 'militaryOther.date.split',\n 'militaryOther.type',\n 'militaryOther.place.name',\n 'militaryOther.place.region',\n 'militaryOther.place.country',\n 'militaryOther.place.position',\n 'militaryOther.topo',\n 'militaryOther.army',\n 'militaryOther.regiment',\n 'militaryOther.unit',\n 'militaryOther.unitType',\n 'militaryOther.unitNr',\n 'militaryOther.sub',\n 'militaryOther.serviceNumber',\n 'militaryOther.rank',\n 'militaryOther.notes'\n ]\n },\n {\n key: 'exportgroup.injured',\n fields: [\n 'injured.date',\n 'injured.date.split',\n 'injured.place.name',\n 'injured.place.region',\n 'injured.place.country',\n 'injured.place.position',\n 'injured.topo',\n 'injured.wound',\n 'injured.cause',\n 'injured.notes'\n ]\n },\n {\n key: 'exportgroup.hospitalized',\n fields: [\n 'hospitalized.date',\n 'hospitalized.date.split',\n 'hospitalized.place.name',\n 'hospitalized.place.region',\n 'hospitalized.place.country',\n 'hospitalized.place.position',\n 'hospitalized.topo',\n 'hospitalized.notes'\n ]\n },\n {\n key: 'exportgroup.died',\n fields: [\n 'died.date',\n 'died.date.split',\n 'died.place.name',\n 'died.place.region',\n 'died.place.country',\n 'died.place.position',\n 'died.topo',\n 'died.notes',\n 'died.age'\n ]\n },\n {\n key: 'exportgroup.buriedOriginal',\n fields: [\n 'buriedOriginal.date',\n 'buriedOriginal.date.split',\n 'buriedOriginal.place.name',\n 'buriedOriginal.place.region',\n 'buriedOriginal.place.country',\n 'buriedOriginal.memorial.name',\n 'buriedOriginal.memorial.address',\n 'buriedOriginal.memorial.position',\n 'buriedOriginal.reference',\n 'buriedOriginal.kind',\n 'buriedOriginal.notes'\n ]\n },\n {\n key: 'exportgroup.buriedCurrent',\n fields: [\n 'buriedCurrent.date',\n 'buriedCurrent.date.split',\n 'buriedCurrent.place.name',\n 'buriedCurrent.place.region',\n 'buriedCurrent.place.country',\n 'buriedCurrent.memorial.name',\n 'buriedCurrent.memorial.address',\n 'buriedCurrent.memorial.position',\n 'buriedCurrent.reference',\n 'buriedCurrent.kind',\n 'buriedCurrent.notes'\n ]\n },\n {\n key: 'exportgroup.memoratedOther',\n fields: [\n 'memoratedOther.date',\n 'memoratedOther.date.split',\n 'memoratedOther.place.name',\n 'memoratedOther.place.region',\n 'memoratedOther.place.country',\n 'memoratedOther.memorial.name',\n 'memoratedOther.memorial.address',\n 'memoratedOther.memorial.position',\n 'memoratedOther.reference',\n 'memoratedOther.kind',\n 'memoratedOther.notes'\n ]\n }\n];\n\n\nexport default (props: ExportFieldModalProps) => {\n const [isOpen, resolve] = useModal(props);\n\n const selected = useAppSelector(state => state.exportModalState.fields) || [];\n const dispatch = useAppDispatch();\n\n const setSelected = useCallback((fields: string[]) => {\n dispatch(updateExportModalStateAction({ fields }));\n }, [dispatch]);\n\n const handleClose = () => resolve(undefined);\n const handleAccept = () => resolve(selected);\n\n const groups = useMemo(() => fields.map(group => {\n const handleChecked = (field: string, value: boolean) => {\n if (value) {\n setSelected([...selected, field]);\n } else {\n setSelected(selected.filter(x => x !== field));\n }\n };\n\n return (\n
\n

{T(group.key)}

\n {group.fields.map(field => (\n handleChecked(field, value)}\n />\n ))}\n
\n );\n }), [selected, setSelected]);\n\n return (\n \n {T('page.advancedSearch.exportFields')}\n \n {groups}\n \n \n \n \n \n \n );\n}\n","import React from 'react';\nimport $ from 'jquery';\nimport { PageProps, Page } from '../Page';\nimport { Icon } from '../../components/Icons';\nimport { T, plural } from '../../Translate';\nimport api from '../../api';\nimport { SpecialFunctionArguments, ValidationErrors, IRepeatableSpecialFunctionInput, SpecialFunctionResult } from '../../models/SpecialFunction';\nimport { SpecialFunctionForm } from '../SpecialFunctions/SpecialFunctionForm';\nimport { getEventIcon, PersonEventType, getEventTypeName } from '../../models/PersonEvent';\nimport { Button } from 'react-bootstrap';\nimport { FormCard } from '../../components/FormCard';\nimport { TopTabs } from '../../components/TopTabs';\nimport { MarkdownView } from '../../components/MarkdownView';\nimport { SpecialFunctionResultTable } from '../SpecialFunctions/SpecialFunctionResultTable';\nimport { updatePagesStateAction } from '../../redux/Actions';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { useAppSelector, useAppDispatch } from '../../utils/Functional';\nimport { useFunctionDefinition } from '../../FunctionalAPI';\nimport ExportFieldModal from './ExportFieldModal';\nimport { PageID } from '../../utils/PageLinking';\n\nexport interface AdvancedSearchStateProps {\n args: SpecialFunctionArguments;\n errors: ValidationErrors;\n result?: SpecialFunctionResult;\n tab: string;\n}\n\nfunction getFilterIcon(type: string): Icon {\n return getEventIcon(type as PersonEventType) || Icon.ListUl;\n}\n\nfunction getFilterTitle(type: string): string {\n const name = type === 'event'\n ? T('page.advancedSearch.addFilter.event')\n : getEventTypeName(type as PersonEventType);\n\n return T('page.advancedSearch.addFilter.title', { type: name });\n}\n\nconst NoSelection: string[] = [];\nconst NoSelector = () => {};\n\nexport default (props: PageProps) => {\n const { history, loading, modals, via } = props;\n\n const dispatch = useAppDispatch();\n const pageState = useAppSelector(state => state.pagesState.advancedSearch);\n const definition = useFunctionDefinition('FindPersonAdvancedInternal');\n \n const { args, result, errors, tab } = pageState;\n\n const updatePageState = (updates: Partial) => {\n dispatch(updatePagesStateAction('advancedSearch', updates));\n };\n\n const handleClickedReset = () => updatePageState({ args: {} });\n\n const handleClickedExecute = async () => {\n const result = await loading.loading(api.callFunction('FindPersonAdvancedInternal', args), plural('person'));\n updatePageState({ result, tab: 'results' });\n };\n\n const handleTabChanged = (tab: string) => updatePageState({ tab });\n\n const handleClickedCSV = async () => {\n const fields = await modals.show(props => );\n if (fields === undefined)\n return; // cancel\n \n const urlParams = {\n format: 'csvfile',\n method: 'callFunctionCsv',\n params: JSON.stringify({\n name: 'FindPersonAdvancedExtended',\n token: api.token,\n arguments: Object.assign({}, args, { fields })\n })\n };\n var url = api.url + '?' + $.param(urlParams);\n window.open(url, '_blank');\n };\n\n const renderRepeatableSelector = (\n field: IRepeatableSpecialFunctionInput,\n onClickedAdd: (type: string) => void\n ) => {\n return <>\n

{T('page.advancedSearch.addFilter.info')}

\n
\n {field.types.map(type => (\n onClickedAdd(type.name)}\n style={{ marginRight: 5 }}\n >\n \n \n ))}\n
\n ;\n }\n\n const renderParametersTab = () => (\n \n {definition && (\n updatePageState({ args })}\n renderRepeatable={renderRepeatableSelector}\n />\n )}\n \n \n \n \n \n );\n\n const renderResultsTab = () => {\n const suffix = (\n result\n && result.type === 'table'\n && (' (' + (result.total > result.data.length ? result.data.length + '/' : '') + result.total + ')')\n ) || '';\n return (\n \n {renderResultsTabContent()}\n \n );\n };\n\n const renderResultsTabContent = () => {\n if (!result)\n return
;\n \n if (result.type === 'text') {\n return ;\n } else {\n return <>\n
\n \n
\n \n ;\n }\n }\n\n return (\n \n result.total.toString() : undefined\n }\n ]}\n />\n \n );\n}\n","import React, { useState } from 'react';\nimport { PageProps, usePageHeader } from '../Page';\nimport { Container, Row, Card, Form, Alert, Button } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { LoadingIcon, Icon } from '../../components/Icons';\nimport { VerticalInput } from '../../components/inputs/VerticalInput';\nimport api from '../../api';\nimport { NotificationManager } from 'react-notifications';\nimport { PageID } from '../../utils/PageLinking';\n\ninterface ActivateAccountPageProps extends PageProps {\n activationKey: string;\n mode: 'activate'|'resetPassword';\n}\n\nexport default (props: ActivateAccountPageProps) => {\n const { history, activationKey, mode, pending } = props;\n\n const [password, setPassword] = useState('');\n const [passwordError, setPasswordError] = useState();\n const [validatePassword, setValidatePassword] = useState('');\n const [validatePasswordError, setValidatePasswordError] = useState();\n const [error, setError] = useState();\n const [confirmation] = useState();\n\n usePageHeader(\n PageID.ActivateAccount,\n undefined,\n Icon.Page,\n 'activate',\n 'activate'\n );\n\n const handlePasswordChanged = (password: string) => {\n setPassword(password);\n setPasswordError(undefined);\n };\n\n const handleConfirmPasswordChanged = (validatePassword: string) => {\n setValidatePassword(validatePassword);\n setValidatePasswordError(undefined);\n }\n\n const validate = () => {\n let valid = true;\n if (password.length < 8) {\n setPasswordError(T('page.activateAccount.passwordTooShort'));\n valid = false;\n }\n if (password !== validatePassword) {\n setValidatePasswordError(T('page.activateAccount.passwordNotMatching'));\n valid = false;\n }\n return valid;\n };\n\n const handleClickedActivate = async () => {\n if (!validate())\n return;\n\n if (mode === 'resetPassword') {\n const result = await api.resetUserPassword(activationKey, password);\n if (result === 'INVALID_KEY') {\n setError(T('page.activateAccount.invalidKey'));\n return;\n }\n \n NotificationManager.success(T('page.resetPassword.done'));\n } else {\n const result = await api.activateUser(activationKey, password);\n if (result === 'INVALID_KEY') {\n setError(T('page.activateAccount.invalidKey'));\n return;\n }\n \n NotificationManager.success(T('page.activateAccount.done'));\n }\n history.push('/login');\n }\n\n const title = mode === 'activate'\n ? T('page.activateAccount.title')\n : T('page.resetPassword.title');\n const message = mode === 'activate'\n ? T('page.activateAccount.message')\n : T('page.resetPassword.message');\n const action = mode === 'activate'\n ? T('page.activateAccount.activate')\n : T('page.resetPassword.update');\n\n return (\n \n \n \n \n

\n {title}\n

\n
\n

{message}

\n
\n \n \n {error && {error}}\n {confirmation && {confirmation}}\n
\n \n
\n \n
\n
\n
\n
\n
\n );\n}\n","import React, { useState } from 'react';\nimport { T } from '../../Translate';\nimport { LoadingIcon, Icon } from '../../components/Icons';\nimport { Alert, Button, Card, Container, Form, Row } from 'react-bootstrap';\nimport { PageProps, usePageHeader } from '../Page';\nimport { VerticalInput } from '../../components/inputs/VerticalInput';\nimport api from '../../api';\nimport { NotificationManager } from 'react-notifications';\nimport { PageID } from '../../utils/PageLinking';\n\nexport default (props: PageProps) => {\n const { pending } = props;\n const [email, setEmail] = useState('');\n const [error, setError] = useState();\n usePageHeader(PageID.RequestPasswordReset, undefined, Icon.Page, '', '');\n\n const handleClickedSend = async () => {\n const result = await api.requestUserPasswordReset(email);\n if (result === 'NOT_FOUND') {\n setError(T('page.requestPasswordReset.notFound'));\n } else {\n setError(undefined);\n NotificationManager.success(T('page.requestPasswordReset.sent'));\n }\n }\n\n return (\n \n \n \n \n

{T('page.requestPasswordReset.title')}

\n
\n

{T('page.requestPasswordReset.message')}

\n
\n \n {error && {error}}\n
\n \n
\n \n
\n
\n
\n
\n
\n );\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { T, plural } from '../../Translate';\nimport { IContactPerson } from '../../models/ContactPerson';\nimport {\n ITableColumn,\n StringTableColumn,\n ActionsTableColumn,\n TableRowActionStyle,\n StringFieldTableColumn,\n ComponentTableColumn\n} from '../../components/table/Fields';\nimport { Icon } from '../../components/Icons';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport api from '../../api';\nimport { NotificationManager } from 'react-notifications';\nimport { IQueryResult } from '../../models/Generic';\nimport { ListState, ListPage } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { usePageState } from '../../redux/Actions';\nimport { useRefresh } from '../../utils/Functional';\nimport { PageID } from '../../utils/PageLinking';\n\nexport interface ListContactPersonsStateProps extends ListState {}\n\nfunction getSortColumn(name: string) {\n if (name === 'name')\n return 'filter';\n else\n return name;\n}\n\nconst rowKey = (item: IContactPerson) => item._id;\nconst PageSize = 10;\nexport default (props: PageProps) => {\n const { loading, history, via } = props;\n const modals = useModalContext();\n const [pageState, updatePageState] = usePageState('contactPersons');\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n const [items, setItems] = useState>();\n const refresh = useRefresh(() => {\n loading.loading(\n api.findContactPersons(\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]]\n ),\n plural('contactPerson')\n ).then(setItems);\n });\n useEffect(refresh, [loading, filter, tablePage, sortColumn, sortDirection]);\n\n const columns: ITableColumn[] = useMemo(() => {\n const handleClickedDelete = async (contact: IContactPerson) => {\n const name = contact.firstName + ' ' + contact.lastName;\n const confirmed = await modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n\n try {\n await api.deleteContactPerson(contact._id);\n NotificationManager.success(T('page.listContactPersons.remove.success', { name }));\n refresh();\n }\n catch {\n NotificationManager.error(T('page.listContactPersons.remove.failure'));\n }\n };\n\n return [\n new ComponentTableColumn(\n 'name',\n T('contactPerson.name'),\n contact => {contact.firstName + ' ' + contact.lastName}\n ),\n new StringFieldTableColumn(\n 'email',\n T('contactPerson.email')\n ),\n new StringFieldTableColumn(\n 'phone',\n T('contactPerson.phone')\n ),\n new ActionsTableColumn(\n 'actions',\n T('generic.list.actions'),\n contact => [\n {\n icon: Icon.Edit,\n style: TableRowActionStyle.Success,\n tooltip: T('generic.action.edit'),\n page: PageID.EditContactPerson,\n pageParam: contact._id\n },\n {\n icon: Icon.TimesCircle,\n style: TableRowActionStyle.Danger,\n tooltip: T('generic.action.remove'),\n onClick: handleClickedDelete\n }\n ],\n { width: 80 }\n )\n ];\n }, [modals, refresh]);\n\n const handleClickedAdd = () => {\n history.push('/contact_persons/create');\n }\n const user = api.user;\n\n return (\n \n );\n}\n","import { Icon } from \"./Icons\";\nimport React from \"react\";\nimport moment from \"moment\";\n\ninterface DateTimeOutputProps {\n from?: string;\n to?: string;\n}\nexport const DateTimeFromToOutput = (props: DateTimeOutputProps) => {\n const { from, to } = props;\n let fromDateTimeString = '???'\n let toDateTimeString = '???'\n if (from) {\n const datetime = moment(from);\n fromDateTimeString = datetime.format('YYYY-MM-DD HH:mm')\n }\n if (to) {\n const datetime = moment(to);\n toDateTimeString = datetime.format('YYYY-MM-DD HH:mm')\n }\n\n return (\n {fromDateTimeString} - {toDateTimeString}\n );\n}\n","import { Icon } from \"../../components/Icons\";\nimport React from \"react\";\nimport { ContactMomentType, translateContactMomentType } from \"../../models/ContactPerson\";\n\ninterface ContactMomentTypeOutputProps {\n contactMomentType: ContactMomentType;\n}\nexport const ContactMomentTypeOutput = (props: ContactMomentTypeOutputProps) => {\n const { contactMomentType } = props;\n const typeAsString = translateContactMomentType(contactMomentType)\n return (\n {typeAsString} ({contactMomentType})\n );\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { T, plural } from '../../Translate';\nimport {\n BaseContactPersonEvent,\n IContactPerson,\n ContactMomentType,\n ContactPersonEventData\n} from '../../models/ContactPerson';\nimport {\n ITableColumn,\n StringTableColumn,\n ActionsTableColumn,\n TableRowActionStyle,\n StringFieldTableColumn,\n ComponentTableColumn, ColumnAlign\n} from '../../components/table/Fields';\nimport { Icon } from '../../components/Icons';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport api from '../../api';\nimport { NotificationManager } from 'react-notifications';\nimport { IQueryResult } from '../../models/Generic';\nimport { ListState, ListPage } from '../ListPage';\nimport { PageProps } from '../Page';\nimport { useModalContext } from '../../modals/ModalContext';\nimport { usePageState } from '../../redux/Actions';\nimport { useRefresh } from '../../utils/Functional';\nimport { getPageLinkWithVia, PageID } from '../../utils/PageLinking';\nimport { DateTimeOutput } from \"../../components/DateTimeOutput\";\nimport { DateTimeFromToOutput } from \"../../components/DateTimeFromToOutput\";\nimport { ContactMomentTypeOutput } from \"./ContactMomentTypeOutput\";\nimport { Place } from \"../../models/Place\";\n\nexport interface ListContactPersonEventsStateProps extends ListState {}\n\nfunction getSortColumn(name: string) {\n if (name === 'name')\n return 'filter';\n else if (name == 'duration')\n return 'end';\n else if (name == 'method')\n return 'contact_method';\n else\n return name;\n}\n\nconst rowKey = (item: ContactPersonEventData) => item._id;\nconst PageSize = 10;\n\nexport default (props: PageProps) => {\n const { loading, history, via } = props;\n const modals = useModalContext();\n const [pageState, updatePageState] = usePageState('contactPersonEvents');\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n const [items, setItems] = useState>();\n const refresh = useRefresh(() => {\n loading.loading(\n api.findContactPersonEvents(\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]]\n ),\n plural('contactPerson')\n ).then(setItems);\n });\n useEffect(refresh, [loading, filter, tablePage, sortColumn, sortDirection]);\n\n const columns: ITableColumn[] = useMemo(() => {\n\n return [\n new ComponentTableColumn(\n 'name',\n T('contactPerson.name'),\n (contactPersonEvent) => { return (\n {contactPersonEvent.personLastName + ' ' + contactPersonEvent.personFirstName}\n )},\n { sortable: true, align: ColumnAlign.Left, clickable: true }),\n new ComponentTableColumn(\n 'duration',\n T('contactMoment.duration'),\n (contactPersonEvent) => { return (\n )\n },\n { sortable: true, align: ColumnAlign.Left, clickable: true }),\n new ComponentTableColumn(\n 'method',\n T('contactMoment.contactMethod'),\n (contactPersonEvent) => { return (\n \n \n )\n },\n { sortable: true, align: ColumnAlign.Right, clickable: true }),\n new ActionsTableColumn(\n 'actions',\n T('generic.list.actions'),\n contactPersonEvent => [\n {\n icon: Icon.Eye,\n style: TableRowActionStyle.Success,\n tooltip: T('generic.action.view'),\n page: PageID.EditContactPerson,\n pageParam: contactPersonEvent.contactPersonId\n }\n ],\n { width: 80 }\n )\n\n ];\n }, [modals, refresh]);\n\n const user = api.user;\n\n const handleClickedRow = (contactPersonEventData: ContactPersonEventData) => {\n history.push(getPageLinkWithVia(PageID.EditContactPerson,\n contactPersonEventData.contactPersonId,\n PageID.ListContactMoments,\n undefined))\n };\n\n return (\n \n );\n}\n","import React, { CSSProperties } from 'react';\nimport { useElementID } from '../../utils/ElementID';\n\ninterface TextInputProps {\n name: string;\n labelColumns?: number;\n label: string;\n\n firstValue: string;\n firstPlaceholder?: string;\n firstColumns?: number;\n onChangeFirst: (value: string) => void;\n \n secondValue: string;\n secondPlaceholder?: string;\n secondColumns?: number;\n onChangeSecond: (value: string) => void;\n\n error?: string;\n readOnly?: boolean;\n validated?: boolean;\n style?: CSSProperties;\n}\n\nexport const DualTextInput = (props: TextInputProps) => {\n const {\n name,\n labelColumns = 4,\n label,\n\n firstValue,\n firstPlaceholder,\n firstColumns = 4,\n onChangeFirst,\n\n secondValue,\n secondPlaceholder,\n secondColumns = 4,\n onChangeSecond,\n\n error,\n readOnly,\n validated,\n style\n } = props;\n\n const id1 = useElementID('input');\n const id2 = useElementID('input');\n const inputClass = error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control');\n return (\n
\n \n
\n onChangeFirst(e.currentTarget.value)}\n placeholder={firstPlaceholder}\n />\n
\n
\n onChangeSecond(e.currentTarget.value)}\n placeholder={secondPlaceholder}\n />\n
\n
\n );\n};\n","import React from 'react';\nimport { IContactPerson } from '../../models/ContactPerson';\nimport { ModalProps, useModal } from '../../modals/BaseModal';\nimport { Modal, Button } from 'react-bootstrap';\nimport { T } from '../../Translate';\nimport { ModalHeader } from '../../modals/ModalHeader';\nimport { ButtonRowModalFooter } from '../../components/ButtonRow';\nimport { Place } from '../../models/Place';\n\ninterface ViewContactPersonModalProps extends ModalProps {\n contactPerson: IContactPerson;\n}\n\nexport const ViewContactPersonModal = (props: ViewContactPersonModalProps) => {\n const { contactPerson } = props;\n const [isOpen, resolve] = useModal(props);\n\n const handleClose = () => resolve(false);\n const handleSelect = () => resolve(true);\n\n const name = contactPerson.firstName + ' ' + contactPerson.lastName;\n const title = T('page.contactPerson.selectExisting.title', { name });\n const placeName = contactPerson.place ? new Place(contactPerson.place).describe() : '';\n\n return (\n \n {title}\n \n
\n
{T('contactPerson.name')}
\n
{name}
\n
{T('contactPerson.email')}
\n
{contactPerson.email}
\n
{T('contactPerson.phone')}
\n
{contactPerson.phone}
\n
{T('contactPerson.streetNr')}
\n
{contactPerson.street} {contactPerson.streetNumber}
\n
{T('contactPerson.place')}
\n
{placeName}
\n
\n
\n \n \n \n
\n );\n};\n","import React, { useMemo, useState, useEffect, useCallback } from 'react';\nimport { PageProps, Page } from '../Page';\nimport { T } from '../../Translate';\nimport {\n IContactPerson,\n ContactPersonEvent,\n IContactPersonFields,\n ContactMomentTypes,\n translateContactMomentType,\n ContactMomentType\n} from '../../models/ContactPerson';\nimport { Icon } from '../../components/Icons';\nimport api, {ActionType} from '../../api';\nimport { FormCard } from '../../components/FormCard';\nimport { Row, Col, Button } from 'react-bootstrap';\nimport { TextInput } from '../../components/inputs/TextInput';\nimport { DualTextInput } from '../../components/inputs/DualTextInput';\nimport { PlaceInput } from '../../components/inputs/PlaceInput';\nimport { IPlace } from '../../models/Place';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport {IValidationResult, getErrorDescription, isValidationResult} from '../../models/ValidationResult';\nimport { emptyDateTime, currentDateTime } from '../../components/inputs/DateTimeInput';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Dispatch } from 'redux';\nimport { ActiveContactMoment } from '../../models/ActiveContactMoment';\nimport { startContactMomentAction, AnyAppAction } from '../../redux/Actions';\nimport { ContactPersonEventView } from './ContactPersonEventView';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { NotificationManager } from 'react-notifications';\nimport { AppState } from '../../redux/State';\nimport { ViewContactPersonModal } from './ViewContactPersonModal';\nimport { useContactPerson, useContactPersonEvents } from '../../FunctionalAPI';\nimport { useDelayedEffect } from '../../utils/DelayedEffect';\nimport { useRefresh } from '../../utils/Functional';\nimport { PageID } from '../../utils/PageLinking';\n\n\ninterface EditContactPersonProps extends PageProps {\n id?: string;\n}\n\nexport default (props: EditContactPersonProps) => {\n const { id, history, modals, loading, via } = props;\n\n const activeContactMoment = useSelector\n (state => state.activeContactMoment.current);\n const dispatch = useDispatch>();\n const start = (contactMoment: ActiveContactMoment) =>\n dispatch(startContactMomentAction(contactMoment));\n\n const [firstName, setFirstName] = useState('');\n const [firstNameError, setFirstNameError] = useState();\n const [lastName, setLastName] = useState('');\n const [lastNameError, setLastNameError] = useState();\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState();\n const [phone, setPhone] = useState('');\n const [phoneError, setPhoneError] = useState();\n const [street, setStreet] = useState('');\n const [streetError, setStreetError] = useState();\n const [streetNumber, setStreetNumber] = useState('');\n const [streetNumberError, setStreetNumberError] = useState();\n const [place, setPlace] = useState();\n const [placeError, setPlaceError] = useState();\n const [notes, setNotes] = useState('');\n const [notesError, setNotesError] = useState();\n\n const [suggestions, setSuggestions] = useState([]);\n const [selectedContactMomentType, setSelectedContactMomentType] = useState(ContactMomentType.Email);\n\n const contactPerson = useContactPerson(loading, id);\n const [events,,setEvents] = useContactPersonEvents(loading, id);\n\n const contactMomentTypeOptions = useMemo(() => ContactMomentTypes.map(type => (\n \n )), []);\n\n const eventViews = useMemo(\n () => {\n const handleClickedDeleteEvent = async (event: ContactPersonEvent) => {\n const confirmed = await modals.show(props => (\n \n ));\n\n if (!confirmed)\n return;\n\n try {\n await api.deleteContactPersonEvent(event._id);\n setEvents(events.filter(e => e._id !== event._id));\n NotificationManager.success(T('page.contactPerson.removeEvent.success'));\n } catch {\n NotificationManager.error(T('page.contactPerson.removeEvent.failure'));\n }\n };\n\n return events.map(event => (\n handleClickedDeleteEvent(event)}\n readonly={false}\n />\n ));\n },\n [events, modals, setEvents]\n );\n\n const clearErrors = useRefresh(() => {\n setFirstNameError(undefined);\n setLastNameError(undefined);\n setEmailError(undefined);\n setPhoneError(undefined);\n setStreetError(undefined);\n setStreetNumberError(undefined);\n setPlaceError(undefined);\n setNotesError(undefined);\n });\n\n const clearForm = useRefresh(() => {\n setFirstName('');\n setLastName('');\n setEmail('');\n setPhone('');\n setStreet('');\n setStreetNumber('');\n setPlace(undefined);\n setNotes('');\n setSuggestions([]);\n setEvents([]);\n clearErrors();\n });\n\n useEffect(() => {\n if (contactPerson) {\n setFirstName(contactPerson.firstName);\n setLastName(contactPerson.lastName);\n setEmail(contactPerson.email);\n setPhone(contactPerson.phone);\n setStreet(contactPerson.street);\n setStreetNumber(contactPerson.streetNumber);\n setPlace(contactPerson.place);\n setNotes(contactPerson.notes);\n clearErrors();\n } else{\n clearForm();\n }\n }, [contactPerson, clearErrors, clearForm]);\n\n useDelayedEffect(() => {\n if (id !== undefined)\n return;\n\n if (firstName === '' || lastName === '') {\n setSuggestions([]);\n return;\n }\n\n api.findContactPersonsByName(firstName, lastName)\n .then(setSuggestions);\n }, [firstName, lastName], 500);\n\n const title = contactPerson ? T(\n 'page.contactPerson.title.edit',\n { name: contactPerson.firstName + ' ' + contactPerson.lastName }\n ) : T('page.contactPerson.title.create');\n\n const handleFirstNameChanged = (value: string) => {\n setFirstName(value);\n setFirstNameError(undefined);\n };\n\n const handleLastNameChanged = (value: string) => {\n setLastName(value);\n setLastNameError(undefined);\n };\n\n const handleEmailChanged = (value: string) => {\n setEmail(value);\n setEmailError(undefined);\n };\n\n const handlePhoneChanged = (value: string) => {\n setPhone(value);\n setPhoneError(undefined);\n };\n\n const handleStreetChanged = (value: string) => {\n setStreet(value);\n setStreetError(undefined);\n };\n\n const handleStreetNumberChanged = (value: string) => {\n setStreetNumber(value);\n setStreetNumberError(undefined);\n };\n\n const handlePlaceChanged = (value: IPlace|undefined) => {\n setPlace(value);\n setPlaceError(undefined);\n };\n\n const handleNotesChanged = (value: string) => {\n setNotes(value);\n setNotesError(undefined);\n };\n\n const copyFields = (): IContactPersonFields => {\n return {\n firstName,\n lastName,\n email,\n phone,\n street,\n streetNumber,\n placeId: place ? place._id : '',\n notes\n };\n };\n\n const copyFieldsForValidation = (): { id?: string } & Partial => {\n return Object.assign({ _id: id }, copyFields())\n };\n\n const copyFieldsForUpdate = (): { _id: string } & Partial => {\n if (id) {\n return Object.assign({_id: id }, copyFields())\n } else {\n throw new Error('Invalid _id for updating contact person');\n }\n }\n\n const handleValidationErrors = (result: IValidationResult) => {\n if (result.status === 'OK')\n return false;\n\n const errors = result.data || {};\n setFirstNameError(getErrorDescription(errors.firstName));\n setLastNameError(getErrorDescription(errors.lastName));\n setEmailError(getErrorDescription(errors.email));\n setPhoneError(getErrorDescription(errors.phone));\n setStreetError(getErrorDescription(errors.street));\n setStreetNumberError(getErrorDescription(errors.streetNumber));\n setPlaceError(getErrorDescription(errors.placeId));\n setNotesError(getErrorDescription(errors.notes));\n return true;\n }\n\n const save = async (): Promise => {\n const fields: IContactPersonFields = copyFields()\n\n let action: ActionType = id !== undefined ? 'update' : 'create';\n const fieldsForValidation = copyFieldsForValidation();\n\n try {\n const result = await api.validateContactPerson(fieldsForValidation, action)\n if (result === undefined)\n return undefined;\n if (result.status !== 'OK')\n throw result;\n\n let person: IContactPerson;\n if (action === 'update') {\n const fieldsForUpdate = copyFieldsForUpdate();\n person = await api.updateContactPerson(fieldsForUpdate)\n } else {\n person = await api.createContactPerson(fields)\n }\n if (person === undefined) {\n NotificationManager.error(T('page.contactPerson.save.failure'));\n }\n return person;\n }\n catch (result) {\n if (isValidationResult(result)) {\n handleValidationErrors(result);\n return undefined;\n } else {\n NotificationManager.error(T('page.contactPerson.save.failure'));\n }\n }\n }\n\n const handleClickedStartContactMoment = () => {\n save().then(person => {\n if (person === undefined)\n return;\n\n start({\n person,\n startsAt: currentDateTime(),\n endsAt: emptyDateTime(),\n transcript: '',\n type: selectedContactMomentType,\n contributions: []\n });\n history.push('/record_contact_moment');\n });\n }\n\n const handleClickedSave = async () => {\n const person = await save();\n if (person === undefined)\n return;\n\n NotificationManager.success(T('page.contactPerson.save.success'));\n\n if (id === undefined)\n history.push(`/contact_persons/${person._id}`);\n };\n\n const handleClickedSaveAndNew = async () => {\n const person = await save();\n if (person === undefined)\n return;\n\n NotificationManager.success(T('page.contactPerson.save.success'));\n\n clearForm();\n history.push(`/contact_persons/create`);\n }\n\n const handleSelectedContactMomentTypeChanged = (e: React.SyntheticEvent) => {\n const value = e.currentTarget.value;\n setSelectedContactMomentType(value as ContactMomentType);\n };\n\n const handleClickedSuggestion = useCallback(async (person: IContactPerson) => {\n const selected = await modals.show(props => (\n \n ));\n if (!selected)\n return;\n\n history.replace('/contact_persons/' + person._id);\n }, [modals, history]);\n\n const saveButtons = (\n \n \n \n \n );\n\n return (\n \n \n \n \n \n \n {suggestions.length > 0 && (\n \n )}\n \n \n \n \n \n \n \n \n \n {events.length === 0 &&

{T('page.contactPerson.contactMoments.none')}

}\n
\n {eventViews}\n {activeContactMoment ? (\n

\n {T('page.contactPerson.alreadyHaveActiveContactMoment')}\n

\n ) : <>\n
\n
\n \n {contactMomentTypeOptions}\n \n
\n
\n \n
\n
\n

\n {T('page.contactPerson.willSaveOnStartingContact')}\n

\n

\n\n

\n }\n \n
\n {saveButtons}\n \n );\n}\n\ninterface ISuggestionsProps {\n label: string;\n suggestions: IContactPerson[];\n onClicked: (contactPerson: IContactPerson) => void;\n}\nconst Suggestions = (props: ISuggestionsProps) => {\n const { label, suggestions, onClicked } = props;\n const suggestionElements = suggestions.map(suggestion => (\n
\n \n
\n ));\n\n return (\n
\n \n
\n {suggestionElements}\n
\n
\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { Alert } from 'react-bootstrap';\nimport { ContactMomentContribution } from '../../models/ContactPerson';\nimport { ContributionView } from './ContributionView';\nimport { ReferenceInputGroup } from '../../components/inputs/ReferenceTypeaheadInput';\nimport { DocumentReferenceType, DocumentReference } from '../../models/DocumentReference';\nimport { T } from '../../Translate';\nimport api from \"../../api\";\nimport { Person } from \"../../models/Person\";\nimport { Document } from \"../../models/Document\"\nimport { useDocumentTagDefinitions } from \"../../FunctionalAPI\";\n\n\ninterface ContributionListProps {\n contributions: ContactMomentContribution[];\n onDelete: (contribution: ContactMomentContribution) => void;\n onInsert: (contribution: ContactMomentContribution) => void;\n}\nexport const ContributionList = (props: ContributionListProps): JSX.Element => {\n const { contributions, onDelete, onInsert } = props;\n\n /*** state ***/\n const [updatedContributions, setUpdatedContributions] = useState (contributions) ;\n const tags = useDocumentTagDefinitions()\n\n /*** effects ***/\n useEffect(() => {\n if (tags.list.length === 0)\n return;\n \n const updateContributionsWithReferencedData = (contributions: ContactMomentContribution[] ) => {\n setUpdatedContributions([]);\n contributions.forEach(contribution => {\n if (contribution.type === 'person') {\n updatePersonContributionWithReferencedData(contribution)\n } else if (contribution.type === 'document') {\n updateDocumentContributionWithReferencedData(contribution)\n }\n })\n };\n \n updateContributionsWithReferencedData(contributions)\n }, [contributions, tags])\n\n /*** utils ***/\n const updatePersonContributionWithReferencedData = (contribution: ContactMomentContribution) => {\n api.getPerson(contribution.targetId)\n .then((person) => {\n const personObject = new Person(person)\n setUpdatedContributions(updatedContributions => {\n let newContribution = {...contribution}\n newContribution.name = personObject.name\n let newList = [...updatedContributions, newContribution]\n newList = newList.sort(sortContactMomentContribution)\n return newList\n })\n })\n }\n\n const updateDocumentContributionWithReferencedData = (contribution: ContactMomentContribution) => {\n Promise.all([\n api.getCollectionDocument(contribution.targetId)]\n )\n .then(([document]) => {\n setUpdatedContributions(updatedContributions => {\n let newContribution = {...contribution}\n newContribution.name = Document.renderDocumentCounter(document.counter) + ': ' + document.title\n let newList = [...updatedContributions, newContribution]\n newList = newList.sort(sortContactMomentContribution)\n return newList\n })\n })\n }\n\n const sortContactMomentContribution = (a:ContactMomentContribution, b:ContactMomentContribution) => {\n if (a.type !== b.type)\n return a.type > b.type ? 1 : -1\n return (a.name ?? '').localeCompare(b.name ?? '')\n }\n\n\n /*** handlers ***/\n\n const handleSelectedPerson = (reference: DocumentReference) => {\n onInsert({\n type: 'person',\n targetId: reference.id!,\n name: reference.name\n });\n };\n const handleSelectedDocument = (reference: DocumentReference) => {\n onInsert({\n type: 'document',\n targetId: reference.id!,\n name: reference.name\n });\n };\n\n return <>\n {updatedContributions.map(contribution => (\n onDelete(contribution)}\n />\n ))}\n
{T('page.recordContactMoment.contributions.register')}:
\n \n \n \n {T('page.recordContactMoment.contributions.register.subtitle')}\n \n ;\n};\n","import React from 'react';\nimport moment from 'moment';\nimport { BasePage, PageProps, PageState } from '../Page';\nimport { Col, Row, Button } from 'react-bootstrap';\nimport { FormCard } from '../../components/FormCard';\nimport { Icon } from '../../components/Icons';\nimport { T } from '../../Translate';\nimport { DateTimeInput, DateTimeInputValue, inputDateTimeToISO } from '../../components/inputs/DateTimeInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { connect } from 'react-redux';\nimport { AppState } from '../../redux/State';\nimport { ActiveContactMoment } from '../../models/ActiveContactMoment';\nimport { Dispatch } from 'redux';\nimport {\n AnyAppAction,\n startContactMomentAction,\n endContactMomentAction,\n updateContactMomentAction\n} from '../../redux/Actions';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport { NotificationManager } from 'react-notifications';\nimport api from '../../api';\nimport { ContactPersonEvent, ContactMomentContribution } from '../../models/ContactPerson';\nimport { ContributionList } from './ContributionList';\nimport { PageID } from '../../utils/PageLinking';\n\ninterface RecordContactMomentOwnProps extends PageProps {\n}\ninterface RecordContactMomentStateProps {\n current?: ActiveContactMoment;\n}\ninterface RecordContactMomentDispatchProps {\n start: (data: ActiveContactMoment) => void;\n update: (updates: Partial) => void;\n stop: () => void;\n}\ninterface RecordContactMomentState extends PageState {\n\n}\ntype RecordContactMomentProps = RecordContactMomentOwnProps\n & RecordContactMomentStateProps\n & RecordContactMomentDispatchProps;\n\nclass RecordContactMomentPage extends BasePage {\n constructor(props: RecordContactMomentProps) {\n super(props);\n\n const person = props.current && props.current.person;\n const name = person ? (person.firstName + ' ' + person.lastName) : '...';\n this.state = {\n page: {\n id: PageID.RecordContactMoment,\n icon: Icon.User,\n title: T('page.recordContactMoment.title', { name }),\n via: person && ('contact_person:' + person._id),\n viaTitle: name\n }\n };\n }\n\n handleStartsAtChanged = (value: DateTimeInputValue) => {\n const { update } = this.props;\n update({ startsAt: value });\n }\n\n handleEndsAtChanged = (value: DateTimeInputValue) => {\n const { update } = this.props;\n update({ endsAt: value });\n }\n\n handleTranscriptChanged = (value: string) => {\n const { update } = this.props;\n update({ transcript: value });\n }\n\n handleClickedCancel = () => {\n this.showModal(props => (\n \n )).then(confirmed => {\n if (confirmed) {\n const { history, stop, current } = this.props;\n if (!current)\n return;\n\n stop();\n history.push(`/contact_persons/${current.person._id}`)\n }\n });\n }\n\n handleDeleteContribution = (contribution: ContactMomentContribution) => {\n const { update, current } = this.props;\n if (!current)\n return;\n\n const newContributions = current.contributions.filter(c => c.targetId !== contribution.targetId);\n update({ contributions: newContributions });\n }\n\n handleInsertContribution = (contribution: ContactMomentContribution) => {\n const { update, current } = this.props;\n if (!current)\n return;\n\n let already_added_contribution = current.contributions.find(\n i => i.targetId === contribution.targetId\n )\n\n if (already_added_contribution === undefined) {\n update({contributions: [...current.contributions, contribution]});\n } else {\n NotificationManager.info(T('validationError.dataAlreadyExists'));\n }\n }\n\n handleClickedSave = () => {\n const { stop, current: contactMoment, history } = this.props;\n if (!contactMoment)\n return;\n\n const startDateTime = inputDateTimeToISO(contactMoment.startsAt);\n if (!startDateTime) {\n NotificationManager.error(T('contactMoment.invalidStart'))\n return;\n }\n api.createContactPersonEvent({\n type: 'contact_moment',\n contactPersonId: contactMoment.person._id,\n contactMethod: contactMoment.type,\n start: startDateTime,\n end: moment().format('YYYY-MM-DDTHH:mm'),\n contributions: contactMoment.contributions,\n transcript: contactMoment.transcript\n } as ContactPersonEvent).then(() => {\n stop();\n NotificationManager.success(T('contactMoment.stoppedSuccessfully'))\n history.push(`/contact_persons/${contactMoment.person._id}`)\n });\n }\n\n renderContent() {\n const { current } = this.props;\n if (!current)\n return
;\n\n const { startsAt, transcript, contributions } = current;\n\n return <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ;\n }\n}\n\nconst mapStateToProps = (state: AppState): RecordContactMomentStateProps => {\n return {\n current: state.activeContactMoment.current\n };\n}\nconst mapDispatchToProps = (dispatch: Dispatch): RecordContactMomentDispatchProps => {\n return {\n start: data => dispatch(startContactMomentAction(data)),\n update: updates => dispatch(updateContactMomentAction(updates)),\n stop: () => dispatch(endContactMomentAction())\n };\n}\nconst ConnectedPage = connect<\n RecordContactMomentStateProps,\n RecordContactMomentDispatchProps,\n RecordContactMomentOwnProps,\n AppState\n>(mapStateToProps, mapDispatchToProps)(RecordContactMomentPage);\nexport default ConnectedPage;\n","import { getErrorDescription, ValidationError } from \"../models/ValidationResult\";\nimport { T } from \"../Translate\";\n\n\nclass ValidationResult {\n\n error: string\n name: string | undefined\n code: string | undefined\n\n constructor(errorMessage: string) {\n this.error = errorMessage\n this.split()\n }\n\n getName(): string | undefined {\n return this.name\n }\n\n getErrorCode(): string | undefined {\n return this.code\n }\n\n isErrorWithName(): boolean {\n return this.name !== undefined\n }\n\n private split() {\n const splitted = this.error.split(',')\n if (splitted.length > 0) {\n const firstErrorString = splitted[0]\n const firstErrorStringSplitted = firstErrorString.split(':')\n if (firstErrorStringSplitted.length === 2) {\n this.name = firstErrorStringSplitted[0].trim()\n this.code = firstErrorStringSplitted[1].trim()\n } else if (firstErrorStringSplitted.length === 1) {\n this.name = undefined\n this.code = firstErrorStringSplitted[0].trim()\n } else {\n this.name = undefined\n this.code = undefined\n }\n }\n }\n\n notificationMessage(): string | undefined {\n let message = ''\n if (this.isErrorWithName()) {\n message = this.getName() + ': '\n }\n const codeErrorMessage = this.code?.toUpperCase()\n if (codeErrorMessage) {\n const validationErrorString = codeErrorMessage as ValidationError\n let errorDesription = getErrorDescription(validationErrorString) || this.code\n if (errorDesription === T('validationError.unknown')) {\n errorDesription = this.code\n }\n message += errorDesription\n }\n return message === '' ? undefined : message\n }\n}\n\nexport default ValidationResult;\n","import React from 'react';\nimport { BasePage, PageProps, PageState } from '../Page';\nimport { Col, Row, Button } from 'react-bootstrap';\nimport { FormCard } from '../../components/FormCard';\nimport { Icon } from '../../components/Icons';\nimport { T, singular } from '../../Translate';\nimport { DateTimeInput, DateTimeInputValue, emptyDateTime, inputDateTimeToISO, inputDateTimeFromISO } from '../../components/inputs/DateTimeInput';\nimport { TextareaInput } from '../../components/inputs/TextareaInput';\nimport { BottomButtonRow } from '../../components/ButtonRow';\nimport { ContactMomentContactPersonEvent, ContactMomentContribution, IContactPerson, ContactMomentType, translateContactMomentType, ContactMomentTypes } from '../../models/ContactPerson';\nimport api, { IAPIError } from '../../api';\nimport { NotificationManager } from 'react-notifications';\nimport { SelectInput } from '../../components/inputs/SelectInput';\nimport { ContributionList } from '../RecordContactMoment/ContributionList';\nimport { PageID } from '../../utils/PageLinking';\nimport { UnsavedChangesModal } from '../../modals/UnsavedChangesModal';\nimport ValidationResult from \"../../utils/ValidationError\";\n\ninterface EditContactMomentProps extends PageProps {\n id: string;\n}\ninterface EditContactMomentState extends PageState {\n person?: IContactPerson;\n contactMoment?: ContactMomentContactPersonEvent;\n\n contactMethod: ContactMomentType,\n startsAt: DateTimeInputValue;\n startsAtError?: string;\n endsAt: DateTimeInputValue;\n endsAtError?: string;\n transcript: string;\n contributions: ContactMomentContribution[];\n}\nexport default class EditContactMomentPage extends BasePage {\n contactMethodOptions: JSX.Element[];\n\n constructor(props: EditContactMomentProps) {\n super(props);\n\n this.state = {\n page: {\n id: PageID.EditContactMoment,\n entity: props.id,\n icon: Icon.Comment,\n title: T('page.editContactMoment.title', { name: '...' }),\n confirmNavigation: this.confirmNavigation\n },\n contactMethod: ContactMomentType.Visit,\n startsAt: emptyDateTime(),\n endsAt: emptyDateTime(),\n transcript: '',\n contributions: []\n };\n\n this.contactMethodOptions = ContactMomentTypes.map(type => (\n \n ));\n }\n\n shouldLoadContent(oldProps: EditContactMomentProps, newProps: EditContactMomentProps) {\n return oldProps.id !== newProps.id;\n }\n\n hasChanged = () => {\n const {\n contactMoment,\n contactMethod,\n startsAt,\n endsAt,\n transcript,\n contributions\n } = this.state;\n\n if (contactMoment === undefined)\n return true;\n\n if (contactMethod !== contactMoment.contactMethod)\n return true;\n if (inputDateTimeToISO(startsAt) !== contactMoment.start)\n return true;\n if (inputDateTimeToISO(endsAt) !== contactMoment.end)\n return true;\n if (transcript !== contactMoment.transcript)\n return true;\n if (contributions.length !== contactMoment.contributions.length)\n return true;\n\n for (let i = 0; i < contributions.length; i++) {\n const a = contributions[i];\n const b = contactMoment.contributions[i];\n if (a.type !== b.type || a.targetId !== b.targetId)\n return true;\n }\n\n return false;\n }\n\n confirmNavigation = async () => {\n if (this.hasChanged()) {\n this.props.modals.show(UnsavedChangesModal);\n return false;\n } else {\n return true;\n }\n }\n\n loadContent() {\n const { id, via } = this.props;\n this.loading(api.getContactPersonEvent(id), singular('contactMoment'))\n .then(contactPersonEvent => {\n const event = contactPersonEvent as ContactMomentContactPersonEvent;\n this.setState({\n contactMoment: event,\n contactMethod: event.contactMethod,\n startsAt: inputDateTimeFromISO(event.start),\n endsAt: inputDateTimeFromISO(event.end),\n transcript: event.transcript,\n contributions: event.contributions\n });\n this.loading(api.getContactPerson(event.contactPersonId), singular('contactPerson'))\n .then(contactPerson => this.setState({\n person: contactPerson,\n page: {\n id: PageID.EditContactMoment,\n entity: id,\n icon: Icon.Comment,\n title: T(\n 'page.editContactMoment.title',\n { name: contactPerson.firstName + ' ' + contactPerson.lastName }\n ),\n confirmNavigation: this.confirmNavigation,\n via: via || 'contact_person-' + contactPerson._id,\n viaTitle: via ? undefined : contactPerson.firstName + ' ' + contactPerson.lastName\n }\n }));\n });\n }\n\n handleContactMethodChanged = (value: string) => {\n this.setState({ contactMethod: value as ContactMomentType });\n }\n\n handleStartsAtChanged = (value: DateTimeInputValue) => {\n this.setState({ startsAt: value })\n }\n\n handleEndsAtChanged = (value: DateTimeInputValue) => {\n this.setState({ endsAt: value });\n }\n\n handleTranscriptChanged = (value: string) => {\n this.setState({ transcript: value });\n }\n\n handleDeleteContribution = (contribution: ContactMomentContribution) => {\n const { contributions } = this.state;\n const newContributions = contributions.filter(c => c.targetId !== contribution.targetId);\n this.setState({ contributions: newContributions });\n }\n\n handleInsertContribution = (contribution: ContactMomentContribution) => {\n const {contributions} = this.state;\n let already_added_contribution = contributions.find(\n i => i.targetId === contribution.targetId\n )\n if (already_added_contribution === undefined) {\n this.setState({contributions: [...contributions, contribution]});\n } else {\n NotificationManager.info(T('validationError.dataAlreadyExists'));\n }\n }\n\n handleClickedSave = () => {\n const { id } = this.props;\n const { contactMethod, startsAt, endsAt, transcript, contributions } = this.state;\n const start = inputDateTimeToISO(startsAt);\n if (start === undefined) {\n this.setState({ startsAtError: T('validationError.invalidDate') });\n return;\n }\n const end = inputDateTimeToISO(endsAt);\n if (end === undefined) {\n this.setState({ endsAtError: T('validationError.invalidDate') });\n return;\n }\n\n api.updateContactPersonEvent({\n _id: id,\n contactMethod,\n start,\n end,\n transcript,\n contributions\n }).then(event => {\n NotificationManager.success(T('page.editContactMoment.saved'));\n this.setState({ contactMoment: event as ContactMomentContactPersonEvent }, () => {\n setTimeout(() => {\n // give the state a moment to update\n const { history } = this.props;\n history.goBack();\n });\n });\n }).catch(err => {\n this.handleAPIError(err)\n });\n }\n\n handleAPIError(err: IAPIError) {\n // handle validation error\n if (err.code === 1013 && err.data) {\n const validationResult = new ValidationResult(err.data) ;\n if (validationResult.name?.toUpperCase() === 'end_date'.toUpperCase())\n this.setState({ endsAtError: T('validationError.invalidDate') });\n }\n }\n\n renderContent() {\n const { contactMethod, startsAt, endsAt, transcript, contributions } = this.state;\n\n return <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ;\n }\n}\n","import React, { useMemo, useState, useEffect } from 'react';\nimport { PageProps } from '../Page';\nimport { ListPage, ListState } from '../ListPage';\nimport { Icon } from '../../components/Icons';\nimport { T, plural } from '../../Translate';\nimport { getColumns, rowKey } from '../ViewCollection/Columns';\nimport { IQueryResult } from '../../models/Generic';\nimport { Document, DocumentCategory } from '../../models/Document';\nimport { usePageState } from '../../redux/Actions';\nimport api from '../../api';\nimport { useDocumentTagDefinitions } from '../../FunctionalAPI';\nimport { DocumentTagTypeInput, getFullTagName } from '../../components/inputs/DocumentTagTypeInput';\nimport { DocumentTagDefinition } from '../../models/DocumentTagDefinition';\nimport { classes } from '../../utils/Styles';\nimport { PageID } from '../../utils/PageLinking';\nimport AddDocumentationControl from './AddDocumentationControl';\nimport AddAdlibDocumentModal from './AddAdlibDocumentModal';\nimport { CheckAdlibCodeResult } from '../../models/CheckAdlibCodeResult';\nimport { TextStyles } from \"../../config/styles\";\n\nexport interface ListDocumentationPageState extends ListState {\n tagFilter: string|null;\n}\n\nconst PageSize = 10;\nexport default (props: PageProps) => {\n\n const { loading, history, via, modals } = props;\n\n /*** state ***/\n const [pageState, updatePageState] = usePageState('documentation');\n const tagDefinitions = useDocumentTagDefinitions(loading);\n const [items, setItems] = useState>();\n\n /*** variables ***/\n const { filter, tablePage, sortColumn, sortDirection, tagFilter } = pageState;\n const columns = useMemo(() => getColumns(), []);\n const tag = tagFilter === null ? undefined : tagDefinitions.indexed[tagFilter];\n\n /*** effects ***/\n\n useEffect(() => {\n if (tagDefinitions.list.length === 0)\n return;\n\n loading.loading(api.findCollectionDocuments(\n tagFilter ? { 'tags.tag': tagFilter } : {},\n filter,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection], ['_id', sortDirection]],\n ['collection']\n ), plural('document'))\n .then(result => {\n setItems({\n total: result.total,\n data: result.data.map(document => {\n const newDocument = Document.fromJSON(document, tagDefinitions);\n return newDocument;\n })\n });\n });\n }, [loading, filter, tablePage, sortColumn, sortDirection, tagFilter, tagDefinitions]);\n\n /*** table handlers ***/\n\n const handleClickedRow = (row: Document) => {\n history.push(`/documents/${row.id}`);\n };\n\n const handleTagSelected = (tag: DocumentTagDefinition|undefined) => {\n updatePageState({ tagFilter: tag ? tag.id : null, tablePage: 0 });\n };\n\n const handleClickedClearTag = () => {\n updatePageState({ tagFilter: null, tablePage: 0 });\n };\n\n const handleClickedAdd = async (category: DocumentCategory) => {\n if (category === DocumentCategory.Adlib) {\n const check = await modals.show(\n props => \n );\n if (check === undefined)\n return;\n\n if (check.type === 'document') {\n history.push(`/documents/create?category=${DocumentCategory.Adlib}&code=${check.code}`);\n } else if (check.type === 'collection') {\n history.push(`/documents/create?category=${DocumentCategory.AdlibCollectionDocument}&code=${check.code}`);\n }\n } else {\n history.push(`/documents/create?category=${category}`);\n }\n };\n\n const getSortColumn = (column: string) => {\n switch (column) {\n case 'title':\n return 'sort_title'\n case 'category':\n return 'category'\n default:\n return column;\n }\n }\n\n\n /*** rendering ***/\n\n const additionalHeader = <>\n
\n {tag ? (\n
\n {T('generic.filter') + ':'}\n {getFullTagName(tagDefinitions, tag)}\n {' '}\n \n
\n ) : (\n
\n \n
\n )}\n
\n
\n \n ;\n\n return (\n \n );\n}\n","import React, { CSSProperties } from 'react';\nimport { useElementID } from '../../utils/ElementID';\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface TextInputProps {\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n value: string;\n name: string;\n error?: string;\n readOnly?: boolean;\n plainText?: boolean;\n validated?: boolean;\n placeholder?: string;\n style?: CSSProperties;\n info?: string;\n type?: 'text'|'number';\n\n onChange?: (value: string) => void;\n onPressedEnter?: () => void;\n}\n\nexport const TextInputColumn = (props: TextInputProps) => {\n\n\n const {\n label,\n value,\n name,\n error,\n info,\n type = 'text',\n readOnly,\n plainText,\n validated,\n placeholder,\n style,\n onChange,\n onPressedEnter\n } = props;\n\n const handleKeyPress = onPressedEnter && ((e: React.KeyboardEvent) => {\n if (e.key === 'Enter')\n onPressedEnter();\n });\n const id = useElementID('input');\n const inputClass = plainText ? 'form-control-plaintext' : (error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control'));\n return (\n
\n \n
\n onChange && onChange(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n placeholder={placeholder}\n />\n {error && }\n {info && {info}}\n
\n
\n );\n};\n","import { T } from '../../../Translate';\nimport { ButtonLink } from \"../../../components/ButtonLink\";\nimport * as React from \"react\";\n\n\ninterface ResetToOriginalLinkProps {\n onClick: () => void\n}\n\nconst buttonLinkStyle = {\n fontSize:'14px',\n textDecorationLine: 'underline'\n}\n\nexport const ResetToOrginalLink = (props: ResetToOriginalLinkProps ) => (\n \n {T('page.personstory.reset.name')}\n )\n\n","import React, { CSSProperties } from 'react';\nimport { FormCard } from '../../../components/FormCard';\nimport { Icon } from '../../../components/Icons';\nimport { T } from '../../../Translate';\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { Col, Form } from \"react-bootstrap\";\nimport { TextInputColumn } from \"../../../components/inputs/TextInputColumn\";\nimport { ResetToOrginalLink } from \"./ResetToOriginalLink\";\nimport { IPerson } from \"../../../models/Person\";\nimport { IPersonPlaceErrors } from \"./PersonPlaceData\";\nimport PageLink from '../../../components/PageLink';\nimport { PageID } from '../../../utils/PageLinking';\n\nexport interface PersonFormData {\n firstName: string\n familyName: string\n}\n\nexport interface PersonFormProps {\n personStory?: IPersonStory2;\n person?: IPerson;\n errors: IPersonPlaceErrors;\n readOnly: boolean;\n onUpdate: (data: PersonFormData) => void;\n}\n\n\nconst textStyle: CSSProperties = {\n fontSize: 14,\n color: '#9A9A9A',\n}\n\nexport const PersonForm = (props: PersonFormProps) => {\n const { personStory, person, readOnly, onUpdate, errors } = props;\n\n const familyName = personStory?.family_name || ''\n const firstName = personStory?.first_name || ''\n const bornYear = person?.born_year || ''\n const diedYear = person?.died_year || ''\n\n function handleFirstNameChanged(newName:string) {\n onUpdate({firstName: newName, familyName: familyName || ''})\n }\n\n function handleFamilyNameChanged(newName:string) {\n onUpdate({firstName: firstName || '', familyName: newName})\n }\n\n function renderNameResetLink(currentValue: string, personStoryValue: string, onClick: () => void) {\n if (currentValue !== personStoryValue) {\n return ()\n } else {\n return;\n }\n }\n\n return (\n \n
\n
\n
\n \n \n \n {T('personstories.linkedWith')} {(person?.surname || '') + ' ' + (person?.familyname || '')}\n \n \n \n
\n
\n \n
\n
\n
\n {!readOnly && renderNameResetLink(firstName, person?.surname || '', () => {\n handleFirstNameChanged(person?.surname || '')\n })}\n
\n
\n
\n\n
\n
\n \n
\n
\n
\n {!readOnly && renderNameResetLink(familyName, person?.familyname || '', () => {\n handleFamilyNameChanged(person?.familyname || '')\n })}\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n )\n};\n","import { ButtonLink } from \"../../../components/ButtonLink\";\nimport * as React from \"react\";\nimport { Icon, IconElement } from \"../../../components/Icons\";\nimport { Row } from \"react-bootstrap\";\n\n\ninterface EventLinkProps {\n selected: boolean\n text: string\n onClick?: () => void\n}\n\nexport const EventLinkView = (props: EventLinkProps ) => {\n const { selected, text, onClick } = props;\n\n const buttonLinkStyle = {\n fontSize:'14px',\n textDecorationLine: 'underline'\n }\n\n const renderCheckIcon = () => {\n if (selected) {\n return <>\n \n \n \n } else {\n return\n }\n }\n\n return <>\n \n \n {text}\n \n {renderCheckIcon()}\n \n \n}\n","import React from \"react\";\nimport { EventLinkView } from \"./EventLinkView\"\nimport { EventLinksDataWithSelected } from \"./EventLinks\"\n\n\ninterface EventLinksProps {\n data: EventLinksDataWithSelected[]\n onClick?: (selected: number) => void;\n}\n\nexport const EventLinksView = (props: EventLinksProps ) => {\n let { data, onClick } = props;\n\n const onClickHandler = (selected: number) => {\n if (onClick !== undefined) {\n onClick(selected)\n }\n };\n\n return <>\n {data.map((el, index) => (\n onClickHandler(index)}\n selected={el.selected}\n />\n ))}\n ;\n}\n","import { IPerson } from \"../../../models/Person\";\nimport { IPlace } from \"../../../models/Place\";\nimport { PersonEvent, PersonEventType } from \"../../../models/PersonEvent\";\nimport { Language, T, TranslationKey } from \"../../../Translate\";\nimport { PlaceFormData } from \"./PlaceForm\";\n\nexport interface EventLinksData {\n text: string,\n eventId?: string,\n event?: PersonEvent\n}\n\nexport interface EventLinksDataWithSelected extends EventLinksData {\n selected: boolean\n}\n\n/**\n * Describe place for language\n * @param place\n * @param language\n */\nconst describePlace = (place: IPlace, language: Language): string | undefined => {\n return `${place.languages[language].name}, ${place.languages[language].administrative_area_level_2}, ${place.languages[language].administrative_area_level_1}, ${place.country_code}`\n}\n\n/**\n * Get Place information based on an event and the language\n */\nexport const infoFromPlace = (personEvent: PersonEvent, language: Language): PlaceFormData => {\n const place = personEvent.extend_place as IPlace;\n const placeInfo = place.languages[language]\n\n\n // Community is the lowest available area, sublocality > locality > admin_area_level_2\n // Area will the the first available area above the community\n return {\n community: placeInfo.sublocality || placeInfo.locality || placeInfo.administrative_area_level_2 || '',\n area: (placeInfo.sublocality ? placeInfo.locality : undefined) || placeInfo.administrative_area_level_2 || placeInfo.administrative_area_level_1 || '',\n countryCode: place.country_code,\n eventRef: personEvent._id\n }\n}\n\n/**\n * Return the different possible area values from a place\n */\nexport const areasFromPlace = (personEvent: PersonEvent, language: Language): string[] => {\n let results: string[] = [];\n const place = personEvent.extend_place as IPlace;\n const placeInfoForLanguage = place.languages[language];\n if (placeInfoForLanguage.locality && placeInfoForLanguage.sublocality) {\n results.push(placeInfoForLanguage.locality)\n }\n if (placeInfoForLanguage.administrative_area_level_2) {\n results.push(placeInfoForLanguage.administrative_area_level_2)\n }\n if (placeInfoForLanguage.administrative_area_level_1) {\n results.push(placeInfoForLanguage.administrative_area_level_1)\n }\n return results;\n}\n\nexport const areasFromPersonWithEventId = (person: IPerson, id: string): string[] => {\n const personEvent = eventWithIdFromPerson(person, id);\n if (personEvent !== undefined) {\n return areasFromPlace(personEvent, 'nl')\n } else {\n return []\n }\n}\n\n\n/**\n * Describe person event\n * @param event\n */\nconst describePersonEvent = (event: PersonEvent): string | undefined => {\n\n if (!event.extend_place)\n return undefined\n\n if (Object.keys(event.extend_place).length === 0)\n return undefined\n\n const translationKey = ('event.' + event.type) as TranslationKey\n const typeAsString: string = T(translationKey)\n\n return typeAsString + ' ' + T('event.at') + ' ' + describePlace(event.extend_place as IPlace, 'nl')\n}\n\n\n/**\n * get the event with id from the person events\n */\nexport const eventWithIdFromPerson = (person: IPerson, id: string): PersonEvent | undefined => {\n return person.events?.find((el) => el._id === id)\n}\n\n/**\n * Generate event links form person data\n * @param person\n */\nexport const eventLinksFromPersonEvents = (person?: IPerson) : EventLinksData[] => {\n if (person === undefined) {\n return []\n }\n\n if (person.events === undefined) {\n return []\n }\n\n return person.events\n // filter only the valid event types\n .filter((el, index) => {\n return (el.extend_place !== undefined) &&\n (el.type === PersonEventType.Born || el.type === PersonEventType.School || el.type === PersonEventType.Work || el.type === PersonEventType.Where)\n })\n // convert to event descriptions\n .map((el, index) => {\n if (el.extend_place !== undefined) {\n return {\n text: describePersonEvent(el) || '',\n eventId: el._id,\n event: el\n }\n } else {\n // will never happen because of the preceding filter\n return {\n text: '',\n }\n }\n });\n}\n","import React from \"react\";\nimport { ButtonLink } from \"../../../components/ButtonLink\";\n\ninterface StringsListProps {\n data: string[]\n onClick: (selected: number) => void;\n}\n\nexport const StringsListView = (props: StringsListProps ) => {\n const buttonLinkStyle = {\n fontSize:'14px',\n textDecorationLine: 'underline',\n marginLeft: 3,\n marginRight: 3\n }\n\n return <>\n {props.data.map((el, index) => (\n {props.onClick(index)}} style={buttonLinkStyle}>\n {el}\n )\n )}\n ;\n}\n","import React from 'react';\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface ColumnInputGroupProps {\n id: string;\n label: string;\n children: React.ReactNode;\n\n style?: React.CSSProperties;\n error?: string;\n info?: string;\n}\n\nexport function ColumnInputGroup(props: ColumnInputGroupProps) {\n const { id, label, children, style, error, info } = props;\n\n return (\n
\n \n
\n {children}\n {error && }\n {info && {info}}\n
\n
\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport api from '../../api';\nimport { ICountry } from '../../models/ICountry';\nimport { ColumnInputGroup } from './ColumnInputGroup';\nimport { SimpleAutocomplete } from './SimpleAutocomplete';\n\ninterface CountryInputProps {\n value: string;\n onChange: (value: string) => void;\n\n placeholder?: string;\n readOnly?: boolean;\n}\n\nexport function CountryInput(props: CountryInputProps) {\n const { value, onChange, placeholder, readOnly } = props;\n\n const [inputValue, setInputValue] = useState(value);\n\n const [countries, setCountries] = useState([]);\n const country = useMemo(() => countries.find(c => c.code === value), [countries, value]);\n\n useEffect(() => {\n api.getCountries().then(countries => {\n setCountries(countries);\n });\n }, []);\n\n useEffect(() => country && setInputValue(country.name), [country]);\n\n const options = useMemo(() => {\n const inputUpper = inputValue.toLocaleUpperCase();\n const filtered = countries.filter(country => country.name.toLocaleUpperCase().includes(inputUpper) || country.code === inputUpper);\n return filtered.slice(0, 10);\n }, [countries, inputValue]);\n\n return (\n country.code}\n itemValue={country => country.code}\n loading={countries.length === 0}\n renderItem={country => country.name}\n onSelect={(code, country) => {\n onChange(country.code);\n setInputValue(country.name);\n }}\n onInputChange={setInputValue}\n onBlur={() => country && setInputValue(country.name)}\n readOnly={readOnly}\n />\n );\n}\n\ninterface CountryInputGroupProps {\n id: string;\n label: string;\n\n value: string;\n onChange: (value: string) => void;\n\n placeholder?: string;\n readOnly?: boolean;\n error?: string;\n}\n\nexport function CountryInputGroup(props: CountryInputGroupProps) {\n const { id, label, value, onChange, placeholder, readOnly, error } = props;\n\n return (\n \n \n \n );\n}\n","import React from 'react';\nimport { FormCard } from '../../../components/FormCard';\nimport { Icon } from '../../../components/Icons';\nimport { T } from '../../../Translate';\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { Alert, Col, Container, Form, Row } from \"react-bootstrap\";\nimport { TextInputColumn } from \"../../../components/inputs/TextInputColumn\";\nimport { TextView } from \"../../ViewPerson/TextView\";\nimport { EventLinksView } from \"./EventLinksView\";\nimport { IPerson } from \"../../../models/Person\";\nimport {\n areasFromPersonWithEventId,\n EventLinksDataWithSelected,\n eventLinksFromPersonEvents,\n infoFromPlace\n} from \"./EventLinks\";\nimport { StringsListView } from \"./StringsListView\";\nimport { IPersonPlaceErrors } from \"./PersonPlaceData\";\nimport { CountryInputGroup } from '../../../components/inputs/CountryInput';\n\nexport interface PlaceFormData {\n community: string\n area: string\n countryCode: string\n eventRef?: string\n}\n\nexport interface PlaceFormProps {\n personStory?: IPersonStory2\n person?: IPerson\n onUpdate: (data: PlaceFormData) => void\n readOnly: boolean;\n errors: IPersonPlaceErrors\n}\n\n\nexport const PlaceForm = (props: PlaceFormProps) => {\n const {\n personStory,\n person,\n onUpdate,\n readOnly,\n errors\n } = props;\n\n if (personStory === undefined)\n return <>;\n\n const { community, area, country_code } = personStory as IPersonStory2;\n\n /**\n * Community TextInput changed event handler\n * @param newName\n */\n function communityUpdate(newName:string) {\n onUpdate({community: newName, area: personStory?.area ?? '', countryCode: personStory?.country_code ?? ''})\n }\n\n /**\n * Area TextInput changed event handler\n * @param newName\n */\n function areaUpdate(newName:string) {\n onUpdate({community: personStory?.community ?? '', area: newName, countryCode: personStory?.country_code ?? ''})\n }\n\n /**\n * Country Code TextInput changed event handler\n * @param newName\n */\n function countryCodeUpdate(newName:string) {\n onUpdate({community: personStory?.community ?? '', area: personStory?.area ?? '', countryCode: newName})\n }\n\n /**\n * EventLinksView event handler\n * @param index - the index of the event link clicked\n */\n const handleEventClick = (index: number) => {\n const data = eventLinksFromPersonEvents(person);\n if (index >= data.length) {\n // in this case the user pressed the 'none of these' option\n props.onUpdate({\n community: '',\n area: '',\n countryCode: '',\n eventRef: undefined\n })\n } else {\n\n const selectedElement = data[index]\n const selectedEvent = selectedElement.event\n\n if (selectedEvent === undefined) {\n props.onUpdate({\n community: '',\n area: '',\n countryCode: '',\n eventRef: undefined\n })\n } else {\n props.onUpdate(infoFromPlace(selectedEvent, 'nl'))\n }\n }\n }\n\n const handleAreaLinkClick = (index: number) => {\n const areas = generateAreaLinks();\n const area = areas[index];\n props.onUpdate({\n community: personStory.community,\n area: area,\n countryCode: personStory.country_code,\n eventRef: personStory.place_source_event_ref\n })\n\n }\n\n /**\n * Helper method to generate the EventLinksDataWithSelected[] requested by the EventLinksView component\n * @param person\n */\n const generateEventLinksData = (person?: IPerson): EventLinksDataWithSelected[] => {\n if (person === undefined) {\n return []\n }\n\n // add the selected property to the eventlinksdata\n let data = eventLinksFromPersonEvents(person)\n let newData: EventLinksDataWithSelected[] = data.map((el, index) => {\n return {...el, selected: props.person ? el.eventId === props.personStory?.place_source_event_ref : false}\n });\n\n // add the 'none of these' option to the event links\n /*newData.push({\n text: T('personstories.noneOfThese'),\n eventId: undefined,\n event: undefined,\n selected: props.personStory?.place_source_event_ref === undefined\n });*/\n\n return newData\n }\n\n /**\n * Get the list of area names to be shown underneath the area input field.\n */\n const generateAreaLinks = (): string[] => {\n if (person === undefined) {\n return []\n }\n if (personStory.place_source_event_ref === undefined) {\n return []\n }\n return areasFromPersonWithEventId(person, personStory.place_source_event_ref)\n }\n\n /**\n * Render function for the place identity section\n */\n function renderIdentityForm() {\n return (\n \n\n \n \n \n
\n
\n
\n \n
\n
\n\n
\n
\n \n
\n
\n \n \n {!readOnly && }\n \n \n \n
\n \n
\n
\n\n
\n \n {!readOnly && (\n \n \n {errors.placeEventError && (\n {T('page.personstory.eventIsRequired')}\n )}\n \n \n )}\n
\n
\n
\n )\n }\n\n return renderIdentityForm();\n};\n","import React from 'react';\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { PersonForm, PersonFormData } from \"./PersonForm\";\nimport { PlaceForm, PlaceFormData } from \"./PlaceForm\";\nimport { IPerson } from \"../../../models/Person\";\nimport { IPersonPlaceErrors } from \"./PersonPlaceData\";\n\n\nexport interface PersonPlaceTabProps {\n personStory?: IPersonStory2;\n person?: IPerson;\n errors: IPersonPlaceErrors;\n readOnly: boolean;\n onUpdatePerson: (data: PersonFormData) => void;\n onUpdatePlace: (data: PlaceFormData) => void;\n}\n\nexport const PersonPlaceTab = (props: PersonPlaceTabProps) => {\n const { personStory, person, errors, readOnly, onUpdatePerson, onUpdatePlace } = props;\n\n return <>\n \n \n ;\n};\n","import { getErrorDescription, IValidationResult } from \"../../../models/ValidationResult\";\nimport { Language } from \"../../../models/PersonStory2\";\nimport { StoryIndex } from \"./StoryTextView\";\n\nexport interface IStoryErrors {\n story1Error?: string\n story2Error?: string\n storyStatusError?: string\n childStory1Error?: string\n childStory2Error?: string\n childStoryStatusError?: string\n}\n\nexport interface IStoriesErrors {\n nl?: IStoryErrors\n fr?: IStoryErrors\n de?: IStoryErrors\n en?: IStoryErrors\n}\n\nexport interface IImageErrors {\n profileImage?: string;\n mapImage?: string;\n}\n\nexport interface IKeyStoryErrors {\n keyPosition?: string;\n linkedContactPerson?: string;\n}\n\nexport function hasImageErrors(errors: IImageErrors) {\n return errors.profileImage !== undefined || errors.mapImage !== undefined;\n}\n\nexport class StoriesErrorsWrapper {\n storiesErrors?: IStoriesErrors;\n\n constructor(storiesErrors?: IStoriesErrors) {\n this.storiesErrors = storiesErrors\n }\n\n errorsCount(): number {\n if (this.storiesErrors === undefined)\n return 0;\n\n let count = 0;\n for (const key in this.storiesErrors) {\n if (this.storiesErrors[key as keyof IStoriesErrors] !== undefined) {\n count++;\n }\n }\n return count\n }\n\n getStoryStatusErrorMessage(language: Language, index: StoryIndex) {\n if (!this.storiesErrors) {\n return undefined\n }\n if (this.storiesErrors[language]) {\n if (index === StoryIndex.STORY_1) {\n return this.storiesErrors[language]?.storyStatusError\n } else {\n return this.storiesErrors[language]?.childStoryStatusError\n }\n }\n }\n\n getStoryTextErrorMessage(language: Language, index: StoryIndex) {\n if (!this.storiesErrors) {\n return undefined\n }\n if (this.storiesErrors[language]) {\n switch (index) {\n case StoryIndex.STORY_1:\n return this.storiesErrors[language]?.story1Error;\n case StoryIndex.STORY_2:\n return this.storiesErrors[language]?.story2Error;\n case StoryIndex.STORY_CHILD_1:\n return this.storiesErrors[language]?.childStory1Error;\n case StoryIndex.STORY_CHILD_2:\n return this.storiesErrors[language]?.childStory2Error;\n default:\n return undefined\n }\n }\n return undefined\n }\n\n languagesWithErrors(): Language[] {\n if (!this.storiesErrors) {\n return []\n }\n return Object.keys(this.storiesErrors).map((key) => key as Language);\n }\n}\n\n\nexport const storiesErrorsCount =(storiesErrors?: IStoriesErrors): number => {\n if (!storiesErrors)\n return 0;\n return new StoriesErrorsWrapper(storiesErrors).errorsCount()\n}\n\n\nexport const storyErrorsFromValidationResult = (result: IValidationResult): IStoriesErrors => {\n if (!result.data)\n return {}\n\n const languageStrings = ['nl', 'fr', 'de', 'en']\n let storiesErrors: IStoriesErrors = {}\n\n for (var index in languageStrings) {\n\n let errorFound = false\n let storyError: IStoryErrors = {}\n const languageString = languageStrings[index]\n\n const storyStatusErrorName = `storyText.${languageString}.storyStatus`\n if (result.data[storyStatusErrorName]) {\n storyError.storyStatusError = getErrorDescription(result.data[storyStatusErrorName])\n errorFound = true\n }\n\n const storyPart1ErrorName = `storyText.${languageString}.storyPart1`;\n if (result.data[storyPart1ErrorName]) {\n storyError.story1Error = getErrorDescription(result.data[storyPart1ErrorName])\n errorFound = true\n }\n const storyPart2ErrorName = `storyText.${languageString}.storyPart2`;\n if (result.data[storyPart2ErrorName]) {\n storyError.story2Error = getErrorDescription(result.data[storyPart2ErrorName])\n errorFound = true\n }\n\n const storyChildStatusErrorName = `storyText.${languageString}.storyChildStatus`\n if (result.data[storyChildStatusErrorName]) {\n storyError.childStoryStatusError = getErrorDescription(result.data[storyChildStatusErrorName])\n errorFound = true\n }\n\n const storyChildPart1ErrorName = `storyText.${languageString}.storyChildPart1`\n if (result.data[storyChildPart1ErrorName]) {\n storyError.childStory1Error = getErrorDescription(result.data[storyChildPart1ErrorName])\n errorFound = true\n }\n const storyChildPart2ErrorName = `storyText.${languageString}.storyChildPart2`\n if (result.data[storyChildPart2ErrorName]) {\n storyError.childStory2Error = getErrorDescription(result.data[storyChildPart2ErrorName])\n errorFound = true\n }\n\n if (errorFound) {\n storiesErrors[languageString as keyof IStoriesErrors] = storyError\n }\n }\n\n return Object.keys(storiesErrors).length === 0 ? {} : storiesErrors\n}\n","import { T } from \"../../../Translate\";\nimport React from \"react\";\nimport { StoryStatus } from \"../../../models/PersonStory2\";\nimport { Badge } from \"react-bootstrap\";\n\nexport interface PersonStoryStatusViewProps {\n storyStatus: StoryStatus\n}\n\nexport const PersonStoryStatusView = (props: PersonStoryStatusViewProps) => {\n\n let title = T(\"personstories.status.inprogress\");\n let variant: 'secondary' | 'warning' | 'success' = 'secondary';\n switch(props.storyStatus) {\n case StoryStatus.IN_PROGRESS:\n break;\n case StoryStatus.IN_REVIEW:\n title = T(\"personstories.status.inreview\");\n variant = 'warning';\n break;\n case StoryStatus.DONE:\n title = T(\"personstories.status.done\");\n variant='success'\n }\n return ({title})\n}\n","import React, { CSSProperties } from 'react';\nimport { StoryStatus } from \"../../../models/PersonStory2\";\nimport { T } from \"../../../Translate\";\nimport { Form } from \"react-bootstrap\";\nimport { InvalidFeedback } from \"../../../components/inputs/InvalidFeedback\";\nimport { PersonStoryStatusView } from \"./PersonStoryStatusView\";\n\n\nexport interface StoriesStatusProps {\n storyStatus?: StoryStatus\n labelText?: string\n infoText?: string\n error?: string\n readOnly: boolean;\n onUpdateStatus: (newStatus: StoryStatus) => void\n}\n\nconst labelStyle: CSSProperties = {\n fontSize: 14,\n color: '#9A9A9A',\n textTransform: \"uppercase\",\n}\n\nconst controlStyle: CSSProperties = {\n marginRight: 50,\n color: '#9A9A9A',\n}\n\nconst textStyle: CSSProperties = {\n color: '#9A9A9A',\n}\n\nexport const StoriesStatus = (props: StoriesStatusProps) => {\n const { storyStatus, error, readOnly, onUpdateStatus } = props;\n\n /** render **/\n\n const formControlClassName = error ? 'form-control is-invalid' : 'form-control';\n const labelText = props.labelText ?? T('generic.status')\n const infoText = props.infoText\n const currentStoryStatus = storyStatus || StoryStatus.IN_PROGRESS\n\n return (\n
\n \n {labelText}\n {infoText && (\n \n {infoText}\n \n )}\n onUpdateStatus(e.currentTarget.value as StoryStatus)}\n disabled={readOnly}\n >\n \n \n \n \n {error && }\n \n
\n )\n};\n","import React, { CSSProperties } from 'react';\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { T } from \"../../../Translate\";\nimport { Form } from \"react-bootstrap\";\n\n\nexport interface StoriesCheckboxProps {\n personStory?: IPersonStory2;\n readOnly?: boolean;\n onUpdateStories: (personStory: Partial) => void;\n}\n\nexport const StoriesCheckbox = (props: StoriesCheckboxProps) => {\n\n const checkStyle: CSSProperties = {\n fontSize: 14,\n color: '#9A9A9A',\n textTransform: \"uppercase\",\n paddingLeft: 0\n }\n\n const textStyle: CSSProperties = {\n color: '#9A9A9A',\n }\n\n const { personStory, readOnly, onUpdateStories } = props;\n\n /** event handling **/\n\n const onStatusChanged = (newStatus: boolean) => {\n onUpdateStories({story_child_option: newStatus})\n }\n\n const handleReferenceTypeChanged = (e: React.SyntheticEvent) => {\n const status = e.currentTarget.checked;\n onStatusChanged(status)\n };\n\n return (\n \n
\n \n
\n {personStory?.story_child_option === false &&\n \n {T('personstories.check.childrenStories.description')}\n \n }\n
\n );\n};\n","import React, { useState } from 'react';\nimport { IPersonStory2, Language, StoryStatus } from \"../../../models/PersonStory2\";\nimport { IStoriesErrors, StoriesErrorsWrapper } from \"./StoriesData\";\nimport { StoriesStatus } from \"./StoriesStatus\";\nimport { Col, Row } from \"react-bootstrap\";\nimport { LanguageSelector } from \"./LanguageSelector\";\nimport { StoryIndex, StoryTextView } from \"./StoryTextView\";\nimport { StoriesCheckbox } from \"./StoriesCheckbox\";\nimport { T } from \"../../../Translate\";\nimport { PersonStoryWrapper } from \"../../../models/wrappers/PersonStoryWrapper\";\nimport { PersonStoryStatusViewForLanguages } from \"./PersonStoryStatusForLanguagesView\";\n\n\nexport interface StoriesTabProps {\n personStory?: IPersonStory2\n errors?: IStoriesErrors\n readOnly: boolean;\n onUpdateStories: (personStory: Partial) => void\n}\n\n\nexport const StoriesTab = (props: StoriesTabProps) => {\n\n const { personStory, errors, readOnly, onUpdateStories } = props;\n\n /** State **/\n const [language, setLanguage] = useState(Language.NL)\n\n /** Event Handlers **/\n\n const handleOnUpdateStory = (personStory: Partial) => {\n onUpdateStories(personStory);\n }\n\n const handleOnUpdateLanguage = (newLanguage: Language) => {\n setLanguage(newLanguage);\n }\n\n const onUpdateStatus = (newStatus: StoryStatus, storyIndex: StoryIndex) => {\n updateStoryWithStatus(newStatus, storyIndex)\n if (personStory !== undefined) {\n handleOnUpdateStory(personStory)\n }\n }\n\n const updateStoryWithStatus = (newStatus: StoryStatus, index: StoryIndex) => {\n if (personStory === undefined)\n return;\n const personStoryWrapper = new PersonStoryWrapper(personStory)\n personStoryWrapper.updateStoryWithStatus(newStatus, index, language)\n }\n\n /** Helpers **/\n\n const getStatus = (index: StoryIndex) => {\n const personStoryWrapper = new PersonStoryWrapper(personStory!)\n return personStoryWrapper.getStoryStatus(index,language)\n }\n\n const storiesErrors = new StoriesErrorsWrapper(errors);\n\n return <>\n \n \n \n \n \n \n \n \n \n \n \n \n onUpdateStatus(newStatus, StoryIndex.STORY_1)}\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n {personStory?.story_child_option === true && (\n \n \n \n \n \n onUpdateStatus(newStatus, StoryIndex.STORY_CHILD_1)}\n />\n \n \n \n )}\n {personStory?.story_child_option === true &&\n \n \n \n \n \n }\n ;\n};\n","\nexport interface IPersonPlaceErrors {\n firstNameError?: string\n familyNameError?: string\n communityError?: string\n areaError?: string\n countryCodeError?: string\n placeEventError?: string;\n}\n\nexport const personPlaceErrorsCount =(personPlaceErrors?: IPersonPlaceErrors): number => {\n if (personPlaceErrors === undefined)\n return 0\n\n let count = 0\n for (const key in personPlaceErrors) {\n if (personPlaceErrors[key as keyof IPersonPlaceErrors] !== undefined) {\n count++;\n }\n }\n return count\n}\n\n","import React, { CSSProperties, useCallback } from 'react';\nimport { useElementID } from '../../utils/ElementID';\n\ninterface CheckboxInputProps {\n label: string;\n value: boolean;\n readOnly?: boolean;\n onChange?: (checked: boolean) => void;\n labelStyle?: CSSProperties;\n}\n\nexport default (props: CheckboxInputProps) => {\n const {\n label,\n value,\n readOnly,\n onChange,\n labelStyle\n } = props;\n\n const id = useElementID('input');\n return (\n
\n \n
\n );\n}\n","import React, { CSSProperties } from 'react';\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { T } from \"../../../Translate\";\nimport { Form } from \"react-bootstrap\";\nimport { TextStyles } from \"../../../config/styles\";\nimport CompactCheckboxInput from '../../../components/inputs/CompactCheckboxInput';\n\n\nexport interface SummaryCheckboxProps {\n personStory?: IPersonStory2\n}\n\nconst checkStyle: CSSProperties = {\n fontSize: 14,\n color: '#9A9A9A'\n}\n\nexport const SummaryCheckbox = (props: SummaryCheckboxProps) => {\n const { personStory } = props;\n\n const publishTargets = personStory?.targets || [];\n const published = personStory?.published_date !== null && personStory?.published_date !== undefined;\n const publishedToMuseum = published && publishTargets.includes('museum');\n const publishedToKey = published && publishTargets.includes('key'); \n\n return (\n \n \n \n {personStory?.published_date !== null && personStory?.published_date !== undefined &&\n \n {T('personstories.check.published.description.published') +\n new Date(personStory.published_date).toLocaleDateString() + ' ' +\n new Date(personStory.published_date).toLocaleTimeString()}\n \n }\n {!published && (\n \n {T('personstories.check.published.description.unpublished')}\n \n )}\n \n );\n};\n","import React from 'react';\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { Button, Col, Row } from \"react-bootstrap\";\nimport { T } from \"../../../Translate\";\nimport { SummaryCheckbox } from \"./SummaryCheckbox\";\nimport { getPageLink, PageID } from \"../../../utils/PageLinking\";\nimport { TextStyles } from \"../../../config/styles\";\nimport { Link } from \"react-router-dom\";\n\n\nexport interface SummaryTabProps {\n personStory?: IPersonStory2\n onUnpublishedButtonClicked: () => void\n}\n\n\nexport const SummaryTab = (props: SummaryTabProps) => {\n const { personStory, onUnpublishedButtonClicked } = props;\n\n const publishTargets = personStory?.targets || [];\n const published = personStory?.published_date !== null && personStory?.published_date !== undefined;\n const publishedToMuseum = published && publishTargets.includes('museum');\n const publishedToKey = published && publishTargets.includes('key'); \n\n return <>\n {/*The published status*/}\n \n \n
STATUS
\n \n \n
\n\n {/* Only visible when published */}\n {personStory?.published_date !== null && personStory?.published_date !== undefined && (\n <>\n {/* Links to pubic stories */}\n \n \n
LINKS
\n
\n {publishedToMuseum && (\n
\n \n {T('page.personstory.publicmuseum.link')}\n \n
\n )}\n {publishedToMuseum && personStory?.story_child_option &&\n
\n \n {T('page.personstory.publicmuseum.child.link')}\n \n
\n }\n {publishedToKey && (\n
\n \n {T('page.personstory.publickey.link')}\n \n
\n )}\n {/*-- not (yet) necessary -- publishedToKey && personStory?.story_child_option &&\n
\n \n {T('page.personstory.publickey.child.link')}\n \n
\n */}\n
\n \n
\n {/* Unpublish button */}\n \n \n \n \n \n \n )}\n ;\n};\n","import React from 'react';\nimport styles from './AddPhotoControl.module.scss';\n\ninterface AddPhotoControlProps {\n onClick: () => void;\n}\nexport default (props: AddPhotoControlProps) => {\n const { onClick } = props;\n return (\n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n
\n );\n};\n","export default __webpack_public_path__ + \"static/media/template1.f55fc581.png\";","export default __webpack_public_path__ + \"static/media/template2.0f9ab299.png\";","export default __webpack_public_path__ + \"static/media/template3.d38b0f62.png\";","import React from 'react';\nimport { ModalProps, useModal } from '../../../modals/BaseModal';\nimport { Modal, Col, Row } from 'react-bootstrap';\nimport { T } from '../../../Translate';\nimport { ModalHeader } from '../../../modals/ModalHeader';\n\ninterface ChooseTemplateModalProps extends ModalProps {\n options: { value: number, image: string }[];\n}\n\nexport default (props: ChooseTemplateModalProps) => {\n const { options } = props;\n const [isOpen, resolve] = useModal(props);\n return (\n resolve(undefined)} size='xl'>\n {T('page.personstory.editPersonPhoto.chooseTemplate')}\n \n \n {options.map(option => (\n \n resolve(option.value)}\n style={{\n width: '100%',\n border: '2px solid #888',\n cursor: 'pointer'\n }}\n />\n \n ))}\n \n \n \n );\n}\n","import React, { useMemo } from 'react';\nimport { ChosenDocumentPhoto } from './ChosenPhoto';\nimport styles from './AddPhotoControl.module.scss';\nimport { IDocumentPage } from '../../../models/Document';\n\ninterface ChoosePhotoItemProps {\n item: ChosenDocumentPhoto;\n onClicked: (item: ChosenDocumentPhoto) => void;\n}\n\nexport default (props: ChoosePhotoItemProps) => {\n const { item, onClicked } = props;\n const url = useMemo(\n () => (item.document.elements[item.page] as IDocumentPage).url_resized,\n [item]\n );\n\n return (\n
\n
onClicked(item)}>\n {url && }\n
\n
\n );\n}\n","import React, { useMemo, useState, useEffect, useCallback } from 'react';\nimport { ModalProps, useModal } from '../../../modals/BaseModal';\nimport { Modal } from 'react-bootstrap';\nimport { ModalHeader } from '../../../modals/ModalHeader';\nimport { T } from '../../../Translate';\nimport { AttachmentFileUploader, DocumentFileUploader } from '../../../components/FileUploader';\nimport styles from './ChoosePhotoModal.module.scss';\n\nimport { IDocument } from '../../../models/Document';\nimport { NotificationManager } from 'react-notifications';\nimport { IDocumentTag } from '../../../models/DocumentTag';\nimport { IDocumentReference, DocumentReferenceType, DocumentReferenceRelation } from '../../../models/DocumentReference';\nimport { Person } from '../../../models/Person';\nimport api from '../../../api';\nimport { ChosenDocumentPhoto, ChosenPhoto } from './ChosenPhoto';\nimport ChoosePhotoItem from './ChoosePhotoItem';\nimport { Colors, TextStyles } from \"../../../config/styles\";\nimport { Icon } from \"../../../components/Icons\";\nimport { IAttachment } from '../../../models/Attachment';\n\ninterface ChoosePhotoModalProps extends ModalProps {\n person: Person;\n storyId: string;\n createAsDocument: boolean;\n}\n\nexport default (props: ChoosePhotoModalProps) => {\n const { person, storyId, createAsDocument } = props;\n const [isOpen, resolve] = useModal(props);\n\n const handleDocumentUploaded = (document: IDocument|'NOK') => {\n if (document === 'NOK') {\n NotificationManager.error(T('page.personstory.editPersonPhoto.uploadFailed'));\n } else {\n resolve({ source: 'document', document, page: 0 });\n }\n };\n\n const handleAttachmentUploaded = (attachment: IAttachment[]|'NOK') => {\n if (attachment === 'NOK') {\n NotificationManager.error(T('page.personstory.editPersonPhoto.uploadFailed'));\n } else {\n resolve({ source: 'temporary', attachment: attachment[0] });\n }\n }\n\n const tags: IDocumentTag[] = useMemo(() => [{ tag: 'unprocessedConverted', fields: {} }], []);\n const references: IDocumentReference[] = useMemo(() => [{\n _id: person.id,\n type: DocumentReferenceType.Person,\n name: person.name,\n relation: DocumentReferenceRelation.None,\n comment: ''\n }], [person]);\n\n const handleClickedPhoto = useCallback((item: ChosenPhoto) => {\n resolve(item);\n }, [resolve]);\n\n const [documents, setDocuments] = useState([]);\n useEffect(() => {\n api.getDocumentsRelatedTo('person', person.id, ['generateUrl']).then(setDocuments);\n }, [person.id]);\n const pages: ChosenDocumentPhoto[] = useMemo(() => {\n const result: ChosenDocumentPhoto[] = [];\n for (let document of documents) {\n document.elements.forEach((element, index) => {\n if (element.type === 'page' && element.url_resized !== null) {\n result.push({\n source: 'document',\n document,\n page: index\n });\n }\n });\n }\n return result;\n }, [documents]);\n\n const pageViews = useMemo(() => {\n return pages.map(page => (\n \n ))}, [pages, handleClickedPhoto]);\n\n const documentsViews = useMemo(() => {\n if (pageViews.length === 0) {\n return (\n
\n

\n \n {T('personstories.images.noProfileDocumentsAvailable')}\n

\n
\n )\n } else {\n return (\n
\n {pageViews}\n
\n )\n }\n }, [pageViews])\n\n return (\n resolve(undefined)}>\n {T('page.personstory.editPersonPhoto.choosePhoto')}\n \n

{T('page.personstory.editPersonPhoto.choosePhoto.fromDocumentation')}

\n {documentsViews}\n

{T('page.personstory.editPersonPhoto.choosePhoto.upload')}

\n {createAsDocument ? (\n \n ) : (\n \n )}\n
\n
\n );\n}\n","import React, { useRef, useMemo, useEffect } from 'react';\nimport { useRefresh } from '../../../utils/Functional';\n\ninterface PhotoPreviewProps {\n x: number;\n y: number;\n width: number;\n height: number;\n\n targetWidth: number;\n targetHeight: number;\n\n setPosition: (x: number, y: number) => void;\n setSize: (width: number, height: number) => void;\n\n image: string|undefined;\n overlay: string|undefined;\n grayscale: boolean;\n\n onImageLoaded: (image: HTMLImageElement) => void;\n}\n\ninterface IDragInitState {\n startX: number;\n startY: number;\n startMouseX: number;\n startMouseY: number;\n}\n\nconst drawScale = 0.3;\n\nexport default (props: PhotoPreviewProps) => {\n const {\n x, y, width, height,\n targetWidth,\n targetHeight,\n image,\n overlay,\n grayscale,\n setPosition,\n setSize,\n onImageLoaded\n } = props;\n\n const ref = useRef(null);\n const dragInitState = useRef();\n\n const photoImage = useMemo(() => new Image(), []);\n const overlayImage = useMemo(() => new Image(), []);\n\n const renderCanvas = useRefresh(() => {\n const canvas = ref.current;\n if (canvas === null)\n return;\n\n const context = canvas.getContext('2d');\n if (context === null)\n return;\n\n // resulting size is 1080 x 1280, but the canvas is rendered at a fixed\n // size of 324 x 384, which is 30% of that size\n context.fillStyle = 'white';\n context.globalCompositeOperation = grayscale ? 'luminosity' : 'source-over';\n\n context.fillRect(0, 0, canvas.width, canvas.height);\n\n // Drawing an empty image does not work on Safari.\n if (photoImage.width !== 0) {\n context.drawImage(\n photoImage,\n x * drawScale,\n y * drawScale,\n width * drawScale,\n height * drawScale\n );\n }\n\n if (overlay && overlayImage.width !== 0) {\n context.drawImage(overlayImage, 0, 0, canvas.width, canvas.height);\n }\n });\n\n useEffect(() => {\n if (overlay) {\n overlayImage.src = overlay;\n overlayImage.addEventListener('load', renderCanvas);\n }\n }, [renderCanvas, overlay, overlayImage]);\n\n useEffect(renderCanvas, [x, y, width, height, grayscale]);\n\n useEffect(() => {\n if (image === undefined)\n return;\n\n if (image.length === 0)\n return;\n\n photoImage.src = image;\n photoImage.addEventListener('load', () => {\n onImageLoaded(photoImage);\n renderCanvas();\n });\n return () => photoImage.removeEventListener('load', renderCanvas);\n }, [renderCanvas, image, photoImage, onImageLoaded]);\n\n const setRef = (canvas: HTMLCanvasElement|null) => {\n ref.current = canvas;\n renderCanvas();\n };\n\n const handleCanvasMouseDown = (e: React.MouseEvent) => {\n dragInitState.current = {\n startX: x,\n startY: y,\n startMouseX: e.clientX,\n startMouseY: e.clientY\n };\n };\n\n const handleCanvasMouseMove = (e: React.MouseEvent) => {\n const initState = dragInitState.current;\n if (initState === undefined)\n return;\n\n const x = initState.startX + Math.round((e.clientX - initState.startMouseX) / drawScale);\n const y = initState.startY + Math.round((e.clientY - initState.startMouseY) / drawScale);\n setPosition(x, y);\n };\n\n const handleCanvasMouseUp = (e: React.MouseEvent) => {\n dragInitState.current = undefined;\n };\n\n const handleCanvasScroll = (e: React.WheelEvent) => {\n const canvas = ref.current;\n if (canvas === null)\n return;\n\n const scale = e.deltaY > 0 ? 0.9 : 1 / 0.9;\n\n // similar rescale calculation as found in ImageBrowser.tsx\n // only difference being that the canvas is drawn at a different scale,\n // so relativeX and relativeY must be scaled\n let rect = canvas.getBoundingClientRect();\n let relativeX = (e.clientX - rect.left) / drawScale;\n let relativeY = (e.clientY - rect.top) / drawScale;\n const newX = Math.round(relativeX - (relativeX - x) * scale);\n const newY = Math.round(relativeY - (relativeY - y) * scale);\n\n setPosition(newX, newY);\n setSize(Math.round(width * scale), Math.round(height * scale));\n };\n\n return (\n \n );\n}\n","import { IDocument, IDocumentPage } from \"../../../models/Document\";\nimport api from \"../../../api\";\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { IAttachment } from \"../../../models/Attachment\";\n\nexport enum PhotoDimension {\n Profile = 'profile', // 1080x1280\n Portrait = 'portrait', // 960x1280\n Landscape = 'landscape' // 1080x810\n}\n\nexport interface IPhotoMetadata {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n grayscale?: boolean;\n contrast?: number;\n template?: number;\n upscaled?: boolean;\n legend?: {[key: string]: string}|null;\n dimension?: PhotoDimension;\n}\n\nexport interface IPhotoSource {\n getUrl: () => string|undefined;\n\n save: (metadata?: IPhotoMetadata) => Promise;\n}\n\nexport class DocumentPhotoSource implements IPhotoSource {\n document: IDocument;\n page: number;\n\n storyId: string;\n target: number|'profile'|'new';\n\n constructor(document: IDocument, page: number, storyId: string, target: number|'profile'|'new') {\n this.document = document;\n this.page = page;\n\n this.storyId = storyId;\n this.target = target;\n }\n\n getUrl = () => {\n return (this.document.elements[this.page] as IDocumentPage).url_resized || undefined;\n }\n\n save = (metadata?: IPhotoMetadata) => {\n return api.importDocumentPhotoToPersonStory(this.storyId, this.target, this.document._id, this.page, metadata);\n }\n}\n\nexport class TemporaryPhotoSource implements IPhotoSource {\n attachment: IAttachment;\n\n storyId: string;\n target: number|'profile'|'new';\n\n constructor(attachment: IAttachment, storyId: string, target: number|'profile'|'new') {\n this.attachment = attachment;\n this.storyId = storyId;\n this.target = target;\n }\n\n getUrl = () => {\n return this.attachment.urls.original;\n }\n\n save = (metadata?: IPhotoMetadata) => {\n return api.importAttachmentToPersonStory(this.storyId, this.target, this.attachment._id, metadata);\n }\n}\n\nexport class StoryPhotoSource implements IPhotoSource {\n story: IPersonStory2;\n photo: 'profile'|number;\n\n constructor(story: IPersonStory2, photo: 'profile'|number) {\n this.story = story;\n this.photo = photo;\n }\n\n getUrl = () => {\n if (this.photo === 'profile') {\n return this.story.profile_image?.source_image_url;\n } else {\n const image = (this.story.extra_images || [])[this.photo];\n return image?.source_image_url;\n }\n }\n\n save = (metadata?: IPhotoMetadata) => {\n return api.updatePersonStoryPhoto(this.story._id, this.photo, metadata);\n }\n}\n","import React, { useRef, useState, useMemo, useCallback } from 'react';\nimport { useModal, ModalProps } from '../../../modals/BaseModal';\nimport { Modal, Button, Row, Col, Form } from 'react-bootstrap';\nimport { T } from '../../../Translate';\nimport { ModalHeader } from '../../../modals/ModalHeader';\nimport { ButtonRowModalFooter } from '../../../components/ButtonRow';\nimport { TextInputColumn } from '../../../components/inputs/TextInputColumn';\nimport CompactCheckboxInput from '../../../components/inputs/CompactCheckboxInput';\n\nimport template1image from '../../../assets/images/phototemplates/template1.png';\nimport template2image from '../../../assets/images/phototemplates/template2.png';\nimport template3image from '../../../assets/images/phototemplates/template3.png';\nimport { ButtonLink } from '../../../components/ButtonLink';\nimport ChooseTemplateModal from './ChooseTemplateModal';\nimport { useModalContext } from '../../../modals/ModalContext';\nimport ChoosePhotoModal from './ChoosePhotoModal';\nimport { Person } from '../../../models/Person';\nimport { ChosenPhoto } from './ChosenPhoto';\nimport EditPhotoPreview from './EditPhotoPreview';\nimport { IPhotoSource, DocumentPhotoSource, IPhotoMetadata, TemporaryPhotoSource, PhotoDimension } from './PhotoSource';\nimport { IPersonStory2, Language } from '../../../models/PersonStory2';\nimport { Icon } from '../../../components/Icons';\nimport { TextareaInput } from '../../../components/inputs/TextareaInput';\n\ninterface PersonPhotoModalProps extends ModalProps {\n person: Person;\n personStoryId: string;\n target: number|'profile'|'new';\n photo?: IPhotoSource;\n metadata?: IPhotoMetadata;\n captions?: {[key: string]: string};\n}\n\nfunction useParsedNumber(stringValue: string) {\n const lastCorrectValue = useRef(0);\n return useMemo(() => {\n const value = parseInt(stringValue);\n if (isNaN(value)) {\n return lastCorrectValue.current;\n } else {\n lastCorrectValue.current = value;\n return value;\n }\n }, [stringValue]);\n}\n\nconst defaultMetaForProfile: IPhotoMetadata = {\n template: 1,\n};\n\nconst defaultMetaForOther: IPhotoMetadata = {\n template: 0,\n dimension: PhotoDimension.Landscape\n};\n\nexport default (props: PersonPhotoModalProps) => {\n const {\n person,\n personStoryId,\n target,\n metadata = target === 'profile' ? defaultMetaForProfile : defaultMetaForOther,\n captions = {}\n } = props;\n\n const [isOpen, resolve] = useModal(props);\n const handleClose = () => resolve(undefined);\n const modals = useModalContext();\n\n const recalculateImageSize = useRef(false);\n\n const [dimension, setDimension] = useState(metadata.dimension || PhotoDimension.Profile);\n const { targetWidth, targetHeight } = useMemo(() => {\n switch (dimension) {\n case PhotoDimension.Portrait:\n return { targetWidth: 960, targetHeight: 1280 };\n case PhotoDimension.Landscape:\n return { targetWidth: 1080, targetHeight: 810 };\n case PhotoDimension.Profile:\n default:\n return { targetWidth: 1080, targetHeight: 1280 };\n }\n }, [dimension]);\n\n const [saving, setSaving] = useState(false);\n const [xAsString, setX] = useState((metadata.x || 0).toString());\n const [yAsString, setY] = useState((metadata.y || 0).toString());\n const [widthAsString, setWidth] = useState((metadata.width || targetWidth).toString());\n const [heightAsString, setHeight] = useState((metadata.height || targetHeight).toString());\n const [grayscale, setGrayscale] = useState(metadata.grayscale || false);\n const [template, setTemplate] = useState(metadata.template);\n const [photo, setPhoto] = useState(props.photo);\n const [ratioLock, setRatioLock] = useState(true);\n const [originalSize, setOriginalSize] = useState({\n width: metadata.width || targetWidth,\n height: metadata.height || targetHeight\n });\n\n const [captionNL, setCaptionNL] = useState(captions[Language.NL] || '');\n const [captionEN, setCaptionEN] = useState(captions[Language.EN] || '');\n const [captionFR, setCaptionFR] = useState(captions[Language.FR] || '');\n const [captionDE, setCaptionDE] = useState(captions[Language.DE] || '');\n\n\n const x = useParsedNumber(xAsString);\n const y = useParsedNumber(yAsString);\n const width = useParsedNumber(widthAsString);\n const height = useParsedNumber(heightAsString);\n\n const setWidthString = (widthString: string) => {\n if (ratioLock) {\n const width = parseInt(widthString)\n if (isNaN(width))\n return;\n\n const newHeight = Math.floor(width * originalSize.height / originalSize.width);\n setHeight(newHeight.toString());\n }\n\n setWidth(widthString);\n }\n\n const setHeightString = (heightString: string) => {\n if (ratioLock) {\n const height = parseInt(heightString)\n if (isNaN(height))\n return;\n\n const newWidth = Math.floor(height * originalSize.width / originalSize.height);\n setWidth(newWidth.toString());\n }\n\n setHeight(heightString);\n }\n\n const hasChanged = props.photo === undefined || props.metadata === undefined || (\n metadata.x !== x\n || metadata.y !== y\n || metadata.width !== width\n || metadata.height !== height\n || metadata.grayscale !== grayscale\n || metadata.template !== template\n || metadata.dimension !== dimension\n || props.photo !== photo\n || (captions[Language.NL] || '') !== captionNL\n || (captions[Language.EN] || '') !== captionEN\n || (captions[Language.FR] || '') !== captionFR\n || (captions[Language.DE] || '') !== captionDE\n );\n\n const handleClickedChooseTemplate = async () => {\n const options = [\n { value: 1, image: template1image },\n { value: 2, image: template2image },\n { value: 3, image: template3image }\n ];\n const template = await modals.show(\n props => \n );\n if (template === undefined)\n return;\n\n setTemplate(template);\n };\n\n const handleClickedChoosePhoto = async () => {\n const photo = await modals.show(props => (\n \n ));\n if (photo === undefined)\n return;\n\n recalculateImageSize.current = true;\n setX(\"0\");\n setY(\"0\");\n\n if (photo.source === 'document') {\n setPhoto(new DocumentPhotoSource(photo.document, photo.page, personStoryId, target));\n } else {\n setPhoto(new TemporaryPhotoSource(photo.attachment, personStoryId, target));\n }\n };\n\n const handlePositionChanged = useCallback((x: number, y: number) => {\n setX(x.toString());\n setY(y.toString());\n }, []);\n\n const handleSizeChanged = useCallback((width: number, height: number) => {\n setWidth(width.toString());\n setHeight(height.toString());\n }, []);\n\n const handlePhotoLoaded = useCallback((image: HTMLImageElement) => {\n setOriginalSize({ width: image.naturalWidth, height: image.naturalHeight });\n if (recalculateImageSize.current) {\n recalculateImageSize.current = false;\n const desiredAspectRatio = targetHeight / targetWidth;\n const photoAspectRatio = image.naturalHeight / image.naturalWidth;\n if (photoAspectRatio > desiredAspectRatio) {\n handleSizeChanged(\n Math.floor(targetWidth * desiredAspectRatio / photoAspectRatio),\n targetHeight);\n } else {\n handleSizeChanged(\n targetWidth,\n Math.floor(targetHeight * photoAspectRatio / desiredAspectRatio)\n );\n }\n }\n }, [handleSizeChanged, targetWidth, targetHeight]);\n\n const handleClickedLockRatio = () => setRatioLock(!ratioLock);\n\n const hasCaptions = target !== 'profile';\n const handleClickedSave = async () => {\n if (!photo)\n return;\n\n setSaving(true);\n try {\n const captions = hasCaptions ? {\n 'nl': captionNL,\n 'en': captionEN,\n 'fr': captionFR,\n 'de': captionDE\n } : undefined;\n \n const updatedStory = await photo.save({ x, y, width, height, template, grayscale, dimension, legend: captions });\n resolve(updatedStory);\n } catch {\n // TODO: error\n } finally {\n setSaving(false);\n }\n };\n\n const templateUrl = useMemo(() => {\n switch (template) {\n case 1: return template1image;\n case 2: return template2image;\n case 3: return template3image;\n default: return undefined;\n }\n }, [template]);\n\n return (\n \n {T('page.personstory.editPersonPhoto.title')}\n \n \n \n \n \n \n {target === 'profile' ? (\n \n {T('page.personstory.editPersonPhoto.chooseTemplate')}\n \n ) : (\n \n )}\n \n \n \n {T('page.personstory.editPersonPhoto.choosePhoto')}\n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n {T('page.personstory.editPersonPhoto.info')}\n
\n \n {hasCaptions && (\n \n
\n
\n \n \n \n \n \n
\n
\n \n )}\n \n \n \n \n \n \n );\n}\n","import React from 'react';\nimport styles from './AddPhotoControl.module.scss';\nimport { IPersonStoryImage } from '../../../models/PersonStory2';\nimport { getActiveLanguage } from '../../../Translate';\nimport { Icon } from '../../../components/Icons';\n\ninterface PhotoPreviewProps {\n item: IPersonStoryImage;\n readOnly: boolean;\n onClicked: () => void;\n onClickedDelete: () => void;\n}\n\nexport default (props: PhotoPreviewProps) => {\n const { item, readOnly, onClicked, onClickedDelete } = props;\n\n return (\n
\n
onClicked()}>\n \n {(item.legend && item.legend[getActiveLanguage()]) || <> }\n
\n {!readOnly && (\n
\n \n
\n )}\n
\n );\n}\n","import React, { CSSProperties } from 'react';\nimport styles from './AddPhotoControl.module.scss';\n\ninterface AddPassportPhotoControlProps {\n error: boolean;\n onClick: () => void;\n}\n\nexport default (props: AddPassportPhotoControlProps) => {\n const { error, onClick } = props;\n const infoStyle: CSSProperties = error ? {color: 'red'} : {};\n\n return (\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n verplicht!\n
\n
\n );\n}\n","import React from 'react';\nimport styles from './AddPhotoControl.module.scss';\n\ninterface SimpleImagePreviewProps {\n url: string;\n label?: string;\n onClick?: () => void;\n}\n\nexport default (props: SimpleImagePreviewProps) => {\n const { url, label, onClick } = props;\n\n return (\n
\n
\n \n {label || <> }\n
\n
\n );\n}\n","export default __webpack_public_path__ + \"static/media/personstory_map_placeholder.b251a160.png\";","import React, { useCallback, useMemo } from 'react';\nimport { useModalContext } from '../../../modals/ModalContext';\nimport AddPhotoControl from './AddPhotoControl';\nimport PersonPhotoModal from './PersonPhotoModal';\nimport { Person } from '../../../models/Person';\nimport { IPersonStory2 } from '../../../models/PersonStory2';\nimport PhotoPreview from './PhotoPreview';\nimport { StoryPhotoSource } from './PhotoSource';\nimport styles from './ChoosePhotoModal.module.scss';\nimport AddPassportPhotoControl from './AddPassportPhotoControl';\nimport { ConfirmationModal } from '../../../modals/Confirmation';\nimport { T } from '../../../Translate';\nimport api from '../../../api';\nimport SimpleImagePreview from './SimpleImagePreview';\nimport mapImagePlaceholder from '../../../assets/images/personstory_map_placeholder.png';\nimport { TextView } from '../../ViewPerson/TextView';\nimport { IImageErrors } from '../Stories/StoriesData';\n\ninterface PhotosTabProps {\n story?: IPersonStory2;\n person?: Person;\n readOnly: boolean;\n errors: IImageErrors;\n onChanged: (story: IPersonStory2) => void;\n}\nexport default (props: PhotosTabProps) => {\n const { story, person, readOnly, errors, onChanged } = props;\n const modals = useModalContext();\n\n const handleClickedAdd = async () => {\n if (!story || !person || readOnly)\n return;\n\n const updated = await modals.show(props => (\n \n ));\n if (updated) {\n onChanged(updated);\n }\n };\n\n const handleClickedPassport = async () => {\n if (!story || !person || readOnly)\n return;\n\n const updated = await modals.show(props => (\n \n ));\n if (updated) {\n onChanged(updated);\n }\n }\n\n const onClickedDelete = useCallback(async (index: number|'profile') => {\n if (!story)\n return;\n\n const confirmed = await modals.show(props => (\n \n ));\n if (confirmed) {\n const updated = await api.deletePersonStoryPhoto(story._id, index);\n onChanged(updated);\n }\n }, [modals, story, onChanged]);\n\n const extraPhotos = useMemo(() => {\n if (!story || !person)\n return [];\n\n const onClickedPhoto = async (index: number) => {\n if (readOnly)\n return;\n \n const photo = story.extra_images![index];\n const updated = await modals.show(props => (\n \n ));\n if (updated) {\n onChanged(updated);\n }\n };\n\n return (story.extra_images || []).map((photo, index) => (\n onClickedPhoto(index)}\n onClickedDelete={() => onClickedDelete(index)}\n />\n ));\n }, [story, person, modals, readOnly, onChanged, onClickedDelete]);\n\n const isSaved = story && story._id !== '';\n return (\n
\n {story && isSaved && (\n story.profile_image\n ? (\n onClickedDelete('profile')}\n />\n ) : (\n \n )\n )}\n {story && isSaved && }\n {extraPhotos}\n {story && isSaved && !readOnly && }\n {!isSaved && }\n
\n );\n}\n","import React from 'react';\nimport CompactCheckboxInput from '../../../components/inputs/CompactCheckboxInput';\nimport { getEventNameForPlace, PersonEvent } from '../../../models/PersonEvent';\nimport { IPlace, Place } from '../../../models/Place';\n\ninterface EventCheckboxProps {\n event: PersonEvent;\n linkedEventIds: string[];\n readOnly: boolean;\n onChanged: (checked: boolean, eventId: string) => void;\n}\n\nexport default (props: EventCheckboxProps) => {\n const { event, linkedEventIds, readOnly, onChanged } = props;\n const place = new Place(event.extend_place as IPlace).describe();\n return (\n onChanged(checked, event._id)}\n readOnly={readOnly}\n labelStyle={{ fontSize: '0.875rem' }}\n />\n );\n}\n","import React from 'react';\nimport { Badge } from 'react-bootstrap';\nimport { Icon } from '../../../components/Icons';\nimport { PersonStoryTag } from '../../../models/PersonStory2';\nimport { T, TranslationKey } from '../../../Translate';\nimport { classes } from '../../../utils/Styles';\nimport styles from './TagView.module.scss';\n\ninterface TagViewProps {\n tag: PersonStoryTag;\n readOnly: boolean;\n onClickedDelete: (tag: PersonStoryTag) => void;\n}\n\nexport default (props: TagViewProps) => {\n const { tag, readOnly, onClickedDelete } = props;\n\n return <>\n \n {T('storytag.' + tag as TranslationKey)}\n {' '}\n {!readOnly && onClickedDelete(tag)} />}\n \n  \n ;\n}\n","import React, { useMemo } from 'react';\nimport { FormCard } from '../../../components/FormCard';\nimport { Icon } from '../../../components/Icons';\nimport { SelectInputOnly } from '../../../components/inputs/SelectInput';\nimport { Person } from '../../../models/Person';\nimport { personEventSorter, PersonEventType } from '../../../models/PersonEvent';\nimport { IPersonStory2, PersonStoryTag, translatePersonStoryTag } from '../../../models/PersonStory2';\nimport { T } from '../../../Translate';\nimport { TextView } from '../../ViewPerson/TextView';\nimport EventCheckbox from './EventCheckbox';\nimport TagView from './TagView';\nimport CompactCheckboxInput from \"../../../components/inputs/CompactCheckboxInput\";\n\ninterface QualificationsTabProps {\n story?: IPersonStory2;\n person?: Person;\n readOnly: boolean;\n onChanged: (story: IPersonStory2) => void;\n}\n\nexport default (props: QualificationsTabProps) => {\n const { story, person, readOnly, onChanged } = props;\n\n const events = useMemo(() => {\n let events = (person && person.events) || [];\n events = events.filter(e => e.type !== PersonEventType.CWXRM);\n events.sort(personEventSorter);\n return events;\n }, [person]);\n\n const linkedEventIds = (story && story.coupling_use_events_with_places_refs) || [];\n const tags = (story && story.coupling_tags) || [];\n\n const handleChanged = (checked: boolean, id: string) => {\n const newLinkedEventIds = checked\n ? [...linkedEventIds, id]\n : linkedEventIds.filter(x => x !== id);\n onChanged(Object.assign({}, story, { coupling_use_events_with_places_refs: newLinkedEventIds }));\n };\n\n const handleChangedOrphan = (checked: boolean, id: string) => {\n const newLinkedEventIds = checked\n ? [...linkedEventIds, id]\n : linkedEventIds.filter(x => x !== id);\n onChanged(Object.assign({}, story, { coupling_use_events_with_places_refs: newLinkedEventIds }));\n };\n\n const handleTagSelected = (tag: string) => {\n const newTags = [...tags, tag];\n onChanged(Object.assign({}, story, { coupling_tags: newTags }));\n };\n\n const handleDeleteTag = (tag: string) => {\n const newTags = tags.filter(t => t !== tag);\n onChanged(Object.assign({}, story, { coupling_tags: newTags }));\n };\n\n const tagOptions = useMemo(() => {\n const result: JSX.Element[] = [\n \n ];\n for (var name in PersonStoryTag) {\n var value = PersonStoryTag[name as keyof typeof PersonStoryTag];\n if (tags.includes(value))\n continue;\n\n result.push();\n }\n return result;\n }, [tags]);\n\n return <>\n \n \n \n
\n {events.filter(ev => ev.place_id !== undefined && ev.extend_place).map(ev => (\n \n ))}\n
\n
\n {linkedEventIds.filter(id => !events.find(ev => ev._id === id)).map(id => (\n handleChangedOrphan(checked, id)}\n readOnly={readOnly}\n labelStyle={{ fontSize: '0.875rem' }}\n />\n ))}\n
\n
\n \n \n \n
\n {tags.map(tag => (\n \n ))}\n
\n {!readOnly && (\n \n )}\n
\n ;\n};\n","import React, { useState } from 'react';\nimport { AsyncTypeahead } from 'react-bootstrap-typeahead';\nimport api from '../../../api';\nimport { Person } from '../../../models/Person';\nimport { IPersonStory2 } from '../../../models/PersonStory2';\nimport { T } from '../../../Translate';\nimport { useElementID } from '../../../utils/ElementID';\n\ninterface SearchStoryInputProps {\n onSelected: (story: IPersonStory2) => void;\n excludePersonStoryIdList?: string[];\n}\n\ninterface SearchResult {\n item: IPersonStory2;\n name: string;\n}\n\nexport default (props: SearchStoryInputProps) => {\n const { onSelected } = props;\n\n const id = useElementID('typeahead');\n\n const [options, setOptions] = useState([]);\n const [loadingCounter, setLoadingCounter] = useState(0);\n\n const handleSearch = (query: string) => {\n if (query === '')\n return;\n\n setLoadingCounter(counter => counter + 1);\n\n api.findPersonStories2({}, 0, 20, undefined, query, ['person'])\n .then(stories => {\n // filter out the stories that must be excluded\n let filteredStories = stories.data;\n if (props.excludePersonStoryIdList) {\n filteredStories = filteredStories.filter(item => !props.excludePersonStoryIdList?.includes(item._id))\n }\n setOptions(filteredStories.map(item => ({\n item,\n name: (item.person && new Person(item.person).name) || '?'\n })));\n })\n .finally(() => {\n setLoadingCounter(counter => counter - 1);\n });\n };\n\n\n return (\n true}\n id={id}\n options={options}\n labelKey='name'\n selected={[]}\n placeholder={T('component.search.typeToSearch')}\n onSearch={handleSearch}\n onChange={selected => selected.length > 0 && onSelected(selected[0].item)}\n isLoading={loadingCounter > 0}\n />\n );\n}\n","import React, { useState } from 'react';\nimport { Alert, Modal, ModalBody } from 'react-bootstrap';\nimport { ModalProps, useModal } from '../../../modals/BaseModal';\nimport { ModalHeader } from '../../../modals/ModalHeader';\nimport { IPersonStory2 } from '../../../models/PersonStory2';\nimport { T } from '../../../Translate';\nimport { TextView } from '../../ViewPerson/TextView';\nimport SearchStoryInput from './SearchStoryInput';\n\ninterface SearchStoryModalProps extends ModalProps {\n withChildStoryOnly: boolean;\n excludePersonStoryIdList?: string[];\n}\n\nexport default (props: SearchStoryModalProps) => {\n const { withChildStoryOnly } = props;\n const [isOpen, resolve] = useModal(props);\n const [childStoryError, setChildStoryError] = useState(false);\n\n const handleSelected = (story: IPersonStory2) => {\n if (withChildStoryOnly && !story.story_child_option) {\n setChildStoryError(true);\n return;\n }\n resolve(story);\n };\n\n return (\n resolve(undefined)}>\n {T('page.personstory.linkTable.add.title')}\n \n \n \n {childStoryError && (\n \n {T('page.personstory.linkedStoryMustHaveChildStory')}\n \n )}\n \n \n );\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { IQueryResult } from '../../../models/Generic';\nimport api from '../../../api';\nimport { plural } from '../../../Translate';\nimport { Card } from 'react-bootstrap';\nimport { usePageState } from '../../../redux/Actions';\nimport { PageProps } from '../../Page';\nimport { useRefresh } from '../../../utils/Functional';\nimport { getPageLinkWithVia, PageID } from '../../../utils/PageLinking';\nimport { SortDirection, Table } from \"../../../components/table/Table\";\nimport { useDelayedUpdateEffect } from \"../../../utils/UpdateEffects\";\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { getPersonStoryColumns } from \"./Columns\";\n\n\nconst PageSize = 10;\nconst rowKey = (item: IPersonStory2, index: number) => item._id;\n\ninterface ListMatchingPersonStoriesProps extends PageProps {\n personStory?: IPersonStory2\n onMatchingItemsChanged?: (numberOfItems: number) => void\n}\n\n/**\n *\n */\nconst ListMatchingPersonStories = (props: ListMatchingPersonStoriesProps) => {\n\n /*** state ***/\n\n const [pageState, updatePageState] = usePageState('personStoryMatches');\n const [items, setItems] = useState>();\n const [personStory, setPersonStory] = useState(props.personStory);\n\n /*** variables ***/\n\n const { history, loading } = props;\n const { filter, tablePage, sortColumn, sortDirection } = pageState;\n\n /*** effects ***/\n useEffect(() => setPersonStory(props.personStory), [props.personStory])\n\n const refresh = useRefresh(() => {\n if (personStory === undefined || !personStory._id) {\n setItems({ data: [], total: 0 });\n return;\n }\n \n const { filter, sortColumn, sortDirection } = pageState;\n \n loading.loading(\n api.findMatchingPersonStories(\n personStory._id,\n tablePage * PageSize,\n PageSize,\n [[getSortColumn(sortColumn), sortDirection]],\n filter\n ), plural('memorial')\n ).then(data => {\n if (props.onMatchingItemsChanged) {\n props.onMatchingItemsChanged(data.total)\n }\n setItems(data);\n })});\n\n useEffect(refresh, [tablePage, sortColumn, sortDirection, personStory?._id]);\n\n useDelayedUpdateEffect(() => {\n refresh();\n updatePageState({tablePage: 0})},\n 500,\n [filter])\n\n // Dit lijkt me niet nodig en vernieuwt onnodig de pagina. Storend!\n // useEffect(refresh, [personStory]);\n\n\n /*** table handlers ***/\n\n const handlePageChanged = (page: number) => {\n updatePageState({ tablePage: page });\n };\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n updatePageState({ sortColumn: column, sortDirection: direction });\n };\n\n const handleClickedRow = (item: IPersonStory2) => {\n history.push(getPageLinkWithVia(PageID.EditPersonStory, item._id, PageID.EditPersonStory, props.personStory?._id));\n }\n\n /*** table helpers ***/\n\n const columns = useMemo(() => getPersonStoryColumns(false, () => {}), []);\n\n const getSortColumn = (column: string) => {\n switch (column) {\n default:\n return 'filter';\n case 'birthDate':\n return 'sort_born_date';\n case 'diedDate':\n return 'sort_died_date';\n }\n }\n\n /*** rendering ***/\n\n\n return (\n \n \n \n );\n}\n\nexport default ListMatchingPersonStories;\n","import React from \"react\";\nimport { Icon } from \"../../../components/Icons\";\nimport { ActionsTableColumn, ComponentTableColumn, ITableColumn, StringTableColumn, tableRowActions, TableRowActionStyle } from \"../../../components/table/Fields\";\nimport { IPersonStory2 } from \"../../../models/PersonStory2\";\nimport { T } from \"../../../Translate\";\nimport PersonStoryStatusView from \"../../ListPersonStories/PersonStoryStatusView\";\n\nexport function getPersonStoryColumns(canEdit: boolean, onClickedDelete: (story: IPersonStory2) => void) {\n const columns: ITableColumn[] = [\n new ComponentTableColumn('calculated_full_name', T('personstories.name'), (personStory) => { return (\n \n {personStory.family_name}\n
\n {personStory.first_name}\n
)\n }),\n new ComponentTableColumn('details', T('personstories.storyStatus'), personStory => (\n \n ), { sortable: true }),\n new StringTableColumn('published_date', T('personstories.published.date'), personStory => (\n personStory.published_date ? new Date(personStory.published_date).toLocaleDateString() : T('personstories.notPublished')\n ))\n ];\n\n if (canEdit) {\n columns.push(new ActionsTableColumn('actions', T('generic.list.actions'), () => tableRowActions(\n { icon: Icon.TimesCircle, style: TableRowActionStyle.Danger, onClick: onClickedDelete }\n ), { width: 80 }));\n }\n return columns;\n}\n","import React, { useMemo, useState } from 'react';\nimport { History } from 'history';\nimport { Button } from 'react-bootstrap';\nimport api from '../../../api';\nimport { FormCard } from '../../../components/FormCard';\nimport { Icon } from '../../../components/Icons';\nimport { SortDirection, Table } from '../../../components/table/Table';\nimport { ConfirmationModal } from '../../../modals/Confirmation';\nimport { useModalContext } from '../../../modals/ModalContext';\nimport { IPersonStory2 } from '../../../models/PersonStory2';\nimport { T } from '../../../Translate';\nimport { getPageLinkWithVia, PageID } from '../../../utils/PageLinking';\nimport { getPersonStoryColumns } from '../../ListPersonStories/Columns';\nimport SearchStoryModal from './SearchStoryModal';\nimport ListMatchingPersonStories from \"./ListMatchingPersonStories\";\nimport { Loading } from \"../../../utils/Loading\";\nimport { TextStyles } from \"../../../config/styles\";\n\ninterface LinkedStoriesTabProps {\n history: History;\n loading: Loading;\n story?: IPersonStory2;\n readOnly: boolean;\n onChanged: (story: IPersonStory2) => void;\n onMatchingItemsChanged: (numberOfItems: number) => void;\n}\n\nconst PageSize = 10;\nexport default (props: LinkedStoriesTabProps) => {\n const { history, loading, story, readOnly, onChanged } = props;\n\n const modals = useModalContext();\n const user = api.user;\n\n const links = story?.coupling_stories || [];\n const [page, setPage] = useState(0);\n const [sortDirection, setSortDirection] = useState(SortDirection.Up);\n const [sortColumn, setSortColumn] = useState('name');\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n setSortColumn(column);\n setSortDirection(direction);\n };\n\n const displayedLinks = useMemo(\n () => links.slice(PageSize * page, PageSize * (page + 1)),\n [links, page]\n );\n\n const excludedPersonStoryIds: string[] = useMemo(\n () => story ? [story._id, ...links.map(item => item._id)] : [],\n [links, story]\n );\n\n const columns = useMemo(() => {\n const handleClickedDelete = async (personStory: IPersonStory2) => {\n const confirmed = await modals.show(props => (\n \n ));\n if (confirmed) {\n const newLinks = links.filter(link => link._id !== personStory._id);\n const linkIds = story?.coupling_story_refs || [];\n const newLinkedIds = linkIds.filter(id => id !== personStory._id);\n onChanged(Object.assign({}, story, {\n coupling_stories: newLinks,\n coupling_story_refs: newLinkedIds\n }));\n }\n };\n\n return getPersonStoryColumns(!readOnly && user.canEdit(), handleClickedDelete);\n }, [story, links, user, modals, readOnly, onChanged]);\n\n const handleClickedAdd = async () => {\n if (!story)\n return;\n\n const selectedStory = await modals.show(props => (\n \n ));\n if (!selectedStory)\n return;\n\n const newLinks = [...links, selectedStory];\n const linkIds = story?.coupling_story_refs || [];\n const newLinkedIds = [...linkIds, selectedStory._id];\n onChanged(Object.assign({}, story, {\n coupling_stories: newLinks,\n coupling_story_refs: newLinkedIds\n }));\n };\n\n const button = (\n \n );\n\n const handleClickedRow = (personStory: IPersonStory2) => {\n const link = getPageLinkWithVia(PageID.EditPersonStory, personStory._id, PageID.EditPersonStory, story?._id);\n history.push(link);\n };\n\n\n const renderMatchingPersonStories = () => {\n return (\n <>\n

\n {T('page.personstory.tab.automatic.links.explain')}\n

\n \n \n \n \n );\n }\n\n const renderManualPersonStories = () => {\n return <>\n

\n {T('page.personstory.tab.manual.links.explain')}\n

\n \n \n \n ;\n }\n\n return <>\n {renderMatchingPersonStories()}\n {renderManualPersonStories()}\n ;\n}\n","import React, { useRef, useState } from 'react';\nimport Autocomplete from 'react-autocomplete';\nimport api from '../../api';\nimport { useElementID } from '../../utils/ElementID';\nimport { T } from '../../Translate';\nimport { IContactPerson } from '../../models/ContactPerson';\nimport FormGroup from './FormGroup';\n\ninterface ContactPersonInputProps extends ContactPersonInputComponentProps {\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n error?: string;\n}\n\nexport function ContactPersonInput(props: ContactPersonInputProps) {\n const {\n onSelected,\n value,\n\n labelColumns = 4,\n inputColumns,\n label,\n error\n } = props;\n const id = useElementID('cpinput');\n\n return (\n \n \n \n );\n}\n\ninterface ContactPersonInputComponentProps {\n value: IContactPerson|undefined;\n onSelected: (value: IContactPerson) => void;\n invalid?: boolean;\n readOnly?: boolean;\n}\n\nexport function ContactPersonInputComponent(props: ContactPersonInputComponentProps) {\n const { value, onSelected, invalid = false } = props;\n\n const [inputValue, setInputValue] = useState(value ? value.firstName + ' ' + value.lastName : '');\n const [options, setOptions] = useState([]);\n\n const requestTimer = useRef();\n\n const handleSelected = (value: string, item: IContactPerson) => {\n onSelected(item);\n\n setInputValue('');\n setOptions([]);\n };\n\n const searchReferences = (value: string) => {\n requestTimer.current = undefined;\n api.findContactPersons(value, 0, 10)\n .then(entities => setOptions(entities.data));\n };\n\n const scheduleSearch = (value: string) => {\n if (requestTimer.current) {\n clearTimeout(requestTimer.current);\n requestTimer.current = undefined;\n }\n\n if (!value) {\n setOptions([]);\n } else {\n requestTimer.current = setTimeout(() => searchReferences(value), 500);\n }\n }\n\n const handleValueChanged = (e: React.SyntheticEvent) => {\n const value = e.currentTarget.value;\n // is this a valid uuid?\n const match = value.match(/.*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})/);\n if (match) {\n setOptions([]);\n api.getContactPerson(match[1])\n .then(result => {\n if (match && result)\n handleSelected(match[1], result);\n });\n } else {\n scheduleSearch(value);\n }\n\n setInputValue(value);\n };\n\n return <>\n item.firstName + ' ' + item.lastName}\n items={options.length === 0 ? [undefined] : options}\n menuStyle={{ padding: '0.25em', position: 'fixed', background: 'white', border: '1px solid #ccc', zIndex: 100 }}\n renderItem={(item: IContactPerson|undefined, isHighlighted: boolean) =>\n item === undefined ? (\n
{\n inputValue.length === 0\n ? T('component.search.typeToSearch')\n : (requestTimer.current ? T('component.search.searching') : T('component.search.noResults'))\n }
\n ) : (\n
\n {item.firstName} {item.lastName}\n
\n )\n }\n value={inputValue}\n onChange={handleValueChanged}\n onSelect={handleSelected}\n />\n ;\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport api from '../../api';\nimport { useElementID } from '../../utils/ElementID';\nimport { SortDirection } from '../table/Table';\nimport { InputGroup } from './InputGroup';\nimport { SimpleAutocomplete } from './SimpleAutocomplete';\nimport { IKeyLocation } from '../../models/KeyLocation';\nimport { ReferenceView } from '../../pages/EditCollectionDocument/ReferenceView';\nimport { DocumentReference, DocumentReferenceType } from '../../models/DocumentReference';\n\ninterface KeyLocationInputProps {\n labelColumns?: number;\n inputColumns?: number;\n\n label: string;\n error?: string;\n readOnly?: boolean;\n\n value: IKeyLocation|undefined;\n onChange: (keyLocation: IKeyLocation) => void;\n onClear: () => void;\n}\n\nexport function KeyLocationInput(props: KeyLocationInputProps) {\n const {\n label,\n onChange,\n value,\n error,\n onClear,\n readOnly\n } = props;\n const id = useElementID('input');\n const [inputText, setInputText] = useState(value ? value.name : '');\n useEffect(() => setInputText(value ? value.name : ''), [value]);\n\n const handleSelected = (selected: IKeyLocation) => {\n setInputText(selected.name);\n onChange(selected);\n };\n\n return (\n \n \n \n );\n}\n\ninterface KeyLocationInputComponentProps {\n keyLocation: IKeyLocation|undefined;\n value: string\n onSelected: (value: IKeyLocation) => void;\n onChange: (value: string) => void;\n onClear: () => void;\n invalid?: boolean;\n placeholder?: string;\n readOnly?: boolean;\n}\n\nexport function KeyLocationInputComponent(props: KeyLocationInputComponentProps) {\n const { keyLocation, value, onSelected, onChange, onClear, invalid, placeholder, readOnly = false } = props;\n const requestTimer = useRef();\n\n const [options, setOptions] = useState([]);\n\n const handleValueChanged = (value: string) => {\n // is this a valid uuid?\n let match = value.match(/.*([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})/);\n if (match) {\n setOptions([]);\n api.getKeyLocation(match[1])\n .then(result => {\n if (match && result)\n handleSelected(match[1], result);\n });\n } else {\n scheduleSearch(value);\n }\n\n onChange(value);\n };\n\n const handleSelected = (value: string, item: IKeyLocation) => {\n onSelected(item);\n setOptions([]);\n };\n\n const scheduleSearch = (value: string) => {\n const searchKeyLocations = () => {\n requestTimer.current = undefined;\n api.findKeyLocations(value, 0, 10, [['filter', SortDirection.Up]])\n .then(entities => setOptions(entities.data));\n };\n \n if (requestTimer.current) {\n clearTimeout(requestTimer.current);\n requestTimer.current = undefined;\n }\n\n if (!value) {\n setOptions([]);\n } else {\n requestTimer.current = setTimeout(() => searchKeyLocations(), 500);\n }\n };\n\n return <>\n {keyLocation ? (\n
\n \n
\n\n ) : (\n item.number + \": \" + item.name}\n itemKey={item => item._id}\n renderItem={item => item.name}\n options={options}\n invalid={invalid}\n readOnly={readOnly}\n />\n )}\n ;\n}\n","import {FormCard} from \"../../../components/FormCard\";\nimport {Icon} from \"../../../components/Icons\";\nimport {ContactPersonInput} from \"../../../components/inputs/ContactPersonInput\";\nimport FormGroup from \"../../../components/inputs/FormGroup\";\nimport {DocumentReference, DocumentReferenceType} from \"../../../models/DocumentReference\";\nimport {ILinkedContactPerson, IPersonStory2} from \"../../../models/PersonStory2\";\nimport {T} from \"../../../Translate\";\nimport {Loading} from \"../../../utils/Loading\";\nimport {ReferenceView} from \"../../EditCollectionDocument/ReferenceView\";\nimport {IKeyStoryErrors} from \"../Stories/StoriesData\";\nimport {KeyLocationInput} from \"../../../components/inputs/KeyLocationInput\";\nimport {DateInput, DateInputValue} from \"../../../components/inputs/DateInput\";\nimport React from \"react\";\nimport {Button, Col, Container, Image, Row} from \"react-bootstrap\";\nimport {ButtonLink} from \"../../../components/ButtonLink\";\nimport {IconButton} from \"../../../components/IconButton\";\nimport api from \"../../../api\";\n\nconst MAX_CONTACT_PERSONS = 3;\n\ninterface KeyStoryTabProps {\n loading: Loading;\n story?: IPersonStory2;\n onChanged: (story: IPersonStory2) => void;\n keyStoryDate: DateInputValue;\n keyStoryDateError?: string;\n onKeyStoryDateChanged: (date: DateInputValue) => void;\n keyStoryOrganisationTitle?: string,\n keyStoryOrganisationTitleError?: string,\n onkeyStoryOrganisationTitleChanged: (title: string) => void;\n errors: IKeyStoryErrors;\n readOnly: boolean;\n}\n\nexport default function KeyStoryTab(props: KeyStoryTabProps) {\n const {\n loading,\n story,\n onChanged,\n keyStoryDate,\n keyStoryDateError,\n onKeyStoryDateChanged,\n keyStoryOrganisationTitle,\n keyStoryOrganisationTitleError,\n onkeyStoryOrganisationTitleChanged,\n errors,\n readOnly\n } = props;\n\n const getPdfUrl = (): string => {\n if (story === undefined || story === null) {\n return ''\n }\n return api.baseUrl + '/pdf/key?token=' + api.token + '&id=' + story._id\n }\n\n return <>\n \n {story && (\n onChanged({...story, key_location: keyLocation, key_location_id: keyLocation._id})}\n onClear={() => onChanged({...story, key_location: undefined, key_location_id: null})}\n readOnly={readOnly}\n />\n )}\n \n \n {story && (\n <>\n \n\n \n {\n onkeyStoryOrganisationTitleChanged(e.target.value)\n }}\n readOnly={readOnly}\n placeholder={T('page.personstory.tab.keystory.organisation.title.placeholder')}\n />\n \n \n )}\n {story?.linked_contact_persons && story.linked_contact_persons.map((contactPerson, index) => (\n <>\n \n
\n {\n const linked_contact_persons = (story.linked_contact_persons || []).filter(contact => contact.person._id !== contactPerson.person._id);\n onChanged({...story, linked_contact_persons});\n }}\n />\n
\n
\n \n {\n const newContactPersons: ILinkedContactPerson[] = [...(story?.linked_contact_persons || [])];\n newContactPersons[index] = {...contactPerson, title: e.target.value};\n onChanged({...story, linked_contact_persons: newContactPersons});\n }}\n readOnly={readOnly}\n />\n \n
\n \n ))}\n\n {(story?.linked_contact_persons || []).length < MAX_CONTACT_PERSONS && !readOnly && (\n {\n if (!story) return;\n\n const newContactPersons: ILinkedContactPerson[] = [...(story?.linked_contact_persons || []), {\n person,\n title: ''\n }];\n onChanged({...story, linked_contact_persons: newContactPersons});\n }}\n error={errors.linkedContactPerson}\n />\n )}\n
\n {story && story.key_date && (story?.linked_contact_persons || []).length > 0 && getPdfUrl() !== '' && (\n \n \n \n \n \n \n \n \n )}\n ;\n}\n","import React from 'react';\nimport { BasePage, PageProps, PageState } from '../Page';\nimport { TopTab, TopTabs } from '../../components/TopTabs';\nimport { Icon } from '../../components/Icons';\nimport { singular, T } from '../../Translate';\nimport api from '../../api';\nimport { fixWhitespaceLines, IPersonStory2, StoryStatus } from \"../../models/PersonStory2\";\nimport { PersonPlaceTab } from \"./PersonPlace/PersonPlaceTab\";\nimport { PersonFormData } from \"./PersonPlace/PersonForm\";\nimport { PlaceFormData } from \"./PersonPlace/PlaceForm\";\nimport { IPerson, PersonQueryOptions, Person } from \"../../models/Person\";\nimport { BottomButtonRow } from \"../../components/ButtonRow\";\nimport { Alert, Button } from \"react-bootstrap\";\nimport { getErrorDescription, IValidationResult } from \"../../models/ValidationResult\";\nimport { IImageErrors, IKeyStoryErrors, IStoriesErrors, storiesErrorsCount, storyErrorsFromValidationResult } from \"./Stories/StoriesData\";\nimport { StoriesTab } from \"./Stories/StoriesTab\";\nimport { IPersonPlaceErrors, personPlaceErrorsCount } from \"./PersonPlace/PersonPlaceData\";\nimport { SummaryTab } from \"./Summary/SummaryTab\";\nimport { NotificationManager } from \"react-notifications\";\nimport { getPageVia, PageID } from \"../../utils/PageLinking\";\nimport { PersonStoryHelper } from \"../../models/wrappers/PersonStoryHelper\";\nimport PhotosTab from './Photos/PhotosTab';\nimport QualificationsTab from './Qualifications/QualificationsTab';\nimport LinkedStoriesTab from './LinkedStories/LinkedStoriesTab';\nimport { ConfirmationModal } from '../../modals/Confirmation';\nimport KeyStoryTab from './KeyStory/KeyStoryTab';\nimport { DateInputValue, inputDateFromISO, inputDateToISO } from '../../components/inputs/DateInput';\n\nexport interface EditPersonStoryProps extends PageProps {\n id?: string;\n personIdRef?: string\n}\n\n\ninterface EditPersonStoryState extends PageState {\n personStory?: IPersonStory2;\n person?: IPerson;\n selectedPlaceEvent?: string;\n personPlaceErrors: IPersonPlaceErrors;\n imageErrors: IImageErrors;\n storiesErrors: IStoriesErrors;\n keyStoryErrors: IKeyStoryErrors;\n numberOfMatchingItems: number;\n saving: boolean;\n keyStoryDate: DateInputValue;\n keyStoryDateError?: string;\n keyStoryOrganisationTitle?: string;\n keyStoryOrganisationError?: string;\n}\n\nexport default class EditPersonStoryPage extends BasePage {\n\n originalPersonStory?: IPersonStory2 = undefined;\n\n constructor(props: EditPersonStoryProps) {\n super(props);\n\n\n // Make an initial state\n this.state = {\n page: {\n id: PageID.EditPersonStory,\n via: props.via || getPageVia(PageID.EditPersonStory),\n icon: Icon.PersonStory,\n title: '...'\n },\n numberOfMatchingItems: 0,\n saving: false,\n personPlaceErrors: {},\n imageErrors: {},\n storiesErrors: {},\n keyStoryErrors: {},\n keyStoryDate: { day: '', month: '', year: '' }\n };\n }\n\n componentDidMount() {\n super.componentDidMount();\n\n if (this.props.id !== undefined) {\n this.fetchPersonStoryData(this.props.id);\n } else {\n if (this.props.personIdRef !== undefined) {\n this.createNewPersonStoryFromPersonId(this.props.personIdRef)\n }\n }\n }\n\n componentDidUpdate(oldProps: EditPersonStoryProps, oldState: EditPersonStoryState) {\n super.componentDidUpdate(oldProps, oldState);\n\n if (this.props.id !== oldProps.id) {\n if (this.props.id)\n this.fetchPersonStoryData(this.props.id);\n } else if (this.props.personIdRef !== oldProps.personIdRef) {\n if (this.props.personIdRef)\n this.createNewPersonStoryFromPersonId(this.props.personIdRef);\n }\n }\n\n /** event handlers **/\n\n onUpdatePersonData = (data: PersonFormData) => {\n const { personStory } = this.state;\n\n if (personStory !== undefined) {\n personStory.first_name = data.firstName;\n personStory.family_name = data.familyName;\n }\n\n this.setState( {\n personStory: personStory,\n page: {\n id: PageID.EditPersonStory,\n via: this.props.via || getPageVia(PageID.ListPersonStories),\n icon: Icon.PersonStory,\n title: PersonStoryHelper.personName(personStory)\n }\n });\n }\n\n onUpdateStories = (data: Partial) => {\n const { personStory } = this.state;\n\n if (personStory !== undefined) {\n personStory.story_child_option = data.story_child_option === undefined ? personStory.story_child_option: data.story_child_option;\n personStory.story_status = data.story_status || personStory.story_status;\n personStory.story_text = data.story_text || personStory.story_text;\n }\n\n this.setState( {\n personStory: personStory,\n page: {\n id: PageID.EditPersonStory,\n via: this.props.via || getPageVia(PageID.ListPersonStories),\n icon: Icon.PersonStory,\n title: PersonStoryHelper.personName(personStory)\n }\n });\n }\n\n onUpdatePlaceData = (data: PlaceFormData) => {\n const { personStory } = this.state;\n\n if (personStory !== undefined) {\n personStory.community = data.community;\n personStory.area = data.area;\n personStory.country_code = data.countryCode;\n personStory.place_source_event_ref = data.eventRef\n }\n\n this.setState( {\n personStory: personStory,\n page: {\n id: PageID.EditPersonStory,\n via: this.props.via || getPageVia(PageID.ListPersonStories),\n icon: Icon.PersonStory,\n title: PersonStoryHelper.personName(personStory)\n }\n });\n }\n\n handleClickedSave = async () => {\n if (!this.state.personStory)\n return\n\n const saveResult = await this.save()\n const validationResult = saveResult as IValidationResult\n if (validationResult?.status !== undefined) {\n this.setValidationErrors(validationResult)\n // If a validation error is not specific to a certain form field, we pass\n // `none` as form field name. In that case the error is communicated\n // by a notification.\n const notification = getErrorDescription(validationResult?.data?.none) ?? T('personStories.messages.saveFailed')\n NotificationManager.error(notification)\n } else {\n this.resetValidationErrors()\n const savedPersonStory = saveResult as IPersonStory2\n this.setState({ personStory: savedPersonStory });\n NotificationManager.success(T('personStories.messages.savedSuccesfully'))\n }\n }\n\n handleClickedPublishMuseum = async () => {\n const story = this.state.personStory;\n if (!story)\n return;\n\n const autoLinkedStories = await api.findMatchingPersonStories(story._id);\n const manualLinkedStories = story.coupling_stories || [];\n const hasPublishedLinkedStories = [...autoLinkedStories.data, ...manualLinkedStories].some(story => story.published_date !== undefined);\n if (!hasPublishedLinkedStories) {\n const confirmed = await this.props.modals.show(props => (\n \n ));\n if (!confirmed)\n return;\n }\n\n await this.publish('museum');\n };\n\n handleClickedPublishKey = async () => {\n const story = this.state.personStory;\n if (!story)\n return;\n\n await this.publish('key');\n };\n\n async publish(target: 'museum'|'key') {\n const saveResult = await this.save()\n if ((saveResult as IValidationResult).status !== undefined) {\n NotificationManager.error(T('personStories.messages.publishingFailed'))\n } else {\n const savedPersonStory = saveResult as IPersonStory2\n const publishResult = await api.publishPersonStory2(savedPersonStory._id, target)\n if ((publishResult as IValidationResult).status === undefined) {\n NotificationManager.success(T('personStories.messages.publishedSuccesfully'))\n await this.fetchPersonStoryData(savedPersonStory._id)\n this.resetValidationErrors()\n return;\n } else {\n const validationResult = publishResult as IValidationResult;\n this.setValidationErrors(validationResult);\n NotificationManager.error(T('personStories.messages.publishingFailed'))\n }\n }\n }\n\n handleClickedUnpublish = async () => {\n if (this.state.personStory) {\n const result = await api.unpublishPersonStory2(this.state.personStory._id)\n if (result === \"OK\") {\n this.setState({personStory: {...this.state.personStory, published_date: undefined}})\n }\n }\n }\n\n handleKeyStoryDateChanged = (date: DateInputValue) => {\n this.setState({ keyStoryDate: date });\n if (this.state.personStory) {\n const iso = inputDateToISO(date);\n if (iso) {\n this.setState({ personStory: { ...this.state.personStory, key_date: iso } });\n }\n }\n }\n\n handleKeyStoryOrganisationTitleChanged = (title: string) => {\n this.setState({ keyStoryOrganisationTitle: title });\n if (this.state.personStory) {\n this.setState({personStory: {...this.state.personStory, key_organisation_title: title}});\n }\n }\n\n\n /** render Tab Helper functions **/\n\n renderPersonPlaceTabContent() {\n return (\n \n );\n }\n\n renderStoriesTabContent() {\n return (\n \n );\n }\n\n renderPhotosTabContent() {\n return (\n this.setState({ personStory: story })}\n />\n );\n }\n\n renderQualificationsTab() {\n return (\n this.setState({ personStory: story })}\n />\n );\n }\n\n renderLinkedStoriesTab() {\n return (\n this.setState({ numberOfMatchingItems: numberOfItems })}\n onChanged={story => this.setState({ personStory: story })}\n />\n );\n }\n\n renderKeyStoryTab() {\n return (\n this.setState({ personStory: story })}\n errors={this.state.keyStoryErrors}\n readOnly={this.isReadOnly()}\n keyStoryDate={this.state.keyStoryDate}\n onKeyStoryDateChanged={this.handleKeyStoryDateChanged}\n keyStoryOrganisationTitle={this.state.keyStoryOrganisationTitle}\n keyStoryOrganisationTitleError={this.state.keyStoryOrganisationTitle}\n onkeyStoryOrganisationTitleChanged={this.handleKeyStoryOrganisationTitleChanged}\n\n />\n );\n }\n\n renderSummaryTabContent() {\n return (\n \n );\n }\n\n isReadOnly() {\n return !!(this.state.personStory && this.state.personStory.published_date);\n }\n\n hasKeyStoryErrors() {\n const keyStoryErrors = this.state.keyStoryErrors;\n return keyStoryErrors.keyPosition !== undefined\n || keyStoryErrors.linkedContactPerson !== undefined;\n }\n\n generateTabs(): TopTab[] {\n const hasKeyStoryErrors = this.hasKeyStoryErrors();\n\n return [\n {\n icon: Icon.ListUl,\n title: T('page.personstory.tab.person'),\n id: 'person',\n content: () => this.renderPersonPlaceTabContent(),\n badgeContent: () => personPlaceErrorsCount(this.state.personPlaceErrors) > 0 ? '!': '',\n badgeVariant: personPlaceErrorsCount(this.state.personPlaceErrors) > 0 ? 'danger': 'secondary'\n },\n {\n icon: Icon.Link,\n title: T('page.personstory.tab.stories'),\n id: 'stories',\n content: () => this.renderStoriesTabContent(),\n badgeContent: () => storiesErrorsCount(this.state.storiesErrors) > 0 ? '!': '',\n badgeVariant: storiesErrorsCount(this.state.storiesErrors) > 0 ? 'danger': 'secondary'\n },\n {\n icon: Icon.Images,\n title: T('page.personstory.tab.photos'),\n id: 'pictures',\n content: () => this.renderPhotosTabContent(),\n badgeContent: () => this.state.imageErrors.profileImage ? '!' : '',\n badgeVariant: 'danger'\n },\n {\n icon: Icon.Tags,\n title: T('page.personstory.tab.qualifications'),\n id: 'qualifications',\n content: () => this.renderQualificationsTab(),\n badgeContent: () => this.countQualifications()\n },\n {\n icon: Icon.Key,\n title: T('page.personstory.tab.keystory'),\n id: 'keystory',\n content: () => this.renderKeyStoryTab(),\n badgeContent: () => hasKeyStoryErrors ? '!': '',\n badgeVariant: hasKeyStoryErrors ? 'danger': 'secondary'\n },\n {\n icon: Icon.Link,\n title: T('page.personstory.tab.links'),\n id: 'links',\n content: () => this.renderLinkedStoriesTab(),\n badgeContent: () => this.countLinkedStories()\n },\n {\n icon: Icon.Page,\n title: T('page.personstory.tab.summary'),\n id: 'summary',\n content: () => this.renderSummaryTabContent(),\n badgeContent: () => '',\n }\n ]\n }\n\n countQualifications() {\n const { personStory: story } = this.state;\n if (!story)\n return undefined;\n\n const count =\n (story.coupling_use_events_with_places_refs || []).length\n + (story.coupling_tags || []).length\n + (story.coupling_use_died_date ? 1 : 0);\n return count.toString();\n }\n\n countLinkedStories() {\n const { personStory: story } = this.state;\n if (!story)\n return undefined;\n\n const total = (story.coupling_story_refs || []).length + this.state.numberOfMatchingItems;\n\n return total.toString();\n }\n\n /** API handling **/\n\n createNewPersonStoryFromPerson(person: IPerson): IPersonStory2 {\n return {\n _id: '',\n person_id_ref: person._id,\n first_name: person.surname,\n family_name: person.familyname,\n born_year: person.born_year || '',\n died_year: person.died_year || '',\n community: '',\n area: '',\n country_code: '',\n story_status: StoryStatus.IN_PROGRESS,\n story_child_option: false,\n story_text: {},\n targets: [],\n linked_contact_persons: []\n };\n }\n\n createNewPersonStoryFromPersonId(personIdRef: string ) {\n const options: PersonQueryOptions[] = [PersonQueryOptions.EventsWithPlaces]\n this.loading(api.getPerson(personIdRef, options), singular('person'))\n .then(person => {\n const personStory = this.createNewPersonStoryFromPerson(person)\n\n this.setState({\n personStory: personStory,\n page: {\n id: PageID.EditPersonStory,\n via: this.props.via || getPageVia(PageID.ListPersonStories),\n icon: Icon.PersonStory,\n title: PersonStoryHelper.personName(personStory)\n },\n person: person\n })\n })\n }\n\n fetchPersonStoryData(id: string) {\n return this.loading(api.getPersonStory2(id, ['linked_stories', 'key_location', 'contact_persons']), T('noun.place'))\n .then(personStory => {\n this.originalPersonStory = { ...personStory };\n this.setState({\n personStory: personStory,\n page: {\n id: PageID.EditPersonStory,\n via: this.props.via || getPageVia(PageID.ListPersonStories),\n icon: Icon.PersonStory,\n title: personStory.first_name as string\n }\n })\n return personStory;\n })\n .then(personStory => {\n const options: PersonQueryOptions[] = [PersonQueryOptions.EventsWithPlaces]\n const personIdRef = personStory.person_id_ref;\n this.loading(api.getPerson(personIdRef, options), singular('person'))\n .then(person => this.setState({\n personStory: personStory,\n page: {\n id: PageID.EditPersonStory,\n via: this.props.via || getPageVia(PageID.ListPersonStories),\n icon: Icon.PersonStory,\n title: PersonStoryHelper.personName(personStory)\n },\n person: person,\n keyStoryOrganisationTitle: personStory.key_organisation_title ?? '',\n keyStoryDate: personStory.key_date ? inputDateFromISO(personStory.key_date) : { day: '', month: '', year: '' }\n }))\n });\n }\n\n // page: {\n // id: this.props.id ? PageID.EditPerson : PageID.CreatePerson,\n // entity: this.props.id,\n // icon: Icon.User,\n // title: T('page.person.title.create'),\n // via: this.props.via || 'persons'\n // },\n\n async fetchPersonStoryValidation(): Promise {\n const validationResult = await this.loading(\n api.validatePersonStory2((this.state.personStory as IPersonStory2), 'publish'),\n T('noun.person')\n );\n this.setValidationErrors(validationResult);\n return validationResult;\n }\n\n async save() : Promise {\n this.setState({ saving: true });\n\n try {\n let story = this.state.personStory;\n if (!story)\n throw new Error('Invalid state');\n\n let keyDate = this.state.keyStoryDate;\n if (keyDate.day !== '' && keyDate.month !== '' && keyDate.year !== '') {\n const iso = inputDateToISO(keyDate);\n if (!iso) {\n this.setState({keyStoryDateError: T('personStories.errors.invalidKeyDate')});\n } else {\n this.setState({keyStoryDateError: undefined});\n }\n } else {\n this.setState({keyStoryDateError: undefined});\n }\n \n story = fixWhitespaceLines(story);\n\n const action = story._id === '' ? 'create' : 'update'\n const validationResult = await api.validatePersonStory2(story, action)\n if (validationResult.status !== 'OK') {\n this.setValidationErrors(validationResult);\n return validationResult\n } else {\n if (action === 'create') {\n const result = await api.createPersonStory2(story)\n this.props.history.push(`/personstories/${result._id}/edit`);\n return result;\n } else {\n return await api.updatePersonStory2(story, ['linked_stories', 'key_location', 'contact_persons'])\n }\n }\n } finally {\n this.setState({ saving: false });\n }\n }\n\n\n setValidationErrors(result: IValidationResult) {\n const errors = result.data || {};\n const personPlaceErrors: IPersonPlaceErrors = {\n firstNameError: getErrorDescription(errors.firstName),\n familyNameError: getErrorDescription(errors.familyName),\n communityError: getErrorDescription(errors.community),\n areaError: getErrorDescription(errors.area),\n countryCodeError: getErrorDescription(errors.countryCode),\n placeEventError: getErrorDescription(errors.place_source_event_ref)\n }\n const storyErrors = storyErrorsFromValidationResult(result);\n\n const imageErrors: IImageErrors = {\n profileImage: getErrorDescription(errors.profile_image),\n mapImage: getErrorDescription(errors.map_image)\n };\n\n const keyStoryErrors: IKeyStoryErrors = {\n keyPosition: getErrorDescription(errors.key_position),\n linkedContactPerson: getErrorDescription(errors.linked_contact_person)\n };\n\n this.setState({\n personPlaceErrors: personPlaceErrors,\n storiesErrors: storyErrors,\n imageErrors: imageErrors,\n keyStoryErrors\n });\n }\n\n resetValidationErrors() {\n this.setState({\n personPlaceErrors: {},\n storiesErrors: {},\n imageErrors: {},\n keyStoryErrors: {}\n });\n }\n\n renderSaveButtons() {\n const readOnly = this.isReadOnly();\n const personStory = this.state.personStory;\n\n const publishTargets = personStory?.targets || [];\n const published = personStory?.published_date !== null && personStory?.published_date !== undefined;\n const publishedToMuseum = published && publishTargets.includes('museum');\n const publishedToKey = published && publishTargets.includes('key'); \n \n return (\n \n {!publishedToMuseum && (\n \n )}\n {!publishedToKey && (\n \n )}\n {!readOnly && (\n \n )}\n \n );\n }\n\n renderContent() {\n const published = !!(this.state.personStory && this.state.personStory.published_date);\n return <>\n {published && {T('page.personstory.publishedReadOnly')}}\n \n
\n {this.renderSaveButtons()}\n ;\n }\n}\n","import React, { CSSProperties } from 'react';\nimport styles from './PublicButton.module.scss';\n\ninterface PublicButtonProps {\n children: React.ReactNode;\n onClick: () => void;\n style?: CSSProperties;\n}\n\nexport const PublicButton = (props: PublicButtonProps) => {\n const { children, onClick, style } = props;\n\n const handleClicked = (e: React.MouseEvent) => {\n e.preventDefault();\n onClick();\n }\n\n // eslint-disable-next-line jsx-a11y/anchor-is-valid\n return {children};\n}\n\n\ninterface PublicLinkProps {\n children: React.ReactNode;\n url: string;\n style?: CSSProperties;\n}\n\nexport const PublicLink = (props: PublicLinkProps) => {\n const { children, url, style } = props;\n return {children};\n}\n","import React, { useState } from 'react';\nimport { FullscreenImageView } from '../../components/FullscreenImageView';\nimport { Icon } from '../../components/Icons';\nimport { getActiveLanguage } from '../../Translate';\nimport styles from './ImageCarrousel.module.scss';\n\ninterface ImageCarrouselProps {\n images: { url: string, fullSizeUrl?: string, legend?: { [key: string]: string } }[];\n}\n\nexport default function ImageCarrousel(props: ImageCarrouselProps) {\n const { images } = props;\n\n const [current, setCurrent] = useState(0);\n const [fullscreenOpen, setFullscreenOpen] = useState(false);\n\n const handleClickedNext = () => setCurrent((current + 1) % images.length);\n const handleClickedPrev = () => setCurrent((current + images.length - 1) % images.length);\n const handleClickedFullscreenClose = () => setFullscreenOpen(false);\n\n const currentUrl = images[current].url;\n const fullSizeUrl = images[current].fullSizeUrl || currentUrl;\n const legenda = (images[current]?.legend || {})[getActiveLanguage()] || '';\n const nextUrl = images.length > 1 ? images[(current + 1) % images.length]?.url : undefined;\n const prevUrl = images.length > 1 ? images[(current + images.length - 1) % images.length]?.url : undefined;\n\n const handleClicked = () => setFullscreenOpen(true);\n\n return <>\n
\n
\n \n \n
\n
\n
\n {fullscreenOpen && fullSizeUrl && (\n \n )}\n ;\n}\n\ninterface ImageCarrouselContentProps {\n url: string;\n legenda: string;\n prevUrl?: string;\n nextUrl?: string;\n onClickedNext: () => void;\n onClickedPrev: () => void;\n onClick: () => void;\n}\n\nfunction ImageCarrouselContent(props: ImageCarrouselContentProps) {\n const { url, legenda, prevUrl, nextUrl, onClickedNext, onClickedPrev, onClick } = props;\n\n return (\n
\n
\n \n
\n
\n {legenda}\n
\n
\n \n
\n
\n );\n}\n\ninterface ImageCarrouselIndicatorProps {\n images: { url: string }[];\n current: number;\n}\n\nfunction ImageCarrouselIndicator(props: ImageCarrouselIndicatorProps) {\n const { images, current } = props;\n return (\n
\n {images.map((_, index) =>
)}\n
\n );\n}\n","import React from 'react';\nimport styles from './StoryView.module.scss';\nimport poppy from '../../assets/images/poppy.png';\nimport { Col, Row } from 'react-bootstrap';\nimport { getActiveLanguage, T } from '../../Translate';\nimport { IPublishedPersonStory } from '../../models/PersonStory2';\nimport ImageCarrousel from './ImageCarrousel';\n\ninterface StoryViewProps {\n story: IPublishedPersonStory;\n child: boolean;\n}\n\nexport const StoryView = (props: StoryViewProps) => {\n const { story, child } = props;\n\n const language = getActiveLanguage();\n const storyText = (story.story_text || {})[language];\n const storyPart1 = child ? storyText?.story_child_part_1 : storyText?.story_part_1;\n const storyPart2 = child ? storyText?.story_child_part_2 : storyText?.story_part_2;\n\n return (\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n {story.profile_image_url && (\n
\n \n
\n
\n
\n
\n
\n )}\n \n {T('page.personstory.theStory')}\n \n

{storyPart1}

\n

{storyPart2}

\n \n
\n \n \n \n {story.extra_images.length > 0 && (\n \n )}\n \n \n
\n
\n
\n
\n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABJCAYAAAC0AZFNAAAG3GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNzMiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iOTQiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDEtMThUMjA6MzY6MDIrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDEtMThUMjA6MzY6MDIrMDE6MDAiCiAgIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0EzQ0IzNDA2Mzc5MTFFMUI0NzRENjAwOTlERUJEOTciCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0EzQ0IzM0Y2Mzc5MTFFMUI0NzRENjAwOTlERUJEOTciCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTgwMTE3NDA3MjA2ODExOTVGRUJFQzVCNTdERDBGOCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249Ijk0IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNzMiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIj4KICAgPHhtcE1NOkRlcml2ZWRGcm9tCiAgICB4bXBNTTpkb2N1bWVudElEPSJ4bXAuZGlkOjAxODAxMTc0MDcyMDY4MTE5NUZFQkVDNUI1N0REMEY4IgogICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDowNTgwMTE3NDA3MjA2ODExOTcyN0JEQjBGQjAxN0I2MyIvPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgUGhvdG8gMS44LjMiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDEtMThUMjA6MzY6MDIrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogICA8ZGM6dGl0bGU+CiAgICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPnBvcHB5PC9yZGY6bGk+CiAgICA8L3JkZjpBbHQ+CiAgIDwvZGM6dGl0bGU+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+lWou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\"","import React from 'react';\nimport {\n PersonEvent,\n getEventIcon,\n getEventTypeName,\n getEventInfo,\n getEventSubType\n} from '../../models/PersonEvent';\n\nimport styles from './index.module.scss';\nimport { Card } from 'react-bootstrap';\n\ninterface TimelineEventViewProps {\n event: PersonEvent;\n}\nexport const TimelineEventView = (props: TimelineEventViewProps) => {\n const { event } = props;\n\n const info: JSX.Element[] = [];\n\n getEventInfo(event, false).forEach(entry => {\n info.push(
{entry.title}:
);\n info.push(
{entry.value}
);\n });\n const subType = getEventSubType(event);\n\n return (\n
\n
\n
\n
\n
\n \n
\n
\n
\n \n \n

{getEventTypeName(event.type)}{subType && {' '}·{' '}{subType}}

\n
\n \n
\n {info}\n
\n
\n
\n
\n
\n );\n}\n","import React, { useMemo } from 'react';\nimport { Icon } from '../../components/Icons';\nimport { usePerson, usePublishedPersonStory } from '../../FunctionalAPI';\nimport { PersonQueryOptions } from '../../models/Person';\nimport { personEventSorter } from '../../models/PersonEvent';\nimport { getActiveLanguage, T } from '../../Translate';\nimport { PageID } from '../../utils/PageLinking';\nimport { PageProps, usePageHeader } from '../Page';\nimport styles from './index.module.scss';\nimport { PublicLink } from './PublicButton';\nimport { StoryView } from './StoryView';\nimport { TimelineEventView } from './TimelineEventView';\nimport { Col, Row } from \"react-bootstrap\";\n\ninterface ViewPersonStoryPageProps extends PageProps {\n id: string;\n child: boolean;\n variant: 'museum'|'key';\n}\n\nconst namelistLinks: {[key: string]: string} = {\n 'nl': 'https://www.inflandersfields.be/nl/kenniscentrum/namenlijst/',\n 'en': 'https://www.inflandersfields.be/en/kenniscentrum-e/namenlijst-e',\n 'fr': 'https://www.inflandersfields.be/fr/kenniscentrum-f/namenlijst-f',\n 'de': 'https://www.inflandersfields.be/de/kenniscentrum-d/namenlijst-d'\n};\n\nconst PersonWithEvents: PersonQueryOptions[] = [PersonQueryOptions.EventsWithPlaces];\nexport const ViewPersonStoryPage = (props: ViewPersonStoryPageProps) => {\n const { id, loading, child, variant } = props;\n\n const story = usePublishedPersonStory(loading, id);\n const person = usePerson(loading, story && story.person_id_ref, PersonWithEvents, 'GUEST');\n const firstName = person ? person.firstName : '';\n const lastName = person ? person.lastName : '';\n\n const subtitles = useMemo(() => [lastName], [lastName]);\n usePageHeader(\n PageID.PublicViewPersonStory,\n id,\n Icon.Search,\n firstName,\n firstName,\n undefined,\n undefined,\n undefined,\n subtitles\n );\n\n const alsoKnownAs = useMemo(() => {\n if (!person)\n return '';\n\n const alternativeFirstNames = person.alternativeFirstNames;\n const alternativeLastNames = person.alternativeLastNames;\n\n if (alternativeFirstNames.length > 0 && alternativeLastNames.length > 0) {\n return T('page.person.alsoKnownAs', {\n firstName: alternativeFirstNames.join('/'),\n lastName: alternativeLastNames.join('/')\n });\n } else if (alternativeFirstNames.length > 0) {\n return T('page.person.alsoKnownAs', {\n firstName: alternativeFirstNames.join('/'),\n lastName\n });\n } else if (alternativeLastNames.length > 0) {\n return T('page.person.alsoKnownAs', {\n firstName,\n lastName: alternativeLastNames.join('/')\n });\n } else {\n return \"\";\n }\n }, [person, firstName, lastName]);\n\n const eventViews = useMemo(() => {\n if (!person)\n return
;\n\n person.events.sort(personEventSorter);\n return person.events.map(event => );\n }, [person]);\n\n return <>\n
\n
\n \n \n
\n {alsoKnownAs &&

{alsoKnownAs}

}\n {person?.familyInfo}\n
\n \n \n
\n \n {T('menu.aboutNamelist')}\n \n \n \n \n
\n \n
\n
\n
\n {story && }\n
\n
\n {eventViews}\n
\n
\n ;\n}\n","import React from 'react';\nimport PageLink from '../../components/PageLink';\nimport { Person } from '../../models/Person';\nimport { IPublishedPersonStory } from '../../models/PersonStory2';\nimport { PageID } from '../../utils/PageLinking';\nimport styles from './StoryView.module.scss';\n\ninterface StoryViewProps {\n story: IPublishedPersonStory;\n person: Person;\n child: boolean;\n}\n\nexport default function StoryView(props: StoryViewProps) {\n const { story, person } = props;\n\n const firstName = person ? person.firstName : '';\n const lastName = person ? person.lastName : '';\n return (\n \n
\n \n
\n

{firstName}

\n

{lastName}

\n
\n
\n
\n );\n}\n","import React, { useMemo } from 'react';\nimport { Icon } from '../../components/Icons';\nimport { usePerson, usePublishedPersonStory } from '../../FunctionalAPI';\nimport { PersonQueryOptions } from '../../models/Person';\nimport { T } from '../../Translate';\nimport { PageID } from '../../utils/PageLinking';\nimport { PageProps, usePageHeader } from '../Page';\nimport styles from './index.module.scss';\nimport StoryView from './StoryView';\nimport { Col, Row } from \"react-bootstrap\";\n\ninterface ViewStoryPairPageProps extends PageProps {\n story1: string;\n story2: string;\n child: boolean;\n}\n\nconst PersonWithEvents: PersonQueryOptions[] = [PersonQueryOptions.EventsWithPlaces];\nexport const ViewStoryPairPage = (props: ViewStoryPairPageProps) => {\n const { story1: story1id, story2: story2id, loading, child } = props;\n\n const story1 = usePublishedPersonStory(loading, story1id);\n const story2 = usePublishedPersonStory(loading, story2id);\n const person1 = usePerson(loading, story1 && story1.person_id_ref, PersonWithEvents, 'GUEST');\n const person2 = usePerson(loading, story2 && story2.person_id_ref, PersonWithEvents, 'GUEST');\n\n const subtitles = useMemo(() => [T('storyPair.subtitle')], []);\n usePageHeader(\n PageID.PublicViewPersonStory,\n `story1=${story1id}&story2=${story2id}${child ? '&child' : ''}`,\n Icon.Search,\n T('storyPair.title'),\n T('storyPair.title'),\n undefined,\n undefined,\n undefined,\n subtitles\n );\n\n return <>\n
\n
\n
\n \n \n {T('storyPair.text').split('\\n').map(paragraph =>

{paragraph}

)}\n \n
\n
\n
\n
\n
\n
\n \n \n {story1 && person1 && (\n \n )}\n \n \n {story2 && person2 && (\n \n )}\n \n \n
\n
\n ;\n}\n","import React from 'react';\nimport { useElementID } from '../../utils/ElementID';\nimport { InvalidFeedback } from './InvalidFeedback';\n\ninterface PasswordInputProps {\n labelColumns?: number;\n\n name: string;\n label: string;\n value: string;\n error?: string;\n readOnly?: boolean;\n validated?: boolean;\n\n score?: number;\n\n onChange?: (value: string) => void;\n onPressedEnter?: () => void;\n}\n\nexport const PasswordInput = (props: PasswordInputProps) => {\n const {\n name,\n labelColumns = 4,\n label,\n value,\n error,\n readOnly,\n validated,\n score,\n onChange,\n onPressedEnter\n } = props;\n\n const handleKeyPress = onPressedEnter && ((e: React.KeyboardEvent) => {\n if (e.key === 'Enter')\n onPressedEnter();\n }); \n const handleChange = onChange && ((e: React.SyntheticEvent) => {\n onChange(e.currentTarget.value);\n });\n const id = useElementID('input');\n const inputClass = readOnly ? 'form-control-plaintext' : (error ? 'form-control is-invalid' : (validated ? 'form-control is-valid' : 'form-control'));\n return (\n
\n \n
\n \n {score !== undefined && }\n {error && }\n
\n
\n );\n}\n\ninterface StrengthBarProps {\n score: number;\n}\n\nconst StrengthBar = (props: StrengthBarProps) => {\n const { score } = props;\n const scoreClass = score < 60 ? 'progress-bar bg-danger' : (score < 80 ? 'progress-bar bg-warning' : 'progress-bar bg-success');\n const scoreCapped = Math.min(100, score);\n\n return (\n
\n \n
\n );\n}\n","import React, { useState } from 'react';\nimport { ModalProps, useModal } from './BaseModal';\nimport { T } from '../Translate';\nimport API, { IAuthenticationResponse } from '../api';\nimport { LoadingIcon } from '../components/Icons';\nimport { TextInput } from '../components/inputs/TextInput';\nimport { PasswordInput } from '../components/inputs/PasswordInput';\nimport { Modal, Button, Alert } from 'react-bootstrap';\nimport { ModalHeader } from './ModalHeader';\n\ntype LoginModalProps = ModalProps;\n\nconst LoginModal = (props: LoginModalProps) => {\n const [isOpen, resolve] = useModal(props);\n const [loading, setLoading] = useState(false);\n const [username, setUsername] = useState(API.user.username);\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n\n const handleClose = () => resolve(null);\n const handleClickedLogin = async () => {\n setLoading(true);\n try {\n const loginInfo = await API.login(username, password);\n setLoading(false);\n API.loginWith(loginInfo);\n resolve(loginInfo);\n } catch(error) {\n setLoading(false);\n if (error.code === 2)\n setError(T('page.login.invalidLogin'));\n else if (error.code === 8)\n setError(T('page.login.accountNotActivated'));\n }\n };\n\n return (\n \n {T('modal.relogin.title')}\n \n {T('modal.relogin.message')}\n\n
\n \n \n {error && <>\n {error}\n
\n {error}\n
\n }\n \n
\n \n \n \n \n
\n );\n}\nexport default LoginModal;\n","import React, { useMemo } from 'react';\nimport { Breadcrumb as PageBreadcrumb } from '../../pages/PageBreadcrumb';\nimport { Link } from 'react-router-dom';\nimport { Breadcrumb } from 'react-bootstrap';\n\ninterface BreadcrumbItemProps {\n to: string;\n active: boolean;\n children: React.ReactNode;\n}\nconst BreadcrumbItem = (props: BreadcrumbItemProps) => {\n const { to, active, children } = props;\n return (\n
  • \n {active ? children : {children}}\n
  • \n );\n};\n\ninterface BreadcrumbsViewProps {\n breadcrumbs: PageBreadcrumb[];\n}\nexport default (props: BreadcrumbsViewProps) => {\n const { breadcrumbs } = props;\n const views = useMemo(() => breadcrumbs.map((item, index) => {\n return {item.title};\n }), [breadcrumbs]);\n return (\n <>\n { views && views.length > 1 && \n {views}\n }\n \n );\n}\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport React from 'react';\nimport { T, getUILanguages, Language } from '../../Translate';\nimport api from '../../api';\nimport { History } from 'history';\nimport { PageInfo } from '../../pages/Page';\nimport { Icon } from '../Icons';\nimport { Link } from 'react-router-dom';\nimport styles from './AppBar.module.scss';\nimport BreadcrumbsView from './BreadcrumbsView';\nimport { Container } from 'react-bootstrap';\n\nconst CollapseIcon = () => (\n \n \n \n \n \n);\n\ninterface SmallDropdownMenuProps {\n children: React.ReactNode;\n}\nconst SmallDropdownMenu = (props: SmallDropdownMenuProps) => (\n
  • \n \n \n \n \n {props.children}\n
  • \n \n);\n\nenum DropdownMenuItemStyle {\n Normal = 'dropdown-item',\n Danger = 'dropdown-item text-danger'\n}\ninterface DropdownMenuItemProps {\n icon: Icon;\n title: string;\n style?: DropdownMenuItemStyle;\n onClick?: () => void;\n to?: string;\n}\nconst DropdownMenuItem = (props: DropdownMenuItemProps) => {\n const { icon, title, style = DropdownMenuItemStyle.Normal, to, onClick } = props;\n if (to) {\n return (\n \n \n  \n {title}\n \n );\n } else {\n return (\n \n \n  \n {title}\n \n );\n }\n}\n\ninterface AppBarProps {\n history: History;\n loggedIn: boolean;\n page: PageInfo;\n onLanguageChanged: (language: Language) => void;\n}\nexport default class AppBar extends React.Component {\n getLanguageListener(language: Language) {\n return (e: React.SyntheticEvent) => {\n e.preventDefault();\n this.props.onLanguageChanged(language);\n }\n }\n\n handleClickedLogout = () => {\n api.logout();\n window.setTimeout(() => this.props.history.push('/login'));\n }\n\n handleClickedLogin = () => {\n window.setTimeout(() => this.props.history.push('/login'));\n }\n\n handleClickedUserSettings = () => {\n\n }\n\n isLoggedIn() {\n return api.isLoggedIn();\n }\n\n render() {\n const { page } = this.props;\n\n // use either 'container' or 'container-fluid'; container-fluid will make\n // the navbar fill the whole page width\n return <>\n \n {page.breadcrumbs.length > 0 && (\n \n \n \n )}\n ;\n }\n}\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { version } from '../../version.json';\nimport styles from './SideBar.module.scss';\n\nexport enum SideBarColor {\n Purple = 'purple',\n Blue = 'blue',\n Green = 'green',\n Orange = 'orange',\n Red = 'red',\n}\ninterface SideBarProps {\n logo: string;\n title: string;\n backgroundImage: string;\n color: SideBarColor;\n children: JSX.Element|(JSX.Element|false|undefined)[]|false;\n}\nexport const SideBar = (props: SideBarProps) => {\n const { logo, title, backgroundImage, color, children } = props;\n\n return (\n
    \n
    \n
    \n \n logo\n \n \n {title}\n \n
    \n {children}\n
    \n \n
    {version}
    \n
    \n )\n};\n","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/sidebar.017608be.jpg\";","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { Icon } from '../Icons';\n\ninterface NavItemProps {\n icon: Icon;\n title: string;\n to: string;\n}\nexport const NavItem = (props: NavItemProps) => {\n const { icon, title, to } = props;\n return (\n
  • \n \n \n

    {title}

    \n \n
  • \n );\n}\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { Icon } from '../Icons';\n\ninterface NavGroupProps {\n id: string;\n icon: Icon;\n title: string;\n children: JSX.Element|JSX.Element[];\n}\nexport const NavGroup = (props: NavGroupProps) => {\n const { id, icon, title, children } = props;\n return (\n
  • \n \n \n

    \n {title}\n \n

    \n
    \n
    \n
      \n {children}\n
    \n
    \n
  • \n );\n}\n\ninterface NavGroupItemProps {\n icon: Icon;\n title: string;\n to: string;\n}\nexport const NavGroupItem = (props: NavGroupItemProps) => {\n const { icon, title, to } = props;\n return (\n
  • \n \n \n {title}\n \n
  • \n );\n}\n","import React from 'react';\nimport { SideBar, SideBarColor } from '../theme/SideBar';\nimport { T } from '../../Translate';\nimport logo from '../../assets/images/icon.png';\nimport background from '../../assets/images/sidebar.jpg';\nimport { Nav, Button } from 'react-bootstrap';\nimport { NavItem } from '../theme/NavItem';\nimport { NavGroup, NavGroupItem } from '../theme/NavGroup';\nimport { Icon } from '../Icons';\nimport api from '../../api';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { AppState } from '../../redux/State';\nimport { ActiveContactMoment } from '../../models/ActiveContactMoment';\nimport styles from './AppSideBar.module.scss';\nimport { Link } from 'react-router-dom';\nimport { AnyAppAction, endContactMomentAction } from '../../redux/Actions';\nimport { Dispatch } from 'redux';\nimport { NotificationManager } from 'react-notifications';\nimport moment from 'moment';\nimport { inputDateTimeToISO } from '../inputs/DateTimeInput';\nimport { ContactPersonEvent } from '../../models/ContactPerson';\n\nconst ContactMomentView = (props: { contactMoment: ActiveContactMoment }) => {\n const { contactMoment } = props;\n\n const dispatch = useDispatch>();\n const handleClickedStop = () => {\n const startDateTime = inputDateTimeToISO(contactMoment.startsAt);\n if (!startDateTime) {\n NotificationManager.error(T('contactMoment.invalidStart'))\n return;\n }\n api.createContactPersonEvent({\n type: 'contact_moment',\n contactPersonId: contactMoment.person._id,\n contactMethod: contactMoment.type,\n start: startDateTime,\n end: moment().format('YYYY-MM-DDTHH:mm'),\n contributions: contactMoment.contributions,\n transcript: contactMoment.transcript\n } as ContactPersonEvent).then(() => {\n dispatch(endContactMomentAction());\n NotificationManager.success(T('contactMoment.stoppedSuccessfully'))\n });\n };\n\n return (\n
    \n \n
    {T('contactMoment.navtitle')}
    \n
    {contactMoment.person.firstName + ' ' + contactMoment.person.lastName}
    \n \n
    \n \n
    \n
    \n );\n}\n\ninterface AppSideBarProps {\n\n}\nexport const AppSideBar = (props: AppSideBarProps) => {\n const user = api.user;\n const activeContactMoment = useSelector\n (state => state.activeContactMoment.current);\n\n return (\n \n {activeContactMoment && }\n {api.isLoggedIn() && (\n \n )}\n \n );\n}\n","import React from 'react';\nimport { T, Language } from '../../Translate';\nimport API from '../../api';\nimport { History } from 'history';\nimport { PageInfo } from '../../pages/Page';\nimport { Link } from 'react-router-dom';\nimport logo from '../../assets/images/icon.png';\n\ninterface NoLoginAppBarProps {\n history: History;\n loggedIn: boolean;\n page: PageInfo;\n onLanguageChanged: (language: Language) => void;\n}\nexport default class NoLoginAppBar extends React.Component {\n getLanguageListener(language: Language) {\n return (e: React.SyntheticEvent) => {\n e.preventDefault();\n this.props.onLanguageChanged(language);\n }\n }\n\n handleClickedLogout = () => {\n API.logout();\n this.props.history.push('/login');\n }\n\n handleClickedUserSettings = () => {\n \n }\n\n isLoggedIn() {\n return true;\n }\n\n render() {\n // use either 'container' or 'container-fluid'; container-fluid will make\n // the navbar fill the whole page width\n return (\n \n );\n }\n}\n","export default __webpack_public_path__ + \"static/media/vredesstad-ieper.394469ba.png\";","import React from 'react';\nimport iffLogo from '../../../assets/images/logo-inflandersfields.png';\nimport ypresLogo from '../../../assets/images/vredesstad-ieper.png';\nimport { Col, Row } from 'react-bootstrap';\nimport styles from './PublicHeader.module.scss';\nimport { getActiveLanguage, getUILanguages, Language, T } from '../../../Translate';\nimport { ButtonLink } from '../../ButtonLink';\nimport { classes } from '../../../utils/Styles';\nimport { PageInfo } from '../../../pages/Page';\nimport { Link } from 'react-router-dom';\n\ninterface PublicHeaderProps {\n page: PageInfo;\n person?: boolean;\n ypresPeaceLogo?: boolean;\n onLanguageChanged: (language: Language) => void;\n}\n\nexport const PublicHeader = (props: PublicHeaderProps) => {\n const { page, person, ypresPeaceLogo, onLanguageChanged } = props;\n const { title, subtitles, icon } = page;\n const back = page.breadcrumbs.length > 1 ? page.breadcrumbs[page.breadcrumbs.length - 2] : undefined;\n\n return (\n
    \n \n \n {back && (\n
    \n \n ‹ {T('publicSearch.backTo')} {back.title}\n \n
    \n )}\n \n
    \n

    {title}

    \n

    \n {icon && }\n {(subtitles || ['']).map((subtitle, i) => (\n <>\n {i > 0 &&
    }\n {subtitle}\n \n ))}\n

    \n
    \n \n\n \n
    \n
    \n {getUILanguages().map((langcode, i) => (\n \n {i > 0 &&  | }\n onLanguageChanged(langcode)}>\n {langcode.toUpperCase()}\n \n \n ))}\n
    \n
    \n {ypresPeaceLogo && Vredesstad Ieper}\n logo\n
    \n
    \n \n
    \n
    \n )\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAACSCAYAAADRqoF/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTgwMTE3NDA3MjA2ODExOTVGRUJFQzVCNTdERDBGOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDQTNDQjM0MDYzNzkxMUUxQjQ3NEQ2MDA5OURFQkQ5NyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDQTNDQjMzRjYzNzkxMUUxQjQ3NEQ2MDA5OURFQkQ5NyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDU4MDExNzQwNzIwNjgxMTk3MjdCREIwRkIwMTdCNjMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTk1RkVCRUM1QjU3REQwRjgiLz4gPC9yZGY6RGVzY3Jp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\"","import React, { ReactNode } from 'react';\nimport { Language, T } from '../../../Translate';\nimport styles from './PublicLayout.module.scss';\n\nimport { History } from 'history';\nimport { PageInfo } from '../../../pages/Page';\nimport { NotificationContainer } from 'react-notifications';\nimport { PublicHeader } from './PublicHeader';\n\ninterface PublicLayoutProps {\n history: History;\n page: PageInfo;\n onLanguageChanged: (language: Language) => void;\n children: ReactNode;\n person?: boolean;\n ypresPeaceLogo?: boolean;\n}\nexport const PublicLayout = (props: PublicLayoutProps) => {\n const { page, onLanguageChanged, children, person, ypresPeaceLogo } = props;\n\n return (\n
    \n \n
    \n \n
    \n {children}\n
    \n );\n}\n","\nimport React, { CSSProperties, ReactNode } from 'react';\nimport { Language } from '../../Translate';\nimport AppBar from './AppBar';\n\nimport { History } from 'history';\nimport { AppSideBar } from './AppSideBar';\nimport { PageInfo, PageLayout } from '../../pages/Page';\nimport NoLoginAppBar from './NoLoginAppBar';\nimport { NotificationContainer } from 'react-notifications';\nimport { PublicLayout } from './public/PublicLayout';\n\ninterface LayoutProps {\n history: History;\n page: PageInfo;\n onLanguageChanged: (language: Language) => void;\n layout?: PageLayout;\n children: ReactNode;\n}\nexport const Layout = (props: LayoutProps) => {\n const { layout = PageLayout.Regular } = props;\n switch (layout) {\n case PageLayout.NoFrames:\n return ;\n case PageLayout.Public:\n return ;\n case PageLayout.PublicPerson:\n return ;\n case PageLayout.PublicPersonKey:\n return ;\n case PageLayout.PublicMapKeyLocations:\n return ;\n default:\n return ;\n }\n}\n\nconst RegularLayout = (props: LayoutProps) => {\n const { history, page, onLanguageChanged, children } = props;\n const mainPanelStyle: CSSProperties = {};\n\n return (\n
    \n \n \n
    \n \n {children}\n
    \n
    \n );\n}\n\nconst NoFramesLayout = (props: LayoutProps) => {\n const { history, page, onLanguageChanged, children } = props;\n return (\n
    \n \n
    \n \n {children}\n
    \n
    \n );\n}\n\n\nconst BlankLayout = (props: LayoutProps) => {\n const { history, page, onLanguageChanged, children } = props;\n return (\n
    \n {children}\n
    \n );\n}\n","import React from 'react';\nimport { LoadingItem } from '../utils/Loading';\nimport { TranslationKey, listOf, T } from '../Translate';\nimport { Icon } from './Icons';\nimport { Card } from 'react-bootstrap';\nimport { Backdrop } from './Backdrop';\n\ninterface LoadingModalProps {\n loading: LoadingItem[];\n}\nexport const LoadingModal = (props: LoadingModalProps) => {\n const { loading } = props;\n\n const grouped = loading.reduce((result, item) => {\n const index = result.findIndex(x => x.action === item.action);\n if (index >= 0)\n result[index].items.push(item.displayName);\n else\n result.push({ action: item.action, items: [item.displayName] });\n return result;\n }, [] as { action: TranslationKey, items: string[] }[]);\n\n // only use the first element in the group to show as loading text\n const filteredGroup = grouped.length > 1 ? [grouped[0]] : grouped\n // and only show the first item in the action items list\n const messages = filteredGroup.map(entry =>

    {T(entry.action, { x: listOf([entry.items[0]])})}

    )\n return (\n \n \n \n \n {messages}\n \n \n \n )\n};\n","import api, { IAPIError } from \"../api\";\nimport { NotificationManager } from 'react-notifications';\nimport ValidationResult from \"./ValidationError\";\n\n\nclass GlobalErrorHandler {\n constructor() {\n this.registerAsApiErrorHandler()\n }\n\n registerAsApiErrorHandler() {\n api.onError = this.handleError;\n }\n\n handleError(error: IAPIError) {\n let message: string | undefined = error.message;\n if (error.code === 1013) {\n // validation error\n const validationResult = new ValidationResult(error.message)\n message = validationResult.notificationMessage()\n } else {\n const validationResult = new ValidationResult(error.message)\n if (!validationResult.name) {\n message = validationResult.notificationMessage()\n }\n }\n if (message) {\n NotificationManager.error(message,\n undefined,\n 5000);\n }\n }\n}\n\n\nexport default new GlobalErrorHandler();\n","import React from 'react';\nimport { HashRouter, Prompt, RouteComponentProps } from 'react-router-dom';\nimport queryString from 'query-string';\nimport { setLanguage, Language, getActiveLanguage, TranslationKey, getLanguages } from './Translate';\nimport API, { IAuthenticationResponse } from './api';\n\nimport LoginModal from './modals/LoginModal';\nimport { PageProps, ContextPageProps, PageLayout } from './pages/Page';\nimport { Layout } from './components/layout/Layout';\nimport { History } from 'history';\n\n\nimport { ModalTarget } from './modals/ModalTarget';\nimport { ModalProps } from './modals/BaseModal';\nimport { LoadingItem, Loading } from './utils/Loading';\nimport { LoadingModal } from './components/LoadingModal';\nimport { ActivePageState } from './redux/State';\nimport { ModalContextProvider } from './modals/ModalContext';\nimport globalErrorHandler from \"./utils/GlobalErrorHandler\";\nimport { AppContextProvider, IAppContext } from './utils/AppContext';\n\n\nexport interface AppProps {\n history: History;\n page: ActivePageState;\n}\n\nexport interface AppComponentState {\n modals: JSX.Element[];\n loading: LoadingItem[];\n language: Language;\n}\n\nexport interface Renderers {\n renderPage: (\n cls: React.ComponentClass|React.FunctionComponent,\n layout?: PageLayout\n ) => (props: RouteComponentProps) => React.ReactNode;\n\n renderWithProps: (\n cls: React.ComponentClass|React.FunctionComponent,\n extractProps: (props: RouteComponentProps, query: queryString.ParsedQuery, params: {[key: string]: string}) => P,\n layout?: PageLayout\n ) => (props: RouteComponentProps) => React.ReactNode;\n}\n\nexport class BaseApp extends React.Component {\n loggingIn: Promise|null;\n modalCounter: number;\n modals: ModalTarget;\n loadingInfo: Loading;\n globalErrorHandler: Object;\n appContext: IAppContext;\n\n constructor(props: AppProps) {\n super(props);\n\n this.loggingIn = null;\n this.state = {\n modals: [],\n loading: [],\n language: getActiveLanguage(),\n };\n\n this.modalCounter = 0;\n this.modals = { show: this.showModal.bind(this) };\n this.loadingInfo = {\n loading: this.loading.bind(this),\n saving: this.saving.bind(this),\n pending: this.pending.bind(this)\n };\n\n this.appContext = {\n loading: this.loadingInfo,\n history: props.history\n };\n\n API.onRequireLogin = this.handleRequireLogin;\n\n this.globalErrorHandler = globalErrorHandler;\n }\n\n handleLanguageChanged = (languageCode: Language) => {\n setLanguage(languageCode);\n this.setState({ language: languageCode });\n }\n\n handleRequireLogin = () => {\n if (this.loggingIn)\n return this.loggingIn;\n\n this.loggingIn = this.showModal(props => (\n {\n this.loggingIn = null;\n props.onClosed();\n }}\n />\n ));\n return this.loggingIn;\n }\n\n showModal(modal: (props: ModalProps) => JSX.Element): Promise {\n return new Promise((resolve, reject) => {\n const id = this.modalCounter++;\n const Modal = modal;\n const newModal = (\n this.handleModalClosed(id)}\n />\n );\n this.setState(state => ({ modals: [...state.modals, newModal] }));\n });\n }\n\n handleModalClosed(id: number) {\n setTimeout(() => {\n this.setState(state => ({ modals: state.modals.filter(modal => (modal.key || '').toString() !== id.toString())}));\n }, 1000); // give the modal a little bit of time to perform its close animation\n }\n\n confirmNavigation = (message: string, callback: (result: boolean) => void) => {\n const { page } = this.props;\n if (page.confirmNavigation) {\n page.confirmNavigation().then(result => callback(result));\n } else {\n callback(true);\n }\n }\n\n loading(promise: Promise, displayName: string): Promise {\n return this.pending(promise, 'pending.loading', displayName);\n }\n\n saving(promise: Promise, displayName: string): Promise {\n return this.pending(promise, 'pending.saving', displayName);\n }\n\n async pending(promise: Promise, action: TranslationKey, displayName: string): Promise {\n const item: LoadingItem = { action, displayName };\n this.setState(state => {\n const { loading } = state;\n const newLoading = [...loading, item];\n return { loading: newLoading };\n });\n try {\n const result = await promise;\n this._stopLoading(item);\n return result;\n }\n catch (err) {\n this._stopLoading(item);\n throw err;\n }\n }\n\n _stopLoading(item: LoadingItem) {\n this.setState(state => {\n const { loading } = state;\n const index = loading.indexOf(item);\n if (index < 0)\n return { loading };\n\n const newLoading = [...loading];\n newLoading.splice(index, 1);\n return { loading: newLoading };\n });\n }\n\n renderRoutes() {\n const { loading } = this.state;\n const { page, history } = this.props;\n const pageParams: ContextPageProps = {\n history,\n modals: this.modals,\n loading: this.loadingInfo,\n pending: loading\n };\n\n\n const renderPage = (\n cls: React.ComponentClass|React.FunctionComponent,\n layout?: PageLayout\n ) => {\n const PageClass = cls;\n return (props: RouteComponentProps) => {\n const query = queryString.parse(props.location.search);\n const via = typeof(query.via) === 'string' ? query.via : undefined;\n if (props.match.params.params) {\n const params = parseParams(props.match.params.params);\n processParams(params);\n }\n return (\n \n { loading.length > 0 && }\n \n \n );\n };\n };\n\n const renderWithProps = (\n cls: React.ComponentClass|React.FunctionComponent,\n extractProps: (props: RouteComponentProps, query: queryString.ParsedQuery, params: {[key: string]: string}) => P,\n layout?: PageLayout\n ) => {\n const PageClass = cls;\n return (props: RouteComponentProps) => {\n const query = queryString.parse(props.location.search);\n const via = typeof(query.via) === 'string' ? query.via : undefined;\n const params = props.match.params.params ? parseParams(props.match.params.params) : {};\n processParams(params);\n const extraProps = extractProps(props, query, params);\n return (\n \n { loading.length > 0 && }\n \n \n );\n }\n };\n\n return this.renderRouteSwitch({ renderPage, renderWithProps });\n }\n\n renderRouteSwitch(renderers: Renderers) {\n throw Error(\"Not implemented\");\n }\n\n render() {\n const { language, modals } = this.state;\n const { page } = this.props;\n\n return (\n \n \n \n \n {this.renderRoutes()}\n {modals}\n \n \n \n );\n }\n}\n\nfunction parseParams(params: String) {\n const parts = params.split('&');\n const result:{[key: string]: string} = {};\n parts.forEach(part => {\n const separator = part.indexOf('=');\n if (separator < 0) {\n result[part] = '';\n } else {\n let key = part.substring(0, separator);\n let value = part.substring(separator + 1);\n result[key] = value;\n }\n });\n console.log('Params:', result);\n return result;\n}\n\nfunction processParams(params: {[key: string]: string}) {\n if (params.lang || params.language) {\n const language = (params.lang || params.language).toLocaleLowerCase() as Language;\n if (getLanguages().includes(language)) {\n setLanguage(language);\n }\n }\n}\n","import React, {useCallback, useEffect, useMemo, useState} from 'react';\nimport {Icon} from '../../components/Icons';\nimport {getActiveLanguage, plural, T} from '../../Translate';\nimport {\n ActionsTableColumn,\n ComponentTableColumn,\n IntegerCalculatedTableColumn,\n IntegerFieldTableColumn,\n ITableColumn,\n tableRowActions,\n TableRowActionStyle\n} from '../../components/table/Fields';\nimport api from '../../api';\nimport {IQueryResult} from '../../models/Generic';\nimport {ConfirmationModal} from '../../modals/Confirmation';\nimport {NotificationManager} from 'react-notifications';\nimport {ListPage, ListState} from '../ListPage';\nimport {PageProps} from '../Page';\nimport {usePageState} from '../../redux/Actions';\nimport {useModalContext} from '../../modals/ModalContext';\nimport {PageID} from '../../utils/PageLinking';\nimport {IKeyLocation} from '../../models/KeyLocation';\nimport {Button} from \"react-bootstrap\";\n\nexport type ListKeyLocationsPageState = ListState;\n\nconst rowKey = (keyLocation: IKeyLocation) => keyLocation._id;\nconst PageSize = 10;\n\nexport default function ListKeyLocations(props: PageProps) {\n const {history, loading, via} = props;\n\n const modals = useModalContext();\n const user = api.user;\n\n const [pageState, updatePageState] = usePageState('keyLocations');\n const {filter, tablePage, sortColumn, sortDirection} = pageState;\n const [items, setItems] = useState>();\n\n const refresh = useCallback(() => {\n loading.loading(api.findKeyLocations(\n filter,\n tablePage * PageSize,\n PageSize,\n [[sortColumn, sortDirection]],\n ['photos']\n ), plural('keyLocation'))\n .then(setItems);\n }, [loading, filter, tablePage, sortColumn, sortDirection]);\n useEffect(refresh, [refresh]);\n\n const columns = useMemo(() => {\n const handleClickedDelete = (keyLocation: IKeyLocation) => {\n modals.show(props => (\n \n )).then(confirmed => {\n if (!confirmed)\n return;\n\n api.removeKeyLocation(keyLocation._id).then(() => {\n NotificationManager.success(T('modal.removeKeyLocation.removed'));\n refresh();\n });\n });\n }\n\n const columns: ITableColumn[] = [\n new ComponentTableColumn('name', T('keyLocation.field.name'), keyLocation =>\n {keyLocation.name}, {ellipsize: true, sortable: true, clickable: true}),\n new IntegerFieldTableColumn('number', T('keyLocation.field.number')),\n new IntegerFieldTableColumn('year', T('keyLocation.field.year')),\n new IntegerCalculatedTableColumn('photos', T('keyLocation.field.photos'), keyLocation => keyLocation.photos?.length || 0),\n ];\n if (user.canEdit()) {\n columns.push(new ActionsTableColumn('actions', T('generic.list.actions'), keyLocation => tableRowActions(\n {icon: Icon.Eye, style: TableRowActionStyle.Success, page: PageID.PublicViewKeyLocation, pageParam: keyLocation._id},\n {icon: Icon.Edit, style: TableRowActionStyle.Success, page: PageID.EditKeyLocation, pageParam: keyLocation._id},\n {icon: Icon.TimesCircle, style: TableRowActionStyle.Danger, onClick: handleClickedDelete}\n ), {width: 100}));\n }\n return columns;\n }, [user, modals, refresh]);\n\n const handleClickedAdd = () => {\n history.push('/key_locations/create');\n };\n\n const handleClickedRow = (keyLocation: IKeyLocation) => {\n history.push(`/key_locations/${keyLocation._id}/edit`);\n };\n\n const getMapUrl = () => {\n return `#/public/key_locations_map/${getActiveLanguage()}`\n }\n\n\n return (\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n);\n}\n","import { getFileTypeFromMimeType, getLargeIcon, getTinyIcon } from \"../utils/MimeTypes\";\n\nexport interface IAttachment {\n _id: string;\n collection?: string;\n collection_id?: string;\n mimetype: string;\n extension: string;\n position: string;\n description: string;\n urls: {\n original: string;\n tiny?: string;\n preview?: string;\n }\n}\n\nexport function getAttachmentPreviewUrl(attachment: IAttachment) {\n if (!attachment.urls.preview && (!attachment.mimetype || attachment.mimetype === 'image/jpeg' || attachment.mimetype === 'image/png')) {\n return `https://s3-eu-west-1.amazonaws.com/bitmunks-ff/attachments_l_${attachment._id}.png`;\n }\n\n const type = getFileTypeFromMimeType(attachment.mimetype);\n return attachment.urls.preview || getLargeIcon(type);\n};\n\nexport function getAttachmentTinyUrl(attachment: IAttachment) {\n if (!attachment.urls.preview && (!attachment.mimetype || attachment.mimetype === 'image/jpeg' || attachment.mimetype === 'image/png')) {\n return `https://s3-eu-west-1.amazonaws.com/bitmunks-ff/attachments_xs_${attachment._id}.png`;\n }\n\n const type = getFileTypeFromMimeType(attachment.mimetype);\n return attachment.urls.tiny || getTinyIcon(type);\n};\n","import React from 'react';\nimport { IAttachment, getAttachmentPreviewUrl } from '../models/Attachment';\nimport { Icon } from './Icons';\nimport { Button } from 'react-bootstrap';\nimport { AttachmentFileUploader } from './FileUploader';\nimport { NotificationManager } from 'react-notifications';\nimport { T } from '../Translate';\n\ninterface AttachmentViewProps {\n attachment: IAttachment;\n onClickedDelete: (attachment: IAttachment) => void;\n}\nexport const AttachmentView = (props: AttachmentViewProps) => {\n const { attachment, onClickedDelete } = props;\n return (\n \n onClickedDelete(attachment)}\n style={{ position: 'absolute', right: 0, bottom: 0 }}\n >\n \n \n \n
    \n );\n}\n\ninterface AttachmentListViewProps {\n attachments: IAttachment[];\n collection?: string;\n collectionId?: string;\n maxItems?: number;\n\n onClickedDelete: (attachment: IAttachment) => void;\n onCreated: (attachment: IAttachment) => void;\n}\nexport const AttachmentListView = (props: AttachmentListViewProps) => {\n const { attachments, collection, collectionId, onClickedDelete, onCreated, maxItems } = props;\n\n const handleCreated = (attachments: IAttachment[]|'NOK') => {\n if (attachments === 'NOK') {\n NotificationManager.error(T('generic.errors.fileUploadFailed'));\n } else {\n onCreated(attachments[0]);\n }\n };\n\n const attachmentViews = attachments.map(attachment => (\n \n ));\n return (\n
    \n {attachmentViews}\n {(collection === undefined || collectionId !== undefined) && (maxItems === undefined || attachments.length < maxItems) && (\n \n )}\n
    \n );\n}\n","import {Form, Image, Button} from \"react-bootstrap\";\nimport {FormCard} from \"../../components/FormCard\";\nimport {Icon} from \"../../components/Icons\";\nimport {T} from \"../../Translate\";\nimport {MapMarkerInput, MapMarkerInputValue} from \"../../components/inputs/MapMarkerInput\";\nimport {IAttachment} from \"../../models/Attachment\";\nimport {TextInput} from \"../../components/inputs/TextInput\";\nimport {TextareaInput} from \"../../components/inputs/TextareaInput\";\nimport {MapCoordinatesInput} from \"../../components/inputs/MapCoordinatesInput\";\nimport {IKeyLocation, KeyLocationNotes} from \"../../models/KeyLocation\";\nimport {AttachmentListView} from \"../../components/AttachmentView\";\nimport React, {useState} from \"react\";\nimport api from \"../../api\";\nimport {isDigit} from \"../../utils/conversions\";\nimport {LanguageSelector} from \"../EditPersonStory/Stories/LanguageSelector\";\nimport {Language} from \"../../models/PersonStory2\";\nimport { CheckboxInput } from \"../../components/inputs/CheckboxInput\";\n\ninterface KeyLocationTabProps {\n keyLocation?: IKeyLocation;\n name: string;\n nameError?: string;\n position: MapMarkerInputValue;\n positionError?: string;\n year: string;\n yearError?: string;\n notes: KeyLocationNotes;\n number: string;\n positionLocked: boolean;\n photos: IAttachment[];\n onNameChange: (name: string) => void;\n onPositionChange: (position: MapMarkerInputValue) => void;\n onYearChange: (year: string) => void;\n onNumberChange: (number: string) => void;\n onNotesChange: (notes: KeyLocationNotes) => void;\n onPositionLockedChange: (locked: boolean) => void;\n onPhotoCreated: (photo: IAttachment) => void;\n onPhotoDeleted: (photo: IAttachment) => void;\n}\n\nexport function KeyLocationTab(props: KeyLocationTabProps) {\n const {\n keyLocation,\n name,\n nameError,\n position,\n positionError,\n year,\n yearError,\n notes,\n photos,\n number,\n positionLocked,\n onNameChange,\n onPositionChange,\n onYearChange,\n onNotesChange,\n onPhotoCreated,\n onPhotoDeleted,\n onNumberChange,\n onPositionLockedChange\n } = props;\n\n const [localLanguage, setLocalLanguage] = useState(Language.NL)\n\n const getQRUrl = (): string => {\n if (keyLocation === undefined) {\n return ''\n }\n return api.baseUrl + '/qr/keyLocation?token=' + api.token + '&id=' + keyLocation?._id + '&target=download'\n }\n\n const onNumberValueChangedChanged = (length: number, f: (v: string) => void) => {\n return (v: string) => {\n if (v.length > length)\n return;\n\n if (!isDigit(v))\n return;\n\n f(v);\n }\n }\n\n const onNotesChangedForLanguage = (notesForLanguage: string) => {\n let newNotes = {...notes};\n newNotes[localLanguage] = notesForLanguage;\n onNotesChange(newNotes);\n }\n\n const onUpdateLanguage = (newLanguage: Language) => {\n setLocalLanguage(newLanguage)\n }\n\n const leftForm = (\n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n\n \n \n );\n\n const rightForm = (\n
    \n \n \n \n \n );\n\n const QRCardEmptyContent = () => {\n return <>\n
    \n
    \n
    \n {\"No QRCode yet\"}\n
    \n
    \n
    \n \n }\n\n const QRCardFullContent = () => {\n return <>\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n }\n\n const QRCardContent = () => {\n if (keyLocation && keyLocation._id) {\n return QRCardFullContent()\n } else {\n return QRCardEmptyContent()\n }\n }\n\n const QRCard = () => {\n return <>\n \n {QRCardContent()}\n \n \n }\n\n\n return <>\n
    \n
    \n {/**/}\n
    \n \n {leftForm}\n \n
    \n
    \n \n {rightForm}\n \n
    \n
    \n
    \n
    \n \n {keyLocation ? (\n \n ) : {T('page.keyLocation.photos.saveFirst')}}\n \n
    \n
    \n {QRCard()}\n
    \n
    \n
    \n ;\n}\n"," export const isDigit = (value:string):Boolean => {\n const numberValue = Number(value)\n return !isNaN(numberValue);\n }","import { useMemo, useState } from \"react\";\nimport { T } from \"../../Translate\";\nimport { FormCard } from \"../../components/FormCard\";\nimport { Icon } from \"../../components/Icons\";\nimport { SortDirection, Table } from \"../../components/table/Table\";\nimport { IKeyLocation } from \"../../models/KeyLocation\";\nimport { IPersonStory2 } from \"../../models/PersonStory2\";\nimport { PageID, getPageLinkWithVia } from \"../../utils/PageLinking\";\nimport { History } from 'history';\nimport { deletePersonStory } from \"../ListPersonStories/actions\";\nimport { getPersonStoryColumns } from \"../ListPersonStories/Columns\";\nimport { useModalContext } from \"../../modals/ModalContext\";\n\ninterface LocationStoriesTabProps {\n history: History;\n keyLocation?: IKeyLocation;\n refresh: () => void;\n}\n\nconst None: never[] = [];\nconst PageSize = 10;\n\nexport function LocationStoriesTab(props: LocationStoriesTabProps) {\n const {history, keyLocation, refresh} = props;\n const {stories = None } = keyLocation || {};\n const [page, setPage] = useState(0);\n const [sortDirection, setSortDirection] = useState(SortDirection.Up);\n const [sortColumn, setSortColumn] = useState('name');\n const modals = useModalContext();\n\n const handleSortChanged = (column: string, direction: SortDirection) => {\n setSortColumn(column);\n setSortDirection(direction);\n };\n\n const displayedStories = useMemo(\n () => stories.slice(PageSize * page, PageSize * (page + 1)),\n [stories, page]\n );\n\n const handleClickedRow = (personStory: IPersonStory2) => {\n const link = getPageLinkWithVia(PageID.EditPersonStory, personStory._id, PageID.EditKeyLocation, keyLocation?._id);\n history.push(link);\n };\n\n const columns = useMemo(() => {\n const handleClickedDelete = (personStory: IPersonStory2) => {\n deletePersonStory(personStory, modals, () => {refresh();})\n };\n\n return getPersonStoryColumns(false, handleClickedDelete);\n }, [modals, refresh]);\n\n return (\n \n {keyLocation ? (\n \n ) :

    {T('page.keyLocation.tab.stories.notSavedYet')}

    }\n
    \n );\n}\n","import {useState, useEffect, useCallback} from 'react';\nimport {PageProps, Page} from '../Page';\nimport {Icon} from '../../components/Icons';\nimport {Button} from 'react-bootstrap';\nimport {MapMarkerInputValue} from '../../components/inputs/MapMarkerInput';\nimport api from '../../api';\nimport {showNotification} from '../../utils/Notification';\nimport {BottomButtonRow} from '../../components/ButtonRow';\nimport {useKeyLocation} from '../../FunctionalAPI';\nimport {useStateWithError} from '../../utils/Functional';\nimport {PageID, getPageVia} from '../../utils/PageLinking';\nimport {IKeyLocation} from '../../models/KeyLocation';\nimport {ValidationError} from '../../models/ValidationResult';\nimport {IAttachment} from '../../models/Attachment';\nimport {KeyLocationTab} from './KeyLocationTab';\nimport {TopTab, TopTabs} from '../../components/TopTabs';\nimport {LocationStoriesTab} from './LocationStoriesTab';\nimport {Language} from \"../../models/PersonStory2\";\nimport {T} from \"../../Translate\";\n\ninterface EditKeyLocationProps extends PageProps {\n id?: string;\n}\n\nconst LoadOptions: ('photos' | 'stories')[] = ['photos', 'stories'];\n\nexport default function EditKeyLocation(props: EditKeyLocationProps) {\n const {loading, id, history, via} = props;\n\n const user = api.user;\n const keyLocation = useKeyLocation(loading, id, LoadOptions);\n const title = id ? T('page.keyLocation.title.edit') : T('page.keyLocation.title.create');\n const icon = Icon.Key;\n\n const [name, setName, nameError, setNameError] = useStateWithError('');\n const [position, setPosition] = useState(MapMarkerInputValue.empty());\n const [positionError, setPositionError] = useState();\n const [year, setYear, yearError, setYearError] = useStateWithError('');\n const [number, setNumber, numberError, setNumberError] = useStateWithError('0');\n const [positionLocked, setPositionLocked] = useState(false);\n\n\n const emptyLanguages: Record = {\n [Language.NL]: '',\n [Language.EN]: '',\n [Language.FR]: '',\n [Language.DE]: ''\n };\n\n\n const [notes, setNotes] = useState>(emptyLanguages);\n const [photos, setPhotos] = useState([]);\n\n const clearForm = () => {\n setName('');\n setPosition(MapMarkerInputValue.empty());\n setYear('');\n setNotes(emptyLanguages);\n setPhotos([]);\n setNumber('0');\n setPositionLocked(false);\n };\n\n useEffect(() => {\n if (keyLocation) {\n setName(keyLocation.name);\n setPosition(MapMarkerInputValue.fromValue({\n lat: keyLocation.position.lat,\n lng: keyLocation.position.lon\n }));\n setPositionError(undefined);\n setYear(keyLocation.year.toString());\n setNotes(keyLocation.notes);\n setPhotos(keyLocation.photos || []);\n setNumber(keyLocation.number.toString());\n setPositionLocked(keyLocation.positionLocked);\n } else {\n clearForm();\n }\n }, [keyLocation]); // eslint-disable-line react-hooks/exhaustive-deps\n // dependencies verified - and not necessary here:\n // - setters never change\n // - clearForm only uses setters, too, thus all instances of clearForm are equivalent\n\n const createNewKeyLocation = () => {\n if (id) {\n history.push('/key_locations/create');\n } else {\n clearForm();\n }\n };\n\n const handleClickedRemoveAttachment = useCallback((attachment: IAttachment) => {\n api.removeAttachment(attachment._id).then(() => {\n setPhotos(photos => photos.filter(x => x._id !== attachment._id));\n });\n }, []);\n const handleCreatedAttachment = useCallback((attachment: IAttachment) => {\n setPhotos(photos => [...photos, attachment]);\n }, []);\n\n const save = (createNew: boolean) => {\n\n let hasErrors = false;\n if (!/^[0-9]+$/.exec(year)) {\n setYearError(ValidationError.InvalidYear);\n hasErrors = true;\n }\n console.log(position);\n if (!position.valid) {\n setPositionError(T('page.keyLocation.error.positionInvalid'));\n hasErrors = true;\n } else if (!position.lastValidPosition) {\n setPositionError(T('page.keyLocation.error.positionNotSet'));\n hasErrors = true;\n }\n if (hasErrors) {\n return;\n }\n\n const yearAsInt = parseInt(year);\n const numberAsInt = parseInt(number);\n const data: Omit & { _id?: string } = {\n _id: id,\n name,\n number: numberAsInt,\n position: {lat: position.lastValidPosition!.lat, lon: position.lastValidPosition!.lng},\n year: yearAsInt,\n notes,\n positionLocked\n };\n\n api.validateKeyLocation(data, id ? 'update' : 'create').then(result => {\n if (result.status === 'NOK') {\n const errors = result.data || {};\n setNameError(errors.name);\n setYearError(errors.year);\n if (errors.position === ValidationError.InvalidPosition) {\n setPositionError(T('page.keyLocation.error.positionInvalid'));\n }\n return;\n }\n\n if (id) {\n const dataWithId = Object.assign(data, {_id: id});\n api.updateKeyLocation(dataWithId)\n .then(() => {\n showNotification({message: T('page.keyLocation.updated')});\n if (createNew)\n createNewKeyLocation();\n });\n } else {\n api.createKeyLocation(data)\n .then(keyLocation => {\n showNotification({message: T('page.keyLocation.created')});\n if (createNew) {\n createNewKeyLocation();\n } else {\n history.push(`/key_locations/${keyLocation._id}/edit`);\n }\n });\n }\n });\n }\n\n const handleClickedSave = () => {\n save(false);\n };\n\n const tabs: TopTab[] = [\n {\n icon: Icon.Key,\n title: T('page.keyLocation.tab.keyLocation'),\n id: 'location',\n content: () => (\n {\n setPosition(position);\n setPositionError(undefined);\n }}\n onYearChange={setYear}\n onNotesChange={setNotes}\n onNumberChange={setNumber}\n onPositionLockedChange={setPositionLocked}\n onPhotoCreated={handleCreatedAttachment}\n onPhotoDeleted={handleClickedRemoveAttachment}\n />\n )\n }, {\n icon: Icon.Link,\n title: T('page.keyLocation.tab.stories'),\n id: 'linkedStories',\n content: () => (\n {/* TODO */\n }}\n />\n )\n }\n ];\n\n return (\n \n \n \n \n \n \n );\n}\n","import { useMemo } from 'react';\nimport { Icon } from '../../components/Icons';\nimport { useKeyLocation } from '../../FunctionalAPI';\nimport { getActiveLanguage, T } from '../../Translate';\nimport { PageID } from '../../utils/PageLinking';\nimport { PageProps, usePageHeader } from '../Page';\nimport { PublicLink } from '../PublicViewPersonStory/PublicButton';\nimport styles from './index.module.scss';\nimport storyStyles from '../PublicViewPersonStory/index.module.scss';\nimport { Card, Col, Row } from \"react-bootstrap\";\nimport ImageCarrousel from '../PublicViewPersonStory/ImageCarrousel';\nimport { IPersonStory2 } from '../../models/PersonStory2';\nimport { MarkdownView } from '../../components/MarkdownView';\nimport PageLink from '../../components/PageLink';\nimport storyViewStyles from '../PublicViewPersonStory/StoryView.module.scss';\nimport { IKeyLocation } from '../../models/KeyLocation';\nimport { MapMarkerInput, MapMarkerInputMap, MapMarkerInputValue } from '../../components/inputs/MapMarkerInput';\n\ninterface ViewKeyLocationPageProps extends PageProps {\n id: string;\n}\n\nconst namelistLinks: {[key: string]: string} = {\n 'nl': 'https://www.inflandersfields.be/nl/kenniscentrum/namenlijst/',\n 'en': 'https://www.inflandersfields.be/en/kenniscentrum-e/namenlijst-e',\n 'fr': 'https://www.inflandersfields.be/fr/kenniscentrum-f/namenlijst-f',\n 'de': 'https://www.inflandersfields.be/de/kenniscentrum-d/namenlijst-d'\n};\n\nconst LocationWithPhotos: ('photos'|'stories')[] = ['photos', 'stories'];\n\nexport const ViewKeyLocationPage = (props: ViewKeyLocationPageProps) => {\n const { id, loading } = props;\n\n const keyLocation = useKeyLocation(loading, id, LocationWithPhotos);\n const keyStories = keyLocation?.stories || [];\n\n const subtitles = useMemo(() => [T('page.keyLocation.public.subtitle1'), T('page.keyLocation.public.subtitle2')], []);\n usePageHeader(\n PageID.PublicViewKeyLocation,\n id,\n undefined,\n T('page.keyLocation.public.title'),\n '',\n undefined,\n undefined,\n undefined,\n subtitles\n );\n\n return <>\n
    \n
    \n
    \n \n {T('page.keyLocation.public.extraInformation')}\n \n
    \n
    \n
    \n {keyLocation && }\n
    \n
    \n {keyStories.filter(story => story.published_date).map(story => (\n \n ))}\n
    \n
    \n ;\n}\n\ninterface KeyLocationViewProps {\n keyLocation: IKeyLocation;\n}\n\nfunction KeyLocationView(props: KeyLocationViewProps) {\n const { keyLocation } = props;\n\n const carrouselImages = useMemo(() => {\n return (keyLocation?.photos || []).map(photo => ({\n url: photo.urls.preview || photo.urls.original,\n fullSizeUrl: photo.urls.original\n }));\n }, [keyLocation]);\n\n return (\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n }\n mapElement={
    }\n readOnly\n position={MapMarkerInputValue.fromPosition(keyLocation.position)}\n defaultZoom={15}\n onChange={() => {}}\n />\n\n {/**/}\n {keyLocation && keyLocation.photos && keyLocation.photos.length > 0 && (\n \n )}\n
    \n
    \n
    \n
    \n );\n}\n\ninterface StoryViewProps {\n story: IPersonStory2;\n}\n\nfunction StoryView(props: StoryViewProps) {\n const { story } = props;\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n \n

    \n {story.first_name} {story.family_name}\n

    \n
    \n \n
    \n {story.story_text?.[getActiveLanguage()]?.story_part_1 || ''}\n
    \n
    \n \n {T('page.keyLocation.public.readStory')}\n \n
    \n
    \n
    \n
    \n
    \n );\n}","import { KeyLocation } from \"./KeyLocation\";\n\nexport interface IAPIError {\n code: number | string;\n data?: string;\n message: string;\n}\n\nexport type ActionType = 'create'|'update';\n\nexport function convertNonJSONRPCRequestError(error: any) {\n if (\"readyState\" in error && error.readyState === 0) {\n const noConnectionError: IAPIError = {\n code: \"network\",\n message: \"No Network Response\",\n data: undefined\n }\n return noConnectionError;\n }\n // handle http errors\n if (\"status\" in error && error.status >= 400) {\n const httpError: IAPIError = {\n code: 'http',\n message: error.statusText,\n data: undefined\n }\n return httpError\n }\n return error;\n}\n\nclass KeyMapAPI {\n baseUrl: string;\n url: string;\n uploadAttachmentUrl: string;\n uploadPageUrl: string;\n uploadDocumentUrl: string;\n id: number;\n token: string | null;\n refreshingToken: Promise | null;\n\n onError?: (error: IAPIError) => void;\n failHandler?: (error: IAPIError) => void;\n\n constructor(url: string) {\n this.baseUrl = url;\n this.url = url + \"/v2\";\n this.uploadAttachmentUrl = url + '/file/uploadImage';\n this.uploadPageUrl = url + '/uploadpage/uploadImage';\n this.uploadDocumentUrl = url + '/uploaddocument/uploadImage';\n this.id = 1;\n this.token = localStorage.getItem('token') || null;\n\n this.refreshingToken = null;\n }\n\n setToken(token: string) {\n this.token = token;\n\n localStorage.setItem('token', token);\n }\n\n useGuestToken() {\n this.token = 'GUEST';\n }\n\n _requestTyped(method: string, parameters: any, deserializer: (value: any) => T): Promise {\n return this._request(method, parameters).then(result => deserializer(result));\n }\n\n async _request(method: string, parameters: any): Promise {\n const id = this.id++;\n\n let parametersWithToken = parameters;\n if (method !== 'authenticate2' && !parameters.token)\n parametersWithToken = {...parameters, token: this.token || 'GUEST'};\n\n const data = {\n id: id,\n jsonrpc: '2.0',\n method: method,\n params: parametersWithToken\n };\n try {\n const success = await this._doRequest(data);\n if (success.result !== undefined) {\n return success.result;\n } else if (success.error) {\n throw success.error;\n } else {\n throw Error('Unexpected response');\n }\n } catch (errorResponse) {\n const error = convertNonJSONRPCRequestError(errorResponse)\n\n if (this.onError) {\n this.onError(error);\n }\n if (this.failHandler)\n this.failHandler(error);\n\n throw error;\n }\n }\n\n _doRequest(request: any) {\n // actually equivalent (and doesn't need jquery) - but would need to be tested for error handling conditions\n return fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json;charset=utf-8'\n },\n body: JSON.stringify(request),\n }).then(response => response.json());\n\n /*return Promise.resolve($.ajax({\n url: this.url,\n headers: {},\n type: 'POST',\n data: JSON.stringify(request),\n dataType: 'json',\n contentType: 'application/json; charset=utf-8'\n }));*/\n }\n\n getMapLocations(): Promise {\n return this._request(\n 'keyLocationsForMap',\n {}\n ) as Promise;\n }\n}\n\nlet url = \"/api\";\nif (document.location.host.indexOf(\"localhost\") === 0)\n url = \"http://localhost:8080\";\n\nexport default new KeyMapAPI(url);\n","import {PageProps} from '../Page';\nimport {CSSProperties, useEffect, useRef, useState} from \"react\";\nimport mapboxgl from 'mapbox-gl';\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport {KeyLocation} from \"./KeyLocation\";\nimport api from \"./api\";\nimport keypin from '../../assets/images/keypin.png';\nimport {mapboxToken} from '../../assets/settings.json';\nimport './index.scss'\nimport {T} from \"../../Translate\";\nimport {Language} from \"../../models/PersonStory2\";\n\nmapboxgl.accessToken = mapboxToken;\n\nconst center: google.maps.LatLngLiteral = {lat: 50.85121, lng: 2.88591};\n\nconst containerStyle: CSSProperties = {\n width: '100%',\n height: '100%'\n};\n\ninterface ViewMapKeyLocationPageProps extends PageProps {\n lang: Language\n}\n\nexport const ViewMapKeyLocationPage = (props: ViewMapKeyLocationPageProps) => {\n\n const { lang} = props;\n\n const map = useRef(null);\n const markersAdded = useRef(false);\n const [lng, setLng] = useState(center.lng);\n const [lat, setLat] = useState(center.lat);\n const [zoom, setZoom] = useState(14);\n\n const [markers, setMarkers] = useState([]);\n\n const [mapLoaded, setMapLoaded] = useState(false);\n\n useEffect(() => {\n api.getMapLocations().then((locations) => {\n setMarkers(locations)\n })\n }, []);\n\n const generateHtmlForKeyLocation = (keyLocation: KeyLocation) => {\n // https://namenlijst.net/#/public/key_locations/2000fe68-6720-4ea4-922a-afcb331a5092\n const target: string = `#/public/key_locations/${keyLocation.id}`;\n return `\n
    \n
    \n
    \n  ${keyLocation.name}\n
    \n
    \n
    \n
    \n

    \n ${keyLocation.notes[lang]}\n

    \n
    \n
    \n \n
    `\n }\n\n const placeMarkers = (map: mapboxgl.Map, markers: KeyLocation[]) => {\n if (markers.length === 0) return;\n\n if (markersAdded.current) {\n return;\n }\n\n markersAdded.current = true;\n\n map.loadImage(\n keypin,\n function (error, image) {\n if (error || image === undefined) throw error;\n map.addImage(\"custom-marker\", image);\n\n map.addLayer({\n id: 'markers',\n type: 'symbol',\n source: 'markers',\n layout: {\n 'icon-image': 'custom-marker',\n 'icon-anchor': 'bottom',\n // 'text-field': ['get', 'title'],\n // 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'],\n // 'text-offset': [0, 1.25],\n // 'text-anchor': 'top'\n }\n });\n \n map.on('click', 'markers', (e) => {\n // Copy coordinates array.\n if (!(e.features && e.features.length > 0))\n return;\n \n const feature = e.features[0];\n const geometry = feature.geometry\n \n let coordinates: number[] = [];\n if (\"coordinates\" in geometry) {\n coordinates = geometry.coordinates as number[];\n }\n const name = feature.properties?.title;\n const html = feature.properties?.html;\n \n new mapboxgl.Popup({closeButton:false})\n .setLngLat([coordinates[0], coordinates[1]])\n .setHTML(html)\n .setOffset(60)\n .addTo(map);\n });\n \n }\n );\n\n map.addSource('markers', {\n type: 'geojson',\n data: {\n type: 'FeatureCollection',\n features: markers.map(marker => ({\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: [marker.position.lon, marker.position.lat]\n },\n properties: {\n title: marker.name,\n name: marker.name,\n id: marker.id,\n html: generateHtmlForKeyLocation(marker)\n }\n }))\n }\n });\n };\n\n\n useEffect(() => {\n if (markers && mapLoaded && map.current)\n placeMarkers(map.current!, markers)\n }, [markers]);\n\n useEffect(() => {\n if (markers && mapLoaded && map.current)\n placeMarkers(map.current!, markers)\n }, [mapLoaded]);\n\n const handleContainerRef = (ref: HTMLDivElement) => {\n if (map.current) return; // initialize map only once\n\n map.current = new mapboxgl.Map({\n container: ref,\n style: 'mapbox://styles/bitmunks/clt1iuj9x00hs01mebh1e8fgo',\n center: [lng, lat],\n zoom: zoom\n });\n map.current!.on('load', () => {\n setMapLoaded(true);\n });\n };\n\n return (\n
    \n
    \n
    \n );\n}\n","export default \"data:image/png;base64,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\"","import {Route, Switch, Redirect} from 'react-router-dom';\n\nimport HomePage from './pages/Home';\nimport LoginPage from './pages/Login';\nimport ListCollectionsPage from './pages/ListCollections';\nimport CreateCollectionPage from './pages/CreateCollection';\nimport EditCollectionPage from './pages/EditCollection';\nimport ViewCollectionPage from './pages/ViewCollection';\nimport EditCollectionDocument from './pages/EditCollectionDocument';\n\nimport {PageLayout} from './pages/Page';\nimport ListMemorialsPage from './pages/ListMemorials';\nimport {History} from 'history';\nimport EditMemorialPage from './pages/EditMemorial';\nimport ViewMemorialPage from './pages/ViewMemorial';\nimport ListPersonsPage from './pages/ListPersons';\nimport ListPersonStoriesPage from './pages/ListPersonStories';\nimport EditPersonPage from './pages/EditPerson';\nimport {ViewPersonPage} from './pages/ViewPerson';\nimport ListPlacesPage from './pages/ListPlaces';\nimport ViewPlacePage from './pages/ViewPlace';\nimport EditPlacePage from './pages/EditPlace';\nimport ListPersonFeedback from './pages/ListPersonFeedback';\nimport ListUsersPage from './pages/ListUsers';\nimport ListProjectsPage from './pages/ListProjects';\nimport ViewProjectPage from './pages/ViewProject';\nimport ListMilitaryEntities from './pages/ListMilitaryEntities';\nimport ViewMilitaryEntity from './pages/ViewMilitaryEntity';\nimport EditMilitaryEntity from './pages/EditMilitaryEntity';\nimport SpecialFunctionsPage from './pages/SpecialFunctions';\nimport AdvancedSearchPage from './pages/AdvancedSearch';\nimport ActivateAccountPage from './pages/ActivateAccount';\nimport RequestPasswordResetPage from './pages/RequestPasswordReset';\nimport ListContactPersonsPage from './pages/ListContactPersons';\nimport ListContactMomentsPage from './pages/ListContactMoments';\nimport EditContactPersonPage from './pages/EditContactPerson';\nimport RecordContactMomentPage from './pages/RecordContactMoment';\nimport EditContactMomentPage from './pages/EditContactMoment';\nimport EditDocumentPage from './pages/EditDocumentPage';\nimport ListDocumentation from './pages/ListDocumentation';\nimport EditPersonStoryPage from \"./pages/EditPersonStory\";\n\n\nimport {ActivePageState, AppState} from './redux/State';\nimport {useSelector} from 'react-redux';\nimport {DocumentCategory} from './models/Document';\nimport api from \"./api\";\nimport {RouteProps} from \"react-router\";\nimport {ViewPersonStoryPage} from './pages/PublicViewPersonStory';\nimport {ViewStoryPairPage} from './pages/PublicViewStoryPair';\nimport {Dataset} from './models/User';\nimport {AppProps, BaseApp, Renderers} from './BaseApp';\nimport ListKeyLocations from './pages/ListKeyLocations';\nimport EditKeyLocation from './pages/EditKeyLocation';\nimport {ViewKeyLocationPage} from './pages/PublicViewKeyLocation';\nimport {ViewMapKeyLocationPage} from \"./pages/PublicViewMapKeyLocations\";\nimport {Language} from \"./models/PersonStory2\";\n\n\n/**\n * A component that return a `Route` Component when user is logged in, else\n * returns a `Redirect` component to the login page.\n */\nconst PrivateRoute = (props: T) =>\n api.isLoggedIn()\n ? \n : \n\n\nclass App extends BaseApp {\n constructor(props: AppProps) {\n super(props);\n }\n\n renderRouteSwitch(renderers: Renderers) {\n const {renderPage, renderWithProps} = renderers;\n\n return (\n \n \n \n ({\n activationKey: (query.key || '') as string,\n mode: 'activate' as 'activate',\n }),\n PageLayout.Regular\n )}\n />\n \n ({\n activationKey: (query.key || '') as string,\n mode: 'resetPassword' as 'resetPassword'\n }),\n PageLayout.NoFrames\n )}\n />\n \n \n ({id: props.match.params.id})\n )}\n />\n ({id: props.match.params.id})\n )}\n />\n ({\n collection: query.collection as string | undefined,\n category: query.category as DocumentCategory | undefined,\n code: query.code as string | undefined,\n ref_id: query.ref_id as string | undefined,\n ref_type: query.ref_type as 'person' | 'place' | 'memorial' | 'military_entity' | undefined,\n ref_name: query.ref_name as string | undefined\n })\n )}\n />\n ({id: props.match.params.id})\n )}\n />\n ({\n id: props.match.params.id,\n page: parseInt(props.match.params.page)\n })\n )}\n />\n \n \n \n ({id: props.match.params.id})\n )}\n />\n ({id: props.match.params.id})\n )}\n />\n \n (ListPersonsPage,\n (props, query) => ({dataset: (query.dataset || undefined) as Dataset | undefined})\n )}\n />\n \n \n \n ({id: props.match.params.id})\n )}\n />\n ({id: props.match.params.id})\n )}\n />\n (\n EditPersonStoryPage,\n props => ({id: props.match.params.id})\n )}\n />\n (\n EditPersonStoryPage,\n props => ({personIdRef: props.match.params.personIdRef})\n )}\n />\n (\n ViewPersonStoryPage,\n (props, query) => ({id: props.match.params.id, child: query.child !== undefined, variant: 'museum'}),\n PageLayout.PublicPerson\n )}\n />\n (\n ViewPersonStoryPage,\n (props, query) => ({id: props.match.params.id, child: query.child !== undefined, variant: 'key'}),\n PageLayout.PublicPersonKey\n )}\n />\n (\n ViewStoryPairPage,\n (props, query) => ({\n story1: query.story1 as string || '',\n story2: query.story2 as string || '',\n child: query.child !== undefined\n }),\n PageLayout.Public\n )}\n />\n (\n ViewKeyLocationPage,\n (props, query) => ({id: props.match.params.id}),\n PageLayout.PublicPerson\n )}\n />\n (\n ViewMapKeyLocationPage,\n (props, query) => ({lang: props.match.params.lang}),\n PageLayout.PublicMapKeyLocations\n )}\n />\n \n \n ({id: props.match.params.id})\n )}\n />\n ({id: props.match.params.id})\n )}\n />\n \n \n ({id: props.match.params.id})\n )}\n />\n \n \n ({id: props.match.params.id})\n )}\n />\n ({id: props.match.params.id})\n )}\n />\n \n \n \n \n ({id: props.match.params.id})\n )}\n />\n \n ({id: props.match.params.id})\n )}\n />\n \n \n ({id: props.match.params.id})\n )}\n />\n\n \n );\n }\n}\n\nexport default (props: { history: History }) => {\n const {history} = props;\n const page = useSelector(state => state.activePageState);\n return ;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { History } from 'history';\nimport { Badge } from 'react-bootstrap';\nimport { SortDirection, sortItems, Table } from \"../../components/table/Table\";\nimport { ISpecialFunctionTableResult, SpecialFunctionResult, SpecialFunctionTableItem } from \"../../models/SpecialFunction\";\nimport { ComponentTableColumn, ITableColumn, StringTableColumn } from \"../../components/table/Fields\";\nimport { T } from \"../../Translate\";\nimport styles from './index.module.scss';\nimport { DateColumn } from \"../SpecialFunctions/SpecialFunctionResultTable\";\nimport { IPersonMilitaryInfo, translateVictimType, VictimType } from \"../../models/Person\";\nimport api from \"../../api\";\nimport { ListState } from \"../ListPage\";\n\ninterface PublicSearchPersonsTableProps {\n listState: ListState;\n results?: SpecialFunctionResult;\n updateListState: (updates: Partial) => void;\n history: History;\n}\n\nfunction getPublicColumns(): ITableColumn[] {\n return [\n new ComponentTableColumn('name', T('listPersons.column.name'), person => {\n const altFirstNames = person.firstNameAlt ? ' (' + person.firstNameAlt + ')' : '';\n const altLastNames = person.lastNameAlt ? ' (' + person.lastNameAlt + ')' : '';\n return (\n \n {person.familyName}{altLastNames}\n
    \n {person.firstName}{altFirstNames}\n
    \n );\n }, { sortable: true, clickable: true }, (a, b) => {\n const aName = a.familyName as string + a.firstName as string;\n const bName = b.familyName as string + b.firstName as string;\n return aName.localeCompare(bName);\n }),\n new DateColumn('bornDate', T('listPersons.column.birthDate'), { width: 110 }),\n new DateColumn('diedDate', T('listPersons.column.diedDate'), { width: 110 }),\n new StringTableColumn('type', T('listPersons.column.type'), person => translateVictimType(person.victimType as VictimType), { width: 110 }),\n new StringTableColumn('army', T('listPersons.column.army'), person => person.army as string, { width: 110, sortable: false }),\n new ComponentTableColumn('details', T('listPersons.column.details'), person => {\n if (person.victimType === VictimType.Military) {\n let name = person.regiment as string;\n if (person.unit)\n name += ', ' + person.unit;\n if (person.unit_nr)\n name += ', ' + person.unit_nr;\n if (person.sub)\n name += ', ' + person.sub;\n \n return (\n <>\n {person.number}\n {' '}\n {person.rank}\n
    \n {name && {name}}\n \n );\n } else {\n return ;\n }\n }, { clickable: true, sortable: false, className: styles.militaryInfoColumn })\n ];\n}\n\nexport default function PublicSearchPersonsTable(props: PublicSearchPersonsTableProps) {\n const { listState, updateListState, history, results } = props;\n const { tablePage: page, sortColumn, sortDirection } = listState;\n const resultsTable = results as ISpecialFunctionTableResult;\n \n const columns = useMemo(() => getPublicColumns(), []);\n const pageSize = 20;\n\n const [details, setDetails] = useState<{[key: string]: IPersonMilitaryInfo}>({});\n\n const handleSortUpdated = (column: string, direction: SortDirection) => {\n updateListState({ sortColumn: column, sortDirection: direction });\n };\n const sortedData = useMemo(\n () => sortItems(columns, resultsTable.data, sortColumn, sortDirection),\n [resultsTable, columns, sortColumn, sortDirection]\n );\n const onClickItem = useCallback((item: SpecialFunctionTableItem) => history.push('/person/_id=' + item._id), [history]);\n\n useEffect(() => {\n const slice = sortedData.slice(page * pageSize, (page + 1) * pageSize);\n api.getPersonsDetails(slice.map(item => item._id as string)).then(setDetails);\n }, [sortedData, page]);\n\n const sliceWithDetails = useMemo(() => {\n const slice = sortedData.slice(page * pageSize, (page + 1) * pageSize);\n return slice.map(person => ({...person, ...details[person._id as string]})) as SpecialFunctionTableItem[];\n }, [sortedData, details, page]);\n\n return (\n updateListState({ tablePage: page })}\n onSortChanged={handleSortUpdated}\n onClickItem={onClickItem}\n \n sortColumn={sortColumn}\n sortDirection={sortDirection}\n page={page}\n pageSize={pageSize}\n totalItems={resultsTable.data.length}\n noun='person'\n />\n );\n}\n","import { Icon, LoadingIcon } from \"../../components/Icons\";\nimport { TopTab, TopTabs } from \"../../components/TopTabs\";\nimport { T, TranslationKey } from \"../../Translate\";\nimport { PageID } from \"../../utils/PageLinking\";\nimport { PageProps, usePageHeader } from \"../Page\";\nimport { History } from 'history';\nimport api from '../../api';\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ISpecialFunction, SpecialFunctionArguments, SpecialFunctionResult, ValidationErrors } from \"../../models/SpecialFunction\";\nimport { SpecialFunctionForm } from \"../SpecialFunctions/SpecialFunctionForm\";\nimport { Button, Col, Row } from \"react-bootstrap\";\nimport { getEventIcon, getMajorPriorityForEventType, PersonEventType } from \"../../models/PersonEvent\";\nimport styles from './index.module.scss';\nimport { classes } from \"../../utils/Styles\";\nimport PublicSearchPersonsTable from \"./PublicSearchPersonsTable\";\nimport { ListState } from \"../ListPage\";\nimport { usePageState } from \"../../redux/Actions\";\n\ninterface SearchTabProps {\n func?: ISpecialFunction;\n errors: ValidationErrors;\n args: SpecialFunctionArguments;\n setArgs: (args: SpecialFunctionArguments) => void;\n execute: (func: ISpecialFunction, args: SpecialFunctionArguments) => void;\n}\n\nexport interface PublicSearchState extends ListState {\n basicInput: SpecialFunctionArguments;\n advancedInput: SpecialFunctionArguments;\n selectedTab: string;\n results?: SpecialFunctionResult;\n}\n\nfunction SearchTab(props: SearchTabProps) {\n const { func, errors, args, setArgs, execute } = props;\n\n const handleClickedReset = () => {\n setArgs({});\n };\n\n if (func) {\n return <>\n
    \n \n \n
    \n

    {T('publicSearch.fields')}

    \n {\n const sorted = field.types;\n sorted.sort((a, b) => getMajorPriorityForEventType(a.name as PersonEventType) - getMajorPriorityForEventType(b.name as PersonEventType))\n return <>\n

    {T('publicSearch.addFilter.info')}

    \n
    \n {field.types.map(type => (\n onClickedAdd(type.name)}>\n \n \n \n \n \n \n \n {T('specialFunctions.repeatable.filters.typeHeader')}\n {T(('specialFunctions.repeatable.filters.type.' + type.name) as TranslationKey)}\n \n \n {T(('publicSearch.advanced.filterInfo.' + type.name) as TranslationKey)}\n \n \n ))}\n
    \n ;\n }}\n />\n ;\n } else {\n return

    ;\n }\n}\n\ninterface ResultsTabProps {\n state: PublicSearchState;\n updateState: (updates: Partial) => void;\n history: History;\n}\n\nfunction ResultsTab(props: ResultsTabProps) {\n const { state, updateState, history } = props;\n const { results } = state;\n\n return results && results.type === 'table' ? <>\n

    {T('publicSearch.results')} ({results.data.length}{results.data.length < results.total && '/' + results.total})

    \n \n :

    ;\n}\n\nexport default function PublicSearch(props: PageProps) {\n const { loading, history } = props;\n \n const [pageState, updatePageState] = usePageState('publicSearch');\n const { selectedTab } = pageState;\n const [basicSearch, setBasicSearch] = useState();\n const [advancedSearch, setAdvancedSearch] = useState();\n\n const [errors, setErrors] = useState({});\n\n useEffect(() => {\n api.getFunction('FindPerson').then(setBasicSearch);\n api.getFunction('FindPersonAdvancedPublic').then(setAdvancedSearch);\n }, []);\n\n const handleClickedExecute = (func: ISpecialFunction, args: SpecialFunctionArguments) => {\n api.validateFunction(func.name, args).then(result => {\n if (result.status !== 'OK') {\n setErrors(result.data || {});\n return;\n }\n\n loading.loading(api.callFunction(func.name, args), T('page.specialFunctions.results'))\n .then(results => {\n updatePageState({\n selectedTab: 'results',\n results\n });\n });\n });\n };\n\n const subtitles = useMemo(() => [T('publicSearch.title')], []);\n usePageHeader(\n PageID.PublicSearch,\n undefined,\n Icon.Search,\n T('menu.namelist'),\n T('publicSearch.title'),\n undefined,\n undefined,\n undefined,\n subtitles);\n \n const tabs: TopTab[] = [\n {\n icon: Icon.Search,\n title: T('publicSearch.basic'),\n id: 'basic',\n content: () => (\n updatePageState({ basicInput: args })}\n />\n )\n }, {\n icon: Icon.Search,\n title: T('publicSearch.advanced'),\n id: 'advanced',\n content: () => (\n updatePageState({ advancedInput: args })}\n />\n )\n }, {\n icon: Icon.Users,\n title: T('publicSearch.results'),\n id: 'results',\n content: () => \n }\n ];\n\n return (\n
    \n updatePageState({ selectedTab: tab })}\n tabs={tabs}\n />\n
    \n );\n}\n","import { Button, Container } from \"react-bootstrap\";\nimport { Icon } from \"../../components/Icons\";\nimport { Gender, Person } from \"../../models/Person\";\nimport { T } from \"../../Translate\";\nimport styles from './index.module.scss';\nimport publicStyles from '../PublicSearch/index.module.scss';\nimport { ModalTarget } from \"../../modals/ModalTarget\";\nimport { PersonFeedbackModal } from \"../ViewPerson/PersonFeedbackModal\";\nimport { PageID, getPageLink } from \"../../utils/PageLinking\";\nimport { Link } from \"react-router-dom\";\n\ninterface HeaderProps {\n modals: ModalTarget;\n person: Person;\n}\n\nexport function Header(props: HeaderProps) {\n const { person, modals } = props;\n\n const handleClickedFeedback = () => {\n modals.show(props => );\n };\n\n return (\n
    \n \n
    \n \n \n
    \n {person.familyInfo}\n
    \n {person.relations.map(relation =>

    \n {Person.describePersonalRelationType(relation.relation, person.gender)}\n {' '}\n {relation.person ? new Person(relation.person).name : '?'}\n

    )}\n
    \n
    \n
    \n );\n}\n","import { useMemo } from \"react\";\nimport { Container } from \"react-bootstrap\";\nimport { usePerson } from \"../../FunctionalAPI\";\nimport { PersonQueryOptions } from \"../../models/Person\";\nimport { personEventSorter } from \"../../models/PersonEvent\";\nimport { getPageVia, PageID } from \"../../utils/PageLinking\";\nimport { PageProps, usePageHeader } from \"../Page\";\nimport { EventView } from \"../ViewPerson/EventView\";\nimport { Header } from \"./Header\";\nimport publicStyles from '../PublicSearch/index.module.scss';\n\ninterface ViewPersonPublicPageProps extends PageProps {\n id: string;\n}\n\nexport const ViewPersonPublicPage = (props: ViewPersonPublicPageProps) => {\n const { id, loading, modals, via } = props;\n const person = usePerson(loading, id, [PersonQueryOptions.EventsWithPlaces, PersonQueryOptions.Documents, PersonQueryOptions.RelationPersons]);\n console.log(person);\n \n const subtitles = useMemo(() => [person?.lastName || ''], [person]);\n usePageHeader(\n PageID.ViewPerson,\n undefined,\n undefined,\n person?.firstName || '',\n person?.firstName || '',\n via || getPageVia(PageID.PublicSearch),\n person ? person.name : '...',\n undefined,\n subtitles);\n\n const eventViews = useMemo(() => {\n if (!person)\n return
    ;\n\n person.events.sort(personEventSorter);\n return person.events.map(event => );\n }, [person]);\n\n return (\n
    \n {person &&
    }\n \n
    \n {eventViews}\n
    \n
    \n
    \n );\n}\n","import { singular, T } from \"../Translate\";\nimport { Icon } from \"./Icons\";\n\nexport function LoadingView() {\n return
    \n \n {T('pending.loading', {x: singular('project')})}\n
    \n \n
    \n
    ;\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Icon } from \"../../components/Icons\";\nimport { IProject } from \"../../models/Project\";\nimport { T } from \"../../Translate\";\nimport { PageID } from \"../../utils/PageLinking\";\nimport { PageProps, usePageHeader } from \"../Page\";\nimport { SpecialFunctionResult } from \"../../models/SpecialFunction\";\nimport api from \"../../api\";\nimport { usePageState } from \"../../redux/Actions\";\nimport { ListState } from \"../ListPage\";\nimport PublicSearchPersonsTable from \"../PublicSearch/PublicSearchPersonsTable\";\nimport { Container } from \"react-bootstrap\";\nimport { LoadingView } from \"../../components/LoadingView\";\n\ninterface PublicViewProjectProps extends PageProps {\n projectId: string;\n}\n\nexport interface PublicViewProjectState extends ListState {\n results?: SpecialFunctionResult;\n}\n\nexport default function PublicViewProject(props: PublicViewProjectProps) {\n const {projectId, history} = props;\n\n const [project, setProject] = useState();\n const [pageState, updatePageState] = usePageState('publicViewProject');\n const {results} = pageState;\n\n useEffect(() => {\n api.getProject(projectId).then(setProject);\n api.callFunction('FindPersonAdvancedPublic', {project: projectId, dataset: 'any'}).then(results => updatePageState({results}));\n }, [projectId, updatePageState]);\n\n const subtitles = useMemo(() => [project?.title || '...'], [project]);\n usePageHeader(PageID.PublicViewProject, projectId, Icon.ListUl, T('menu.namelist'), project?.title || '...', undefined, undefined, undefined, subtitles);\n\n return results ? (\n \n \n \n ) : ;\n}","import { Route, Switch } from 'react-router-dom';\n\nimport { PageLayout } from './pages/Page';\nimport { History } from 'history';\n\nimport { ActivePageState, AppState } from './redux/State';\nimport { useSelector } from 'react-redux';\nimport PublicSearch from './pages/PublicSearch';\nimport { BaseApp, Renderers } from './BaseApp';\nimport { ViewPersonPublicPage } from './pages/ViewPersonPublic';\nimport PublicViewProject from './pages/PublicViewProject';\n\nclass App extends BaseApp {\n renderRouteSwitch(renderers: Renderers) {\n const { renderPage, renderWithProps } = renderers;\n\n return (\n \n \n \n \n ({ id: params._id }),\n PageLayout.PublicPerson\n )}\n />\n ({ projectId: props.match.params.id }),\n PageLayout.Public\n )}\n />\n \n \n );\n }\n}\n\nexport default (props: { history: History }) => {\n const { history } = props;\n const page = useSelector(state => state.activePageState);\n return ;\n}\n","import 'bootstrap';\n//import 'jquery';\n//import 'bootstrap/dist/js/bootstrap';\n\nimport './assets/sass/light-bootstrap-dashboard.scss';\nimport './assets/sass/main.scss';\nimport 'react-bootstrap-typeahead/css/Typeahead.css';\nimport '@fortawesome/fontawesome-pro/css/all.css';\n\n// necessary for the menu collapse to work\nimport './assets/js/light-bootstrap-dashboard';\n\nimport { render } from 'react-dom';\nimport createHashHistory from 'history/createHashHistory';\nimport { Provider } from 'react-redux';\nimport { createStore } from 'redux';\nimport appReducers from './redux/Reducers';\n\nimport * as serviceWorker from './serviceWorker';\nimport API from './api';\nimport App from './App';\nimport { endContactMomentAction, startContactMomentAction } from './redux/Actions';\nimport PublicSearchApp from './PublicSearchApp';\nimport api from './api';\n\nconst history = createHashHistory();\nconst store = createStore(appReducers);\n\n// synchronize active contact moment between windows/tabs\nwindow.addEventListener('storage', event => {\n if (event.key === 'activeContactMoment') {\n if (event.newValue === null) {\n store.dispatch(endContactMomentAction());\n } else {\n store.dispatch(startContactMomentAction(JSON.parse(event.newValue)));\n }\n }\n});\n\nconst app = window.location.pathname.includes('publicsearch') ? 'publicsearch' : 'main';\nif (app === 'publicsearch')\n api.useGuestToken();\n\nrender(\n \n {app === 'main' && }\n {app === 'publicsearch' && }\n ,\n document.getElementById('app')\n);\n\n(window as any).api = API;\n\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ImageBrowser_container__36UWh\",\"wrapper\":\"ImageBrowser_wrapper__1j7dB\",\"previous\":\"ImageBrowser_previous__2xnC2\",\"next\":\"ImageBrowser_next__C_Si2\",\"filename\":\"ImageBrowser_filename__16rb7\",\"viewerWrapper\":\"ImageBrowser_viewerWrapper__-pEgT\",\"zoomin\":\"ImageBrowser_zoomin__JshdG\",\"zoomout\":\"ImageBrowser_zoomout__1gHug\",\"fullscreen\":\"ImageBrowser_fullscreen__3E2AK\",\"open\":\"ImageBrowser_open__UJ0WG\",\"centered\":\"ImageBrowser_centered__2Qkvq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"erased\":\"ListPersons_erased__1dqlG\",\"memorialTag\":\"ListPersons_memorialTag__2ZUId\",\"ellipsized\":\"ListPersons_ellipsized__3wdBp\",\"militaryInfoColumn\":\"ListPersons_militaryInfoColumn__1wfv3\",\"nowrap\":\"ListPersons_nowrap__1mCEy\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"carrouselWrapper\":\"ImageCarrousel_carrouselWrapper__y1M18\",\"carrousel\":\"ImageCarrousel_carrousel__2EMxl\",\"content\":\"ImageCarrousel_content__2SUrl\",\"images\":\"ImageCarrousel_images__1qqoX\",\"prevImg\":\"ImageCarrousel_prevImg__1jMOQ\",\"gradient\":\"ImageCarrousel_gradient__6Xvxl\",\"nextImg\":\"ImageCarrousel_nextImg__UuIok\",\"previousButton\":\"ImageCarrousel_previousButton__1Ppkp\",\"nextButton\":\"ImageCarrousel_nextButton__RpxBy\",\"indicator\":\"ImageCarrousel_indicator__xvq0r\",\"current\":\"ImageCarrousel_current__ooVsC\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputGroupButton\":\"PlaceInput_inputGroupButton__3xJ-A\",\"placeLabel\":\"PlaceInput_placeLabel__23XNU\",\"option\":\"PlaceInput_option__1Ay-p\",\"optionLeft\":\"PlaceInput_optionLeft__3gxC6\",\"optionRight\":\"PlaceInput_optionRight__2C15J\",\"placetype\":\"PlaceInput_placetype__2JYQ3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"elementList\":\"EditCollectionDocument_elementList__1QcTo\",\"addPage\":\"EditCollectionDocument_addPage__WiE1L\",\"addSubdocument\":\"EditCollectionDocument_addSubdocument__hskQj\",\"addSubdocumentInner\":\"EditCollectionDocument_addSubdocumentInner__2izVg\",\"active\":\"EditCollectionDocument_active__2faI9\",\"tagtypeselection\":\"EditCollectionDocument_tagtypeselection__1LRlf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"pageHeader\":\"PublicHeader_pageHeader__1P5Mp\",\"logo\":\"PublicHeader_logo__3VSib\",\"languageSelector\":\"PublicHeader_languageSelector__1o-gI\",\"active\":\"PublicHeader_active__fQfO1\",\"person\":\"PublicHeader_person__aqQkT\",\"back\":\"PublicHeader_back__2Dx1h\"};"],"sourceRoot":""}