{"version":3,"sources":["assets/vceditor_logo.png","assets/ut_logo.png","assets/upenn_logo.png","assets/blank_page.png","assets/collation.png","assets/viscoll_loading.gif","assets/vceditor_logo.svg","components/global/CacheBuster.js","styles/light.js","styles/button.js","styles/textfield.js","components/authentication/Register.js","components/authentication/ResendConfirmation.js","components/authentication/Login.js","components/authentication/ResetPassword.js","components/authentication/ResetPasswordRequest.js","store/axiosConfig.js","components/global/NetworkErrorScreen.js","actions/backend/userActions.js","containers/Authentication.js","components/dashboard/NewProjectSelection.js","components/dashboard/ProjectDetails.js","components/global/SelectField.js","components/dashboard/ProjectStructure.js","components/dashboard/ImportProject.js","components/dashboard/CloneProject.js","components/dashboard/NewProjectChoice.js","components/dashboard/ProjectOptions.js","components/dashboard/NewProjectContainer.js","components/dashboard/EditProjectForm.js","components/imageManager/RemoveImageConfirmation.js","components/imageManager/UploadImages.js","components/dashboard/ImageCollections.js","components/dashboard/ListView.js","components/global/LoadingScreen.js","components/global/ServerErrorScreen.js","components/global/Notification.js","components/topbar/UserProfileForm.js","components/termsManager/TermsFilter.js","containers/TopBar.js","actions/backend/projectActions.js","containers/Feedback.js","styles/topbar.js","actions/backend/imageActions.js","components/global/Panel.js","containers/Dashboard.js","components/collationManager/tabularMode/Side.js","components/collationManager/tabularMode/Leaf.js","components/collationManager/tabularMode/Group.js","components/collationManager/TabularMode.js","assets/visualMode/PaperLeaf.js","assets/visualMode/PaperGroup.js","helpers/getMemberOrder.js","assets/visualMode/PaperManager.js","components/collationManager/VisualMode.js","assets/visualMode/export/PaperLeaf.js","assets/visualMode/export/PaperGroup.js","assets/visualMode/export/PaperManager.js","components/collationManager/ExportMode.js","components/global/ImageViewer.js","components/collationManager/ViewingMode.js","components/export/Export.js","components/infoBox/dialog/AddGroupDialog.js","components/infoBox/dialog/DeleteConfirmationDialog.js","components/infoBox/dialog/AddTerm.js","helpers/getLeafsOfGroup.js","components/infoBox/dialog/VisualizationDialog.js","styles/checkbox.js","helpers/renderHelper.js","components/infoBox/GroupInfoBox.js","components/infoBox/dialog/AddLeafDialog.js","components/infoBox/dialog/FolioNumberDialog.js","components/infoBox/LeafInfoBox.js","components/infoBox/SideInfoBox.js","styles/infobox.js","actions/backend/leafActions.js","actions/backend/groupActions.js","actions/backend/sideActions.js","actions/backend/termActions.js","actions/backend/interactionActions.js","actions/backend/filterActions.js","containers/InfoBox.js","components/filter/FilterRow.js","containers/Filter.js","components/termsManager/DeleteConfirmation.js","components/termsManager/EditTermForm.js","components/collationManager/dialog/TermDialog.js","components/global/ManagersPanel.js","containers/CollationManager.js","components/termsManager/NewTermForm.js","components/termsManager/ManageTerms.js","components/termsManager/Taxonomy.js","containers/TermsManager.js","actions/backend/manifestActions.js","components/imageManager/AddManifest.js","components/imageManager/EditManifest.js","components/imageManager/DeleteManifest.js","components/imageManager/ManageManifests.js","components/imageManager/mapImages/SideBacklog.js","components/imageManager/mapImages/ImageBacklog.js","components/imageManager/mapImages/MapBoard.js","components/imageManager/MapImages.js","containers/ImageManager.js","containers/Project.js","containers/CollationManagerViewOnly.js","containers/ProjectViewOnly.js","reducers/initialStates/user.js","reducers/initialStates/projects.js","reducers/initialStates/active.js","reducers/initialStates/global.js","reducers/initialStates/history.js","actions/frontend/before/helperActions.js","actions/frontend/before/leafActions.js","actions/frontend/before/groupActions.js","actions/frontend/before/sideActions.js","actions/frontend/before/imageActions.js","store/middleware/frontendBeforeActionsMiddleware.js","actions/frontend/before/projectActions.js","actions/frontend/before/termActions.js","actions/frontend/before/manifestActions.js","store/middleware/frontendAfterActionsMiddleware.js","actions/frontend/after/imageActions.js","actions/undoRedo/leafHelper.js","actions/undoRedo/groupHelper.js","actions/undoRedo/sideHelper.js","store/middleware/undoRedoMiddleware.js","store/store.js","actions/undoRedo/imageHelper.js","actions/undoRedo/manifestHelper.js","actions/undoRedo/termHelper.js","reducers/userReducer.js","reducers/dashboardReducer.js","reducers/editCollationReducer.js","reducers/globalReducer.js","reducers/historyReducer.js","components/global/AppLoadingScreen.js","components/global/PageNotFound.js","containers/App.js","index.js","registerServiceWorker.js"],"names":["module","exports","global","appVersion","packageJson","version","CacheBuster","props","state","loading","isLatestVersion","refreshCacheAndReload","console","log","caches","keys","then","names","name","delete","window","location","reload","fetch","response","json","meta","latestVersion","versionA","versionB","versionsA","split","versionsB","length","a","Number","shift","b","isNaN","semverGreaterThan","setState","this","children","React","Component","Object","defineProperty","value","obj","_colors","require","_colorManipulator","_spacing","_spacing2","__esModule","default","spacing","fontFamily","borderRadius","palette","stagingColor","primary1Color","primary2Color","primary3Color","grey400","accent1Color","accent2Color","grey100","accent3Color","grey500","textColor","secondaryTextColor","fade","darkBlack","alternateTextColor","white","canvasColor","borderColor","grey300","disabledColor","pickerHeaderColor","cyan500","clockCircleColor","shadowColor","fullBlack","tableRow","selectedColor","btnLg","buttonStyle","height","labelStyle","fontSize","innerWidth","overlayStyle","paddingTop","btnMd","btnAuthCancel","color","btnBase","lineHeight","style","minWidth","radioBtnDark","width","iconStyle","fill","marginRight","floatFieldDark","floatingLabelStyle","underlineStyle","border","underlineFocusStyle","inputStyle","floatFieldLight","floatingLabelShrinkStyle","hintStyle","Register","onInputChange","v","type","submit","e","preventDefault","action","registerUser","email","password","bind","emailError","passwordError","registerSuccess","userState","errors","register","registerForm","aria-label","onSubmit","fullWidth","onChange","floatingLabelText","errorText","aria-invalid","aria-required","label","primary","className","onClick","tapCancel","successMessage","ResendConfirmation","resendConfirmation","submitted","message","form","cancel","Login","error","loginUser","nextProps","undefined","user","login","errorMessage","authenticated","history","push","submitButton","content","toggleResetRequest","includes","ResetPassword","resetMessage","passwordConfirm","reset_password_token","password_confirmation","resetPassword","handleResetPasswordSuccess","textAlign","ResetPasswordRequest","resetPasswordRequest","test","requested","cancelButton","client","axios","create","baseURL","responseType","clientOptions","interceptors","request","getState","dispatch","getSourceAction","token","headers","success","loadingRequestCount","payload","Promise","resolve","data","config","setTimeout","status","reject","NetworkErrorScreen","isOffline","that","setInterval","catch","logo","src","alt","padding","open","zIndex","contentStyle","position","top","left","title","paddingBottom","sendFeedback","browserInformation","project","types","url","method","Landing","toggleRegister","toggleLogin","resetRequest","reset","reset_token","resendConfirmationSuccess","confirmation","notification","search","pathname","confirmUser","logoutUser","instance","current_instance","imgCollation","role","imgLogo","background","light","connect","session","confirmation_token","confirm","NewProjectSelection","margin","aria-labelledby","aria-describedby","setProjectType","tabIndex","aria-hidden","id","ProjectDetails","event","doErrorsExist","nextStep","newValue","set","shelfmark","date","previousStep","step","disabled","SelectField","onMenuClose","targetIndex","findIndex","text","searchText","target","prevSearchText","document","querySelector","blur","filter","key","AutoComplete","noFilter","caseInsensitiveFilter","targetData","find","toString","filteredDropDown","hintText","openOnFocus","dataSource","dataSourceConfig","onUpdateInput","d","p","onClose","textFieldStyle","menuProps","maxHeight","ProjectStructure","menuItems","selectedValue","unconjoinLeafsList","isDisabled","map","val","collationGroupsRows","collationGroups","forEach","group","leaves","Array","from","Table","number","required","min","onInputChangeCollationGroupsRows","handleToggleConjoin","checked","conjoin","marginLeft","paddingLeft","paddingRight","oddLeaf","handleRemoveCollationGroupRow","right","tooltip","display","justifyContent","alignItems","quireNo","parseInt","leafNo","conjoined","addCollationRows","selectable","fixedHeader","displaySelectAll","adjustForCheckbox","displayRowCheckbox","ImportProject","importData","importProject","importFormat","imageData","componentWillReceiveProps","importStatus","close","checkIfFileTypeIsInvalid","file","handleFileSelected","files","reader","FileReader","readAsText","onloadend","result","handleImageFile","readAsDataURL","accept","rows","fontWeight","CloneProject","projectIndex","cloneProject","allProjects","index","NewProjectChoice","finish","textTransform","ProjectOptions","RadioButton","defaultSelected","handleChange","generateFolioNumber","generatePageNumber","startFolioPageNumber","startingTexture","NewProjectContainer","checkValidationError","projectType","notationStyle","groupNo","newCollationGroups","handleAddNewCollationGroupRow","concat","i","updatedGroup","field","metadata","preferences","showTips","side","leaf","groups","folioNumber","pageNumber","createProject","handleRequestClose","modal","onRequestClose","autoScrollBodyContent","EditProjectForm","allProjectsExceptCurrent","selectedProjectIndex","selectedProject","splice","ifErrorsExist","editing","handleDeleteDialogToggle","deleteDialog","togglePopUp","handleUnsavedDialogToggle","unsavedDialog","handleProjectUpdate","projectID","updateProject","handleProjectDelete","closeProjectPanel","deleteProject","deleteUnlinkedImages","handleProjectPanelClose","ignoreChanges","isEditing","uri","handleProjectCancelUpdate","submitButtons","float","icon","secondary","projectPanelData","floatingLabelFixed","autoFocus","Date","created_at","toLocaleString","updated_at","deleteActions","keyboardFocused","unsaveActions","labelColor","actions","onCheck","RemveImageConfirmation","actionType","deleteImages","imgs","img","unlinkImages","toggleConfirmation","backgroundColor","numToRemove","collectionsMode","UploadImages","parseFilename","filename","tokenizedName","join","toLowerCase","submitUpload","duplicateImageUploads","uploadedDuplicates","item","duplicatesToUpload","uploadedImages","uploadImages","filesizeExceeded","getElementById","resetUpload","handleFiles","findIfExists","fileExtension","onLoadEnd","targetState","newImageList","update","$push","size","images","toggleCheckbox","duplicateErrorSection","filesizeErrorSection","wordWrap","substring","marginTop","multiple","x","ImageCollection","removeConfirmationOpen","windowResize","windowWidth","gridWidth","gridHeight","innerHeight","columnWidth","handleFilterClick","filterOpen","anchorEl","currentTarget","handleFilterClose","handleFilterChoice","selectedImages","image","newArray","assign","forceUpdate","cellRenderer","imagesToRender","columnIndex","rowIndex","columnCount","globalIndex","overflow","textOverflow","getActiveImages","ids","getProject","projects","intersect","list1","list2","id1","handleAddChip","chip","linkImages","handleDeleteChip","selectAll","projectIDs","addEventListener","removeEventListener","infoPanel","numSelected","activeImages","projectInfo","projectDataSource","commonProjectIDs","commonProjectDataSource","onRequestAdd","onRequestDelete","uploadPanel","filterPanel","anchorOrigin","horizontal","vertical","targetOrigin","primaryText","rightIcon","rowCount","Math","floor","rowHeight","ListView","selectedProjectID","selectProject","doubleClick","viewDate","year","month","day","hour","minute","ariaDate","projectsList","onDoubleClick","LoadingScreen","loadingImg","bodyStyle","paperProps","ServerErrorScreen","logout","serverError","Notification","autoHideDuration","UserProfileForm","currentPassword","newPassword","newPasswordConfirm","handleUserProfileClose","toggleUserProfile","handleUserAccountDelete","handleCancelUpdate","handleUserUpdate","updatedUser","current_password","handleUserProfileUpdate","emailMessagePending","emailMessage","currentPasswordError","emailTakenError","changed","userProfileActions","emailConfirmActions","nameField","emailField","userProfileModalOpen","maxWidth","titleStyle","marginBottom","TermsFilter","onValueChange","filterTypes","onTypeChange","TopBar","shortcutListener","ctrlKey","metaKey","code","actionHistory","undo","redo","userID","updateProfile","deleteProfile","handleUserLogout","goHome","goToDashboardProjectList","resetActionHistory","UserMenu","iconButtonElement","xmlns","viewBox","topbarClasses","popUpActive","imageViewerTitle","imageViewerEnabled","viewMode","cursor","Toolbar","showUndoRedo","showImageViewerButton","toggleImageViewer","toggleFilterDrawer","borderRight","termsFilter","terms","filterTerms","active","loadProject","showLoading","Feedback","handleOpen","feedbackOpen","creditsOpen","handleClose","feedback","ClientJS","getResult","JSON","stringify","feedbackActions","creditsActions","newWindow","opener","openInNewTab","paperClassName","href","format","exportProjectBeforeFeedback","topbarStyle","tab","imageIDs","isUndoable","Panel","defaultOpen","paddingStyle","noPadding","stopPropagation","tooltipPosition","Dashboard","projectDrawerOpen","handleProjectSelection","handleNewProjectTouchTap","newProjectPopoverOpen","popoverAnchorEl","handleNewProjectRequestClose","handleNewProjectModalToggle","newProjectModalOpen","handleDeleteConfirmModalToggle","deleteConfirmationOpen","handleImportProject","importProjectCallback","modalIsOpen","userProfileDialogOpen","userProfileToggle","page","loadProjects","sidebar","UTLogo","UPLogo","projectPane","openSecondary","docked","containerStyle","zDepth","Tabs","tabItemContainerStyle","ImageCollections","dashboard","newProject","Side","activeSide","collationManager","selectedObjects","filters","defaultAttributes","isActive","members","sidesOfMatchingElements","SidesOfMatchingTerms","isFiltered","Sides","isAffectedFiltered","hideOthers","isFilterActive","sideAttributes","attribute","displayName","activeSideStyle","activeSideName","classNames","focusLeafID","sideComponent","handleObjectClick","onMouseEnter","toggleFocusLeaf","onMouseLeave","charAt","activeSideParentOrder","memberType","folio_number","onKeyPress","handleObjectPress","Leaf","activeLeaf","flashItems","Leafs","LeafsOfMatchingSides","LeafsOfMatchingTerms","leafAttributes","sideAttributesActive","attributeName","leafAttribute","divStyle","leafIDs","indexOf","sideComponents","activeLeafStyle","sideClassName","rectoSide","Rectos","rectoID","versoSide","Versos","versoID","parentID","sectionStyle","leafComponent","activeLeafOrder","Group","findItemByName","activeGroup","Groups","GroupsOfMatchingLeafs","GroupsOfMatchingSides","GroupsOfMatchingTerms","groupMembers","memberIDs","memberID","current_leaf","current_group","activeGroupOrder","groupIDs","focusGroupID","toggleFocusGroup","attributes","activeGroupStyle","groupContainerClasses","groupComponent","TabularMode","newList","$splice","group_components","groupID","nestLevel","emptyResults","Terms","PaperLeaf","args","manager","recto","verso","order","parentOrder","conjoined_to","indent","origin","viewingMode","y","strokeWidth","strokeColor","strokeColorActive","strokeColorGroupActive","strokeColorFilter","strokeColorAdded","highlight","paper","Path","filterHighlight","path","multiplier","attachment","textTerms","openTermDialog","textLeafOrder","PointText","point","fillColor","textRecto","textVerso","visibleAttributes","dashArray","material","prototype","constructor","draw","setIndent","x1","x2","add","Point","stub","isConjoined","conjoinY","y_conjoin_center","insert","segments","curveMe","clone","opacity","insertBelow","showAttributes","createAttachments","leafTermsToShow","termID","show","reverse","rectoTermsToShow","versoTermsToShow","textX","textY","numChars","bounds","attached_above","clickListener","term","termIndex","termTitle","substr","textTerm","addChild","body","setMouseEventHandlers","removeMouseEventHandlers","createAttachment","prevPaperLeaf","glueLine","createOtherAttachment","attachLine","conjoinedLeaf","getLeaf","conjoin_order","y1","getY","y_nonconjoin_center","y_center","y_centerQuire","y_nextPaperLeaf","y_prevLeaf","numLeaves","path_height","abs","midpoint","numLeavesInside","removeSegment","new_x","radius","s1","Segment","direction","oldPoint","s0","isBelowAConjoined","getLastLeaf","activate","deactivate","setVisibility","rectoValues","versoValues","page_number","texture","notationStyles","rectoContent","versoContent","reducer","acc","visibleAttributeCount","reduce","PaperGroup","groupOrder","notation","groupNotation","groupHeight","groupColor","groupColorActive","filterColor","rectangle","Rectangle","Size","highlightRectangle","brightness","Color","activeLayer","insertChild","outerGroupIDs","gID","parentGroup","subquireNotation","g","groupText","getMemberOrder","member","PaperManager","canvas","canvasID","setup","tool","view","viewSize","strokeColorTacket","groupTextColor","groupLeaves","groupGroups","groupContainer","activeGroups","activeLeafs","activeRectos","activeVersos","paperLeaves","paperGroups","leafYs","groupYs","multipliers","flashLeaves","flashGroups","tacketLineDrag","groupTacketGuide","groupTacketGuideLine","groupTacket","toggleVisualizationDrawing","addVisualization","tacketToolIsActive","tacketToolOriginalPosition","slideForward","onFrame","createGroup","getGroupHeight","createLeaf","l","customSpacings","removeChildren","currentY","prevRootGroupID","prevGroupsLastMember","getLastMember","calculateYs","leafID","groupsAtLevel","values","showFilter","drawTackets","drawSewing","fitCanvas","tacketTargetLeaves","targets","getIntersections","activateTacketTool","remove","Tool","minDistance","drawTacketGuide","onMouseDown","onMouseUp","targetLeaf1","targetLeaf2","onMouseDrag","targetGroup","guideY","guideX","guideLine","guideLineArrow","guideLineX1","guideLineX2","drawType","guideText","guideTextRectangle","guideTextBackground","deactivateTacketTool","sewing","leafID1","leafID2","startX","startY","endX","endY","paperLeaf1","paperLeaf2","tacketed","sewingPath","tacketPath1","tacketPath2","getYOfFirstMember","firstMemberID","firstMember","getYOfLastMember","lastMember","lastMemberIDs","lastMemberID","innerLastMember","leaf_order","getGroup","group_order","memberObject","termsToShowAbove","termsToShowBelow","glueSpacing","max","previousMember","bottom","setWidth","setProject","setActiveGroups","paperGroup","setActiveLeafs","paperLeaf","setActiveRectos","setActiveVersos","setFlashItems","setFilter","setScale","VisualMode","updateGroup","updateCanvasSize","paperManager","drawOnCanvas","canvasAttr","allLeafIDs","localOrder","showTerms","createGlue","conjoin_type","createSewn","glueLineCount","thread","previousLeafID","previousLeaf","allGroupIDs","ExportMode","getChildrenByType","itemMembers","updatePM","pm","entries","memberLeafIDs","memberGroupIDs","memberGroups","paperManagers","canvases","ImageViewer","suffixedID","UUID","v4","osd","tilesSources","rectoURL","isRectoDIY","getInfoURL","versoURL","isVersoDIY","BlankPage","OpenSeadragon","prefixUrl","showNavigationControl","showFullPageControl","showRotationControl","showNavigator","collectionMode","collectionRows","collectionTileMargin","crossOriginPolicy","navImages","zoomIn","REST","GROUP","HOVER","DOWN","zoomOut","home","rotateleft","rotateright","tileSources","addTiles","exec","rDIY","vDIY","r","fixed","ViewingMode","toggleTacket","addTacket","nextState","manifestID","Export","projectTitle","replace","exportedType","exportedImages","downloadZip","fileDownload","exportedData","handleExportToggle","blob","Error","statusText","JSZip","loadAsync","zip","generateAsync","saveAs","err","copy","showCopyToClipboardNotification","exportOpen","AddGroupDialog","incrementNumber","newCount","isNormalInteger","newState","decrementNumber","getAllChildrenOfGroup","inputGroupID","allChildrenOfGroup","countGroupChildren","groupCount","onNumberChange","errorState","numberOfLeaves","str","onToggleCheckbox","stateName","dropDownChange","stateValue","selectedGroups","updatedStateValue","onLocationChange","onPlacementLocationChange","placementLocation","getNextSibling","slice","findLastChildGroup","lastGroup","addLeafs","additional","numberOfGroups","hasLeaves","noOfGroups","closeDialog","memberOrder","sibling","lastChild","selectedChild","selectedChildIndex","orderedElements","selectedChildIndexInOrderedElements","orderedElementsSliced","addGroups","resetForm","copiesError","copies","numberOfGroupsError","numberOfLeavesError","oddLeafError","styles","radioButton","conjoinOption","radioButtonGroupHeader","radioButtonGroup","addLeafsCheckbox","groupPosition","itemID","groupType","dialog","DeleteConfirmationDialog","resizeHandler","containsTacketedLeaf","getTitle","itemOrder","itemName","singleDelete","batchDelete","AddTerm","taxonomy","description","handleUpdateInput","handleNewRequest","linkTerm","createAndAttachTerm","termExists","renderTaxonomies","getFilteredTermTitlesDropDown","commonTerms","newTermForm","Taxonomies","multiLine","onNewRequest","textKey","valueKey","listStyle","errorStyle","floatingLabelFocusStyle","getLeafsOfGroup","includeNone","leafMembersOfCurrentGroup","VisualizationDialog","renderMenuItem","onCreate","attributeValue","startLeaf","endLeaf","isCreateAction","selectFields","selectField1","selectField2","leafStart","leafEnd","data1","data2","handleTacketSewingChange","checkboxStyle","renderTermChip","deleteFn","unlinkTerm","isReadOnly","GroupInfoBox","toggleAddGroupDialog","addGroupDialogOpen","addButtonPopoverOpen","toggleAddLeafDialog","addLeafDialogOpen","handleAddButtonTouchTap","handleAddButtonRequestClose","singleSubmit","updatedAttribute","onTextboxChange","newAttributeState","newEditingState","renderTerms","chips","closeTermDialog","activeTerm","toggleTacketDrawing","toggleSewingDrawing","groupPayload","deleteTacket","deleteSewing","toggleVisualizationDialog","visualizationDialogActive","clickVisibility","updatePreferences","renderTooltip","eyeIsChecked","eyeStyle","attributeDict","emptyAttributeState","otherAttributeStates","visibilityHoverState","batchSubmit","hasActiveAttributes","newToggleState","isBatch","attrName","attrValue","updateGroups","groupAttributes","attributeDivs","getAttributeValues","eyeCheckbox","checkedIcon","uncheckedIcon","onMouseOut","input","fontStyle","options","option","textboxButtons","textSubmit","textCancel","submitBtn","addBtn","addButtonPopover","animation","PopoverAnimationVertical","deleteBtn","deleteGroup","deleteGroups","attributeSewing","clear","attributeTacket","minHeight","AddLeafDialog","clearForm","onToggleConjoin","addable","attached_below","selectedLeaves","disabledAbove","disabledBelow","noOfLeafs","verticalAlign","disabledAddAbove","disabledAddBelow","addLeaves","FolioNumberDialog","folioOrPage","startNumber","generateFolioNumbers","generatePageNumbers","toggleFolioModal","defaultStartNumber","folioModalOpen","LeafInfoBox","batchAttributeToggleState","updateLeaf","selectedSides","onConjoinChange","newID","onAttachedToChange","attached_to","leafs","updateLeafs","toggleImageModal","imageModalOpen","toggleInsideBifoliaModal","insideBifoliaModalOpen","toggleOutsideBifoliaModal","outsideBifoliaModalOpen","isFirstLeaf","isLastLeaf","hasOnlyActiveLeaf","firstInConjoin","leafImagePresent","every","outsideFacingBtn","insideFacingBtn","imageModalContent","insideBifoliaModalContent","outsideBifoliaModalContent","deleteLeaf","deleteLeafs","conjoinButton","autoConjoinLeafs","generateFolioButton","parentIDs","Set","imageThumbnails","isRecto3","isVerso3","conjoinLeaf","insideBifoliaVerso","insideBifoliaRecto","outsideBifoliaRecto","outsideBifoliaVerso","insideBifoliaVersoURL","insideBifoliaRectoURL","outsideBifoliaRectoURL","outsideBifoliaVersoURL","isInsideBifoliaVersoDIY","isInsideBifoliaRectoDIY","isOutsideBifoliaRectoDIY","isOutsideBifoliaVersoDIY","boxShadow","SideInfoBox","sideID","updateSide","sides","updateSides","j","termsDiv","sideIndex","imageThumbnail","infoBoxStyle","project_id","addTerm","updateTerm","deleteTerm","objects","createTaxonomy","updateTaxonomy","deleteTaxonomy","changeViewMode","changeManagerMode","managerMode","object","modifiers","command","button","notCtrl","shiftKey","notCmd","notCanvasCmd","getSelection","removeAllRanges","orderOfCurrentElement","indexes","lastSelected","sort","currentSelected","reapplyFilterProject","queries","haveErrors","query","condition","conjunction","updateFilterSelection","selection","matchingFilterObjects","allObjects","select","InfoBox","count","IDHash","now","sideIDs","resetTacket","rectoIDs","versoIDs","handleChangeInfoBoxTab","changeInfoBoxTab","newPreferences","leafSideTabs","groupTab","termActions","termsManager","visualizations","newType","newSelectedObjects","FilterRow","renderAttributeMenuItems","mapAttributeMenuItems","mapTermAttributeMenuItems","renderValueItems","insetChildren","mapConditionItems","filterConditionItems","isDropdown","attributeIndex","renderValueField","queryIndex","conjoinedToAutoComplete","renderRow","disableNewRow","clearFilterRowOnAttribute","lastRow","flexGrow","removeRow","queriesLength","mini","addRow","pointerEvents","disableAddRow","Filter","newQueries","filterHeightChange","offsetHeight","fieldName","updatedQueries","clearFilterRowOnType","updateFilterQuery","validQueries","filterProject","toFilter","isArray","resetFilters","currentIndex","handleSelection","filterSelection","handleSelectOpen","filterActive","selectPopover","handleSelectClose","submitDisabled","filterPanelHeight","matches","groupMatches","plural","leafMatches","sideMatches","termMatches","filterContainerStyle","toggleFilterDisplay","labelPosition","attachedToLeafs","GroupIDs","LeafIDs","RectoIDs","VersoIDs","DeleteConfirmation","onDelete","deleteIcon","hoverColor","EditTermForm","validateTitle","trim","onCancelUpdate","renderSubmitButtons","linkedObjects","deleteButton","sideData","rectoFolioNumber","rectoPageNumber","versoFolioNumber","versoPageNumber","linkToGroups","linkedGroups","fullWidthInput","linkToLeaves","linkedLeaves","linkToSides","linkedSides","TermDialog","getLinkedGroups","getLinkedLeaves","getLinkedSides","rectosWithCurrentTerm","versosWithCurrentTerm","sidesWithCurrentTerm","leafOrder","getRectosAndVersos","linkAndUnlinkTerms","createErrors","updateErrors","ManagersPanel","CollationManager","toggleFilterPanel","filterPanelOpen","handleViewModeChange","leftSideBarOpen","infoboxHeight","closeTip","hideProjectTip","exportCols","exportTerms","export","exportProject","numRootGroups","combineDiagram","finalCanvas","canvasIDs","numCols","exportWidth","exportHeight","row","maxRowHeight","finalContext","getContext","globalY","currentLargestY","drawImage","handleDownloadCollationDiagram","toBlob","clickedFromDiagram","getCommonTerms","linkDialogTerm","linkObjects","unlinkObjects","unlinkDialogTerm","renderRadioButton","selected","setExport","transition","infoboxStyle","tipIndex","filterContainer","differentNumOfSelectedObjects","differentTypeOfSelectedObjects","tipsDiv","topbar","tip","selectionRadioGroup","valueSelected","exportDialog","downloadImage","sidebarClasses","infobox","workspace","NewTermForm","initialState","sideName","ceil","createButtons","ManageTerms","onItemChange","renderList","termForm","Taxonomy","resetEditing","newTaxonomy","onNewTaxonomyChange","isValid","errorNewTaxonomy","setTaxonomy","setEditing","setError","onUpdate","lastSubmitted","old_taxonomy","updatedEditing","newTaxonomies","newEditing","newErrors","errorTypes","renderTaxonomy","filterTaxonomy","TermsManager","applyFilter","handleAddTerm","filteredTerms","isNoneSelected","toUpperCase","activeTab","taxonomies","changeTermsTab","tabName","createManifest","manifest","updateManifest","AddManifest","runValidation","onCancel","urlError","cancelCreateManifest","manifests","contentType","get","createManifestError","EditManifest","confirmationOpen","nameError","renderImageTile","projectCountText","inCurrentProject","borderBottom","overflowX","whiteSpace","activeImg","editName","autoDetectWindowHeight","itemSize","itemCount","renderItem","overscanCount","estimatedItemSize","pop","DeleteManifest","deleteManifest","ManageManifests","activeImage","renderManifestCard","Card","editOpen","deleteOpen","activeManifestID","SideBacklog","renderSideItem","sideType","actionButtons","moveItemsToMap","activeStyle","ImageBacklog","renderImageItem","activeManifest","MapBoard","moveItemUpOrDown","moveItemsToBacklog","renderGhostSideItem","manifestName","renderGhostImageItem","MapImages","updateBoards","imageBacklog","sideBacklog","imageMapBoard","sideMapBoard","backlogImage","mapImage","initialMapping","handleManifestChange","isDIY","resetChanges","indexOfCurrentElement","indexOfLastElement","allMembers","mapBoardType","indexOfItem","newMapBoard","indexOfSwappingItem","swappedItem","newBacklogBoard","items","backlogBoardType","submitIsDisabled","initialSideMapBoard","noChangesInSideMapBoard","initialImageMapBoard","noChangesInImageMapBoard","noChanges","automatchIsDisabled","findFolioNumber","automatch","findByFolioNumber","tokenizedLabel","endsWith","sideItemsToMap","imageItemsToMap","submitMapping","newSideMappings","unlinkedSideMappings","sideIDsWithImage","mapSidesToImages","renderMoveUpButton","mapboard","backlog","renderMoveDownButton","mapBoard","middlePanel","mainToolBar","imageViewerModal","ImageManager","changeImageTab","imageManager","manageSources","sideMappings","allImages","Project","CollationManagerViewOnly","loadProjectViewOnly","DIYImages","unauthorizedError","getLeafMembers","oddMemberLeftOut","leafConjoinedToID","oddLeafID","oddLeafIDIndex","leafOneID","leafTwoID","createLeaves","fromGroupCreation","parentGroupID","noOfLeaves","globalOrder","autoConjoin","newlyAddedLeafIDs","sideCount","script_direction","updatedLeafIDs","handlePaperUpdate","deletedLeafID","deletedLeaf","deletedLeafParent","deletedLeafMemberIndex","attachedAboveLeafID","attachedBelowLeafID","deletedLeafIDIndex","rectoIDIndex","Recto","versoIDIndex","Verso","deletedGroupID","deletedGroup","deletedGroupIDIndex","updatedSides","updatedSide","imageID","imageIndex","linkImagesFromProject","linkImagesFromDashboard","unlinkImagesFromProject","projectIDIndex","unlinkImagesFromDashboard","deleteImagesFromDashboard","findByLabel","DIYImage","hasOwnProperty","frontendBeforeActionsMiddleware","store","next","isUndo","isRedo","updatedProject","updatedProjectID","cloneDeep","deletedProjectID","deletedProjectIndex","updatedTaxonomy","oldTaxonomy","oldTaxonomyIndex","deletedTaxonomy","deletedTaxonomyIndex","newTerm","createTerm","updatedTermID","updatedTerm","linkedTermID","unlinkedTermID","unlinkedObjects","unlinkedTermIDIndex","unlinkedObjectIDIndex","deletedTermID","deletedTermIDIndex","newlyAddedGroupIDs","createGroups","updatedGroupID","updatedGroups","deletedGroupIDs","numberCount","leafIDsToAutoConjoin","updatedLeafID","updatedLeaf","conjoinedToID","conjoinedToLeaf","handleConjoin","attachType","aboveLeafID","handleAttachAbove","belowLeafID","handleAttachBelow","updatedLeaves","updateLeaves","deletedLeafIDs","deleteLeaves","updatedSideID","mappedSides","mappedSide","mappedSideID","mappedSideImage","sideNameKey","currentSideImage","imageLinkedID","imageLinkedIDIndex","imageUnlinkedID","imageUnlinkedIDIndex","mappedSideIDIndex","mapSides","updatedManifest","deletedManifest","frontendAfterActionsMiddleware","newDIYImages","updateImagesAfterUpload","helperUndoDeleteLeaves","historyActions","groupedLeaves","leafNeighbours","latestGroup","latestLeafID","helperSeparateLeavesByGroup","createRequest","leafAboveID","leafBelowID","updateLeafsRequest","sideRequest","termRequest","groupsRequest","helperUndoDeleteGroup","groupInfo","groupedMembers","latestItem","helperSeparateMembers","undoUpdateSides","requests","storeEnhancers","undoRedoMiddleware","sequentialDispatch","historyAction","getTime","newUndoStack","undoActionList","urID","newRedoStack","redoActionList","undoUpdateLeaf","requestData","undoUpdateLeaves","undoDeleteLeaf","undoDeleteLeaves","undoCreateLeaves","undoAutoconjoin","undoFolioNumbers","undoPageNumbers","undoUpdateGroups","undoUpdateGroup","undoCreateGroups","undoDeleteGroup","undoDeleteGroups","undoUpdateSide","undoLinkImages","undoUnlinkImages","undoUpdateManifest","createAction","mapAction","undoDeleteManifest","undoUpdateTaxonomy","undoCreateTaxonomy","tax","undoDeleteTaxonomy","urlSplit","undoLinkTerm","undoUnlinkTerm","termData","undoDeleteTerm","updatedStack","lastRedoGroup","lastUndoGroup","cutCount","compose","applyMiddleware","axiosMiddleware","autoRehydrate","createStore","combineReducers","jwt","lastLoggedIn","rectos","versos","Images","AppLoadingScreen","logoImg","PageNotFound","injectTapEventPlugin","App","rehydrated","persistStore","storage","localForage","whitelist","muiTheme","getMuiTheme","Switch","Route","exact","component","Authentication","ProjectViewOnly","ReactDOM","render","navigator","swUrl","process","serviceWorker","registration","onupdatefound","installingWorker","installing","onstatechange","controller"],"mappings":"qGAAAA,EAAOC,QAAU,IAA0B,2C,kBCA3CD,EAAOC,QAAU,s7W,oBCAjBD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,uC,oBCA3CD,EAAOC,QAAU,IAA0B,6C,oBCA3CD,EAAOC,QAAU,IAA0B,2C,+GCG3CC,EAAOC,WAAaC,EAAYC,QAIhC,IAcMC,E,kDACF,WAAYC,GAAQ,IAAD,8BACf,cAAMA,IACDC,MAAQ,CACTC,SAAS,EACTC,iBAAiB,EACjBC,sBAAuB,WACnBC,QAAQC,IAAI,wCACRC,QACAA,OAAOC,OAAOC,MAAK,SAAUC,GAAQ,IAAD,gBACfA,GADe,IAChC,gCAASC,EAAT,QAAwBJ,OAAOK,OAAOD,IADN,kCAKxCE,OAAOC,SAASC,QAAO,KAbhB,E,gEAkBE,IAAD,OAChBC,MAAM,cACDP,MAAK,SAACQ,GAAD,OAAcA,EAASC,UAC5BT,MAAK,SAACU,GACH,IAAMC,EAAgBD,EAAKrB,SArCjB,SAACuB,EAAUC,GAIjC,IAHA,IAAMC,EAAYF,EAASG,MAAM,OAC3BC,EAAYH,EAASE,MAAM,OAE1BD,EAAUG,QAAUD,EAAUC,QAAQ,CACzC,IAAMC,EAAIC,OAAOL,EAAUM,SACrBC,EAAIF,OAAOH,EAAUI,SAE3B,GAAIF,IAAMG,EACV,OAAOH,EAAIG,GAAKC,MAAMD,GAE1B,OAAO,GA6BgCE,CAAkBZ,EAFtBzB,EAAOC,aAI1BS,QAAQC,IAAR,kCAAuCc,EAAvC,2BACA,EAAKa,SAAS,CAAE/B,SAAS,EAAOC,iBAAiB,MAEjDE,QAAQC,IAAR,gDAAqDc,EAArD,+BACA,EAAKa,SAAS,CAAE/B,SAAS,EAAOC,iBAAiB,U,+BAKvD,IAAD,EACuD+B,KAAKjC,MAAzDC,EADH,EACGA,QAASC,EADZ,EACYA,gBAAiBC,EAD7B,EAC6BA,sBAClC,OAAO8B,KAAKlC,MAAMmC,SAAS,CAAEjC,UAASC,kBAAiBC,8B,GAvCrCgC,IAAMC,WA2CjBtC,Q,unDChEfuC,OAAOC,eAAe7C,EAAS,aAAc,CAC3C8C,OAAO,IAGT,IAQgCC,EAR5BC,EAAUC,EAAQ,KAElBC,EAAoBD,EAAQ,IAE5BE,EAAWF,EAAQ,KAEnBG,GAE4BL,EAFOI,IAEcJ,EAAIM,WAAaN,EAAM,CAAEO,QAASP,GAEvF/C,EAAQsD,QAAU,CAChBC,QAASH,EAAUE,QACnBE,WAAY,qBACZC,aAAc,EACdC,QAAS,CACPC,aAAc,UACdC,cAAe,UACfC,cAAe,UACfC,cAAed,EAAQe,QACvBC,aAAc,UACdC,aAAcjB,EAAQkB,QACtBC,aAAcnB,EAAQoB,QACtBC,UAAW,UACXC,oBAAoB,EAAIpB,EAAkBqB,MAAMvB,EAAQwB,UAAW,KACnEC,mBAAoBzB,EAAQ0B,MAC5BC,YAAa3B,EAAQ0B,MACrBE,YAAa5B,EAAQ6B,QACrBC,eAAe,EAAI5B,EAAkBqB,MAAMvB,EAAQwB,UAAW,IAC9DO,kBAAmB/B,EAAQgC,QAC3BC,kBAAkB,EAAI/B,EAAkBqB,MAAMvB,EAAQwB,UAAW,KACjEU,YAAalC,EAAQmC,WAEvBC,SAAU,CACNC,cAAe,U,sZCrCVC,EAAQ,CACjBC,YAAa,CACXC,OAAQ,IAEVC,WAAY,CACVC,SAAUvE,OAAOwE,YAAY,IAAI,GAAG,IAEtCC,aAAc,CACZC,WAAY,GACZL,OAAQ,KAKDM,EAAQ,CACjBP,YAAa,CACXC,OAAQ,IAEVC,WAAY,CACVC,SAAUvE,OAAOwE,YAAY,IAAI,GAAG,IAEtCC,aAAc,CACZC,WAAY,EACZL,OAAQ,KAIDO,EAAgB,CACzBN,WAAY,CACVO,MAAO,YAKAC,EAAU,WACnB,IAAIP,EAAW,QAOf,OANIvE,OAAOwE,YAAY,OACrBD,EAAW,SAETvE,OAAOwE,YAAY,MACrBD,EAAW,SAEN,CACLD,WAAW,CACTC,YAEFH,YAAa,CACXW,WAAY/E,OAAOwE,YAAY,IAAI,OAAO,QAE5CQ,MAAO,CACLC,SAAUjF,OAAOwE,YAAY,KAAK,OAAO,UAKpCU,EAAe,WACxB,MAAO,CACLZ,WAAY,CACVO,MAAM,UACNN,SAASvE,OAAOwE,YAAY,IAAI,QAAQ,QACxCW,MAAMnF,OAAOwE,YAAY,IAAI,UAAU,GACvCO,WAAY/E,OAAOwE,YAAY,IAAI,UAAU,KAC7CE,WAAW1E,OAAOwE,YAAY,IAAI,EAAE,MAEtCY,UAAW,CACTC,KAAK,UACLC,YAAYtF,OAAOwE,YAAY,IAAI,OAAO,UClE1Ce,EAAiB,CACnBC,mBAAoB,CAClBX,MAAO,WAETY,eAAgB,CACdC,OAAQ,qBAEVC,oBAAqB,CACnBD,OAAQ,qBAEVE,WAAY,CACVf,MAAO,UAGPgB,EAAkB,CACtBC,yBAA0B,CAACjB,MAAO,WAClCW,mBAAoB,CAACX,MAAO,WAC5BkB,UAAW,CAAClB,MAAO,YCiGNmB,E,kDAvGb,WAAY7G,GAAQ,IAAD,8BACjB,cAAMA,IAWR8G,cAAgB,SAACC,EAAGC,GAClB,EAAK/E,SAAL,eAAgB+E,EAAOD,KAbN,EAkBnBE,OAAS,SAACC,GACJA,GAAGA,EAAEC,iBACT,EAAKnH,MAAMoH,OAAOC,aAAlB,eAAmC,EAAKpH,SAlBxC,EAAKA,MAAQ,CACXU,KAAM,GACN2G,MAAO,GACPC,SAAU,IAEZ,EAAKN,OAAS,EAAKA,OAAOO,KAAZ,gBAPG,E,qDAuBT,IAAD,OACHC,EAAa,GACbC,EAAgB,GAChBC,GAAkB,EACtB,IACEF,EAAavF,KAAKlC,MAAM4H,UAAUC,OAAOC,SAASR,MAClDI,EAAgBxF,KAAKlC,MAAM4H,UAAUC,OAAOC,SAASP,SACrDI,EAAkBzF,KAAKlC,MAAM4H,UAAUD,gBACvC,MAAOT,IAET,IAAIa,EACF,0BAAMC,aAAW,WAAWC,SAAU/F,KAAK+E,QACzC,kBAAC,IAAD,eACEiB,WAAS,EAACC,SAAU,SAACjB,EAAGH,GAAJ,OAAQ,EAAKD,cAAcC,EAAG,SAClDpG,KAAK,OACLyH,kBAAkB,QACdhC,IAGN,kBAAC,IAAD,eACE8B,WAAS,EAACC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKD,cAAcC,EAAG,UACjDpG,KAAK,QACLyH,kBAAkB,UACdhC,EAJN,CAKEiC,UAAWZ,EACXa,eAAcb,GAAcA,EAAW/F,OAAO,EAC9C6G,iBAAe,KAGjB,kBAAC,IAAD,eACEL,WAAS,EACTC,SAAU,SAACjB,EAAGH,GAAJ,OAAQ,EAAKD,cAAcC,EAAG,aACxCpG,KAAK,WACLyH,kBAAkB,YACdhC,EALN,CAMEiC,UAAWX,EACXV,KAAK,WACLsB,eAAcZ,GAAiBA,EAAchG,OAAO,EACpD6G,iBAAe,KAGjB,6BAAM,6BACN,kBAAC,IAAD,eACEC,MAAM,SACNC,SAAO,EACPP,WAAS,GAAKlD,EAHhB,CAIEgC,KAAK,SACLrG,KAAK,YAEP,yBAAK+H,UAAU,cACb,kBAAC,IAAD,eACEC,QAAS,kBAAM,EAAK3I,MAAM4I,aAC1BJ,MAAM,WACF/C,MAMNoD,EACJ,6BACE,0HAGA,6BACA,kBAAC,IAAD,eACEX,WAAS,GAAKlD,EADhB,CAEE2D,QAAS,kBAAM,EAAK3I,MAAM4I,aAC1BJ,MAAM,WAKZ,OAAIb,EACKkB,EAEAd,M,GApGU1F,aCiERyG,E,kDAhEb,WAAY9I,GAAQ,IAAD,8BACjB,cAAMA,IAkBR+I,mBAAqB,WACnB,EAAK/I,MAAMoH,OAAO2B,mBAAmB,EAAK9I,MAAMqH,OAChD,EAAKrF,SAAS,CAAC+G,WAAU,EAAMC,QAAS,4CAA8C,EAAKhJ,MAAMqH,SAnBjG,EAAKrH,MAAQ,CACXgJ,QAASjJ,EAAMiJ,QACf3B,MAAOtH,EAAMsH,MACb0B,WAAW,GALI,E,qDAYVjC,EAAGC,GACV9E,KAAKD,SAAL,eAAgB+E,EAAOD,M,+BAWf,IAAD,OACHmC,EAAOhH,KAAKjC,MAAM+I,UAAW,GAAI,0BAAMhB,aAAW,sBAAsBC,SAAU/F,KAAK+E,QACvF,kBAAC,IAAD,eAAWiB,WAAS,EAAC1F,MAAON,KAAKjC,MAAMqH,MAAOa,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKoB,SAASpB,EAAE,UAAUpG,KAAK,QAAQyH,kBAAkB,UAAahC,IACrI,6BAAM,6BACN,kBAAC,IAAD,eACEoC,MAAM,4BACNC,SAAO,EACPP,WAAS,GACLlD,EAJN,CAKE2D,QAAS,kBAAM,EAAKI,0BAIpBI,EAAS,kBAAC,IAAD,eACXnG,SAAO,EACP2F,QAAS,kBAAM,EAAK3I,MAAM4I,aAC1BJ,MAAM,WACF/C,IAaR,OAVMvD,KAAKjC,MAAM+I,YACbG,EAAS,kBAAC,IAAD,eACPnG,SAAO,EACPkF,WAAS,EACTM,MAAM,QACFxD,EAJG,CAKP2D,QAAS,kBAAM,EAAK3I,MAAM4I,iBAK9B,6BACE,2BAAI1G,KAAKjC,MAAMgJ,SACdC,EACD,yBAAKR,UAAU,cACZS,Q,GA5DsB9G,aCyFlB+G,E,kDAvFb,WAAYpJ,GAAQ,IAAD,8BACjB,cAAMA,IA6BRiH,OAAS,SAACC,GACJA,GAAGA,EAAEC,iBACT,EAAKlF,SAAS,CAAEoH,MAAO,KACvB,EAAKrJ,MAAMoH,OAAOkC,UAAU,CAAChC,MAAO,EAAKrH,MAAMqH,MAAOC,SAAU,EAAKtH,MAAMsH,YAjC1D,EAuCnB4B,OAAS,WACP,EAAKlH,SAAS,CAACqF,MAAM,GAAGC,SAAS,GAAG8B,MAAM,KAC1C,EAAKrJ,MAAM4I,aAvCX,EAAK3I,MAAQ,CACXqH,MAAO,GACPC,SAAU,GACV8B,MAAO,IALQ,E,sEASOE,QACuBC,IAA3CD,EAAUE,KAAK5B,OAAO6B,MAAMC,cAC9BzH,KAAKD,SAAS,CAACoH,MAAOE,EAAUE,KAAK5B,OAAO6B,MAAMC,aAAa,O,2CAK7DzH,KAAKlC,MAAMyJ,KAAKG,eAClB1H,KAAKlC,MAAM6J,QAAQC,KAAK,gB,oCAOd/C,EAAGC,GACf9E,KAAKD,SAAL,eAAgB+E,EAAOD,M,+BAmBf,IAAD,OACHgD,EAAe,kBAAC,IAAD,eACjBvB,MAAM,SACNxB,KAAK,SACLrG,KAAK,SACL8H,SAAO,EACPP,WAAS,GACLlD,IAEFgF,EAAU,0BAAMhC,aAAW,QAAQC,SAAU/F,KAAK+E,QACpD,2BAAI/E,KAAKjC,MAAMoJ,OACf,kBAAC,IAAD,eAAWnB,WAAS,EAACC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKD,cAAcC,EAAE,UAAUpG,KAAK,QAAQyH,kBAAkB,UAAahC,EAAjH,CAAiIkC,eAAcpG,KAAKjC,MAAMoJ,OAASnH,KAAKjC,MAAMoJ,MAAM3H,OAAO,EAAG6G,iBAAe,KAC7M,kBAAC,IAAD,eAAWL,WAAS,EAACC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKD,cAAcC,EAAE,aAAapG,KAAK,WAAWqG,KAAK,WAAWoB,kBAAkB,YAAehC,EAAzI,CAAyJkC,eAAcpG,KAAKjC,MAAMoJ,OAASnH,KAAKjC,MAAMoJ,MAAM3H,OAAO,EAAG6G,iBAAe,KACrO,6BAAM,6BACLwB,EACD,yBAAKrB,UAAU,cACb,kBAAC,IAAD,eACEC,QAAS,kBAAM,EAAKQ,UACpBX,MAAO,WACH/C,IAEN,kBAAC,IAAD,CACE+C,MAAM,mBACNrD,WAAY,CAACO,MAAM,WACnBiD,QAAS,kBAAM,EAAK3I,MAAMiK,0BAahC,OARI/H,KAAKjC,MAAMoJ,OAASnH,KAAKjC,MAAMoJ,MAAMa,SAAS,iBAChDF,EAAU,kBAAC,EAAD,CACN5C,OAAQ,CAAC2B,mBAAoB7G,KAAKlC,MAAMoH,OAAO2B,oBAC/CE,QAAQ,uEACR3B,MAAOpF,KAAKjC,MAAMqH,MAClBsB,UAAW1G,KAAKlC,MAAM4I,aAI1BoB,M,GAnFc3H,aCyDL8H,E,kDA3Db,WAAYnK,GAAQ,IAAD,8BACjB,cAAMA,IAWR8G,cAAgB,SAACC,EAAGC,GAClB,EAAK/E,SAAL,eAAiB+E,EAAOD,KAbP,EAmBnBE,OAAS,SAACC,GACJA,GAAGA,EAAEC,iBACT,IAAIiD,EAAe,GACnB,GAAK,EAAKnK,MAAMsH,UAAa,EAAKtH,MAAMoK,gBAEjC,GAAI,EAAKpK,MAAMsH,WAAa,EAAKtH,MAAMoK,gBAC5CD,EAAe,8DAEZ,CACH,IAAME,EAAuB,EAAKtK,MAAMsK,qBAClC/C,EAAW,CACfA,SAAU,EAAKtH,MAAMsH,SACrBgD,sBAAuB,EAAKtK,MAAMoK,iBAEpC,EAAKrK,MAAMwK,cAAcF,EAAsB/C,GAC/C,EAAKvH,MAAMyK,kCAXXL,EAAe,8DAajB,EAAKnI,SAAS,CAAEmI,kBAlChB,EAAKnK,MAAQ,CACXsH,SAAU,GACV8C,gBAAiB,GACjBD,aAAc,IALC,E,qDAuCT,IAAD,OACP,OACE,0BAAMpC,aAAW,iBAAiBC,SAAU/F,KAAK+E,QAC/C,wBAAIpB,MAAO,CAACH,MAAO,oBAAqBgF,UAAW,WAAYxI,KAAKjC,MAAMmK,cAC1E,kBAAC,IAAD,eAAWlC,WAAS,EAACC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKD,cAAcC,EAAG,aAAapG,KAAK,WAAWqG,KAAK,WAAWoB,kBAAkB,gBAAmBhC,IAC9I,kBAAC,IAAD,eAAW8B,WAAS,EAACC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKD,cAAcC,EAAG,oBAAoBpG,KAAK,kBAAkBqG,KAAK,WAAWoB,kBAAkB,wBAA2BhC,IACpK,6BAAM,6BACN,kBAAC,IAAD,eACEoC,MAAM,kBACNC,SAAO,EACPP,WAAS,EACTlB,KAAK,SACLrG,KAAK,UACDqE,EANN,CAOE2D,QAAS,kBAAM,EAAK1B,OAAO,e,GAtDT5E,aCiFbsI,E,kDA5Eb,WAAY3K,GAAQ,IAAD,8BACjB,cAAMA,IAkBR4K,qBAAuB,SAAC1D,GAClBA,GAAGA,EAAEC,iBACT,IACIiD,EAAe,GACd,EAAKnK,MAAMqH,MAFP,2CAIMuD,KAAK,EAAK5K,MAAMqH,QAI7B,EAAKtH,MAAMoH,OAAOwD,qBAAqB,EAAK3K,MAAMqH,OAClD8C,EAAe,sFACf,EAAKnI,SAAS,CAAC6I,WAAU,KALzBV,EAAe,sCAFfA,EAAe,yDASjB,EAAKnI,SAAS,CAAEmI,kBA/BhB,EAAKnK,MAAQ,CACXqH,MAAO,GACP8C,aAAc,GACdU,WAAW,GALI,E,0DAYL/D,EAAGC,GACf9E,KAAKD,SAAL,eAAgB+E,EAAOD,M,+BAuBf,IAAD,OACHgE,EAAe,kBAAC,IAAD,eACf/H,SAAO,EACP2F,QAAS,kBAAM,EAAK3I,MAAM4I,aAC1BJ,MAAM,WACF/C,IAEJwB,EACA,yBAAKyB,UAAU,cACb,kBAAC,IAAD,eACEF,MAAM,SACNN,WAAS,EACTO,SAAO,EACPzB,KAAK,SACLrG,KAAK,UACDqE,EANN,CAOE2D,QAAS,kBAAM,EAAKiC,qBAAqB,WAYjD,OATI1I,KAAKjC,MAAM6K,YACbC,EAAe,kBAAC,IAAD,eACb7C,WAAS,EACTS,QAAS,kBAAM,EAAK3I,MAAM4I,aAC1BJ,MAAM,QACFxD,IAENiC,EAAS,IAGT,0BAAMe,aAAW,4BAA4BC,SAAU/F,KAAK0I,sBAC1D,2BAAI1I,KAAKjC,MAAMmK,cACf,kBAAC,IAAD,eAAWlC,WAAS,EAACC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKD,cAAcC,EAAE,UAAUpG,KAAK,QAAQyH,kBAAkB,UAAahC,IAC/Ga,EACF,yBAAKyB,UAAU,cACXqC,Q,GAvEuB1I,a,kCCJ5B,IAAM2I,E,OAASC,EAAMC,OAAO,CACjCC,QAPmB,GAQnBC,aAAc,SAGHC,EAAgB,CAC3BC,aAAc,CACZC,QAAS,CACP,WAA0CA,GAAa,IAApDC,EAAmD,EAAnDA,SAAmD,EAAzCC,SAAyC,EAA/BC,gBAGrB,OAFIF,IAAW/B,KAAKkC,QAClBJ,EAAQK,QAAR,cAAmCJ,IAAW/B,KAAKkC,OAC9CJ,IAGXtK,SAAU,CACR,CACE4K,QAAS,WAAmD5K,GAAW,IAAlDuK,EAAiD,EAAjDA,SAAUC,EAAuC,EAAvCA,SAAuC,EAA7BC,gBAUvC,OATIF,IAAW7L,OAAOO,UAChBsL,IAAW7L,OAAOmM,oBAAsB,GAC1CL,EAAS,CACPzE,KAAM,uBACN+E,QAASP,IAAW7L,OAAOmM,oBAAsB,IAEjDN,IAAW7L,OAAOmM,qBAAuB,GAC3CL,EAAS,CAAEzE,KAAM,kBAEdgF,QAAQC,QAAQhL,EAASiL,OAElC7C,MAAO,WAAmDA,GAAQ,IAA/CmC,EAA8C,EAA9CA,SAAUC,EAAoC,EAApCA,SAAoC,EAA1BC,gBAerC,OAdIF,IAAW7L,OAAOO,SAASuL,EAAS,CAAEzE,KAAM,iBAC5CqC,EAAM8C,OAAOxC,eACf8B,EAAS,CACPzE,KAAM,oBACN+E,QAAS1C,EAAM8C,OAAOxC,eAExByC,YAAW,kBAAMX,EAAS,CAAEzE,KAAM,wBAAwB,OAG1DqC,EAAMpI,UACqB,MAA1BoI,EAAMpI,SAASoL,QAA4C,MAA1BhD,EAAMpI,SAASoL,QAEjDZ,EAAS,CAAEzE,KAAM,yBAEZgF,QAAQM,OAAOjD,QC9CXkD,E,kDACnB,WAAYvM,GAAQ,IAAD,8BACjB,cAAMA,IACDC,MAAQ,CACXuM,WAAW,GAHI,E,iEAQjB,IAAIC,EAAOvK,KAUXwK,aARiB,WACf1L,MAF6B,WAG1BP,MAAK,WACEgM,EAAKxM,MAAMuM,WAAWC,EAAKxK,SAAS,CAACuK,WAAU,OACpDG,OAAM,SAAAzF,GACFuF,EAAKxM,MAAMuM,WAAWC,EAAKxK,SAAS,CAACuK,WAAU,SAGlC,O,+BAKxB,IACMI,EAAO,yBAAKC,IADH,y0mCACgBC,IAAI,OAAOjH,MAAO,CAACkH,QAAS,GAAI/G,MAAM,QAErE,OACE,kBAAC,IAAD,CACEgH,KAAM9K,KAAKjC,MAAMuM,UACjB3G,MAAO,CAACoH,OAAQ,MAChBC,aAAc,CAAClH,MAAO,MAAO+G,QAAS,EAAGI,SAAS,QAASC,IAAI,MAAOC,KAAK,SAC3EC,MAAM,wBAEN,yBAAKzH,MAAO,CAAC6E,UAAU,SAAU6C,cAAc,UAC5CX,EACD,6BAFF,2D,GAlCwCxK,IAAMC,WCqI/C,SAASmL,GAAaF,EAAOrE,EAASwE,EAAoBC,GAC/D,MAAO,CACLC,MAAO,CAAC,aAAc,wBAAyB,wBAC/C5B,QAAS,CACPR,QAAS,CACPqC,IAAI,YACJC,OAAQ,OACR3B,KAAM,CAACoB,QAAOrE,UAASwE,qBAAoBC,WAC3C7E,eAAgB,yCAChBc,aAAc,iC,IC1HhBmE,G,kDACJ,WAAY9N,GAAQ,IAAD,8BACjB,cAAMA,IAaR+N,eAAiB,WACf,EAAK9L,SAAS,CAAE6F,UAAW,EAAK7H,MAAM6H,SAAUmB,QAAS,MAfxC,EAkBnB+E,YAAc,WACZ,EAAK/L,SAAS,CAAEyH,OAAQ,EAAKzJ,MAAMyJ,MAAOT,QAAS,MAnBlC,EAsBnBgB,mBAAqB,WACnB,EAAKhI,SAAS,CAAEgM,cAAe,EAAKhO,MAAMgO,aAAchF,QAAS,MAvBhD,EA0BnBL,UAAY,WACV,EAAK3G,SAAS,CACZyH,OAAO,EACP5B,UAAU,EACVmG,cAAc,EACdlF,oBAAoB,EACpBE,QAAS,MAhCM,EAoCnBwB,2BAA6B,WAC3B,EAAKxI,SAAS,CACZiM,OAAO,EACPjF,QACE,sEAtCJ,EAAKhJ,MAAQ,CACX6H,UAAU,EACV4B,OAAO,EACPwE,OAAO,EACPD,cAAc,EACdE,YAAa,GACblF,QAAS,GACTF,oBAAoB,EACpBqF,2BAA2B,GAVZ,E,sEA4CO7E,GACpBA,EAAUE,KAAK5B,OAAOwG,aAAa3M,OAAS,GAC9CQ,KAAKD,SAAS,CAAE8G,oBAAoB,IAGpCQ,EAAU+E,aAAapE,SAAS,wCAEhChI,KAAKD,SAAS,CACZgH,QAASM,EAAU+E,aACnBF,2BAA2B,M,0CAKZ,IAAD,OACZzC,EAAQzJ,KAAKlC,MAAMc,SAASyN,OAAO/M,MAAM,KAAK,GAChDmK,EACEzJ,KAAKlC,MAAMc,SAAS0N,SAAStE,SAAS,iBACxChI,KAAKlC,MAAMyO,YAAY9C,GACnBzJ,KAAKlC,MAAMyJ,KAAKG,eAAe1H,KAAKlC,MAAM0O,cACrCxM,KAAKlC,MAAMc,SAAS0N,SAAStE,SAAS,aAC/ChI,KAAKD,SAAS,CAAEiM,OAAO,EAAMC,YAAaxC,IAGxCzJ,KAAKlC,MAAMyJ,KAAKG,eAClB1H,KAAKlC,MAAM6J,QAAQC,KAAK,cAM1B9I,MAF0B,aAEPP,KAAnB,uCAAwB,WAAOQ,GAAP,eAAAU,EAAA,sEACHV,EAASC,OADN,OAChBgL,EADgB,OAEtB,EAAKjK,SAAS,CAAC0M,SAASzC,EAAK0C,mBAFP,2CAAxB,yD,+BAQM,IAAD,OACD3F,EAAU/G,KAAKjC,MAAMgJ,QAAU,2BAAI/G,KAAKjC,MAAMgJ,SAAe,GAC/DuB,EAAgB,GAChBI,EAAuB,GACvB7B,EAAqB,GAErBjB,EACF,yBAAKY,UAAU,iBACb,kBAAC,IAAD,eACED,SAAO,EACPP,WAAS,EACTS,QAAS,kBAAM,EAAKoF,kBACpBvF,MAAM,kBACFxD,KAIN0E,EACF,yBAAKhB,UAAU,iBACb,kBAAC,IAAD,eACER,WAAS,EACTS,QAAS,kBAAM,EAAKqF,eACpBxF,MAAM,SACFxD,KA+DV,OA1DI9C,KAAKjC,MAAM6H,UACbA,EACE,kBAAC,EAAD,CACEV,OAAQ,CAAEC,aAAcnF,KAAKlC,MAAMqH,cACnCO,UAAW1F,KAAKlC,MAAMyJ,KACtBb,UAAW1G,KAAK0G,YAGpBc,EAAQ,IACCxH,KAAKjC,MAAMgO,cACpBvE,EAAQ,GACR5B,EAAW,GACX0C,EAAgB,GAChBI,EACE,kBAAC,EAAD,CACExD,OAAQ,CAAEwD,qBAAsB1I,KAAKlC,MAAM4K,sBAC3ChC,UAAW1G,KAAK0G,aAGX1G,KAAKjC,MAAMyJ,OACpB5B,EAAW,GACX4B,EACE,kBAAC,EAAD,CACEG,QAAS3H,KAAKlC,MAAM6J,QACpBJ,KAAMvH,KAAKlC,MAAMyJ,KACjBrC,OAAQ,CACNkC,UAAWpH,KAAKlC,MAAMsJ,UACtBP,mBAAoB7G,KAAKlC,MAAM+I,oBAEjCH,UAAW1G,KAAK0G,UAChBqB,mBAAoB/H,KAAK+H,sBAGpB/H,KAAKjC,MAAMiO,OACpBxE,EAAQ,GACR5B,EAAW,GACX0C,EACE,kBAAC,EAAD,CACEA,cAAetI,KAAKlC,MAAMwK,cAC1BF,qBAAsBpI,KAAKjC,MAAMkO,YACjC1D,2BAA4BvI,KAAKuI,8BAG5BvI,KAAKjC,MAAM8I,oBACpBW,EAAQ,GACR5B,EAAW,GACXiB,EACE,kBAAC,EAAD,CACE3B,OAAQ,CAAE2B,mBAAoB7G,KAAKlC,MAAM+I,oBACzCE,QAAS/G,KAAKlC,MAAMyJ,KAAK5B,OAAOwG,aAChC/G,MAAO,GACPsB,UAAW1G,KAAK0G,aAGX1G,KAAKjC,MAAMmO,4BACpBtG,EAAW,IAIX,yBAAKY,UAAU,WACb,yBAAKA,UAAU,aACb,yBAAKA,UAAU,aACb,yBAAKmE,IAAKgC,IAAc/B,IAAI,4BAE9B,yBAAKpE,UAAU,aAAaoG,KAAK,QAC/B,yBAAKjC,IAAKkC,IAASjC,IAAI,kBACvB,6BACA,6BACC7D,EACAnB,EACA4B,EACAkB,EACAJ,EACAzB,IAGL,yBAAKL,UAAU,cAAc7C,MAAO,CAACmJ,WAAoC,YAAxB9M,KAAKjC,MAAM0O,SAAyBM,IAAM7L,QAAQC,aAAe4L,IAAM7L,QAAQE,iBAChI,kBAAC,EAAD,W,GA7LcjB,aAuOP6M,gBApCS,SAAAjP,GACtB,MAAO,CACLwJ,KAAMxJ,EAAMwJ,KACZ6E,aACE,iBAAkBrO,EAAMwJ,KACpBxJ,EAAMwJ,KAAK6E,aACXrO,EAAMN,OAAO2O,iBAII,SAAA7C,GACzB,MAAO,CACLiD,WAAY,WACVjD,EDvKG,CACLkC,MAAO,CAAC,aAAa,iBAAiB,iBACtC5B,QAAS,CACPR,QAAU,CACRqC,IAAI,WACJC,OAAQ,SACRhF,eAAgB,mCAChBc,aAAc,mCCkKlBL,UAAW,SAAAG,GACTgC,ED1OG,CACLkC,MAAO,CAAC,aAAa,gBAAgB,gBACrC5B,QAAS,CACPR,QAAU,CACRqC,IAAI,WACJC,OAAQ,OACR3B,KAAM,CAAEiD,QCoOK1F,GDnObZ,eAAgB,kCAChBc,aAAc,mCCoOlBtC,aAAc,SAAAoC,GACZgC,ED/NC,SAAkBhC,GACvB,MAAO,CACLkE,MAAO,CAAC,aAAa,mBAAmB,mBACxC5B,QAAS,CACPR,QAAU,CACRqC,IAAI,gBACJC,OAAQ,OACR3B,KAAM,CAACzC,QACPZ,eAAgB,mCAChBc,aAAc,iCCsNP7B,CAAS2B,KAEpBgF,YAAa,SAAAW,GACX3D,EDnNC,SAAiB2D,GACtB,MAAO,CACLzB,MAAO,CAAC,aAAa,kBAAkB,kBACvC5B,QAAS,CACPR,QAAU,CACRqC,IAAI,gBACJC,OAAQ,MACR3B,KAAM,CAAEkD,sBACRvG,eAAgB,+CAChBc,aAAc,iCC0MP0F,CAAQD,KAEnBxE,qBAAsB,SAAAtD,GACpBmE,EDtKC,SAA8BnE,GACnC,MAAO,CACLqG,MAAO,CAAC,aAAa,wBAAwB,wBAC7C5B,QAAS,CACPR,QAAU,CACRqC,IAAI,YACJC,OAAQ,OACR3B,KAAM,CAAC3E,SAAU,CAAED,UACnBuB,eAAgB,oDAChBc,aAAc,iCC6JPiB,CAAqBtD,KAEhCkD,cAAe,SAAC2D,EAAa5G,GAC3BkE,ED1JC,SAAuBnB,EAAsB/C,GAClD,MAAO,CACLoG,MAAO,CAAC,aAAa,gBAAgB,gBACrC5B,QAAS,CACPR,QAAU,CACRqC,IAAI,YACJC,OAAQ,MACR3B,KAAM,CAAC5B,uBAAsB/C,YAC7BsB,eAAgB,4CAChBc,aAAc,iCCiJPa,CAAc2D,EAAa5G,KAEtCwB,mBAAoB,SAAAzB,GAClBmE,ED7MC,SAA4BnE,GACjC,MAAO,CACLN,KAAM,sBACN+E,QAAS,CACPR,QAAU,CACRqC,IAAI,gBACJC,OAAQ,OACR3B,KAAM,CACJmC,aAAc,CACZ/G,MAAOA,IAGXuB,eAAgB,sDAChBc,aAAc,iCCgMPZ,CAAmBzB,QAKnB4H,CAA6CpB,I,mFCzL7CwB,GAjEa,SAACtP,GAC3B,OACE,yBAAK8O,KAAK,OAAOjJ,MAAO,CAACG,MAAM,OAAQuJ,OAAO,QAAS7G,UAAU,uBAC/D,4BACE1B,KAAK,SACLrG,KAAK,aACL6O,kBAAgB,cAChBC,mBAAiB,oBACjB/G,UAAU,eACVC,QAAS,kBAAM3I,EAAM0P,eAAe,QACpCC,SAAS,KAET,yBAAKjH,UAAU,cACb,yBAAKA,UAAU,OAAOkH,cAAY,QAChC,kBAAC,KAAD,OAEF,yBAAKlH,UAAU,QACb,0BAAMmH,GAAG,eAAT,cACA,0BAAMA,GAAG,qBAAT,0CAKN,4BACE7I,KAAK,SACLrG,KAAK,SACL6O,kBAAgB,cAChBC,mBAAiB,oBACjB/G,UAAU,eACVC,QAAS,kBAAM3I,EAAM0P,eAAe,WACpCC,SAAS,KAET,yBAAKjH,UAAU,cACb,yBAAKA,UAAU,OAAOkH,cAAY,QAChC,kBAAC,KAAD,OAEF,yBAAKlH,UAAU,QACb,0BAAMmH,GAAG,eAAT,UACA,0BAAMA,GAAG,qBAAT,mDAKN,4BACE7I,KAAK,SACLrG,KAAK,QACL6O,kBAAgB,aAChBC,mBAAiB,mBACjB/G,UAAU,eACVC,QAAS,kBAAM3I,EAAM0P,eAAe,UACpCC,SAAS,KAET,yBAAKjH,UAAU,cACb,yBAAKA,UAAU,OAAOkH,cAAY,QAChC,kBAAC,KAAD,OAEF,yBAAKlH,UAAU,QACb,0BAAMmH,GAAG,cAAT,SACA,0BAAMA,GAAG,oBAAT,8CCEGC,GA3DQ,SAAA9P,GAKrB,OACE,yBAAK6F,MAAO,CAAEG,MAAO,OAAQuJ,OAAQ,OAAQ7E,UAAW,WACtD,8CACA,0BAAMzC,SAPG,SAAA8H,GACPA,GAAOA,EAAM5I,iBACZnH,EAAMgQ,iBAAiBhQ,EAAMiQ,aAM9B,yBAAKpK,MAAO,CAAEG,MAAO,MAAOuJ,OAAQ,SAClC,kBAAC,IAAD,eACEM,GAAG,cACHzH,kBAAkB,gBACd1B,EAHN,CAIElE,MAAOxC,EAAMsN,MACbjF,UAAWrI,EAAM6H,OAAOyF,MACxBhF,eAActI,EAAM6H,OAAOyF,MAAM5L,OAAS,EAC1CyG,SAAU,SAAC4H,EAAOG,GAAR,OAAqBlQ,EAAMmQ,IAAI,QAASD,IAClDhI,WAAS,KAEX,kBAAC,IAAD,eACE2H,GAAG,sBACHzH,kBAAkB,wBACd1B,EAHN,CAIElE,MAAOxC,EAAMoQ,UACb/H,UAAWrI,EAAM6H,OAAOuI,UACxB9H,eAActI,EAAM6H,OAAOuI,UAAU1O,OAAS,EAC9CyG,SAAU,SAAC4H,EAAOG,GAAR,OAAqBlQ,EAAMmQ,IAAI,YAAaD,IACtDhI,WAAS,KAEX,kBAAC,IAAD,eACE2H,GAAG,iBACHzH,kBAAkB,mBACd1B,EAHN,CAIElE,MAAOxC,EAAMqQ,KACbhI,UAAWrI,EAAM6H,OAAOwI,KACxB/H,eAActI,EAAM6H,OAAOwI,KAAK3O,OAAS,EACzCyG,SAAU,SAAC4H,EAAOG,GAAR,OAAqBlQ,EAAMmQ,IAAI,OAAQD,IACjDhI,WAAS,MAGb,yBAAKrC,MAAO,CAAE6E,UAAW,SAAUnF,WAAY,KAC7C,kBAAC,IAAD,CACEiD,MAAM,OACNG,QAAS,kBAAM3I,EAAMsQ,gBACrBtI,aAAW,SAEb,kBAAC,IAAD,CACEQ,MAAsB,IAAfxI,EAAMuQ,KAAa,OAAS,SACnC9H,SAAO,EACP+H,SAAUxQ,EAAMgQ,gBAChBhJ,KAAK,SACLgB,aAAW,e,+GCtDFyI,G,kDAEnB,WAAYzQ,GAAQ,IAAD,uBACjB,cAAMA,IAsBR0Q,YAAc,WACZ,IAAMC,EAAc,EAAK3Q,MAAMkM,KAAK0E,WAAU,SAAC1E,GAAD,OAAQA,EAAK2E,OAAO,EAAK5Q,MAAM6Q,cAC7E,GAAIH,GAAa,EAAG,CAClB,IAAMI,EAAS,EAAK/Q,MAAMkM,KAAKyE,GAC/B,GAAI,EAAK1Q,MAAM6Q,aAAa,EAAK7Q,MAAM+Q,oBACFxH,IAAVuH,GAGvB,EAAK9O,SAAS,CAAC+O,eAAgB,EAAK/Q,MAAM6Q,aAE1C,EAAK9Q,MAAMmI,SAAS4I,EAAOvO,MAAOmO,IAGlC,EAAK1O,SAAS,CAAC6O,WAAY,EAAK7Q,MAAM+Q,iBAM5CC,SAASC,cAAc,IAAI,EAAKlR,MAAM6P,IAAIsB,QA1CzB,EA6CnBC,OAAS,SAACN,EAAYO,GACpB,OAAIP,IAAa,EAAK7Q,MAAM+Q,gBAAsC,IAApBF,EAAWpP,OAChD4P,KAAaC,SAAST,EAAYO,GAElCC,KAAaE,sBAAsBV,EAAYO,IA/CxD,IAAIP,EAAa,GACjB,QAAkBtH,IAAdxJ,EAAMwC,MAAmB,CAC3B,IAAMiP,EAAazR,EAAMkM,KAAKwF,MAAK,SAACxF,GAAD,OAAQA,EAAK1J,QAAQxC,EAAMwC,SAC1DiP,IAAYX,EAAaW,EAAWZ,MALzB,OAOjB,EAAK5Q,MAAQ,CACX6Q,WAAYA,EAAWa,WACvBX,eAAgBF,EAAWa,WAC3BC,iBAAkB,IAVH,E,sEAcOrI,GACxB,GAAIA,EAAU/G,OAAS+G,EAAU/G,QAAQN,KAAKlC,MAAMwC,MAAO,CACzD,IAAMiP,EAAalI,EAAU2C,KAAKwF,MAAK,SAACxF,GAAD,OAAQA,EAAK1J,QAAQ+G,EAAU/G,SAClEiP,GAAYvP,KAAKD,SAAS,CAAC6O,WAAYW,EAAWZ,KAAMG,eAAgBS,EAAWZ,WAC5D,KAAlBtH,EAAU/G,OACnBN,KAAKD,SAAS,CAAC6O,WAAW,GAAIE,eAAe,O,+BAkCvC,IAAD,OACHnL,EAAM3D,KAAKlC,MAAM6F,MAAO3D,KAAKlC,MAAM6F,MAAQ,GAE/C,OADI3D,KAAKlC,MAAMgG,QAAOH,EAAK,MAAY3D,KAAKlC,MAAMgG,MAAMA,OACjD,kBAAC,KAAD,eACL6J,GAAI3N,KAAKlC,MAAM6P,GACf7H,aAAY9F,KAAKlC,MAAMwI,MACvBJ,kBAAmBlG,KAAKlC,MAAMoI,kBAC9ByJ,SAAU3P,KAAKlC,MAAM6R,SACrBC,aAAW,EACXV,OAAQlP,KAAKkP,OACbW,WAAY7P,KAAKlC,MAAMkM,KACvB8F,iBAAkB,CAACnB,KAAK,OAAOrO,MAAM,SACrCsO,WAAY5O,KAAKjC,MAAM6Q,WACvBmB,cAAe,SAAClL,EAAEmL,EAAEC,GAAK,EAAKlQ,SAAS,CAAC6O,WAAW/J,KACnDqL,QAASlQ,KAAKwO,YACdxI,WAAS,EACTrC,MAAOA,EACPwM,eAAgB,CAACjN,SAASvE,OAAOwE,YAAY,KAAK,OAAO,MACzDmL,SAAUtO,KAAKlC,MAAMwQ,SACrBnI,UAAWnG,KAAKlC,MAAMqI,WAClB3B,EAjBC,CAkBL4L,UAAW,CAACC,UAAUrQ,KAAKlC,MAAMuS,UAAUrQ,KAAKlC,MAAMuS,UAAU,Y,GA5E7BnQ,IAAMC,WCwLhCmQ,GA1KU,SAACxS,GAKxB,IAAIyS,EAAY,SAACC,EAAeC,EAAoBC,GAClD,OAAIA,EACM,CAAC,CACPvB,IAAKqB,EAAc,QACnBlQ,MAAO,EACPqO,KAAM,KAGH8B,EAAmBE,KAAI,SAACC,GAC3B,MAAO,CACLzB,IAAIyB,EACJtQ,MAAMsQ,EAAI,EACVjC,KAAK,SAASiC,EAAI,QAMpBC,EAAsB,GAmD1B,OAlDF/S,EAAMgT,gBAAgBC,SAAQ,SAACC,GAC7B,IAAMP,EAAsBO,EAAMC,OAAaC,MAAMC,KAAKD,MAAMF,EAAMC,QAAQ3S,QAApC,GAC1CuS,EAAoBjJ,KAClB,kBAACwJ,GAAA,SAAD,CAAUjC,IAAK6B,EAAMK,QACnB,kBAACD,GAAA,eAAD,CAAgBtL,aAAW,eAAenC,MAAO,CAACN,WAAW,MAAMmF,UAAW,WAAYwI,EAAMK,QAChG,kBAACD,GAAA,eAAD,CAAgBtL,aAAW,mBAAmBnC,MAAO,CAAC6E,UAAW,WAC/D,kBAAC,IAAD,CACE1C,aAAY,6BAA+BkL,EAAMK,OACjD1D,GAAIqD,EAAMK,OAAO,oBACjBvM,KAAK,SACLxE,MAAO0Q,EAAMC,OACbK,UAAQ,EACRC,IAAK,EACLtL,SAAU,SAACjB,GAAD,OAAKlH,EAAM0T,iCAAiCxM,EAAGgM,EAAO,WAChErN,MAAO,CAACG,MAAM,OAGlB,kBAACsN,GAAA,eAAD,CAAgBtL,aAAW,aAAanC,MAAO,CAACN,WAAW,WACzD,kBAAC,KAAD,CACEyC,aAAW,0BACXW,QAAS,kBAAM3I,EAAM2T,oBAAoBT,IACzCU,QAASV,EAAMW,QACfrD,SAAU0C,EAAMC,QAAQ,EACxBtN,MAAO,CAACiO,WAAW,MAGvB,kBAACR,GAAA,eAAD,CAAgBtL,aAAW,0CAA0CnC,MAAO,CAACN,WAAW,MAAOwO,YAAY,EAAGC,aAAa,IACzH,kBAAC,GAAD,CACEnE,GAAI,iBAAiBqD,EAAMK,OAC3B/K,MAAO,qCAAuC0K,EAAMK,OACpDpL,SAAU,SAAC3F,GAASxC,EAAM0T,iCAAiC,KAAMR,EAAO,UAAW1Q,IACnF0J,KAAMuG,EAAUS,EAAMe,QAAStB,GAAsBO,EAAMW,SAAWX,EAAMC,OAAO,IAAM,GACzF3Q,MAAO0Q,EAAMe,QACbzD,UAAY0C,EAAMW,SAAWX,EAAMC,OAAO,IAAM,EAChDZ,UAAW,OAIf,kBAACe,GAAA,eAAD,CAAgBtL,aAAW,aAAanC,MAAO,CAAC6E,UAAW,WACzD,kBAAC,KAAD,CACI1C,aAAW,SACXW,QAAS,kBAAM3I,EAAMkU,8BAA8BhB,EAAMK,UAEzD,kBAAC,KAAD,aAQR,yBAAK1N,MAAO,CAACG,MAAM,OAAQuJ,OAAQ,SACjC,yBAAK1J,MAAO,CAACsH,SAAS,WAAYgH,MAAM,EAAG/G,IAAI,IAC7C,kBAAC,KAAD,CAAYgH,QAAQ,yBAClB,kBAAC,KAAD,CAAU1O,MAAO,cAGrB,wBAAIG,MAAO,CAAC6E,UAAU,WAAtB,aACA,uBAAG7E,MAAO,CAACN,WAAY,GAAImF,UAAU,WAArC,gKAIE,uBAAG7E,MAAO,CAACN,WAAY,GAAImF,UAAU,WAArC,oCAGF,yBAAK7E,MAAO,CAACG,MAAO,OAAQuJ,OAAQ,OAAQ8E,QAAS,OAAQC,eAAe,eAAgBC,WAAY,SAAUxH,QAAQ,UAAWiC,WAAW,UAAWzI,OAAO,sBAChK,2BAAOsJ,GAAG,YAAYhK,MAAO,CAACH,MAAM,YAApC,eAGA,6BACE,kBAAC,IAAD,CACE8J,kBAAgB,YAChB7O,KAAK,UACL6B,MAAOxC,EAAMwU,QACbrM,SAAU,SAAC4H,EAAOG,GAAclQ,EAAMmQ,IAAI,UAAWsE,SAASvE,EAAU,MACxErK,MAAO,CAACG,MAAM,IACdgB,KAAK,YAGT,2BAAO6I,GAAG,YAAYhK,MAAO,CAACH,MAAM,YAApC,oBAIA,6BACE,kBAAC,IAAD,CACE8J,kBAAgB,YAChB7O,KAAK,SACL6B,MAAOxC,EAAM0U,OACbvM,SAAU,SAAC4H,EAAOG,GAAclQ,EAAMmQ,IAAI,SAAUsE,SAASvE,EAAU,MACvErK,MAAO,CAACG,MAAM,IACdgB,KAAK,SACLyM,IAAI,OAGR,6BACE,kBAAC,KAAD,CACEjL,MAAM,UACNR,aAAW,0BACX4L,QAAS5T,EAAM2U,UACfhM,QAAS,kBAAI3I,EAAMmQ,IAAI,aAAcnQ,EAAM2U,eAG/C,6BACE,kBAAC,IAAD,CACEnM,MAAM,MACNR,aAAW,MACXW,QAAS,kBAAM3I,EAAM4U,oBACrBnM,SAAO,MAIZsK,EAAoBrR,OAAO,EAC1B,yBAAKsG,aAAW,sBAAsBnC,MAAO,CAACN,WAAW,KACvD,kBAAC+N,GAAA,MAAD,CAAOuB,YAAY,EAAOC,aAAa,GACrC,kBAACxB,GAAA,YAAD,CAAayB,kBAAkB,EAAOC,mBAAmB,GACvD,kBAAC1B,GAAA,SAAD,KACE,kBAACA,GAAA,kBAAD,CAAmBzN,MAAO,CAAC6E,UAAW,SAAUhF,MAAM,YAAtD,aACA,kBAAC4N,GAAA,kBAAD,CAAmBzN,MAAO,CAACH,MAAM,YAAjC,oBACA,kBAAC4N,GAAA,kBAAD,CAAmBzN,MAAO,CAACH,MAAM,YAAjC,WACA,kBAAC4N,GAAA,kBAAD,CAAmBzN,MAAO,CAACH,MAAM,YAAjC,sBAGJ,kBAAC4N,GAAA,UAAD,CAAW2B,oBAAoB,GAC5BlC,KAGE,GAGX,yBAAKlN,MAAO,CAAC6E,UAAU,SAASnF,WAAW,KACzC,kBAAC,IAAD,CACIiD,MAAM,OACNR,aAAW,OACXW,QAAS,kBAAM3I,EAAMsQ,kBAExBtQ,EAAMgT,gBAAgBtR,OAAO,EAC9B,kBAAC,IAAD,CACE8G,MAAM,OACNR,aAAW,OACXS,SAAO,EACPE,QAAS,kBAAM3I,EAAMiQ,cACpB,M,SClLQiF,G,kDAEnB,WAAYlV,GAAQ,IAAD,8BACjB,cAAMA,IAQR4S,WAAa,WACX,OAAI,EAAK3S,MAAMkV,YAC0B,IAA/B,EAAKlV,MAAMkV,WAAWzT,QAXf,EAgBnBuF,OAAS,SAAC8I,GACJA,GAAOA,EAAM5I,iBACZ,EAAKyL,cACR,EAAK5S,MAAMoV,cAAc,CAACD,WAAY,EAAKlV,MAAMkV,WAAYE,aAAc,EAAKpV,MAAMoV,aAAcC,UAAW,EAAKrV,MAAMqV,aAnB3G,EAuBnBnN,SAAW,SAAC3F,EAAOwE,GACjB,EAAK/E,SAAL,eAAiB+E,EAAOxE,KAxBP,EA2BnB+S,0BAA4B,SAAChM,GACE,YAAzBA,EAAUiM,eACZjM,EAAU2E,QACV3E,EAAUkM,UA9BK,EAkCnBC,yBAA2B,SAACC,GAE1B,OADyB,CAAC,OAAQ,OACTzL,SAASyL,EAAK3O,OApCtB,EAwCnB4O,mBAAqB,SAACC,GACpB,IAAIF,EAAOE,EAAM,GACbR,EAAeM,EAAK3O,KAAKxF,MAAM,KAAK,GACpCsU,EAAS,IAAIC,WACjBD,EAAOE,WAAWL,GAClBG,EAAOG,UAAY,kBAAI,EAAKhU,SAAS,CAACkT,WAAYW,EAAOI,OAAQb,mBA7ChD,EAgDnBc,gBAAkB,SAACN,GACjB,IAAIF,EAAOE,EAAM,GACbC,EAAS,IAAIC,WACjBD,EAAOM,cAAcT,GACrBG,EAAOG,UAAY,WAAM,EAAKhU,SAAS,CAACqT,UAAWQ,EAAOI,WAlD1D,EAAKjW,MAAQ,CACXkV,WAAY,GACZE,aAAc,OACdC,UAAU,IALK,E,qDAuDT,IAAD,OAMP,MAJ8B,QAA1BpT,KAAKjC,MAAMoV,cACA,2BAAG,wCAAH,kPAIb,6BACE,yBAAKxP,MAAO,CAAC6E,UAAU,WACrB,uCAEF,gDACA,kIACA,0BAAMzC,SAAU/F,KAAK+E,QACnB,yBAAKyB,UAAU,UAAU7C,MAAO,CAAC0H,cAAc,QAC7C,2BACEvG,KAAK,OACLqP,OAAO,cACP1V,KAAK,eACLqH,aAAW,wBACXG,SAAU,SAAC4H,GAAD,OAAS,EAAK6F,mBAAmB7F,EAAMgB,OAAO8E,QACxDlN,QAAS,SAACoH,GAAD,OAASA,EAAMgB,OAAOvO,MAAM,SAGzC,yBAAKkG,UAAU,WACb,8BACEV,aAAW,yBACXM,oBAAwCkB,IAA1BtH,KAAKlC,MAAMwV,aACzB7U,KAAK,aACL6B,MAAON,KAAKjC,MAAMkV,WAClBmB,KAAM,EACNnO,SAAU,SAACjB,GAAD,OAAK,EAAKiB,SAASjB,EAAE6J,OAAOvO,MAAO,kBAGjD,6BA8BA,6CACA,4FACA,yBAAKkG,UAAU,UAAU7C,MAAO,CAAC0H,cAAc,QAC7C,2BACEvG,KAAK,OACLqP,OAAO,+FACP1V,KAAK,iBACLqH,aAAW,uBACXG,SAAU,SAAC4H,GAAD,OAAS,EAAKoG,gBAAgBpG,EAAMgB,OAAO8E,QACrDlN,QAAS,SAACoH,GAAD,OAASA,EAAMgB,OAAOvO,MAAM,SAGzC,kCAC2BgH,IAA1BtH,KAAKlC,MAAMwV,aACV,uBAAG3F,GAAG,WAAWhK,MAAO,CAAC0Q,WAAW,QAAS7Q,MAAO,QAASxD,KAAKlC,MAAMwV,cACtE,GAGJ,yBAAK3P,MAAO,CAAC6E,UAAU,SAASnF,WAAW,KACzC,kBAAC,IAAD,CACEiD,MAAM,OACNR,aAAW,OACXW,QAAS,kBAAM,EAAK3I,MAAMsQ,kBAE5B,kBAAC,IAAD,CACE9H,MAAM,OACNR,aAAW,OACXS,SAAO,EACP+H,SAAUtO,KAAK0Q,aACf5L,KAAK,kB,GAtJwB5E,IAAMC,WCA5BmU,G,kDAEnB,WAAYxW,GAAQ,IAAD,8BACjB,cAAMA,IAMRmI,SAAW,SAACsO,GACV,EAAKxU,SAAS,CAAEwU,kBARC,EAWnBxP,OAAS,SAAC8I,GACJA,GAAOA,EAAM5I,iBACjB,EAAKnH,MAAM0W,aAAa,EAAK1W,MAAM2W,YAAY,EAAK1W,MAAMwW,cAAc5G,IACxE,EAAK7P,MAAMkO,QACX,EAAKlO,MAAMyV,SAbX,EAAKxV,MAAQ,CACXwW,cAAe,GAHA,E,qDAkBV,IAAD,OACN,GAAIvU,KAAKlC,MAAM2W,YAAYjV,OAAO,EAAG,CACnC,IAAMwK,EAAOhK,KAAKlC,MAAM2W,YAAY9D,KAAI,SAACnF,EAASkJ,GAChD,MACE,CAAC/F,KAAMnD,EAAQJ,MAAO9K,MAAMoU,MAGhC,OACE,yBAAK/Q,MAAO,CAACG,MAAM,MAAOuJ,OAAO,SAC/B,wBAAI1J,MAAO,CAAC6E,UAAW,WAAvB,4BACA,0BAAMzC,SAAU/F,KAAK+E,QACrB,kBAAC,GAAD,CACE4I,GAAG,qBACHrH,MAAM,4BACNJ,kBAAkB,4BAClB8D,KAAMA,EACN/D,SAAUjG,KAAKiG,WAEf,yBAAKtC,MAAO,CAAC6E,UAAU,SAASnF,WAAW,KACzC,kBAAC,IAAD,CACEiD,MAAM,OACNR,aAAW,OACXW,QAAS,kBAAM,EAAK3I,MAAMsQ,kBAE5B,kBAAC,IAAD,CACE9H,MAAM,QACNR,aAAW,QACXS,SAAO,EACPzB,KAAK,SACLwJ,SAAUtO,KAAKjC,MAAMwW,aAAa,EAClC9N,QAAS,kBAAM,EAAK1B,OAAO,YAOrC,OAAO,yBAAKpB,MAAO,CAACG,MAAM,MAAOuJ,OAAO,SACtC,wBAAI1J,MAAO,CAAC6E,UAAW,WAAvB,4BACA,uBAAG7E,MAAO,CAAC6E,UAAU,SAASnF,WAAW,QAAzC,0CACA,yBAAKM,MAAO,CAAC6E,UAAU,SAASnF,WAAW,KACrC,kBAAC,IAAD,CACEiD,MAAM,OACNR,aAAW,OACXW,QAAS,kBAAM,EAAK3I,MAAMsQ,wB,GAhEAlO,IAAMC,WCoBjCwU,GArBU,SAAC7W,GACxB,OAAO,yBAAK6F,MAAO,CAACG,MAAM,OAAQ+G,QAAQ,UAAWwC,OAAQ,OAAQ7E,UAAW,WAC9E,kBAAC,IAAD,eACElC,MAAM,8BACNG,QAAS3I,EAAM8W,QACXtR,EAHN,CAIEL,WAAU,aAAG4R,cAAc,QAAWvR,EAAML,YAC5CU,MAAO,CAACM,YAAY,YANjB,KAWL,kBAAC,IAAD,eACEqC,MAAM,4BACFhD,EAFN,CAGEL,WAAU,aAAG4R,cAAc,QAAWvR,EAAML,YAC5CwD,QAAS3I,EAAMiQ,SACfpK,MAAO,CAACiO,WAAW,cCoJVkD,GAhKQ,SAAAhX,GAgBnB,OACI,yBAAK6F,MAAO,CAACG,MAAO,MAAOuJ,OAAQ,SAC/B,wBAAI1J,MAAO,CAAC6E,UAAW,WAAvB,mBACA,2DACA,yBAAK7E,MAAO,CAACwO,QAAS,OAAQC,eAAgB,WAC1C,kBAAC2C,GAAA,iBAAD,CACItW,KAAK,cACLuW,gBAAgB,eAChB/O,SAAU,SAACjB,EAAGH,GAAJ,OAtBP,SAACG,EAAGH,GAGT,iBAANA,GACA/G,EAAMmQ,IAAI,sBAAuBpJ,GACjC/G,EAAMmQ,IAAI,qBAAsB,OACnB,gBAANpJ,GACP/G,EAAMmQ,IAAI,qBAAsBpJ,GAChC/G,EAAMmQ,IAAI,sBAAuB,OAEjC9P,QAAQC,IAAI4G,EAAGH,GAYaoQ,CAAajQ,EAAGH,IACpClB,MAAO,CAACG,MAAO,MAEf,kBAACiR,GAAA,YAAD,CACIjP,aAAW,yBACXxF,MAAM,eACNgG,MAAM,2BAEV,kBAACyO,GAAA,YAAD,CACIjP,aAAW,wBACXxF,MAAM,cACNgG,MAAM,4BAKjBxI,EAAMoX,qBAAuBpX,EAAMqX,mBAChC,yBACIxR,MAAO,CACHG,MAAO,OACPuJ,OAAQ,OACR8E,QAAS,OACTC,eAAgB,SAChBC,WAAY,WAGhB,2BACI1E,GAAG,kBACHhK,MAAO,CAACH,MAAO,UAAWsO,aAAc,KAF5C,mBAMA,6BACI,kBAAC,IAAD,CACIxE,kBAAgB,kBAChB7O,KAAK,uBACL6B,MAAOxC,EAAMsX,qBACbnP,SAAU,SAAC4H,EAAOG,GACdlQ,EAAMmQ,IAAI,uBAAwBsE,SAASvE,EAAU,MAEzDrK,MAAO,CAACG,MAAO,IACfgB,KAAK,aAKjB,GAGJ,sDAEI,kBAAC,KAAD,CACIf,UAAW,CAACb,SAAU,GAAIY,MAAO,GAAId,OAAQ,IAC7CkP,QAAQ,0CAER,kBAAC,KAAD,QAGR,yBACIvO,MAAO,CACHG,MAAO,OACPuJ,OAAQ,OACR8E,QAAS,OACTC,eAAgB,SAChBC,WAAY,WAGhB,kBAAC,GAAD,CACI1E,GAAG,wBACHrH,MAAM,0BACN0D,KAAM,CACF,CAAC2E,KAAM,OAAQrO,MAAO,QACtB,CAACqO,KAAM,QAASrO,MAAO,UAE3BA,MAAOxC,EAAMuX,gBACbpP,SAAU,WACwB,SAA1BnI,EAAMuX,gBACNvX,EAAMmQ,IAAI,kBAAmB,SAE7BnQ,EAAMmQ,IAAI,kBAAmB,SAGrCnK,MAAO,OAGf,yDAEI,kBAAC,KAAD,CACIC,UAAW,CAACb,SAAU,GAAIY,MAAO,GAAId,OAAQ,IAC7CkP,QAAQ,qBAER,kBAAC,KAAD,QAGR,yBACIvO,MAAO,CACHG,MAAO,OACPuJ,OAAQ,OACR8E,QAAS,OACTC,eAAgB,SAChBC,WAAY,WAGhB,kBAAC,GAAD,CACI1E,GAAG,kBACHrH,MAAM,6BACN0D,KAAM,CACF,CAAC2E,KAAM,MAAOrO,MAAO,OACrB,CAACqO,KAAM,cAAerO,MAAO,eAC7B,CAACqO,KAAM,MAAOrO,MAAO,QAEzBA,MAAO,MACP2F,SAAU,SAAAjB,GACNlH,EAAMmQ,IAAI,gBAAiBjJ,GAC3B7G,QAAQC,IAAI4G,IAEhBlB,MAAO,OAIf,yBAAKH,MAAO,CAAC6E,UAAW,SAAUnF,WAAY,KAC1C,kBAAC,IAAD,CACIiD,MAAM,OACNR,aAAW,OACXW,QAAS,kBAAM3I,EAAMsQ,kBAEzB,kBAAC,IAAD,CACI9H,MAAM,SACNR,aAAW,SACXS,SAAO,EACPE,QAAS,kBAAM3I,EAAM8W,eCzJpBU,G,kDACnB,WAAYxX,GAAQ,IAAD,8BACjB,cAAMA,IAwBRmQ,IAAM,SAACxP,EAAM6B,GACX,EAAKP,SAAL,eAAiBtB,EAAO6B,IAAS,WAC/B,EAAKP,SAAS,CACZ4F,OAAO,2BAAM,EAAK5H,MAAM4H,QAAW,EAAK4P,qBAAqB9W,UA5BhD,EAiCnBuN,MAAQ,WACN,EAAKjM,SAAS,CACZyV,YAAa,GACbnH,KAAM,EACNjD,MAAO,GACP8C,UAAW,GACXuH,cAAe,GACftH,KAAM,GACNmE,QAAS,EACTE,OAAQ,GACRC,WAAW,EACX2C,qBAAsB,EACtBF,oBAAqB,KACrBC,mBAAoB,KACpBrE,gBAAiB,GACjBnL,OAAQ,CACNyF,MAAO,GACP8C,UAAW,GACXC,KAAM,OAnDO,EA6DnBoH,qBAAuB,SAAAzQ,GACrB,IAAMa,EAAS,GAmBf,OAlBA,EAAK7H,MAAM2W,YAAY1D,SAAQ,SAAAvF,GAChB,UAAT1G,EACE0G,EAAQJ,QAAU,EAAKrN,MAAMqN,MAC/BzF,EAAOyF,MAAQ,iCACL,EAAKrN,MAAMqN,QACrBzF,EAAOyF,MAAQ,6BAEC,cAATtG,IACL0G,EAAQ0C,YAAc,EAAKnQ,MAAMmQ,UACnCvI,EAAOuI,UAAY,wCACT,EAAKnQ,MAAMmQ,YACrBvI,EAAOuI,UAAY,wCAIU,IAA/B9N,OAAO9B,KAAKqH,GAAQnG,SACtBmG,EAAOb,GAAQ,IAEVa,GAjFU,EAuFnBmI,cAAgB,WACd,GAAI,EAAK/P,MAAM4H,OAAOyF,MAAO,OAAO,EACpC,GAAI,EAAKrN,MAAM4H,OAAOuI,UAAW,OAAO,EACxC,IAAK,IAAI8C,KAAS,EAAKjT,MAAM+S,gBAC3B,IAAK,EAAK/S,MAAM+S,gBAAgBE,GAAOC,QAA8B,IAApB,EAAKlT,MAAMsQ,KAC1D,OAAO,EAEX,OAAK,EAAKtQ,MAAMqN,OAA6B,IAApB,EAAKrN,MAAMsQ,OAC/B,EAAKtQ,MAAMmQ,WAAiC,IAApB,EAAKnQ,MAAMsQ,MA/FvB,EAwGnB2D,8BAAgC,SAAA0D,GAC9B,IAAIC,EAAqB,GACzB,EAAK5X,MAAM+S,gBAAgBC,SAAQ,SAAAC,GAC7BA,EAAMK,OAASqE,EACjBC,EAAmB/N,KAAKoJ,GACfA,EAAMK,OAASqE,GACxBC,EAAmB/N,KAAnB,2BAA6BoJ,GAA7B,IAAoCK,OAAQL,EAAMK,OAAS,QAG/D,EAAKtR,SAAS,CAAE+Q,gBAAiB6E,KAjHhB,EAwHnBC,8BAAgC,WAE9B,IADA,IAAID,EAAqB,GAAGE,OAAO,EAAK9X,MAAM+S,iBACrCgF,EAAI,EAAGA,EAAIvD,SAAS,EAAKxU,MAAMuU,QAAS,IAAKwD,IACpDH,EAAmB/N,KAAK,CACtByJ,OAAQsE,EAAmBnW,OAAS,EACpCyR,OAAQ,EAAKlT,MAAMyU,OACnBb,QAAS,EAAK5T,MAAM0U,UACpBV,QAAS,IAGb,EAAKhS,SAAS,CAAE+Q,gBAAiB6E,KAlIhB,EA6InBnE,iCAAmC,SAAC3D,EAAOkI,EAAcC,EAAO1V,GAC9D,IAAIqV,EAAqB,GACzB,EAAK5X,MAAM+S,gBAAgBC,SAAQ,SAACC,EAAO8E,GACrCC,EAAa1E,SAAWyE,EAAI,GAC9BC,EAAY,eAAQ/E,GACN,YAAVgF,EACFD,EAAaC,GAAS1V,EACH,WAAV0V,IACTD,EAAaC,GAASzD,SAAS1E,EAAMgB,OAAOvO,MAAO,IAC/CyV,EAAaC,GAASD,EAAY,UACpCA,EAAY,QAAc,GAEA,IAAxBA,EAAaC,KACfD,EAAY,SAAc,IAG9BJ,EAAmB/N,KAAKmO,IAExBJ,EAAmB/N,KAAKoJ,MAG5B,EAAKjR,SAAS,CAAE+Q,gBAAiB6E,KAlKhB,EA0KnBlE,oBAAsB,SAAAsE,GACpB,IAAIJ,EAAqB,GACzB,EAAK5X,MAAM+S,gBAAgBC,SAAQ,SAACC,EAAO8E,GACrCC,EAAa1E,SAAWyE,EAAI,IAC9BC,EAAY,eAAQ/E,IACPW,SAAWoE,EAAapE,QACrCgE,EAAmB/N,KAAKmO,IAExBJ,EAAmB/N,KAAKoJ,MAG5B,EAAKjR,SAAS,CAAE+Q,gBAAiB6E,KArLhB,EAwLnBf,OAAS,WACP,IAAMrN,EAAO,CACXoG,GAAI,EAAK7P,MAAMyJ,KAAKoG,GACpBlE,MAAO,EAAK3L,MAAMyJ,KAAKkC,OAErBJ,EAAU,CACZmC,QAAS,CACPJ,MAAO,EAAKrN,MAAMqN,MAClB8C,UAAW,EAAKnQ,MAAMmQ,UACtBuH,cAAe,EAAK1X,MAAM0X,cAC1BQ,SAAU,CACR9H,KAAM,EAAKpQ,MAAMoQ,MAEnB+H,YAAa,CACXC,UAAU,EACVC,KACoC,OAAlC,EAAKrY,MAAMoX,mBAAX,eACO,EAAKpX,MAAMoX,oBAAqB,GACnC,GACNkB,KACqC,OAAnC,EAAKtY,MAAMmX,oBAAX,eACO,EAAKnX,MAAMmX,qBAAsB,GACpC,KAGVoB,OAAQ,GACRC,YAIqC,iBAAnC,EAAKxY,MAAMmX,oBACP,EAAKnX,MAAMqX,qBACX,KACNoB,WACoC,gBAAlC,EAAKzY,MAAMoX,mBACP,EAAKpX,MAAMqX,qBACX,KACNC,gBAAiB,EAAKtX,MAAMsX,iBAE9B,EAAKtX,MAAM+S,gBAAgBC,SAAQ,SAAAC,GAAK,OAAI3H,EAAQiN,OAAO1O,KAAKoJ,MAChE,EAAKlT,MAAM2Y,cAAcpN,EAAS9B,GAClC,EAAKyE,QACL,EAAKlO,MAAMyV,QACXpV,QAAQC,IAAIiL,IAnOK,EAsOnBqN,mBAAqB,WACK,IAApB,EAAK3Y,MAAMsQ,OACb,EAAKrC,QACL,EAAKlO,MAAMyV,UAvOb,EAAKxV,MAAQ,CACXyX,YAAa,GACbnH,KAAM,EACNjD,MAAO,GACP8C,UAAW,GACXuH,cAAe,MACftH,KAAM,GACNmE,QAAS,EACTE,OAAQ,GACRC,WAAW,EACX2C,qBAAsB,EACtBF,oBAAqB,eACrBC,mBAAoB,cACpBE,gBAAiB,OACjBvE,gBAAiB,GACjBnL,OAAQ,CACNyF,MAAO,GACP8C,UAAW,GACXC,KAAM,KApBO,E,qDA6OT,IAAD,OACHrG,EACF,kBAAC,GAAD,CACE0F,eAAgB,SAAA1I,GAAI,OAAI,EAAKmJ,IAAI,cAAenJ,MAuFpD,MApF+B,QAA3B9E,KAAKjC,MAAMyX,YAEX1N,EADsB,IAApB9H,KAAKjC,MAAMsQ,KAEX,kBAAC,GAAD,CACEjD,MAAOpL,KAAKjC,MAAMqN,MAClB8C,UAAWlO,KAAKjC,MAAMmQ,UACtBC,KAAMnO,KAAKjC,MAAMoQ,KACjBxI,OAAQ3F,KAAKjC,MAAM4H,OACnB0I,KAAMrO,KAAKjC,MAAMsQ,KACjBJ,IAAKjO,KAAKiO,IACVF,SAAU,kBAAM,EAAKE,IAAI,OAAQ,IACjCG,aAAcpO,KAAKgM,MACnB8B,cAAe9N,KAAK8N,gBAGK,IAApB9N,KAAKjC,MAAMsQ,KAElB,kBAAC,GAAD,CACED,aAAc,kBAAM,EAAKH,IAAI,OAAQ,IACrCF,SAAU,kBAAM,EAAKE,IAAI,OAAQ,IACjC2G,OAAQ5U,KAAK4U,SAGY,IAApB5U,KAAKjC,MAAMsQ,KAElB,kBAAC,GAAD,CACED,aAAc,kBACZ,EAAKrO,SAAS,CACZsO,KAAM,EACNiE,QAAS,EACTE,OAAQ,GACRC,WAAW,EACX3B,gBAAiB,MAGrB/C,SAAU,kBAAM,EAAKE,IAAI,OAAQ,IACjCA,IAAKjO,KAAKiO,IACVqE,QAAStS,KAAKjC,MAAMuU,QACpBE,OAAQxS,KAAKjC,MAAMyU,OACnBC,UAAWzS,KAAKjC,MAAM0U,UACtB3B,gBAAiB9Q,KAAKjC,MAAM+S,gBAC5BW,oBAAqBzR,KAAKyR,oBAC1BD,iCACExR,KAAKwR,iCAEPkB,iBAAkB1S,KAAK4V,8BACvB5D,8BAA+BhS,KAAKgS,gCAKtC,kBAAC,GAAD,CACEoD,qBAAsBpV,KAAKjC,MAAMqX,qBACjCF,oBAAqBlV,KAAKjC,MAAMmX,oBAChCC,mBAAoBnV,KAAKjC,MAAMoX,mBAC/BE,gBAAiBrV,KAAKjC,MAAMsX,gBAC5BI,cAAezV,KAAKjC,MAAM0X,cAC1BrH,aAAc,kBAAM,EAAKH,IAAI,OAAQ,IACrC2G,OAAQ5U,KAAK4U,OACb3G,IAAKjO,KAAKiO,MAIoB,WAA3BjO,KAAKjC,MAAMyX,YACpB1N,EACE,kBAAC,GAAD,CACEsG,aAAcpO,KAAKgM,MACnBkH,cAAelT,KAAKlC,MAAMoV,cAC1BI,aAActT,KAAKlC,MAAMwV,aACzBtH,MAAOhM,KAAKgM,MACZuH,MAAOvT,KAAKlC,MAAMyV,QAGc,UAA3BvT,KAAKjC,MAAMyX,cACpB1N,EACE,kBAAC,GAAD,CACEsG,aAAcpO,KAAKgM,MACnBwI,aAAcxU,KAAKlC,MAAM0W,aACzBC,YAAazU,KAAKlC,MAAM2W,YACxBzI,MAAOhM,KAAKgM,MACZuH,MAAOvT,KAAKlC,MAAMyV,SAIpBvT,KAAKlC,MAAMgN,KAEX,6BACE,kBAAC,IAAD,CACE6L,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMgN,KACjB8L,eAAgB,kBAAM,EAAKF,sBAC3BlQ,UAAU,mBACVqQ,uBAAqB,GAEpB/O,IAKA,kC,GAvVoC5H,IAAMC,W,kDCmWxC2W,G,kDAjWb,WAAYhZ,GAAQ,IAAD,8BACjB,cAAMA,IA2DRyX,qBAAuB,SAACzQ,GACtB,IAAMa,EAAS,CAACyF,MAAM,GAAI8C,UAAU,GAAIC,KAAK,IACvC4I,EAAwB,aAAO,EAAKhZ,MAAM0W,aAC1CuC,EAAuB,EAAKjZ,MAAM0W,YAAY/F,WAAU,SAAClD,GAAD,OAAWA,EAAQmC,KAAK,EAAK7P,MAAMmZ,gBAAgBtJ,MAejH,OAdAoJ,EAAyBG,OAAOF,EAAsB,GACtDD,EAAyBhG,SAAQ,SAAAvF,GACpB,UAAP1G,GACE0G,EAAQJ,QAAU,EAAKrN,MAAMqN,QAC/BzF,EAAOyF,MAAQ,kCACZ,EAAKrN,MAAMqN,QACdzF,EAAOyF,MAAQ,+BAEbI,EAAQ0C,YAAc,EAAKnQ,MAAMmQ,YACnCvI,EAAOuI,UAAY,yCAChB,EAAKnQ,MAAMmQ,YACdvI,EAAOuI,UAAY,wCAGlBvI,GA9EU,EAoFnBwR,cAAgB,WACd,QAAI,EAAKpZ,MAAM4H,OAAOyF,SAElB,EAAKrN,MAAM4H,OAAOuI,WAvFL,EA+FnBtJ,cAAgB,SAACiJ,EAAOG,EAAUlJ,GAAU,IAAD,EACzC,EAAK/E,UAAL,mBAAgB+E,EAAOkJ,GAAvB,mDAA8C,EAAKjQ,MAAMqZ,SAAzD,kBAAmEtS,GAAM,KAAzE,IAAiF,WAC/E,EAAK/E,SAAS,CAAC4F,OAAQ,EAAK4P,qBAAqBzQ,SAjGlC,EAwGnBuS,yBAA2B,WAAyB,IAAxBC,EAAuB,wDACjD,EAAKxZ,MAAMyZ,YAAYD,GACvB,EAAKvX,SAAS,CAAEuX,kBA1GC,EAgHnBE,0BAA4B,WAA0B,IAAzBC,EAAwB,wDACnD,EAAK1X,SAAS,CAAE0X,mBAjHC,EAuHnBC,oBAAsB,SAAC7J,EAAOmI,GACxBnI,GAAOA,EAAM5I,iBACjB,IAAM0S,EAAY,EAAK7Z,MAAMmZ,gBAAgBtJ,GACvCnC,EAAU,CACdJ,MAAO,EAAKrN,MAAMqN,MAClB8C,UAAW,EAAKnQ,MAAMmQ,UACtB+H,SAAU,CACR9H,KAAM,EAAKpQ,MAAMoQ,OAGf5G,EAAO,CACXoG,GAAI,EAAK7P,MAAMyJ,KAAKoG,GACpBlE,MAAO,EAAK3L,MAAMyJ,KAAKkC,OAEzB,EAAK1J,SAAS,CAACqX,QAAQ,2BAAK,EAAKrZ,MAAMqZ,SAAjB,kBAA2BpB,GAAQ,MACzD,EAAKlY,MAAM8Z,cAAcD,EAAWnM,EAASjE,IAtI5B,EA2InBsQ,oBAAsB,WACpB,EAAK/Z,MAAMga,oBACX,EAAK/X,SAAS,CAACuX,cAAc,IAC7B,IAAMK,EAAY,EAAK7Z,MAAMmZ,gBAAgBtJ,GAC7C,EAAK7P,MAAMia,cAAcJ,EAAW,EAAK5Z,MAAMia,uBA/I9B,EAqJnBC,wBAA0B,WAA0B,IAAzBC,EAAwB,yDAE5CA,GAAiB,EAAKC,YACzB,EAAKpY,SAAS,CAAE0X,eAAe,KAE/B,EAAK1X,SAAS,CAAE0X,eAAe,IAC/B,EAAK3Z,MAAMga,sBA3JI,EAkKnBK,UAAY,WACV,OAAQ,EAAKpa,MAAMqZ,QAAQhM,OAAO,EAAKrN,MAAMqZ,QAAQlJ,WAAW,EAAKnQ,MAAMqZ,QAAQgB,KAAK,EAAKra,MAAMqZ,QAAQjJ,MAnK1F,EAyKnBkK,0BAA4B,SAACrC,GAAW,IAAD,EACrC,EAAKjW,UAAL,mBACGiW,EAAQ,EAAKlY,MAAMmZ,gBAAgBjB,IADtC,mDAEe,EAAKjY,MAAMqZ,SAF1B,kBAEoCpB,GAAQ,KAF5C,kDAGc,EAAKjY,MAAM4H,QAHzB,kBAGkCqQ,EAAQ,MAH1C,KA1KiB,EAoLnBsC,cAAgB,SAACtC,GACf,OAAI,EAAKjY,MAAMqZ,QAAQpB,GAEnB,yBAAKrS,MAAO,CAAC4U,MAAM,UACjB,kBAAC,IAAD,CACEzS,aAAW,SACXS,SAAO,EACPiS,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAACC,SAAS,OAAOgO,WAAW,OACnCnT,KAAK,SACLqG,KAAK,SACLwJ,SAAU,EAAK6I,gBACf1Q,QAAS,kBAAM,EAAKiR,oBAAoB,KAAM1B,MAEhD,kBAAC,IAAD,CACElQ,aAAW,SACX2S,WAAS,EACTD,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAACC,SAAS,OAAOgO,WAAW,OACnCnL,QAAS,kBAAM,EAAK4R,0BAA0BrC,OAK7C,IA1MT,EAAKjY,MAAQ,CACX0Z,eAAe,EACfH,cAAc,EACdU,sBAAsB,EACtBZ,QAAS,CACPhM,OAAO,EACP8C,WAAW,EACXC,MAAM,GAERxI,OAAQ,CACNyF,MAAO,GACP8C,UAAW,GACXC,KAAM,KAdO,E,sEAsBO9G,GACxB,GAAIA,EAAU4P,gBAAiB,CAC7B,IAAI7L,EAAQ/D,EAAU4P,gBAAgB7L,MAClC8C,EAAY7G,EAAU4P,gBAAgB/I,UACtCC,EAAO9G,EAAU4P,gBAAgBhB,SAAS9H,KAC1CnO,KAAKlC,MAAMmZ,iBAAmBjX,KAAKlC,MAAMmZ,gBAAgBtJ,KAAOtG,EAAU4P,gBAAgBtJ,IAExF3N,KAAKjC,MAAMqN,QAAUA,GAASpL,KAAKjC,MAAMqZ,QAAQhM,QAAOA,EAAQpL,KAAKjC,MAAMqN,OAC3EpL,KAAKjC,MAAMmQ,YAAcA,GAAalO,KAAKjC,MAAMqZ,QAAQlJ,YAAWA,EAAYlO,KAAKjC,MAAMmQ,WAC3FlO,KAAKjC,MAAMoQ,OAASA,GAAQnO,KAAKjC,MAAMqZ,QAAQjJ,OAAMA,EAAOnO,KAAKjC,MAAMoQ,OAG3EnO,KAAKD,SAAS,CACZqX,QAAS,CACPhM,OAAO,EACP8C,WAAW,EACXC,MAAM,KAIZnO,KAAKD,SAAS,CACZqL,MAAOA,EACP8C,UAAWA,EACXC,KAAMA,EACNxI,OAAQ,CACNyF,MAAO,GACP8C,UAAW,GACXC,KAAM,IAER8I,gBAAiB5P,EAAU4P,gBAC3BxC,YAAapN,EAAUoN,iB,+BA4JnB,IAAD,OACDwC,EAAkBjX,KAAKlC,MAAMmZ,gBACnC,IAAKA,EACH,OAAO,8BAET,IAAIyB,EACF,yBAAKlS,UAAU,oBACb,0BAAMT,SAAU,SAACf,GAAD,OAAK,EAAK0S,oBAAoB1S,EAAG,WAC/C,kBAAC,IAAD,CACEkB,kBAAkB,gBAClByS,oBAAkB,EAClBrY,MAAON,KAAKjC,MAAMqN,MAClBjF,UAAWnG,KAAKjC,MAAM4H,OAAOyF,MAC7BhF,eAAcpG,KAAKjC,MAAM4H,OAAOyF,MAAM5L,OAAO,EAC7CyG,SAAU,SAAC4H,EAAOG,GAAR,OAAqB,EAAKpJ,cAAciJ,EAAOG,EAAU,UACnE7J,mBAAoB,CAACjB,SAAU,GAAIM,MAAO,WAC1CwC,WAAW,EACXyH,SAAUzN,KAAKlC,MAAM2P,SACrBmL,WAAW,IAEZ5Y,KAAKsY,cAAc,UAEtB,0BAAMvS,SAAU,SAACf,GAAD,OAAK,EAAK0S,oBAAoB1S,EAAG,eAC/C,kBAAC,IAAD,CACEkB,kBAAkB,uBAClByS,oBAAkB,EAClBrY,MAAON,KAAKjC,MAAMmQ,UAClB/H,UAAWnG,KAAKjC,MAAM4H,OAAOuI,UAC7BjI,SAAU,SAAC4H,EAAOG,GAAR,OAAqB,EAAKpJ,cAAciJ,EAAOG,EAAU,cACnE7J,mBAAoB,CAACjB,SAAU,GAAIM,MAAO,WAC1CwC,WAAW,EACXyH,SAAUzN,KAAKlC,MAAM2P,WAEtBzN,KAAKsY,cAAc,cAEtB,0BAAMvS,SAAU,SAACf,GAAD,OAAK,EAAK0S,oBAAoB1S,EAAG,UAC/C,kBAAC,IAAD,CACEkB,kBAAkB,kBAClByS,oBAAkB,EAClBrY,MAAON,KAAKjC,MAAMoQ,KAClBhI,UAAWnG,KAAKjC,MAAM4H,OAAOwI,KAC7B/H,eAAcpG,KAAKjC,MAAM4H,OAAOwI,KAAK3O,OAAO,EAC5CyG,SAAU,SAAC4H,EAAOG,GAAR,OAAqB,EAAKpJ,cAAciJ,EAAOG,EAAU,SACnE7J,mBAAoB,CAACjB,SAAU,GAAIM,MAAO,WAC1CwC,WAAW,EACX2J,SAAS,MACTlC,SAAUzN,KAAKlC,MAAM2P,WAEtBzN,KAAKsY,cAAc,SAEtB,yBAAK9R,UAAU,QACb,6CADF,IAC4B,IAAIqS,KAAK5B,EAAgB6B,YAAYC,eAAe,SAAS,6BACvF,gDAFF,IAE+B,IAAIF,KAAK5B,EAAgB+B,YAAYD,eAAe,SAAS,+BAM1FE,EAAgB,CACpB,kBAAC,IAAD,CACE3S,MAAM,SACNC,SAAS,EACTE,QAAS,kBAAM,EAAK4Q,8BAEtB,kBAAC,IAAD,CACE/Q,MAAM,MACNC,SAAS,EACT2S,iBAAiB,EACjBzS,QAAS,kBAAM,EAAKoR,0BAIlBsB,EAAgB,CACpB,kBAAC,IAAD,CACE7S,MAAM,UACNC,SAAS,EACTE,QAAS,kBAAM,EAAK+Q,+BAEtB,kBAAC,IAAD,CACElR,MAAM,iBACNC,SAAS,EACT2S,iBAAiB,EACjBzS,QAAS,kBAAM,EAAKwR,yBAAwB,OAKhD,OACE,yBAAKtU,MAAO,CAACkH,QAAS,GAAK+B,KAAK,SAAS9G,aAAW,kCAElD,kBAAC,KAAD,CACEA,aAAW,cACXnC,MAAO,CAAC4U,MAAO,SACf9R,QAAS,kBAAM,EAAKwR,2BACpBxK,SAAUzN,KAAKlC,MAAM2P,UAErB,kBAAC,KAAD,OAICiL,EAEH,6BAEA,kBAAC,IAAD,CACEnS,SAAO,EACPD,MAAM,eACNG,QAAS,kBAAM,EAAK3I,MAAM6J,QAAQC,KAAnB,mBAAoC,EAAK9J,MAAMmZ,gBAAgBtJ,MAC9EhK,MAAO,CAACG,MAAM,MAAMyU,MAAM,OAAOtU,YAAY,MAC7CwJ,SAAUzN,KAAKlC,MAAM2P,WAEvB,kBAAC,IAAD,CACEnH,MAAM,iBACNG,QAAS,kBAAM,EAAK4Q,0BAAyB,IAC7C+B,WAAW,UACXzV,MAAO,CAACG,MAAM,OACd2J,SAAUzN,KAAKlC,MAAM2P,WAGvB,kBAAC,IAAD,CACErC,MAAM,gDACNiO,QAASJ,EACTtC,OAAO,EACP7L,KAAM9K,KAAKjC,MAAMuZ,aACjBV,eAAgB5W,KAAKqX,0BAEvB,kBAAC,KAAD,CACE/Q,MAAM,4DACNoL,QAAS1R,KAAKjC,MAAMia,qBACpBsB,QAAS,kBAAI,EAAKvZ,SAAS,CAACiY,sBAAuB,EAAKja,MAAMia,2BAIhE,kBAAC,IAAD,CACE5M,MAAM,wGACNiO,QAASF,EACTxC,OAAO,EACP7L,KAAM9K,KAAKjC,MAAM0Z,cACjBb,eAAgB5W,KAAKwX,iC,GA3VDtX,IAAMC,W,6ICNfoZ,G,4MAEnBxU,OAAS,WACqB,WAAxB,EAAKjH,MAAM0b,WACb,EAAK1b,MAAM2b,aAAa,EAAK3b,MAAM4b,KAAK/I,KAAI,SAACgJ,GAAD,OAAOA,EAAIhM,OAEvD,EAAK7P,MAAM8b,aAAa,EAAK9b,MAAM4b,KAAK/I,KAAI,SAACgJ,GAAD,OAAOA,EAAIhM,OAEzD,EAAK7P,MAAM+b,mBAAmB,K,uDAEtB,IAeJzO,EAAOrE,EAfJ,OACDsS,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,SACNC,SAAS,EACTE,QAAS,kBAAI,EAAK3I,MAAM+b,mBAAmB,OAE7C,kBAAC,IAAD,CACEvT,MAAO,QAAUtG,KAAKlC,MAAM0b,WAC5BN,iBAAiB,EACjBzS,QAASzG,KAAK+E,OACd+U,gBAAgB,UAChBV,WAAW,aAwBf,OApB6B,IAAzBpZ,KAAKlC,MAAMic,aACb3O,EAAQ,4BAA8BpL,KAAKlC,MAAM0b,WAAa,IAAMxZ,KAAKlC,MAAM4b,KAAK,GAAGpT,MAAQ,IAC1FtG,KAAKlC,MAAMkc,iBAA2C,SAAxBha,KAAKlC,MAAM0b,WAElCxZ,KAAKlC,MAAMkc,iBAA2C,WAAxBha,KAAKlC,MAAM0b,WAElB,WAAxBxZ,KAAKlC,MAAM0b,aACpBzS,EAAU,8EAFVA,EAAU,2GAFVA,EAAU,wFAQZqE,EAAQ,4BAA8BpL,KAAKlC,MAAM0b,WAAa,IAAMxZ,KAAKlC,MAAMic,YAAc,WACxF/Z,KAAKlC,MAAMkc,iBAA2C,SAAxBha,KAAKlC,MAAM0b,WAElCxZ,KAAKlC,MAAMkc,iBAA2C,WAAxBha,KAAKlC,MAAM0b,WAElB,WAAxBxZ,KAAKlC,MAAM0b,aACpBzS,EAAU,yFAFVA,EAAU,kHAFVA,EAAU,wFAQZ,6BACE,kBAAC,IAAD,CACEqE,MAAOA,EACPiO,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMgN,KACjB8L,eAAgB,kBAAI,EAAK9Y,MAAM+b,mBAAmB,MAEhD9S,Q,GAvDwC7G,IAAMC,W,qBC2K3C8Z,G,kDAzKb,WAAYnc,GAAQ,IAAD,8BACjB,cAAMA,IAYRoc,cAAgB,SAACC,GACf,IAAIC,EAAgBD,EAAS7a,MAAM,WAGnC,OAFA8a,EAAclD,QAAQ,IACtBkD,EAAgBA,EAAcC,KAAK,MACdC,eAjBJ,EAoBnBC,aAAe,SAACvV,GACdA,EAAEC,iBACF,IAAMuV,EAAwB,EAAKzc,MAAM0c,mBAAmBvL,QAAO,SAACwL,EAAK5E,GAAN,OAAU,EAAK/X,MAAM4c,mBAAmB7E,MACrG8E,EAAiB,EAAK7c,MAAM6c,eAAe/E,OAAO2E,GACxD,EAAK1c,MAAMoH,OAAO2V,aAAaD,GAE/B,EAAK7a,SAAS,CAAC6a,eAAe,GAAIE,iBAAkB,GAAIH,mBAAmB,GAAIF,mBAAmB,KAClG1L,SAASgM,eAAe,gBAAgBza,MAAM,IA3B7B,EA8BnB0a,YAAc,SAAChW,GACbA,EAAEC,iBACF,EAAKlF,SAAS,CAAC6a,eAAe,GAAIE,iBAAiB,GAAIH,mBAAmB,GAAIF,mBAAmB,KACjG1L,SAASgM,eAAe,gBAAgBza,MAAM,IAjC7B,EAoCnB2a,YAAc,SAACtH,GACb,IAAIuH,EAAe,SAASvB,GAC1B,OAAOA,EAAIrT,QAAQtG,KAAKma,SAAS,IAAIna,KAAKmb,eAExC5Q,EAAI,eACJ6Q,EAAY,SAASjB,EAAUkB,GACjC,OAAO,SAAUxN,GACf,IAAMyN,EAAeC,KAAOhR,EAAKxM,MAAMsd,GAAc,CAACG,MAAM,CAAC,CAACrB,WAAUrS,QAAQ9H,KAAKgU,WACrFzJ,EAAKxK,SAAL,eAAgBsb,EAAcC,MAGlC,EAAKvb,SAAS,CAAC6a,eAAgB,KAAK,WAGlC,IAFF,IAAID,EAAqB,GACrBG,EAAmB,GACZhF,EAAE,EAAGA,EAAEnC,EAAMnU,OAAQsW,IAAK,CACjC,IAAMrC,EAAOE,EAAMmC,GACbqE,EAAW,EAAKD,cAAcvG,EAAMmC,GAAGrX,MACvC0c,EAAgB1H,EAAK3O,KAAKxF,MAAM,WAAW4X,QAAQ,GACzD,GAAIzD,EAAKgI,KAAK,SAEZX,EAAiBlT,KAAKuS,OACjB,CACL,IAAMvG,EAAS,IAAIC,WAEnBD,EAAOM,cAAcT,GACjB,EAAK3V,MAAM4d,OAAOhN,UAAUwM,EAAc,CAACf,WAAUgB,mBAAiB,GAExER,EAAmB/S,MAAK,GACxBgM,EAAOG,UAAYqH,EAAUjB,EAAS,uBAGtCvG,EAAOG,UAAYqH,EAAUjB,EAAU,mBAIzCQ,EAAmBnb,OAAO,GAC5B,EAAKO,SAAS,CAAC4a,uBAEbG,EAAiBtb,OAAO,GAC1B,EAAKO,SAAS,CAAC+a,yBA3EF,EAgFnBa,eAAiB,SAACjH,GAChB,IAAIiG,EAAkB,aAAO,EAAK5c,MAAM4c,oBACxCA,EAAmBjG,IAAUiG,EAAmBjG,GAChD,EAAK3U,SAAS,CAAC4a,wBAjFf,EAAK5c,MAAQ,CACX6c,eAAgB,GAChBH,mBAAoB,GACpBE,mBAAoB,GACpBG,iBAAkB,IANH,E,qDAsFT,IAAD,OAEHc,EAAwB,KACxBC,EAAuB,KACvB1V,EAAY,GAsChB,OArCInG,KAAKjC,MAAM4c,mBAAmBnb,OAAO,IACvCoc,EAAwB,yBAAKjY,MAAO,CAACmY,SAAU,eAC7C,yBAAKnY,MAAO,CAACmJ,WAAW,UAAUjC,QAAQ,UACxC,uBAAGlH,MAAO,CAACH,MAAM,YAAjB,qBAAgDxD,KAAKjC,MAAM4c,mBAAmBnb,OAAO,EAAE,KAAK,IAA5F,gBACgBQ,KAAKjC,MAAM4c,mBAAmBnb,OAAO,EAAE,GAAG,IAD1D,6BAEGQ,KAAKjC,MAAM4c,mBAAmBnb,OAAO,EAAE,QAAQ,MAFlD,KAE2DQ,KAAKjC,MAAM4c,mBAAmBnb,OAAO,EAAE,QAAQ,MAF1G,sBAKIQ,KAAKjC,MAAM0c,mBAAmB9J,KAAI,SAAC8C,EAAKqC,GAAN,OAChC,kBAAC,KAAD,CACE3G,IAAK,WAAW2G,EAChBhQ,aAAY,UAAY2N,EAAK0G,SAC7B7T,MAAOmN,EAAK0G,SAAS3a,OAAO,GAAGiU,EAAK0G,SAAS4B,UAAU,EAAE,IAAI,MAAOtI,EAAK0G,SACzElX,WAAY,CAACO,MAAM,WACnBkO,QAAS,EAAK3T,MAAM4c,mBAAmB7E,GACvCrP,QAAS,kBAAI,EAAKkV,eAAe7F,YAO3C9V,KAAKjC,MAAM+c,iBAAiBtb,OAAO,IACrCqc,EAAuB,yBAAKlY,MAAO3D,KAAKjC,MAAM6d,sBAAsBpc,OAAO,EAAE,CAACsc,SAAU,aAAaE,UAAU,GAAG,CAACF,SAAU,eAC7H,yBAAKnY,MAAO,CAACmJ,WAAW,UAAUjC,QAAQ,UACxC,uBAAGlH,MAAO,CAACH,MAAM,YAAjB,qBAAgDxD,KAAKjC,MAAM+c,iBAAiBtb,OAAO,EAAE,QAAQ,MAA7F,gDACA,wBAAImE,MAAO,CAACH,MAAM,YACfxD,KAAKjC,MAAM+c,iBAAiBnK,KAAI,SAACwJ,GAAD,OAAY,wBAAIhL,IAAKgL,GAAWA,WAMlEyB,GAAyBC,IAAyB7b,KAAKjC,MAAM6c,eAAepb,OAAO,IACtF2G,EAAY,sCAAYnG,KAAKjC,MAAM6c,eAAepb,OAAO,EAAE,MAAM,KAArD,IAA4DQ,KAAKjC,MAAM6c,eAAepb,OAAtF,cAAyGQ,KAAKjC,MAAM6c,eAAepb,OAAO,EAAE,IAAI,GAAhJ,uBAGP,6BACL,yBAAKmE,MAAO,CAACmJ,WAAW,QAAQjC,QAAQ,oBACtC,2BACE8C,GAAG,eACH7I,KAAK,OACLqP,OAAO,iCACP1V,KAAK,eACLqH,aAAW,gBACXG,SAAU,SAAC4H,GAAD,OAAS,EAAKoN,YAAYpN,EAAMgB,OAAO8E,QACjDlN,QAAS,SAACoH,GAASA,EAAMgB,OAAOvO,MAAM,KAAM,EAAKP,SAAS,CAAC6a,eAAe,GAAIE,iBAAiB,GAAIH,mBAAmB,GAAIF,mBAAmB,MAC7IwB,UAAQ,EACRtY,MAAO,CAACG,MAAM,UAEhB,uBAAGH,MAAO,CAACT,SAAS,QAASM,MAAM,UAAWqO,YAAY,IAA1D,qBACoB,+DAGrB+J,EACAC,EACA1V,EACD,yBAAKxC,MAAO,CAAC6E,UAAU,QAAQnF,WAAW,KACxC,kBAAC,IAAD,eACEiL,SAA6C,IAAnCtO,KAAKjC,MAAM6c,eAAepb,QAAmD,IAAvCQ,KAAKjC,MAAM0c,mBAAmBjb,QAAiD,IAArCQ,KAAKjC,MAAM+c,iBAAiBtb,OACtH8G,MAAM,QACN7H,KAAK,QACLgI,QAAS,SAACzB,GAAD,OAAK,EAAKgW,YAAYhW,IAC/ByI,SAAUzN,KAAKlC,MAAM2P,UACjBhK,IANN,CAOEE,MAAK,2BAAMF,IAAUE,OAAhB,IAAuBM,YAAa,OAE3C,kBAAC,IAAD,eACEqC,MAAM,SACNgI,SAA6C,IAAnCtO,KAAKjC,MAAM6c,eAAepb,SAAoD,IAAvCQ,KAAKjC,MAAM4c,mBAAmBnb,QAAYQ,KAAKjC,MAAM4c,mBAAmBjM,WAAU,SAACwN,GAAD,OAAKA,KAAG,GAC3IzV,QAASzG,KAAKua,aACdhU,SAAO,GACH9C,Y,GApKatD,aC0SZgc,G,kDAhSb,WAAYre,GAAQ,IAAD,8BACjB,cAAMA,IA4BR+b,mBAAqB,SAACvZ,GACpB,EAAKP,SAAS,CAACqc,uBAAuB9b,IAClCA,EAAMd,OAAO,EACf,EAAK1B,MAAMyZ,aAAY,GAEvB,EAAKzZ,MAAMyZ,aAAY,IAlCR,EAsCnB8E,aAAe,WACb,EAAKtc,SAAS,CACZuc,YAAa3d,OAAOwE,WACpBoZ,UAA6B,GAAlB5d,OAAOwE,WAClBqZ,WAAY7d,OAAO8d,YAAY,IAC/BC,YAA+B,GAAlB/d,OAAOwE,WAAgB,OA3CrB,EA+CnBwZ,kBAAoB,SAAC3X,GACnBA,EAAEC,iBACF,EAAKlF,SAAS,CACZ6c,YAAY,EACZC,SAAU7X,EAAE8X,iBAnDG,EAsDnBC,kBAAoB,WAClB,EAAKhd,SAAS,CACZ6c,YAAY,KAxDG,EA2DnBI,mBAAqB,SAAC1c,EAAOqO,GAC3B,EAAK5O,SAAS,CACZmP,OAAQ,CAAC5O,QAAOqO,QAChBiO,YAAY,EACZK,eAAgB,EAAKnf,MAAM4d,OAAO/K,KAAI,SAACuM,GAAD,OAAS,QA/DhC,EAmEnBvB,eAAiB,SAACjH,GAChB,IAAIyI,EAAW/c,OAAOgd,OAAO,GAAI,EAAKrf,MAAMkf,gBAC5CE,EAASzI,IAAUyI,EAASzI,GAC5B,EAAK3U,SAAS,CAACkd,eAAgBE,IAAW,kBAAI,EAAKE,kBAtElC,EAyEnBC,aAAe,WAAwCC,GAAoB,IAAzDC,EAAwD,EAAxDA,YAAarO,EAA2C,EAA3CA,IAAKsO,EAAsC,EAAtCA,SAAU9Z,EAA4B,EAA5BA,MAE5C,GADc,EAAK5F,MAAM2f,YAAYD,EAASD,EACpCD,EAAe/d,OAAQ,CAC/B,IAAIma,EAAM4D,EAAe,EAAKxf,MAAM2f,YAAYD,EAASD,GACrDG,EAAc,EAAK7f,MAAM4d,OAAOhN,WAAU,SAACwO,GAAD,OAASA,EAAMvP,KAAKgM,EAAIhM,MACtE,OACE,yBACEwB,IAAKA,EACLxL,MAAK,2BAAMA,GAAN,IAAaia,SAAS,YAE3B,yBAAKja,MAAO,CAACX,OAAO,IAAI4a,SAAS,WAC/B,yBACEhT,IAAK+O,EAAIrT,MACTqE,IAAKgP,EAAIjO,IACT5H,MAA8B,GAAvB,EAAK/F,MAAMue,YAAiB,OAGrC,kBAAC,KAAD,CACExW,aAAY6T,EAAIrT,MAChBA,MAAOqT,EAAIrT,MACXoL,QAAS,EAAK3T,MAAMkf,eAAeU,GACnClX,QAAS,WAAK,EAAKkV,eAAegC,IAClC1a,WAAY,CAAC2a,SAAS,SAAWC,aAAc,WAAY/B,SAAS,aAAchY,MAA6B,GAAvB,EAAK/F,MAAMue,YAAiB,IAAK,SA/FlH,EAsGnBwB,gBAAkB,WAEhB,IADA,IAAIC,EAAI,GACCjI,EAAE,EAAGA,EAAE,EAAK/X,MAAMkf,eAAezd,OAAQsW,IAC5C,EAAK/X,MAAMkf,eAAenH,IAC5BiI,EAAInW,KAAK,EAAK9J,MAAM4d,OAAO5F,IAG/B,OAAOiI,GA7GU,EA+GnBC,WAAa,SAACrG,GACZ,OAAO,EAAK7Z,MAAMmgB,SAASzO,MAAK,SAAChE,GAAD,OAAWA,EAAQmC,KAAKgK,MAhHvC,EAsHnBuG,UAAY,SAACC,EAAOC,GAClB,OAAID,EAAM3e,QAAU4e,EAAM5e,OACjB2e,EAAMjP,QAAO,SAACmP,GAAO,OAAOD,EAAMpW,SAASqW,MAE3CD,EAAMlP,QAAO,SAACmP,GAAO,OAAOF,EAAMnW,SAASqW,OA1HnC,EA6HnBC,cAAgB,SAACC,GAEf,EAAKzgB,MAAMoH,OAAOsZ,WAAW,CAACD,EAAK5Q,IAAI,EAAKmQ,kBAAkBnN,KAAI,SAACgJ,GAAD,OAAOA,EAAIhM,QA/H5D,EAkInB8Q,iBAAmB,SAACF,EAAM7J,GAExB,EAAK5W,MAAMoH,OAAO0U,aAAa,CAAC2E,GAAM,EAAKT,kBAAkBnN,KAAI,SAACgJ,GAAD,OAAOA,EAAIhM,QApI3D,EAuInB+Q,UAAY,WACV,IAAIzB,EAAiB,GAEnBA,EAD8B,QAA5B,EAAKlf,MAAMmR,OAAO5O,MACH,EAAKxC,MAAM4d,OAAO/K,KAAI,kBAAI,KACN,YAA5B,EAAK5S,MAAMmR,OAAO5O,MACV,EAAKxC,MAAM4d,OAAO/K,KAAI,SAACgJ,GAAD,OAA+B,IAAxBA,EAAIgF,WAAWnf,UAG5C,EAAK1B,MAAM4d,OAAO/K,KAAI,SAACuM,GAAS,QAAIA,EAAMyB,WAAW3W,SAAS,EAAKjK,MAAMmR,OAAO5O,UAEnG,EAAKP,SAAS,CAACkd,oBA/If,EAAKlf,MAAQ,CACX2f,YAAa,EACbT,eAAgBnf,EAAM4d,OAAQ5d,EAAM4d,OAAO/K,KAAI,SAACuM,GAAD,OAAS,KAAO,GAC/DN,YAAY,EACZ1N,OAAQ,CAAC5O,MAAM,MAAOqO,KAAK,mBAC3ByN,uBAAwB,GACxBE,YAAa3d,OAAOwE,WACpBoZ,UAA6B,GAAlB5d,OAAOwE,WAClBqZ,WAAY7d,OAAO8d,YAAY,IAC/BC,YAA+B,GAAlB/d,OAAOwE,WAAgB,KAXrB,E,sEAeOkE,GACe,IAAnCrH,KAAKjC,MAAMkf,eAAezd,QAAY6H,EAAUqU,OAAOlc,SAASQ,KAAKlC,MAAM4d,OAAOlc,QACpFQ,KAAKD,SAAS,CAACkd,eAAe5V,EAAUqU,OAAO/K,KAAI,SAACuM,GAAD,OAAS,S,0CAK9Dve,OAAOigB,iBAAiB,SAAU5e,KAAKqc,gB,6CAIvC1d,OAAOkgB,oBAAoB,SAAU7e,KAAKqc,gB,+BA0HlC,IAAD,OACP,GAAIrc,KAAKlC,MAAM4d,OAAQ,CACrB,IAAI6B,EAAiBvd,KAAKlC,MAAM4d,OAC5B1b,KAAKjC,MAAMmR,OAAO5O,MAAM0H,SAAS,WACnCuV,EAAiBA,EAAerO,QAAO,SAACyK,GAAD,OAA+B,IAAxBA,EAAIgF,WAAWnf,UAC1B,QAA1BQ,KAAKjC,MAAMmR,OAAO5O,QAC3Bid,EAAiBA,EAAerO,QAAO,SAACyK,GAAD,OAAOA,EAAIgF,WAAW3W,SAAS,EAAKjK,MAAMmR,OAAO5O,WAI1F,IAAIwe,EAAY,6BAAK,kEACfC,EAAc/e,KAAKjC,MAAMkf,eAAe/N,QAAO,SAACgN,GAAD,OAAKA,KAAG1c,OACvDwf,EAAehf,KAAK8d,kBAC1B,GAAIiB,EAAY,EAAG,CACjB,IAAIE,EADa,EAIbC,EAAoBlf,KAAKlC,MAAMmgB,SAAStN,KAAI,SAACnF,GAAW,MAAO,CAACmC,GAAGnC,EAAQmC,GAAGvC,MAAMI,EAAQJ,UAC5F+T,EAAmBH,EAAa,GAAGL,WACnCS,EAA0B,GANb,eAODJ,GAPC,IAOjB,2BAA8B,CAAC,IAAtBrF,EAAqB,QAC5BwF,EAAmBnf,KAAKke,UAAUiB,EAAkBxF,EAAIgF,aARzC,8BAUjBQ,EAAiBpO,SAAQ,SAACpD,GAAD,OAAMyR,EAAwBxX,KAAK,CAAC+F,GAAGA,EAAIvC,MAAM,EAAK4S,WAAWrQ,GAAIvC,WAC9F6T,EAAc,6BACZ,4BAAKF,EAAY,EAAE,qBAAqB,YACxC,kBAAC,KAAD,CACEze,MAAO8e,EACPC,aAAc,SAACd,GAAD,OAAU,EAAKD,cAAcC,IAC3Ce,gBAAiB,SAACf,EAAM7J,GAAP,OAAiB,EAAK+J,iBAAiBF,EAAM7J,IAC9D7E,WAAYqP,EACZpP,iBAAkB,CAACnB,KAAK,QAASrO,MAAM,MACvCsP,aAAa,EACb5J,WAAS,EACT2J,SAAU,sBAGdmP,EAAY,6BACV,4BAAKC,EAAL,SAAwBA,EAAY,EAAE,IAAI,GAA1C,aACGE,EACD,kBAAC,IAAD,CACE3Y,MAAM,SACNG,QAAS,WAAK,EAAKoT,mBAAmB,WACtCC,gBAAgB,UAChBV,WAAW,UACXpT,WAAS,KAKjB,IAAMuZ,EAAc,6BAClB,6CACA,kBAAC,GAAD,CACE7D,OAAQ1b,KAAKlC,MAAM4d,OACnBxW,OAAQ,CACN2V,aAAc7a,KAAKlC,MAAMoH,OAAO2V,iBAKhC2E,EAAc,yBAAKhZ,UAAU,eACjC,6BACE,kBAAC,IAAD,eACEF,MAAOtG,KAAKjC,MAAMmR,OAAOP,KACzBlI,QAASzG,KAAK2c,kBACdnE,KAAM,kBAAC,KAAD,CAAY7U,MAAO,CAACX,OAAO,OAC7BS,MAEN,kBAAC,KAAD,CACEqH,KAAM9K,KAAKjC,MAAM6e,WACjBC,SAAU7c,KAAKjC,MAAM8e,SACrB4C,aAAc,CAACC,WAAY,OAAQC,SAAU,UAC7CC,aAAc,CAACF,WAAY,OAAQC,SAAU,OAC7C/I,eAAgB5W,KAAK+c,mBAErB,kBAAC,KAAD,KACE,kBAAC,KAAD,CAAUtW,QAAS,kBAAI,EAAKuW,mBAAmB,MAAO,oBAAoB6C,YAAY,oBACtF,kBAAC,KAAD,CAAUpZ,QAAS,kBAAI,EAAKuW,mBAAmB,UAAW,yBAAyB6C,YAAY,yBAC/F,kBAAC,KAAD,CACEA,YAAY,2BACZC,UAAW,kBAAC,KAAD,MACXvP,UAAWvQ,KAAKlC,MAAMmgB,SAAStN,KAAI,SAACnF,GAAD,OAAW,kBAAC,KAAD,CAAUqU,YAAarU,EAAQJ,MAAO3E,QAAS,kBAAI,EAAKuW,mBAAmBxR,EAAQmC,GAAInC,EAAQJ,kBAKrJ,6BACE,kBAAC,IAAD,CACE9E,MAAM,aACNG,QAASzG,KAAK0e,UACdzb,WAAYjD,KAAKjC,MAAMue,aAAa,IAAI,CAACpZ,SAAS,SAAS,GAC3DoL,UAA0D,IAAhDtO,KAAKjC,MAAMkf,eAAevO,WAAU,SAACwN,GAAD,OAAMA,OAEtD,kBAAC,IAAD,CACE5V,MAAM,kBACNG,QAAS,kBAAI,EAAK1G,SAAS,CAACkd,eAAe,EAAKnf,MAAM4d,OAAO/K,KAAI,SAACuM,GAAD,OAAS,QAC1Eja,WAAYjD,KAAKjC,MAAMue,aAAa,IAAI,CAACpZ,SAAS,SAAS,GAC3DoL,UAAyD,IAA/CtO,KAAKjC,MAAMkf,eAAevO,WAAU,SAACwN,GAAD,OAAKA,SAKzD,OAAO,6BACL,yBAAKvY,MAAO,CAACwO,QAAQ,OAAQ6J,UAAU,QACrC,yBAAKrY,MAAO,CAACkO,YAAY,QACtB2N,EACD,kBAAC,KAAD,iBACMjC,EACAvd,KAAKjC,MAAMkf,eACXjd,KAAKjC,MAAMwe,UAHjB,CAIEe,aAAc,SAACtT,GAAD,OAAQ,EAAKsT,aAAatT,EAAMuT,IAC9CG,YAAa1d,KAAKjC,MAAM2f,YACxBhB,YAAa1c,KAAKjC,MAAM2e,YACxB1Z,OAAQhD,KAAKjC,MAAMye,WACnBuD,SAAUxC,EAAe/d,OAAO,IAAI,EAAG+d,EAAe/d,OAAO,EAAIwgB,KAAKC,MAAM1C,EAAe/d,OAAO,GAAG,EACrG0gB,UAAW,IACXpc,MAAO9D,KAAKjC,MAAMwe,UAClB5O,GAAG,WAGP,yBAAKhK,MAAO,CAACiO,WAAW,MAAO/G,QAAQ,MAAMiC,WAAW,QAAShJ,MAA8B,IAAvB9D,KAAKjC,MAAMue,cAChFyC,EAAY,EAAED,EAAUS,IAG7B,kBAAC,GAAD,CACEzU,KAAM9K,KAAKjC,MAAMqe,uBAAuB5c,OAAO,EAC/Cqa,mBAAoB7Z,KAAK6Z,mBACzBJ,aAAczZ,KAAKlC,MAAMoH,OAAOuU,aAChCG,aAAc5Z,KAAKlC,MAAMoH,OAAO0U,aAChCF,KAAMsF,EAAarO,KAAI,SAACgJ,GAAO,MAAO,CAAChM,GAAGgM,EAAIhM,GAAIrH,MAAMqT,EAAIrT,UAC5DkT,WAAY,SACZO,YAAagF,EACb/E,iBAAiB,KAIrB,OAAO,kC,GA7RiB7Z,aCoBfggB,GA/BE,SAAC,GAA+E,IAA9EC,EAA6E,EAA7EA,kBAAmBC,EAA0D,EAA1DA,cAA0D,IAA3C5L,mBAA2C,MAA/B,GAA+B,EAA3B6L,EAA2B,EAA3BA,YAAa7S,EAAc,EAAdA,SAC1E8S,EAAW,CAACC,KAAM,UAAWC,MAAO,QAASC,IAAK,UAAWC,KAAM,UAAWC,OAAQ,WACtFC,EAAW,CAACL,KAAM,UAAWC,MAAO,OAAQC,IAAK,UAAWC,KAAM,UAAWC,OAAQ,WACrFE,EAAerM,EAAY9D,KAAI,SAACnF,EAASsK,GAC7C,OACE,4BACE3G,IAAK3D,EAAQmC,GACblH,QAAS,kBAAI4Z,EAAcvK,IAC3BiL,cAAe,kBAAIT,EAAY9U,EAAQmC,KACvCnH,UAAW4Z,IAAoB5U,EAAQmC,GAAI,WAAW,GACtDF,SAAUA,GAEV,yBAAK3H,aAAY,YAAc0F,EAAQJ,OAAQI,EAAQJ,OACvD,yBAAKtF,aAAY,kBAAoB,IAAI+S,KAAKrN,EAAQwN,YAAYD,eAAe,QAAS8H,IAAa,IAAIhI,KAAKrN,EAAQwN,YAAYD,eAAe,QAAQwH,QAIjK,OACE,yBAAK5S,GAAG,WAAW7H,aAAW,wBAC5BnC,MAAO,CAACmJ,WAAW,YAEnB,yBAAKtG,UAAU,SAASoG,KAAK,gBAC3B,yBAAKjJ,MAAO,CAACH,MAAO,YAApB,QACA,yBAAKG,MAAO,CAACH,MAAO,YAApB,kBAEF,6BACGsd,K,qBCZME,GAdO,SAACljB,GACrB,IAAM4M,EAAO,yBAAKC,IAAKsW,KAAYrW,IAAI,OAAOjH,MAAO,CAACkH,QAAS,KAC/D,OACE,kBAAC,IAAD,CACEC,KAAMhN,EAAME,QACZgN,aAAc,CAAClH,MAAO,IAAK+G,QAAS,EAAGE,OAAQ,MAC/CmW,UAAW,CAACrW,QAAS,EAAGE,OAAQ,MAChCoW,WAAY,CAACxd,MAAM,CAAC1C,aAAa,SACjC0C,MAAO,CAACoH,OAAQ,OAEfL,ICTD0W,G,uKACM,IAAD,OACD/H,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,aACNC,SAAS,EACT2S,iBAAiB,EACjBzS,QAAS,kBAAM,EAAK3I,MAAMujB,aAI9B,OACE,kBAAC,IAAD,CACEvW,KAAM9K,KAAKlC,MAAMwjB,YACjB3d,MAAO,CAAEoH,OAAQ,MACjBK,MAAM,SACNiO,QAASA,GAJX,yEAMyE,IACvE,6BAPF,uDAQsD,kC,GApB5BlZ,aAwCjB6M,gBAdS,SAAAjP,GACtB,MAAO,CACLujB,YAAavjB,EAAMN,OAAO6jB,gBAIH,SAAA/X,GACzB,MAAO,CACL8X,OAAQ,WACN9X,EAAS,CAAEzE,KAAM,uBAKRkI,CAA6CoU,I,qBChC7CG,GAVM,SAACzjB,GAClB,OACE,kBAAC,KAAD,CACEgN,OAAMhN,EAAMiJ,QACZA,QAASjJ,EAAMiJ,QACfya,iBAAkB,IAClBN,UAAWpjB,EAAMiJ,QAAQiB,SAAS,QAAS,CAAC8E,WAAY,WAAa,CAACA,WAAY,c,+DC+a3E2U,G,kDA5ab,WAAY3jB,GAAQ,IAAD,8BACjB,cAAMA,IAmDRyX,qBAAuB,WACrB,IAAM5P,EAAS,GA4Bf,IA1BI,EAAK5H,MAAMqZ,QAAQsK,iBAAmB,EAAK3jB,MAAM4jB,eAC9C,EAAK5jB,MAAM2jB,gBAGd/b,EAAO+b,gBAAkB,GAFzB/b,EAAO+b,gBAAkB,mCAItB,EAAK3jB,MAAM6jB,mBAEL,EAAK7jB,MAAM4jB,cAAgB,EAAK5jB,MAAM6jB,mBAC/Cjc,EAAOic,mBAAqB,oDAE5Bjc,EAAOic,mBAAqB,GAJ5Bjc,EAAOic,mBAAqB,4CAMzB,EAAK7jB,MAAM4jB,YAGdhc,EAAOgc,YAAc,GAFrBhc,EAAOgc,YAAc,gCAMrB,EAAK5jB,MAAMqZ,QAAQ3Y,OAAS,EAAKV,MAAMU,KACzCkH,EAAOlH,KAAO,uBAEdkH,EAAOlH,KAAO,GAGZ,EAAKV,MAAMqZ,QAAQhS,MAAO,CAEvB,EAAKrH,MAAMqH,MADP,2CAGMuD,KAAK,EAAK5K,MAAMqH,OAG7BO,EAAOP,MAAQ,GAFfO,EAAOP,MAAQ,wBAFfO,EAAOP,MAAQ,wBAOnB,OAAOO,GA3FU,EA8FnBwR,cAAgB,SAACrS,GACf,MAAkC,KAA1B,EAAK/G,MAAM4H,OAAOb,IA/FT,EAqGnBqT,UAAY,WACV,OAAQ,EAAKpa,MAAMqZ,QAAQ3Y,MAAQ,EAAKV,MAAMqZ,QAAQhS,OAAS,EAAKrH,MAAMqZ,QAAQsK,iBAAmB,EAAK3jB,MAAMqZ,QAAQuK,aAAe,EAAK5jB,MAAMqZ,QAAQwK,oBAtGzI,EAyGnBhd,cAAgB,SAACoJ,EAAUlJ,GAAU,IAAD,EAClC,EAAK/E,UAAL,mBAAgB+E,EAAOkJ,GAAvB,mDAA8C,EAAKjQ,MAAMqZ,SAAzD,kBAAmEtS,GAAM,KAAzE,IAAiF,WAC/E,EAAK/E,SAAS,CAAC4F,OAAO,2BAAK,EAAK5H,MAAM4H,QAAW,EAAK4P,8BA3GvC,EA+GnB8B,yBAA2B,WAAyB,IAAxBC,EAAuB,wDACjD,EAAKvX,SAAS,CAAEuX,kBAhHC,EAsHnBuK,uBAAyB,WAA0B,IAAzB3J,EAAwB,wDAE5C,EAAKC,cAAgBD,EACvB,EAAKnY,SAAS,CAAE0X,eAAe,IAG/B,EAAK1X,SAAS,CACZtB,KAAM,EAAKX,MAAMW,KACjB2G,MAAO,EAAKtH,MAAMsH,MAClBsc,gBAAiB,GACjBC,YAAa,GACbC,mBAAoB,GACpBjc,OAAQ,CACNlH,KAAM,GACN2G,MAAO,GACPuc,YAAa,GACbC,mBAAoB,GACpBF,gBAAiB,IAEnBtK,QAAS,CACP3Y,MAAM,EACN2G,OAAO,EACPuc,aAAa,EACbC,oBAAoB,EACpBF,iBAAiB,KAElB,kBAAM,EAAK5jB,MAAMgkB,wBAhJL,EAqJnBC,wBAA0B,WACxB,EAAKjkB,MAAMgkB,mBAAkB,GAC7B,EAAKhkB,MAAMikB,2BAvJM,EA0JnBvK,0BAA4B,WAA0B,IAAzBC,EAAwB,wDACnD,EAAK1X,SAAS,CAAE0X,mBA3JC,EAiKnBuK,mBAAqB,SAACld,GAmBZ,IAAD,EAlBI,oBAAPA,EACF,EAAK/E,SAAS,CACZ2hB,gBAAgB,GAChBC,YAAY,GACZC,mBAAmB,GACnBxK,QAAQ,2BACH,EAAKrZ,MAAMqZ,SADT,IAELsK,iBAAiB,EACjBC,aAAa,EACbC,oBAAoB,IAEtBjc,OAAO,2BACF,EAAK5H,MAAM4H,QADV,IAEJ+b,gBAAgB,GAChBC,YAAY,GACZC,mBAAmB,OAIvB,EAAK7hB,UAAL,mBACG+E,EAAO,EAAKhH,MAAMgH,IADrB,mDAGO,EAAK/G,MAAMqZ,SAHlB,kBAIKtS,GAAO,KAJZ,kDAOO,EAAK/G,MAAM4H,QAPlB,kBAQKb,EAAO,MARZ,KArLe,EAmMnBwT,cAAgB,SAACxT,GACf,OAAI,EAAK/G,MAAMqZ,QAAQtS,GAEnB,yBAAKnB,MAAO,CAAC4U,MAAM,UACjB,kBAAC,IAAD,CACEzS,aAAW,SACXS,SAAO,EACPiS,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAACC,SAAS,OAAOgO,WAAW,OACnCnT,KAAK,SACLqG,KAAK,SACLwJ,SAAiB,oBAAPxJ,EAA2B,EAAKqS,cAAc,oBAAoB,EAAKA,cAAc,gBAAgB,EAAKA,cAAc,sBAAyB,EAAKA,cAAcrS,GAC9K2B,QAAS,kBAAM,EAAKwb,iBAAiB,KAAMnd,MAE7C,kBAAC,IAAD,CACEgB,aAAW,SACX2S,WAAS,EACTD,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAACC,SAAS,OAAOgO,WAAW,OACnCnL,QAAS,kBAAM,EAAKub,mBAAmBld,OAKtC,IA3NQ,EA+NnBmd,iBAAmB,SAACpU,EAAO/I,GACrB+I,GAAOA,EAAM5I,iBACjB,IAAIid,EAAc,CAChB3a,KAAK,eACFzC,EAAO,EAAK/G,MAAM+G,KAGU,KAA7B,EAAK/G,MAAM2jB,kBACbQ,EAAc,CAAC3a,KAAM,CACnB4a,iBAAkB,EAAKpkB,MAAM2jB,gBAC7Brc,SAAU,EAAKtH,MAAM4jB,eAGzB,EAAK7jB,MAAMskB,wBAAwBF,GACnC,IAAIzW,EAAQ,GAEVA,EADS,aAAP3G,EACM,CAAC4c,iBAAiB,EAAOC,aAAa,EAAOC,oBAAoB,GAEpE,eAAK9c,GAAO,GAEnB,EAAK/E,SAAS,CAACqX,QAAQ,2BAAI,EAAKrZ,MAAMqZ,SAAY3L,KAAS,WAC9C,UAAP3G,GACF,EAAK/E,SAAS,CAACsiB,qBAAoB,QAnPvC,EAAKtkB,MAAQ,CACXU,KAAMX,EAAMW,KACZ2G,MAAOtH,EAAMsH,MACbid,qBAAqB,EACrBC,cAAc,EACdZ,gBAAiB,GACjBC,YAAa,GACbC,mBAAoB,GACpBjc,OAAQ,CACNlH,KAAM,GACN2G,MAAO,GACPuc,YAAa,GACbC,mBAAoB,GACpBF,gBAAiB,IAEnBtK,QAAS,CACP3Y,MAAM,EACN2G,OAAO,EACPuc,aAAa,EACbC,oBAAoB,EACpBF,iBAAiB,GAEnBpK,cAAc,EACdG,eAAe,GAzBA,E,sEA6BOpQ,GAAY,IAAD,OACnCrH,KAAKD,SAAS,CACZtB,KAAM4I,EAAU5I,KAChBkH,OAAO,2BACF3F,KAAKjC,MAAM4H,QADV,IAEJ+b,gBAAiBra,EAAUkb,qBAAqB9S,WAChDrK,MAAOiC,EAAUmb,gBAAgB/S,aAEnCiS,gBAAiB,GACjBC,YAAa,GACbC,mBAAoB,GACpBnK,eAAe,EACfgL,SAAS,IACR,WACG,EAAK1kB,MAAMskB,qBAAmD,KAA5B,EAAKtkB,MAAM4H,OAAOP,OACtD,EAAKrF,SAAS,CAACuiB,cAAa,EAAKD,qBAAoB,S,+BA8MjD,IAAD,OACDK,EAAqB,CACzB,kBAAC,IAAD,CACEpc,MAAM,QACNC,SAAO,EACP2S,iBAAiB,EACjBzS,QAAS,kBAAM,EAAKob,4BAEtB,kBAAC,IAAD,CACEvb,MAAM,iBACN8S,WAAW,UACX3S,QAAS,kBAAM,EAAK4Q,0BAAyB,IAC7C1T,MAAO,CAAC4U,MAAO,WAIbU,EAAgB,CACpB,kBAAC,IAAD,CACE3S,MAAM,SACNC,SAAO,EACP2S,iBAAe,EACfzS,QAAS,kBAAM,EAAK4Q,8BAEtB,kBAAC,IAAD,CACE/Q,MAAM,MACNC,SAAO,EACPE,QAAS,kBAAM,EAAKsb,8BAIlB5I,EAAgB,CACpB,kBAAC,IAAD,CACE7S,MAAM,UACNC,SAAO,EACPE,QAAS,kBAAM,EAAK+Q,+BAGtB,kBAAC,IAAD,CACElR,MAAM,iBACNC,SAAO,EACP2S,iBAAe,EACfzS,QAAS,kBAAM,EAAKob,wBAAuB,OAIzCc,EAAsB,CAC1B,kBAAC,IAAD,CACErc,MAAM,OACNC,SAAO,EACPE,QAAS,kBAAM,EAAK1G,SAAS,CAACuiB,cAAa,KAC3CpJ,iBAAe,KAIf0J,EACF,6BACE,0BAAM7c,SAAU,SAACf,GAAD,OAAK,EAAKid,iBAAiBjd,EAAG,UAC5C,kBAAC,IAAD,CACEiB,SAAU,SAACjB,EAAGH,GAAJ,OAAQ,EAAKD,cAAcC,EAAG,SACxCpG,KAAK,OACLyH,kBAAkB,OAClB/B,mBAAoB,CAACX,MAAM,WAC3B2C,UAAWnG,KAAKjC,MAAM4H,OAAOlH,KAC7B6B,MAAON,KAAKjC,MAAMU,KAClBuH,WAAS,IAEVhG,KAAKsY,cAAc,UAKtBuK,EACF,6BACE,0BAAM9c,SAAU,SAACf,GAAD,OAAK,EAAKid,iBAAiBjd,EAAG,WAC5C,kBAAC,IAAD,CACEiB,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKD,cAAcC,EAAG,UACvCpG,KAAK,QACLyH,kBAAkB,SAClB/B,mBAAoB,CAACX,MAAM,WAC3B2C,UAAWnG,KAAKjC,MAAM4H,OAAOP,MAC7B9E,MAAON,KAAKjC,MAAMqH,MAClBY,WAAS,IAEVhG,KAAKsY,cAAc,WAKtBjT,EACF,6BACE,0BAAMU,SAAU,SAACf,GAAD,OAAK,EAAKid,iBAAiBjd,EAAG,cAC5C,kBAAC,IAAD,eACEiB,SAAU,SAACjB,EAAGH,GAAJ,OAAQ,EAAKD,cAAcC,EAAG,oBACxCpG,KAAK,kBACLyH,kBAAkB,oBACd1B,EAJN,CAKE2B,UAAWnG,KAAKjC,MAAM4H,OAAO+b,gBAC7B5c,KAAK,WACLxE,MAAON,KAAKjC,MAAM2jB,gBAClB1b,WAAS,KAEX,kBAAC,IAAD,eACEC,SAAU,SAACjB,EAAGH,GAAJ,OAAQ,EAAKD,cAAcC,EAAG,gBACxCpG,KAAK,cACLyH,kBAAkB,gBACd1B,EAJN,CAKE2B,UAAWnG,KAAKjC,MAAM4H,OAAOgc,YAC7B7c,KAAK,WACLxE,MAAON,KAAKjC,MAAM4jB,YAClB3b,WAAS,KAEX,kBAAC,IAAD,eACEC,SAAU,SAACjB,EAAGH,GAAJ,OAAQ,EAAKD,cAAcC,EAAG,uBACxCpG,KAAK,qBACLyH,kBAAkB,wBACd1B,EAJN,CAKE2B,UAAWnG,KAAKjC,MAAM4H,OAAOic,mBAC7B9c,KAAK,WACLxE,MAAON,KAAKjC,MAAM6jB,mBAClB5b,WAAS,KAEVhG,KAAKsY,cAAc,qBAM1B,OACE,6BACE,kBAAC,IAAD,CACElN,MAAM,eACNiO,QAASqJ,EACT/L,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMglB,qBACjB9X,aAAc,CAACxC,UAAW,SAAUua,SAAU,KAC9ClM,uBAAuB,EACvBmM,WAAY,CAACxa,UAAU,WAGtBoa,EACD,6BACCC,EACD,6BACA,wBAAIlf,MAAO,CAACH,MAAM,UAAUyf,aAAa,EAAEza,UAAU,SAArD,wBACCnD,EAED,kBAAC,IAAD,CACE8J,IAAI,uBACJ/D,MAAM,wGACNiO,QAASF,EACTrO,KAAM9K,KAAKjC,MAAM0Z,cACjBb,eAAgB5W,KAAKwX,4BAEvB,kBAAC,IAAD,CACErI,IAAI,2BACJ/D,MAAM,gDACNiO,QAASJ,EACTnO,KAAM9K,KAAKjC,MAAMuZ,aACjBV,eAAgB5W,KAAKqX,4BAKzB,kBAAC,IAAD,CACEgC,QAASsJ,EACT7X,KAAM9K,KAAKjC,MAAMukB,aACjBtX,aAAc,CAACxC,UAAW,WAH5B,+DAME,6BANF,sF,GA9ZsBtI,IAAMC,WCqDrB+iB,G,kDAzDb,WAAYplB,GAAQ,IAAD,8BACjB,cAAMA,IACDC,MAAQ,CACXuC,MAAO,IAHQ,E,qDAOT,IAAD,OACP,OACE,yBAAKkG,UAAU,cACb,yBAAKA,UAAU,iBACb,kBAAC,IAAD,eACEV,aAAW,eACX6H,GAAG,kBACHgC,SAAS,mBACT1J,SAAU,SAACjB,EAAE1E,GAAS,EAAKP,SAAS,CAACO,UAAQ,EAAKxC,MAAMqlB,cAAcne,EAAE1E,IACxEqD,MAAOhF,OAAOwE,YAAY,IAAI,CAACyO,WAAW,GAAG3N,YAAY,GAAIH,MAAM,KAAK,CAAC8N,WAAW,GAAG3N,YAAY,GAAIH,MAAM,KAC7GxD,MAAON,KAAKjC,MAAMuC,OACdkE,EAPN,CAQEiJ,SAAUzN,KAAKlC,MAAM2P,aAGzB,yBAAKjH,UAAYxG,KAAKjC,MAAMuC,MAAMd,OAAO,EAAG,uBAAuB,iBACjE,kBAAC,KAAD,CACEsG,aAAW,qBACXQ,MAAM,QACNvC,UAAW,CAACE,YAAa,EAAGjB,OAAO,GAAIc,MAAM,IAC7CH,MAAO,CAACG,MAAO,GAAIgO,aAAc,EAAGK,QAAS,cAAejP,SAAS,IACrEwO,QAAS1R,KAAKlC,MAAMslB,YAAX,MACT3c,QAAS,kBAAI,EAAK3I,MAAMulB,aAAa,SAAU,EAAKvlB,MAAMslB,YAAX,QAC/C3V,SAAUzN,KAAKlC,MAAM2P,WAEvB,kBAAC,KAAD,CACE3H,aAAW,oBACXQ,MAAM,WACNvC,UAAW,CAACE,YAAa,EAAGjB,OAAO,GAAIc,MAAM,IAC7CH,MAAO,CAACG,MAAO,GAAIgO,aAAc,EAAGK,QAAS,cAAejP,SAAS,IACrEwO,QAAS1R,KAAKlC,MAAMslB,YAAX,KACT3c,QAAS,kBAAI,EAAK3I,MAAMulB,aAAa,QAAS,EAAKvlB,MAAMslB,YAAX,OAC9C3V,SAAUzN,KAAKlC,MAAM2P,WAEvB,kBAAC,KAAD,CACE3H,aAAW,2BACXQ,MAAM,cACNvC,UAAW,CAACE,YAAa,EAAGjB,OAAO,GAAIc,MAAM,IAC7CH,MAAO,CAACG,MAAO,GAAIgO,aAAc,EAAGK,QAAS,cAAejP,SAAS,IACrEwO,QAAS1R,KAAKlC,MAAMslB,YAAX,YACT3c,QAAS,kBAAI,EAAK3I,MAAMulB,aAAa,eAAgB,EAAKvlB,MAAMslB,YAAX,cACrD3V,SAAUzN,KAAKlC,MAAM2P,iB,GAlDPtN,a,oFCoBpBmjB,G,kDACJ,WAAYxlB,GAAQ,IAAD,8BACjB,cAAMA,IAuBRylB,iBAAmB,SAAA1V,IACZA,EAAM2V,SAAW3V,EAAM4V,UAA2B,SAAf5V,EAAM6V,KACxC,EAAK5lB,MAAM6lB,cAAcC,KAAKpkB,OAAS,GAAG,EAAK1B,MAAM8lB,QAC/C/V,EAAM2V,SAAW3V,EAAM4V,UAA2B,SAAf5V,EAAM6V,OACnD7V,EAAM5I,iBACF,EAAKnH,MAAM6lB,cAAcE,KAAKrkB,OAAS,GAAG,EAAK1B,MAAM+lB,SA7B1C,EAiCnBzB,wBAA0B,SAAA7a,GACxB,IAAMuc,EAAS,EAAKhmB,MAAMyJ,KAAKoG,GAC/B,EAAK7P,MAAMimB,cAAcxc,EAAMuc,IAnCd,EAsCnBhC,kBAAoB,WAAmC,IAAlCgB,EAAiC,wDACpD,EAAK/iB,SAAS,CAAE+iB,yBAChB,EAAKhlB,MAAMyZ,YAAYuL,IAxCN,EA2CnBf,wBAA0B,WACxB,IAAM+B,EAAS,EAAKhmB,MAAMyJ,KAAKoG,GAC/B,EAAK7P,MAAMkmB,cAAcF,IA7CR,EAgDnBG,iBAAmB,WACjB,EAAKnmB,MAAM0O,cAjDM,EAoDnB0X,OAAS,WACH,EAAKpmB,MAAM6J,QAAQ/I,SAAS0N,SAAStE,SAAS,aAChD,EAAKlK,MAAMqmB,4BAEX,EAAKrmB,MAAMsmB,qBACX,EAAKtmB,MAAM6J,QAAQC,KAAK,gBAvD1B,EAAK7J,MAAQ,CACX+kB,sBAAsB,GAHP,E,gEAOE,IAAD,OAClBnkB,OAAOigB,iBAAiB,UAAW5e,KAAKujB,kBAItCzkB,MAF0B,aAEPP,KAAnB,uCAAwB,WAAOQ,GAAP,eAAAU,EAAA,sEACHV,EAASC,OADN,OAChBgL,EADgB,OAEtB,EAAKjK,SAAS,CAAC0M,SAASzC,EAAK0C,mBAFP,2CAAxB,yD,6CASF/N,OAAOkgB,oBAAoB,UAAW7e,KAAKujB,oB,+BAwCnC,IAAD,OAEHc,EACA,kBAAC,KAAD,CACEC,kBACE,kBAAC,KAAD,CACE7W,SAAUzN,KAAKlC,MAAM2P,SACrB9J,MAAO,CAAEkH,QAAS,GAClBqH,QAAS,gBACTpM,aAAW,iBAEX,kBAAC,KAAD,CAAQtC,MAAM,UAAUsW,gBAAgB,WACtC,yBAAKyK,MAAM,6BAA6BzgB,MAAM,KAAKd,OAAO,KAAKgB,KAAK,eAC/DwC,UAAU,oBAAoBge,QAAQ,aACzC,0BAAMxU,EAAE,kFAKhB4P,aAAc,CAAEF,WAAY,QAASC,SAAU,OAC/CF,aAAc,CAAEC,WAAY,QAASC,SAAU,WAE/C,kBAAC,KAAD,CACEE,YAAY,eACZpZ,QAAS,kBAAM,EAAKqb,mBAAkB,MAExC,kBAAC,KAAD,CACEjC,YAAY,WACZpZ,QAAS,kBAAM,EAAKwd,uBAKxBQ,EAAgB,SAChBzkB,KAAKlC,MAAM4mB,cAAaD,GAAiB,gBAC7C,IAAIE,EAAmB,GAMvB,OALI3kB,KAAKlC,MAAMwe,YAAc,KAAOtc,KAAKlC,MAAM8mB,mBAC7CD,EAAmB,oBACV3kB,KAAKlC,MAAMwe,YAAc,MAClCqI,EAAmB,gBAGnB,yBACE/X,KAAK,SACL9G,aAAW,UACXU,UAAWie,EACX9gB,MAC0B,YAAxB3D,KAAKlC,MAAM+mB,SAAyB,CAAE1Z,KAAM,EAAGrH,MAAO,QAAW,IAGnE,4BACE0C,UAAU,OACV7C,MAAO,CAAEmhB,OAAQ,UAAWzgB,OAAQ,EAAGyI,WAAoC,YAAxB9M,KAAKjC,MAAM0O,SAAyBM,IAAM7L,QAAQC,aAAe4L,IAAM7L,QAAQG,eAClIoF,QAASzG,KAAKkkB,OACdpe,aAAW,mBACX2H,SAAUzN,KAAKlC,MAAM2P,UAGrB,yBAAK9C,IAAKkC,KAASjC,IAAI,mBAEzB,kBAAC,KAAD,CAASjH,MAAO,CAAEmJ,WAAY,YAC5B,kBAACiY,GAAA,aAAD,KAAe/kB,KAAKlC,MAAMmC,UAC1B,kBAAC8kB,GAAA,aAAD,KACG/kB,KAAKlC,MAAMknB,aACV,6BACE,kBAAC,KAAD,CACE9S,QAC2C,IAAzClS,KAAKlC,MAAM6lB,cAAcC,KAAKpkB,OAC1B,GACA,gBAENsG,aAAW,cACX2H,SAAUzN,KAAKlC,MAAM2P,SACrBa,SAAmD,IAAzCtO,KAAKlC,MAAM6lB,cAAcC,KAAKpkB,OACxCiH,QAAS,SAAAzB,GACPA,EAAEC,iBACF,EAAKnH,MAAM8lB,SAGb,kBAAC,KAAD,CAAMpgB,MAAO,aAEf,kBAAC,KAAD,CACE0O,QAC2C,IAAzClS,KAAKlC,MAAM6lB,cAAcE,KAAKrkB,OAC1B,GACA,gBAENsG,aAAW,cACX2H,SAAUzN,KAAKlC,MAAM2P,SACrBa,SAAmD,IAAzCtO,KAAKlC,MAAM6lB,cAAcE,KAAKrkB,OACxCiH,QAAS,SAAAzB,GACPA,EAAEC,iBACF,EAAKnH,MAAM+lB,SAGb,kBAAC,KAAD,CAAMrgB,MAAO,cAGf,KAEHxD,KAAKlC,MAAMmnB,sBACV,kBAAC,IAAD,CACE1e,SAAO,EACPD,MAAOqe,EACPle,QAAS,kBAAM,EAAK3I,MAAMonB,qBAC1B1M,KAAM,kBAAC,KAAD,CAAO7U,MAAO,CAAEX,OAAQ,MAC9BC,WAAU,2BACLQ,IAAUR,YADL,IAER4H,QACE7K,KAAKlC,MAAMwe,aAAe,KAAO,mBAAqB,KAE1D3Y,MAAK,2BAAOF,IAAUE,OAAjB,IAAwBM,YAAa,IAC1CwJ,SAAUzN,KAAKlC,MAAM2P,WAErB,KACHzN,KAAKlC,MAAMqnB,mBACV,yBACExhB,MAAO,CACLyhB,YAAa,oBACbtT,aAAc,SAGhB,kBAAC,KAAD,CACEI,QAAQ,SACRzL,QAAS,SAAAzB,GACPA,EAAEC,iBACF,EAAKnH,MAAMqnB,sBAEb1X,SAAUzN,KAAKlC,MAAM2P,UAErB,kBAAC,KAAD,CAAYjK,MAAO,cAGrB,KACHxD,KAAKlC,MAAMunB,YACV,kBAAC,GAAD,CACEC,MAAOtlB,KAAKlC,MAAMwnB,MAClBC,YAAavlB,KAAKlC,MAAMynB,YACxBpC,cAAenjB,KAAKlC,MAAMqlB,cAC1BE,aAAcrjB,KAAKlC,MAAMulB,aACzBD,YAAapjB,KAAKlC,MAAMslB,YACxB3V,SAAUzN,KAAKlC,MAAM2P,WAErB,KAEH4W,IAGL,kBAAC,GAAD,CACEvB,qBAAsB9iB,KAAKjC,MAAM+kB,qBACjCV,wBAAyBpiB,KAAKoiB,wBAC9B3jB,KAAMuB,KAAKlC,MAAMyJ,KAAK9I,KACtB2G,MAAOpF,KAAKlC,MAAMyJ,KAAKnC,MACvBmd,qBAAsBviB,KAAKlC,MAAMyJ,KAAK5B,OAAO4V,OAAO4G,iBACpDK,gBAAiBxiB,KAAKlC,MAAMyJ,KAAK5B,OAAO4V,OAAOnW,MAC/C0c,kBAAmB9hB,KAAK8hB,kBACxBC,wBAAyB/hB,KAAK+hB,+B,GA1NnB5hB,aA+PN6M,gBA/BS,SAAAjP,GACtB,MAAO,CACLwJ,KAAMxJ,EAAMwJ,KACZ+d,MAAOvnB,EAAMynB,OAAOF,MACpB3B,cAAe5lB,EAAM4J,YAIE,SAAA4B,GACzB,MAAO,CACLiD,WAAY,WACVjD,ErBnMG,CACLkC,MAAO,CAAC,aAAa,iBAAiB,iBACtC5B,QAAS,CACPR,QAAU,CACRqC,IAAI,WACJC,OAAQ,SACRhF,eAAgB,mCAChBc,aAAc,mCqB8LlBsc,cAAe,SAACxc,EAAMuc,GACpBva,ErB3JC,SAAuBhC,EAAMuc,GAClC,MAAO,CACLrY,MAAO,CAAC,eAAe,yBAAyB,yBAChD5B,QAAS,CACPR,QAAU,CACRqC,IAAI,UAAD,OAAYoY,GACfnY,OAAQ,MACR3B,KAAMzC,EACNZ,eAAgB,6CAChBc,aAAc,iCqBkJPsc,CAAcxc,EAAMuc,KAE/BE,cAAe,SAAAF,GACbva,ErB/IC,SAAuBua,GAC5B,MAAO,CACLrY,MAAO,CAAC,eAAe,yBAAyB,yBAChD5B,QAAS,CACPR,QAAU,CACRqC,IAAI,UAAD,OAAYoY,GACfnY,OAAQ,SACRhF,eAAgB,6CAChBc,aAAc,iCqBuIPuc,CAAcF,KAEzBF,KAAM,WACJra,EAAS,CAAEzE,KAAM,UAEnB+e,KAAM,WACJta,EAAS,CAAEzE,KAAM,UAEnBsf,mBAAoB,WAClB7a,EAAS,CAAEzE,KAAM,6BAKRkI,CAA6CsW,I,qBCzRrD,SAASmC,GAAY9N,GAA0C,IAA/B+N,EAA8B,uDAAhB,eACnD,MAAO,CACLja,MAAO,CAACia,EAAa,uBAAwB,uBAC7C7b,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,GAClBhM,OAAQ,MACRhF,eAAgB,GAChBc,aAAc,iCAuCf,SAASmQ,GAAcD,EAAWnM,GACvC,MAAO,CACLC,MAAO,CACL,0BACA,iCACA,iCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,GAClBhM,OAAQ,MACR3B,KAAM,CAAEwB,WACR7E,eAAgB,mCAChBc,aAAc,iC,ICjDhBke,G,kDACJ,WAAY7nB,GAAQ,IAAD,8BACjB,cAAMA,IAQR8nB,WAAa,SAAC9gB,GACC,aAATA,EACF,EAAK/E,SAAS,CAAE8lB,cAAc,IACZ,YAAT/gB,GACT,EAAK/E,SAAS,CAAE+lB,aAAa,KAbd,EAgBnBC,YAAc,SAACjhB,GACA,aAATA,EACF,EAAK/E,SAAS,CACZ8lB,cAAc,EACdza,MAAO,GACP4a,SAAU,KACW,YAATlhB,GACd,EAAK/E,SAAS,CAAE+lB,aAAa,IAE/B,EAAKhoB,MAAMyZ,aAAY,IAzBN,EA2BnBtR,SAAW,SAACnB,EAAMxE,GAChB,EAAKP,SAAL,eAAiB+E,EAAOxE,KA5BP,EA8BnByE,OAAS,WACP,IACIwG,EADAya,EAAW,EAAKjoB,MAAMioB,SAE1B,IACE,IACMhS,GADS,IAAIiS,MACGC,YACtB3a,EAAqB4a,KAAKC,UAAUpS,GACpC,MAAOhP,IACT,EAAKlH,MAAMwN,aAAa,EAAKvN,MAAMqN,MAAO4a,EAAUza,EAAoB,EAAKzN,MAAM6Z,WACnF,EAAKoO,YAAY,aArCjB,EAAKhoB,MAAQ,CACX8nB,cAAc,EACdC,aAAa,EACb1a,MAAO,GACP4a,SAAU,IANK,E,qDAyCT,IAAD,OACDK,EAAkB,CACtB,kBAAC,IAAD,CACE/f,MAAM,SACNC,SAAS,EACTE,QAAS,kBAAM,EAAKsf,YAAY,eAElC,kBAAC,IAAD,CACEzf,MAAM,SACNC,SAAS,EACT+H,SAAsC,IAA5BtO,KAAKjC,MAAMqN,MAAM5L,QAA+C,IAA/BQ,KAAKjC,MAAMioB,SAASxmB,OAC/DiH,QAAS,kBAAM,EAAK1B,aAGlBuhB,EAAiB,CACrB,kBAAC,IAAD,CACIhgB,MAAM,QACNC,SAAS,EACTE,QAAS,kBAAM,EAAKsf,YAAY,eAOtC,OACE,6BACE,yBAAKvf,UAAU,YACb,kBAAC,IAAD,CACEF,MAAM,WACNrD,WAAY,CAAEO,MAAO,WACrBiD,QAAS,WAAQ,EAAKmf,WAAW,YAAa,EAAK9nB,MAAMyZ,aAAY,IACrEuC,gBAAgB,0BAChBrM,SAAUzN,KAAKlC,MAAM2P,WAEvB,kBAAC,IAAD,CACInH,MAAM,QACNrD,WAAY,CAAEO,MAAO,WACrBiD,QAAS,WAAQ,EAAKmf,WAAW,WAAY,EAAK9nB,MAAMyZ,aAAY,IACpEuC,gBAAgB,0BAChBrM,SAAUzN,KAAKlC,MAAM2P,WAEzB,kBAAC,IAAD,CACInH,MAAM,OACNrD,WAAY,CAAEO,MAAO,WACrBiD,QAAS,kBAxBE,SAACiF,GACpB,IAAM6a,EAAY5nB,OAAOmM,KAAKY,EAAK,SAAU,uBACzC6a,IAAWA,EAAUC,OAAS,MAsBXC,CAAa,8BAC5B3M,gBAAgB,0BAChBrM,SAAUzN,KAAKlC,MAAM2P,YAG3B,kBAAC,IAAD,CACErC,MAAM,sBACNiO,QAASgN,EACT1P,OAAO,EACP7L,KAAM9K,KAAKjC,MAAM8nB,aACjBa,eAAe,iBACf1b,aAAc,CAAElH,MAAO,UAEvB,6DACA,6BACE,yBAAK6J,GAAG,gBAAgBnH,UAAU,SAAlC,SAGA,yBAAKA,UAAU,SACb,kBAAC,IAAD,CACE/H,KAAK,QACL6O,kBAAgB,gBAChBhN,MAAON,KAAKjC,MAAMqN,MAClBnF,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,QAASpB,IAC3C+T,WAAS,MAIf,6BACE,yBAAKjL,GAAG,kBAAkBnH,UAAU,SAApC,YAGA,yBAAKA,UAAU,SACb,8BACE/H,KAAK,WACL6O,kBAAgB,kBAChBhN,MAAON,KAAKjC,MAAMioB,SAClB/f,SAAU,SAACjB,GAAD,OAAO,EAAKiB,SAAS,WAAYjB,EAAE6J,OAAOvO,QACpD8T,KAAM,OAKd,kBAAC,IAAD,CACIhJ,MAAM,UACNiO,QAASiN,EACT3P,OAAO,EACP7L,KAAM9K,KAAKjC,MAAM+nB,YACjBY,eAAe,iBACf1b,aAAc,CAAElH,MAAO,WAEzB,qJAEc,uBAAG6iB,KAAK,uBAAuB9X,OAAO,UAAtC,WAFd,0IAOA,2EAC+C,uBAC3C8X,KAAK,2CAA2C9X,OAAO,UADZ,YAD/C,sNAOA,kCACM,uBAAG8X,KAAK,kDAAkD9X,OAAO,UAAjE,YADN,sNAImB,uBAAG8X,KAAK,qCAAqC9X,OAAO,UAApD,YAJnB,iGAQA,uT,GAhKa1O,aAmMR6M,gBAzBS,SAACjP,GACvB,MAAO,CACL+lB,OAAQ/lB,EAAMwJ,KAAKoG,GACnBgK,UAAW5Z,EAAMynB,OAAOha,QAAUzN,EAAMynB,OAAOha,QAAQmC,GAAK,SAIrC,SAACpE,GAC1B,MAAO,CACL+B,aAAc,SAACF,EAAOrE,EAASwE,EAAoBoM,GAC7CA,EACFpO,ED/BD,SAAqCoO,EAAWiP,GACrD,MAAO,CACLnb,MAAO,CAAC,aAAc,iBAAkB,iBACxC5B,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,EAAf,mBAAmCiP,GACtCjb,OAAQ,MACRhF,eAAgB,yCAChBc,aAAc,iCCuBLof,CAA4BlP,EAAW,SAC7CpZ,MAAK,SAAC2G,GACL,GAAoB,mBAAhBA,EAAOJ,KAA2B,CACpC,IAAM0G,EAAU2a,KAAKC,UAAUlhB,EAAO2E,SACtCN,EAAS+B,GAAaF,EAAOrE,EAASwE,EAAoBC,QAIhEjC,EAAS+B,GAAaF,EAAOrE,EAASwE,QAM/ByB,CAA6C2Y,I,SC9L7CmB,GAhBG,WAChB,IAAIhjB,EAAQ,IAMZ,OALInF,OAAOwE,YAAY,IACrBW,EAAQ,IACCnF,OAAOwE,YAAY,OAC5BW,EAAQ,KAEH,CACLijB,IAAK,CACHjjB,QACAd,OAAQ,GACRQ,MAAO,UACPN,SAAUvE,OAAOwE,YAAY,IAAI,OAAO,QCNvC,SAASqb,GAAWG,EAAYqI,GACnC,MAAO,CACHvb,MAAO,CAAC,uBAAuB,8BAA8B,6BAC7D5B,QAAS,CACLR,QAAU,CACNqC,IAAI,eACJ1B,KAAM,CAAC2U,aAAYqI,YACnBrb,OAAQ,MACRhF,eAAgBgY,EAAWnf,OAAO,EAAI,0DAA4D,yDAClGiI,aAAc,gCAGtBwf,YAAY,GASb,SAASrN,GAAa+E,EAAYqI,GACrC,MAAO,CACHvb,MAAO,CAAC,yBAAyB,gCAAgC,gCACjE5B,QAAS,CACLR,QAAU,CACNqC,IAAI,iBACJ1B,KAAM,CAAC2U,aAAYqI,YACnBrb,OAAQ,MACRhF,eAAgBgY,EAAWnf,OAAO,EAAI,4DAA8D,4DACpGiI,aAAc,gCAGtBwf,YAAY,GAQb,SAASxN,GAAauN,GACzB,MAAO,CACHvb,MAAO,CAAC,yBAAyB,gCAAgC,gCACjE5B,QAAS,CACLR,QAAU,CACNqC,IAAI,WACJC,OAAQ,SACR3B,KAAM,CAACgd,YACPrgB,eAAgBqgB,EAASxnB,OAAO,EAAE,2CAA2C,0CAC7EiI,aAAc,iCAUvB,SAASoT,GAAaa,EAAQ/D,GACjC,MAAO,CACHlM,MAAO,CAAC,eAAe,gCAAgC,gCACvD5B,QAAS,CACLR,QAAU,CACNqC,IAAI,UACJC,OAAQ,OACR3B,KAAM,CAAC2N,YAAW+D,UAClB/U,eAAgB+U,EAAOlc,OAAO,EAAG,6CAA+C,4CAChFiI,aAAc,iC,8CCrETyf,G,kDACnB,WAAYppB,GAAQ,IAAD,8BACjB,cAAMA,IAMRmX,aAAe,SAACnQ,EAAMxE,GACpB,EAAKP,SAAL,eAAgB+E,EAAOxE,KANvB,EAAKvC,MAAQ,CACX+M,KAAMhN,EAAMqpB,aAHG,E,qDAWT,IAAD,OACHC,EAAepnB,KAAKlC,MAAMupB,UAAU,CAACxc,QAAQ,GAAG,GACpD,OACE,yBAAKrE,UAAU,SACb,yBAAKA,UAAU,UACb,4BAAKxG,KAAKlC,MAAMsN,OAChB,kBAAC,KAAD,CACE3E,QAAS,SAACzB,GAAKA,EAAEC,iBAAkBD,EAAEsiB,kBAAmB,EAAKrS,aAAa,QAAS,EAAKlX,MAAM+M,OAC9FhF,aAAY9F,KAAKjC,MAAM+M,KAAK,QAAU9K,KAAKlC,MAAMsN,MAAQ,SAAY,UAAYpL,KAAKlC,MAAMsN,MAAQ,SACpGrH,UAAW,CAACP,MAAM,SAClB0O,QAASlS,KAAKjC,MAAM+M,KAAK,aAAa,eACtCnH,MAAO,CAACkH,QAAQ,EAAE/G,MAAM,UAAUd,OAAO,WACzCukB,gBAAgB,cAChB9Z,SAAUzN,KAAKlC,MAAM2P,UAEpBzN,KAAKjC,MAAM+M,KAAM,kBAAC,KAAD,MAAiB,kBAAC,KAAD,QAGvC,yBAAKtE,UAAWxG,KAAKjC,MAAM+M,KAAK,UAAU,iBAAkBnH,MAAOyjB,GAChEpnB,KAAKlC,MAAMmC,e,GA/BaE,a,0CC8B7BqnB,G,kDACF,WAAY1pB,GAAQ,IAAD,8BACf,cAAMA,IAqCVga,kBAAoB,WAChB,EAAK/X,SAAS,CAAE0nB,mBAAmB,EAAOxQ,gBAAiB,QAvC5C,EA0CnBqJ,YAAc,SAAA3I,GACV,EAAK7Z,MAAMsmB,qBACX,EAAKtmB,MAAM6J,QAAQC,KAAnB,mBAAoC+P,KA5CrB,EA+CnB+P,uBAAyB,SAAChT,GACtB,GAAIA,GAAS,EAAG,CACZ,IAAIlJ,EAAU,EAAK1N,MAAMmgB,SAASvJ,GAClC,EAAK3U,SAAS,CAAE0nB,mBAAmB,EAAMxQ,gBAAiBzL,MAlD/C,EAsDnBmc,yBAA2B,SAAC9Z,GACxBA,EAAM5I,iBACN,EAAKlF,SAAS,CAAE6nB,uBAAuB,EAAMC,gBAAiBha,EAAMiP,iBAxDrD,EA2DnBgL,6BAA+B,kBAAM,EAAK/nB,SAAS,CAAE6nB,uBAAuB,KA3DzD,EA6DnBG,4BAA8B,SAACznB,GAC3B,EAAKP,SAAS,CAAEioB,oBAAqB1nB,EAAOsnB,uBAAuB,KA9DpD,EAiEnBK,+BAAiC,SAAC3nB,GAC9B,EAAKP,SAAS,CAAEmoB,uBAAwB5nB,KAlEzB,EAqEnB6nB,oBAAsB,SAACne,GACnB,EAAKlM,MAAMoV,cAAclJ,GACpBzL,MAAK,SAAC2G,GACiB,2BAAhBA,EAAOJ,OACP,EAAK4iB,uBAAuB,GAC5B,EAAK5pB,MAAMsqB,6BA1ER,EA+EnBC,YAAc,WACV,OAAO,EAAKtqB,MAAMmqB,wBAA0B,EAAKnqB,MAAM8nB,cAAgB,EAAK9nB,MAAMiqB,qBAAuB,EAAKjqB,MAAM6pB,uBAAyB,EAAK7pB,MAAMuqB,uBAhFzI,EAmFnBC,kBAAoB,SAACD,GACjB,EAAKvoB,SAAS,CAAEuoB,2BAlFhB,EAAKvqB,MAAQ,CACT6pB,uBAAuB,EACvBI,qBAAqB,EACrB/Q,gBAAiB,KACjBwQ,mBAAmB,EACnBa,uBAAuB,EACvBzC,cAAc,EACdqC,wBAAwB,EACxBM,KAAM,cAVK,E,iEAefxoB,KAAKlC,MAAMyJ,KAAKG,cAAgB1H,KAAKlC,MAAM2qB,aAAazoB,KAAKlC,OAASkC,KAAKlC,MAAM6J,QAAQC,KAAK,O,gDAGxEP,GACS,KAA3BA,EAAU+E,eACN/E,EAAU4W,SAASze,QAAUQ,KAAKlC,MAAMmgB,SAASze,QAA8B,eAApBQ,KAAKjC,MAAMyqB,KACtExoB,KAAKD,SAAS,CACVkX,gBAAiB5P,EAAU4W,SAAS,GACpCwJ,mBAAmB,IAGvBznB,KAAKD,SAAS,CACVkX,gBAAiB,KACjBwQ,mBAAmB,O,2CAO1BznB,KAAKlC,MAAMyJ,KAAKG,eAAe1H,KAAKlC,MAAM6J,QAAQC,KAAK,O,+BAoDtD,IAAD,OACD8gB,EACA,yBAAK9b,KAAK,SAAS9G,aAAW,UAAUU,UAAU,uBAC9C,6BACA,6BACA,kBAAC,IAAD,eACIF,MAAM,MACNC,SAAO,EACP5C,MAAO,CAAEG,MAAO,MAAO8N,WAAY,QAC/BtO,EAJR,CAKImD,QAAS,kBAAM,EAAKshB,6BAA4B,IAChDta,SAAUzN,KAAKqoB,eAAiB,EAAI,EACpCviB,aAAW,0BAEf,6BACA,6BACA,6BACA,4BACIU,UAA+B,eAApBxG,KAAKjC,MAAMyqB,KAAwB,mBAAqB,YACnE/hB,QAAS,kBAAM,EAAK1G,SAAS,CACzByoB,KAAM,aACNf,kBAAkD,OAA/B,EAAK1pB,MAAMkZ,mBAElCxJ,SAAUzN,KAAKqoB,eAAiB,EAAI,EACpCviB,aAAW,cAPf,cAWA,4BACIU,UAA+B,UAApBxG,KAAKjC,MAAMyqB,KAAmB,mBAAqB,YAC9D/hB,QAAS,kBAAM,EAAK1G,SAAS,CAAEyoB,KAAM,QAASf,mBAAmB,KACjEha,SAAUzN,KAAKqoB,eAAiB,EAAI,EACpCviB,aAAW,qBAJf,qBAQA,kBAAC,GAAD,CACIsF,MAAM,UACN+b,aAAa,EACb1Z,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,GAExC,yBAAKle,UAAU,eACX,uBAAGmgB,KAAK,kCAAkC9X,OAAO,UAC7C,yBAAKlE,IAAKge,KAAQ/d,IAAI,gCAE1B,uBAAG+b,KAAK,mCAAmC9X,OAAO,UAC9C,yBAAKlE,IAAKie,KAAQhe,IAAI,wCAMtCie,EACA,kBAAC,KAAD,CACIC,eAAe,EACfhe,KAAM9K,KAAKjC,MAAM0pB,kBACjBsB,QAAQ,EACRjlB,MAAO,IACPklB,eAAgB,CAAE9d,IAAK,IACvB+d,OAAQ,GAER,kBAAC,GAAD,CACIhS,gBAAiBjX,KAAKjC,MAAMkZ,gBAC5Ba,kBAAmB9X,KAAK8X,kBACxBrD,YAAazU,KAAKlC,MAAMmgB,SACxBrG,cAAe5X,KAAKlC,MAAM8Z,cAC1BG,cAAe/X,KAAKlC,MAAMia,cAC1BxQ,KAAMvH,KAAKlC,MAAMyJ,KACjBI,QAAS3H,KAAKlC,MAAM6J,QACpB8F,SAAUzN,KAAKqoB,eAAiB,EAAI,EACpC9Q,YAAavX,KAAKioB,kCAK9B,OACI,6BACI,kBAAC,GAAD,CACItgB,QAAS3H,KAAKlC,MAAM6J,QACpB8F,SAAUzN,KAAKqoB,eAAiB,EAAI,EACpC9Q,YAAavX,KAAKuoB,kBAClB7D,YAAa1kB,KAAKqoB,cAClBlE,yBAA0B,kBAAM,EAAKpkB,SAAS,CAAEyoB,KAAM,gBACtDxD,aAAkC,UAApBhlB,KAAKjC,MAAMyqB,MAEzB,kBAACU,GAAA,KAAD,CAAMC,sBAAuB,CAAErP,gBAAiB,YAC5C,kBAAC,OAAD,CAAKrM,UAAW,EAAGnH,MAAM,YAAYvD,YAAa+jB,KAAcC,QAGvE2B,EACAG,EACD,kBAAC,GAAD,CACIpU,YAAazU,KAAKlC,MAAMmgB,SACxBnT,KAAM9K,KAAKjC,MAAMiqB,oBACjBzU,MAAO,kBAAM,EAAKwU,6BAA4B,IAC9CxgB,KAAMvH,KAAKlC,MAAMyJ,KACjBkP,cAAezW,KAAKlC,MAAM2Y,cAC1BvD,cAAelT,KAAKmoB,oBACpB7U,aAActT,KAAKlC,MAAMwV,aACzBkB,aAAcxU,KAAKlC,MAAM0W,eAE7B,yBAAK5H,KAAK,OACLpG,UAAWxG,KAAKjC,MAAM0pB,kBAAoB,sCAAwC,sBAC9D,eAApBznB,KAAKjC,MAAMyqB,KACX,kBAAC,GAAD,CACIpI,kBAAmBpgB,KAAKjC,MAAMkZ,gBAAkBjX,KAAKjC,MAAMkZ,gBAAgBtJ,GAAK,KAChF0S,cAAergB,KAAK0nB,uBACpBjT,YAAazU,KAAKlC,MAAMmgB,SACxBqC,YAAatgB,KAAKsgB,YAClB7S,SAAUzN,KAAKqoB,eAAiB,EAAI,IAGxC,kBAACe,GAAD,CACI1N,OAAQ1b,KAAKlC,MAAM4d,OACnBuC,SAAUje,KAAKlC,MAAMmgB,SACrB1G,YAAa,SAAC1S,GAAD,OAAO,EAAK9E,SAAS,CAAEmoB,uBAAwBrjB,KAC5DK,OAAQ,CACJ2V,aAAc7a,KAAKlC,MAAM+c,aACzB2D,WAAYxe,KAAKlC,MAAM0gB,WACvB5E,aAAc5Z,KAAKlC,MAAM8b,aACzBH,aAAczZ,KAAKlC,MAAM2b,iBAKtC,kBAAC,GAAD,CAAezb,QAASgC,KAAKlC,MAAME,UACnC,kBAAC,GAAD,MACA,kBAAC,EAAD,MACA,kBAAC,GAAD,CAAc+I,QAAS/G,KAAKlC,MAAMsO,eAClC,kBAAC,GAAD,CAAUqB,SAAUzN,KAAKqoB,eAAiB,EAAI,EACpC9Q,YAAa,SAAC1S,GAAD,OAAO,EAAK9E,SAAS,CAAE8lB,aAAchhB,Y,GA1NpD1E,aAqRT6M,gBArDS,SAACjP,GACrB,MAAO,CACHwJ,KAAMxJ,EAAMwJ,KACZ0W,SAAUlgB,EAAMsrB,UAAUpL,SAC1BvC,OAAQ3d,EAAMsrB,UAAU3N,OACxBpI,aAAcvV,EAAMsrB,UAAU/V,aAC9BtV,QAASD,EAAMN,OAAOO,QACtBoO,aAAcrO,EAAMN,OAAO2O,aAC3BuX,cAAe5lB,EAAM4J,YAIF,SAAC4B,GACxB,MAAO,CACHkN,cAAe,SAAC6S,GACZ/f,ELnPL,SAAuB+f,GAC5B,MAAO,CACL7d,MAAO,CAAC,eAAgB,yBAA0B,yBAClD5B,QAAS,CACPR,QAAS,CACPqC,IAAI,YACJC,OAAQ,OACR3B,KAAMsf,EACN3iB,eAAgB,mCAChBc,aAAc,iCK0ODgP,CAAc6S,KAE3B1R,cAAe,SAACD,EAAWnM,GACvBjC,EAASqO,GAAcD,EAAWnM,KAEtCuM,cAAe,SAACJ,EAAWK,GACvBzO,ELxML,SAAuBoO,EAAWK,GACvC,MAAO,CACLvM,MAAO,CACL,0BACA,iCACA,iCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,GAClBhM,OAAQ,SACR3B,KAAM,CAAEgO,wBACRrR,eAAgB,mCAChBc,aAAc,iCK2LDsQ,CAAcJ,EAAWK,KAEtCyQ,aAAc,SAAC3qB,GACXyL,ELvLH,CACLkC,MAAO,CAAC,aAAc,wBAAyB,wBAC/C5B,QAAS,CACPR,QAAS,CACPqC,IAAI,YACJC,OAAQ,MACRhF,eAAgB,GAChBc,aAAc,mCKkLdyL,cAAe,SAAClJ,GACZ,OAAOT,ELzKZ,SAAuBS,GAC5B,MAAO,CACLyB,MAAO,CAAC,eAAgB,yBAA0B,yBAClD5B,QAAS,CACPR,QAAS,CACPqC,IAAI,mBACJC,OAAQ,MACR3B,KAAMA,EACNrD,eAAgB,oCAChBc,aAAc,iCKgKMyL,CAAclJ,KAElCoe,sBAAuB,WACnB7e,EAAS,CAAEzE,KAAM,qCAErB0P,aAAc,SAACmD,GACXpO,ELhKL,SAAsBoO,GAC3B,MAAO,CACLlM,MAAO,CAAC,eAAgB,wBAAyB,wBACjD5B,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,EAAf,UACHhM,OAAQ,MACRhF,eAAgB,kCAChBc,aAAc,iCKwJD+M,CAAamD,KAE1BkD,aAAc,SAACa,GACXnS,EAASsR,GAAaa,KAE1B8C,WAAY,SAACG,EAAYqI,GACrBzd,EAASiV,GAAWG,EAAYqI,KAEpCpN,aAAc,SAAC+E,EAAYqI,GACvBzd,EAASqQ,GAAa+E,EAAYqI,KAEtCvN,aAAc,SAACuN,GACXzd,EAASkQ,GAAauN,KAE1B5C,mBAAoB,WAChB7a,EAAS,CAAEzE,KAAM,6BAKdkI,CAA6Cwa,I,SCtN7C+B,GAhGF,SAACzrB,GAAW,IAAD,EACd0rB,EAAwB1rB,EAAxB0rB,WAAYhe,EAAY1N,EAAZ0N,QADE,EAMlB1N,EAAM2rB,iBAHRC,EAHoB,EAGpBA,gBACAC,EAJoB,EAIpBA,QACAC,EALoB,EAKpBA,kBAEIC,EAAWH,EAAgBI,QAAQ9hB,SAASwhB,EAAW7b,IACvDoc,EAA0BJ,EAAQK,qBAClCC,EAAaN,EAAQO,MAAMliB,SAASwhB,EAAW7b,IAC/Cwc,EAAqBJ,EAAwB/hB,SAASwhB,EAAW7b,MAAQsc,EACzEG,EAAaT,EAAQS,WACrBC,EAAiBV,EAAQnE,OAE3B8E,EAAiB,GAdC,eAgBAV,EAAkBxT,MAhBlB,IAgBtB,2BAA8C,CAAC,IAAtCmU,EAAqC,QACxC/e,EAAQ0K,YAAYE,MAAQ5K,EAAQ0K,YAAYE,KAAKmU,EAAU9rB,OACjE6rB,EAAe1iB,KACb,yBACEpB,UAAWqjB,EAAS,mBAAmB,YACvC1a,IAAKqa,EAAW7b,GAAG4c,EAAU9rB,MAE7B,8BAAO8rB,EAAUC,YAAjB,KAJF,IAIyChB,EAAWe,EAAU9rB,SAvB9C,8BA6BtB,IAAIgsB,EAAkB,GAElBR,IAAeG,IACjBK,EAAe,YAAkB,WAG/BN,GAAsBC,GAAcC,IACtCI,EAAe,gBAAsB,UACrCA,EAAe,YAAkB,WAGnC,IAAMC,EAAiBlB,EAAW7b,GAAGrO,MAAM,KAAK,GAE5CqrB,EAAa,QACb7sB,EAAM8sB,cAAc9sB,EAAM0rB,WAAW7b,KAAIgd,GAAc,UACvDd,IAAUc,GAAc,WAE5B,IAAIE,EACF,yBACErkB,UAAWmkB,EACXvf,MAAK,mBAAcsf,EAAd,SACLjkB,QAAS,SAACoH,GAAW/P,EAAMgtB,kBAAkBtB,EAAY3b,GAAQA,EAAMyZ,mBACvE3jB,MAAK,eAAO8mB,GACZM,aAAc,kBAAIjtB,EAAMktB,gBAAgBxB,EAAW7b,KACnDsd,aAAc,kBAAIntB,EAAMktB,gBAAgB,QAEvCN,EAAeQ,OAAO,GACvB,2BACEplB,aAAY,QAAUhI,EAAMqtB,sBAAwB,IAAM3B,EAAW4B,WAAa,IAAM5B,EAAW6B,aACnG5sB,KAAM,UACNqG,KAAK,QACLwmB,WAAY,SAACtmB,GAAgB,MAARA,EAAEmK,KAAWrR,EAAMytB,kBAAkB/B,EAAYxkB,IACtEyB,QAAS,SAACzB,GAAKlH,EAAMytB,kBAAkB/B,EAAYxkB,GAAGA,EAAEsiB,mBACxD7Z,SAAU3P,EAAM2P,YA8BtB,OAzBI6c,EAAe9qB,OAAO,IACxBqrB,EACE,yBACErkB,UAAWmkB,EACXlkB,QAAS,SAACoH,GAAW/P,EAAMgtB,kBAAkBtB,EAAY3b,GAAQA,EAAMyZ,mBACvE3jB,MAAK,eAAO8mB,GACZM,aAAc,kBAAIjtB,EAAMktB,gBAAgBxB,EAAW7b,KACnDsd,aAAc,kBAAIntB,EAAMktB,gBAAgB,QAExC,yBAAKxkB,UAAU,QACZkkB,EACD,2BACE5kB,aAAY,QAAUhI,EAAMqtB,sBAAwB,IAAM3B,EAAW4B,WAAa,IAAM5B,EAAW6B,aACnG5sB,KAAM,UACNqG,KAAK,QACLwmB,WAAY,SAACtmB,GAAgB,MAARA,EAAEmK,KAAWrR,EAAMytB,kBAAkB/B,EAAYxkB,IACtEyB,QAAS,SAACzB,GAAKlH,EAAMytB,kBAAkB/B,EAAYxkB,GAAGA,EAAEsiB,mBACxD7Z,SAAU3P,EAAM2P,YAGnB6c,IAMLO,GCqDWW,GAjJF,SAAC1tB,GAAW,IAAD,EACd2tB,EAAwB3tB,EAAxB2tB,WAAYjgB,EAAY1N,EAAZ0N,QADE,EAOlB1N,EAAM2rB,iBAJRC,EAHoB,EAGpBA,gBACAC,EAJoB,EAIpBA,QACAC,EALoB,EAKpBA,kBACA8B,EANoB,EAMpBA,WAEI7B,EAAWH,EAAgBI,QAAQ9hB,SAASyjB,EAAW9d,IACvDsc,EAAaN,EAAQgC,MAAM3jB,SAASyjB,EAAW9d,IAE/Cwc,GAD0BR,EAAQiC,qBAAuBjC,EAAQkC,sBACpB7jB,SAASyjB,EAAW9d,MAAQsc,EACzEG,EAAaT,EAAQS,WACrBC,EAAiBV,EAAQnE,OAC3BsG,EAAiB,GACjBC,GAAuB,EAfL,eAkBInC,EAAkBxT,MAlBtB,IAkBtB,2BAAkD,CAAC,IAC7C4V,EAD4C,QACdvtB,KAClC,GAAI+M,EAAQ0K,YAAYE,MAAQ5K,EAAQ0K,YAAYE,KAAK4V,GAAgB,CACvED,GAAuB,EACvB,QAtBkB,mDA2BInC,EAAkBvT,MA3BtB,IA2BtB,2BAAkD,CAAC,IAA1C4V,EAAyC,QAC5CD,EAAgBC,EAAcxtB,KAClC,GAAI+M,EAAQ0K,YAAYG,MAAQ7K,EAAQ0K,YAAYG,KAAK2V,GAAgB,CACvE,IAAIE,EAAW,aACXrC,IAAUqC,GAAY,WACN,iBAAhBF,EACFF,EAAelkB,KACb,yBAAKpB,UAAW0lB,EAAU/c,IAAK,WAAa8c,EAAczB,aACxD,6BACE,8BAAOyB,EAAczB,cACgC,IAApD1sB,EAAMquB,QAAQC,QAAQX,EAAWO,IAAjC,eAAgEluB,EAAMquB,QAAQC,QAAQX,EAAWO,IAAgB,GAAM,UAK9HF,EAAelkB,KACb,yBAAKpB,UAAW0lB,EAAU/c,IAAK,WAAa8c,EAAczB,aACxD,6BACE,8BAAOyB,EAAczB,aACpBiB,EAAWO,QA9CF,8BAwDtB,IASIK,EATAC,EAAkB,GAClBrC,IAAeG,IACjBkC,EAAe,YAAkB,WAE/BnC,GAAsBC,GAAcC,IACtCiC,EAAe,gBAAsB,UACrCA,EAAe,YAAkB,WAInC,IAAIC,EAAgB,aAChBR,IACFQ,EAAgB,eAElB,IAAMC,EAAY1uB,EAAM2uB,OAAOhB,EAAWiB,SACpCC,EAAY7uB,EAAM8uB,OAAOnB,EAAWoB,SAC1CR,EACE,yBAAK7lB,UAAW+lB,GACd,kBAAC,GAAD,CACEpd,IAAKqd,EAAU7e,GACf6b,WAAYgD,EACZrB,sBAAuBrtB,EAAMquB,QAAQC,QAAQI,EAAUM,UAAU,EACjErD,iBAAkB3rB,EAAM2rB,iBACxBqB,kBAAmBhtB,EAAMgtB,kBACzBE,gBAAiBltB,EAAMktB,gBACvBJ,YAAa9sB,EAAM8sB,YACnBW,kBAAmBztB,EAAMytB,kBACzB9d,SAAU3P,EAAM2P,SAChBjC,QAAS1N,EAAM0N,UAEjB,kBAAC,GAAD,CACE2D,IAAKwd,EAAUhf,GACf6b,WAAYmD,EACZxB,sBAAuBrtB,EAAMquB,QAAQC,QAAQO,EAAUG,UAAY,EACnErD,iBAAkB3rB,EAAM2rB,iBACxBqB,kBAAmBhtB,EAAMgtB,kBACzBE,gBAAiBltB,EAAMktB,gBACvBJ,YAAa9sB,EAAM8sB,YACnBW,kBAAmBztB,EAAMytB,kBACzB9d,SAAU3P,EAAM2P,SAChBjC,QAAS1N,EAAM0N,WAMrB,IAAIuhB,EAAe,eACflD,IAAUkD,GAAgB,WAC1BjvB,EAAM8sB,cAAgBa,EAAW9d,KAAIof,GAAgB,SAEzD,IAAIC,EAAiB,yBACLxmB,UAAWklB,EAAWza,OAAOjJ,SAASyjB,EAAW9d,IAAK,sBAAwB,iBAE9E,yBAAKnH,UAAU,iBACb,yBACEA,UAAWumB,EACXtmB,QAAS,SAACoH,GAAW/P,EAAMgtB,kBAAkBW,EAAY5d,GAAOA,EAAMyZ,mBACtE3jB,MAAK,eAAO2oB,GACZvB,aAAc,kBAAIjtB,EAAMktB,gBAAgBS,EAAW9d,KACnDsd,aAAc,kBAAIntB,EAAMktB,gBAAgB,QAExC,yBAAKxkB,UAAU,YAAf,QACQ1I,EAAMmvB,gBACZ,2BACEnnB,aAAY,QAAUhI,EAAMmvB,gBAC5BxuB,KAAM,UACNqG,KAAK,QACLwmB,WAAY,SAACtmB,GAAgB,MAARA,EAAEmK,KAAWrR,EAAMytB,kBAAkBE,EAAYzmB,IACtEyB,QAAS,SAACzB,GAAKlH,EAAMytB,kBAAkBE,EAAYzmB,GAAGA,EAAEsiB,mBACxD7Z,SAAU3P,EAAM2P,YAGnBqe,EAAetsB,OAAO,EACvB,yBAAKgH,UAAU,kBACZslB,GAEF,IAEFO,IAOnB,OAHKpC,GAAcG,GAAcC,IAAmBF,IAClD6C,EAAgB,+BAGhBA,GC3IiBE,G,kDACnB,WAAYpvB,GAAQ,IAAD,8BACjB,cAAMA,IAMRmX,aAAe,SAACnQ,EAAMxE,GACpB,EAAKP,SAAL,eAAgB+E,EAAMxE,KARL,EAWnB6sB,eAAiB,SAACnB,GAChB,OAAO,EAAKluB,MAAM2rB,iBAAiBG,kBAAkB5Y,MAAMxB,MAAK,SAACkL,GAAD,OAAQA,EAAKjc,OAAOutB,MAVpF,EAAKjuB,MAAQ,CACX+M,MAAM,GAHS,E,qDAeT,IAAD,OAED+e,EAAW7pB,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAAQ9hB,SAAShI,KAAKlC,MAAMsvB,YAAYzf,IAC/Fsc,EAAajqB,KAAKlC,MAAM2rB,iBAAiBE,QAAQ0D,OAAOrlB,SAAShI,KAAKlC,MAAMsvB,YAAYzf,IAExFwc,GAD2BnqB,KAAKlC,MAAM2rB,iBAAiBE,QAAQ2D,sBAAwBttB,KAAKlC,MAAM2rB,iBAAiBE,QAAQ4D,sBAAwBvtB,KAAKlC,MAAM2rB,iBAAiBE,QAAQ6D,uBACzIxlB,SAAShI,KAAKlC,MAAMsvB,YAAYzf,MAAQsc,EACtFG,EAAapqB,KAAKlC,MAAM2rB,iBAAiBE,QAAQS,WACjDC,EAAiBrqB,KAAKlC,MAAM2rB,iBAAiBE,QAAQnE,OAEvDiI,EAAe,GACnBztB,KAAKlC,MAAMsvB,YAAYM,UAAU3c,SAAQ,SAAC4c,EAAUjZ,GAClD,GAAyB,MAArBiZ,EAASzC,OAAO,GAAS,CACzB,IAAI0C,EAAe,EAAK9vB,MAAM0N,QAAQmgB,MAAMgC,GAC5CF,EAAa7lB,KACX,kBAAC,GAAD,CACEuH,IAAKye,EAAajgB,GAClB8d,WAAYmC,EACZX,gBAAiB,EAAKnvB,MAAM0N,QAAQ2gB,QAAQC,QAAQwB,EAAajgB,IAAM,EACvE8e,OAAQ,EAAK3uB,MAAM0N,QAAQihB,OAC3BG,OAAQ,EAAK9uB,MAAM0N,QAAQohB,OAC3BnD,iBAAkB,EAAK3rB,MAAM2rB,iBAC7BqB,kBAAmB,EAAKhtB,MAAMgtB,kBAC9BE,gBAAiB,EAAKltB,MAAMktB,gBAC5BJ,YAAa,EAAK9sB,MAAM8sB,YACxBW,kBAAmB,EAAKztB,MAAMytB,kBAC9B9d,SAAU,EAAK3P,MAAM2P,SACrB0e,QAAS,EAAKruB,MAAMquB,QACpB3gB,QAAS,EAAK1N,MAAM0N,eAGnB,CACL,IAAIqiB,EAAiB,EAAK/vB,MAAM0N,QAAQ6hB,OAAOM,GAC/CF,EAAa7lB,KACX,kBAACslB,EAAD,CACE/d,IAAK0e,EAAclgB,GACnByf,YAAaS,EACbC,iBAAkB,EAAKhwB,MAAM0N,QAAQuiB,SAAS3B,QAAQyB,EAAclgB,IAAM,EAC1EnC,QAAS,EAAK1N,MAAM0N,QACpBie,iBAAkB,EAAK3rB,MAAM2rB,iBAC7BqB,kBAAmB,EAAKhtB,MAAMgtB,kBAC9BF,YAAa,EAAK9sB,MAAM8sB,YACxBoD,aAAc,EAAKlwB,MAAMkwB,aACzBC,iBAAkB,EAAKnwB,MAAMmwB,iBAC7BjD,gBAAiB,EAAKltB,MAAMktB,gBAC5BO,kBAAmB,EAAKztB,MAAMytB,kBAC9B9d,SAAU,EAAK3P,MAAM2P,SACrB0e,QAAS,EAAKruB,MAAMquB,eAM9B,IAAI+B,EAAa,GACjB,GAAIluB,KAAKlC,MAAM0N,QAAQ0K,YAAYlF,MACjC,cAA0B5Q,OAAO9B,KAAK0B,KAAKlC,MAAM0N,QAAQ0K,YAAYlF,OAArE,eAA6E,CAAxE,IAAIgb,EAAa,KACpB,GAAIhsB,KAAKlC,MAAM0N,QAAQ0K,YAAYlF,MAAMgb,GAAgB,CACvD,IAAMtR,EAAO1a,KAAKmtB,eAAenB,GACjCkC,EAAWtmB,KACT,yBAAKpB,UAAWqjB,EAAU,mBAAqB,YAAa1a,IAAK,YAAY6c,GAC3E,6BACE,8BAAOtR,EAAK8P,aACXxqB,KAAKlC,MAAMsvB,YAAYpB,OAQpC,IAAImC,EAAmB,GACnBlE,IAAeG,IACjB+D,EAAgB,YAAkB,WAEhChE,GAAsBC,GAAcC,IACtC8D,EAAgB,gBAAsB,UACtCA,EAAgB,YAAkB,WAEpC,IAAIC,EAAwB,kBACxBpuB,KAAKlC,MAAM2rB,iBAAiBiC,WAAWpV,OAAOtO,SAAShI,KAAKlC,MAAMsvB,YAAYzf,MAAKygB,GAAyB,UAC5GvE,IAAUuE,GAAyB,WACV,OAAzBpuB,KAAKlC,MAAM8sB,aAAsB5qB,KAAKlC,MAAMkwB,eAAiBhuB,KAAKlC,MAAMsvB,YAAYzf,KAAIygB,GAAyB,UAErH,IAAIC,EAAkB,yBACE7nB,UAAW4nB,EACXzqB,MAAOwqB,EACPpD,aAAc,kBAAI,EAAKjtB,MAAMmwB,iBAAiB,EAAKnwB,MAAMsvB,YAAYzf,KACrEsd,aAAc,kBAAI,EAAKntB,MAAMmwB,iBAAiB,OAC9CxnB,QAAS,SAACoH,GAAD,OAAU,EAAK/P,MAAMgtB,kBAAkB,EAAKhtB,MAAMsvB,YAAavf,KAEtE,yBAAKrH,UAAW,uBACd,yBAAKA,UAAU,gBACb,yBAAKA,UAAU,YAAf,SACSxG,KAAKlC,MAAMgwB,iBAClB,2BACEhoB,aAAY,SAAW9F,KAAKlC,MAAMgwB,iBAClCrvB,KAAM,UACNqG,KAAK,QACLwmB,WAAY,SAACtmB,GAAgB,MAARA,EAAEmK,KAAW,EAAKrR,MAAMytB,kBAAkB,EAAKztB,MAAMsvB,YAAapoB,IACvFyB,QAAS,SAACzB,GAAK,EAAKlH,MAAMytB,kBAAkB,EAAKztB,MAAMsvB,YAAapoB,IACpEyI,SAAUzN,KAAKlC,MAAM2P,YAGxBygB,GAEH,yBAAK1nB,UAAU,gBACb,kBAAC,KAAD,CACEC,QAAS,SAACzB,GAAKA,EAAEsiB,kBAAkBtiB,EAAEC,iBAAiB,EAAKgQ,aAAa,QAAS,EAAKlX,MAAM+M,OAC5FhF,aAAY9F,KAAKjC,MAAM+M,KAAK,kBAAoB9K,KAAKlC,MAAMgwB,iBAAmB,gBAAkB9tB,KAAKlC,MAAMgwB,iBAC3GrgB,SAAUzN,KAAKlC,MAAM2P,SACrByE,QAASlS,KAAKjC,MAAM+M,KAAK,iBAAmB,gBAE3C9K,KAAKjC,MAAM+M,KAAM,kBAAC,KAAD,MAAiB,kBAAC,KAAD,SAI3C,yBAAKtE,UAAWxG,KAAKjC,MAAM+M,KAAM,eAAiB,uBAC/C2iB,IAOzB,OAHKxD,GAAcG,GAAcC,IAAmBF,IAClDkE,EAAiB,+BAGjBA,M,GA5I2BnuB,IAAMC,WCDpBmuB,G,kDACnB,WAAYxwB,GAAQ,IAAD,8BACjB,cAAMA,IAORmwB,iBAAmB,SAACtgB,GAClB,IAAI4gB,EAAU,GAGZA,EAFO,OAAL5gB,EAEQ4N,KAAO,EAAKxd,MAAMiwB,aAAc,CAACxS,MAAO,CAAC7N,KAGzC4N,KAAO,EAAKxd,MAAMiwB,aAAc,CAACQ,QAAS,CAAC,CAAC,EAAKzwB,MAAMiwB,aAAaxuB,OAAO,EAAG,MAE1F,EAAKO,SAAS,CAACiuB,aAAcO,KAjBZ,EAoBnBvD,gBAAkB,SAACrd,GACjB,EAAK5N,SAAS,CAAC6qB,YAAajd,EAAIqgB,aAAc,CAAC,EAAKjwB,MAAMiwB,aAAa,EAAKjwB,MAAMiwB,aAAaxuB,OAAO,OAnBtG,EAAKzB,MAAQ,CACXiwB,aAAc,GACdpD,YAAa,MAJE,E,qDAyBjB,IADO,EACH6D,EAAmB,GADhB,eAEazuB,KAAKlC,MAAM0N,QAAQuiB,UAFhC,IAEP,2BAAgD,CAAC,IAAxCW,EAAuC,QACxC1d,EAAQhR,KAAKlC,MAAM0N,QAAQ6hB,OAAOqB,GAChB,IAApB1d,EAAM2d,WACRF,EAAiB7mB,KACf,kBAAC,GAAD,CACEuH,IAAK6B,EAAMrD,GACXyf,YAAapc,EACb8c,iBAAkB9tB,KAAKlC,MAAM0N,QAAQuiB,SAAS3B,QAAQpb,EAAMrD,IAAI,EAChEnC,QAASxL,KAAKlC,MAAM0N,QACpBie,iBAAkBzpB,KAAKlC,MAAM2rB,iBAC7BqB,kBAAmB9qB,KAAKlC,MAAMgtB,kBAC9BmD,iBAAkBjuB,KAAKiuB,iBACvBjD,gBAAiBhrB,KAAKgrB,gBACtBgD,aAAchuB,KAAKjC,MAAMiwB,aAAaxuB,OAAO,EAAGQ,KAAKjC,MAAMiwB,aAAahuB,KAAKjC,MAAMiwB,aAAaxuB,OAAO,GAAK,KAC5GorB,YAAa5qB,KAAKjC,MAAM6sB,YACxBW,kBAAmBvrB,KAAKlC,MAAMytB,kBAC9B9d,SAAUzN,KAAKlC,MAAM2P,SACrB0e,QAASnsB,KAAKlC,MAAMquB,YAnBrB,8BAwBP,IAAIyC,GAAe,EAKnB,OAH0B,IADE5uB,KAAKlC,MAAM2rB,iBAAiBE,QAAQ0D,OAAO7tB,OAASQ,KAAKlC,MAAM2rB,iBAAiBE,QAAQgC,MAAMnsB,OAASQ,KAAKlC,MAAM2rB,iBAAiBE,QAAQO,MAAM1qB,OAASQ,KAAKlC,MAAM2rB,iBAAiBE,QAAQkF,MAAMrvB,SAE9NovB,EAAuB5uB,KAAKlC,MAAM2rB,iBAAiBE,QAAQS,YAAcpqB,KAAKlC,MAAM2rB,iBAAiBE,QAAQnE,QAG7G,6BACGoJ,EAAe,0DAAsCH,O,GAxDrBvuB,IAAMC,W,mBCynB/C,SAAS2uB,GAAUC,GACjB/uB,KAAKgvB,QAAUD,EAAKC,QACpBhvB,KAAK6uB,MAAQE,EAAKF,MAClB7uB,KAAKmsB,QAAU4C,EAAK5C,QACpBnsB,KAAKqW,KAAO0Y,EAAK1Y,KACjBrW,KAAKivB,MAAQF,EAAKE,MAClBjvB,KAAKkvB,MAAQH,EAAKG,MAClBlvB,KAAKmvB,MAAQJ,EAAK5C,QAAQC,QAAQ2C,EAAK1Y,KAAK1I,IAAM,EAClD3N,KAAKovB,YAAcL,EAAKhB,SAAS3B,QAAQpsB,KAAKqW,KAAKyW,UAAY,EAC/D9sB,KAAKqvB,aACwB,OAA3BrvB,KAAKqW,KAAKgZ,aACN,OACArvB,KAAKmsB,QAAQC,QAAQpsB,KAAKqW,KAAKgZ,cAAgB,EACrDrvB,KAAKsvB,OAAS,KACdtvB,KAAKuvB,OAASR,EAAKQ,OACnBvvB,KAAKwvB,YAAcT,EAAKS,YACxBxvB,KAAK8D,MAAQ9D,KAAKwvB,YAA2B,IAAbT,EAAKjrB,MAA4B,IAAbirB,EAAKjrB,MACzD9D,KAAKe,QAAUguB,EAAKhuB,QACpBf,KAAKyvB,EAAIV,EAAKU,EACdzvB,KAAK0vB,YAAcX,EAAKW,YACxB1vB,KAAK2vB,YAAcZ,EAAKY,YACxB3vB,KAAK4vB,kBAAoBb,EAAKa,kBAC9B5vB,KAAK6vB,uBAAyBd,EAAKc,uBACnC7vB,KAAK8vB,kBAAoBf,EAAKe,kBAC9B9vB,KAAK+vB,iBAAmBhB,EAAKgB,iBAC7B/vB,KAAKgwB,UAAY,IAAIC,KAAMC,KAC3BlwB,KAAKmwB,gBAAkB,IAAIF,KAAMC,KACjClwB,KAAKowB,KAAO,IAAIH,KAAMC,KACtBlwB,KAAK6pB,SAAWkF,EAAKlF,SACrB7pB,KAAK8qB,kBAAoBiE,EAAKjE,kBAC9B9qB,KAAKqwB,WAAatB,EAAKsB,WACvBrwB,KAAKswB,WAAa,IAAIL,KAAM/C,MAC5BltB,KAAKuwB,UAAY,IAAIN,KAAM/C,MAC3BltB,KAAKwwB,eAAiBzB,EAAKyB,eAC3BxwB,KAAKyV,cAAgBsZ,EAAKtZ,cAE1BzV,KAAKywB,cAAgB,IAAIR,KAAMS,UAAU,CACvCC,MAAO,CAAC3wB,KAAK8D,MAAO9D,KAAKyvB,EAAI,GAC7B3nB,QAAS,IAAM9H,KAAKmvB,MACpByB,UAAW5wB,KAAK2vB,YAChBzsB,SAAyB,IAAflD,KAAKe,UAEjBf,KAAK6wB,UAAY,IAAIZ,KAAMS,UAAU,CACnCC,MAAO,CAAC3wB,KAAK8D,MAAQ9D,KAAKe,QAASf,KAAKyvB,EAAI,GAC5CmB,UAAW5wB,KAAK2vB,YAChBzsB,SAAyB,IAAflD,KAAKe,UAEjBf,KAAK8wB,UAAY,IAAIb,KAAMS,UAAU,CACnCC,MAAO,CAAC3wB,KAAK8D,MAAQ9D,KAAKe,QAASf,KAAKyvB,EAAmB,IAAfzvB,KAAKe,QAAiB,GAClE6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAyB,IAAflD,KAAKe,UAGjBf,KAAK+wB,kBAAoBhC,EAAKgC,kBAEP,UAAnB/wB,KAAKqW,KAAKvR,KACZ9E,KAAKowB,KAAKT,YAAcZ,EAAKgB,iBACD,YAAnB/vB,KAAKqW,KAAKvR,KACnB9E,KAAKowB,KAAKT,YAAc,UAExB3vB,KAAKowB,KAAKT,YAAcZ,EAAKY,YAER,YAAnB3vB,KAAKqW,KAAKvR,OAEZ9E,KAAKowB,KAAKY,UAAY,CAAC,GAAI,KAEN,aAAnBhxB,KAAKqW,KAAKvR,OACZ9E,KAAKowB,KAAKT,YAAc,WAEtB3vB,KAAK6pB,WACP7pB,KAAKowB,KAAKT,YAAcZ,EAAKa,mBAE/B5vB,KAAKowB,KAAKV,YAAc1vB,KAAK0vB,YACF,cAAvB1vB,KAAKqW,KAAK4a,SACZjxB,KAAKowB,KAAKV,YAAsC,IAAxB1vB,KAAKowB,KAAKV,YACF,UAAvB1vB,KAAKqW,KAAK4a,WACnBjxB,KAAKowB,KAAKV,YAAsC,GAAxB1vB,KAAKowB,KAAKV,aAzsBtCZ,GAAUoC,UAAY,CACpBC,YAAarC,GACbsC,KAAM,WAAa,IAAD,OAIhBpxB,KAAKqxB,YAEL,IAAIC,EACFtxB,KAAKqwB,WAAa,EACd,GAAKrwB,KAAKsvB,OAAStvB,KAAKe,QAAUf,KAAKqwB,WACvCrwB,KAAKsvB,OAAStvB,KAAKe,QAAUf,KAAKqwB,WACpCkB,EAAKvxB,KAAK8D,MAOd,GANA9D,KAAKowB,KAAKoB,IAAI,IAAIvB,KAAMwB,MAAMH,EAAItxB,KAAKyvB,IAChB,OAAnBzvB,KAAKqW,KAAKqb,OACZH,EAAkB,IAAbvxB,KAAK8D,MAAewtB,GAE3BtxB,KAAKowB,KAAKoB,IAAI,IAAIvB,KAAMwB,MAAMF,EAAIvxB,KAAKyvB,IAEnCzvB,KAAK2xB,cAAe,CACtB,IAAIC,EAAW5xB,KAAK6xB,iBAAiB7xB,KAAKqvB,cAC1CrvB,KAAKowB,KAAK0B,OACR,EACA,IAAI7B,KAAMwB,MAAMzxB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAG0V,IAGnD5xB,KAAKgyB,UAELhyB,KAAKowB,KAAK3xB,KAAO,QAAUuB,KAAKmvB,MAGhCnvB,KAAKgwB,UAAYhwB,KAAKowB,KAAK6B,QAC3BjyB,KAAKgwB,UAAUgB,UAAY,CAAC,EAAG,GAC/BhxB,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAChElc,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAAI,EACzC,SAA3Blc,KAAKqW,KAAKgZ,eACZrvB,KAAKgwB,UAAU+B,SAAS,GAAGpB,MAAMzU,EAC/Blc,KAAKgwB,UAAU+B,SAAS,GAAGpB,MAAMzU,EAAI,GAEzClc,KAAKgwB,UAAUL,YAAc3vB,KAAK4vB,kBAClC5vB,KAAKgwB,UAAUN,YAAsC,EAAxB1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUvxB,KAAO,QAAUuB,KAAKmvB,MAAQ,aAC7CnvB,KAAKgwB,UAAUmC,YAAYnyB,KAAKowB,MAE5BpwB,KAAK6pB,WACP7pB,KAAKgwB,UAAUkC,QAAU,IACzBlyB,KAAKgwB,UAAUN,YAAsC,EAAxB1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUL,YAAc,WAG/B3vB,KAAKmwB,gBAAkBnwB,KAAKowB,KAAK6B,QACjCjyB,KAAKmwB,gBAAgBa,UAAY,CAAC,EAAG,GACrChxB,KAAKmwB,gBAAgB4B,SACnB/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAS,GACvCmxB,MAAMzU,EACNlc,KAAKmwB,gBAAgB4B,SAAS/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAS,GAClEmxB,MAAMzU,EAAI,EACgB,SAA3Blc,KAAKqW,KAAKgZ,eACZrvB,KAAKmwB,gBAAgB4B,SAAS,GAAGpB,MAAMzU,EACrClc,KAAKmwB,gBAAgB4B,SAAS,GAAGpB,MAAMzU,EAAI,GAE/Clc,KAAKmwB,gBAAgBR,YAAc3vB,KAAK8vB,kBACxC9vB,KAAKmwB,gBAAgBT,YAAsC,EAAxB1vB,KAAKowB,KAAKV,YAC7C1vB,KAAKmwB,gBAAgB+B,QAAU,EAC/BlyB,KAAKmwB,gBAAgBgC,YAAYnyB,KAAKowB,MAGtCpwB,KAAKoyB,iBACLpyB,KAAKqyB,oBAEL,IAAMC,EAAkBtyB,KAAKqW,KAAKiP,MAC/BpW,QAAO,SAAAqjB,GACN,OAAO,EAAK1D,MAAM0D,GAAQC,QAE3BC,UACGC,EAAmB1yB,KAAKivB,MAAM3J,MACjCpW,QAAO,SAAAqjB,GACN,OAAO,EAAK1D,MAAM0D,GAAQC,QAE3BC,UACGE,EAAmB3yB,KAAKkvB,MAAM5J,MAAMpW,QAAO,SAAAqjB,GAC/C,OAAO,EAAK1D,MAAM0D,GAAQC,QAGxBI,EAAQ,EACRC,EAAQ7yB,KAAKyvB,EACbvsB,EAA0B,GAAflD,KAAKe,QAChB+xB,EAAY9yB,KAAKowB,KAAK2C,OAAOjvB,MAAQZ,EAAY,IAInD0vB,EAFE5yB,KAAK2xB,cAEC3xB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAG5Blc,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAI,GAEtClc,KAAKqW,KAAK2c,eAAehrB,SAAS,WAGpC4qB,EAAQ5yB,KAAKswB,WAAWyC,OAAO9gB,MAAQ,EAC9BjS,KAAKqW,KAAK2c,eAAehrB,SAAS,WAE3C6qB,GAAwB,GAAf7yB,KAAKe,SAShB,IAPA,IAAIwJ,EAAOvK,KACPizB,EAAgB,SAAUC,GAC5B,OAAO,SAAUrlB,GACftD,EAAKimB,eAAe0C,KAIfC,EAAY,EAAGA,EAAYT,EAAiBlzB,OAAQ2zB,IAAa,CACxE,IAAMD,EAAOlzB,KAAK6uB,MAAM6D,EAAiBS,IACnCC,EAAYpzB,KAAKqrB,aACnB,UAAOrrB,KAAKqrB,aAAe,MAAQ6H,EAAK9nB,MAAMioB,OAAO,EAAGP,GACxD,cAAWI,EAAK9nB,MAAMioB,OAAO,EAAGP,GAChCQ,EAAW,IAAIrD,KAAMS,UAAU,CACjC5oB,QAASsrB,EACTzC,MAAO,CACLiC,EACAC,EAAQM,GAA4B,GAAfnzB,KAAKe,SAAgC,GAAff,KAAKe,SAElD6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAUA,IAEZowB,EAAS7sB,SAAWzG,KAAKwvB,aAAeyD,EAAcC,GACtDlzB,KAAKuwB,UAAUgD,SAASD,GAG1B,IAAK,IAAIH,EAAY,EAAGA,EAAYb,EAAgB9yB,OAAQ2zB,IAAa,CACvE,IAAMD,EAAOlzB,KAAK6uB,MAAMyD,EAAgBa,IAEpCG,EAAW,IAAIrD,KAAMS,UAAU,CACjC5oB,QAAS,WAAQ9H,KAAKmvB,MAAQ,MAAQ+D,EAAK9nB,MAAMioB,OAAO,EAAGP,GAC3DnC,MAAO,CACLiC,EACAC,EACEH,EAAiBlzB,QAAyB,GAAfQ,KAAKe,SAChCoyB,GAA4B,GAAfnzB,KAAKe,SACH,GAAff,KAAKe,SAET6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAUA,IAEZowB,EAAS7sB,SAAWzG,KAAKwvB,aAAeyD,EAAcC,GACtDlzB,KAAKuwB,UAAUgD,SAASD,GAG1B,IAAK,IAAIH,EAAY,EAAGA,EAAYR,EAAiBnzB,OAAQ2zB,IAAa,CACxE,IAAMD,EAAOlzB,KAAK6uB,MAAM8D,EAAiBQ,IACnCC,EAAYpzB,KAAKqrB,aACnB,UAAOrrB,KAAKqrB,aAAe,MAAQ6H,EAAK9nB,MAAMioB,OAAO,EAAGP,GACxD,cAAWI,EAAK9nB,MAAMioB,OAAO,EAAGP,GAChCQ,EAAW,IAAIrD,KAAMS,UAAU,CACjC5oB,QAASsrB,EACTzC,MAAO,CACLiC,EACA5yB,KAAKyvB,EAAI0D,GAA4B,GAAfnzB,KAAKe,SAAgC,GAAff,KAAKe,SAEnD6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAUA,IAEZowB,EAAS7sB,SAAWzG,KAAKwvB,aAAeyD,EAAcC,GACtDlzB,KAAKuwB,UAAUgD,SAASD,GAQ1B,OANAtzB,KAAKuwB,UAAUxF,aAAe,SAAUld,GACtCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAKuwB,UAAUtF,aAAe,SAAUpd,GACtCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAExB9kB,MAETyzB,sBAAuB,WAErB,IAAIlpB,EAAOvK,KACXA,KAAKowB,KAAK3pB,QAAU,SAAUoH,GAC5BtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEpC7N,KAAKywB,cAAchqB,QAAU,SAAUoH,GACrCtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEpC7N,KAAK6wB,UAAUpqB,QAAU,SAAUoH,GACjCtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEpC7N,KAAK8wB,UAAUrqB,QAAU,SAAUoH,GACjCtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEpC7N,KAAKowB,KAAKrF,aAAe,SAAUld,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAKowB,KAAKnF,aAAe,SAAUpd,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAKywB,cAAc1F,aAAe,SAAUld,GAC1CkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAKywB,cAAcxF,aAAe,SAAUpd,GAC1CkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAK6wB,UAAU9F,aAAe,SAAUld,GACtCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAK6wB,UAAU5F,aAAe,SAAUpd,GACtCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAK8wB,UAAU/F,aAAe,SAAUld,GACtCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAK8wB,UAAU7F,aAAe,SAAUpd,GACtCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,YAGjC4O,yBAA0B,WAExB1zB,KAAKowB,KAAK3pB,QAAU,SAAUoH,KAC9B7N,KAAKywB,cAAchqB,QAAU,SAAUoH,KACvC7N,KAAK6wB,UAAUpqB,QAAU,SAAUoH,KACnC7N,KAAK8wB,UAAUrqB,QAAU,SAAUoH,KACnC7N,KAAKowB,KAAKrF,aAAe,SAAUld,KACnC7N,KAAKowB,KAAKnF,aAAe,SAAUpd,KACnC7N,KAAKywB,cAAc1F,aAAe,SAAUld,KAC5C7N,KAAKywB,cAAcxF,aAAe,SAAUpd,KAC5C7N,KAAK6wB,UAAU9F,aAAe,SAAUld,KACxC7N,KAAK6wB,UAAU5F,aAAe,SAAUpd,KACxC7N,KAAK8wB,UAAU/F,aAAe,SAAUld,KACxC7N,KAAK8wB,UAAU7F,aAAe,SAAUpd,MAE1CwkB,kBAAmB,WAEbryB,KAAKmvB,MAAQ,GACkB,SAA7BnvB,KAAKqW,KAAK2c,gBACZhzB,KAAK2zB,oBAIXA,iBAAkB,WAChB,IAAIzX,EAAIlc,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAQpC,GAPIlc,KAAK2xB,eAAiB3xB,KAAKqvB,aAAervB,KAAKmvB,QAC7CnvB,KAAKqvB,aAAe,IAAMrvB,KAAKmvB,MACjCjT,GAAKlc,KAAK0vB,YAEVxT,EAAIlc,KAAK4zB,gBAAgBxD,KAAK2B,SAAS,GAAGpB,MAAMzU,GAGhDlc,KAAKqW,KAAK2c,eAAehrB,SAAS,QAGpC,IAFA,IAES8N,EAAI,EAAGA,EAFI,EAEeA,IAAK,CACtC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAIzvB,KAAKe,UACnD8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UACnD8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,OAEF,GAAIlc,KAAKqW,KAAK2c,eAAehrB,SAAS,YAAa,CACxD7J,QAAQC,IAAI4B,MAGV,IADA,IACS8V,EAAI,EAAGA,EADI,EACeA,IAAK,CACtC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAIzvB,KAAKe,UACnD8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAoB,GAAfzvB,KAAKe,UACpD8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,QAEJ,GAAIlc,KAAKqW,KAAK2c,eAAehrB,SAAS,UAG3C,IAFA,IAES8N,EAAI,EAAGA,EAFI,EAEeA,IAAK,CACtC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UAC9C8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UACnD8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,OAEF,GAAIlc,KAAKqW,KAAK2c,eAAehrB,SAAS,WAAY,CAGvD,IAFA,IAES8N,EAAI,EAAGA,EAFI,GAEeA,IAAK,CACtC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UAC9C8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UACnD8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,EAEP,GACqB,OAAnBlc,KAAKqW,KAAKqb,MACyB,OAAnC1xB,KAAK4zB,gBAAgBvd,KAAKqb,KAC1B,CAEAxV,EAAIlc,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAC5D,IAAK,IAAIpG,EAAI,EAAGA,EAjBE,GAiBiBA,IAAK,CACtC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UACnD8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UAC9C8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,SAGJ,GAAIlc,KAAKqW,KAAK2c,eAAehrB,SAAS,UAE3C,GACqB,OAAnBhI,KAAKqW,KAAKqb,MACyB,OAAnC1xB,KAAK4zB,gBAAgBvd,KAAKqb,KAG1B,IADA,IACS5b,EAAI,EAAGA,EADI,GACeA,IAAK,CACtC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UACnD8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UAC9C8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,OAGP,KACEA,GACAlc,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAAI,IAC5D,CACA,IAAI2X,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAI,GAAIlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UACnD8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAmB,GAAfzvB,KAAKe,UAC9C8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,IAKb4X,sBAAuB,WACrB,IAAI5X,EAAIlc,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAChClc,KAAK2xB,eAAiB3xB,KAAKqvB,aAAervB,KAAKmvB,QAC7CnvB,KAAKqvB,aAAe,IAAMrvB,KAAKmvB,MACjCjT,GAAKlc,KAAK0vB,YAEVxT,EAAIlc,KAAK4zB,gBAAgBxD,KAAK2B,SAAS,GAAGpB,MAAMzU,GAGpD,IAAK,IAAIpG,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIie,EAAa,IAAI9D,KAAMC,KAC3B6D,EAAWvC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAI,KAC3CsE,EAAWvC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAI,KAC3CsE,EAAWpE,YAAc,UACzBoE,EAAWrE,YAAc,EACzB1vB,KAAKswB,WAAWiD,SAASQ,GACzB7X,GAAK,IAGTyV,YAAa,WACX,OAAO3xB,KAAKqvB,aAAe,GAE7B2E,cAAe,WACb,OAAOh0B,KAAKgvB,QAAQiF,QAAQj0B,KAAKqvB,eAEnCwC,iBAAkB,SAAUqC,GAC1B,IAAIC,EAAKn0B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,EAErC,OAAO0E,GADEn0B,KAAKgvB,QAAQiF,QAAQC,GAAeE,OAC3BD,GAAM,GAE1BE,oBAAqB,WACnB,IAAI5E,EAAIzvB,KAAKyvB,EACT6E,EAAWt0B,KAAKu0B,gBACpB,GAAI9E,IAAM6E,EACR,OAAOA,EACF,GAAI7E,EAAI6E,EAAU,CACvB,IAAI1jB,EAAM5Q,KAAKw0B,kBAAmC,GAAfx0B,KAAKe,QACxC,OAAO6P,EAGP,OADAA,EAAM5Q,KAAKy0B,aAA8B,GAAfz0B,KAAKe,SAInC6yB,cAAe,WAEb,OAAO5zB,KAAKgvB,QAAQiF,QAAQj0B,KAAKmvB,MAAQ,IAE3CsF,WAAY,WACV,OAAIz0B,KAAKmvB,MAAQ,EAAI,EACZ,EAEAnvB,KAAKgvB,QAAQiF,QAAQj0B,KAAKmvB,OAAOiB,KAAK2B,SAAS,GAAGpB,MAAMlB,GAGnE+E,gBAAiB,WACf,OAAIx0B,KAAKmvB,MAAQ,GAAKnvB,KAAKgvB,QAAQ0F,YAC1B,EAEA10B,KAAKgvB,QAAQiF,QAAQj0B,KAAKmvB,MAAQ,GAAGM,GAGhDuC,QAAS,WACP,IAAI2C,EAAc3U,KAAK4U,IACrB50B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,EAAIzvB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,GAE1DoF,EAAW70B,KAAKowB,KAAK2B,SAAS,GAAGpB,MACrC,GAAI3wB,KAAK2xB,cAAe,CACtB,IAAImD,EAAkB9U,KAAK4U,IAAI50B,KAAKqvB,aAAervB,KAAKmvB,OAExDnvB,KAAKowB,KAAK2E,cAAc,GAExB,IAAIC,EAAQH,EAAS3Y,EAAI,GACrB+Y,EAASD,EAAQh1B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAC7CgZ,EAAK,IAAIjF,KAAMkF,QACjB,IAAIlF,KAAMwB,MAAMuD,EAAOH,EAASpF,GAChC,IAAIQ,KAAMwB,OAAOwD,EAAQ,GACzB,MAIF,GAFAj1B,KAAKowB,KAAK0B,OAAO,EAAGoD,GAEhBJ,EAAkB,EAAG,CAEvB,IAAIM,EACFp1B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,EAAIzvB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,GACvD,EACD,EACF4F,EAAWr1B,KAAKowB,KAAK2B,SAAS,GAAGpB,MACrC3wB,KAAKowB,KAAK2E,cAAc,GACxB,IAAIO,EAAK,IAAIrF,KAAMkF,QACjB,IAAIlF,KAAMwB,MAAM4D,EAASnZ,EAAGmZ,EAAS5F,GACrC,KACA,IAAIQ,KAAMwB,MAAM,EAAG2D,EAAYT,IAEjC30B,KAAKowB,KAAK0B,OAAO,EAAGwD,MAI1BjE,UAAW,WACTrxB,KAAKsvB,OAAStvB,KAAKqW,KAAKsY,UACpB3uB,KAAK2xB,eAAgD,MAA/B3xB,KAAKg0B,gBAAgB1E,OAE7CtvB,KAAKsvB,OAAStvB,KAAKg0B,gBAAgB1E,OAC1BtvB,KAAKu1B,oBACdv1B,KAAKsvB,OAAStvB,KAAK4zB,gBAAgBtE,OAAS,GAE5CtvB,KAAKmvB,MAAQ,GACbnvB,KAAKovB,cAAgBpvB,KAAK4zB,gBAAgBxE,aAIjCpvB,KAAKmvB,MAAQ,GAAKnvB,KAAK4zB,gBAAgB9G,WAAa9sB,KAAKqW,KAAKyW,YADvE9sB,KAAKsvB,OAAStvB,KAAK4zB,gBAAgBtE,SAMvCiG,kBAAmB,WACjB,OACEv1B,KAAKmvB,MAAQ,GACbnvB,KAAK4zB,gBAAgBjC,eACrB3xB,KAAK4zB,gBAAgBvE,aAAervB,KAAKmvB,OAG7CoF,cAAe,WAEb,OADgBv0B,KAAKgvB,QAAQwG,cAAcpB,OACvBp0B,KAAKe,SAAW,GAEtCqzB,KAAM,WACJ,OAAOp0B,KAAKyvB,GAEdgG,SAAU,WACRz1B,KAAKowB,KAAKT,YAAc3vB,KAAK4vB,kBAC7B5vB,KAAKgwB,UAAUkC,QAAU,IACzBlyB,KAAKgwB,UAAUN,YAAsC,EAAxB1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUL,YAAc,WAE/B+F,WAAY,WACV11B,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUN,YAAc1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUL,YAAc3vB,KAAK4vB,kBAEX,UAAnB5vB,KAAKqW,KAAKvR,KACZ9E,KAAKowB,KAAKT,YAAc3vB,KAAK+vB,iBACD,YAAnB/vB,KAAKqW,KAAKvR,KACnB9E,KAAKowB,KAAKT,YAAc,UAExB3vB,KAAKowB,KAAKT,YAAc3vB,KAAK2vB,aAGjCgG,cAAe,SAAU5E,GACvB/wB,KAAK+wB,kBAAoBA,EACzB/wB,KAAKoyB,kBAEPA,eAAgB,WAAa,IAAD,OACpBwD,EAAc,GACdC,EAAc,GAWpB,GAVI71B,KAAK+wB,kBAAkB3a,OACrBpW,KAAK+wB,kBAAkB3a,KAAK0f,cAC1B91B,KAAKivB,MAAM6G,aAAaF,EAAYhuB,KAAK5H,KAAKivB,MAAM6G,aACpD91B,KAAKkvB,MAAM4G,aAAaD,EAAYjuB,KAAK5H,KAAKkvB,MAAM4G,cAEtD91B,KAAK+wB,kBAAkB3a,KAAK2f,UAC9BH,EAAYhuB,KAAK5H,KAAKivB,MAAM8G,SAC5BF,EAAYjuB,KAAK5H,KAAKkvB,MAAM6G,WAG5B/1B,KAAK+wB,kBAAkB1a,MACrBrW,KAAK+wB,kBAAkB1a,KAAKgV,aAAc,CAC5C,IAAI2K,EAAiBh2B,KAAKyV,cAAcnW,MAAM,KAC1CU,KAAKqW,KAAKgV,eACZuK,EAAYhuB,KAAK5H,KAAKqW,KAAKgV,aAAe2K,EAAe,IACzDH,EAAYjuB,KAAK5H,KAAKqW,KAAKgV,aAAe2K,EAAe,KAM/D,IAFA,IAAIC,EAAe,GACfC,EAAe,GACVpgB,EAAI,EAAGA,EAAI8f,EAAYp2B,OAAQsW,IACtCmgB,EAAeA,EAAeL,EAAY9f,GAAK,MAEjD,IAAK,IAAIA,EAAI,EAAGA,EAAI+f,EAAYr2B,OAAQsW,IACtCogB,EAAeA,EAAeL,EAAY/f,GAAK,MAGjD,IAAMqgB,EAAU,SAACC,EAAKjnB,GACpB,OAAI,EAAK4hB,kBAAkB3a,KAAKjH,IAC5B,EAAK4hB,kBAAkB1a,KAAKlH,GADainB,EAAM,EAE5CA,GAEHC,EAAwBr2B,KAAK+wB,kBAAkB3a,KACjDhW,OAAO9B,KAAK0B,KAAK+wB,kBAAkB3a,MAAMkgB,OAAOH,EAAS,GACzD/1B,OAAO9B,KAAK0B,KAAK+wB,kBAAkB1a,MAAMigB,OAAOH,EAAS,GACzD,EAE0B,IAA1BE,GACqB,OAAnBr2B,KAAKqW,KAAKqb,OAEZ1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EACtDlc,KAAK8D,MAAuB,EAAf9D,KAAKe,QACpBf,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAChElc,KAAK8D,MAAuB,IAAf9D,KAAKe,QACpBf,KAAKmwB,gBAAgB4B,SACnB/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAS,GACvCmxB,MAAMzU,EAAIlc,KAAK8D,MAAuB,IAAf9D,KAAKe,SAEhCf,KAAKywB,cAAcxiB,IAAI,CACrB0iB,MAAO,CAAC3wB,KAAK8D,MAAuB,IAAf9D,KAAKe,QAAef,KAAKywB,cAAcE,MAAMlB,KAEpEzvB,KAAK6wB,UAAU5iB,IAAI,CACjB0iB,MAAO,CACL3wB,KAAKywB,cAAcsC,OAAO9gB,MAAuB,GAAfjS,KAAKe,QACvCf,KAAK6wB,UAAUF,MAAMlB,GAEvB3nB,QAASmuB,IAEXj2B,KAAK8wB,UAAU7iB,IAAI,CACjB0iB,MAAO,CACL3wB,KAAKywB,cAAcsC,OAAO9gB,MAAuB,GAAfjS,KAAKe,QACvCf,KAAK8wB,UAAUH,MAAMlB,GAEvB3nB,QAASouB,KAEwB,IAA1BG,GACc,OAAnBr2B,KAAKqW,KAAKqb,OAEZ1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EACtDlc,KAAK8D,MAAuB,EAAf9D,KAAKe,QACpBf,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAChElc,KAAK8D,MAAuB,IAAf9D,KAAKe,QACpBf,KAAKmwB,gBAAgB4B,SACnB/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAS,GACvCmxB,MAAMzU,EAAIlc,KAAK8D,MAAuB,IAAf9D,KAAKe,SAEhCf,KAAKywB,cAAcxiB,IAAI,CACrB0iB,MAAO,CAAC3wB,KAAK8D,MAAuB,IAAf9D,KAAKe,QAAef,KAAKywB,cAAcE,MAAMlB,KAEpEzvB,KAAK6wB,UAAU5iB,IAAI,CACjB0iB,MAAO,CACL3wB,KAAKywB,cAAcsC,OAAO9gB,MAAuB,GAAfjS,KAAKe,QACvCf,KAAK6wB,UAAUF,MAAMlB,GAEvB3nB,QAASmuB,IAEXj2B,KAAK8wB,UAAU7iB,IAAI,CACjB0iB,MAAO,CACL3wB,KAAKywB,cAAcsC,OAAO9gB,MAAuB,GAAfjS,KAAKe,QACvCf,KAAK8wB,UAAUH,MAAMlB,GAEvB3nB,QAASouB,KAEwB,IAA1BG,GACc,OAAnBr2B,KAAKqW,KAAKqb,OAEZ1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EACtDlc,KAAK8D,MAAQ9D,KAAKe,QACpBf,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAChElc,KAAK8D,MAAuB,GAAf9D,KAAKe,QACpBf,KAAKmwB,gBAAgB4B,SACnB/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAS,GACvCmxB,MAAMzU,EAAIlc,KAAK8D,MAAuB,GAAf9D,KAAKe,SAEhCf,KAAKywB,cAAcxiB,IAAI,CACrB0iB,MAAO,CAAC3wB,KAAK8D,MAAuB,GAAf9D,KAAKe,QAAef,KAAKywB,cAAcE,MAAMlB,KAEpEzvB,KAAK6wB,UAAU5iB,IAAI,CACjB0iB,MAAO,CACL3wB,KAAKywB,cAAcsC,OAAO9gB,MAAuB,GAAfjS,KAAKe,QACvCf,KAAK6wB,UAAUF,MAAMlB,GAEvB3nB,QAASmuB,IAEXj2B,KAAK8wB,UAAU7iB,IAAI,CACjB0iB,MAAO,CACL3wB,KAAKywB,cAAcsC,OAAO9gB,MAAuB,GAAfjS,KAAKe,QACvCf,KAAK8wB,UAAUH,MAAMlB,GAEvB3nB,QAASouB,MAIY,OAAnBl2B,KAAKqW,KAAKqb,OACZ1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MACjE9D,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAS,GAAGmxB,MAAMzU,EAChElc,KAAK8D,MAAQ,EACf9D,KAAKmwB,gBAAgB4B,SACnB/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAS,GACvCmxB,MAAMzU,EAAIlc,KAAK8D,MAAQ,GAE3B9D,KAAKywB,cAAcxiB,IAAI,CACrB0iB,MAAO,CAAC3wB,KAAK8D,MAAQ,GAAI9D,KAAKywB,cAAcE,MAAMlB,QAsF3CX,UC/kBf,SAASyH,GAAWxH,GAClB/uB,KAAKgvB,QAAUD,EAAKC,QACpBhvB,KAAKgR,MAAQ+d,EAAK/d,MAClBhR,KAAKqtB,OAAS0B,EAAK1B,OACnBrtB,KAAK+tB,SAAWgB,EAAKhB,SACrB/tB,KAAKw2B,WAAazH,EAAKhB,SAAS3B,QAAQ2C,EAAK/d,MAAMrD,IAAM,EACzD3N,KAAKy2B,SAAWz2B,KAAK02B,cAAc12B,KAAKgR,OACxChR,KAAKyvB,EAAIV,EAAKU,EACdzvB,KAAKkc,EAAI6S,EAAK7S,EACdlc,KAAK8D,MAAQirB,EAAKjrB,MAClB9D,KAAK22B,YAAc5H,EAAK4H,YACxB32B,KAAK6pB,SAAWkF,EAAKlF,SACrB7pB,KAAKgwB,UAAY,IAAIC,KAAMC,KAC3BlwB,KAAKmwB,gBAAkB,IAAIF,KAAMC,KACjClwB,KAAKowB,KAAO,IAAIH,KAAMC,KACtBlwB,KAAK42B,WAAa7H,EAAK6H,WACvB52B,KAAK62B,iBAAmB9H,EAAK8H,iBAC7B72B,KAAK6B,UAAYktB,EAAKltB,UACtB7B,KAAK82B,YAAc/H,EAAK+H,YACxB92B,KAAK8qB,kBAAoBiE,EAAKjE,kBAC9B9qB,KAAK+wB,kBAAoB,GACzB/wB,KAAKwvB,YAAcT,EAAKS,YACxBxvB,KAAK2O,KAAO,IAAIshB,KAAMS,UAAU,CAC9BC,MAAO,CAAC3wB,KAAKkc,EAAmB,GAAf6S,EAAKhuB,QAAef,KAAKyvB,EAAmB,GAAfV,EAAKhuB,SACnD6vB,UAAW5wB,KAAK6B,UAChBqB,SAAyB,IAAf6rB,EAAKhuB,UAEjBf,KAAK21B,cAAc5G,EAAKgC,mBAzJ1BwF,GAAWrF,UAAY,CACrBC,YAAaoF,GACbnF,KAAM,WAEJ,IAAI2F,EAAY,IAAI9G,KAAM+G,UACxB,IAAI/G,KAAMwB,MAAMzxB,KAAKkc,EAAI,GAAIlc,KAAKyvB,GAClC,IAAIQ,KAAMgH,KAAKj3B,KAAK8D,MAAQ9D,KAAKkc,EAAI,GAAIlc,KAAK22B,cAE5C32B,KAAKwvB,cACPuH,EAAY,IAAI9G,KAAM+G,UACpB,IAAI/G,KAAMwB,MAAMzxB,KAAKkc,EAAI,GAAIlc,KAAKyvB,GAClC,IAAIQ,KAAMgH,KAAKj3B,KAAK8D,MAAQ9D,KAAKkc,EAAGlc,KAAK22B,eAG7C,IAAIO,EAAqBH,EAAU9E,QACnCiF,EAAmBjpB,IACjB,IAAIgiB,KAAMwB,MAAMzxB,KAAKkc,EAAGlc,KAAKyvB,EAAI,IACjC,IAAIQ,KAAMgH,KAAKj3B,KAAK8D,MAAQ9D,KAAKkc,EAAGlc,KAAK22B,YAAc,KAIzD32B,KAAKowB,KAAO,IAAIH,KAAMC,KAAK8G,UAAUD,GACjC/2B,KAAK6pB,SACP7pB,KAAKowB,KAAKQ,UAAY5wB,KAAK62B,iBAE3B72B,KAAKowB,KAAKQ,UAAY5wB,KAAK42B,WAEzB52B,KAAKgR,MAAM2d,UAAY,IAAM,IAC/B3uB,KAAKowB,KAAKQ,UAAUuG,YAAc,KAEpCn3B,KAAKowB,KAAK3xB,KAAO,SAAWuB,KAAKw2B,WAGjCx2B,KAAKgwB,UAAY,IAAIC,KAAMC,KAAK8G,UAAUE,GAC1Cl3B,KAAKgwB,UAAUY,UAAY,IAAIX,KAAMmH,MACnC,IAAM,IACN,IAAM,IACN,IAAM,IACN,GAEFp3B,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUvxB,KAAO,SAAWuB,KAAKw2B,WAAa,aACnDx2B,KAAKgwB,UAAUmC,YAAYnyB,KAAKowB,MAEhCpwB,KAAKmwB,gBAAkB,IAAIF,KAAMC,KAAK8G,UAAUE,GAChDl3B,KAAKmwB,gBAAgBS,UAAY5wB,KAAK82B,YACtC92B,KAAKmwB,gBAAgB+B,QAAU,EAC/BlyB,KAAKmwB,gBAAgBgC,YAAYnyB,KAAKowB,MAGtCH,KAAMzkB,QAAQ6rB,YAAYC,YAAY,EAAGt3B,KAAKgwB,WAC9CC,KAAMzkB,QAAQ6rB,YAAYC,YAAY,EAAGt3B,KAAKmwB,kBAEhDsD,sBAAuB,WAErB,IAAIlpB,EAAOvK,KACXA,KAAKowB,KAAK3pB,QAAU,SAAUoH,GAC5BtD,EAAKugB,kBAAkBvgB,EAAKyG,MAAOnD,IAErC7N,KAAKowB,KAAKrF,aAAe,SAAUld,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAKowB,KAAKnF,aAAe,SAAUpd,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,YAGjC4O,yBAA0B,WACxB1zB,KAAKowB,KAAK3pB,QAAU,SAAUoH,KAC9B7N,KAAKowB,KAAKrF,aAAe,SAAUld,KACnC7N,KAAKowB,KAAKnF,aAAe,SAAUpd,MAErC4nB,SAAU,WACRz1B,KAAKowB,KAAKQ,UAAY5wB,KAAK62B,iBAC3B72B,KAAK6pB,UAAW,EAChB7pB,KAAKgwB,UAAUkC,QAAU,IACzBlyB,KAAKgwB,UAAUY,UAAY,WAE7B8E,WAAY,WACV11B,KAAKowB,KAAKQ,UAAY5wB,KAAK42B,WACvB52B,KAAKgR,MAAM2d,UAAY,IAAM,IAC/B3uB,KAAKowB,KAAKQ,UAAUuG,YAAc,KAEpCn3B,KAAK6pB,UAAW,EAChB7pB,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUY,UAAY,IAAIX,KAAMmH,MACnC,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAIJV,cAAe,SAAS1lB,GAAQ,IAAD,OAEzBumB,EAAgB,GACpBv3B,KAAK+tB,SAAShd,SAAQ,SAAAymB,GACe,IAA/B,EAAKnK,OAAOmK,GAAK7I,WACnB4I,EAAc3vB,KAAK4vB,MAGvB,IAAIf,EAAW,GACf,GAAwB,IAApBzlB,EAAM2d,UAAgB,CAExB,IAAI6H,EAAae,EAAcnL,QAAQpb,EAAMrD,IAAM,EACnD8oB,EAAQ,UAAOD,OACV,CAEL,IAAIiB,EAAcz3B,KAAKqtB,OAAOrc,EAAM8b,UAGhC4K,EADsBD,EAAY/J,UAAUxe,QAAO,SAAAyoB,GAAC,MAAa,MAATA,EAAE,MACnBvL,QAAQpb,EAAMrD,IAAM,EAC/D8oB,EAAQ,UAAMz2B,KAAK02B,cAAce,GAAzB,YAAyCC,GAEnD,OAAOjB,GAETd,cAAe,SAAU5E,GACvB/wB,KAAK+wB,kBAAoBA,EACzB,IAAI6G,EAAY53B,KAAKgR,MAAMlM,KAAO,IAAM9E,KAAK02B,cAAc12B,KAAKgR,OAC5DhR,KAAK+wB,mBAAqB/wB,KAAK+wB,kBAAkB3lB,QACnDwsB,EAAYA,EAAY,KAAO53B,KAAKgR,MAAM5F,OAC5CpL,KAAK2O,KAAKV,IAAI,CACZnG,QAAS8vB,MAkCArB,UC7JR,SAASsB,GAAeC,EAAQzK,EAAQU,GAC7C,IAAMjB,EAAWgL,EAAOhL,SACxB,OAAIA,EACKO,EAAOP,GAAUY,UAAUtB,QAAQ0L,EAAOnqB,IAAI,EAG9CogB,EAAS3B,QAAQ0L,EAAOnqB,IAAI,ECivBvC,SAASoqB,GAAahJ,GAClB/uB,KAAKg4B,OAASjpB,SAASgM,eAAegU,EAAKkJ,UAC3ChI,KAAMiI,MAAMl4B,KAAKg4B,QACjBh4B,KAAKm4B,KAAO,KACZn4B,KAAK+tB,SAAWgB,EAAKhB,SACrB/tB,KAAKmsB,QAAU4C,EAAK5C,QACpBnsB,KAAKqtB,OAAS0B,EAAK1B,OACnBrtB,KAAK2rB,MAAQoD,EAAKpD,MAClB3rB,KAAKysB,OAASsC,EAAKtC,OACnBzsB,KAAK4sB,OAASmC,EAAKnC,OACnB5sB,KAAK6uB,MAAQE,EAAKF,MAClB7uB,KAAKuvB,OAASR,EAAKQ,OACnBvvB,KAAK8D,MAAQmsB,KAAMmI,KAAKC,SAASv0B,MACjC9D,KAAKe,QAAUf,KAAK8D,MAAQirB,EAAKhuB,QACjCf,KAAK0vB,YAAc1vB,KAAK8D,MAAQirB,EAAKW,YACrC1vB,KAAK2vB,YAAcZ,EAAKY,YACxB3vB,KAAK4vB,kBAAoBb,EAAKa,kBAC9B5vB,KAAK+vB,iBAAmBhB,EAAKgB,iBAC7B/vB,KAAK6vB,uBAAyBd,EAAKc,uBACnC7vB,KAAKs4B,kBAAoBvJ,EAAKuJ,kBAC9Bt4B,KAAK42B,WAAa7H,EAAK6H,WACvB52B,KAAK62B,iBAAmB9H,EAAK8H,iBAC7B72B,KAAKu4B,eAAiBxJ,EAAKwJ,eAC3Bv4B,KAAK8qB,kBAAoBiE,EAAKjE,kBAC9B9qB,KAAKw4B,YAAc,IAAIvI,KAAM/C,MAC7BltB,KAAKy4B,YAAc,IAAIxI,KAAM/C,MAC7BltB,KAAK04B,eAAiB,IAAIzI,KAAM/C,MAChCltB,KAAK24B,aAAe5J,EAAK4J,aACzB34B,KAAK44B,YAAc7J,EAAK6J,YACxB54B,KAAK64B,aAAe9J,EAAK8J,aACzB74B,KAAK84B,aAAe/J,EAAK+J,aACzB94B,KAAK+4B,YAAc,GACnB/4B,KAAKg5B,YAAc,GACnBh5B,KAAKi5B,OAAS,GACdj5B,KAAKk5B,QAAU,GACfl5B,KAAKm5B,YAAc,GACnBn5B,KAAK0rB,WAAaqD,EAAKrD,WACvB1rB,KAAKo5B,YAAc,GACnBp5B,KAAKq5B,YAAc,GACnBr5B,KAAK2pB,QAAUoF,EAAKpF,QACpB3pB,KAAK8vB,kBAAoBf,EAAKe,kBAC9B9vB,KAAK+wB,kBAAoBhC,EAAKgC,kBAC9B/wB,KAAKwvB,YAAcT,EAAKS,YACxBxvB,KAAKs5B,eAAiB,IAAIrJ,KAAMC,KAChClwB,KAAKu5B,iBAAmB,IAAItJ,KAAM/C,MAClCltB,KAAKw5B,qBAAuB,IAAIvJ,KAAM/C,MACtCltB,KAAKy5B,YAAc,IAAIxJ,KAAM/C,MAC7BltB,KAAK05B,2BAA6B3K,EAAK2K,2BACvC15B,KAAK25B,iBAAmB5K,EAAK4K,iBAC7B35B,KAAK45B,oBAAqB,EAC1B55B,KAAK65B,2BAA6B,EAClC75B,KAAK85B,cAAe,EACpB95B,KAAKwwB,eAAiBzB,EAAKyB,eAC3BxwB,KAAKmsB,QAAU4C,EAAK5C,QACpBnsB,KAAKyV,cAAgBsZ,EAAKtZ,cAE1B,IAAIlL,EAAOvK,KAEXiwB,KAAMmI,KAAK2B,QAAU,SAAUlsB,GAC3B,IAAK,IAAIiI,EAAI,EAAGA,EAAIvL,EAAK6uB,YAAY55B,OAAQsW,IACzCvL,EAAK6uB,YAAYtjB,GAAGka,UAAUkC,QAAUlS,KAAKzO,IACzC,GACAhH,EAAK6uB,YAAYtjB,GAAGka,UAAUkC,QAAU,KAGhD,IAAK,IAAIpc,EAAI,EAAGA,EAAIvL,EAAK8uB,YAAY75B,OAAQsW,IACzCvL,EAAK8uB,YAAYvjB,GAAGka,UAAUkC,QAAUlS,KAAKzO,IACzC,GACAhH,EAAK8uB,YAAYvjB,GAAGka,UAAUkC,QAAU,KAG5C3nB,EAAKqvB,qBACDrvB,EAAKuvB,cACLvvB,EAAKivB,qBAAqBvuB,SAASiR,GAAK,GAEpC3R,EAAKivB,qBAAqBvuB,SAASiR,EACnC3R,EAAKsvB,2BAA6B,KAElCtvB,EAAKuvB,cAAe,KAGxBvvB,EAAKivB,qBAAqBvuB,SAASiR,GAAK,GAEpC3R,EAAKivB,qBAAqBvuB,SAASiR,EAAI3R,EAAKsvB,6BAE5CtvB,EAAKuvB,cAAe,MAv0BxC/B,GAAa7G,UAAY,CACrBC,YAAa4G,GACbiC,YAAa,SAAUhpB,GACnB,IAAI2mB,EAAI,IAAIpB,GAAW,CACnBvH,QAAShvB,KACTgR,MAAOA,EACPqc,OAAQrtB,KAAKqtB,OACbU,SAAU/tB,KAAK+tB,SACf0B,EAAGzvB,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQpb,EAAMrD,KAC5CuO,EAAIlc,KAAK+4B,YAAYvpB,MAAK,SAAAmoB,GAAC,OAAIA,EAAEthB,KAAK1I,KAAOqD,EAAM0c,UAAU,OACzD1tB,KAAK+4B,YAAYvpB,MAAK,SAAAmoB,GAAC,OAAIA,EAAEthB,KAAK1I,KAAOqD,EAAM0c,UAAU,MAAI4B,OAAS,GAAKtvB,KAAKe,SACfiQ,EAAM2d,UAAY,GAAK3uB,KAAKe,QAEjG+C,MAAO9D,KAAK8D,MACZ6yB,YAAa32B,KAAKi6B,eAAejpB,GACjC6Y,SAAU7pB,KAAK24B,aAAa3wB,SAASgJ,EAAMrD,IAC3CipB,WAAY52B,KAAK42B,WACjBC,iBAAkB72B,KAAK62B,iBACvBC,YAAa92B,KAAK8vB,kBAClBhF,kBAAmB9qB,KAAK8qB,kBACxBjpB,UAAW7B,KAAKu4B,eAChBxH,kBAAmB/wB,KAAK+wB,kBAAkB/f,MAC1Cwe,YAAaxvB,KAAKwvB,YAClBzuB,QAASf,KAAKe,UAGlB42B,EAAEvG,OACFuG,EAAElE,wBAGFzzB,KAAKy4B,YAAYlF,SAASoE,EAAExH,iBAC5BnwB,KAAKy4B,YAAYlF,SAASoE,EAAE3H,WAC5BhwB,KAAKy4B,YAAYlF,SAASoE,EAAEvH,MAC5BpwB,KAAKy4B,YAAYlF,SAASoE,EAAEhpB,MAC5B3O,KAAKg5B,YAAYpxB,KAAK+vB,GAGlB33B,KAAK0rB,WAAWpV,OAAOtO,SAASgJ,EAAMrD,KACtC3N,KAAKq5B,YAAYzxB,KAAK+vB,IAG9BuC,WAAY,SAAU7jB,GAClB,IAAI8jB,EAAI,IAAIrL,GAAU,CAClBE,QAAShvB,KACTuvB,OAAQvvB,KAAKuvB,OACbzrB,MAAO9D,KAAK8D,MACZ/C,QAASf,KAAKe,QACd2uB,YACI1vB,KAAK0vB,YACL1P,KAAKzO,IAAI,EAAKvR,KAAKm5B,YAAYn5B,KAAKmsB,QAAQC,QAAQ/V,EAAK1I,IAAM,IACnEgiB,YAAa3vB,KAAK2vB,YAClBC,kBAAmB5vB,KAAK4vB,kBACxBC,uBAAwB7vB,KAAK6vB,uBAC7BE,iBAAkB/vB,KAAK+vB,iBACvB1Z,KAAMA,EACN4Y,MAAOjvB,KAAKysB,OAAOpW,EAAKqW,SACxBwC,MAAOlvB,KAAK4sB,OAAOvW,EAAKwW,SACxBkB,SAAU/tB,KAAK+tB,SACf5B,QAASnsB,KAAKmsB,QACdkB,OAAQrtB,KAAKqtB,OACbwB,MAAO7uB,KAAK6uB,MACZY,EAAGzvB,KAAKi5B,OAAOj5B,KAAKmsB,QAAQC,QAAQ/V,EAAK1I,KACzCkc,SACI7pB,KAAK44B,YAAY5wB,SAASqO,EAAK1I,KAC/B3N,KAAK64B,aAAa7wB,SAASqO,EAAKqW,UAChC1sB,KAAK84B,aAAa9wB,SAASqO,EAAKwW,SACpCuN,eAAgBp6B,KAAKo6B,eACrBtP,kBAAmB9qB,KAAK8qB,kBACxBuF,WAAYrwB,KAAKm5B,YAAYn5B,KAAKmsB,QAAQC,QAAQ/V,EAAK1I,IAAM,GAC7DmiB,kBAAmB9vB,KAAK8vB,kBACxBiB,kBAAmB/wB,KAAK+wB,kBACxBvB,YAAaxvB,KAAKwvB,YAClBgB,eAAgBxwB,KAAKwwB,eACrB/a,cAAezV,KAAKyV,gBAYxB,OAVAzV,KAAK+4B,YAAYnxB,KAAKuyB,GACtBn6B,KAAKw4B,YAAYjF,SAAS4G,EAAE/J,MAC5BpwB,KAAKw4B,YAAYjF,SAAS4G,EAAE1J,eAC5BzwB,KAAKw4B,YAAYjF,SAAS4G,EAAEtJ,WAC5B7wB,KAAKw4B,YAAYjF,SAAS4G,EAAErJ,WAC5B9wB,KAAKw4B,YAAYjF,SAAS4G,EAAE7J,YAC5BtwB,KAAKw4B,YAAYjF,SAAS4G,EAAE5J,WACxBvwB,KAAK0rB,WAAWza,OAAOjJ,SAASqO,EAAK1I,KACrC3N,KAAKo5B,YAAYxxB,KAAKuyB,GAEnBA,GAEX/I,KAAM,WAEFpxB,KAAKi5B,OAAS,GACdj5B,KAAKk5B,QAAU,GACfl5B,KAAK+4B,YAAc,GACnB/4B,KAAKg5B,YAAc,GACnBh5B,KAAKq5B,YAAc,GACnBr5B,KAAKo5B,YAAc,GACnBp5B,KAAKw4B,YAAY6B,iBACjBr6B,KAAKy4B,YAAY4B,iBACjBr6B,KAAK04B,eAAe2B,iBACpBr6B,KAAKy5B,YAAYY,iBAGjB,IAAIC,EAAW,EACXC,EAAkB,KACtB,IAAK,IAAIzkB,KAAK9V,KAAK+tB,SAAU,CACzB,IAAMW,EAAU1uB,KAAK+tB,SAASjY,GACxB9E,EAAQhR,KAAKqtB,OAAOqB,GAC1B,GAAwB,IAApB1d,EAAM2d,UAAiB,CACvB,GAAI7Y,EAAI,GAAKykB,EAAiB,CAC1B,IAAMC,EAAuBx6B,KAAKy6B,cAAcF,GAC1C5L,EAAY6L,EACEA,EAAqB7L,UAAY,EACjC,EACpB2L,GAAsBt6B,KAAKe,QAAU4tB,EAEzC3uB,KAAKk5B,QAAQtxB,KAAK0yB,GAClBA,EAAWt6B,KAAK06B,YAAY1pB,EAAM0c,UAAW4M,EAAUt6B,KAAKe,SAE7B,IAA3BiQ,EAAM0c,UAAUluB,SAChB86B,GAAsBt6B,KAAKe,SAE/Bw5B,EAAkB7L,GAjCZ,qBAsCK1uB,KAAKmsB,SAtCV,IAsCd,2BAAiC,CAAC,IAAzBwO,EAAwB,QAC7B36B,KAAKk6B,WAAWl6B,KAAK2rB,MAAMgP,KAvCjB,8BA0Cd36B,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GACrBA,EAAK+a,OACL/a,EAAKod,2BAIT,IADA,IAAI9E,EAAY,IACH,CACT,IAAIiM,EAAgBx6B,OAAOy6B,OAAO76B,KAAKqtB,QAAQne,QAAO,SAAAyoB,GAAC,OAAIA,EAAEhJ,YAAcA,KAC3E,GAA6B,IAAzBiM,EAAcp7B,OACd,MAEJ,IAAK,IAAI2P,KAAOyrB,EAAe,CAC3B,IAAMjD,EAAIiD,EAAczrB,GACxBnP,KAAKg6B,YAAYrC,GAErBhJ,IAIJ3uB,KAAK86B,aAGL96B,KAAK+6B,cACL/6B,KAAKg7B,aAELh7B,KAAK04B,eAAenF,SAASvzB,KAAKy4B,aAClCz4B,KAAK04B,eAAenF,SAASvzB,KAAKw4B,aAClCx4B,KAAK04B,eAAenF,SAASvzB,KAAKy5B,aAClCz5B,KAAK04B,eAAenF,SAASvzB,KAAKu5B,kBAElCv5B,KAAK04B,eAAeztB,SAASwkB,GAAK,GAClCzvB,KAAKi7B,aAETC,mBAAoB,SAAUxM,EAASyM,GAAU,IAAD,OACxBn7B,KAAKg5B,YAAYxpB,MAAK,SAAAsoB,GACtC,OAAOA,EAAO9mB,MAAMrD,KAAO+gB,KAEnB1d,MAAM0c,UAAU3c,SAAQ,SAAA4c,GAChC,GAA2B,MAAvBA,EAASzC,OAAO,GAAY,CAC5B,IAAM7U,EAAO,EAAK4d,QACd,EAAK9H,QAAQC,QAAQ,EAAKT,MAAMgC,GAAUhgB,IAAM,GAGhD0I,EAAKsb,gBACJ,EAAK2H,eAAe8B,iBAAiB/kB,EAAK+Z,MAAM5wB,OAAS,GACzD,EAAK85B,eAAe8B,iBAAiB/kB,EAAK2d,gBAAgB5D,MACrD5wB,OAAS,IAEf6W,EAAK+Z,KAAKT,YAAc,UACxBtZ,EAAK2d,gBAAgB5D,KAAKT,YAAc,UAExCwL,EAAQvzB,KAAKyO,IAEbA,EAAKqf,iBAEqB,MAAvB/H,EAASzC,OAAO,IACvB,EAAKgQ,mBAAmBvN,EAAUwN,OAI9CE,mBAAoB,SAAU3M,GAA6B,IAAD,OAAnB5pB,EAAmB,uDAAZ,WAE1C9E,KAAKy5B,YAAYY,iBACjBr6B,KAAKu5B,iBAAiBc,iBACtBr6B,KAAKw5B,qBAAqBa,iBAE1Br6B,KAAK45B,oBAAqB,EACtB55B,KAAKm4B,MAAMn4B,KAAKm4B,KAAKmD,SACzBt7B,KAAKm4B,KAAO,IAAIlI,KAAMsL,KACtBv7B,KAAKm4B,KAAKqD,YAAc,EACxB,IAAIL,EAAU,GAGdn7B,KAAKg5B,YAAYjoB,SAAQ,SAAAC,GAAK,OAAIA,EAAM0iB,8BACxC1zB,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GAAI,OAAIA,EAAKqd,8BACtC3kB,SAASykB,KAAK7vB,MAAMmhB,OAAS,YAE7B9kB,KAAKy7B,gBAAgB/M,EAAS5pB,GAE9B9E,KAAKm4B,KAAKuD,YAAc,SAAA7tB,GACpB,EAAKyrB,eAAiB,IAAIrJ,KAAMC,KAChC,EAAKoJ,eAAe3J,YAAc,EAAK2I,kBACvC,EAAKgB,eAAe5J,YAAc,EAClC,EAAK4J,eAAe9H,IAAI3jB,EAAM8iB,OAC9B,EAAK4I,iBAAiBhG,SAAS,EAAK+F,iBAExCt5B,KAAKm4B,KAAKwD,UAAY,SAAA9tB,GAQlB,GANA,EAAK0rB,iBAAiBc,iBAEtB,EAAKtB,YAAYhoB,SAAQ,SAAAsF,GACrBA,EAAKqf,gBAET,EAAKgE,2BAA2B,CAAE50B,KAAMA,EAAMxE,MAAO,KACjD66B,EAAQ37B,OAAS,EAAG,CACpB,IAAIo8B,EAAcT,EAAQ,GACtBU,EAAcV,EAAQA,EAAQ37B,OAAS,GAC3C,EAAKm6B,iBAAiBiC,EAAYvlB,KAAKyW,SAAUhoB,EAAM,CACnD82B,EAAYvlB,KAAK1I,GACjBkuB,EAAYxlB,KAAK1I,SAIR,aAAT7I,EACA,EAAKi2B,cAEL,EAAKC,cAIjBh7B,KAAKm4B,KAAK2D,YAAc,SAAAjuB,GAEf,EAAKyrB,eAAevH,SAAS,GAG9B,EAAKuH,eAAevH,SAAS,GAAGpB,MAAQ9iB,EAAM8iB,MAF9C,EAAK2I,eAAe9H,IAAI3jB,EAAM8iB,OAIlCwK,EAAU,GACV,EAAKD,mBAAmBxM,EAASyM,IAErCn7B,KAAKm4B,KAAK1C,YAEdgG,gBAAiB,SAAU/M,EAAS5pB,GAChC,IAAMi3B,EAAc/7B,KAAKg5B,YAAYxpB,MAAK,SAAAsoB,GACtC,OAAOA,EAAO9mB,MAAMrD,KAAO+gB,KAEzBsN,EAASD,EAAY3L,KAAK2C,OAAO/vB,OAAS,EAC1Ci5B,EAASF,EAAY3L,KAAK2C,OAAO5nB,KACnC+wB,EAAY,IAAIjM,KAAMC,KAC1BgM,EAAUvM,YAAc,UACxBuM,EAAUxM,YAAc,EACxBwM,EAAUlL,UAAY,CAAC,GAAI,IAC3BkL,EAAU1K,IACN,IAAIvB,KAAMwB,MACNwK,EACAF,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAASh8B,KAAK0vB,YAAc,IAGhEwM,EAAU1K,IACN,IAAIvB,KAAMwB,MACNwK,EAASF,EAAY3L,KAAK2C,OAAOjvB,MAAQ,EACzCi4B,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAASh8B,KAAK0vB,YAAc,IAGhE,IAAIyM,EAAiB,IAAIlM,KAAMC,KAC/BiM,EAAexM,YAAc,UAC7BwM,EAAezM,YAAc,EAC7ByM,EAAe3K,IACX0K,EAAUnK,SAAS,GAAGpB,MAAMzU,EAAI,GAChCggB,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAI,IAEpC0M,EAAe3K,IACX0K,EAAUnK,SAAS,GAAGpB,MAAMzU,EAC5BggB,EAAUnK,SAAS,GAAGpB,MAAMlB,GAEhC0M,EAAe3K,IACX0K,EAAUnK,SAAS,GAAGpB,MAAMzU,EAAI,GAChCggB,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAI,IAEpC,IAAI2M,EAAc,IAAInM,KAAMC,KAC5BkM,EAAYzM,YAAc,UAC1ByM,EAAY1M,YAAc,EAC1B0M,EAAY5K,IACR,IAAIvB,KAAMwB,MAAMwK,EAAS,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAI,KAEjE2M,EAAY5K,IACR,IAAIvB,KAAMwB,MAAMwK,EAAS,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAI,KAEjE,IAAI4M,EAAc,IAAIpM,KAAMC,KAC5BmM,EAAY1M,YAAc,UAC1B0M,EAAY3M,YAAc,EAC1B2M,EAAY7K,IACR,IAAIvB,KAAMwB,MAAMwK,EAAS,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAI,KAEjE4M,EAAY7K,IACR,IAAIvB,KAAMwB,MAAMwK,EAAS,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAI,KAGjE,IAAM6M,EAAoB,aAATx3B,EAAsB,SAAW,SAC9Cy3B,EAAY,IAAItM,KAAMS,UAAU,CAChC5oB,QAAS,QAAUw0B,EAAW,QAC9B3L,MAAO,CAACsL,EAAS,GAAIF,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAAS,IAC1DpL,UAAW,UACX1tB,SAAU,KAEVs5B,EAAqB,IAAIvM,KAAM+G,UAC/B,IAAI/G,KAAMwB,MAAMwK,EAAS,GAAIF,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAAS,IAClE,IAAI/L,KAAMgH,KAAKsF,EAAUxJ,OAAOjvB,MAAQ,GAAIy4B,EAAUxJ,OAAO/vB,OAAS,IAEtEy5B,EAAsB,IAAIxM,KAAMC,KAAK8G,UAAUwF,GACnDC,EAAoB7L,UAAY,yBAChC5wB,KAAKw5B,qBAAqBjG,SAAS2I,GACnCl8B,KAAKw5B,qBAAqBjG,SAAS4I,GACnCn8B,KAAK65B,2BAA6B75B,KAAKw5B,qBAAqBvuB,SAASiR,EACrElc,KAAKu5B,iBAAiBhG,SAASvzB,KAAKw5B,sBACpCx5B,KAAKu5B,iBAAiBhG,SAASkJ,GAC/Bz8B,KAAKu5B,iBAAiBhG,SAASgJ,GAC/Bv8B,KAAKu5B,iBAAiBhG,SAAS6I,GAC/Bp8B,KAAKu5B,iBAAiBhG,SAAS8I,IAEnCK,qBAAsB,WAClB18B,KAAK45B,oBAAqB,EAC1B55B,KAAKu5B,iBAAiBc,iBAClBr6B,KAAKm4B,MACLn4B,KAAKm4B,KAAKmD,SAEdvsB,SAASykB,KAAK7vB,MAAMmhB,OAAS,UAC7B9kB,KAAKg5B,YAAYjoB,SAAQ,SAAAC,GAAK,OAAIA,EAAMyiB,2BACxCzzB,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GAAI,OAAIA,EAAKod,4BAE1CuH,WAAY,WAAa,IAAD,OACpBh7B,KAAKg5B,YAAYjoB,SAAQ,SAAAC,GACrB,GAA2B,OAAvBA,EAAMA,MAAM2rB,QAAmB3rB,EAAMA,MAAM2rB,OAAOn9B,OAAS,EAAG,CAC9D,IAAMo9B,EAAU5rB,EAAMA,MAAM2rB,OAAO,GAC7BE,EACF7rB,EAAMA,MAAM2rB,OAAOn9B,OAAS,EAAIwR,EAAMA,MAAM2rB,OAAO,QAAKr1B,EAE5D,QAAgBA,IAAZs1B,GAAyB,EAAKzQ,QAAQC,QAAQwQ,IAAY,EAAG,CAC7D,IAAIE,EAAQC,EAAQC,EAAMC,EACtBC,EAAYC,EAEhBD,EAAa,EAAKjJ,QAAQ,EAAK9H,QAAQC,QAAQwQ,GAAW,QAC1Ct1B,IAAZu1B,GACAM,EAAa,EAAKlJ,QAAQ,EAAK9H,QAAQC,QAAQyQ,GAAW,GAC1DC,EAASI,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAI,EAAKwT,YACpDqN,EAASI,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOG,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMzU,IAEzC4gB,EAAS,GACTC,EAASG,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOE,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,GAGhB,OAAzBlL,EAAMA,MAAMosB,UACZpsB,EAAMA,MAAMosB,SAAS59B,OAAS,IAE9Bu9B,GAAyB,IAAf,EAAKh8B,SAEnBk8B,EAAOF,EACP,IAAIM,EAAa,IAAIpN,KAAMC,KAC3BmN,EAAW5+B,KAAO,UAClB4+B,EAAW1N,YAAc,EAAK2I,kBAC9B+E,EAAW3N,YAAc,EACzB2N,EAAW7L,IAAI,IAAIvB,KAAMwB,MAAMqL,EAAQC,IACvCM,EAAW7L,IAAI,IAAIvB,KAAMwB,MAAMuL,EAAO,EAAKtN,YAAauN,IACxD,IAAM1yB,EAAO,EAEb8yB,EAAW52B,QAAU,SAAUoH,GAC3BtD,EAAKugB,kBAAkB9Z,EAAMA,MAAOnD,IAExCwvB,EAAWtS,aAAe,SAAUld,GAChCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCuY,EAAWpS,aAAe,SAAUpd,GAChCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC,EAAK2U,YAAYlG,SAAS8J,SAK1CtC,YAAa,WAAa,IAAD,OACrB/6B,KAAKg5B,YAAYjoB,SAAQ,SAAAC,GACrB,GAA6B,OAAzBA,EAAMA,MAAMosB,UAAqBpsB,EAAMA,MAAMosB,SAAS59B,OAAS,EAAG,CAClE,IAAMo9B,EAAU5rB,EAAMA,MAAMosB,SAAS,GAC/BP,EAAU7rB,EAAMA,MAAMosB,SAAS,GACrC,QAAgB91B,IAAZs1B,GAAyB,EAAKzQ,QAAQC,QAAQwQ,IAAY,EAAG,CAC7D,IAAIE,EAAQC,EAAQC,EAAMC,EACtBC,EAAYC,EAEhBD,EAAa,EAAKjJ,QAAQ,EAAK9H,QAAQC,QAAQwQ,GAAW,QAC1Ct1B,IAAZu1B,GACAM,EAAa,EAAKlJ,QAAQ,EAAK9H,QAAQC,QAAQyQ,GAAW,GAC1DC,EAASI,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAI,EAAKwT,YACpDqN,EAASI,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOG,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMzU,IAEzC4gB,EAAS,GACTC,EAASG,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOE,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,GAGhB,OAAzBlL,EAAMA,MAAMosB,UACZpsB,EAAMA,MAAMosB,SAAS59B,OAAS,IAE9Bu9B,GAAyB,GAAf,EAAKh8B,SAEQ,OAAvBiQ,EAAMA,MAAM2rB,QAAmB3rB,EAAMA,MAAM2rB,OAAOn9B,OAAS,IAC3Du9B,GAAyB,IAAf,EAAKh8B,SAEnBk8B,EAAOF,EACP,IAAIO,EAAc,IAAIrN,KAAMC,KAC5BoN,EAAY7+B,KAAO,UACnB6+B,EAAY3N,YAAc,EAAK2I,kBAC/BgF,EAAY5N,YAAc,EAC1B4N,EAAY9L,IAAI,IAAIvB,KAAMwB,MAAMqL,EAAQC,EAAS,IACjDO,EAAY9L,IAAI,IAAIvB,KAAMwB,MAAMuL,EAAO,EAAKtN,YAAauN,EAAO,IAChEK,EAAY9L,IACR,IAAIvB,KAAMwB,MACN6L,EAAYvL,SAAS,GAAGpB,MAAMzU,EAAI,EAClCohB,EAAYvL,SAAS,GAAGpB,MAAMlB,EAAI,IAG1C,IAAI8N,EAAc,IAAItN,KAAMC,KAC5BqN,EAAY9+B,KAAO,UACnB8+B,EAAY5N,YAAc,EAAK2I,kBAC/BiF,EAAY7N,YAAc,EAC1B6N,EAAY/L,IAAI,IAAIvB,KAAMwB,MAAMqL,EAAQC,EAAS,IACjDQ,EAAY/L,IAAI,IAAIvB,KAAMwB,MAAMuL,EAAO,EAAKtN,YAAauN,EAAO,IAChEM,EAAY/L,IACR,IAAIvB,KAAMwB,MACN8L,EAAYxL,SAAS,GAAGpB,MAAMzU,EAAI,EAClCqhB,EAAYxL,SAAS,GAAGpB,MAAMlB,EAAI,IAG1C,IAAMllB,EAAO,EAEb+yB,EAAY72B,QAAU,SAAUoH,GAC5BtD,EAAKugB,kBAAkB9Z,EAAMA,MAAOnD,IAExC0vB,EAAY92B,QAAU,SAAUoH,GAC5BtD,EAAKugB,kBAAkB9Z,EAAMA,MAAOnD,IAExCyvB,EAAYvS,aAAe,SAAUld,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCwY,EAAYrS,aAAe,SAAUpd,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCyY,EAAYxS,aAAe,SAAUld,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCyY,EAAYtS,aAAe,SAAUpd,GACjCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC,EAAK2U,YAAYlG,SAAS+J,GAC1B,EAAK7D,YAAYlG,SAASgK,SAK1CC,kBAAmB,SAAU9O,GACzB,IAAI1d,EAAQhR,KAAKqtB,OAAOqB,GACxB,GAA+B,IAA3B1d,EAAM0c,UAAUluB,OAEhB,OADQQ,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQpb,EAAMrD,KAGrD,IAAI8vB,EAAgBzsB,EAAM0c,UAAU,GAChCgQ,EAAc19B,KAAKy9B,EAAcn+B,MAAM,KAAK,GAAK,KAAKm+B,GAC1D,MAAiC,UAA7BA,EAAcrS,WACPprB,KAAKw9B,kBAAkBC,GAEbz9B,KAAKi5B,OAAOj5B,KAAKmsB,QAAQC,QAAQsR,EAAY/vB,MAItEgwB,iBAAkB,SAAUjP,GACxB,IAAM1d,EAAQhR,KAAKqtB,OAAOqB,GACpBkP,EAAa59B,KAAKy6B,cAAc/L,GACtC,OAAIkP,GAAwC,UAA1BA,EAAWxS,WACjBprB,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQwR,EAAWjwB,MAC1CiwB,EAAWjP,UAAY3d,EAAM2d,WAAa3uB,KAAKe,QACpD68B,GAAwC,SAA1BA,EAAWxS,WAE5BprB,KAAKi5B,OAAOj5B,KAAKmsB,QAAQC,QAAQwR,EAAWjwB,KAC5C3N,KAAK0vB,YACL1vB,KAAKe,QAAU,GAEF68B,EAAWjP,UAAY3d,EAAM2d,UAAY,GAAK3uB,KAAKe,QAG7D,GAGf05B,cAAe,SAAU/L,GACrB,IAAImP,EAAgB79B,KAAKqtB,OAAOqB,GAAShB,UACzC,GAA6B,IAAzBmQ,EAAcr+B,OAAc,OAAO,KACvC,IAAIs+B,EAAeD,EAAcA,EAAcr+B,OAAS,GACxD,GAA+B,MAA3Bs+B,EAAa5S,OAAO,GACpB,OAAOlrB,KAAK2rB,MAAMmS,GAElB,IAAIF,EAAa59B,KAAKqtB,OAAOyQ,GAEzBC,EAAkB/9B,KAAKy6B,cAAcqD,GAEzC,OADIC,IAAiBH,EAAaG,GAC3BH,GAGf3D,eAAgB,SAAUjpB,GACtB,OAAIA,EAAM0c,UAAUluB,OAAS,EAErBQ,KAAK29B,iBAAiB3sB,EAAMrD,IAC5B3N,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQpb,EAAMrD,KAC7B3N,KAAKe,QAEdf,KAAKe,SAGpB2zB,UAAW,WACP,OAAO10B,KAAK+4B,YAAYv5B,QAE5By0B,QAAS,SAAU+J,GACf,OAAOh+B,KAAK+4B,YAAYiF,EAAa,IAEzCC,SAAU,SAAUC,GAChB,OAAOl+B,KAAKg5B,YAAYkF,EAAc,IAE1C1I,YAAa,WACT,OAAOx1B,KAAK+4B,YAAY/4B,KAAK00B,YAAc,IAE/CgG,YAAa,SAAU5Q,EAASwQ,EAAUv5B,GAAU,IAAD,OAC/C,GAAI+oB,EAAQtqB,OAAS,EACjB,OAAO86B,EAEX,IAAIjK,EAAa,EAuGjB,OAtGIvG,EAAQtqB,OAAS,GACjB6wB,EAAa,GACNvG,EAAQtqB,OAAS,GACxB6wB,EAAa,IACNvG,EAAQtqB,OAAS,IAAMQ,KAAKwvB,eACnCa,EAAa,IAEjBvG,EAAQ/Y,SAAQ,SAAC4c,EAAU7X,GACvB,IAAIqoB,EAAe,EAAKxQ,EAASruB,MAAM,KAAK,GAAK,KAAKquB,GAClDyQ,EAAmBD,EAAa7Y,MAAMpW,QAAO,SAAAqjB,GAC7C,OAAO,EAAK1D,MAAM0D,GAAQC,QAC3BhzB,OACC6+B,EAAmB,EACnBC,EAAc,EAsBlB,GArBgC,SAA5BH,EAAa/S,aAEbgT,GAAoB,EAAK3R,OAAO0R,EAAazR,SAASpH,MAAMpW,QACxD,SAAAqjB,GACI,OAAO,EAAK1D,MAAM0D,GAAQC,QAEhChzB,OACF6+B,GAAoB,EAAKzR,OAAOuR,EAAatR,SAASvH,MAAMpW,QACxD,SAAAqjB,GACI,OAAO,EAAK1D,MAAM0D,GAAQC,QAEhChzB,OAEF8+B,EACIF,EAAmB,GACnBD,EAAanL,eAAehrB,SAAS,WACpCm2B,EAAanL,eAAehrB,SAAS,WACpC,EACA,GAIsB,SAA5Bm2B,EAAa/S,YACgD,IAA7DyM,GAAesG,EAAc,EAAK9Q,OAAQ,EAAKU,WAC/CqQ,EAAmB,EAGnB,EAAKjF,YACL,EAAKhN,QAAQC,QAAQ+R,EAAaxwB,IAAM,GAChC0iB,EACRiK,GAAsBv5B,GAAWq9B,EAAmB,GACpD,EAAKnF,OAAOrxB,KAAK0yB,GACjBA,GAAsBv5B,EAAUs9B,EAAmB,GAC/CvoB,IAAMgU,EAAQtqB,OAAS,IAEvB86B,GAAsB6D,EAAaxP,UAAY5tB,QAEhD,GACyB,SAA5Bo9B,EAAa/S,YACb,EAAKe,QAAQC,QAAQ+R,EAAaxwB,IAAM,EAAI,EAC9C,CAQE,GAPA,EAAKwrB,YACL,EAAKhN,QAAQC,QAAQ+R,EAAaxwB,IAAM,GAChC0iB,EACRiK,EACIA,EACAv5B,EAAUif,KAAKue,IAAI,EAAGH,GACtBr9B,EAAUu9B,EAEVxoB,EAAI,GACJgU,EAAQhU,EAAI,GAAG9N,SAAS,UACxB,EAAKqlB,OAAOvD,EAAQhU,EAAI,IAAI4X,UAAUluB,OACxC,CAGE,IAAMg/B,EAAiB,EAAK/D,cAAc3Q,EAAQhU,EAAI,IACtDwkB,IAEKkE,EAAe7P,UAAYwP,EAAaxP,WAAa5tB,EAE9D,EAAKk4B,OAAOrxB,KAAK0yB,GACjBA,GAAsBv5B,EAAUs9B,EAAmB,QAChD,GAAgC,UAA5BF,EAAa/S,WAAwB,CAE5C,GADAkP,GAAsBv5B,EAElB+U,EAAI,GACJgU,EAAQhU,EAAI,GAAG9N,SAAS,UACxB,EAAKqlB,OAAOvD,EAAQhU,EAAI,IAAI4X,UAAUluB,OAAS,EACjD,CAEE,IAAMg/B,EAAiB,EAAK/D,cAAc3Q,EAAQhU,EAAI,IACtDwkB,IAEKkE,EAAe7P,UAAYwP,EAAaxP,UAAY,GAAK5tB,OAE9D+U,EAAI,GACJgU,EAAQhU,EAAI,GAAG9N,SAAS,UACyB,IAAjD,EAAKqlB,OAAOvD,EAAQhU,EAAI,IAAI4X,UAAUluB,SAGtC86B,GAAsBv5B,GAE1B,EAAKm4B,QAAQtxB,KAAK0yB,GAGlBA,EAAW,EAAKI,YAAYyD,EAAazQ,UAAW4M,EAAUv5B,OAG/Du5B,GAEXW,UAAW,WAEPj7B,KAAKg4B,OAAOh1B,OAAShD,KAAKy4B,YAAY1F,OAAO0L,OAAS,IAE1DC,SAAU,SAAUp+B,GAChBN,KAAK8D,MAAQxD,GAEjBq+B,WAAY,SAAUnzB,GAClBxL,KAAK+tB,SAAWviB,EAAQuiB,SACxB/tB,KAAKmsB,QAAU3gB,EAAQ2gB,QACvBnsB,KAAKqtB,OAAS7hB,EAAQ6hB,OACtBrtB,KAAK2rB,MAAQngB,EAAQmgB,MACrB3rB,KAAKysB,OAASjhB,EAAQihB,OACtBzsB,KAAK4sB,OAASphB,EAAQohB,OACtB5sB,KAAK6uB,MAAQrjB,EAAQqjB,OAEzB+P,gBAAiB,SAAUt+B,GAAQ,IAAD,OAC9BN,KAAK24B,aAAer4B,EAChBN,KAAKg5B,YAAYx5B,OAAS,IAC1BQ,KAAKg5B,YAAYjoB,SAAQ,SAAAC,GACrBA,EAAM0kB,gBAEV11B,KAAKg5B,YAAYjoB,SAAQ,SAAA8tB,GACjB,EAAKlG,aAAa3wB,SAAS62B,EAAW7tB,MAAMrD,KAC5CkxB,EAAWpJ,gBAK3BqJ,eAAgB,SAAUx+B,GAAQ,IAAD,OAC7BN,KAAK44B,YAAct4B,EACfN,KAAK+4B,YAAYv5B,OAAS,IAC1BQ,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GACrBA,EAAKqf,gBAET11B,KAAK+4B,YAAYhoB,SAAQ,SAAAguB,GACjB,EAAKnG,YAAY5wB,SAAS+2B,EAAU1oB,KAAK1I,KACzCoxB,EAAUtJ,gBAK1BuJ,gBAAiB,SAAU1+B,GAAQ,IAAD,OAC9BN,KAAK64B,aAAev4B,EAChBN,KAAK+4B,YAAYv5B,OAAS,IAC1BQ,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GACrBA,EAAKqf,gBAET11B,KAAK+4B,YAAYhoB,SAAQ,SAAAguB,GACjB,EAAKlG,aAAa7wB,SAAS+2B,EAAU1oB,KAAKqW,UAC1CqS,EAAUtJ,gBAK1BwJ,gBAAiB,SAAU3+B,GAAQ,IAAD,OAC9BN,KAAK84B,aAAex4B,EAChBN,KAAK+4B,YAAYv5B,OAAS,IAC1BQ,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GACrBA,EAAKqf,gBAET11B,KAAK+4B,YAAYhoB,SAAQ,SAAAguB,GACjB,EAAKjG,aAAa9wB,SAAS+2B,EAAU1oB,KAAKwW,UAC1CkS,EAAUtJ,gBAK1ByJ,cAAe,SAAU5+B,GACrBN,KAAK0rB,WAAaprB,GAEtB6+B,UAAW,SAAUxV,GACjB3pB,KAAK2pB,QAAUA,EACf3pB,KAAK86B,cAETA,WAAY,WAAa,IAAD,OACpB96B,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GACrBA,EAAK8Z,gBAAgB+B,QAAU,GAE3B,EAAKvI,QAAQgC,MAAM3jB,SAASqO,EAAKA,KAAK1I,KACtC,EAAKgc,QAAQO,MAAMliB,SAASqO,EAAKA,KAAKqW,UACtC,EAAK/C,QAAQO,MAAMliB,SAASqO,EAAKA,KAAKwW,YAEtCxW,EAAK8Z,gBAAgB+B,QAAU,MAGvClyB,KAAKg5B,YAAYjoB,SAAQ,SAAAC,GACrBA,EAAMmf,gBAAgB+B,QAAU,EAC5B,EAAKvI,QAAQ0D,OAAOrlB,SAASgJ,EAAMA,MAAMrD,MACzCqD,EAAMmf,gBAAgB+B,QAAU,OAI5CyD,cAAe,SAAU5E,GACrB/wB,KAAK+wB,kBAAoBA,EACzB/wB,KAAKg5B,YAAYjoB,SAAQ,SAAAC,GAAK,OAC1BA,EAAM2kB,cAAc5E,EAAkB/f,UAE1ChR,KAAK+4B,YAAYhoB,SAAQ,SAAAsF,GAAI,OAAIA,EAAKsf,cAAc5E,OAExDqO,SAAU,SAAUr+B,EAAS2uB,GACzB1vB,KAAKe,QAAUf,KAAK8D,MAAQ/C,EAC5Bf,KAAK0vB,YAAc1vB,KAAK8D,MAAQ4rB,IAgGzBqI,UC/0BMsH,G,kDACnB,WAAYvhC,GAAQ,IAAD,8BACjB,cAAMA,IAiIR67B,iBAAmB,SAACjL,EAAS5pB,EAAMqnB,GACjC,IAAIpW,EAAY,eACbjR,EAAOqnB,GAEV,EAAKruB,MAAMwhC,YAAY5Q,EAAS3Y,IAtIf,EA4InBwpB,iBAAmB,WAEjB,IAAIxc,EAAWpkB,OAAOwE,WAAiC,IAApBxE,OAAOwE,WAC1C4L,SAASgM,eAAe,YAAYjX,MAAQif,EAC5C,EAAKhlB,MAAMyhC,aAAad,SAAS3b,IAhJhB,EAsJnB0c,aAAe,WAEb,EAAKF,mBACL,EAAKxhC,MAAMyhC,aAAapO,QAvJxB,EAAKrzB,MAAQ,CACXyhC,aAAc,IAHC,E,gEAOE,IAAD,OAClBx/B,KAAKlC,MAAM47B,2BAA2B,CAAE50B,KAAM,WAAYxE,MAAO,KACjEN,KAAKlC,MAAM47B,2BAA2B,CAAE50B,KAAM,SAAUxE,MAAO,KAC/D3B,OAAOigB,iBAAiB,SAAU5e,KAAKy/B,cACvCz/B,KAAKD,SACH,CACEy/B,aAAc,IAAIzH,GAAa,CAC7BE,SAAU,WACV1I,OAAQ,EACRxuB,QAAS,IACT2uB,YAAa,KACbC,YAAa,kBACbC,kBAAmB,kBACnBC,uBAAwB,kBACxBC,kBAAmB,UACnBC,iBAAkB,UAClB6G,WAAY,UACZC,iBAAkB,kBAClB0B,eAAgB,UAChBD,kBAAmB,UACnBxN,kBAAmB9qB,KAAKlC,MAAMgtB,kBAC9BiD,SAAU/tB,KAAKlC,MAAM0N,QAAQuiB,SAC7B5B,QAASnsB,KAAKlC,MAAM0N,QAAQ2gB,QAC5BkB,OAAQrtB,KAAKlC,MAAM0N,QAAQ6hB,OAC3B1B,MAAO3rB,KAAKlC,MAAM0N,QAAQmgB,MAC1Bc,OAAQzsB,KAAKlC,MAAM0N,QAAQihB,OAC3BG,OAAQ5sB,KAAKlC,MAAM0N,QAAQohB,OAC3BiC,MAAO7uB,KAAKlC,MAAM0N,QAAQqjB,MAC1B8J,aACuD,UAArD34B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KACxC9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAC5C,GACN8O,YACuD,SAArD54B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KACxC9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAC5C,GACN+O,aACuD,UAArD74B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KACxC9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAC5C,GACNgP,aACuD,UAArD94B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KACxC9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAC5C,GACN4B,WAAY1rB,KAAKlC,MAAM2rB,iBAAiBiC,WACxC/B,QAAS3pB,KAAKlC,MAAM2rB,iBAAiBE,QACrCoH,kBAAmB/wB,KAAKlC,MAAM0N,QAAQ0K,YACtCwjB,2BAA4B15B,KAAKlC,MAAM47B,2BACvCC,iBAAkB35B,KAAK25B,iBACvBnJ,eAAgBxwB,KAAKlC,MAAM0yB,eAC3B/a,cAAezV,KAAKlC,MAAM0N,QAAQiK,kBAGtC,WACE,EAAKgqB,oB,6CAKTz/B,KAAKlC,MAAM47B,2BAA2B,CAAE50B,KAAM,WAAYxE,MAAO,KACjEN,KAAKlC,MAAM47B,2BAA2B,CAAE50B,KAAM,SAAUxE,MAAO,KAC/DN,KAAKjC,MAAMyhC,aAAa9C,uBACxB/9B,OAAOkgB,oBAAoB,SAAU7e,KAAKy/B,gB,4CAGtBp4B,GACpB,OACErH,KAAKlC,MAAM0N,QAAQ6hB,SAAWhmB,EAAUmE,QAAQ6hB,QAChDrtB,KAAKlC,MAAM0N,QAAQ0e,QAAU7iB,EAAUmE,QAAQ0e,OAC/ClqB,KAAKlC,MAAM0N,QAAQihB,SAAWplB,EAAUmE,QAAQihB,QAChDzsB,KAAKlC,MAAM0N,QAAQohB,SAAWvlB,EAAUmE,QAAQohB,QAChD5sB,KAAKlC,MAAM0N,QAAQqjB,QAAUxnB,EAAUmE,QAAQqjB,OAC/C7uB,KAAKlC,MAAM2rB,iBAAiBC,kBAC1BriB,EAAUoiB,iBAAiBC,iBAC7B1pB,KAAKlC,MAAM2rB,iBAAiBiC,aAC1BrkB,EAAUoiB,iBAAiBiC,YAC7B1rB,KAAKlC,MAAM2rB,iBAAiBE,UAC1BtiB,EAAUoiB,iBAAiBE,SAC7B3pB,KAAKlC,MAAM0N,QAAQ0K,cAAgB7O,EAAUmE,QAAQ0K,aACrDlW,KAAKlC,MAAMs/B,WAAa/1B,EAAU+1B,UAClCp9B,KAAKlC,MAAM6+B,SAAWt1B,EAAUs1B,S,0CAIhBt1B,GACdjH,OAAO9B,KAAK0B,KAAKjC,MAAMyhC,cAAchgC,OAAS,IAChDQ,KAAKjC,MAAMyhC,aAAab,WAAWt3B,EAAUmE,SAC7CxL,KAAKjC,MAAMyhC,aAAaN,cACtB73B,EAAUoiB,iBAAiBiC,YAE7B1rB,KAAKjC,MAAMyhC,aAAaZ,gBAC8B,UAApDv3B,EAAUoiB,iBAAiBC,gBAAgB5kB,KACvCuC,EAAUoiB,iBAAiBC,gBAAgBI,QAC3C,IAEN9pB,KAAKjC,MAAMyhC,aAAaV,eAC8B,SAApDz3B,EAAUoiB,iBAAiBC,gBAAgB5kB,KACvCuC,EAAUoiB,iBAAiBC,gBAAgBI,QAC3C,IAEN9pB,KAAKjC,MAAMyhC,aAAaR,gBAC8B,UAApD33B,EAAUoiB,iBAAiBC,gBAAgB5kB,KACvCuC,EAAUoiB,iBAAiBC,gBAAgBI,QAC3C,IAEN9pB,KAAKjC,MAAMyhC,aAAaP,gBAC8B,UAApD53B,EAAUoiB,iBAAiBC,gBAAgB5kB,KACvCuC,EAAUoiB,iBAAiBC,gBAAgBI,QAC3C,IAEN9pB,KAAKjC,MAAMyhC,aAAaL,UAAU93B,EAAUoiB,iBAAiBE,SAC7D3pB,KAAKjC,MAAMyhC,aAAa7J,cAActuB,EAAUmE,QAAQ0K,aACxDlW,KAAKy/B,eACsB,KAAvBp4B,EAAU+1B,SACZp9B,KAAKjC,MAAMyhC,aAAanE,mBAAmBh0B,EAAU+1B,UACvB,KAArB/1B,EAAUs1B,OACnB38B,KAAKjC,MAAMyhC,aAAanE,mBAAmBh0B,EAAUs1B,OAAQ,UAE7D38B,KAAKjC,MAAMyhC,aAAa9C,0B,+BAgC5B,IAAIgD,EAAa,CACf,mBAAoB,MACpB18B,OAAQ,aACRc,MAAOnF,OAAOwE,WAAiC,IAApBxE,OAAOwE,YAEpC,OACE,6BACE,0CAAQwK,GAAG,YAAe+xB,S,GArKMx/B,IAAMC,WCie9C,SAAS2uB,GAAUC,GACf/uB,KAAKgvB,QAAUD,EAAKC,QACpBhvB,KAAK6uB,MAAQE,EAAKF,MAClB7uB,KAAKmsB,QAAU4C,EAAK5C,QACpBnsB,KAAK2/B,WAAa5Q,EAAK4Q,WACvB3/B,KAAK2rB,MAAQoD,EAAKpD,MAClB3rB,KAAKqW,KAAO0Y,EAAK1Y,KACjBrW,KAAKivB,MAAQF,EAAKE,MAClBjvB,KAAKkvB,MAAQH,EAAKG,MAClBlvB,KAAKmvB,MAAQJ,EAAK4Q,WAAWvT,QAAQ2C,EAAK1Y,KAAK1I,IAAM,EACrD3N,KAAK4/B,WAAa7Q,EAAK5C,QAAQC,QAAQ2C,EAAK1Y,KAAK1I,IAAM,EACvD3N,KAAKovB,YAAcL,EAAKhB,SAAS3B,QAAQpsB,KAAKqW,KAAKyW,UAAU,EAC7D9sB,KAAKqvB,aAAwC,OAAzBrvB,KAAKqW,KAAKgZ,aAAsB,OAAUrvB,KAAKmsB,QAAQC,QAAQpsB,KAAKqW,KAAKgZ,cAAc,EAC3GrvB,KAAKsvB,OAAS,KACdtvB,KAAKuvB,OAASR,EAAKQ,OACnBvvB,KAAKwvB,YAAcT,EAAKS,YACxBxvB,KAAK8D,MAAQ9D,KAAKwvB,YAAwB,IAAXT,EAAKjrB,MAAwB,IAAXirB,EAAKjrB,MACtD9D,KAAKe,QAAUguB,EAAKhuB,QACpBf,KAAKyvB,EAAIV,EAAKU,EACdzvB,KAAK0vB,YAAcX,EAAKW,YACxB1vB,KAAK2vB,YAAcZ,EAAKY,YACxB3vB,KAAK4vB,kBAAoBb,EAAKa,kBAC9B5vB,KAAK6vB,uBAAyBd,EAAKc,uBACnC7vB,KAAK8vB,kBAAoBf,EAAKe,kBAC9B9vB,KAAK+vB,iBAAmBhB,EAAKgB,iBAC7B/vB,KAAKgwB,UAAY,IAAIC,KAAMC,KAC3BlwB,KAAKmwB,gBAAkB,IAAIF,KAAMC,KACjClwB,KAAKowB,KAAO,IAAIH,KAAMC,KACtBlwB,KAAK6pB,SAAWkF,EAAKlF,SACrB7pB,KAAK8qB,kBAAoBiE,EAAKjE,kBAC9B9qB,KAAKqwB,WAAatB,EAAKsB,WACvBrwB,KAAKswB,WAAa,IAAIL,KAAM/C,MAC5BltB,KAAKuwB,UAAY,IAAIN,KAAM/C,MAC3BltB,KAAKwwB,eAAiBzB,EAAKyB,eAC3BxwB,KAAK6/B,UAAY9Q,EAAK8Q,UAEtB7/B,KAAKywB,cAAgB,IAAIR,KAAMS,UAAU,CACrCC,MAAO,CAAC3wB,KAAK8D,MAAO9D,KAAKyvB,EAAE,GAC3B3nB,QAAS,IAAK9H,KAAKmvB,MACnByB,UAAW5wB,KAAK2vB,YAChBzsB,SAAuB,IAAblD,KAAKe,UAEnBf,KAAK6wB,UAAY,IAAIZ,KAAMS,UAAU,CACjCC,MAAO,CAAC3wB,KAAK8D,MAAM9D,KAAKe,QAASf,KAAKyvB,EAAE,GACxCmB,UAAW5wB,KAAK2vB,YAChBzsB,SAAuB,IAAblD,KAAKe,UAEnBf,KAAK8wB,UAAY,IAAIb,KAAMS,UAAU,CACjCC,MAAO,CAAC3wB,KAAK8D,MAAM9D,KAAKe,QAASf,KAAKyvB,EAAe,IAAbzvB,KAAKe,QAAa,GAC1D6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAuB,IAAblD,KAAKe,UAGnBf,KAAK+wB,kBAAoBhC,EAAKgC,kBAET,UAAjB/wB,KAAKqW,KAAKvR,KACV9E,KAAKowB,KAAKT,YAAcZ,EAAKgB,iBACL,YAAjB/vB,KAAKqW,KAAKvR,KACjB9E,KAAKowB,KAAKT,YAAc,UAExB3vB,KAAKowB,KAAKT,YAAcZ,EAAKY,YAEZ,YAAjB3vB,KAAKqW,KAAKvR,OAEV9E,KAAKowB,KAAKY,UAAY,CAAC,GAAI,KAEV,aAAjBhxB,KAAKqW,KAAKvR,OACV9E,KAAKowB,KAAKT,YAAc,WAExB3vB,KAAK6pB,WACL7pB,KAAKowB,KAAKT,YAAcZ,EAAKa,mBAEjC5vB,KAAKowB,KAAKV,YAAc1vB,KAAK0vB,YACF,cAAvB1vB,KAAKqW,KAAK4a,SACVjxB,KAAKowB,KAAKV,YAAoC,IAAtB1vB,KAAKowB,KAAKV,YACJ,UAAvB1vB,KAAKqW,KAAK4a,WACjBjxB,KAAKowB,KAAKV,YAAoC,GAAtB1vB,KAAKowB,KAAKV,aA/iB1CZ,GAAUoC,UAAY,CAClBC,YAAarC,GACbsC,KAAM,WAAY,IAAD,OAIbpxB,KAAKqxB,YAEL,IAAIC,EAAKtxB,KAAKqwB,WAAW,EAAG,GAAKrwB,KAAKsvB,OAAOtvB,KAAKe,QAAQf,KAAKqwB,WAAarwB,KAAKsvB,OAAOtvB,KAAKe,QAAQf,KAAKqwB,WACtGkB,EAAKvxB,KAAK8D,MAOd,GANA9D,KAAKowB,KAAKoB,IAAI,IAAIvB,KAAMwB,MAAMH,EAAItxB,KAAKyvB,IAChB,OAAnBzvB,KAAKqW,KAAKqb,OACVH,EAAgB,IAAXvxB,KAAK8D,MAAWwtB,GAEzBtxB,KAAKowB,KAAKoB,IAAI,IAAIvB,KAAMwB,MAAMF,EAAIvxB,KAAKyvB,IAEnCzvB,KAAK2xB,cAAe,CACpB,IAAIC,EAAS5xB,KAAK6xB,iBAAiB7xB,KAAKqvB,cACxCrvB,KAAKowB,KAAK0B,OAAO,EAAG,IAAI7B,KAAMwB,MAAMzxB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAG0V,IAEvE5xB,KAAKgyB,UAELhyB,KAAKowB,KAAK3xB,KAAO,QAAUuB,KAAKmvB,MAGhCnvB,KAAKgwB,UAAYhwB,KAAKowB,KAAK6B,QAC3BjyB,KAAKgwB,UAAUgB,UAAY,CAAC,EAAG,GAC/BhxB,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAI,EACzG,SAA3Blc,KAAKqW,KAAKgZ,eACVrvB,KAAKgwB,UAAU+B,SAAS,GAAGpB,MAAMzU,EAAIlc,KAAKgwB,UAAU+B,SAAS,GAAGpB,MAAMzU,EAAI,GAE9Elc,KAAKgwB,UAAUL,YAAc3vB,KAAK4vB,kBAClC5vB,KAAKgwB,UAAUN,YAAoC,EAAtB1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUvxB,KAAO,QAAUuB,KAAKmvB,MAAQ,aAC7CnvB,KAAKgwB,UAAUmC,YAAYnyB,KAAKowB,MAE5BpwB,KAAK6pB,WACL7pB,KAAKgwB,UAAUkC,QAAU,IACzBlyB,KAAKgwB,UAAUN,YAAoC,EAAtB1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUL,YAAc,WAGjC3vB,KAAKmwB,gBAAkBnwB,KAAKowB,KAAK6B,QACjCjyB,KAAKmwB,gBAAgBa,UAAY,CAAC,EAAG,GACrChxB,KAAKmwB,gBAAgB4B,SAAS/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAKmwB,gBAAgB4B,SAAS/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAI,EACjI,SAA3Blc,KAAKqW,KAAKgZ,eACVrvB,KAAKmwB,gBAAgB4B,SAAS,GAAGpB,MAAMzU,EAAIlc,KAAKmwB,gBAAgB4B,SAAS,GAAGpB,MAAMzU,EAAI,GAE1Flc,KAAKmwB,gBAAgBR,YAAc3vB,KAAK8vB,kBACxC9vB,KAAKmwB,gBAAgBT,YAAoC,EAAtB1vB,KAAKowB,KAAKV,YAC7C1vB,KAAKmwB,gBAAgB+B,QAAU,EAC/BlyB,KAAKmwB,gBAAgBgC,YAAYnyB,KAAKowB,MAGtCpwB,KAAKoyB,iBACLpyB,KAAKqyB,oBAEL,IAAMC,EAAkBtyB,KAAKqW,KAAKiP,MAAMpW,QAAO,SAACqjB,GAAU,OAAO,EAAK1D,MAAM0D,GAAQC,QAAOC,UACrFC,EAAmB1yB,KAAKivB,MAAM3J,MAAMpW,QAAO,SAACqjB,GAAU,OAAO,EAAK1D,MAAM0D,GAAQC,QAAOC,UACvFE,EAAmB3yB,KAAKkvB,MAAM5J,MAAMpW,QAAO,SAACqjB,GAAU,OAAO,EAAK1D,MAAM0D,GAAQC,QAElFI,EAAQ,EACRC,EAAQ7yB,KAAKyvB,EACbvsB,EAAwB,GAAblD,KAAKe,QAChB+xB,EAAW9yB,KAAKowB,KAAK2C,OAAOjvB,MAAMZ,EAAS,IAI3C0vB,EAFA5yB,KAAK2xB,cAEG3xB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAG5Blc,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAI,GAExClc,KAAKqW,KAAK2c,eAAehrB,SAAS,WAGlC4qB,EAAQ5yB,KAAKswB,WAAWyC,OAAO9gB,MAAM,EAC9BjS,KAAKqW,KAAK2c,eAAehrB,SAAS,WAEzC6qB,GAAsB,GAAb7yB,KAAKe,SAElB,IAAIwJ,EAAOvK,KACPizB,EAAgB,SAASC,GACzB,OAAO,SAASrlB,GACZtD,EAAKimB,eAAe0C,KAG5B,GAAIlzB,KAAK6/B,UAAW,CAEhB,IAAK,IAAI1M,EAAY,EAAGA,EAAYT,EAAiBlzB,OAAQ2zB,IAAa,CACtE,IAAMD,EAAOlzB,KAAK6uB,MAAM6D,EAAiBS,IACnCC,EAAYpzB,KAAKivB,MAAM5D,aAAe,UAAOrrB,KAAKivB,MAAM5D,aAAe,MAAQ6H,EAAK9nB,MAAMioB,OAAO,EAAEP,GAAY,cAAWI,EAAK9nB,MAAMioB,OAAO,EAAEP,GAChJQ,EAAW,IAAIrD,KAAMS,UAAU,CAC/B5oB,QAASsrB,EACTzC,MAAO,CAACiC,EAAOC,EAAQM,GAAwB,GAAbnzB,KAAKe,SAA4B,GAAbf,KAAKe,SAC3D6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAUA,IAEdowB,EAAS7sB,SAAWzG,KAAKwvB,aAAeyD,EAAcC,GACtDlzB,KAAKuwB,UAAUgD,SAASD,GAG5B,IAAK,IAAIH,EAAY,EAAGA,EAAYb,EAAgB9yB,OAAQ2zB,IAAa,CACrE,IAAMD,EAAOlzB,KAAK6uB,MAAMyD,EAAgBa,IAEpCG,EAAW,IAAIrD,KAAMS,UAAU,CAC/B5oB,QAAS,WAAQ9H,KAAKmvB,MAAQ,MAAQ+D,EAAK9nB,MAAMioB,OAAO,EAAEP,GAC1DnC,MAAO,CAACiC,EAAOC,EAAQH,EAAiBlzB,QAAqB,GAAbQ,KAAKe,SAAeoyB,GAAwB,GAAbnzB,KAAKe,SAA4B,GAAbf,KAAKe,SACxG6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAUA,IAEdowB,EAAS7sB,SAAWzG,KAAKwvB,aAAeyD,EAAcC,GACtDlzB,KAAKuwB,UAAUgD,SAASD,GAG5B,IAAK,IAAIH,EAAY,EAAGA,EAAYR,EAAiBnzB,OAAQ2zB,IAAa,CACtE,IAAMD,EAAOlzB,KAAK6uB,MAAM8D,EAAiBQ,IACnCC,EAAYpzB,KAAKkvB,MAAM7D,aAAc,UAAOrrB,KAAKkvB,MAAM7D,aAAe,MAAQ6H,EAAK9nB,MAAMioB,OAAO,EAAEP,GAAY,cAAWI,EAAK9nB,MAAMioB,OAAO,EAAEP,GAC/IQ,EAAW,IAAIrD,KAAMS,UAAU,CAC/B5oB,QAASsrB,EACTzC,MAAO,CAACiC,EAAO5yB,KAAKyvB,EAAI0D,GAAwB,GAAbnzB,KAAKe,SAA4B,GAAbf,KAAKe,SAC5D6vB,UAAW5wB,KAAK2vB,YAChBzsB,SAAUA,IAEdowB,EAAS7sB,SAAWzG,KAAKwvB,aAAeyD,EAAcC,GACtDlzB,KAAKuwB,UAAUgD,SAASD,GAE5BtzB,KAAKuwB,UAAUxF,aAAe,SAASld,GACnCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAKuwB,UAAUtF,aAAe,SAASpd,GACnCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAKrC,OAAO9kB,MAEXyzB,sBAAuB,WAEnB,IAAIlpB,EAAOvK,KACXA,KAAKowB,KAAK3pB,QAAU,SAASoH,GACzBtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEtC7N,KAAKywB,cAAchqB,QAAU,SAASoH,GAClCtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEtC7N,KAAK6wB,UAAUpqB,QAAU,SAASoH,GAC9BtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEtC7N,KAAK8wB,UAAUrqB,QAAU,SAASoH,GAC9BtD,EAAKugB,kBAAkBvgB,EAAK8L,KAAMxI,IAEtC7N,KAAKowB,KAAKrF,aAAe,SAASld,GAC9BkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAKowB,KAAKnF,aAAe,SAASpd,GAC9BkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAKywB,cAAc1F,aAAe,SAASld,GACvCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAKywB,cAAcxF,aAAe,SAASpd,GACvCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAK6wB,UAAU9F,aAAe,SAASld,GACnCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAK6wB,UAAU5F,aAAe,SAASpd,GACnCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAK8wB,UAAU/F,aAAe,SAASld,GACnCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC9kB,KAAK8wB,UAAU7F,aAAe,SAASpd,GACnCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,YAGrC4O,yBAA0B,WAEtB1zB,KAAKowB,KAAK3pB,QAAU,SAASoH,KAC7B7N,KAAKywB,cAAchqB,QAAU,SAASoH,KACtC7N,KAAK6wB,UAAUpqB,QAAU,SAASoH,KAClC7N,KAAK8wB,UAAUrqB,QAAU,SAASoH,KAClC7N,KAAKowB,KAAKrF,aAAe,SAASld,KAClC7N,KAAKowB,KAAKnF,aAAe,SAASpd,KAClC7N,KAAKywB,cAAc1F,aAAe,SAASld,KAC3C7N,KAAKywB,cAAcxF,aAAe,SAASpd,KAC3C7N,KAAK6wB,UAAU9F,aAAe,SAASld,KACvC7N,KAAK6wB,UAAU5F,aAAe,SAASpd,KACvC7N,KAAK8wB,UAAU/F,aAAe,SAASld,KACvC7N,KAAK8wB,UAAU7F,aAAe,SAASpd,MAE3CwkB,kBAAmB,WACXryB,KAAKmvB,MAAM,GAAKnvB,KAAKqW,KAAK2c,eAAehrB,SAAS,SAClDhI,KAAK8/B,aACE9/B,KAAKmvB,MAAM,GAAgC,UAA3BnvB,KAAKqW,KAAK2c,gBACjChzB,KAAK8zB,wBAEL9zB,KAAKmvB,MAAM,GAA8B,SAAzBnvB,KAAKqW,KAAK0pB,cAC1B//B,KAAKggC,cAGbF,WAAY,WACR,IAAI5jB,EAAIlc,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAQpC,GAPIlc,KAAK2xB,eAAiB3xB,KAAKqvB,aAAarvB,KAAKmvB,QACzCnvB,KAAKqvB,aAAa,IAAIrvB,KAAKmvB,MAC3BjT,GAAKlc,KAAK0vB,YAEVxT,EAAIlc,KAAK4zB,gBAAgBxD,KAAK2B,SAAS,GAAGpB,MAAMzU,GAGpDlc,KAAKqW,KAAK2c,eAAehrB,SAAS,WAClC,IAAK,IAAI8N,EAAE,EAAGA,EAAE,EAAGA,IAAK,CACpB,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC5C8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAE,GAAIlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC/C8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,OAEN,GAAIlc,KAAKqW,KAAK2c,eAAehrB,SAAS,YAAa,CACtD,IAAIi4B,EAAgB,GACC,OAAjBjgC,KAAKqW,KAAKqb,OAAauO,EAAgB,GAE3C,IAAK,IAAInqB,EAAE,EAAGA,EAAEmqB,EAAenqB,IAAK,CAChC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC5C8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAE,GAAIlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC/C8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,EAGTA,EAAIlc,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAC1D,IAAK,IAAIpG,EAAE,EAAGA,EAAEmqB,EAAenqB,IAAK,CAChC,IAAI+d,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAE,GAAIlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC/C8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC5C8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,QAIT,KAAOA,GAAMlc,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAE,IAAK,CACtE,IAAI2X,EAAW,IAAI5D,KAAMC,KACzB2D,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC5C8yB,EAASrC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAE,GAAIlc,KAAKyvB,EAAe,GAAbzvB,KAAKe,UAC/C8yB,EAASlE,YAAc,UACvBkE,EAASnE,YAAc,EACvB1vB,KAAKswB,WAAWiD,SAASM,GACzB3X,GAAK,IAKjB8jB,WAAY,WACR,GAAIhgC,KAAK2xB,eAAiB3xB,KAAKqvB,aAAarvB,KAAKmvB,MAE7C,IADA,IAAIjT,EAAIlc,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAC3BpG,EAAE,EAAGA,EAAE,EAAGA,IAAK,CACpB,IAAIoqB,EAAS,IAAIjQ,KAAMC,KACvBgQ,EAAO1O,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAE,EAAGlc,KAAK6xB,iBAAiB7xB,KAAKqvB,cAAc,IACzE6Q,EAAO1O,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAE,EAAGlc,KAAK6xB,iBAAiB7xB,KAAKqvB,cAAc,IACzE6Q,EAAOvQ,YAAc,UACrBuQ,EAAOxQ,YAAc,EACrB1vB,KAAKswB,WAAWiD,SAAS2M,GACzBhkB,GAAK,IAIjB4X,sBAAuB,WACnB,IAAI5X,EAAIlc,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAChClc,KAAK2xB,eAAiB3xB,KAAKqvB,aAAarvB,KAAKmvB,QACzCnvB,KAAKqvB,aAAa,IAAIrvB,KAAKmvB,MAC3BjT,GAAKlc,KAAK0vB,YAEVxT,EAAIlc,KAAK4zB,gBAAgBxD,KAAK2B,SAAS,GAAGpB,MAAMzU,GAGxD,IAAK,IAAIpG,EAAE,EAAGA,EAAE,EAAGA,IAAK,CACpB,IAAIie,EAAa,IAAI9D,KAAMC,KAC3B6D,EAAWvC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAE,KACzCsE,EAAWvC,IAAI,IAAIvB,KAAMwB,MAAMvV,EAAGlc,KAAKyvB,EAAE,KACzCsE,EAAWpE,YAAc,UACzBoE,EAAWrE,YAAc,EACzB1vB,KAAKswB,WAAWiD,SAASQ,GACzB7X,GAAK,IAGbyV,YAAa,WACT,OAAO3xB,KAAKqvB,aAAa,GAE7B2E,cAAe,WACX,OAAOh0B,KAAKgvB,QAAQiF,QAAQj0B,KAAKqvB,eAErCwC,iBAAkB,SAASqC,GACvB,IAAIC,EAAMn0B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,EAEtC,OAAO0E,GADIn0B,KAAKgvB,QAAQiF,QAAQC,GAAgBE,OACjCD,GAAI,GAEvBE,oBAAqB,WACjB,IAAI5E,EAAIzvB,KAAKyvB,EACT6E,EAAWt0B,KAAKu0B,gBACpB,GAAI9E,IAAI6E,EACJ,OAAOA,EACJ,GAAI7E,EAAE6E,EAAU,CACnB,IAAI1jB,EAAM5Q,KAAKw0B,kBAA+B,GAAbx0B,KAAKe,QACtC,OAAO6P,EAGP,OADAA,EAAM5Q,KAAKy0B,aAA0B,GAAbz0B,KAAKe,SAIrC6yB,cAAe,WAEX,OAAO5zB,KAAKgvB,QAAQiF,QAAQj0B,KAAK4/B,WAAW,IAEhDnL,WAAY,WACR,OAAIz0B,KAAKmvB,MAAM,EAAE,EACN,EAEAnvB,KAAKgvB,QAAQiF,QAAQj0B,KAAKmvB,OAAOiB,KAAK2B,SAAS,GAAGpB,MAAMlB,GAGvE+E,gBAAiB,WACb,OAAIx0B,KAAKmvB,MAAM,GAAKnvB,KAAKgvB,QAAQ0F,YACtB,EAEA10B,KAAKgvB,QAAQiF,QAAQj0B,KAAKmvB,MAAM,GAAGM,GAGlDuC,QAAS,WACL,IAAI2C,EAAc3U,KAAK4U,IAAI50B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,EAAIzvB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,GACnFoF,EAAW70B,KAAKowB,KAAK2B,SAAS,GAAGpB,MACrC,GAAI3wB,KAAK2xB,cAAgB,CACrB,IAAImD,EAAkB9U,KAAK4U,IAAI50B,KAAKqvB,aAAervB,KAAKmvB,OAExDnvB,KAAKowB,KAAK2E,cAAc,GAExB,IAAIC,EAAQH,EAAS3Y,EAAI,GACrB+Y,EAASD,EAAQh1B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMzU,EAC7CgZ,EAAK,IAAIjF,KAAMkF,QAAQ,IAAIlF,KAAMwB,MAAMuD,EAAOH,EAASpF,GAAI,IAAIQ,KAAMwB,OAAOwD,EAAO,GAAI,MAG3F,GAFAj1B,KAAKowB,KAAK0B,OAAO,EAAGoD,GAEhBJ,EAAkB,EAAG,CAErB,IAAIM,EAAYp1B,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,EAAIzvB,KAAKowB,KAAK2B,SAAS,GAAGpB,MAAMlB,GAAI,EAAI,EAChF4F,EAAWr1B,KAAKowB,KAAK2B,SAAS,GAAGpB,MACrC3wB,KAAKowB,KAAK2E,cAAc,GACxB,IAAIO,EAAK,IAAIrF,KAAMkF,QAAQ,IAAIlF,KAAMwB,MAAM4D,EAASnZ,EAAGmZ,EAAS5F,GAAI,KAAM,IAAIQ,KAAMwB,MAAM,EAAE2D,EAAWT,IACvG30B,KAAKowB,KAAK0B,OAAO,EAAGwD,MAIhCjE,UAAW,WACPrxB,KAAKsvB,OAAStvB,KAAKqW,KAAKsY,UACpB3uB,KAAK2xB,eAAgD,MAA/B3xB,KAAKg0B,gBAAgB1E,OAE3CtvB,KAAKsvB,OAAStvB,KAAKg0B,gBAAgB1E,OAC5BtvB,KAAKu1B,oBACZv1B,KAAKsvB,OAAUtvB,KAAK4zB,gBAAgBtE,OAAO,EACpCtvB,KAAK4/B,WAAW,GAAK5/B,KAAKovB,cAAgBpvB,KAAK4zB,gBAAgBxE,cAEtEpvB,KAAKsvB,OAAStvB,KAAK4zB,gBAAgBtE,SAG3CiG,kBAAmB,WACf,IAAI4K,EAAiBngC,KAAK2/B,WAAW3/B,KAAK2/B,WAAWvT,QAAQpsB,KAAKqW,KAAK1I,IAAI,GAC3E,IAAKwyB,EAAgB,OAAO,EAC5B,IAAIC,EAAepgC,KAAK2rB,MAAMwU,GAC9B,OAAQngC,KAAKmvB,MAAM,GAAiC,OAA5BiR,EAAa/Q,cAAwBrvB,KAAK2/B,WAAWvT,QAAQgU,EAAa/Q,cAAc,EAAGrvB,KAAKmvB,OAE5HoF,cAAe,WAEX,OADiBv0B,KAAKgvB,QAAQwG,cAAcpB,OACzBp0B,KAAKe,SAAS,GAErCqzB,KAAM,WACF,OAAOp0B,KAAKyvB,GAEhBgG,SAAU,WACNz1B,KAAKowB,KAAKT,YAAc3vB,KAAK4vB,kBAC7B5vB,KAAKgwB,UAAUkC,QAAU,IACzBlyB,KAAKgwB,UAAUN,YAAoC,EAAtB1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUL,YAAc,WAEjC+F,WAAY,WACR11B,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUN,YAAc1vB,KAAKowB,KAAKV,YACvC1vB,KAAKgwB,UAAUL,YAAc3vB,KAAK4vB,kBAEb,UAAjB5vB,KAAKqW,KAAKvR,KACV9E,KAAKowB,KAAKT,YAAc3vB,KAAK+vB,iBACL,YAAjB/vB,KAAKqW,KAAKvR,KACjB9E,KAAKowB,KAAKT,YAAc,UAExB3vB,KAAKowB,KAAKT,YAAc3vB,KAAK2vB,aAGrCgG,cAAe,SAAS5E,GACpB/wB,KAAK+wB,kBAAoBA,EACzB/wB,KAAKoyB,kBAETA,eAAgB,WAAY,IAAD,OACjBwD,EAAc,GACdC,EAAc,GAChB71B,KAAK+wB,kBAAkB3a,OACnBpW,KAAK+wB,kBAAkB3a,KAAKiV,eACxBrrB,KAAKivB,MAAM5D,cAAcuK,EAAYhuB,KAAK5H,KAAKivB,MAAM5D,cACrDrrB,KAAKkvB,MAAM7D,cAAcwK,EAAYjuB,KAAK5H,KAAKkvB,MAAM7D,eAEzDrrB,KAAK+wB,kBAAkB3a,KAAK0f,cACxB91B,KAAKivB,MAAM6G,aAAaF,EAAYhuB,KAAK5H,KAAKivB,MAAM6G,aACpD91B,KAAKkvB,MAAM4G,aAAaD,EAAYjuB,KAAK5H,KAAKkvB,MAAM4G,cAExD91B,KAAK+wB,kBAAkB3a,KAAK2f,UAC5BH,EAAYhuB,KAAK5H,KAAKivB,MAAM8G,SAC5BF,EAAYjuB,KAAK5H,KAAKkvB,MAAM6G,WAKpC,IAFA,IAAIE,EAAe,GACfC,EAAe,GACVpgB,EAAE,EAAGA,EAAE8f,EAAYp2B,OAAQsW,IAChCmgB,EAAeA,EAAeL,EAAY9f,GAAK,MAEnD,IAAK,IAAIA,EAAE,EAAGA,EAAE+f,EAAYr2B,OAAQsW,IAChCogB,EAAeA,EAAeL,EAAY/f,GAAK,MAInD,IAIMugB,EAAwBr2B,KAAK+wB,kBAAkB3a,KAAMhW,OAAO9B,KAAK0B,KAAK+wB,kBAAkB3a,MAAMkgB,QAJpF,SAACF,EAAKjnB,GAClB,OAAI,EAAK4hB,kBAAkB3a,KAAKjH,GAAainB,EAAI,EAC1CA,IAEwG,GAAK,EAE5F,IAAxBC,GACuB,OAAnBr2B,KAAKqW,KAAKqb,OAEV1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAmB,EAAb9D,KAAKe,QAC1Ef,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAmB,IAAb9D,KAAKe,QACpFf,KAAKmwB,gBAAgB4B,SAAS/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAmB,IAAb9D,KAAKe,SAEpGf,KAAKywB,cAAcxiB,IAAI,CAAC0iB,MAAO,CAAC3wB,KAAK8D,MAAmB,IAAb9D,KAAKe,QAAaf,KAAKywB,cAAcE,MAAMlB,KACtFzvB,KAAK6wB,UAAU5iB,IAAI,CAAC0iB,MAAM,CAAC3wB,KAAKywB,cAAcsC,OAAO9gB,MAAmB,GAAbjS,KAAKe,QAAaf,KAAK6wB,UAAUF,MAAMlB,GAAI3nB,QAASmuB,IAC/Gj2B,KAAK8wB,UAAU7iB,IAAI,CAAC0iB,MAAM,CAAC3wB,KAAKywB,cAAcsC,OAAO9gB,MAAmB,GAAbjS,KAAKe,QAAaf,KAAK8wB,UAAUH,MAAMlB,GAAI3nB,QAASouB,KAChF,IAAxBG,GACgB,OAAnBr2B,KAAKqW,KAAKqb,OAEV1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAmB,EAAb9D,KAAKe,QAC1Ef,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAmB,IAAb9D,KAAKe,QACpFf,KAAKmwB,gBAAgB4B,SAAS/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAmB,IAAb9D,KAAKe,SAEpGf,KAAKywB,cAAcxiB,IAAI,CAAC0iB,MAAO,CAAC3wB,KAAK8D,MAAmB,IAAb9D,KAAKe,QAAaf,KAAKywB,cAAcE,MAAMlB,KACtFzvB,KAAK6wB,UAAU5iB,IAAI,CAAC0iB,MAAM,CAAC3wB,KAAKywB,cAAcsC,OAAO9gB,MAAmB,GAAbjS,KAAKe,QAAaf,KAAK6wB,UAAUF,MAAMlB,GAAI3nB,QAASmuB,IAC/Gj2B,KAAK8wB,UAAU7iB,IAAI,CAAC0iB,MAAM,CAAC3wB,KAAKywB,cAAcsC,OAAO9gB,MAAmB,GAAbjS,KAAKe,QAAaf,KAAK8wB,UAAUH,MAAMlB,GAAI3nB,QAASouB,KAElF,IAAxBG,GACkB,OAAnBr2B,KAAKqW,KAAKqb,OAEV1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAQ9D,KAAKe,QAC5Ef,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAqB,GAAb9D,KAAKe,QACtFf,KAAKmwB,gBAAgB4B,SAAS/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAqB,GAAb9D,KAAKe,SAEtGf,KAAKywB,cAAcxiB,IAAI,CAAC0iB,MAAO,CAAC3wB,KAAK8D,MAAmB,GAAb9D,KAAKe,QAAaf,KAAKywB,cAAcE,MAAMlB,KACtFzvB,KAAK6wB,UAAU5iB,IAAI,CAAC0iB,MAAM,CAAC3wB,KAAKywB,cAAcsC,OAAO9gB,MAAmB,GAAbjS,KAAKe,QAAaf,KAAK6wB,UAAUF,MAAMlB,GAAI3nB,QAASmuB,IAC/Gj2B,KAAK8wB,UAAU7iB,IAAI,CAAC0iB,MAAM,CAAC3wB,KAAKywB,cAAcsC,OAAO9gB,MAAmB,GAAbjS,KAAKe,QAAaf,KAAK8wB,UAAUH,MAAMlB,GAAI3nB,QAASouB,MAGxF,OAAnBl2B,KAAKqW,KAAKqb,OACV1xB,KAAKowB,KAAK2B,SAAS/xB,KAAKowB,KAAK2B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAC/D9D,KAAKgwB,UAAU+B,SAAS/xB,KAAKgwB,UAAU+B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAQ,EACjF9D,KAAKmwB,gBAAgB4B,SAAS/xB,KAAKmwB,gBAAgB4B,SAASvyB,OAAO,GAAGmxB,MAAMzU,EAAIlc,KAAK8D,MAAQ,GAEjG9D,KAAKywB,cAAcxiB,IAAI,CAAC0iB,MAAO,CAAC3wB,KAAK8D,MAAM,GAAI9D,KAAKywB,cAAcE,MAAMlB,QAsFrEX,UCzdf,SAASyH,GAAWxH,GAClB/uB,KAAKgvB,QAAUD,EAAKC,QACpBhvB,KAAKgR,MAAQ+d,EAAK/d,MAClBhR,KAAKw2B,WAAazH,EAAKsR,YAAYjU,QAAQ2C,EAAK/d,MAAMrD,IAAI,EAC1D3N,KAAKyvB,EAAIV,EAAKU,EACdzvB,KAAKkc,EAAI6S,EAAK7S,EACdlc,KAAK8D,MAAQirB,EAAKjrB,MAClB9D,KAAK22B,YAAc5H,EAAK4H,YACxB32B,KAAK6pB,SAAWkF,EAAKlF,SACrB7pB,KAAKgwB,UAAY,IAAIC,KAAMC,KAC3BlwB,KAAKmwB,gBAAkB,IAAIF,KAAMC,KACjClwB,KAAKowB,KAAO,IAAIH,KAAMC,KACtBlwB,KAAK42B,WAAa7H,EAAK6H,WACvB52B,KAAK62B,iBAAmB9H,EAAK8H,iBAC7B72B,KAAK6B,UAAYktB,EAAKltB,UACtB7B,KAAK82B,YAAc/H,EAAK+H,YACxB92B,KAAK8qB,kBAAoBiE,EAAKjE,kBAC9B9qB,KAAK+wB,kBAAoB,GACzB/wB,KAAKwvB,YAAcT,EAAKS,YACxBxvB,KAAK2O,KAAO,IAAIshB,KAAMS,UAAU,CAC9BC,MAAO,CAAC3wB,KAAKkc,EAAe,GAAb6S,EAAKhuB,QAAaf,KAAKyvB,EAAe,GAAbV,EAAKhuB,SAC7C6vB,UAAW5wB,KAAK6B,UAChBqB,SAAuB,IAAb6rB,EAAKhuB,UAEjBf,KAAK21B,cAAc5G,EAAKgC,mBAnH1BwF,GAAWrF,UAAY,CACrBC,YAAaoF,GACbnF,KAAM,WAEJ,IAAI2F,EAAY,IAAI9G,KAAM+G,UACxB,IAAI/G,KAAMwB,MAAMzxB,KAAKkc,EAAE,GAAIlc,KAAKyvB,GAChC,IAAIQ,KAAMgH,KAAKj3B,KAAK8D,MAAM9D,KAAKkc,EAAE,GAAIlc,KAAK22B,cAExC32B,KAAKwvB,cACPuH,EAAY,IAAI9G,KAAM+G,UACpB,IAAI/G,KAAMwB,MAAMzxB,KAAKkc,EAAE,GAAIlc,KAAKyvB,GAChC,IAAIQ,KAAMgH,KAAKj3B,KAAK8D,MAAM9D,KAAKkc,EAAGlc,KAAK22B,eAG3C,IAAIO,EAAqBH,EAAU9E,QACnCiF,EAAmBjpB,IACf,IAAIgiB,KAAMwB,MAAMzxB,KAAKkc,EAAGlc,KAAKyvB,EAAE,IAC/B,IAAIQ,KAAMgH,KAAKj3B,KAAK8D,MAAM9D,KAAKkc,EAAGlc,KAAK22B,YAAY,KAIvD32B,KAAKowB,KAAO,IAAIH,KAAMC,KAAK8G,UAAUD,GACjC/2B,KAAK6pB,SACP7pB,KAAKowB,KAAKQ,UAAY5wB,KAAK62B,iBAE3B72B,KAAKowB,KAAKQ,UAAY5wB,KAAK42B,WAEzB52B,KAAKgR,MAAM2d,UAAU,IAAI,IAC3B3uB,KAAKowB,KAAKQ,UAAUuG,YAAc,KAEpCn3B,KAAKowB,KAAK3xB,KAAO,SAAWuB,KAAKw2B,WAGjCx2B,KAAKgwB,UAAY,IAAIC,KAAMC,KAAK8G,UAAUE,GAC1Cl3B,KAAKgwB,UAAUY,UAAY,IAAIX,KAAMmH,MAAM,IAAI,IAAO,IAAI,IAAO,IAAI,IAAO,GAC5Ep3B,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUvxB,KAAO,SAAWuB,KAAKw2B,WAAa,aACnDx2B,KAAKgwB,UAAUmC,YAAYnyB,KAAKowB,MAEhCpwB,KAAKmwB,gBAAkB,IAAIF,KAAMC,KAAK8G,UAAUE,GAChDl3B,KAAKmwB,gBAAgBS,UAAY5wB,KAAK82B,YACtC92B,KAAKmwB,gBAAgB+B,QAAU,EAC/BlyB,KAAKmwB,gBAAgBgC,YAAYnyB,KAAKowB,MAGtCH,KAAMzkB,QAAQ6rB,YAAYC,YAAY,EAAGt3B,KAAKgwB,WAC9CC,KAAMzkB,QAAQ6rB,YAAYC,YAAY,EAAGt3B,KAAKmwB,kBAEhDsD,sBAAuB,WAErB,IAAIlpB,EAAOvK,KACXA,KAAKowB,KAAK3pB,QAAU,SAASoH,GACzBtD,EAAKugB,kBAAkBvgB,EAAKyG,MAAOnD,IAEvC7N,KAAKowB,KAAKrF,aAAe,SAASld,GAChCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAE/B9kB,KAAKowB,KAAKnF,aAAe,SAASpd,GAC9BkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,YAGnC4O,yBAA0B,WACxB1zB,KAAKowB,KAAK3pB,QAAU,SAASoH,KAC7B7N,KAAKowB,KAAKrF,aAAe,SAASld,KAClC7N,KAAKowB,KAAKnF,aAAe,SAASpd,MAEpC4nB,SAAU,WACRz1B,KAAKowB,KAAKQ,UAAY5wB,KAAK62B,iBAC3B72B,KAAK6pB,UAAW,EAChB7pB,KAAKgwB,UAAUkC,QAAU,IACzBlyB,KAAKgwB,UAAUY,UAAY,WAE7B8E,WAAY,WACV11B,KAAKowB,KAAKQ,UAAY5wB,KAAK42B,WACvB52B,KAAKgR,MAAM2d,UAAU,IAAI,IAC3B3uB,KAAKowB,KAAKQ,UAAUuG,YAAc,KAEpCn3B,KAAK6pB,UAAW,EAChB7pB,KAAKgwB,UAAUkC,QAAU,EACzBlyB,KAAKgwB,UAAUY,UAAY,IAAIX,KAAMmH,MAAM,IAAI,IAAO,IAAI,IAAO,IAAI,IAAO,IAE9EzB,cAAe,SAAS5E,GACtB/wB,KAAK+wB,kBAAoBA,EACzB,IAAI6G,EAAY53B,KAAKgR,MAAMlM,KAAO,IAAM9E,KAAKw2B,WACzCx2B,KAAK+wB,mBAAqB/wB,KAAK+wB,kBAAkB3lB,QAAOwsB,EAAYA,EAAY,KAAO53B,KAAKgR,MAAM5F,OACtGpL,KAAK2O,KAAKV,IAAI,CACZnG,QAAS8vB,MA+BArB,UC2ff,SAASwB,GAAahJ,GAClB/uB,KAAKg4B,OAASjpB,SAASgM,eAAegU,EAAKkJ,UAC3ChI,KAAMiI,MAAMl4B,KAAKg4B,QACjBh4B,KAAKm4B,KAAO,KACZn4B,KAAKqgC,YAActR,EAAKsR,YACxBrgC,KAAK2/B,WAAa5Q,EAAK4Q,WACvB3/B,KAAK+tB,SAAWgB,EAAKhB,SACrB/tB,KAAKmsB,QAAU4C,EAAK5C,QACpBnsB,KAAKqtB,OAAS0B,EAAK1B,OACnBrtB,KAAK2rB,MAAQoD,EAAKpD,MAClB3rB,KAAKysB,OAASsC,EAAKtC,OACnBzsB,KAAK4sB,OAASmC,EAAKnC,OACnB5sB,KAAK6uB,MAAQE,EAAKF,MAClB7uB,KAAKuvB,OAASR,EAAKQ,OACnBvvB,KAAK8D,MAAQmsB,KAAMmI,KAAKC,SAASv0B,MACjC9D,KAAKe,QAAUf,KAAK8D,MAAMirB,EAAKhuB,QAC/Bf,KAAK0vB,YAAc1vB,KAAK8D,MAAMirB,EAAKW,YACnC1vB,KAAK2vB,YAAcZ,EAAKY,YACxB3vB,KAAK4vB,kBAAoBb,EAAKa,kBAC9B5vB,KAAK+vB,iBAAmBhB,EAAKgB,iBAC7B/vB,KAAK6vB,uBAAyBd,EAAKc,uBACnC7vB,KAAKs4B,kBAAoBvJ,EAAKuJ,kBAC9Bt4B,KAAK42B,WAAa7H,EAAK6H,WACvB52B,KAAK62B,iBAAmB9H,EAAK8H,iBAC7B72B,KAAKu4B,eAAiBxJ,EAAKwJ,eAC3Bv4B,KAAK8qB,kBAAoBiE,EAAKjE,kBAC9B9qB,KAAKw4B,YAAc,IAAIvI,KAAM/C,MAC7BltB,KAAKy4B,YAAc,IAAIxI,KAAM/C,MAC7BltB,KAAK04B,eAAiB,IAAIzI,KAAM/C,MAChCltB,KAAK24B,aAAe5J,EAAK4J,aACzB34B,KAAK44B,YAAc7J,EAAK6J,YACxB54B,KAAK64B,aAAe9J,EAAK8J,aACzB74B,KAAK84B,aAAe/J,EAAK+J,aACzB94B,KAAK+4B,YAAc,GACnB/4B,KAAKg5B,YAAc,GACnBh5B,KAAKi5B,OAAS,GACdj5B,KAAKk5B,QAAU,GACfl5B,KAAKm5B,YAAc,GACnBn5B,KAAK0rB,WAAaqD,EAAKrD,WACvB1rB,KAAKo5B,YAAc,GACnBp5B,KAAKq5B,YAAc,GACnBr5B,KAAK2pB,QAAUoF,EAAKpF,QACpB3pB,KAAK8vB,kBAAoBf,EAAKe,kBAC9B9vB,KAAK+wB,kBAAoBhC,EAAKgC,kBAC9B/wB,KAAKwvB,YAAcT,EAAKS,YACxBxvB,KAAKs5B,eAAiB,IAAIrJ,KAAMC,KAChClwB,KAAKu5B,iBAAmB,IAAItJ,KAAM/C,MAClCltB,KAAKw5B,qBAAuB,IAAIvJ,KAAM/C,MACtCltB,KAAKy5B,YAAc,IAAIxJ,KAAM/C,MAC7BltB,KAAK05B,2BAA6B3K,EAAK2K,2BACvC15B,KAAK25B,iBAAmB5K,EAAK4K,iBAC7B35B,KAAK45B,oBAAqB,EAC1B55B,KAAK65B,2BAA6B,EAClC75B,KAAK85B,cAAe,EACpB95B,KAAKwwB,eAAiBzB,EAAKyB,eAC3BxwB,KAAKmsB,QAAU4C,EAAK5C,QACpBnsB,KAAK6/B,UAAY9Q,EAAK8Q,UAEtB,IAAIt1B,EAAOvK,KAEXiwB,KAAMmI,KAAK2B,QAAU,SAASlsB,GAC1B,IAAK,IAAIiI,EAAE,EAAGA,EAAEvL,EAAK6uB,YAAY55B,OAAQsW,IACrCvL,EAAK6uB,YAAYtjB,GAAGka,UAAUkC,QAAUlS,KAAKzO,IAAI,GAAMhH,EAAK6uB,YAAYtjB,GAAGka,UAAUkC,QAAQ,KAEjG,IAAK,IAAIpc,EAAE,EAAGA,EAAEvL,EAAK8uB,YAAY75B,OAAQsW,IACrCvL,EAAK8uB,YAAYvjB,GAAGka,UAAUkC,QAAUlS,KAAKzO,IAAI,GAAMhH,EAAK8uB,YAAYvjB,GAAGka,UAAUkC,QAAQ,KAE7F3nB,EAAKqvB,qBACDrvB,EAAKuvB,cACLvvB,EAAKivB,qBAAqBvuB,SAASiR,GAAK,GACpC3R,EAAKivB,qBAAqBvuB,SAASiR,EAAI3R,EAAKsvB,2BAA2B,KACvEtvB,EAAKuvB,cAAe,KAGxBvvB,EAAKivB,qBAAqBvuB,SAASiR,GAAK,GACpC3R,EAAKivB,qBAAqBvuB,SAASiR,EAAI3R,EAAKsvB,6BAC5CtvB,EAAKuvB,cAAe,MAzrBxC/B,GAAa7G,UAAY,CACrBC,YAAa4G,GACbiC,YAAa,SAAShpB,GAClB,IAAI2mB,EAAI,IAAIpB,GAAW,CACnBvH,QAAShvB,KACTgR,MAAOA,EACPqvB,YAAargC,KAAKqgC,YAClB5Q,EAAGzvB,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQpb,EAAMrD,KAC5CuO,GAAIlL,EAAM2d,UAAU,GAAI3uB,KAAKe,QAC7B+C,MAAO9D,KAAK8D,MACZ6yB,YAAa32B,KAAKi6B,eAAejpB,GACjC6Y,SAAU7pB,KAAK24B,aAAa3wB,SAASgJ,EAAMrD,IAC3CipB,WAAY52B,KAAK42B,WACjBC,iBAAkB72B,KAAK62B,iBACvBC,YAAa92B,KAAK8vB,kBAClBhF,kBAAmB9qB,KAAK8qB,kBACxBjpB,UAAW7B,KAAKu4B,eAChBxH,kBAAmB/wB,KAAK+wB,kBAAkB/f,MAC1Cwe,YAAaxvB,KAAKwvB,YAClBzuB,QAASf,KAAKe,UAGlB42B,EAAEvG,OACFuG,EAAElE,wBAGFzzB,KAAKy4B,YAAYlF,SAASoE,EAAExH,iBAC5BnwB,KAAKy4B,YAAYlF,SAASoE,EAAE3H,WAC5BhwB,KAAKy4B,YAAYlF,SAASoE,EAAEvH,MAC5BpwB,KAAKy4B,YAAYlF,SAASoE,EAAEhpB,MAC5B3O,KAAKg5B,YAAYpxB,KAAK+vB,GAGlB33B,KAAK0rB,WAAWpV,OAAOtO,SAASgJ,EAAMrD,KACtC3N,KAAKq5B,YAAYzxB,KAAK+vB,IAI9BuC,WAAY,SAAS7jB,GACjB,IAAI8jB,EAAI,IAAIrL,GAAU,CAClBE,QAAShvB,KACTuvB,OAAQvvB,KAAKuvB,OACbzrB,MAAO9D,KAAK8D,MACZ/C,QAASf,KAAKe,QACd2uB,YAAa1vB,KAAK0vB,YAAc1P,KAAKzO,IAAI,EAAKvR,KAAKm5B,YAAYn5B,KAAKmsB,QAAQC,QAAQ/V,EAAK1I,IAAI,IAC7FgiB,YAAa3vB,KAAK2vB,YAClBC,kBAAmB5vB,KAAK4vB,kBACxBC,uBAAwB7vB,KAAK6vB,uBAC7BE,iBAAkB/vB,KAAK+vB,iBACvB1Z,KAAMA,EACN4Y,MAAOjvB,KAAKysB,OAAOpW,EAAKqW,SACxBwC,MAAOlvB,KAAK4sB,OAAOvW,EAAKwW,SACxBkB,SAAU/tB,KAAK+tB,SACf5B,QAASnsB,KAAKmsB,QACdwT,WAAY3/B,KAAK2/B,WACjBtS,OAAQrtB,KAAKqtB,OACb1B,MAAO3rB,KAAK2rB,MACZkD,MAAO7uB,KAAK6uB,MACZY,EAAGzvB,KAAKi5B,OAAOj5B,KAAKmsB,QAAQC,QAAQ/V,EAAK1I,KACzCkc,SAAU7pB,KAAK44B,YAAY5wB,SAASqO,EAAK1I,KAAO3N,KAAK64B,aAAa7wB,SAASqO,EAAKqW,UAAY1sB,KAAK84B,aAAa9wB,SAASqO,EAAKwW,SAC5HuN,eAAgBp6B,KAAKo6B,eACrBtP,kBAAmB9qB,KAAK8qB,kBACxBuF,WAAYrwB,KAAKm5B,YAAYn5B,KAAKmsB,QAAQC,QAAQ/V,EAAK1I,IAAI,GAC3DmiB,kBAAmB9vB,KAAK8vB,kBACxBiB,kBAAmB/wB,KAAK+wB,kBACxBvB,YAAaxvB,KAAKwvB,YAClBgB,eAAgBxwB,KAAKwwB,eACrBqP,UAAW7/B,KAAK6/B,YAYpB,OAVA7/B,KAAK+4B,YAAYnxB,KAAKuyB,GACtBn6B,KAAKw4B,YAAYjF,SAAS4G,EAAE/J,MAC5BpwB,KAAKw4B,YAAYjF,SAAS4G,EAAE1J,eAC5BzwB,KAAKw4B,YAAYjF,SAAS4G,EAAEtJ,WAC5B7wB,KAAKw4B,YAAYjF,SAAS4G,EAAErJ,WAC5B9wB,KAAKw4B,YAAYjF,SAAS4G,EAAE7J,YAC5BtwB,KAAKw4B,YAAYjF,SAAS4G,EAAE5J,WACxBvwB,KAAK0rB,WAAWza,OAAOjJ,SAASqO,EAAK1I,KACrC3N,KAAKo5B,YAAYxxB,KAAKuyB,GAEnBA,GAEX/I,KAAM,WAEFpxB,KAAKi5B,OAAS,GACdj5B,KAAKk5B,QAAU,GACfl5B,KAAK+4B,YAAc,GACnB/4B,KAAKg5B,YAAc,GACnBh5B,KAAKq5B,YAAc,GACnBr5B,KAAKo5B,YAAc,GACnBp5B,KAAKw4B,YAAY6B,iBACjBr6B,KAAKy4B,YAAY4B,iBACjBr6B,KAAK04B,eAAe2B,iBACpBr6B,KAAKy5B,YAAYY,iBAGjB,IAAIC,EAAW,EACXC,EAAkB,KACtB,IAAK,IAAIzkB,KAAK9V,KAAK+tB,SAAU,CACzB,IAAMW,EAAU1uB,KAAK+tB,SAASjY,GACxB9E,EAAQhR,KAAKqtB,OAAOqB,GAC1B,GAAwB,IAApB1d,EAAM2d,UAAiB,CAEvB,GADA2L,EAAW,EACPxkB,EAAE,GAAKykB,EAAiB,CACxB,IAAMC,EAAuBx6B,KAAKy6B,cAAcF,GAC1C5L,EAAY6L,EAAsBA,EAAqB7L,UAAW,EAAI,EAC5E2L,GAAsBt6B,KAAKe,QAAS4tB,EAExC3uB,KAAKk5B,QAAQtxB,KAAK0yB,GAClBA,EAAWt6B,KAAK06B,YAAY1pB,EAAM0c,UAAW4M,EAAUt6B,KAAKe,SAE/B,IAAzBiQ,EAAM0c,UAAUluB,SAChB86B,GAAsBt6B,KAAKe,SAE/Bw5B,EAAkB7L,GAhCb,qBAqCO1uB,KAAK+tB,UArCZ,IAqCb,2BAAmC,CAAC,IAA3BW,EAA0B,QACzB1d,EAAQhR,KAAKqtB,OAAOqB,GAC1B1uB,KAAKg6B,YAAYhpB,IAvCR,mDA2CMhR,KAAKmsB,SA3CX,IA2Cb,2BAAiC,CAAC,IAAzBwO,EAAwB,QAC7B36B,KAAKk6B,WAAWl6B,KAAK2rB,MAAMgP,KA5ClB,8BA+Cb36B,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GACtBA,EAAK+a,OACL/a,EAAKod,2BAITzzB,KAAK86B,aAGL96B,KAAK+6B,cACL/6B,KAAKg7B,aAELh7B,KAAK04B,eAAenF,SAASvzB,KAAKy4B,aAClCz4B,KAAK04B,eAAenF,SAASvzB,KAAKw4B,aAClCx4B,KAAK04B,eAAenF,SAASvzB,KAAKy5B,aAClCz5B,KAAK04B,eAAenF,SAASvzB,KAAKu5B,kBAElCv5B,KAAK04B,eAAeztB,SAASwkB,GAAK,GAClCzvB,KAAKi7B,aAETI,mBAAoB,SAAS3M,GAA2B,IAAD,OAAjB5pB,EAAiB,uDAAZ,WAEvC9E,KAAKy5B,YAAYY,iBACjBr6B,KAAKu5B,iBAAiBc,iBACtBr6B,KAAKw5B,qBAAqBa,iBAE1Br6B,KAAK45B,oBAAqB,EACtB55B,KAAKm4B,MAAMn4B,KAAKm4B,KAAKmD,SACzBt7B,KAAKm4B,KAAO,IAAIlI,KAAMsL,KACtBv7B,KAAKm4B,KAAKqD,YAAY,EACtB,IAAIL,EAAU,GAGdn7B,KAAKg5B,YAAYjoB,SAAQ,SAACC,GAAD,OAASA,EAAM0iB,8BACxC1zB,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GAAD,OAAQA,EAAKqd,8BACtC3kB,SAASykB,KAAK7vB,MAAMmhB,OAAS,YAE7B9kB,KAAKy7B,gBAAgB/M,EAAS5pB,GAE9B9E,KAAKm4B,KAAKuD,YAAc,SAAC7tB,GACrB,EAAKyrB,eAAiB,IAAIrJ,KAAMC,KAChC,EAAKoJ,eAAe3J,YAAc,EAAK2I,kBACvC,EAAKgB,eAAe5J,YAAc,EAClC,EAAK4J,eAAe9H,IAAI3jB,EAAM8iB,OAC9B,EAAK4I,iBAAiBhG,SAAS,EAAK+F,iBAExCt5B,KAAKm4B,KAAKwD,UAAY,SAAC9tB,GAQnB,GANA,EAAK0rB,iBAAiBc,iBAEtB,EAAKtB,YAAYhoB,SAAQ,SAACsF,GACtBA,EAAKqf,gBAET,EAAKgE,2BAA2B,CAAC50B,KAAMA,EAAMxE,MAAO,KAChD66B,EAAQ37B,OAAO,EAAG,CAClB,IAAIo8B,EAAcT,EAAQ,GACtBU,EAAcV,EAAQA,EAAQ37B,OAAO,GACzC,EAAKm6B,iBAAiBiC,EAAYvlB,KAAKyW,SAAUhoB,EAAM,CAAC82B,EAAYvlB,KAAK1I,GAAIkuB,EAAYxlB,KAAK1I,SAInF,aAAP7I,EACA,EAAKi2B,cAEL,EAAKC,cAIjBh7B,KAAKm4B,KAAK2D,YAAc,SAACjuB,GAEhB,EAAKyrB,eAAevH,SAAS,GAG9B,EAAKuH,eAAevH,SAAS,GAAGpB,MAAQ9iB,EAAM8iB,MAF9C,EAAK2I,eAAe9H,IAAI3jB,EAAM8iB,OAIlCwK,EAAU,GAEU,EAAKnC,YAAYxpB,MAAK,SAACsoB,GAAU,OAAQA,EAAO9mB,MAAMrD,KAAK+gB,KACnE1d,MAAM0c,UAAU3c,SAAQ,SAAC4c,GACjC,GAAyB,MAArBA,EAASzC,OAAO,GAAU,CAC1B,IAAM7U,EAAO,EAAK4d,QAAQ,EAAK9H,QAAQC,QAAQ,EAAKT,MAAMgC,GAAUhgB,IAAI,GACpE0I,EAAKsb,gBAAkB,EAAK2H,eAAe8B,iBAAiB/kB,EAAK+Z,MAAM5wB,OAAO,GAClF,EAAK85B,eAAe8B,iBAAiB/kB,EAAK2d,gBAAgB5D,MAAM5wB,OAAO,IACnE6W,EAAK+Z,KAAKT,YAAc,UACxBtZ,EAAK2d,gBAAgB5D,KAAKT,YAAc,UAExCwL,EAAQvzB,KAAKyO,IAEbA,EAAKqf,kBAMrB11B,KAAKm4B,KAAK1C,YAEdgG,gBAAiB,SAAS/M,EAAS5pB,GAC/B,IAAMi3B,EAAc/7B,KAAKg5B,YAAYxpB,MAAK,SAACsoB,GAAU,OAAQA,EAAO9mB,MAAMrD,KAAK+gB,KACzEsN,EAASD,EAAY3L,KAAK2C,OAAO/vB,OAAO,EACxCi5B,EAASF,EAAY3L,KAAK2C,OAAO5nB,KACnC+wB,EAAY,IAAIjM,KAAMC,KAC1BgM,EAAUvM,YAAc,UACxBuM,EAAUxM,YAAc,EACxBwM,EAAUlL,UAAY,CAAC,GAAG,IAC1BkL,EAAU1K,IAAI,IAAIvB,KAAMwB,MAAMwK,EAAQF,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAASh8B,KAAK0vB,YAAY,IAC5FwM,EAAU1K,IAAI,IAAIvB,KAAMwB,MAAMwK,EAAOF,EAAY3L,KAAK2C,OAAOjvB,MAAM,EAAGi4B,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAAQh8B,KAAK0vB,YAAY,IAC3H,IAAIyM,EAAiB,IAAIlM,KAAMC,KAC/BiM,EAAexM,YAAc,UAC7BwM,EAAezM,YAAc,EAC7ByM,EAAe3K,IAAI0K,EAAUnK,SAAS,GAAGpB,MAAMzU,EAAE,GAAIggB,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAE,IACnF0M,EAAe3K,IAAI0K,EAAUnK,SAAS,GAAGpB,MAAMzU,EAAGggB,EAAUnK,SAAS,GAAGpB,MAAMlB,GAC9E0M,EAAe3K,IAAI0K,EAAUnK,SAAS,GAAGpB,MAAMzU,EAAE,GAAIggB,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAE,IACnF,IAAI2M,EAAc,IAAInM,KAAMC,KAC5BkM,EAAYzM,YAAc,UAC1ByM,EAAY1M,YAAc,EAC1B0M,EAAY5K,IAAI,IAAIvB,KAAMwB,MAAMwK,EAAO,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAE,KACzE2M,EAAY5K,IAAI,IAAIvB,KAAMwB,MAAMwK,EAAO,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAE,KACzE,IAAI4M,EAAc,IAAIpM,KAAMC,KAC5BmM,EAAY1M,YAAc,UAC1B0M,EAAY3M,YAAc,EAC1B2M,EAAY7K,IAAI,IAAIvB,KAAMwB,MAAMwK,EAAO,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAE,KACzE4M,EAAY7K,IAAI,IAAIvB,KAAMwB,MAAMwK,EAAO,GAAIC,EAAUnK,SAAS,GAAGpB,MAAMlB,EAAE,KAEzE,IAAM6M,EAAkB,aAAPx3B,EAAmB,SAAW,SAC3Cy3B,EAAY,IAAItM,KAAMS,UAAU,CAChC5oB,QAAS,QAAUw0B,EAAW,QAC9B3L,MAAO,CAACsL,EAAO,GAAIF,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAAS,IACxDpL,UAAW,UACX1tB,SAAU,KAEVs5B,EAAqB,IAAIvM,KAAM+G,UAC/B,IAAI/G,KAAMwB,MAAMwK,EAAO,GAAIF,EAAY3L,KAAK2C,OAAOtD,EAAIuM,EAAS,IAChE,IAAI/L,KAAMgH,KAAKsF,EAAUxJ,OAAOjvB,MAAQ,GAAIy4B,EAAUxJ,OAAO/vB,OAAS,IAEtEy5B,EAAsB,IAAIxM,KAAMC,KAAK8G,UAAUwF,GACnDC,EAAoB7L,UAAY,yBAChC5wB,KAAKw5B,qBAAqBjG,SAAS2I,GACnCl8B,KAAKw5B,qBAAqBjG,SAAS4I,GACnCn8B,KAAK65B,2BAA6B75B,KAAKw5B,qBAAqBvuB,SAASiR,EACrElc,KAAKu5B,iBAAiBhG,SAASvzB,KAAKw5B,sBACpCx5B,KAAKu5B,iBAAiBhG,SAASkJ,GAC/Bz8B,KAAKu5B,iBAAiBhG,SAASgJ,GAC/Bv8B,KAAKu5B,iBAAiBhG,SAAS6I,GAC/Bp8B,KAAKu5B,iBAAiBhG,SAAS8I,IAEnCK,qBAAsB,WAClB18B,KAAK45B,oBAAqB,EAC1B55B,KAAKu5B,iBAAiBc,iBAClBr6B,KAAKm4B,MACLn4B,KAAKm4B,KAAKmD,SAEdvsB,SAASykB,KAAK7vB,MAAMmhB,OAAS,UAC7B9kB,KAAKg5B,YAAYjoB,SAAQ,SAACC,GAAD,OAASA,EAAMyiB,2BACxCzzB,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GAAD,OAAQA,EAAKod,4BAE1CuH,WAAY,WAAY,IAAD,OACnBh7B,KAAKg5B,YAAYjoB,SAAQ,SAACC,GACtB,GAAyB,OAArBA,EAAMA,MAAM2rB,QAAiB3rB,EAAMA,MAAM2rB,OAAOn9B,OAAO,EAAG,CAC1D,IAAMo9B,EAAU5rB,EAAMA,MAAM2rB,OAAO,GAC7BE,EAAU7rB,EAAMA,MAAM2rB,OAAOn9B,OAAO,EAAGwR,EAAMA,MAAM2rB,OAAO,QAAKr1B,EAErE,QAAcA,IAAVs1B,GAAuB,EAAKzQ,QAAQC,QAAQwQ,IAAU,EAAG,CACzD,IAAIE,EAAQC,EAAQC,EAAMC,EACtBC,EAAYC,EAEhBD,EAAa,EAAKjJ,QAAQ,EAAK9H,QAAQC,QAAQwQ,GAAS,QAC1Ct1B,IAAVu1B,GACAM,EAAa,EAAKlJ,QAAQ,EAAK9H,QAAQC,QAAQyQ,GAAS,GACxDC,EAASI,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAE,EAAKwT,YAClDqN,EAASI,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOG,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMzU,IAEzC4gB,EAAS,GACTC,EAASG,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOE,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,GAElB,OAAvBlL,EAAMA,MAAMosB,UAAmBpsB,EAAMA,MAAMosB,SAAS59B,OAAO,IAC3Du9B,GAAuB,IAAb,EAAKh8B,SAEnBk8B,EAAOF,EACP,IAAIM,EAAa,IAAIpN,KAAMC,KAC3BmN,EAAW5+B,KAAO,UAClB4+B,EAAW1N,YAAc,EAAK2I,kBAC9B+E,EAAW3N,YAAc,EACzB2N,EAAW7L,IAAI,IAAIvB,KAAMwB,MAAMqL,EAAQC,IACvCM,EAAW7L,IAAI,IAAIvB,KAAMwB,MAAMuL,EAAK,EAAKtN,YAAauN,IACtD,IAAM1yB,EAAO,EAEb8yB,EAAW52B,QAAU,SAASoH,GAC1BtD,EAAKugB,kBAAkB9Z,EAAMA,MAAOnD,IAExCwvB,EAAWtS,aAAe,SAASld,GAC/BkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCuY,EAAWpS,aAAe,SAASpd,GAC/BkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC,EAAK2U,YAAYlG,SAAS8J,SAK1CtC,YAAa,WAAY,IAAD,OACpB/6B,KAAKg5B,YAAYjoB,SAAQ,SAACC,GACtB,GAA2B,OAAvBA,EAAMA,MAAMosB,UAAmBpsB,EAAMA,MAAMosB,SAAS59B,OAAO,EAAG,CAC9D,IAAMo9B,EAAU5rB,EAAMA,MAAMosB,SAAS,GAC/BP,EAAS7rB,EAAMA,MAAMosB,SAAS,GACpC,QAAc91B,IAAVs1B,GAAuB,EAAKzQ,QAAQC,QAAQwQ,IAAU,EAAG,CACzD,IAAIE,EAAQC,EAAQC,EAAMC,EACtBC,EAAYC,EAEhBD,EAAa,EAAKjJ,QAAQ,EAAK9H,QAAQC,QAAQwQ,GAAS,QAC1Ct1B,IAAVu1B,GACAM,EAAa,EAAKlJ,QAAQ,EAAK9H,QAAQC,QAAQyQ,GAAS,GACxDC,EAASI,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,EAAE,EAAKwT,YAClDqN,EAASI,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOG,EAAW/M,KAAK2B,SAAS,GAAGpB,MAAMzU,IAEzC4gB,EAAS,GACTC,EAASG,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMlB,EAC3CuN,EAAOE,EAAW9M,KAAK2B,SAAS,GAAGpB,MAAMzU,GAElB,OAAvBlL,EAAMA,MAAMosB,UAAmBpsB,EAAMA,MAAMosB,SAAS59B,OAAO,IAC3Du9B,GAAuB,GAAb,EAAKh8B,SAEM,OAArBiQ,EAAMA,MAAM2rB,QAAiB3rB,EAAMA,MAAM2rB,OAAOn9B,OAAO,IACvDu9B,GAAuB,IAAb,EAAKh8B,SAEnBk8B,EAAOF,EACP,IAAIO,EAAc,IAAIrN,KAAMC,KAC5BoN,EAAY7+B,KAAO,UACnB6+B,EAAY3N,YAAc,EAAK2I,kBAC/BgF,EAAY5N,YAAc,EAC1B4N,EAAY9L,IAAI,IAAIvB,KAAMwB,MAAMqL,EAAQC,EAAO,IAC/CO,EAAY9L,IAAI,IAAIvB,KAAMwB,MAAMuL,EAAK,EAAKtN,YAAauN,EAAK,IAC5DK,EAAY9L,IAAI,IAAIvB,KAAMwB,MAAM6L,EAAYvL,SAAS,GAAGpB,MAAMzU,EAAE,EAAGohB,EAAYvL,SAAS,GAAGpB,MAAMlB,EAAE,IACnG,IAAI8N,EAAc,IAAItN,KAAMC,KAC5BqN,EAAY9+B,KAAO,UACnB8+B,EAAY5N,YAAc,EAAK2I,kBAC/BiF,EAAY7N,YAAc,EAC1B6N,EAAY/L,IAAI,IAAIvB,KAAMwB,MAAMqL,EAAQC,EAAO,IAC/CQ,EAAY/L,IAAI,IAAIvB,KAAMwB,MAAMuL,EAAK,EAAKtN,YAAauN,EAAK,IAC5DM,EAAY/L,IAAI,IAAIvB,KAAMwB,MAAM8L,EAAYxL,SAAS,GAAGpB,MAAMzU,EAAE,EAAGqhB,EAAYxL,SAAS,GAAGpB,MAAMlB,EAAE,IACnG,IAAMllB,EAAO,EAEb+yB,EAAY72B,QAAU,SAASoH,GAC3BtD,EAAKugB,kBAAkB9Z,EAAMA,MAAOnD,IAExC0vB,EAAY92B,QAAU,SAASoH,GAC3BtD,EAAKugB,kBAAkB9Z,EAAMA,MAAOnD,IAExCyvB,EAAYvS,aAAe,SAASld,GAChCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCwY,EAAYrS,aAAe,SAASpd,GAChCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCyY,EAAYxS,aAAe,SAASld,GAChCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjCyY,EAAYtS,aAAe,SAASpd,GAChCkB,SAASykB,KAAK7vB,MAAMmhB,OAAS,WAEjC,EAAK2U,YAAYlG,SAAS+J,GAC1B,EAAK7D,YAAYlG,SAASgK,SAK1CC,kBAAmB,SAAS9O,GACxB,IAAI1d,EAAQhR,KAAKqtB,OAAOqB,GACxB,GAA6B,IAAzB1d,EAAM0c,UAAUluB,OAEhB,OADQQ,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQpb,EAAMrD,KAGrD,IAAI8vB,EAAgBzsB,EAAM0c,UAAU,GAChCgQ,EAAc19B,KAAKy9B,EAAcn+B,MAAM,KAAK,GAAG,KAAKm+B,GACxD,MAA+B,UAA3BA,EAAcrS,WACPprB,KAAKw9B,kBAAkBC,GAEbz9B,KAAKi5B,OAAOj5B,KAAKmsB,QAAQC,QAAQsR,EAAY/vB,MAItEgwB,iBAAkB,SAASjP,GACvB,IAAM1d,EAAQhR,KAAKqtB,OAAOqB,GACpBkP,EAAa59B,KAAKy6B,cAAc/L,GACtC,OAAIkP,GAAsC,UAAxBA,EAAWxS,WACjBprB,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQwR,EAAWjwB,MAC3CiwB,EAAWjP,UAAU3d,EAAM2d,WAAW3uB,KAAKe,QAC/C68B,GAAsC,SAAxBA,EAAWxS,WAChBprB,KAAKi5B,OAAOj5B,KAAKmsB,QAAQC,QAAQwR,EAAWjwB,KAAO3N,KAAK0vB,YAAc1vB,KAAKe,QAAQ,GAChF68B,EAAWjP,UAAU3d,EAAM2d,UAAU,GAAG3uB,KAAKe,QAEzD,GAGf05B,cAAe,SAAS/L,GACpB,IAAImP,EAAiB79B,KAAKqtB,OAAOqB,GAAShB,UAC1C,GAA2B,IAAvBmQ,EAAcr+B,OAAY,OAAO,KACrC,IAAIs+B,EAAeD,EAAcA,EAAcr+B,OAAO,GACtD,GAA6B,MAAzBs+B,EAAa5S,OAAO,GACpB,OAAOlrB,KAAK2rB,MAAMmS,GAElB,IAAIF,EAAa59B,KAAKqtB,OAAOyQ,GAEzBC,EAAkB/9B,KAAKy6B,cAAcqD,GAEzC,OADIC,IAAiBH,EAAaG,GAC3BH,GAGf3D,eAAgB,SAASjpB,GACrB,OAAIA,EAAM0c,UAAUluB,OAAO,EACVQ,KAAK29B,iBAAiB3sB,EAAMrD,IAAM3N,KAAKk5B,QAAQl5B,KAAK+tB,SAAS3B,QAAQpb,EAAMrD,KAC1E3N,KAAKe,QAEZf,KAAKe,SAGpB2zB,UAAW,WACP,OAAO10B,KAAK+4B,YAAYv5B,QAE5By0B,QAAS,SAAS+J,GACd,OAAOh+B,KAAK+4B,YAAYiF,EAAW,IAEvCxI,YAAa,WACT,OAAOx1B,KAAK+4B,YAAY/4B,KAAK00B,YAAY,IAE7CgG,YAAa,SAAS5Q,EAASwQ,EAAUv5B,GAAU,IAAD,OAC9C,GAAI+oB,EAAQtqB,OAAO,EACf,OAAO86B,EAEX,IAAIjK,EAAa,EA0DjB,OAzDIvG,EAAQtqB,OAAO,GACf6wB,EAAa,GACNvG,EAAQtqB,OAAO,GACtB6wB,EAAa,IACNvG,EAAQtqB,OAAO,IAAMQ,KAAKwvB,eACjCa,EAAa,IAEjBvG,EAAQ/Y,SAAQ,SAAC4c,EAAU7X,GACvB,IAAIqoB,EAAe,EAAKxQ,EAASruB,MAAM,KAAK,GAAG,KAAKquB,GAChDyQ,EAAmBD,EAAa7Y,MAAMpW,QAAO,SAACqjB,GAAU,OAAO,EAAK1D,MAAM0D,GAAQC,MAAM,EAAKqN,aAAYrgC,OACzG6+B,EAAmB,EACnBC,EAAc,EASlB,GAR8B,SAA1BH,EAAa/S,aAEbgT,GAAoB,EAAK3R,OAAO0R,EAAazR,SAASpH,MAAMpW,QAAO,SAACqjB,GAAU,OAAO,EAAK1D,MAAM0D,GAAQC,MAAM,EAAKqN,aAAYrgC,OAC/H6+B,GAAoB,EAAKzR,OAAOuR,EAAatR,SAASvH,MAAMpW,QAAO,SAACqjB,GAAU,OAAO,EAAK1D,MAAM0D,GAAQC,MAAM,EAAKqN,aAAYrgC,OAE/H8+B,EAAeF,EAAiB,GAAKD,EAAanL,eAAehrB,SAAS,WAAam2B,EAAanL,eAAehrB,SAAS,WAAa,EAAI,GAGjH,SAA5Bm2B,EAAa/S,YAAoF,IAA3DyM,GAAesG,EAAc,EAAK9Q,OAAQ,EAAKU,WAAiBqQ,EAAiB,EAEvH,EAAKjF,YAAY,EAAKhN,QAAQC,QAAQ+R,EAAaxwB,IAAI,GAAK0iB,EAC5DiK,GAAsBv5B,GAASq9B,EAAiB,GAChD,EAAKnF,OAAOrxB,KAAK0yB,GACjBA,GAAsBv5B,EAAQs9B,EAAiB,GAC3CvoB,IAAKgU,EAAQtqB,OAAO,IAEpB86B,GAAuB6D,EAAaxP,UAAW5tB,QAEhD,GAA8B,SAA1Bo9B,EAAa/S,YAAuB,EAAKe,QAAQC,QAAQ+R,EAAaxwB,IAAI,EAAI,EAAG,CAGxF,GAFA,EAAKwrB,YAAY,EAAKhN,QAAQC,QAAQ+R,EAAaxwB,IAAI,GAAK0iB,EAC5DiK,EAAWA,EAAWv5B,EAASif,KAAKue,IAAI,EAAEH,GAAqBr9B,EAAQu9B,EACnExoB,EAAI,GAAKgU,EAAQhU,EAAE,GAAG9N,SAAS,UAAY,EAAKqlB,OAAOvD,EAAQhU,EAAE,IAAI4X,UAAUluB,OAAQ,CAGvF,IAAMg/B,EAAiB,EAAK/D,cAAc3Q,EAAQhU,EAAE,IACpDwkB,IAAuBkE,EAAe7P,UAAYwP,EAAaxP,WAAW5tB,EAE9E,EAAKk4B,OAAOrxB,KAAK0yB,GACjBA,GAAsBv5B,EAAQs9B,EAAiB,QAC5C,GAA8B,UAA1BF,EAAa/S,WAAsB,CAE1C,GADAkP,GAAsBv5B,EAClB+U,EAAI,GAAKgU,EAAQhU,EAAE,GAAG9N,SAAS,UAAY,EAAKqlB,OAAOvD,EAAQhU,EAAE,IAAI4X,UAAUluB,OAAO,EAAG,CAEzF,IAAMg/B,EAAiB,EAAK/D,cAAc3Q,EAAQhU,EAAE,IACpDwkB,IAAuBkE,EAAe7P,UAAYwP,EAAaxP,UAAY,GAAG5tB,OACvE+U,EAAI,GAAKgU,EAAQhU,EAAE,GAAG9N,SAAS,UAAwD,IAA7C,EAAKqlB,OAAOvD,EAAQhU,EAAE,IAAI4X,UAAUluB,SAErF86B,GAAsBv5B,GAE1B,EAAKm4B,QAAQtxB,KAAK0yB,GAGlBA,EAAW,EAAKI,YAAYyD,EAAazQ,UAAW4M,EAAUv5B,OAG/Du5B,GAEXW,UAAW,WAEPj7B,KAAKg4B,OAAOh1B,OAAShD,KAAKy4B,YAAY1F,OAAO0L,OAAO,IAExDC,SAAU,SAASp+B,GACfN,KAAK8D,MAAQxD,GAEjBq+B,WAAY,SAASnzB,GACjBxL,KAAK+tB,SAAWviB,EAAQuiB,SACxB/tB,KAAKmsB,QAAU3gB,EAAQ2gB,QACvBnsB,KAAKqtB,OAAS7hB,EAAQ6hB,OACtBrtB,KAAK2rB,MAAQngB,EAAQmgB,MACrB3rB,KAAKysB,OAASjhB,EAAQihB,OACtBzsB,KAAK4sB,OAASphB,EAAQohB,OACtB5sB,KAAK6uB,MAAQrjB,EAAQqjB,OAEzB+P,gBAAiB,SAASt+B,GAAQ,IAAD,OAC7BN,KAAK24B,aAAer4B,EAChBN,KAAKg5B,YAAYx5B,OAAO,IACxBQ,KAAKg5B,YAAYjoB,SAAQ,SAACC,GACtBA,EAAM0kB,gBAEV11B,KAAKg5B,YAAYjoB,SAAQ,SAAC8tB,GAClB,EAAKlG,aAAa3wB,SAAS62B,EAAW7tB,MAAMrD,KAC5CkxB,EAAWpJ,gBAK3BqJ,eAAgB,SAASx+B,GAAQ,IAAD,OAC5BN,KAAK44B,YAAct4B,EACfN,KAAK+4B,YAAYv5B,OAAO,IACxBQ,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GACtBA,EAAKqf,gBAET11B,KAAK+4B,YAAYhoB,SAAQ,SAACguB,GAClB,EAAKnG,YAAY5wB,SAAS+2B,EAAU1oB,KAAK1I,KACzCoxB,EAAUtJ,gBAK1BuJ,gBAAiB,SAAS1+B,GAAQ,IAAD,OAC7BN,KAAK64B,aAAev4B,EAChBN,KAAK+4B,YAAYv5B,OAAO,IACxBQ,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GACtBA,EAAKqf,gBAET11B,KAAK+4B,YAAYhoB,SAAQ,SAACguB,GAClB,EAAKlG,aAAa7wB,SAAS+2B,EAAU1oB,KAAKqW,UAC1CqS,EAAUtJ,gBAK1BwJ,gBAAiB,SAAS3+B,GAAQ,IAAD,OAC7BN,KAAK84B,aAAex4B,EAChBN,KAAK+4B,YAAYv5B,OAAO,IACxBQ,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GACtBA,EAAKqf,gBAET11B,KAAK+4B,YAAYhoB,SAAQ,SAACguB,GAClB,EAAKjG,aAAa9wB,SAAS+2B,EAAU1oB,KAAKwW,UAC1CkS,EAAUtJ,gBAK1ByJ,cAAe,SAAS5+B,GACpBN,KAAK0rB,WAAaprB,GAEtB6+B,UAAW,SAASxV,GAChB3pB,KAAK2pB,QAAUA,EACf3pB,KAAK86B,cAETA,WAAY,WAAY,IAAD,OACnB96B,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GACtBA,EAAK8Z,gBAAgB+B,QAAU,GAC3B,EAAKvI,QAAQgC,MAAM3jB,SAASqO,EAAKA,KAAK1I,KACnC,EAAKgc,QAAQO,MAAMliB,SAASqO,EAAKA,KAAKqW,UACtC,EAAK/C,QAAQO,MAAMliB,SAASqO,EAAKA,KAAKwW,YACzCxW,EAAK8Z,gBAAgB+B,QAAU,MAGvClyB,KAAKg5B,YAAYjoB,SAAQ,SAACC,GACtBA,EAAMmf,gBAAgB+B,QAAU,EAC5B,EAAKvI,QAAQ0D,OAAOrlB,SAASgJ,EAAMA,MAAMrD,MACzCqD,EAAMmf,gBAAgB+B,QAAU,OAI5CyD,cAAe,SAAS5E,GACpB/wB,KAAK+wB,kBAAoBA,EACzB/wB,KAAKg5B,YAAYjoB,SAAQ,SAACC,GAAD,OAASA,EAAM2kB,cAAc5E,EAAkB/f,UACxEhR,KAAK+4B,YAAYhoB,SAAQ,SAACsF,GAAD,OAAQA,EAAKsf,cAAc5E,OAExDqO,SAAU,SAASr+B,EAAS2uB,GACxB1vB,KAAKe,QAAUf,KAAK8D,MAAM/C,EAC1Bf,KAAK0vB,YAAc1vB,KAAK8D,MAAM4rB,IAqFvBqI,UChsBMuI,G,kDACnB,WAAYxiC,GAAQ,IAAD,8BACjB,cAAMA,IAMRyiC,kBAAoB,SAACz7B,EAAM4oB,GACzB,IADuC,EACnC3P,EAAM,GAD6B,eAExB2P,GAFwB,IAEvC,2BAA0B,CAAC,IAAlB/f,EAAiB,QAExB,GADIA,EAAG3F,SAASlD,IAAOiZ,EAAInW,KAAK+F,GAC5BA,EAAG3F,SAAS,SAAU,CACxB,IAAIw4B,EAAc,EAAK1iC,MAAM0N,QAAQ6hB,OAAO1f,GAAI+f,UAChD3P,EAAG,uBAAOA,GAAP,aAAe,EAAKwiB,kBAAkBz7B,EAAM07B,OANZ,8BASvC,OAAOziB,GAhBU,EAqDnB0iB,SAAW,WACT,IADe,EACXC,EAAK,GADM,eAEmBtgC,OAAOugC,QAAQ,EAAK7iC,MAAM0N,QAAQ6hB,QAAQsT,WAF7D,IAEf,2BAAuF,CAAC,IAAD,0BAA7E7qB,EAA6E,4BAAzE4Y,EAAyE,KAAhE1d,EAAgE,KACrF,KAAIA,EAAM2d,UAAY,GAAtB,CAEA,IAAIiS,EAAgB,EAAKL,kBAAkB,OAAQvvB,EAAM0c,WACrDmT,EAAiB,EAAKN,kBAAkB,QAASvvB,EAAM0c,WACvDoT,EAAe,GACnBA,EAAapS,GAAW,EAAK5wB,MAAM0N,QAAQ6hB,OAAOqB,GANmC,qBAOtEmS,GAPsE,IAOrF,2BAA+B,CAAC,IAAvBlzB,EAAsB,QAC7BmzB,EAAanzB,GAAM,EAAK7P,MAAM0N,QAAQ6hB,OAAO1f,IARsC,8BAUrF+yB,EAAG94B,KACD,IAAImwB,GAAa,CACfE,SAAU,SAASniB,EACnByZ,OAAQ,EACRxuB,QAAS,IACT2uB,YAAa,KACbC,YAAa,kBACbC,kBAAmB,kBACnBC,uBAAwB,kBACxBC,kBAAmB,UACnBC,iBAAkB,UAClB6G,WAAY,UACZC,iBAAkB,kBAClB0B,eAAgB,UAChBD,kBAAmB,UACnBxN,kBAAmB,EAAKhtB,MAAMgtB,kBAC9BiD,SAAS,CAAE,EAAKjwB,MAAM0N,QAAQuiB,SAASjY,IAA/B,oBAAsC+qB,IAC9C1U,QAASyU,EACTjB,WAAY,EAAK7hC,MAAM0N,QAAQ2gB,QAC/BkU,YAAa,EAAKviC,MAAM0N,QAAQuiB,SAChCV,OAAQyT,EACRnV,MAAO,EAAK7tB,MAAM0N,QAAQmgB,MAC1Bc,OAAQ,EAAK3uB,MAAM0N,QAAQihB,OAC3BG,OAAQ,EAAK9uB,MAAM0N,QAAQohB,OAC3BiC,MAAO,EAAK/wB,MAAM0N,QAAQqjB,MAC1B8J,aAAiE,UAAnD,EAAK76B,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAgB,EAAKhH,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAChI8O,YAAgE,SAAnD,EAAK96B,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAe,EAAKhH,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAC9H+O,aAAiE,UAAnD,EAAK/6B,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAgB,EAAKhH,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAChIgP,aAAiE,UAAnD,EAAKh7B,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAgB,EAAKhH,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAChI4B,WAAY,EAAK5tB,MAAM2rB,iBAAiBiC,WACxC/B,QAAS,EAAK7rB,MAAM2rB,iBAAiBE,QACrCoH,kBAAmB,EAAKjzB,MAAM0N,QAAQ0K,YACtCwjB,2BAA4B,EAAK57B,MAAM47B,2BACvCC,iBAAkB,EAAKA,iBACvBnJ,eAAgB,EAAK1yB,MAAM0yB,eAC3BqP,UAAW,EAAK/hC,MAAM+hC,eA/Cb,8BAmDf,EAAK9/B,SAAS,CAACghC,cAAcL,IAAK,WAAK,EAAKjB,mBAxG3B,EA2GnB9F,iBAAmB,SAACjL,EAAS5pB,EAAMqnB,GACjC,IAAIpW,EAAY,eACbjR,EAAOqnB,GAEV,EAAKruB,MAAMwhC,YAAY5Q,EAAS3Y,IA/Gf,EAqHnBwpB,iBAAmB,WAEjB,IAAIxc,EAAWpkB,OAAOwE,WAA6B,IAAlBxE,OAAOwE,WACxC4L,SAASgM,eAAe,YAAYjX,MAAMif,GAxHzB,EA8HnB0c,aAAe,WAEb,IAAK,IAAI3pB,EAAI,EAAGA,EAAI,EAAK/X,MAAMgjC,cAAcvhC,OAAQsW,IACnD,EAAK/X,MAAMgjC,cAAcjrB,GAAGsb,QA/H9B,EAAKrzB,MAAQ,CACXgjC,cAAe,IAHA,E,gEAoBjB/gC,KAAKlC,MAAM47B,2BAA2B,CAAC50B,KAAK,WAAYxE,MAAO,KAC/DN,KAAKlC,MAAM47B,2BAA2B,CAAC50B,KAAK,SAAUxE,MAAO,KAC7D3B,OAAOigB,iBAAiB,SAAU5e,KAAKy/B,cACvCz/B,KAAKygC,a,6CAILzgC,KAAKlC,MAAM47B,2BAA2B,CAAC50B,KAAK,WAAYxE,MAAO,KAC/DN,KAAKlC,MAAM47B,2BAA2B,CAAC50B,KAAK,SAAUxE,MAAO,KAE7D3B,OAAOkgB,oBAAoB,SAAU7e,KAAKy/B,gB,4CAGtBp4B,GACpB,OAAQrH,KAAKlC,MAAM0N,QAAQ6hB,SAAShmB,EAAUmE,QAAQ6hB,QACpDrtB,KAAKlC,MAAM0N,QAAQ0e,QAAQ7iB,EAAUmE,QAAQ0e,OAC7ClqB,KAAKlC,MAAM0N,QAAQihB,SAASplB,EAAUmE,QAAQihB,QAC9CzsB,KAAKlC,MAAM0N,QAAQohB,SAASvlB,EAAUmE,QAAQohB,QAC9C5sB,KAAKlC,MAAM0N,QAAQqjB,QAAQxnB,EAAUmE,QAAQqjB,OAC7C7uB,KAAKlC,MAAM2rB,iBAAiBC,kBAAkBriB,EAAUoiB,iBAAiBC,iBACzE1pB,KAAKlC,MAAM2rB,iBAAiBiC,aAAerkB,EAAUoiB,iBAAiBiC,YACtE1rB,KAAKlC,MAAM2rB,iBAAiBE,UAAYtiB,EAAUoiB,iBAAiBE,SACnE3pB,KAAKlC,MAAM0N,QAAQ0K,cAAgB7O,EAAUmE,QAAQ0K,aACrDlW,KAAKlC,MAAMs/B,WAAa/1B,EAAU+1B,UAClCp9B,KAAKlC,MAAM6+B,SAAWt1B,EAAUs1B,QAChC38B,KAAKlC,MAAM+hC,YAAcx4B,EAAUw4B,Y,2CAKrC7/B,KAAKygC,a,+BAoFL,IADO,EACHO,EAAW,GACXtB,EAAa,CACf,mBAAoB,MACpB,OAAU,MACV,MAAS/gC,OAAOwE,WAA6B,IAAlBxE,OAAOwE,YAL7B,eAOoB/C,OAAOugC,QAAQ3gC,KAAKlC,MAAM0N,QAAQ6hB,QAAQsT,WAP9D,IAOP,2BAAgF,CAAC,IAAD,0BAAtE7qB,EAAsE,KACtD,IADsD,wBACpE6Y,WACRqS,EAASp5B,KAAK,0CAAQuH,IAAK,SAAS2G,EAAGnI,GAAI,SAASmI,GAAO4pB,MATxD,8BAYP,OACI,6BACGsB,O,GApJ6B9gC,IAAMC,W,+DCEzB8gC,G,kDACnB,WAAYnjC,GAAQ,IAAD,8BACjB,cAAMA,IACDC,MAAQ,CACXmjC,WAAY,iBAAmBC,KAAKC,KACpCC,IAAK,MAJU,E,gEASjB,IAAIC,EAAe,GAGfthC,KAAKlC,MAAMyjC,WAAavhC,KAAKlC,MAAM0jC,WACnCF,EAAa15B,KAAK5H,KAAKyhC,WAAWzhC,KAAKlC,MAAMyjC,WACtCvhC,KAAKlC,MAAMyjC,UAAYvhC,KAAKlC,MAAM0jC,YAC3CF,EAAa15B,KAAK,CAAC9C,KAAM,QAAS4G,IAAK1L,KAAKlC,MAAMyjC,WAEhDvhC,KAAKlC,MAAM4jC,WAAa1hC,KAAKlC,MAAM6jC,WACrCL,EAAa15B,KAAK5H,KAAKyhC,WAAWzhC,KAAKlC,MAAM4jC,WACpC1hC,KAAKlC,MAAM4jC,UAAY1hC,KAAKlC,MAAM6jC,YAC3CL,EAAa15B,KAAK,CAAC9C,KAAM,QAAS4G,IAAK1L,KAAKlC,MAAM4jC,WAE/C1hC,KAAKlC,MAAMyjC,UAAavhC,KAAKlC,MAAM4jC,WAAUJ,EAAe,CAAC,CAACx8B,KAAM,QAAS4G,IAAKk2B,QACvF5hC,KAAKD,SAAS,CACZshC,IAAKQ,KAAc,CACjBl0B,GAAI3N,KAAKjC,MAAMmjC,WACfY,UAAW,qEACXC,uBAAuB,EACvBC,qBAAqB,EACrBC,qBAAqB,EACrBC,eAAe,EACfC,gBAAgB,EAChBC,eAAgB,EAChBC,qBAAsB,EACtBC,kBAAmB,YACnBC,UAAW,CACTC,OAAQ,CACNC,KAAM,kBACNC,MAAO,wBACPC,MAAO,mBACPC,KAAM,sBAERC,QAAS,CACPJ,KAAM,mBACNC,MAAO,yBACPC,MAAO,oBACPC,KAAM,uBAERE,KAAM,CACJL,KAAM,gBACNC,MAAO,sBACPC,MAAO,iBACPC,KAAM,oBAERG,WAAY,CACVN,KAAM,sBACNC,MAAO,4BACPC,MAAO,uBACPC,KAAM,0BAERI,YAAa,CACXP,KAAM,uBACNC,MAAO,6BACPC,MAAO,wBACPC,KAAM,4BAGVK,YAAa3B,Q,0CAKCj6B,GAClBrH,KAAKkjC,SAAS77B,EAAUm6B,WAAYn6B,EAAUs6B,WAAYt6B,EAAUk6B,SAAUl6B,EAAUq6B,Y,iCAG/Eh2B,GACT,OAAIA,EAAI1D,SAAS,QACP,gBAAgBm7B,KAAKz3B,GAAK,GAAK,aAEhCA,EAAM,e,+BAIR03B,EAAMC,EAAMC,EAAGz+B,GACtB,GAAI7E,KAAKjC,MAAMsjC,IAAK,CAClB,IAAIC,EAAe,GACfgC,IAAMF,EACR9B,EAAa15B,KAAK5H,KAAKyhC,WAAW6B,IACzBA,GAAKF,GACd9B,EAAa15B,KAAK,CAAC9C,KAAM,QAAS4G,IAAK43B,IAErCz+B,IAAMw+B,EACR/B,EAAa15B,KAAK5H,KAAKyhC,WAAW58B,IACzBA,GAAKw+B,GACd/B,EAAa15B,KAAK,CAAC9C,KAAM,QAAS4G,IAAK7G,IAEpCy+B,GAAMz+B,IAAGy8B,EAAe,CAAC,CAACx8B,KAAM,QAAS4G,IAAKk2B,QACnD5hC,KAAKjC,MAAMsjC,IAAIv2B,KAAKw2B,M,+BAKtB,IAAI39B,EAAQ,CAACG,MAAO,OAAQd,OAAQ,QAAS8J,WAAY9M,KAAKlC,MAAMgc,gBAAiB9Z,KAAKlC,MAAMgc,gBAAgB,SAEhH,OADI9Z,KAAKlC,MAAMylC,QAAO5/B,EAAQ,CAACsH,SAAU,QAASnH,MAAM,QAAQd,OAAO,MAAOmI,KAAM,MAAO2B,WAAY,QAASjC,QAAS,IAEvH,yBAAK8C,GAAI3N,KAAKjC,MAAMmjC,WAAY16B,UAAU,gBAAgB7C,MAAOA,Q,GA3G9BzD,IAAMC,WCD1BqjC,G,kDACnB,WAAY1lC,GAAQ,IAAD,8BACjB,cAAMA,IAgFR2hC,aAAe,WAEb,EAAKF,mBACL,EAAKxhC,MAAMyhC,aAAapO,QApFP,EAyFnBmO,iBAAmB,WAEjB,IAAIxc,EAAWpkB,OAAOwE,WAA6B,IAAlBxE,OAAOwE,WACpC,EAAKrF,MAAM8mB,qBACb7B,EAAWpkB,OAAOwE,WAA6B,IAAlBxE,OAAOwE,YAEtC4L,SAASgM,eAAe,YAAYjX,MAAMif,EAC1C,EAAKhlB,MAAMyhC,aAAad,SAAS3b,GAC7B,EAAKjlB,MAAM8mB,mBACb,EAAK7mB,MAAMyhC,aAAaJ,SAAS,IAAM,MAEvC,EAAKrhC,MAAMyhC,aAAaJ,SAAS,IAAM,OAlGzC,EAAKrhC,MAAQ,CACXyhC,aAAc,IAHC,E,gEAOE,IAAD,OAClB7gC,OAAOigB,iBAAiB,SAAU5e,KAAKy/B,cACvCz/B,KAAKD,SAAS,CACZy/B,aAAc,IAAIzH,GAAa,CAC7BE,SAAU,WACV1I,OAAQ,EACRxuB,QAAS,IACT2uB,YAAa,KACbC,YAAa,kBACbC,kBAAmB,kBACnBC,uBAAwB,kBACxBC,kBAAmB,UACnBC,iBAAkB,UAClB6G,WAAY,UACZC,iBAAkB,kBAClB0B,eAAgB,UAChBD,kBAAmB,UACnBxN,kBAAmB9qB,KAAKlC,MAAMgtB,kBAC9BiD,SAAU/tB,KAAKlC,MAAM0N,QAAQuiB,SAC7B5B,QAASnsB,KAAKlC,MAAM0N,QAAQ2gB,QAC5BkB,OAAQrtB,KAAKlC,MAAM0N,QAAQ6hB,OAC3B1B,MAAO3rB,KAAKlC,MAAM0N,QAAQmgB,MAC1Bc,OAAQzsB,KAAKlC,MAAM0N,QAAQihB,OAC3BG,OAAQ5sB,KAAKlC,MAAM0N,QAAQohB,OAC3BiC,MAAO7uB,KAAKlC,MAAM0N,QAAQqjB,MAC1B8J,aAAiE,UAAnD34B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAgB9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAChI8O,YAAgE,SAAnD54B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAe9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAC9H+O,aAAiE,UAAnD74B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAgB9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAChIgP,aAAiE,UAAnD94B,KAAKlC,MAAM2rB,iBAAiBC,gBAAgB5kB,KAAgB9E,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAAU,GAChI4B,WAAY1rB,KAAKlC,MAAM2rB,iBAAiBiC,WACxC/B,QAAS3pB,KAAKlC,MAAM2rB,iBAAiBE,QACrCoH,kBAAmB/wB,KAAKlC,MAAM0N,QAAQ0K,YACtCutB,aAAczjC,KAAKlC,MAAM2lC,aACzBC,UAAW1jC,KAAK0jC,UAChBlU,aAAa,EACb/Z,cAAezV,KAAKlC,MAAM0N,QAAQiK,kBAEnC,WAAK,EAAKgqB,oB,4CAGOp4B,EAAWs8B,GAC/B,OACE3jC,KAAKlC,MAAM2rB,iBAAiBC,kBAAkBriB,EAAUoiB,iBAAiBC,iBACzE1pB,KAAKlC,MAAM2rB,iBAAiBE,UAAYtiB,EAAUoiB,iBAAiBE,SACnE3pB,KAAKlC,MAAM0N,QAAQ0K,cAAgB7O,EAAUmE,QAAQ0K,aACrDlW,KAAKlC,MAAM0N,QAAQqjB,QAAQxnB,EAAUmE,QAAQqjB,OAC7C7uB,KAAKjC,MAAMyxB,cAAgBmU,EAAUnU,aACrCxvB,KAAKlC,MAAM8mB,qBAAuBvd,EAAUud,qB,0CAI5Bvd,EAAWs8B,GACzBvjC,OAAO9B,KAAK0B,KAAKjC,MAAMyhC,cAAchgC,OAAO,IAC9CQ,KAAKjC,MAAMyhC,aAAab,WAAWt3B,EAAUmE,SAC7CxL,KAAKjC,MAAMyhC,aAAaZ,gBAAkE,UAAlDv3B,EAAUoiB,iBAAiBC,gBAAgB5kB,KAAgBuC,EAAUoiB,iBAAiBC,gBAAgBI,QAAU,IACxJ9pB,KAAKjC,MAAMyhC,aAAaV,eAAiE,SAAlDz3B,EAAUoiB,iBAAiBC,gBAAgB5kB,KAAeuC,EAAUoiB,iBAAiBC,gBAAgBI,QAAU,IACtJ9pB,KAAKjC,MAAMyhC,aAAaR,gBAAkE,UAAlD33B,EAAUoiB,iBAAiBC,gBAAgB5kB,KAAgBuC,EAAUoiB,iBAAiBC,gBAAgBI,QAAU,IACxJ9pB,KAAKjC,MAAMyhC,aAAaP,gBAAkE,UAAlD53B,EAAUoiB,iBAAiBC,gBAAgB5kB,KAAgBuC,EAAUoiB,iBAAiBC,gBAAgBI,QAAU,IACxJ9pB,KAAKjC,MAAMyhC,aAAaL,UAAU93B,EAAUoiB,iBAAiBE,SAC7D3pB,KAAKjC,MAAMyhC,aAAa7J,cAActuB,EAAUmE,QAAQ0K,gB,2CAK1DlW,KAAKy/B,iB,6CAIL9gC,OAAOkgB,oBAAoB,SAAU7e,KAAKy/B,gB,+BA8B1C,IAMI9E,EAAQtkB,EAAM4Y,EAAOC,EAAOsS,EAAYG,EAAYJ,EAAUG,EAN9DhC,EAAa,CACf,mBAAoB,MACpB,OAAU,aACV,MAAS1/B,KAAKlC,MAAM8mB,mBAAoBjmB,OAAOwE,WAA6B,IAAlBxE,OAAOwE,WAAiBxE,OAAOwE,WAA6B,IAAlBxE,OAAOwE,YAkB7G,MAdsC,SAAlCnD,KAAKlC,MAAM4rB,gBAAgB5kB,MAC7B61B,EAAS36B,KAAKlC,MAAM4rB,gBAAgBI,QAAQ,GAC5CzT,EAAOrW,KAAKlC,MAAM0N,QAAQmgB,MAAMgP,GAChC1L,EAAQjvB,KAAKlC,MAAM0N,QAAQihB,OAAOpW,EAAKqW,SACvCwC,EAAQlvB,KAAKlC,MAAM0N,QAAQohB,OAAOvW,EAAKwW,UACI,UAAlC7sB,KAAKlC,MAAM4rB,gBAAgB5kB,KACpCmqB,EAAQjvB,KAAKlC,MAAM0N,QAAQihB,OAAOzsB,KAAKlC,MAAM4rB,gBAAgBI,QAAQ,IAC1B,UAAlC9pB,KAAKlC,MAAM4rB,gBAAgB5kB,OACpCoqB,EAAQlvB,KAAKlC,MAAM0N,QAAQohB,OAAO5sB,KAAKlC,MAAM4rB,gBAAgBI,QAAQ,KAEvE0X,OAAqBl6B,IAAR2nB,QAA8C3nB,IAAzB2nB,EAAM/R,MAAM0mB,YAA0B3U,EAAM/R,MAAM0mB,WAAW57B,SAAS,OACxG25B,OAAqBr6B,IAAR4nB,QAA8C5nB,IAAzB4nB,EAAMhS,MAAM0mB,YAA0B1U,EAAMhS,MAAM0mB,WAAW57B,SAAS,OACxGu5B,OAAmBj6B,IAAR2nB,QAAuC3nB,IAAlB2nB,EAAM/R,MAAMxR,IAAiBujB,EAAM/R,MAAMxR,IAAM,KAC/Eg2B,OAAmBp6B,IAAR4nB,QAAuC5nB,IAAlB4nB,EAAMhS,MAAMxR,IAAiBwjB,EAAMhS,MAAMxR,IAAM,KAE/E,yBAAKlF,UAAU,eACb,yBAAK7C,MAAO3D,KAAKlC,MAAM8mB,mBAAmB,CAAC9gB,MAAO,OAAO,IAEvD,0CAAQ6J,GAAG,YAAe+xB,KAE3B1/B,KAAKlC,MAAM8mB,mBACV,kBAAC,GAAD,CAAa4c,WAAYA,EAAYG,WAAYA,EAAYJ,SAAUA,EAAUG,SAAUA,EAAU6B,OAAO,IAC3G,Q,GAvIgCrjC,IAAMC,W,yGCsJhC0jC,GA/IA,SAAA/lC,GACX,IAAMqc,EAAWrc,EAAMgmC,aAAaC,QAAQ,MAAO,KAC7C1qB,EAAU,CACZ,kBAAC,IAAD,CACI/S,MAAO,YAAcxI,EAAMkmC,aAC3BxrB,KAAM,kBAAC,KAAD,MACN7U,MACI7F,EAAMmmC,eACJ,CAAEhgC,YAAa,IACf,CAAEkO,QAAS,QAEjB1L,QAAS,WACLy9B,OAGR,kBAAC,IAAD,CACI59B,MAAO,YAAcxI,EAAMkmC,aAC3BxrB,KAAM,kBAAC,KAAD,MACN7U,MAA8B,QAAvB7F,EAAMkmC,aAAyB,CAAE//B,YAAa,IAAO,CAAEkO,QAAS,QACvE1L,QAAS,kBAAM09B,KAAarmC,EAAMsmC,aAAP,UAAwBjqB,EAAxB,YAAoCrc,EAAMkmC,kBAEzE,kBAAC,IAAD,CACI19B,MAAO,YAAcxI,EAAMkmC,aAC3BxrB,KAAM,kBAAC,KAAD,MACN7U,MACI7F,EAAMmmC,gBACiB,QAAvBnmC,EAAMkmC,cACiB,UAAvBlmC,EAAMkmC,aACJ,CAAE7xB,QAAS,QACX,CAAElO,YAAa,IAErBwC,QAAS,kBACLy9B,OAGR,kBAAC,IAAD,CACI59B,MAAM,QACNC,SAAS,EACTE,QAAS,kBAAM3I,EAAMumC,oBAAmB,IACxCnrB,iBAAe,KAIjBgrB,EAAc,WAChBplC,MAAMhB,EAAMmmC,gBACP1lC,MAAK,SAAUQ,GACZ,OAAwB,MAApBA,EAASoL,QAAsC,IAApBpL,EAASoL,OAC7BL,QAAQC,QAAQhL,EAASulC,QAEzBx6B,QAAQM,OAAO,IAAIm6B,MAAMxlC,EAASylC,gBAGhDjmC,KAAKkmC,KAAMC,WACXnmC,MAAK,SAAUomC,GACZA,EAAIC,cAAc,CAAE9/B,KAAM,SAAUvG,MAChC,SAAU+lC,GACNO,KAAOP,EAAD,UAAUxmC,EAAM6Z,UAAhB,YAA6B7Z,EAAMkmC,aAAnC,YAEV,SAAUc,GACN3mC,QAAQC,IAAI,iCAM1BgmC,EACqB,QAAvBtmC,EAAMkmC,aACF,yBACIrgC,MAAO,CAAE0M,UAAW,IAAKuN,SAAU,SAAU9Q,WAAY,YAEzD,kBAAC,KAAD,CACInJ,MAAO,CAAEsH,SAAU,QAASgH,MAAO,QACnCC,QAAQ,oBACRzL,QAAS,WACLs+B,KAC2B,UAAvBjnC,EAAMkmC,aACJrlC,OAAOC,SAAS+nB,KAAO,YACvB7oB,EAAMsmC,cAEZtmC,EAAMknC,oCAGV,kBAAC,KAAD,OAEJ,6BAC4B,UAAvBlnC,EAAMkmC,cAA4BrlC,OAAOC,SAAS+nB,KAAO,aAGtC,QAAvB7oB,EAAMkmC,aAaH,iEAEC,6BAAMlmC,EAAMsmC,eAIrB,gEAGI,yBAAKzgC,MAAO,CAAEG,MAAO,EAAGd,OAAQ,EAAG4a,SAAU,WACzC,4BAAQjQ,GAAG,eAAe7J,MAAM,IAAId,OAAO,QAI3D,OACI,kBAAC,IAAD,CACIoI,MAAOtN,EAAMwI,MACb+S,QAASA,EACT1C,OAAO,EACP7L,KAAMhN,EAAMmnC,WACZruB,eAAgB,kBAAM9Y,EAAMumC,oBAAmB,IAC/Cr5B,aAAc,CAAE+X,SAAU,MAET,QAAhBjlB,EAAMwI,MACH,2BACI,yCADJ,4JAMC,GAEY,uBAAhBxI,EAAMwI,MACH,sFAEC,GAEJ89B,I,gFCtIQc,G,kDACjB,WAAYpnC,GAAQ,IAAD,8BACf,cAAMA,IA6BVqnC,gBAAkB,SAAC1mC,EAAM8S,EAAKgtB,EAAKv5B,GAC3BA,GAAGA,EAAEC,iBACT,IAAImgC,EAAW,EAIXA,EAHC,EAAKC,gBAAgB,EAAKtnC,MAAMU,IAGtBuhB,KAAKzO,IAAIgtB,EAAK,EAAKxgC,MAAMU,GAAQ,GAFjC8S,EAIf,IAAI+zB,EAAW,CAAEn/B,UAAW,IAC5Bm/B,EAAS7mC,GAASoB,MAAMulC,GAAa7zB,EAAM6zB,EAC3CE,EAASn/B,UAAU1H,GAAQ,GAC3B,EAAKsB,SAAL,eAAmBulC,KAzCJ,EAgDnBC,gBAAkB,SAAC9mC,EAAM8S,EAAKgtB,EAAKv5B,GAC3BA,GAAGA,EAAEC,iBACT,IAAImgC,EAAWplB,KAAKzO,IAAIgtB,EAAKve,KAAKue,IAAIhtB,EAAK,EAAKxT,MAAMU,GAAQ,IAC1D6mC,EAAW,CAAEn/B,UAAW,IAC5Bm/B,EAAS7mC,GAASoB,MAAMulC,GAAa7zB,EAAM6zB,EAC3CE,EAASn/B,UAAU1H,GAAQ,GAC3B,EAAKsB,SAAL,eAAmBulC,KAtDJ,EA4DnBE,sBAAwB,SAACC,GACrB,IAAIC,EAAqB,GAWzB,OAVY,EAAK5nC,MAAMuvB,OAAOoY,GACxB/X,UAAU3c,SAAQ,SAAA4c,GACA,MAAhBA,EAAS,KACJ+X,EAAmB19B,SAAS2lB,GAG7B+X,EAAmB99B,KAAK,EAAK49B,sBAAsB7X,IAFnD+X,EAAmB99B,KAAK+lB,OAM7B+X,GAxEQ,EA2EnBC,mBAAqB,SAACF,GAClB,IAAIz0B,EAAQ,EAAKlT,MAAMuvB,OAAOoY,GAC1BG,EAAa,EAQjB,OAPA50B,EAAM0c,UAAU3c,SAAQ,SAAA4c,GACA,MAAhBA,EAAS,KACTiY,IAEAA,GAAc,EAAKD,mBAAmBhY,OAGvCiY,GArFQ,EA4FnBlP,cAAgB,SAAC1lB,GAEb,IACIumB,EADcn3B,OAAOy6B,OAAO,EAAK/8B,MAAMuvB,QAAQne,QAAO,SAAAyoB,GAAC,OAAoB,IAAhBA,EAAEhJ,aACjChe,KAAI,SAAAgnB,GAAC,OAAIA,EAAEhqB,MACvC8oB,EAAW,GACf,GAAwB,IAApBzlB,EAAM2d,UAAiB,CAEvB,IAAI6H,EAAae,EAAcnL,QAAQpb,EAAMrD,IAAM,EACnD8oB,EAAQ,UAAMD,OACX,CAEH,IAAIiB,EAAc,EAAK35B,MAAMuvB,OAAOrc,EAAM8b,UAGtC4K,EADsBD,EAAY/J,UAAUxe,QAAO,SAAAyoB,GAAC,MAAa,MAATA,EAAE,MACnBvL,QAAQpb,EAAMrD,IAAM,EAC/D8oB,EAAQ,UAAM,EAAKC,cAAce,GAAzB,YAAyCC,GAErD,OAAOjB,GA7GQ,EAmHnBoP,eAAiB,SAACpnC,EAAM6B,GACpB,IAAIwlC,EAAa,EAAK/nC,MAAMoI,UAC5B2/B,EAAWrnC,GAAQ,GACd,EAAK4mC,gBAAgB/kC,GAGtBA,EAAQiS,SAASjS,EAAO,IAFxBwlC,EAAWrnC,GAAQ,mBAIT,mBAATA,GAAsC,WAATA,KAAuB6B,EAAQ,GAAKA,EAAQ,IAE1D,mBAAT7B,IAA8B6B,EAAQ,GAAKA,EAAQ,KAC1DwlC,EAAWrnC,GAAQ,mCACH,YAATA,IAAuB6B,EAAQ,GAAKA,EAAQ,EAAKvC,MAAMgoC,kBAC9DD,EAAWrnC,GAAQ,gCAAkC,EAAKV,MAAMgoC,gBAJhED,EAAWrnC,GAAQ,kCAMvB,IAAI6mC,EAAW,GACfA,EAAS7mC,GAAQ6B,EACjB,EAAKP,SAAL,2BAAmBulC,GAAnB,IAA6Bn/B,UAAW2/B,MApIzB,EA0InBT,gBAAkB,SAACW,GACf,MAAO,eAAer9B,KAAKq9B,IA3IZ,EAiJnBC,iBAAmB,SAACC,EAAW5lC,GAC3B,IAAIglC,EAAW,GACfA,EAASY,GAAa5lC,EACtB,EAAKP,SAASulC,IApJC,EA0JnBa,eAAiB,SAAC7lC,EAAO8lC,GACrB,GAAsD,IAAlDhmC,OAAO9B,KAAK,EAAKR,MAAMuoC,gBAAgB7mC,OAAc,CACrD,IAAI8mC,EAAoB,GACxBA,EAAkBF,GAAc9lC,EAChC,EAAKP,SAASumC,KA9JH,EAqKnBC,iBAAmB,SAACjmC,GAChB,EAAKP,SAAS,CAAEnB,SAAU0B,KAtKX,EAyKnBkmC,0BAA4B,SAAClmC,GACzB,EAAKP,SAAS,CAAE0mC,kBAAmBnmC,KA1KpB,EAgLnBomC,eAAiB,WACb,IADmB,EACftZ,EAAc,EAAKtvB,MAAMuvB,OAAO,EAAKvvB,MAAMuoC,eAAe,IAD3C,eAEC,EAAKvoC,MAAMiwB,SAAS4Y,MAAM,EAAK7oC,MAAMiwB,SAAS3B,QAAQgB,EAAYzf,IAAM,IAFzE,IAEnB,2BAAgG,CAAC,IAAxF+gB,EAAuF,QACtF1d,EAAQ,EAAKlT,MAAMuvB,OAAOqB,GAChC,GAAI1d,EAAM2d,YAAcvB,EAAYuB,UAChC,OAAO3d,GALI,8BAOnB,OAAO,MAvLQ,EA6LnB41B,mBAAqB,SAAClZ,GAClB,IADgC,EAC5BmZ,EAAY,KADgB,eAEXnZ,GAFW,IAEhC,2BAAgC,CAAC,IAAxBC,EAAuB,QAC5B,GAA2B,MAAvBA,EAASzC,OAAO,GAAY,CAC5B,IAAM4M,EAAS,EAAKh6B,MAAMuvB,OAAOM,GAIjC,IAHkB,OAAdkZ,GAAuB,EAAK/oC,MAAMiwB,SAAS3B,QAAQ0L,EAAOnqB,IAAM,EAAK7P,MAAMiwB,SAAS3B,QAAQya,EAAUl5B,OACtGk5B,EAAY/O,GAEZA,EAAOpK,UAAUluB,OAAS,EAAG,CAC7B,IAAIwU,EAAS,EAAK4yB,mBAAmB9O,EAAOpK,WACxC1Z,GAAU,EAAKlW,MAAMiwB,SAAS3B,QAAQpY,EAAOrG,IAAM,EAAK7P,MAAMiwB,SAAS3B,QAAQya,EAAUl5B,MAAKk5B,EAAY7yB,MAV1F,8BAchC,OAAO6yB,GA3MQ,EAiNnB9hC,OAAS,WACL,GAAI,EAAKjH,MAAMgpC,WAAa,EAAKp2B,aAAc,CAC3C,IAAI1G,EAAO,CAAEgH,MAAO,GAAI+1B,WAAY,IASpC,GARA/8B,EAAK+8B,WAAL,WAAgC,EAAKhpC,MAAMipC,eACvC,EAAKjpC,MAAMkpC,YACXj9B,EAAK+8B,WAAL,UAA+B,EAAKhpC,MAAMgoC,eAC1C/7B,EAAK+8B,WAAL,QAA8B,EAAKhpC,MAAMgoC,eAAiB,GAAK,EAAKhoC,MAAM4T,QACtE,EAAK5T,MAAMgoC,eAAiB,GAAK,EAAKhoC,MAAM4T,SAAa,EAAK5T,MAAMgoC,eAAiB,IAAM,IAC3F/7B,EAAK+8B,WAAL,iBAAsC,EAAKhpC,MAAMgU,UAGhB,IAArC,EAAKjU,MAAMuoC,eAAe7mC,OAE1BwK,EAAK+8B,WAAL,MAA2B,EAC3B/8B,EAAK+8B,WAAL,YAAiC,EACjC/8B,EAAKgH,MAAL,KAAqB,QACrBhH,EAAKgH,MAAL,MAAsB,WACnB,IAAI,EAAKlT,MAAMgpC,SASlB,cAPA98B,EAAO,CAAEqM,KAAM,GAAI0wB,WAAW,eAAM/8B,EAAK+8B,cAC7BA,WAAWG,WACvBl9B,EAAKqM,KAAL,WAA0B,EAAKvY,MAAM6Z,UACrC3N,EAAKqM,KAAL,SAAwB,EAAKvY,MAAMuoC,eAAe,GAClDr8B,EAAK+8B,WAAL,YAAiC,EACjC,EAAKjpC,MAAMoH,OAAO4hC,SAAS98B,QAC3B,EAAKlM,MAAMqpC,cAIX,IAAMn2B,EAAQ,EAAKlT,MAAMuvB,OAAO,EAAKvvB,MAAMuoC,eAAe,IACtDe,EAAcvP,GAAe7mB,EAAO,EAAKlT,MAAMuvB,OAAQ,EAAKvvB,MAAMiwB,UAClEyI,EAAa,EAAK14B,MAAMiwB,SAAS3B,QAAQpb,EAAMrD,IAAM,EAKzD,GAJIqD,EAAM8b,WAEN9iB,EAAK+8B,WAAL,cAAmC/1B,EAAM8b,UAEjB,UAAxB,EAAK/uB,MAAMa,SAAsB,CAEjCwoC,GAAe,EACf,IAAIC,EAAU,EAAKX,iBACnB,GAAIW,EACA7Q,EAAa,EAAK14B,MAAMiwB,SAAS3B,QAAQib,EAAQ15B,IAAM,OAGvD,GAAKqD,EAAM8b,SAIP,GAAI9b,EAAM0c,UAAUluB,OAAS,EAAG,CAE5B,IAAI8nC,EAAY,EAAKV,mBAAmB51B,EAAM0c,WAE1C8I,EADc,OAAd8Q,EACa,EAAKxpC,MAAMiwB,SAAS3B,QAAQpb,EAAMrD,IAAM,EAExC,EAAK7P,MAAMiwB,SAAS3B,QAAQkb,EAAU35B,IAAM,OAI7D6oB,GAA0B,OAZ9BA,EAAa,EAAK14B,MAAMiwB,SAASvuB,OAAS,OAgB/C,GAA4B,WAAxB,EAAKzB,MAAMa,SAAuB,CAGzC,EAAKmB,SAAS,CAAEwnC,cAAe,EAAKzpC,MAAMuvB,OAAO,EAAKvvB,MAAMuoC,gBAA7B,UAA0D,KACzF,IAAImB,EAAqB,EAAK1pC,MAAMuvB,OAAO,EAAKvvB,MAAMuoC,gBAA7B,UAA0Dja,QAAQ,EAAKruB,MAAMwpC,eACjE,UAAjC,EAAKxpC,MAAM0oC,kBACXW,EAAcI,EAAqB,EACK,UAAjC,EAAKzpC,MAAM0oC,oBAClBW,EAAcI,EAAqB,GAIvC,IAAIC,EAAkB,GACtB,EAAK3pC,MAAMiwB,SAAShd,SAAQ,SAAA2d,GACnB+Y,EAAgBz/B,SAAS0mB,KAC1B+Y,EAAgB7/B,KAAK8mB,GAErB+Y,EAAgB7/B,KAAhB,MAAA6/B,EAAe,aAAS,EAAKjC,sBAAsB9W,SAI3D,IAAIgZ,EAAsCD,EAAgBrb,QAAQ,EAAKruB,MAAMwpC,eACzEI,EAAwB,GACS,UAAjC,EAAK5pC,MAAM0oC,kBACXkB,EAAwBF,EAAgBd,MAAM,EAAGe,GACT,UAAjC,EAAK3pC,MAAM0oC,oBAClBkB,EAAwBF,EAAgBd,MAAM,EAAGe,EAAsC,IAG3F,IAAI9B,EAAa,EACjB+B,EAAsB52B,SAAQ,SAAA+mB,GACR,MAAdA,EAAO,IACP8N,OAIJ,EAAK7nC,MAAMwpC,cACyB,MAAhC,EAAKxpC,MAAMwpC,cAAc,KACzB3B,GAAc,EAAKD,mBAAmB,EAAK5nC,MAAMwpC,gBAGrD3B,EAAa,EAEjBpP,EAAaoP,EAAa,EAC1B57B,EAAK+8B,WAAL,cAAmC/1B,EAAMrD,GAE7C3D,EAAKgH,MAAQ,CACT5F,MAAO,OACPtG,KAAM,SAEVkF,EAAK+8B,WAAL,YAAiCK,EACjCp9B,EAAK+8B,WAAL,MAA2BvQ,EAE/BxsB,EAAKgH,MAAL,WAA2B,EAAKlT,MAAM6Z,UACtC,EAAK7Z,MAAMoH,OAAO0iC,UAAU59B,GAC5B,EAAKlM,MAAMqpC,cACX,EAAKpnC,SAAS,CAAEnB,SAAU,UAC1B,EAAKipC,cAxUM,EAgVnBn3B,WAAa,WACT,IAAIo3B,SAAgDxgC,IAAhC,EAAKvJ,MAAMoI,UAAU4hC,SAAyB,EAAKhqC,MAAMoI,UAAU4hC,OAAOvoC,OAAS,EACnGwoC,SAAgE1gC,IAAxC,EAAKvJ,MAAMoI,UAAU6gC,iBAAiC,EAAKjpC,MAAMoI,UAAU6gC,eAAexnC,OAAS,EAC3HyoC,SAAgE3gC,IAAxC,EAAKvJ,MAAMoI,UAAU4/B,iBAAiC,EAAKhoC,MAAMoI,UAAU4/B,eAAevmC,OAAS,EAC3H0oC,SAAkD5gC,IAAjC,EAAKvJ,MAAMoI,UAAU4L,UAA0B,EAAKhU,MAAMoI,UAAU4L,QAAQvS,OAAS,EAC1G,MAA+B,KAAxB,EAAKzB,MAAMa,UAAmBkpC,GAAeE,GAAuBC,GAAuBC,GArVnF,EA2VnBL,UAAY,WACR,EAAK9nC,SAAS,CACVinC,eAAgB,EAChBC,UAAW,EAAKnpC,MAAMgpC,WAAY,EAClCf,eAAgB,EAChBp0B,SAAS,EACTI,QAAS,EACTg2B,OAAQ,EACRnpC,SAAU,EAAKd,MAAMuoC,eAAe7mC,OAAS,EAAI,GAAK,SACtDinC,kBAAmB,GACnBc,mBAAqCjgC,IAAtB,EAAKxJ,MAAMuvB,OAAuB,EAAKvvB,MAAMuvB,OAAO,EAAKvvB,MAAMuoC,eAAe,IAA5C,UAA6D,GAAK,GACnHlgC,UAAW,CACP6gC,eAAgB,GAChBjB,eAAgB,GAChBh0B,QAAS,GACTg2B,OAAQ,IAEZX,YAAa,KA1WjB,EAAKrpC,MAAQ,CACTipC,eAAgB,EAChBC,UAAWnpC,EAAMgpC,WAAY,EAC7Bf,eAAgB,EAChBp0B,SAAS,EACTI,QAAS,EACTg2B,OAAQ,EACRnpC,SAAU,SACV6nC,kBAAmB,GACnBc,cAAe,GACfphC,UAAW,CACP6gC,eAAgB,GAChBjB,eAAgB,GAChBh0B,QAAS,GACTg2B,OAAQ,IAEZX,YAAa,GAlBF,E,wEAuBfpnC,KAAK6nC,c,+BAyVC,IAAD,OACCxuB,EAAU,CACZ,kBAAC,IAAD,CACI/S,MAAM,SACNG,QAAS,WACL,EAAK3I,MAAMqpC,eAEfxjC,MAAO,CAAEG,MAAO,MAAOG,YAAa,KAAMI,OAAQ,oBAEtD,kBAAC,IAAD,CACIiC,MAAM,SACNxB,KAAK,SACLrG,KAAK,SACL8H,SAAO,EACPE,QAASzG,KAAK+E,OACduJ,UAAUtO,KAAKlC,MAAMgpC,UAAmB9mC,KAAK0Q,aAC7C/M,MAAO,CAAEG,MAAO,UAIlBqkC,EAAS,CACXC,YAAa,CACTnlB,aAAc,IAIlBolB,EAAgB,GAChBt2B,EAAU,GAEVg0B,EAAiB,GACjB/lC,KAAKjC,MAAMkpC,YACXlB,EACI,6BACI,yBAAKv/B,UAAU,SACX,iDAEJ,yBAAKA,UAAU,SACX,kBAAC,IAAD,CACIV,aAAW,mBACXrH,KAAK,iBACL6B,MAAON,KAAKjC,MAAMgoC,eAClB5/B,UAAWnG,KAAKjC,MAAMoI,UAAU4/B,eAChC9/B,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKghC,eAAe,iBAAkBhhC,IAC1DlB,MAAO,CAAEG,MAAO,SAChBS,WAAY,CAAEiE,UAAW,YAE7B,kBAAC,KAAD,CACI/B,QAAS,SAACzB,GAAD,OAAO,EAAKugC,gBAAgB,iBAAkB,EAAG,IAAKvgC,IAC/Dc,aAAW,8BAEX,kBAAC,KAAD,CAActC,MAAOuJ,IAAM7L,QAAQE,iBAEvC,kBAAC,KAAD,CACIqF,QAAS,SAACzB,GAAD,OAAO,EAAKmgC,gBAAgB,iBAAkB,EAAG,IAAKngC,IAC/Dc,aAAW,8BAEX,kBAAC,KAAD,CAAWtC,MAAOuJ,IAAM7L,QAAQE,oBAMhDpB,KAAKjC,MAAMkpC,WAAajnC,KAAKjC,MAAMgoC,eAAiB,IACpDsC,EACI,6BACI,yBAAK7hC,UAAU,SACX,gDAEJ,yBAAKA,UAAU,SACX,kBAAC,KAAD,CACIV,aAAW,iBACX4L,QAAS1R,KAAKjC,MAAM4T,QACpBlL,QAAS,kBAAM,EAAKw/B,iBAAiB,WAAY,EAAKloC,MAAM4T,eAK5E3R,KAAKjC,MAAMkpC,WAAajnC,KAAKjC,MAAM4T,SAAa3R,KAAKjC,MAAMgoC,eAAiB,IAAM,IAClFh0B,EACI,6BACI,yBAAKvL,UAAU,SACX,wDAEJ,yBAAKA,UAAU,SACX,kBAAC,IAAD,CACIV,aAAW,0BACXrH,KAAK,UACL6B,MAAON,KAAKjC,MAAMgU,QAClB5L,UAAWnG,KAAKjC,MAAMoI,UAAU4L,QAChC9L,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKghC,eAAe,UAAWhhC,IACnDlB,MAAO,CAAEG,MAAO,SAChBS,WAAY,CAAEiE,UAAW,YAE7B,kBAAC,KAAD,CACI/B,QAAS,SAACzB,GAAD,OAAO,EAAKugC,gBAAgB,UAAW,EAAG,EAAKxnC,MAAMgoC,eAAgB/gC,IAC9Ec,aAAW,yBAEX,kBAAC,KAAD,CAActC,MAAOuJ,IAAM7L,QAAQE,iBAEvC,kBAAC,KAAD,CACIqF,QAAS,SAACzB,GAAD,OAAO,EAAKmgC,gBAAgB,UAAW,EAAG,EAAKpnC,MAAMgoC,eAAgB/gC,IAC9Ec,aAAW,yBAEX,kBAAC,KAAD,CAAWtC,MAAOuJ,IAAM7L,QAAQE,oBAMpD,IAAI4lC,EAAiBhnC,KAAKjC,MAAMa,SAAW,6BACvC,yBAAK4H,UAAU,SACX,iDAEJ,yBAAKA,UAAU,SACX,kBAAC,IAAD,CACIV,aAAW,mBACXrH,KAAK,iBACL6B,MAAON,KAAKjC,MAAMipC,eAClB7gC,UAAWnG,KAAKjC,MAAMoI,UAAU6gC,eAChC/gC,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKghC,eAAe,iBAAkBhhC,IAC1DlB,MAAO,CAAEG,MAAO,SAChBS,WAAY,CAAEiE,UAAW,YAE7B,kBAAC,KAAD,CACI1C,aAAW,6BACXrH,KAAK,6BACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKugC,gBAAgB,iBAAkB,EAAG,IAAKvgC,KAE/D,kBAAC,KAAD,CAAcxB,MAAOuJ,IAAM7L,QAAQE,iBAEvC,kBAAC,KAAD,CACI0E,aAAW,6BACXrH,KAAK,6BACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKmgC,gBAAgB,iBAAkB,EAAG,IAAKngC,KAE/D,kBAAC,KAAD,CAAWxB,MAAOuJ,IAAM7L,QAAQE,mBAGnC,GAELknC,EAAyB,wBAAI3kC,MAAO,CAAEsf,aAAc,QAA3B,oBACzBslB,EAAmB,kBAACxzB,GAAA,iBAAD,CAAkBtW,KAAK,eAAeuW,gBAAiBhV,KAAKjC,MAAMa,SAChDqH,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAK0hC,iBAAiB1hC,KAC/E,kBAACkQ,GAAA,YAAD,CACIjP,aAAW,oCACXxF,MAAM,QACNgG,MAAM,sBACN3C,MAAOwkC,EAAOC,cAElB,kBAACrzB,GAAA,YAAD,CACIjP,aAAW,oCACXxF,MAAM,QACNgG,MAAM,sBACN3C,MAAOwkC,EAAOC,YACdxvB,WAAS,IAEb,kBAAC7D,GAAA,YAAD,CACIjP,aAAW,qCACXxF,MAAM,SACNgG,MAAM,uBACN3C,MAAOwkC,EAAOC,eAIlBI,EAA2C,KAAxBxoC,KAAKjC,MAAMa,SAAkB,6BAChD,yBAAK4H,UAAU,SACX,mDAEJ,yBAAKA,UAAU,SACX,kBAAC,KAAD,CACIV,aAAW,oBACX4L,QAAS1R,KAAKjC,MAAMkpC,UACpBxgC,QAAS,kBAAM,EAAKw/B,iBAAiB,aAAc,EAAKloC,MAAMkpC,gBAGjE,GACLwB,OAAsCnhC,IAAtBtH,KAAKlC,MAAMuvB,QAC4D,GAApErtB,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAAI3Y,UAAUluB,QAClC,WAAxBQ,KAAKjC,MAAMa,SAAwB,6BAClC,yBAAK4H,UAAU,SACX,wBACI7C,MAAO,CAAEsf,aAAc,QAD3B,mBAKJ,6BACI,kBAAClO,GAAA,iBAAD,CAAkBtW,KAAK,iBAAiBuW,gBAAiBhV,KAAKjC,MAAM0oC,kBAClDxgC,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAK2hC,0BAA0B3hC,KACjE,kBAACkQ,GAAA,YAAD,CACIjP,aAAW,oCACXxF,MAAM,QACNgG,MAAM,QACN3C,MAAOwkC,EAAOC,YACdxvB,WAAS,IAEb,kBAAC7D,GAAA,YAAD,CACIjP,aAAW,oCACXxF,MAAM,QACNgG,MAAM,QACN3C,MAAOwkC,EAAOC,gBAK1B,yBAAK5hC,UAAU,SACX,kBAAC,GAAD,CACImH,GAAG,aACHrH,MAAM,8CACNL,SAAU,SAAApB,GAAC,OAAI,EAAKshC,eAAethC,EAAG,kBACtCvE,MAAON,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAA5C,UAA6D,GACpEr8B,KAAMhK,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAA5C,UAA6D11B,KAAI,SAAC+3B,GACpE,GAAkB,MAAdA,EAAO,GACP,MAAO,CAAEpoC,MAAOooC,EAAQ/5B,KAAK,QAAD,OAAU,EAAK7Q,MAAMquB,QAAQC,QAAQsc,GAAU,IACxE,GAAkB,MAAdA,EAAO,GAAY,CAC1B,IAAIC,EAAY,EAAK7qC,MAAMuvB,OAAOqb,GAAQ5jC,KAGtC4xB,EAAgB,EAAKA,cAAc,EAAK54B,MAAMuvB,OAAOqb,IACzD,MAAO,CAAEpoC,MAAOooC,EAAQ/5B,KAAK,GAAD,OAAKg6B,EAAL,YAAkBjS,QAItD5yB,MAAO,QAGV,GAGxB9D,KAAKlC,MAAMuoC,iBACZiC,EAAyB,GACzBC,EAAmB,IAGkB,IAArCvoC,KAAKlC,MAAMuoC,eAAe7mC,SAC1B+oC,EAAmB,IAGnBvoC,KAAKlC,MAAMgpC,WACXE,EAAiB,GACjBsB,EAAyB,GACzBC,EAAmB,GACnBC,EAAmB,IAGvB,IAAMI,EACF,kBAAC,IAAD,CACIx9B,MAAOpL,KAAKlC,MAAMgpC,SAAW,mBAAqB,aAClDztB,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMgN,KACjB8L,eAAgB5W,KAAKlC,MAAMqpC,YAC3BtwB,uBAAqB,EACrB7L,aAAc,CAAElH,MAAO,SACvBkf,WAAY,CAAExa,UAAW,UACzBke,eAAe,aAEd4hB,EACAC,EACAE,EACAzB,EACAwB,EACAzC,EACAsC,EACAt2B,GAIT,OACI,6BACK62B,O,GA9nB2B1oC,IAAMC,WCT7B0oC,G,4MACnB9qC,MAAQ,CACN+M,MAAM,EACNwR,YAAa3d,OAAOwE,Y,EAGtB2lC,cAAgB,WACd,EAAK/oC,SAAS,CAACuc,YAAY3d,OAAOwE,c,EAWpCyiB,WAAa,WACX,EAAK7lB,SAAS,CAAC+K,MAAM,IACrB,EAAKhN,MAAMyZ,aAAY,I,EAGzBwO,YAAc,WACZ,EAAKhmB,SAAS,CAAC+K,MAAM,IACrB,EAAKhN,MAAMyZ,aAAY,I,EAGzBwxB,qBAAuB,WACrB,GAA4B,SAAxB,EAAKjrC,MAAMstB,WAAqB,CAAC,IAAD,iBACb,EAAKttB,MAAM4rB,iBADE,IAClC,2BAAiD,CAAC,IAAvCiR,EAAsC,QACzC3pB,EAAQ,EAAKlT,MAAMuvB,OAAO,EAAKvvB,MAAM6tB,MAAMgP,GAAQ7N,UACzD,GACG9b,EAAMosB,SAAS59B,OAAO,IAAMwR,EAAMosB,SAAS,KAAKzC,GAAW3pB,EAAMosB,SAAS,IAAMpsB,EAAMosB,SAAS,KAAKzC,IAEpG3pB,EAAM2rB,OAAOn9B,OAAO,IAAMwR,EAAM2rB,OAAO,KAAKhC,GAAW3pB,EAAM2rB,OAAO,IAAM3rB,EAAM2rB,OAAO,KAAKhC,GAC7F,OAAO,GAPuB,+BAUpC,OAAO,G,EAGTqO,SAAW,WACT,IAAM5d,EAAa,EAAKttB,MAAMstB,WACxB1Q,EAAO,EAAK5c,MAAMstB,EAAW,KAAK,EAAKttB,MAAM4rB,gBAAgB,IAC/Duf,EAAY,EAAKnrC,MAAL,UAAc4c,EAAK0Q,WAAW9Q,cAA9B,QAAkD8R,QAAQ1R,EAAK/M,IAAI,EAEnF,GAAI+M,EAAK,CACP,GAAI,EAAKquB,uBACP,OAAI,EAAKjrC,MAAM4rB,gBAAgBlqB,OAAO,EAC7B,0FAEA,qDAEJ,GAAwC,IAApC,EAAK1B,MAAM4rB,gBAAgBlqB,OACpC,MAAO,mCAAqCkb,EAAK0Q,WAAW9Q,cAAgB,IAAM2uB,EAAY,IAE9F,IAAIC,EAAWxuB,EAAK0Q,WAAW9Q,cAE/B,MADe,SAAX4uB,IAAmBA,EAAW,SAC3B,mCACP,EAAKprC,MAAM4rB,gBAAgBlqB,OAAS,IAAM0pC,EAAW,O,EAM3DnkC,OAAS,SAACC,GAER,GADIA,GAAGA,EAAEC,iBAC+B,IAApC,EAAKnH,MAAM4rB,gBAAgBlqB,OAAY,CAEzC,IAAImO,EAAK,EAAK7P,MAAM4rB,gBAAgB,GACpC,EAAK5rB,MAAMoH,OAAOikC,aAAax7B,OAC1B,CAEL,IAAMyd,EAAa,EAAKttB,MAAMstB,WAAW9Q,cACrCtQ,EAAO,GACXA,EAAKohB,EAAW,KAAM,GAJjB,qBAKU,EAAKttB,MAAM4rB,iBALrB,IAKL,2BAA2C,CAAC,IAAnC/b,EAAkC,QACzC3D,EAAKohB,EAAW,KAAKxjB,KAAK+F,IANvB,8BAQL,EAAK7P,MAAMoH,OAAOkkC,YAAYp/B,GAEhC,EAAK+b,e,kEAvELpnB,OAAOigB,iBAAiB,SAAU5e,KAAK8oC,iB,6CAIvCnqC,OAAOkgB,oBAAoB,SAAU7e,KAAK8oC,iB,+BAuE1C,IAAMzvB,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAOtG,KAAK+oC,uBAAuB,OAAO,SAC1CxiC,SAAO,EACPE,QAASzG,KAAK+lB,cAEhB,kBAAC,IAAD,CACEzf,MAAM,cACN4S,iBAAe,EACfzS,QAASzG,KAAK+E,OACd+U,gBAAgB,UAChBV,WAAW,UACXzV,MAAO3D,KAAK+oC,uBAAuB,CAAC52B,QAAQ,QAAQ,MAIxD,OACE,6BACE,kBAAC,IAAD,eACE7L,MAAM,SACNN,UAAWhG,KAAKlC,MAAMkI,UACtBS,QAASzG,KAAK4lB,WACd9L,gBAAgB,UAChBV,WAAW,UACX3L,SAAUzN,KAAKlC,MAAM2P,UACjBhK,IAPN,CAQEE,MAAO3D,KAAKlC,MAAMkI,UAAW,GAAtB,2BAA+BvC,IAAUE,OAAzC,IAAgDG,MAAO,WAEhE,kBAAC,IAAD,CACEsH,MAAOpL,KAAKgpC,WACZ3vB,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKjC,MAAM+M,KACjB8L,eAAgB5W,KAAK+lB,mB,GAvHuB7lB,IAAMC,W,+DCMvCkpC,G,kDACnB,WAAYvrC,GAAQ,IAAD,8BACjB,cAAMA,IAaR8nB,WAAa,WACX,EAAK7lB,SAAS,CACZ+K,MAAM,EACNw+B,SAAU,GACVC,YAAa,GACbnxB,IAAK,GACLoa,MAAM,EACN5jB,WAAY,GACZ2jB,OAAQ,OAEV,EAAKz0B,MAAMyZ,aAAY,IAxBN,EA4BnBwO,YAAc,WACZ,EAAKhmB,SAAS,CAAE+K,MAAM,IACtB,EAAKhN,MAAMyZ,aAAY,IA9BN,EAiCnBiyB,kBAAoB,SAAA56B,GAClB,EAAK7O,SAAS,CACZ6O,WAAYA,EACZ2jB,OAAQ,QApCO,EAwCnBkX,iBAAmB,SAAApgC,GAGjB,IAAIkpB,EAAS,KACb,IAAK,IAAI5kB,KAAM,EAAK7P,MAAM+wB,MAAO,CAC/B,IAAMqE,EAAO,EAAKp1B,MAAM+wB,MAAMlhB,GAC1BulB,EAAK9nB,QAAU/B,IACjBkpB,EAASW,EAAKvlB,IAGlB,EAAK5N,SAAS,CAAEwyB,WAAU,WACpBA,GAAQ,EAAKxtB,aAnDF,EAuDnBA,OAAS,WACP,GAA0B,OAAtB,EAAKhH,MAAMw0B,OAEb,EAAKz0B,MAAMoH,OAAOwkC,SAAS,EAAK3rC,MAAMw0B,YACjC,CAEL,IAAIA,EAAS,KACb,IAAK,IAAI5kB,KAAM,EAAK7P,MAAM+wB,MAAO,CAC/B,IAAMqE,EAAO,EAAKp1B,MAAM+wB,MAAMlhB,GAC1BulB,EAAK9nB,QAAU,EAAKrN,MAAM6Q,aAAY2jB,EAASW,EAAKvlB,IAEtD4kB,EACF,EAAKz0B,MAAMoH,OAAOwkC,SAASnX,GAG3B,EAAKz0B,MAAMoH,OAAOykC,oBAChB,EAAK5rC,MAAM6Q,WACX,EAAK7Q,MAAMurC,SACX,EAAKvrC,MAAMwrC,YACX,EAAKxrC,MAAMqa,IACX,EAAKra,MAAMy0B,MAIjB,EAAKzM,eA/EY,EAkFnB6jB,WAAa,WACX,IAAK,IAAIrX,KAAU,EAAKz0B,MAAM+wB,MAAO,CAEnC,GADa,EAAK/wB,MAAM+wB,MAAM0D,GACrBnnB,QAAU,EAAKrN,MAAM6Q,WAC5B,OAAO,EAGX,OAAO,GAzFU,EA+FnBi7B,iBAAmB,SAAAprC,GACjB,OAAO,kBAAC,KAAD,CAAU0Q,IAAK1Q,EAAM6B,MAAO7B,EAAMohB,YAAaphB,KAhGrC,EAmGnBwH,SAAW,SAACxH,EAAM6B,GAChB,EAAKP,SAAL,eAAiBtB,EAAO6B,KApGP,EAuGnBwpC,8BAAgC,WAC9B,OAAO1pC,OAAO9B,KAAK,EAAKR,MAAM+wB,OAAO3f,QAAO,SAAAqjB,GAC1C,OAAQ,EAAKz0B,MAAMisC,YAAY/hC,SAASuqB,OAvG1C,EAAKx0B,MAAQ,CACX+M,MAAM,EACNw+B,SAAU,GACVC,YAAa,GACbnxB,IAAK,GACLoa,MAAM,EACN5jB,WAAY,GACZ2jB,OAAQ,MATO,E,qDA6GT,IAAD,OAMDlZ,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,SACNG,QAASzG,KAAK+lB,YACdpiB,MAAO,CAAEG,MAAO,MAAOG,YAAa,KAAMI,OAAQ,kBAClD6U,iBAAe,IAEjB,kBAAC,IAAD,CACE5S,MACEtG,KAAK4pC,cAAiD,IAAjC5pC,KAAKjC,MAAM6Q,WAAWpP,OACvC,cACA,uBAEN+G,SAAO,EACPE,QAASzG,KAAK+E,OACdpB,MAAO,CAAEG,MAAO,OAChBwK,UAAWtO,KAAK4pC,cAAwC,KAAxB5pC,KAAKjC,MAAMurC,YAI3CU,EAAc,+BACbhqC,KAAK4pC,cAAgB5pC,KAAKjC,MAAM6Q,WAAWpP,OAAS,IACvDwqC,EACE,6BACE,kBAAC,KAAD,CACE1pC,MAAON,KAAKjC,MAAMurC,SAClBrjC,SAAU,SAACjB,EAAG8Q,EAAGjR,GAAP,OAAa,EAAKoB,SAAS,WAAYpB,IACjDqB,kBAAkB,WAClBF,WAAS,EACTrC,MAAO,CAAEqY,WAAY,KAEpBhc,KAAKlC,MAAMmsC,WAAWt5B,IAAI3Q,KAAK6pC,mBAElC,kBAAC,IAAD,CACE3jC,kBAAkB,cAClBzH,KAAK,cACL6B,MAAON,KAAKjC,MAAMwrC,YAClBtjC,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,cAAepB,IACjDqlC,WAAS,EACTlkC,WAAS,EACTrC,MAAO,CAAEqY,WAAY,MAEvB,kBAAC,IAAD,CACI9V,kBAAkB,MAClBzH,KAAK,MACL6B,MAAON,KAAKjC,MAAMqa,IAClBnS,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,MAAOpB,IACzCqlC,WAAS,EACTlkC,WAAS,EACTrC,MAAO,CAAEqY,WAAY,MAEzB,yBAAKxV,UAAU,QAAQ7C,MAAO,CAAEN,WAAY,MAA5C,0CAGA,yBAAKmD,UAAU,SACb,kBAAC,KAAD,CACE/H,KAAK,OACL6B,MAAON,KAAKjC,MAAMy0B,KAClB9gB,QAAS1R,KAAKjC,MAAMy0B,KACpB7uB,MAAO,CAAEN,WAAY,IACrBoD,QAAS,kBAAM,EAAKR,SAAS,QAAS,EAAKlI,MAAMy0B,YAO3D,IAAIoW,EACF,kBAAC,IAAD,CACEx9B,MAAO,cACPiO,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKjC,MAAM+M,KACjB8L,eAAgB5W,KAAK+lB,YACrBlP,uBAAqB,EACrB7L,aAAc,CAAElH,MAAO,QAASd,OAAQ,SACxCggB,WAAY,CAAExa,UAAW,UACzBke,eAAe,aAEf,kBAAC,KAAD,CACExgB,kBAAmB,wBACnB0I,WAAY5O,KAAKjC,MAAM6Q,WACvBmB,cAAe/P,KAAKwpC,kBACpBW,aAAcnqC,KAAKypC,iBACnB55B,WAAY7P,KAAK8pC,gCAAgCn5B,KAAI,SAAA4hB,GACnD,MAAO,CACL6X,QAAS,EAAKtsC,MAAM+wB,MAAM0D,GAAQnnB,MAClCi/B,SAAU9X,MAGdrjB,OAAQ,SAACN,EAAYO,GAAb,OAAkD,IAA7BA,EAAIid,QAAQxd,IACzCgB,aAAa,EACbE,iBAjGmB,CACvBnB,KAAM,UACNrO,MAAO,YAgGH0F,WAAS,EACTskC,UAAW,CAAEj6B,UAAW,IAAKuN,SAAU,QACvCzX,WACGnG,KAAK4pC,cAAgB5pC,KAAKjC,MAAM6Q,WAAWpP,OAAS,EACjD,iGACA,GAEN+qC,WAAY,CAAE/mC,MAAO,WACrBgnC,wBAAyB,CAAEhnC,MAAO,aAEnCwmC,GAIL,OACE,yBAAKrmC,MAAO,CAAE4U,MAAO,UACnB,kBAAC,KAAD,CACErG,QAAQ,gBACRzE,SAAUzN,KAAKlC,MAAM2P,SACrBhH,QAASzG,KAAK4lB,YAEd,kBAAC,KAAD,OAEDgjB,O,GAxO4B1oC,IAAMC,WCbpC,SAASsqC,GAAgBz5B,EAAO2a,GAAyB,IAAlB+e,IAAiB,yDACzDC,EAA4B,GAC5BD,GACFC,EAA0B/iC,KAAK,CAC7BunB,MAAO,OACPxhB,GAAI,SALqD,qBAQxCqD,EAAM0c,WARkC,IAQ7D,2BAAsC,CAAC,IAA9BC,EAA6B,QACX,MAArBA,EAASzC,OAAO,IAAUyf,EAA0B/iC,KAAK+jB,EAAMgC,KATR,8BAW7D,OAAOgd,E,ICHYC,G,kDAEnB,WAAY9sC,GAAQ,IAAD,8BACjB,cAAMA,IAcRmX,aAAe,SAACnQ,EAAMxE,GACpB,EAAKP,SAAL,eAAgB+E,EAAMxE,KAhBL,EAmBnBuqC,eAAiB,SAACnwB,EAAMhG,GACtB,OAAIgG,EAAK/M,GACA,CACLrN,MAAMoa,EAAK/M,GACXgB,KAAK,SAAW,EAAK7Q,MAAMquB,QAAQC,QAAQ1R,EAAK/M,IAAI,IAG/C,CACLrN,MAAM,QACNqO,KAAK,UA5BQ,EAiCnBm8B,SAAW,WACT,IAAIC,EAAwC,UAAvB,EAAKhtC,MAAMitC,UAAoB,CAAC,EAAKjtC,MAAMktC,SAAS,CAAC,EAAKltC,MAAMitC,UAAU,EAAKjtC,MAAMktC,SAC1G,EAAKntC,MAAMwhC,YAAY,EAAKxhC,MAAMgH,KAAMimC,GACxC,EAAKjtC,MAAMqpC,eAlCX,EAAKppC,MAAQ,CACXitC,UAAW,KACXC,QAAS,MAJM,E,wEASjBjrC,KAAKD,SAAS,CACZirC,UAAW,KACXC,QAAS,S,+BA4BH,IAAD,OACHC,EAAoC,KAAlBlrC,KAAKlC,MAAMgH,MAAwD,IAA3C9E,KAAKlC,MAAMkT,MAAMhR,KAAKlC,MAAMgH,MAAMtF,OAC1E6Z,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAO4kC,EAAe,SAAW,QACjC3kC,SAAS,EACT2S,iBAAiB,EACjBzS,QAAS,WAAK,EAAK3I,MAAMqpC,iBAE3B,kBAAC,IAAD,CACE7gC,MAAO,SACPC,SAAS,EACTE,QAASzG,KAAK8qC,SACdnnC,MAAOunC,EAAe,CAACt5B,WAAW,IAAI,CAACO,QAAQ,UAEjD,kBAAC,IAAD,CACE7L,MAAO,UAAYtG,KAAKlC,MAAMgH,KAC9BnB,MAAOunC,EAAe,CAAC/4B,QAAQ,QAAQ,CAACoG,MAAM,QAC9CtV,WAAY,CAACO,MAAM,WACnBiD,QAAS,WAAK,EAAK3I,MAAMY,SAAU,EAAKZ,MAAMqpC,kBAG9CgE,EAAe,GACfR,EAA4B,CAAC,CAACh9B,GAAG,OAAOkI,OAAO40B,GAAgBzqC,KAAKlC,MAAMsvB,YAAaptB,KAAKlC,MAAM6tB,OAAO,IAC7G,GAAIuf,EAAgB,CAElB,IAAIE,EACF,kBAAC,GAAD,CACEj8B,IAAI,kBACJxB,GAAG,kBACHzH,kBAAmB,YAAclG,KAAKlC,MAAMgH,KAC5CwB,MAAO,YAActG,KAAKlC,MAAMgH,KAChCxE,MAAON,KAAKjC,MAAMitC,UAClB/kC,SAAU,SAACpB,GAAD,OAAK,EAAKoQ,aAAa,YAAYpQ,IAC7CmF,KAAM2gC,EAA0Bh6B,KAAI,SAAC9L,EAAEiR,GAAH,OAAO,EAAK+0B,eAAehmC,EAAE,QAE/DwmC,EACF,kBAAC,GAAD,CACEl8B,IAAI,kBACJxB,GAAG,kBACHzH,kBAAmB,UAAYlG,KAAKlC,MAAMgH,KAC1CxE,MAAON,KAAKjC,MAAMktC,QAClBhlC,SAAU,SAACpB,GAAD,OAAK,EAAKoQ,aAAa,UAAUpQ,IAC3CmF,KAAM2gC,EAA0Bz7B,QAAO,SAACwL,GAAD,OAAuB,OAAZA,EAAK/M,KAAyC,OAAzB,EAAK5P,MAAMitC,WAA+C,UAAzB,EAAKjtC,MAAMitC,WAAyB,EAAKltC,MAAMquB,QAAQC,QAAQ1R,EAAK/M,IAAM,EAAK7P,MAAMquB,QAAQC,QAAQ,EAAKruB,MAAMitC,eAAcr6B,KAAI,SAAC9L,EAAEiR,EAAErW,GAAL,OAAS,EAAKorC,eAAehmC,EAAE,QAE7QsmC,EAAavjC,KAAKwjC,GAClBD,EAAavjC,KAAKyjC,QACf,GAAsB,KAAlBrrC,KAAKlC,MAAMgH,MAAa9E,KAAKlC,MAAMkT,MAAMhR,KAAKlC,MAAMgH,MAAMtF,OAAO,EAAG,CAG7E,IAAM8rC,EAAuD,IAA3CtrC,KAAKlC,MAAMkT,MAAMhR,KAAKlC,MAAMgH,MAAMtF,OAAYQ,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMkT,MAAMhR,KAAKlC,MAAMgH,MAAM,IAAM,KACnHymC,EAAqD,IAA3CvrC,KAAKlC,MAAMkT,MAAMhR,KAAKlC,MAAMgH,MAAMtF,OAAYQ,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMkT,MAAMhR,KAAKlC,MAAMgH,MAAM,IAAM9E,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMkT,MAAMhR,KAAKlC,MAAMgH,MAAM,IACpK0mC,EAAQ,CAAC,CAAE79B,GAAI,OAAQkI,OAAO80B,EAA0Bz7B,QAAO,SAACwL,GAAD,OAAuB,OAAZA,EAAK/M,IAAe,EAAK7P,MAAMquB,QAAQC,QAAQ1R,EAAK/M,IAAM,EAAK7P,MAAMquB,QAAQC,QAAQmf,EAAQ59B,IAAI,MAC3K89B,EAAQd,EAA0Bz7B,QAAO,SAACwL,GAAD,OAAyB,OAAd4wB,GAAkC,OAAZ5wB,EAAK/M,IAA+B,OAAd29B,GAAkC,OAAZ5wB,EAAK/M,IAAe,EAAK7P,MAAMquB,QAAQC,QAAQ1R,EAAK/M,IAAM,EAAK7P,MAAMquB,QAAQC,QAAQkf,EAAU39B,IAAI,KAC3Ny9B,EACF,kBAAC,GAAD,CACEj8B,IAAI,kBACJxB,GAAG,kBACHzH,kBAAmB,YAAclG,KAAKlC,MAAMgH,KAC5CxE,MAAmB,OAAZgrC,EAAiBA,EAAU39B,GAAG,QACrC1H,SAAU,SAACpB,GAAD,OAAK,EAAK/G,MAAM4tC,yBAAyB,EAAK5tC,MAAMgH,KAAMD,EAAG,IACvEmF,KAAMwhC,EAAM76B,KAAI,SAAC9L,EAAEiR,GAAH,OAAO,EAAK+0B,eAAehmC,EAAE,QAE7CwmC,EACF,kBAAC,GAAD,CACEl8B,IAAI,kBACJxB,GAAG,kBACHzH,kBAAmB,UAAYlG,KAAKlC,MAAMgH,KAC1CxE,MAAOirC,EAAQ59B,GACf1H,SAAU,SAACpB,GAAD,OAAK,EAAK/G,MAAM4tC,yBAAyB,EAAK5tC,MAAMgH,KAAMD,EAAG,IACvEmF,KAAMyhC,EAAM96B,KAAI,SAAC9L,EAAEiR,GAAH,OAAO,EAAK+0B,eAAehmC,EAAE,QAEjDsmC,EAAavjC,KAAKwjC,GAClBD,EAAavjC,KAAKyjC,GAGpB,OACE,6BACE,kBAAC,IAAD,CACEjgC,MAAO8/B,EAAgB,OAASlrC,KAAKlC,MAAMgH,KAAO,aAAe,QAAU9E,KAAKlC,MAAMgH,KAAO,aAC7FuU,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMgN,KACjB8L,eAAgB,kBAAI,EAAK9Y,MAAMqpC,eAC/Bn8B,aAAc,CAAClH,MAAO,MAAOF,SAAS,QAASmf,SAAS,UAEvDooB,Q,GA/HsCjrC,IAAMC,WCR5CwrC,GAAgB,WACzB,IAAIzoC,EAAW,KAOf,OANIvE,OAAOwE,YAAY,OACrBD,EAAW,QAETvE,OAAOwE,YAAY,MACrBD,EAAW,QAEN,CACLa,UAAU,CACRf,OAAOrE,OAAOwE,YAAY,KAAK,GAAG,GAClCW,MAAMnF,OAAOwE,YAAY,KAAK,GAAG,GACjC6Y,UAAUrd,OAAOwE,YAAY,KAAK,MAAM,KACxCc,YAAYtF,OAAOwE,YAAY,KAAK,MAAM,QAE5CF,WAAY,CACVC,WACAQ,WAAW,UCdV,SAASkoC,GAAe9tC,EAAOo1B,GACpC,IAAI2Y,EAAW,WACb/tC,EAAMoH,OAAO4mC,WAAW5Y,EAAKvlB,KAG/B,OADI7P,EAAMiuC,aAAYF,EAAW,MAE/B,kBAAC,KAAD,CACE18B,IAAK+jB,EAAKvlB,GACVhK,MAAO,CAAEM,YAAa,EAAGgf,aAAc,GACvC3D,gBAAiBusB,EACjBplC,QAAS,kBAAM3I,EAAM0yB,eAAe0C,IACpCzlB,SAAU3P,EAAM2P,SAChBxK,WAAY,CAAEC,SAAUpF,EAAMwe,aAAe,KAAO,GAAK,OAExD4W,EAAK9nB,O,ICSS4gC,G,kDACnB,WAAYluC,GAAQ,IAAD,8BACjB,cAAMA,IAoERmuC,qBAAuB,WAAoB,IAAnB3rC,EAAkB,wDACxC,EAAKP,SAAS,CAAEmsC,mBAAoB5rC,EAAO6rC,sBAAsB,KACnD,IAAV7rC,GAAiB,EAAKxC,MAAMyZ,aAAY,IAvE3B,EA0EnB60B,oBAAsB,WAAoB,IAAnB9rC,EAAkB,wDACvC,EAAKP,SAAS,CAAEssC,kBAAmB/rC,EAAO6rC,sBAAsB,KAClD,IAAV7rC,GAAiB,EAAKxC,MAAMyZ,aAAY,IA5E3B,EA+EnB+0B,wBAA0B,SAAAz+B,GACxBA,EAAM5I,iBACN,EAAKlF,SAAS,CACZosC,sBAAsB,EACtBtkB,gBAAiBha,EAAMiP,iBAnFR,EAuFnByvB,4BAA8B,WAC5B,EAAKxsC,SAAS,CACZosC,sBAAsB,KAzFP,EAmGnBhG,eAAiB,SAAC7lC,EAAO0rB,GACvB,GAAsD,IAAlD5rB,OAAO9B,KAAK,EAAKR,MAAMuoC,gBAAgB7mC,OAEzC,EAAKgtC,aAAaxgB,EAAe1rB,OAC5B,CAEL,IAAImsC,EAAmB,GACvBA,EAAiBzgB,GAAiB1rB,EAClC,EAAKP,SAAS0sC,KA3GC,EA+GnBC,gBAAkB,SAACpsC,EAAO0rB,GACxB,IAAI2gB,EAAoB,GACxBA,EAAkB3gB,GAAiB1rB,EACnC,IAAIssC,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9C,EAAKjsB,SAAL,2BAAmB4sC,GAAsBC,KApHxB,EA2InBJ,aAAe,SAACxgB,EAAe1rB,GAC7B,IAAI0Q,EAAQ,GACZA,EAAMgb,GAAiB1rB,EACvB,IAAIqN,EAAK,EAAK7P,MAAMuoC,eAAe,GACnC,EAAKvoC,MAAMoH,OAAOo6B,YAAY3xB,EAAIqD,IA/IjB,EAyLnB67B,YAAc,WACZ,IADkB,EACdC,EAAQ,GADM,eAEC,EAAKhvC,MAAMisC,aAFZ,IAElB,2BAA2C,CAAC,IAAnCxX,EAAkC,QACnCW,EAAO,EAAKp1B,MAAM+wB,MAAM0D,GAC9Bua,EAAMllC,KAAKgkC,GAAe,EAAK9tC,MAAOo1B,KAJtB,8BAMlB,OAAO4Z,GA/LU,EAkMnBC,gBAAkB,WAChB,EAAKhtC,SAAS,CAAEitC,WAAY,QAnMX,EAsMnBC,oBAAsB,SAAAjoC,GACpBA,EAAEsiB,kBACF,EAAKxpB,MAAMoH,OAAOw0B,2BAA2B,CAC3C50B,KAAM,WACNxE,MAAO,EAAKxC,MAAMuoC,eAAe,KAEnC,EAAKkG,+BA5MY,EA+MnBW,oBAAsB,SAAAloC,GACpBA,EAAEsiB,kBACF,EAAKxpB,MAAMoH,OAAOw0B,2BAA2B,CAC3C50B,KAAM,SACNxE,MAAO,EAAKxC,MAAMuoC,eAAe,KAEnC,EAAKkG,+BArNY,EAwNnBb,yBAA2B,SAAC5mC,EAAM61B,EAAQjmB,GACxC,IAAMqnB,EAAc,EAAKj+B,MAAMuvB,OAAO,EAAKvvB,MAAMuoC,eAAe,IAC1D/lC,EAAmB,UAAXq6B,EAAqB,KAAOA,EACtCwS,EAAe,GACnBA,EAAaroC,GAAQi3B,EAAYj3B,GACC,IAA9BqoC,EAAaroC,GAAMtF,OACrB2tC,EAAaroC,GAAM4P,GAASpU,EACW,IAA9B6sC,EAAaroC,GAAMtF,QAA0B,IAAVkV,EAE5Cy4B,EAAaroC,GAAMoS,OAAOxC,EAAO,EAAGpU,GACG,IAA9B6sC,EAAaroC,GAAMtF,QAA0B,IAAVkV,IAE5Cy4B,EAAaroC,GAAQ,CAACxE,IAEnB6sC,EAAaroC,GAAM,IAAIqoC,EAAaroC,GAAMoS,OAAO,EAAG,GACzD,EAAKpZ,MAAMoH,OAAOo6B,YAAYvD,EAAYpuB,GAAIw/B,IAvO7B,EA0OnBC,aAAe,WACb,EAAKZ,aAAa,WAAY,KA3Ob,EA8OnBa,aAAe,WACb,EAAKb,aAAa,SAAU,KA/OX,EAkPnBc,0BAA4B,SAAAhtC,GAC1B,EAAKP,SAAS,CAAEwtC,0BAA2BjtC,IAC7B,KAAVA,EACF,EAAKxC,MAAMyZ,aAAY,GAEvB,EAAKzZ,MAAMyZ,aAAY,IAvPR,EA2PnBi2B,gBAAkB,SAACxhB,EAAe1rB,GACV,SAAlB0rB,GAAoD,YAAxB,EAAKluB,MAAM+mB,UACzC,EAAK/mB,MAAMoH,OAAOuoC,kBAAkB,CAClCz8B,MAAM,2BAAM,EAAKlT,MAAMoY,YAAYlF,OAA9B,kBAAsCgb,EAAgB1rB,OA9P9C,EAmQnBotC,cAAgB,SAACC,EAAcC,EAAUC,GACvC,OACE,yBACErnC,UACE,EAAKzI,MAAM,oBAAsB8vC,EAAcpvC,MAC3C,cACA,OAENkF,MAAOvD,OAAO9B,KAAKsvC,GAAUpuC,OAAS,EAAI,CAAE2S,QAAS,QAAW,IAE/Dw7B,EACG,kCACA,oCA7QR,EAAK5vC,MAAL,mDACK,EAAK+vC,uBACL,EAAKC,wBACL,EAAKC,wBAHV,IAIE7B,sBAAsB,EACtBD,oBAAoB,EACpBG,mBAAmB,EACnBkB,0BAA2B,KAE7B,EAAKU,YAAc,EAAKA,YAAY3oC,KAAjB,gBACnB,EAAK4oC,oBAAsB,EAAKA,oBAAoB5oC,KAAzB,gBAZV,E,mEAgBjB,IAAIvH,EAAQ,GACZ,IAAK,IAAI+X,KAAK9V,KAAKlC,MAAM8rB,kBACvB7rB,EACE,oBAAsBiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,OACpB,EAEN,OAAO/X,I,6CAQP,IAAIA,EAAQ,GACZ,IAAK,IAAI+X,KAAK9V,KAAKlC,MAAM8rB,kBACvB7rB,EAAM,SAAWiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,OAA2C,EAC5D/X,EAAM,WAAaiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,OAA2C,EAEhE,OAAO/X,I,4CAQP,IAAIA,EAAQ,GACZ,IAAK,IAAI+X,KAAK9V,KAAKlC,MAAM8rB,kBACvB7rB,EAAMiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,MAA2C,GAEnD,OAAO/X,I,gDAGiBsJ,GACpBrH,KAAKlC,MAAMuoC,eAAe7mC,OAAS,GACrCQ,KAAKD,SAAL,eAAmBC,KAAK8tC,0B,4CAK1B,IAAK,IAAIh4B,KAAK9V,KAAKlC,MAAM8rB,kBACvB,GACE5pB,KAAKjC,MAAM,SAAWiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,OACkC,SAAxD9V,KAAKjC,MAAMiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,OAC6C,KAAxD9V,KAAKjC,MAAMiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,MAEX,OAAO,EAGX,OAAO,I,qCA2BMjH,GACb,IAAIs/B,EAAiB,GACrBA,EAAe,SAAWt/B,IAAW7O,KAAKjC,MAAM,SAAW8Q,GAC3D7O,KAAKD,SAASouC,K,iCAuBLnpC,EAAGgnB,GACZhnB,EAAEC,iBACF,IAAI2nC,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9ChsB,KAAKD,SAAL,eAAmB6sC,IACd5sC,KAAKjC,MAAMqwC,SACdpuC,KAAKwsC,aAAaxgB,EAAehsB,KAAKjC,MAAMiuB,M,iCAIrChnB,EAAGgnB,GACZ,IAAI2gB,EAAoB,GACxBA,EAAkB3gB,GAAiBhsB,KAAKlC,MAAMuvB,OAC5CrtB,KAAKlC,MAAMuoC,eAAe,IAC1Bra,GACF,IAAI4gB,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9ChsB,KAAKD,SAAL,2BAAmB4sC,GAAsBC,M,oCAWzC,IAAI1e,EAAa,GACjB,IAAK,IAAIpY,KAAK9V,KAAKlC,MAAM8rB,kBAAmB,CAC1C,IAAIykB,EAAWruC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,KACXw4B,EAAYtuC,KAAKjC,MAAMiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,MAEX,KAAdw4B,GACc,SAAdA,GACc,cAAdA,IAEApgB,EAAWmgB,GAAYC,GAG3B,IAbY,EAaRh4B,EAAS,GAbD,eAcGtW,KAAKlC,MAAMuoC,gBAdd,IAcZ,2BAA0C,CAAC,IAAlC14B,EAAiC,QACxC2I,EAAO1O,KAAK,CAAE+F,KAAIugB,gBAfR,8BAiBZluB,KAAKlC,MAAMoH,OAAOqpC,aAAaj4B,GAE/BtW,KAAKD,SAAL,eAAmBC,KAAK+tC,2B,2CAGsC,IAA7C1H,EAA4C,uDAA3BrmC,KAAKlC,MAAMuoC,eACzCmI,EAAkB,GACtB,IAAK,IAAI14B,KAAK9V,KAAKlC,MAAM8rB,kBAAmB,CAC1C,IAD0C,EACtCoC,EAAgBhsB,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,KADsB,eAE3BuwB,GAF2B,IAE1C,2BAA+B,CAAC,IAAvB14B,EAAsB,QACzBqD,EAAQhR,KAAKlC,MAAMuvB,OAAO1f,GAC9B,QAAuCrG,IAAnCknC,EAAgBxiB,GAClBwiB,EAAgBxiB,GAAiBhb,EAAMgb,QAClC,GAAIwiB,EAAgBxiB,KAAmBhb,EAAMgb,GAAgB,CAClEwiB,EAAgBxiB,GAAiB,KACjC,QARsC,+BAY5C,OAAOwiB,I,+BA8FC,IAAD,OACDJ,EAAUpuC,KAAKlC,MAAMuoC,eAAe7mC,OAAS,EAC/CivC,EAAgB,GAChBD,EAAkBxuC,KAAK0uC,qBAC3B1uC,KAAKlC,MAAM8rB,kBAAkB7Y,SAAQ,SAAA88B,GACnC,IAAIvnC,EAAQunC,EAAcrjB,YACtBmkB,EAAc,GACdf,EAAW,GACXD,KACF,EAAK7vC,MAAMoY,YAAYlF,QACvB,EAAKlT,MAAMoY,YAAYlF,MAAM68B,EAAcpvC,QACvC,EAAKX,MAAMoY,YAAYlF,MAAM68B,EAAcpvC,MAErB,YAAxB,EAAKX,MAAM+mB,UACc,SAAvBgpB,EAAcpvC,OAChBmvC,EAAW,CAAE5pC,KAAM,UAAW8gB,OAAQ,eACtC6oB,GAAe,GAGfS,IAAY,EAAKtwC,MAAMiuC,YACzB4C,EACE,yBAAKnoC,UAAU,qBACb,kBAAC,KAAD,CACEV,aACE6nC,EACI,SACAE,EAAcrjB,YACd,2BACA,SACAqjB,EAAcrjB,YACd,2BAENokB,YAAa,kBAAC,KAAD,MACbC,cAAe,kBAAC,KAAD,MACfpoC,QAAS,kBACP,EAAK+mC,gBAAgBK,EAAcpvC,MAAOkvC,IAE5ChqC,MAAK,aACHwO,QACE,EAAKrU,MAAMwe,aAAe,KAAO,OAAS,eAC5CxY,MAAO,QACJ8pC,GAEL7pC,UAAS,2BAAO4nC,KAAgB5nC,WAAc6pC,GAC9Cl8B,QAASi8B,EACT5iB,aAAc,WACZ,EAAKhrB,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDqwC,WAAY,WACV,EAAK/uC,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDgP,SAAU,EAAK3P,MAAM2P,WAEtB,EAAKigC,cAAcC,EAAcC,EAAUC,IAGhDvnC,EACE,kBAAC,KAAD,CACER,aACE,WAAa+nC,EAAcrjB,YAAc,kBAE3ClkB,MAAOunC,EAAcrjB,YACrB/jB,QAAS,kBAAM,EAAKkV,eAAekyB,EAAcpvC,OACjDwE,WACG,EAAKlF,MAAM,SAAW8vC,EAAcpvC,MAKjC,CAAEyE,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,OAAS,MAJrD,CACE9Y,MAAO,OACPN,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,OAAS,MAI3D5K,QAAS,EAAK3T,MAAM,SAAW8vC,EAAcpvC,MAC7CkF,MAAO,CAAEwO,QAAS,eAAgBrO,MAAO,QACzCC,UAAS,eAAO4nC,KAAgB5nC,WAChC0J,SAAU,EAAK3P,MAAM2P,YAKzBnH,EACE,yBAAKE,UAAU,qBACb,kBAAC,KAAD,eACEV,aACE6nC,EACI,SACAE,EAAcrjB,YACd,2BACA,SACAqjB,EAAcrjB,YACd,2BAENlkB,MAAOunC,EAAcrjB,YACrBokB,YAAa,kBAAC,KAAD,MACbC,cAAe,kBAAC,KAAD,MACfpoC,QAAS,kBACP,EAAK+mC,gBAAgBK,EAAcpvC,MAAOkvC,IAE5ChqC,MAAK,aAAIwO,QAAS,eAAgBrO,MAAO,QAAW8pC,IAChDjC,KAjBN,CAkBE5nC,UAAS,2BACJ4nC,KAAgB5nC,WADZ,IAEPP,MAAO,QACJoqC,GAELl8B,QAASi8B,EACT5iB,aAAc,WACZ,EAAKhrB,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDqwC,WAAY,WACV,EAAK/uC,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDgP,SAAU,EAAK3P,MAAM2P,YAEtB,EAAKigC,cAAcC,EAAcC,EAAUC,IAKlD,IAAIkB,EAAQP,EAAgBX,EAAcpvC,MAC1C,GAAK,EAAKX,MAAMiuC,WA0FZgD,GADGA,GAAS,EAAKjxC,MAAMuoC,eAAe7mC,OAAS,EAE7C,yBACEmE,MAAO,CACLH,MAAO,OACPwrC,UAAW,SACX9rC,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,QAAU,QACpDzR,QAAS,aALb,oBAaA,yBACElH,MAAO,CACLkH,QAAS,WACT3H,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,QAAU,OAGrDyyB,QA7GP,QAA8BznC,IAA1BumC,EAAcoB,QAAuB,CAEvC,IAAI1+B,EAAY,GACZjQ,EAAQ,OACZutC,EAAcoB,QAAQl+B,SAAQ,SAACm+B,EAAQx6B,GACrCnE,EAAU3I,KAAK,CAAEtH,MAAO4uC,EAAQvgC,KAAMugC,OAEI,OAAxCV,EAAgBX,EAAcpvC,OAChC8R,EAAU3I,KAAK,CAAEtH,MAAO,OAAQqO,KAAM,cAEI,OAAxC6/B,EAAgBX,EAAcpvC,QAChC6B,EAAQkuC,EAAgBX,EAAcpvC,OAExCswC,EACE,kBAAC,GAAD,CACEphC,GAAI,OAASkgC,EAAcpvC,KAC3B6H,MAAOunC,EAAcrjB,YAAc,sBACnCvkB,SAAU,SAAApB,GAAC,OAAI,EAAKshC,eAAethC,EAAGgpC,EAAcpvC,OACpD6P,SAAU8/B,IAAY,EAAKrwC,MAAM,SAAW8vC,EAAcpvC,MAC1DgP,SAAU,EAAK3P,MAAM2P,SACrBzD,KAAMuG,EACNjQ,MAAOA,QAGN,CAEL,IAAI6uC,EAAiB,IAChBf,GAAW,EAAKrwC,MAAM,WAAa8vC,EAAcpvC,QACpD0wC,EACE,6BACE,kBAAC,IAAD,CACErpC,aAAW,SACXS,SAAO,EACPiS,KAAM,kBAAC,KAAD,MACN7U,MAAO,CACLC,SAAU,EAAK9F,MAAMwe,aAAe,IAAM,OAAS,OACnD1K,WAAY,OAEdnL,QAAS,SAAAzB,GAAC,OAAI,EAAKoqC,WAAWpqC,EAAG6oC,EAAcpvC,OAC/CgP,SAAU,EAAK3P,MAAM2P,WAEvB,kBAAC,IAAD,CACE3H,aAAW,SACX2S,WAAS,EACTD,KAAM,kBAAC,KAAD,MACN7U,MAAO,CACLC,SAAU,EAAK9F,MAAMwe,aAAe,IAAM,OAAS,OACnD1K,WAAY,OAEdnL,QAAS,SAAAzB,GAAC,OAAI,EAAKqqC,WAAWrqC,EAAG6oC,EAAcpvC,OAC/CgP,SAAU,EAAK3P,MAAM2P,aAK7B,IAAInN,EAAQ,YACR,EAAKvC,MAAM,WAAa8vC,EAAcpvC,MACxC6B,EAAQ,EAAKvC,MAAM8vC,EAAcpvC,MACxB+vC,EAAgBX,EAAcpvC,QACvC6B,EAAQkuC,EAAgBX,EAAcpvC,OAExCswC,EACE,6BACE,0BAAMhpC,SAAU,SAAAf,GAAC,OAAI,EAAKoqC,WAAWpqC,EAAG6oC,EAAcpvC,QACpD,kBAAC,IAAD,CACEqH,aACE+nC,EAAcrjB,YAAc,uBAE9B/rB,KAAMovC,EAAcpvC,KACpBuH,WAAW,EACX1F,MAAOA,EACP2F,SAAU,SAACjB,EAAGH,GAAJ,OACR,EAAK6nC,gBAAgB7nC,EAAGgpC,EAAcpvC,OAExC6P,SACE8/B,IAAY,EAAKrwC,MAAM,SAAW8vC,EAAcpvC,MAElDgP,SAAU,EAAK3P,MAAM2P,SACrBlJ,WAAY,CACVrB,SAAU,EAAKpF,MAAMwe,aAAe,KAAO,OAAS,UAGvD6yB,IAgCXV,EAAc7mC,KACZ,yBAAKpB,UAAU,MAAM2I,IAAK0+B,EAAcpvC,MACtC,yBAAK+H,UAAU,SACZmoC,EACAroC,GAEH,yBAAKE,UAAU,SAASuoC,QAI9B,IAAIO,EAAY,GACZlB,GAAWpuC,KAAKkuC,wBAClBoB,EACE,kBAAC,IAAD,CACE/oC,SAAO,EACPP,WAAS,EACTS,QAASzG,KAAKiuC,YACd3nC,MAAM,iBACN3C,MAAO,CAAEsf,aAAc,IACvBxV,SAAUzN,KAAKlC,MAAM2P,YAI3B,IAAI8hC,EAAS,GACTC,EAAmB,GAClBpB,IACHoB,EACE,kBAAC,KAAD,CACE1kC,KAAM9K,KAAKjC,MAAMouC,qBACjBtvB,SAAU7c,KAAKjC,MAAM8pB,gBACrBpI,aAAc,CAAEC,WAAY,SAAUC,SAAU,UAChDC,aAAc,CAAEF,WAAY,SAAUC,SAAU,OAChD/I,eAAgB5W,KAAKusC,4BACrBkD,UAAWC,6BAEX,kBAAC,KAAD,KACE,kBAAC,KAAD,CACE7vB,YAAY,gBACZpZ,QAAS,WACP,EAAK3I,MAAMyZ,aAAY,GACvB,EAAK00B,sBAAqB,MAG9B,kBAAC,KAAD,CACEpsB,YAAY,qBACZpZ,QAAS,WACP,EAAK3I,MAAMyZ,aAAY,GACvB,EAAK60B,qBAAoB,QAOnCmD,EACE,kBAAC,IAAD,eACEhpC,SAAO,EACPD,MAAOtG,KAAKlC,MAAMuoC,eAAiB,MAAQ,gBAC3C5/B,QAASzG,KAAKssC,wBACd7+B,SAAUzN,KAAKlC,MAAM2P,UACjBhK,IALN,CAMEE,MACE3D,KAAKlC,MAAMuoC,eAAX,2BAES5iC,IAAUE,OAFnB,IAGMG,MAAO,MACPyU,MAAO,OACPtU,YAAa,OAEf,CAAEH,MAAO,OAAQyU,MAAO,OAAQtU,YAAa,UAKzD,IAAI0rC,EACF,kBAAC,GAAD,CACE3pC,UAAWooC,EACXlpC,OAAQ,CACNikC,aAAcnpC,KAAKlC,MAAMoH,OAAO0qC,YAChCxG,YAAappC,KAAKlC,MAAMoH,OAAO2qC,cAEjCnmB,gBAAiB1pB,KAAKlC,MAAMuoC,eAC5Bjb,WAAW,QACXiC,OAAQrtB,KAAKlC,MAAMuvB,OACnBU,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB1e,SAAUzN,KAAKlC,MAAM2P,SACrB8J,YAAavX,KAAKlC,MAAMyZ,cAGxBu4B,EAAkB,GAChBnT,EAAS38B,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAAI1J,OAExB,IAArC38B,KAAKlC,MAAMuoC,eAAe7mC,QACR,IAAlBm9B,EAAOn9B,QACiB,YAAxBQ,KAAKlC,MAAM+mB,SAEXirB,EACE,6BACE,yBAAKnsC,MAAO,CAAE4U,MAAO,QAASyD,WAAY,KACxC,kBAAC,KAAD,CACE9J,QAAQ,aACRpM,aAAW,aACXW,QAAS,SAAAzB,GACqB,YAAxB,EAAKlH,MAAM+mB,SACb,EAAKyoB,0BAA0B,UAE/B,EAAKJ,oBAAoBloC,IAG7ByI,SAAUzN,KAAKlC,MAAM2P,UAErB,kBAAC,KAAD,QAGJ,uCAG0C,IAArCzN,KAAKlC,MAAMuoC,eAAe7mC,QAAgBm9B,EAAOn9B,OAAS,IACnEswC,EACE,6BACE,6BACE,sCACA,kBAAC,KAAD,CACEhqC,aAAW,uBACXnC,MAAO,CAAEM,YAAa,EAAGgf,aAAc,GACvC3D,gBAC0B,YAAxBtf,KAAKlC,MAAM+mB,SACP,WACE,EAAKwoB,gBAEP,KAEN5mC,QAAS,WACqB,YAAxB,EAAK3I,MAAM+mB,UACb,EAAKyoB,0BAA0B,WAEnC7/B,SAAUzN,KAAKlC,MAAM2P,UAErB,6BACE,yBACE9J,MAAO,CACLwO,QAAS,eACTjP,SAAUlD,KAAKlC,MAAMwe,aAAe,IAAM,GAAK,OAG9B,IAAlBqgB,EAAOn9B,OACJ,kBACCQ,KAAKlC,MAAMquB,QAAQC,QAAQuQ,EAAO,IAAM,GACzC,SACC38B,KAAKlC,MAAMquB,QAAQC,QAAQuQ,EAAO,IAAM,GACzC,aACC38B,KAAKlC,MAAMquB,QAAQC,QAAQuQ,EAAO,IAAM,IAE/C,yBACEh5B,MAC0B,WAAxB3D,KAAKlC,MAAM+mB,SACP,CAAE1S,QAAS,eAAgB9E,OAAQ,EAAGwE,YAAa,GACnD,CAAEM,QAAS,SAGjB,yBAAKxO,MAAO,CAAEsH,SAAU,WAAYC,IAAK,IACvC,kBAAC,KAAD,CACEuQ,KAAM,GACN9X,MAAO,CAAE0J,OAAQ,EAAGxC,QAAS,GAC7BrH,MAAO,UACPgD,UAAU,WACVgS,KACE,kBAAC,KAAD,CACE5N,IAAI,SACJjH,MAAO,CAAEG,MAAO,GAAId,OAAQ,IAC5ByD,QAASzG,KAAKktC,6BAS9B,yBAAKvpC,MAAO,CAAEosC,MAAO,YAI3B,IAAM3S,EAAWp9B,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAAIjJ,SAC7D4S,EAAkB,GAEiB,IAArChwC,KAAKlC,MAAMuoC,eAAe7mC,QACN,IAApB49B,EAAS59B,QACe,YAAxBQ,KAAKlC,MAAM+mB,SAEXmrB,EACE,6BACE,yBAAKrsC,MAAO,CAAE4U,MAAO,QAASyD,WAAY,KACxC,kBAAC,KAAD,CACE9J,QAAQ,aACRpM,aAAW,aACXW,QAAS,SAAAzB,GACqB,WAAxB,EAAKlH,MAAM+mB,SACb,EAAKooB,oBAAoBjoC,GAEzB,EAAKsoC,0BAA0B,aAGnC7/B,SAAUzN,KAAKlC,MAAM2P,UAErB,kBAAC,KAAD,QAGJ,uCAG0C,IAArCzN,KAAKlC,MAAMuoC,eAAe7mC,QAAgB49B,EAAS59B,OAAS,IACrEwwC,EACE,6BACE,6BACE,sCACA,kBAAC,KAAD,CACElqC,aAAW,0BACXnC,MAAO,CAAEM,YAAa,EAAGgf,aAAc,GACvC3D,gBAC0B,YAAxBtf,KAAKlC,MAAM+mB,SACP,WACE,EAAKuoB,gBAEP,KAEN3mC,QAAS,WACqB,YAAxB,EAAK3I,MAAM+mB,UACb,EAAKyoB,0BAA0B,aAEnC7/B,SAAUzN,KAAKlC,MAAM2P,UAErB,6BACE,yBACE9J,MAAO,CACLwO,QAAS,eACTjP,SAAUlD,KAAKlC,MAAMwe,aAAe,IAAM,GAAK,OAG5B,IAApB8gB,EAAS59B,OACN,kBACCQ,KAAKlC,MAAMquB,QAAQC,QAAQgR,EAAS,IAAM,GAC3C,SACCp9B,KAAKlC,MAAMquB,QAAQC,QAAQgR,EAAS,IAAM,GAC3C,aACCp9B,KAAKlC,MAAMquB,QAAQC,QAAQgR,EAAS,IAAM,IAEjD,yBACEz5B,MAC0B,WAAxB3D,KAAKlC,MAAM+mB,SACP,CAAE1S,QAAS,eAAgB9E,OAAQ,EAAGwE,YAAa,GACnD,CAAEM,QAAS,SAGjB,yBAAKxO,MAAO,CAAEsH,SAAU,WAAYC,IAAK,IACvC,kBAAC,KAAD,CACEuQ,KAAM,GACN9X,MAAO,CAAE0J,OAAQ,EAAGxC,QAAS,GAC7BrH,MAAO,UACPgD,UAAU,WACVgS,KACE,kBAAC,KAAD,CACE5N,IAAI,SACJjH,MAAO,CAAEG,MAAO,GAAId,OAAQ,IAC5ByD,QAASzG,KAAKitC,6BAS9B,yBAAKtpC,MAAO,CAAEosC,MAAO,YAI3B,IAAMzqB,EAAQtlB,KAAK6sC,cACnB,OACE,yBAAKrmC,UAAU,QAAQ7C,MAAO,CAAEssC,UAAW,UACzC,6BACGxB,EACCzuC,KAAKlC,MAAMiuC,WAeX,GAdA,kBAAC,GAAD,CACEhC,YAAa/pC,KAAKlC,MAAMisC,YACxBlb,MAAO7uB,KAAKlC,MAAM+wB,MAClB3pB,OAAQ,CACNwkC,SAAU1pC,KAAKlC,MAAMoH,OAAOwkC,SAC5BC,oBAAqB3pC,KAAKlC,MAAMoH,OAAOykC,qBAEzCM,WAAYjqC,KAAKlC,MAAMmsC,WACvBx8B,SAAUzN,KAAKlC,MAAM2P,SACrB8J,YAAavX,KAAKlC,MAAMyZ,YACxBwW,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,UAKxB,wBACEhd,IAAI,eACJxL,MACE3D,KAAKlC,MAAMiuC,YAA+B,IAAjBzmB,EAAM9lB,OAC3B,CAAE2S,QAAS,QACX,IAGLnS,KAAKlC,MAAMuoC,eAAe7mC,OAAS,EAAI,kBAAoB,SAE9D,yBACEgH,UAAU,eACV7C,MAAwB,IAAjB2hB,EAAM9lB,OAAe,CAAE2S,QAAS,QAAW,IAEjDmT,IAGJwqB,EACAE,EACAV,EACAE,EACD,yBAAK7rC,MAAO,CAAEosC,MAAO,UACrB,yBAAKpsC,MAAO3D,KAAKlC,MAAMiuC,WAAa,CAAE55B,QAAS,QAAW,IACxD,uCACA,yBAAKxO,MAAO,CAAE6E,UAAW,WACtB+mC,EACAI,IAGL,kBAAC,GAAD,CACEh4B,UAAW3X,KAAKlC,MAAM6Z,UACtB0V,OAAQrtB,KAAKlC,MAAMuvB,OACnBU,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpBka,eAAgBrmC,KAAKlC,MAAMuoC,eAC3BnhC,OAAQ,CAAE0iC,UAAW5nC,KAAKlC,MAAMoH,OAAO0iC,WACvC98B,KAAM9K,KAAKjC,MAAMmuC,mBACjB/E,YAAannC,KAAKisC,uBAEpB,kBAAC,GAAD,CACEt0B,UAAW3X,KAAKlC,MAAM6Z,UACtB0V,OAAQrtB,KAAKlC,MAAMuvB,OACnBU,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpBka,eAAgBrmC,KAAKlC,MAAMuoC,eAC3BS,UAAU,EACV5hC,OAAQ,CAAE4hC,SAAU9mC,KAAKlC,MAAMoH,OAAO4hC,UACtCh8B,KAAM9K,KAAKjC,MAAMsuC,kBACjBlF,YAAannC,KAAKosC,sBAEpB,kBAAC,GAAD,CACEthC,KAA+C,KAAzC9K,KAAKjC,MAAMwvC,0BACjBzoC,KAAM9E,KAAKjC,MAAMwvC,0BACjBpG,YAAa,kBAAM,EAAKmG,0BAA0B,KAClDt8B,MACEhR,KAAKlC,MAAMuoC,eAAe7mC,OAAS,EAC/BQ,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAC5C,KAENtY,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpBiR,SAAUp9B,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAAIjJ,SAC1DT,OAAQ38B,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IAAI1J,OACxDhR,MAAO3rB,KAAKlC,MAAM6tB,MAClByB,YAAaptB,KAAKlC,MAAMuvB,OAAOrtB,KAAKlC,MAAMuoC,eAAe,IACzDqF,yBAA0B1rC,KAAK0rC,yBAC/BhtC,OAAQ,kBACN,EAAK8tC,aAAa,EAAKzuC,MAAMwvC,0BAA2B,KAE1DjO,YAAat/B,KAAKwsC,aAClB9nB,YAAa1kB,KAAKlC,MAAM4mB,mB,GAz3BQxkB,IAAMC,WCX3B+vC,G,kDACnB,WAAYpyC,GAAQ,IAAD,8BACjB,cAAMA,IAiBR8nB,WAAa,WACX,EAAK7lB,SAAS,CAAC+K,MAAM,IACrB,EAAKhN,MAAMyZ,aAAY,IApBN,EAwBnBwO,YAAc,WACZ,EAAKoqB,YACL,EAAKpwC,SAAS,CAAC+K,MAAM,IACrB,EAAKhN,MAAMyZ,aAAY,IA3BN,EAkCnB4tB,gBAAkB,SAAC1mC,EAAM8S,EAAKgtB,EAAKv5B,GAC7BA,GAAGA,EAAEC,iBACT,IAAImgC,EAAW,EAIbA,EAHG,EAAKC,gBAAgB,EAAKtnC,MAAMU,IAGxBuhB,KAAKzO,IAAIgtB,EAAK,EAAKxgC,MAAMU,GAAM,GAF/B8S,EAIb,IAAI+zB,EAAW,CAACn/B,UAAU,IAC1Bm/B,EAAS7mC,GAAOoB,MAAMulC,GAAW,EAAEA,EACnCE,EAASn/B,UAAU1H,GAAM,GACzB,EAAKsB,SAAL,eAAkBulC,KA7CD,EAoDnBC,gBAAkB,SAAC9mC,EAAM8S,EAAKgtB,EAAKv5B,GAC7BA,GAAGA,EAAEC,iBACT,IAAImgC,EAAWplB,KAAKzO,IAAIgtB,EAAKve,KAAKue,IAAIhtB,EAAK,EAAKxT,MAAMU,GAAM,IACxD6mC,EAAW,CAACn/B,UAAU,IAC1Bm/B,EAAS7mC,GAAOoB,MAAMulC,GAAW,EAAEA,EACnCE,EAASn/B,UAAU1H,GAAM,GACzB,EAAKsB,SAAL,eAAkBulC,KA1DD,EAgEnBO,eAAiB,SAACK,EAAW5lC,GAC3B,IAAIwlC,EAAa,EAAK/nC,MAAMoI,UAC5B2/B,EAAWI,GAAa,GACnB,EAAKb,gBAAgB/kC,GAGxBA,EAAQiS,SAASjS,EAAO,IAFxBwlC,EAAWI,GAAa,mBAIV,mBAAZA,IAAiC5lC,EAAM,GAAKA,EAAM,KACpDwlC,EAAWI,GAAa,mCACH,YAAZA,IAA0B5lC,EAAM,GAAKA,EAAM,EAAKvC,MAAMgoC,kBAC/DD,EAAWI,GAAa,gCAAkC,EAAKnoC,MAAMgoC,gBAEvE,IAAIT,EAAW,GACfA,EAASY,GAAa5lC,EACtB,EAAKP,SAAL,2BAAkBulC,GAAlB,IAA4Bn/B,UAAW2/B,MA/EtB,EAqFnBT,gBAAkB,SAACW,GACjB,MAAO,eAAer9B,KAAKq9B,IAtFV,EA4FnBoK,gBAAkB,WAChB,EAAKrwC,SAAS,CAAC4R,SAAU,EAAK5T,MAAM4T,WA7FnB,EAmGnB40B,iBAAmB,SAACjmC,GAClB,EAAKP,SAAS,CAACnB,SAAU0B,KApGR,EA0GnBoQ,WAAa,SAAC+a,GACZ,IAAI4kB,EAAsC,SAA5B5kB,EAAWuH,gBAAuD,SAA5BvH,EAAW6kB,eAC3DrI,SAA8D3gC,IAAtC,EAAKvJ,MAAMoI,UAAU4/B,iBAA+B,EAAKhoC,MAAMoI,UAAU4/B,eAAevmC,OAAO,EACvH0oC,SAAgD5gC,IAA/B,EAAKvJ,MAAMoI,UAAU4L,UAAwB,EAAKhU,MAAMoI,UAAU4L,QAAQvS,OAAO,EACtG,MAA6B,KAAtB,EAAKzB,MAAMa,UAAiByxC,GAAWpI,GAAuBC,GA9GpD,EAoHnBnjC,OAAS,WACP,IAAMsR,EAAO,EAAKvY,MAAM6tB,MAAM,EAAK7tB,MAAMyyC,eAAe,IACpDvmC,EAAO,CAACqM,KAAK,GAAI0wB,WAAW,IAChC/8B,EAAI,WAAJ,UAAkC,EAAKjM,MAAMgoC,eAC7C/7B,EAAI,WAAJ,QAAiC,EAAKjM,MAAMgoC,eAAe,GAAI,EAAKhoC,MAAM4T,QACtE,EAAK5T,MAAM4T,SAAW,EAAK5T,MAAMgoC,eAAe,GAAO,EAAKhoC,MAAMgoC,eAAe,IAAI,IACvF/7B,EAAI,WAAJ,iBAAyC,EAAKjM,MAAMgU,SAEtD,IAAIq1B,EAAcvP,GAAexhB,EAAM,EAAKvY,MAAMuvB,OAAQ,EAAKvvB,MAAMiwB,UAC3C,UAAtB,EAAKhwB,MAAMa,UACbwoC,GAAe,EACfp9B,EAAI,WAAJ,MAA8B,EAAKlM,MAAMquB,QAAQC,QAAQ/V,EAAK1I,IAAM,GAEpE3D,EAAI,WAAJ,MAA8B,EAAKlM,MAAMquB,QAAQC,QAAQ/V,EAAK1I,IAAM,EAGtE3D,EAAI,WAAJ,YAAoCo9B,EACpCp9B,EAAI,KAAJ,WAA6B,EAAKlM,MAAM6Z,UACxC3N,EAAI,KAAJ,SAA2BqM,EAAKyW,SAEhC,EAAKhvB,MAAMoH,OAAO4hC,SAAS98B,GAC3B,EAAK+b,cACL,EAAKoqB,aA1IY,EAgJnBA,UAAY,WACV,EAAKpwC,SAAS,CACZgmC,eAAgB,EAChBp0B,SAAS,EACTI,QAAS,EACTnT,SAAU,GACVuH,UAAW,CACT4/B,eAAgB,GAChBh0B,QAAS,IAEXy+B,eAAe,EACfC,eAAe,KAzJjB,EAAK1yC,MAAQ,CACX+M,MAAM,EACNi7B,eAAgB,EAChBp0B,SAAS,EACTI,QAAS,EACTnT,SAAU,GACVuH,UAAW,CACT4/B,eAAgB,GAChBh0B,QAAS,IAEXy+B,eAAe,EACfC,eAAe,GAbA,E,qDA+JT,IAAD,OACDhlB,EAAazrB,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMyyC,eAAe,IACxDtjB,EAAkBjtB,KAAKlC,MAAMquB,QAAQC,QAAQX,EAAW9d,IAAI,EAG5D0L,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,SACNG,QAASzG,KAAK+lB,YACdpiB,MAAO,CAACG,MAAM,MAAOG,YAAY,KAAKI,OAAO,oBAG/C,kBAAC,IAAD,CACEiC,MAAM,SACNC,SAAO,EACPE,QAASzG,KAAK+E,OACduJ,SAAUtO,KAAK0Q,WAAW+a,GAC1B9nB,MAAO,CAACG,MAAM,UAIZqkC,EAAS,CACbC,YAAa,CACXnlB,aAAc,IAIdytB,EAAY,GACZrI,EAAgB,GAChBt2B,EAAU,GAEY,KAAtB/R,KAAKjC,MAAMa,WACb8xC,EACE,6BACE,yBAAKlqC,UAAU,SACb,iDAEF,yBAAKA,UAAU,SACb,kBAAC,IAAD,CACEV,aAAW,mBACXrH,KAAK,iBACL6B,MAAON,KAAKjC,MAAMgoC,eAClB5/B,UAAWnG,KAAKjC,MAAMoI,UAAU4/B,eAChC9/B,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKghC,eAAe,iBAAkBhhC,IACvDlB,MAAO,CAACG,MAAM,SACdS,WAAY,CAACiE,UAAU,YAEzB,kBAAC,KAAD,CACE1C,aAAW,6BACXrH,KAAK,6BACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKugC,gBAAgB,iBAAkB,EAAG,IAAKvgC,KAE/D,kBAAC,KAAD,CAAcxB,MAAOuJ,IAAM7L,QAAQE,iBAErC,kBAAC,KAAD,CACE0E,aAAW,6BACXrH,KAAK,6BACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKmgC,gBAAgB,iBAAkB,EAAG,IAAKngC,KAE/D,kBAAC,KAAD,CAAWxB,MAAOuJ,IAAM7L,QAAQE,oBAMtCpB,KAAKjC,MAAMgoC,eAAe,IAC5BsC,EACA,6BACE,yBAAK7hC,UAAU,SACX,gDAEJ,yBAAKA,UAAU,SACb,kBAAC,KAAD,CACEV,aAAW,iBACXW,QAAS,kBAAI,EAAK2pC,mBAClB1+B,QAAS1R,KAAKjC,MAAM4T,SAAW3R,KAAKjC,MAAMgoC,eAAe,EACzDpiC,MAAO,CAACgtC,cAAc,eAK1B3wC,KAAKjC,MAAM4T,SAAW3R,KAAKjC,MAAMgoC,eAAe,GAAO/lC,KAAKjC,MAAMgoC,eAAe,IAAI,IACvFh0B,EACE,6BACE,yBAAKvL,UAAU,SACb,wDAEF,yBAAKA,UAAU,SACb,kBAAC,IAAD,CACEV,aAAW,0BACXrH,KAAK,UACL6B,MAAON,KAAKjC,MAAMgU,QAClB5L,UAAWnG,KAAKjC,MAAMoI,UAAU4L,QAChC9L,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKghC,eAAe,UAAWhhC,IAChDlB,MAAO,CAACG,MAAM,SACdS,WAAY,CAACiE,UAAU,YAEzB,kBAAC,KAAD,CACE1C,aAAW,wBACXrH,KAAK,wBACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKugC,gBAAgB,UAAW,EAAG,EAAKxnC,MAAMgoC,eAAgB/gC,KAE9E,kBAAC,KAAD,CAAcxB,MAAOuJ,IAAM7L,QAAQE,iBAErC,kBAAC,KAAD,CACE0E,aAAW,wBACXrH,KAAK,wBACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKmgC,gBAAgB,UAAW,EAAG,EAAKpnC,MAAMgoC,eAAgB/gC,KAE9E,kBAAC,KAAD,CAAWxB,MAAOuJ,IAAM7L,QAAQE,oBAM1C,IAAIwvC,EAAgD,SAA5BnlB,EAAWuH,eACjC,yBAAKxsB,UAAU,qBACb,yBAAK7C,MAAO,CAACiO,WAAY,QAASmZ,aAAc,WAAK,EAAKhrB,SAAS,CAACywC,eAAc,KAC9E1B,WAAY,WAAK,EAAK/uC,SAAS,CAACywC,eAAc,MADlD,cAEgBvjB,GAEhB,yBAAKzmB,WAAsC,IAA3BxG,KAAKjC,MAAMyyC,cAAqB,cAAc,QAA9D,uCACuCvjB,EADvC,iBACsEA,EADtE,qBACyGA,EAAgB,IAGzH,GAEA4jB,EAAgD,SAA5BplB,EAAW6kB,eACjC,yBAAK9pC,UAAU,qBACb,yBAAK7C,MAAO,CAACiO,WAAY,QAASmZ,aAAc,WAAK,EAAKhrB,SAAS,CAAC0wC,eAAc,KAClF3B,WAAY,WAAK,EAAK/uC,SAAS,CAAC0wC,eAAc,MAD9C,cAEaxjB,GAEb,yBAAKzmB,WAAsC,IAA3BxG,KAAKjC,MAAM0yC,cAAqB,cAAc,QAA9D,uCACuCxjB,EADvC,iBACsEA,EADtE,wBAC4GA,EAAgB,IAG5H,GAGA6jB,EACF,6BACE,wBAAIntC,MAAO,CAACsf,aAAa,QAAzB,qBACC4tB,EACD,kBAAC97B,GAAA,iBAAD,CACEtW,KAAK,eACLuW,gBA/ImB,GAgJnB/O,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAK0hC,iBAAiB1hC,KAEvC,kBAACkQ,GAAA,YAAD,CACEjP,aAAW,mCACXxF,MAAM,QACNgG,MAAO,cAAgB2mB,EACvBtpB,MAAoC,SAA5B8nB,EAAWuH,eAA0B,CAAC7gB,QAAQ,QAASg2B,EAAOC,cAExE,kBAACrzB,GAAA,YAAD,CACEjP,aAAW,mCACXxF,MAAM,QACNgG,MAAQ,cAAgB2mB,EACxBtpB,MAAoC,SAA5B8nB,EAAW6kB,eAA0B,CAACn+B,QAAQ,QAASg2B,EAAOC,eAGzEwI,GAGChI,EACJ,kBAAC,IAAD,CACIx9B,MAAM,aACNiO,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKjC,MAAM+M,KACjB8L,eAAgB5W,KAAK+lB,YACrBlP,uBAAqB,EACrB7L,aAAc,CAAClH,MAAM,SACrBkf,WAAY,CAACxa,UAAU,UACvBke,eAAe,aAEdoqB,EACAJ,EACArI,EACAt2B,GAIP,OACE,6BACE,kBAAC,IAAD,eACExL,SAAO,EACPD,MAAM,MACNG,QAASzG,KAAK4lB,WACdnY,SAAUzN,KAAKlC,MAAM2P,UACjBhK,IALN,CAMEE,MAAK,2BAAMF,IAAUE,OAAhB,IAAuBG,MAAM,MAAMyU,MAAM,OAAOtU,YAAY,UAElE2kC,O,GAlWkC1oC,IAAMC,WCH5B4wC,G,kDACnB,WAAYjzC,GAAQ,IAAD,8BACjB,cAAMA,IAkBRqnC,gBAAkB,SAAC1mC,EAAM8S,EAAKgtB,EAAKv5B,GAC7BA,GAAGA,EAAEC,iBACT,IAAImgC,EAAW,EAIbA,EAHG,EAAKC,gBAAgB,EAAKtnC,MAAMU,IAGxBuhB,KAAKzO,IAAIgtB,EAAK,EAAKxgC,MAAMU,GAAM,GAF/B8S,EAIb,IAAI+zB,EAAW,CAACn/B,UAAU,IAC1Bm/B,EAAS7mC,GAAOoB,MAAMulC,GAAW,EAAEA,EACnCE,EAASn/B,UAAU1H,GAAM,GACzB,EAAKsB,SAAL,eAAkBulC,KA9BD,EAqCnBC,gBAAkB,SAAC9mC,EAAM8S,EAAKgtB,EAAKv5B,GAC7BA,GAAGA,EAAEC,iBACT,IAAImgC,EAAWplB,KAAKzO,IAAIgtB,EAAKve,KAAKue,IAAIhtB,EAAK,EAAKxT,MAAMU,GAAM,IACxD6mC,EAAW,CAACn/B,UAAU,IAC1Bm/B,EAAS7mC,GAAOoB,MAAMulC,GAAW,EAAEA,EACnCE,EAASn/B,UAAU1H,GAAM,GACzB,EAAKsB,SAAL,eAAkBulC,KA3CD,EAiDnBO,eAAiB,SAACK,EAAW5lC,GAC3B,IAAIwlC,EAAa,EAAK/nC,MAAMoI,UAC5B2/B,EAAWI,GAAa,GACnB,EAAKb,gBAAgB/kC,GAGxBA,EAAQiS,SAASjS,EAAO,IAFxBwlC,EAAWI,GAAa,mBAIV,gBAAZA,IAA8B5lC,EAAM,GAAKA,EAAM,QACjDwlC,EAAWI,GAAa,qCAE1B,IAAIZ,EAAW,GACfA,EAASY,GAAa5lC,EACtB,EAAKP,SAAL,2BAAkBulC,GAAlB,IAA4Bn/B,UAAW2/B,MA9DtB,EAiEnBT,gBAAkB,SAACW,GACjB,MAAO,eAAer9B,KAAKq9B,IAlEV,EAqEnBmK,UAAY,WACV,EAAKpwC,SAAS,CACZixC,YAAa,KACb7qC,UAAW,CAAE8qC,YAAa,OAxEX,EA4EnBlsC,OAAS,WACsB,iBAAzB,EAAKhH,MAAMizC,YACb,EAAKlzC,MAAMoH,OAAOgsC,qBAAqB,EAAKnzC,MAAMkzC,aAElD,EAAKnzC,MAAMoH,OAAOisC,oBAAoB,EAAKpzC,MAAMkzC,aAEnD,EAAKd,YACL,EAAKryC,MAAMszC,kBAAiB,IAjF5B,EAAKrzC,MAAQ,CACXizC,YAAa,KACbC,YAAa,EAAKnzC,MAAMuzC,mBACxBlrC,UAAW,CACT8qC,YAAa,KANA,E,sEAWO5pC,GACxBrH,KAAKD,SAAS,CAACkxC,YAAa5pC,EAAUgqC,uB,+BA0E9B,IAAD,OACDh4B,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,SACNG,QAAS,WAAK,EAAK0pC,YAAY,EAAKryC,MAAMszC,kBAAiB,IAC3DztC,MAAO,CAACG,MAAM,MAAOG,YAAY,KAAKI,OAAO,oBAG/C,kBAAC,IAAD,CACEiC,MAAM,SACNC,SAAO,EACPE,QAASzG,KAAK+E,OACduJ,SAA6C,KAAnCtO,KAAKjC,MAAMoI,UAAU8qC,YAC/BttC,MAAO,CAACG,MAAM,UAIlB,OAAQ,kBAAC,IAAD,CACRsH,MAAM,iCACNiO,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMwzC,eACjB16B,eAAgB,WAAK,EAAKu5B,YAAY,EAAKryC,MAAMszC,kBAAiB,IAClEpmC,aAAc,CAAClH,MAAM,SACrBkf,WAAY,CAACxa,UAAU,UACvBke,eAAe,aAEf,6BACE,wBAAI/iB,MAAO,CAACsf,aAAa,QAAzB,eACA,kBAAClO,GAAA,iBAAD,CACEtW,KAAK,cACLuW,gBAAiB,GACjB/O,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAK9E,SAAS,CAACixC,YAAansC,MAE7C,kBAACkQ,GAAA,YAAD,CACEjP,aAAW,yBACXxF,MAAM,eACNgG,MAAM,kBAER,kBAACyO,GAAA,YAAD,CACEjP,aAAW,wBACXxF,MAAM,cACNgG,MAAM,kBAITtG,KAAKjC,MAAMizC,YACV,6BACE,yBAAKxqC,UAAU,SACb,gDAEF,yBAAKA,UAAU,SACb,kBAAC,IAAD,CACEV,aAAW,wBACXrH,KAAK,cACL6B,MAAON,KAAKjC,MAAMkzC,YAClB9qC,UAAWnG,KAAKjC,MAAMoI,UAAU8qC,YAChChrC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKghC,eAAe,cAAehhC,IACpDlB,MAAO,CAACG,MAAM,SACdS,WAAY,CAACiE,UAAU,YAEzB,kBAAC,KAAD,CACE1C,aAAW,yBACXrH,KAAK,yBACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKugC,gBAAgB,cAAe,EAAG,KAAMvgC,KAE7D,kBAAC,KAAD,CAAcxB,MAAOuJ,IAAM7L,QAAQE,iBAErC,kBAAC,KAAD,CACE0E,aAAW,yBACXrH,KAAK,yBACLgI,QAAS,SAACzB,GAAD,OAAO,EAAKmgC,gBAAgB,cAAe,EAAG,KAAMngC,KAE7D,kBAAC,KAAD,CAAWxB,MAAOuJ,IAAM7L,QAAQE,mBAIvC,S,GApKwClB,IAAMC,W,qBCUhCoxC,G,kDACnB,WAAYzzC,GAAQ,IAAD,8BACjB,cAAMA,IA4BR0zC,0BAA4B,WAC1B,IAAIzzC,EAAQ,GACZ,IAAK,IAAI+X,KAAK,EAAKhY,MAAM8rB,kBACvB7rB,EAAM,SAAW,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OAA2C,EAE9D,OAAO/X,GAlCU,EAyCnB+vC,oBAAsB,WACpB,IAAI/vC,EAAQ,GACZ,IAAK,IAAI+X,KAAK,EAAKhY,MAAM8rB,kBACvB7rB,EAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,MAA2C,GAEnD,OAAO/X,GA9CU,EA0DnBmwC,oBAAsB,WACpB,IAAK,IAAIp4B,KAAK,EAAKhY,MAAM8rB,kBACvB,GACE,EAAK7rB,MAAM,SAAW,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OACkC,SAAxD,EAAK/X,MAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OAC6C,KAAxD,EAAK/X,MAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,MAEX,OAAO,EAGX,OAAO,GApEU,EAuEnB42B,gBAAkB,SAACpsC,EAAO0rB,GACxB,IAAI2gB,EAAoB,GACxBA,EAAkB3gB,GAAiB1rB,EACnC,IAAIssC,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9C,EAAKjsB,SAAL,2BAAmB4sC,GAAsBC,KA5ExB,EA+EnBwC,WAAa,SAACpqC,EAAGgnB,GACfhnB,EAAEC,iBACF,IAAI2nC,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9C,EAAKjsB,SAAL,eAAmB6sC,IACd,EAAK7uC,MAAMqwC,SACd,EAAK5B,aAAaxgB,EAAe,EAAKjuB,MAAMiuB,KArF7B,EAyFnBwgB,aAAe,SAACxgB,EAAe1rB,GAC7B,IAAI4tB,EAAa,GACjBA,EAAWlC,GAAiB1rB,EAC5B,IAAIq6B,EAAS,EAAK78B,MAAMyyC,eAAe,GACnCl6B,EAAI,eACH6X,GAEL,EAAKpwB,MAAMoH,OAAOusC,WAAW9W,EAAQtkB,IAhGpB,EAmGnBg5B,WAAa,SAACrqC,EAAGgnB,GACf,IAAI2gB,EAAoB,GACxBA,EAAkB3gB,GAAiB,EAAKluB,MAAMosB,MAC5C,EAAKpsB,MAAM4zC,cAAc,IACzB1lB,GACF,IAAI4gB,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9C,EAAKjsB,SAAL,2BAAmB4sC,GAAsBC,KA1GxB,EA6GnBzG,eAAiB,SAAC7lC,EAAO0rB,GACvB,GAAyC,IAArC,EAAKluB,MAAMyyC,eAAe/wC,OAAc,CAE1C,IAAI0uB,EAAa,GACjBA,EAAWlC,GAAiB1rB,EAC5B,IAAI+V,EAAI,eACH6X,GAEL,EAAKpwB,MAAMoH,OAAOusC,WAAW,EAAK3zC,MAAMyyC,eAAe,GAAIl6B,OACtD,CAEL,IAAIo2B,EAAmB,GACvBA,EAAiBzgB,GAAiB1rB,EAClC,EAAKP,SAAS0sC,KA1HC,EA8HnBkF,gBAAkB,SAACt7B,EAAMu7B,GACT,SAAVA,IAAkBA,EAAQ,MAC9B,IAAIvoC,EAAU,CAAEgmB,aAAcuiB,GAC9B,EAAK9zC,MAAMoH,OAAOusC,WAAWp7B,EAAK1I,GAAItE,IAjIrB,EAoInBwoC,mBAAqB,SAAChkC,EAAO4d,EAAY7sB,EAAU+O,EAAIhC,GACrD,IAAItC,EAAU,CAAEyoC,YAAarmB,EAAWqmB,aACzB,SAAXnmC,GACFtC,EAAQyoC,YAAYlzC,EAAW,MAAQ,GACvCyK,EAAQyoC,YAAYlzC,EAAW,UAAY,KAE3CyK,EAAQyoC,YAAYlzC,EAAW,MAAQ+O,EACvCtE,EAAQyoC,YAAYlzC,EAAW,UAAY+M,GAE7C,EAAK7N,MAAMoH,OAAOusC,WAAWhmB,EAAW9d,GAAItE,IA7I3B,EAgJnB4kC,YAAc,WACZ,IAAI/f,EAAa,GACjB,IAAK,IAAIpY,KAAK,EAAKhY,MAAM8rB,kBAAmB,CAC1C,IAAIykB,EAAW,EAAKvwC,MAAM8rB,kBAAkB9T,GAA7B,KACXw4B,EAAY,EAAKvwC,MAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,MACT,KAAdw4B,GAAkC,SAAdA,IACtBpgB,EAAWmgB,GAAYC,GAG3B,IATkB,EASdyD,EAAQ,GATM,eAUF,EAAKj0C,MAAMyyC,gBAVT,IAUlB,2BAA2C,CAAC,IAAnCphC,EAAkC,QACnCkH,EAAO,EAAKvY,MAAM6tB,MAAMxc,GAC9B4iC,EAAMnqC,KAAK,CAAE+F,GAAI0I,EAAK1I,GAAIugB,gBAZV,8BAclB,EAAKpwB,MAAMoH,OAAO8sC,YAAYD,GAE9B,EAAKhyC,SAAL,eAAmB,EAAKyxC,+BAhKP,EA4LnB71B,eAAiB,SAAA9M,GACf,IAAIs/B,EAAiB,GACrBA,EAAe,SAAWt/B,IAAW,EAAK9Q,MAAM,SAAW8Q,GAC3D,EAAK9O,SAASouC,IA/LG,EAkMnBtB,YAAc,WACZ,IADkB,EACdC,EAAQ,GADM,eAEC,EAAKhvC,MAAMisC,aAFZ,IAElB,2BAA2C,CAAC,IAAnCxX,EAAkC,QACnCW,EAAO,EAAKp1B,MAAM+wB,MAAM0D,GAC9Bua,EAAMllC,KAAKgkC,GAAe,EAAK9tC,MAAOo1B,KAJtB,8BAMlB,OAAO4Z,GAxMU,EA2MnBC,gBAAkB,WAChB,EAAKhtC,SAAS,CAAEitC,WAAY,OAC5B,EAAKlvC,MAAMyZ,aAAY,IA7MN,EAgNnB06B,iBAAmB,SAAAC,GACjB,EAAKnyC,SAAS,CAAEmyC,mBAChB,EAAKp0C,MAAMyZ,YAAY26B,IAlNN,EAqNnBC,yBAA2B,SAAAC,GACzB,EAAKryC,SAAS,CAAEqyC,2BAChB,EAAKt0C,MAAMyZ,YAAY66B,IAvNN,EA0NnBC,0BAA4B,SAAAC,GAC1B,EAAKvyC,SAAS,CAAEuyC,4BAChB,EAAKx0C,MAAMyZ,YAAY+6B,IA5NN,EA+NnBlB,iBAAmB,SAAAE,GACjB,EAAKvxC,SAAS,CAAEuxC,mBAChB,EAAKxzC,MAAMyZ,YAAY+5B,IAjON,EAoOnB9D,gBAAkB,SAACxhB,EAAe1rB,GAChC,EAAKxC,MAAMoH,OAAOuoC,kBAAkB,CAClCp3B,KAAK,2BAAM,EAAKvY,MAAMoY,YAAYG,MAA9B,kBAAqC2V,EAAgB1rB,OAnO3D,EAAKvC,MAAL,qCACEm0C,gBAAgB,EAChBE,wBAAwB,EACxBE,yBAAyB,EACzBhB,gBAAgB,EAChBlD,QAAS,EAAKtwC,MAAMyyC,eAAe/wC,OAAS,GACzC,EAAKsuC,uBACL,EAAK0D,6BACL,EAAKxD,wBAXO,E,mEAgBjB,IAAIjwC,EAAQ,GACZ,IAAK,IAAI+X,KAAK9V,KAAKlC,MAAM8rB,kBACvB7rB,EACE,oBAAsBiC,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,OACpB,EAEN,OAAO/X,I,gDA2BiBsJ,GACxBrH,KAAKD,SAAS,CACZquC,QAAS/mC,EAAUkpC,eAAe/wC,OAAS,IAExCQ,KAAKjC,MAAMqwC,SACdpuC,KAAKD,SAAL,eAAmBC,KAAK8tC,0B,2CAmH1B,IAAIhiB,EAAiB,GACrB,IAAK,IAAIhW,KAAK9V,KAAKlC,MAAM8rB,kBAAmB,CAC1C,IAD0C,EACtCoC,EAAgBhsB,KAAKlC,MAAM8rB,kBAAkB9T,GAA7B,KADsB,eAE1B9V,KAAKlC,MAAMyyC,gBAFe,IAE1C,2BAA2C,CAAC,IAAnCphC,EAAkC,QACnCkH,EAAOrW,KAAKlC,MAAM6tB,MAAMxc,GAC9B,QAAsC7H,IAAlCwkB,EAAeE,GACjBF,EAAeE,GAAiB3V,EAAK2V,QAChC,GAAIF,EAAeE,KAAmB3V,EAAK2V,GAAgB,CAChEF,EAAeE,GAAiB,KAChC,QARsC,+BAY5C,OAAOF,I,+BAoDC,IAAD,OACHA,EAAiB9rB,KAAK0uC,qBACtBD,EAAgB,GACdhjB,EAAazrB,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMyyC,eAAe,IACxDtjB,EAAkBjtB,KAAKlC,MAAMquB,QAAQC,QAAQX,EAAW9d,IAAM,EAE9Dg9B,EAA4BF,GADdzqC,KAAKlC,MAAMuvB,OAAO5B,EAAWqB,UAG/C9sB,KAAKlC,MAAM6tB,OAEP4mB,EACmE,IAAvE1a,GAAepM,EAAYzrB,KAAKlC,MAAMuvB,OAAQrtB,KAAKlC,MAAMiwB,UACrDykB,EACJ/mB,EAAW9d,KACXg9B,EAA0BA,EAA0BnrC,OAAS,GAAGmO,GAC5D8kC,EAAyD,IAArC9H,EAA0BnrC,OAEpDQ,KAAKlC,MAAM8rB,kBAAkB7Y,SAAQ,SAAA88B,GACnC,IAAIA,EAAcpvC,KAAKuJ,SAAS,eAE5ByqC,GACCF,GAAe1E,EAAcpvC,KAAKuJ,SAAS,UAC3CwqC,GAAc3E,EAAcpvC,KAAKuJ,SAAS,UAJ/C,CASA,IAAI9E,EAAW,KACX,EAAKpF,MAAMwe,aAAe,IAC5BpZ,EAAW,OACF,EAAKpF,MAAMwe,aAAe,MAAQ,EAAKve,MAAMqwC,QACtDlrC,EAAW,OACF,EAAKpF,MAAMwe,aAAe,OACnCpZ,EAAW,QAEb,IAAIoD,EACF,yBACE3C,MAAO,CAAEkH,QAAS,WAAYrH,MAAO,kBAAmBN,aAEvD2qC,EAAcrjB,aAIfmkB,EAAc,GACdhB,KACF,EAAK7vC,MAAMoY,YAAYG,OACvB,EAAKvY,MAAMoY,YAAYG,KAAKw3B,EAAcpvC,QACtC,EAAKX,MAAMoY,YAAYG,KAAKw3B,EAAcpvC,MAGpB,YAAxB,EAAKX,MAAM+mB,UAA0B,EAAK9mB,MAAMqwC,QAClDO,EACE,yBAAKnoC,UAAU,qBACb,kBAAC,KAAD,CACEV,aACE6nC,EACI,SACAE,EAAcrjB,YACd,2BACA,SACAqjB,EAAcrjB,YACd,2BAENokB,YAAa,kBAAC,KAAD,MACbC,cAAe,kBAAC,KAAD,MACfpoC,QAAS,kBACP,EAAK+mC,gBAAgBK,EAAcpvC,MAAOkvC,IAE5ChqC,MACE,EAAK7F,MAAMwe,aAAe,KACtB,CAAEnK,QAAS,QACX,CAAEA,QAAS,eAAgBrO,MAAO,QAExCC,UAAS,eAAO4nC,KAAgB5nC,WAChC2N,QAASi8B,EACT5iB,aAAc,WACZ,EAAKhrB,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDqwC,WAAY,WACV,EAAK/uC,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDgP,SAAU,EAAK3P,MAAM2P,WAEvB,yBACEjH,WAC2D,IAAzD,EAAKzI,MAAM,oBAAsB8vC,EAAcpvC,MAC3C,cACA,QAGL,EAAKX,MAAMoY,YAAY23B,EAAcpvC,MAClC,kCACA,qCAIuB,YAAxB,EAAKX,MAAM+mB,UAmDI,WAAxB,EAAK/mB,MAAM+mB,UACY,iBAAvBgpB,EAAcpvC,QAlDd6H,EACE,yBAAKE,UAAU,qBACb,kBAAC,KAAD,CACEV,aACE6nC,EACI,SACAE,EAAcrjB,YACd,2BACA,SACAqjB,EAAcrjB,YACd,2BAENrb,IAAK,UAAY0+B,EAAcrjB,YAC/BlkB,MAAOunC,EAAcrjB,YACrBokB,YAAa,kBAAC,KAAD,MACbC,cAAe,kBAAC,KAAD,MACfpoC,QAAS,kBACP,EAAK+mC,gBAAgBK,EAAcpvC,MAAOkvC,IAE5ChqC,MAAO,CAAEwO,QAAS,eAAgBrO,MAAO,QACzC4N,QAASi8B,EACT5pC,UAAS,2BAAO4nC,KAAgB5nC,WAAvB,IAAkCP,MAAO,SAClDP,WAAU,eAAO0oC,KAAgB1oC,YACjC8nB,aAAc,WACZ,EAAKhrB,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDqwC,WAAY,WACV,EAAK/uC,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDgP,SAAU,EAAK3P,MAAM2P,WAEvB,yBACEjH,WAC2D,IAAzD,EAAKzI,MAAM,oBAAsB8vC,EAAcpvC,MAC3C,cACA,QAGLkvC,EACG,kCACA,qCA0DR,EAAK5vC,MAAMqwC,UAAY,EAAKtwC,MAAMiuC,aAEpCzlC,EACE,kBAAC,KAAD,eACER,aACE,WAAa+nC,EAAcrjB,YAAc,kBAE3Crb,IAAK,SAAW0+B,EAAcrjB,YAC9BlkB,MAAOunC,EAAcrjB,YACrB/jB,QAAS,kBAAM,EAAKkV,eAAekyB,EAAcpvC,OACjDwE,WACG,EAAKlF,MAAM,SAAW8vC,EAAcpvC,MAEjC,GADA,CAAE+E,MAAO,QAGfkO,QAAS,EAAK3T,MAAM,SAAW8vC,EAAcpvC,MAC7CkF,MAAO,CAAEwO,QAAS,eAAgBrO,MAAO,QACzCwK,SACyB,iBAAvBu/B,EAAcpvC,MACdovC,EAAcpvC,KAAKuJ,SAAS,YAE9ByF,SAAU,EAAK3P,MAAM2P,UACjBk+B,QAIV,IAAIoD,EAAQjjB,EAAe+hB,EAAcpvC,MACzC,GAAK,EAAKX,MAAMiuC,YAgIJgD,GAAS,EAAKjxC,MAAMyyC,eAAe/wC,OAAS,EAEtDuvC,EACE,yBACEprC,MAAO,CACLH,MAAO,OACPwrC,UAAW,SACX9rC,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,QAAU,UAJxD,oBAU8B,iBAAvBuxB,EAAcpvC,KAErBswC,EADEjjB,EAAe+hB,EAAcpvC,MAE7B,EAAKX,MAAMquB,QAAQC,QACjB,EAAKtuB,MAAM6tB,MAAMG,EAAe+hB,EAAcpvC,OAAOkP,IACnD,EAEE,OAEsB,iBAAvBkgC,EAAcpvC,OACvBswC,EAAQ,EAAKjxC,MAAM6tB,MAAM,EAAK7tB,MAAMyyC,eAAe,IAAIllB,mBAtJvD,GAA2B,iBAAvBwiB,EAAcpvC,KAAyB,CACzC,IAAI8R,EAAY,GACZjQ,EAAQ,EAAKvC,MAAMqwC,QAAU,GAAK,OACtCzD,EAA0B55B,SAAQ,SAAA+mB,GAC5B7K,IAAoB,EAAKnvB,MAAMquB,QAAQC,QAAQ0L,EAAOnqB,IAAM,GAC9D4C,EAAU3I,KAAK,CACbtH,MAAOw3B,EAAOnqB,GACdgB,KACE,EAAK7Q,MAAMquB,QAAQC,QAAQ0L,EAAOnqB,KAAO,GACpC,EAAK7P,MAAMquB,QAAQC,QAAQ0L,EAAOnqB,IAAM,GAAG8B,WAC5C,SAGNqoB,EAAOnqB,KAAOme,EAAc,eAC9BxrB,EAAQw3B,EAAOnqB,OAGnBohC,EACE,kBAAC,GAAD,CACEphC,GAAI,OAASkgC,EAAcpvC,KAC3B6H,MAAOunC,EAAcrjB,YAAc,sBACnCvkB,SAAU,SAAApB,GAAC,OAAI,EAAK8sC,gBAAgBlmB,EAAY5mB,IAChDyJ,SAAU,EAAKvQ,MAAMqwC,QACrB3gC,SAAU,EAAK3P,MAAM2P,SACrBzD,KAAMuG,EACNjQ,MAAOA,SAIN,GAA2B,iBAAvButC,EAAcpvC,KAAyB,CAEhD,IAAI0wC,EAAiB,IAElB,EAAKpxC,MAAMqwC,SACZ,EAAKrwC,MAAM,WAAa8vC,EAAcpvC,QAEtC0wC,EACE,6BACE,kBAAC,IAAD,CACErpC,aAAW,SACXS,SAAO,EACPiS,KAAM,kBAAC,KAAD,MACN7U,MAAO,CACLC,SAAU,EAAK9F,MAAMwe,aAAe,KAAO,OAAS,OACpD1K,WAAY,OAEdnL,QAAS,SAAAzB,GAAC,OAAI,EAAKoqC,WAAWpqC,EAAG6oC,EAAcpvC,OAC/CgP,SAAU,EAAK3P,MAAM2P,WAEvB,kBAAC,IAAD,CACE3H,aAAW,SACX2S,WAAS,EACTD,KAAM,kBAAC,KAAD,MACN7U,MAAO,CACLC,SAAU,EAAK9F,MAAMwe,aAAe,KAAO,OAAS,OACpD1K,WAAY,OAEdnL,QAAS,SAAAzB,GAAC,OAAI,EAAKqqC,WAAWrqC,EAAG6oC,EAAcpvC,OAC/CgP,SAAU,EAAK3P,MAAM2P,aAK7B,IAAInN,EAAQ,GACR,EAAKvC,MAAM,WAAa8vC,EAAcpvC,MACxC6B,EAAQ,EAAKvC,MAAM8vC,EAAcpvC,MACe,OAAvCqtB,EAAe+hB,EAAcpvC,QACtC6B,EAAQwrB,EAAe+hB,EAAcpvC,OAEvCswC,EACE,6BACE,0BAAMhpC,SAAU,SAAAf,GAAC,OAAI,EAAKoqC,WAAWpqC,EAAG6oC,EAAcpvC,QACpD,kBAAC,KAAD,CACEkP,GAAI,OAASkgC,EAAcpvC,KAC3BqH,aACE+nC,EAAcrjB,YAAc,uBAE9B/rB,KAAMovC,EAAcpvC,KACpB6B,MAAOA,EACP2F,SAAU,SAACjB,EAAGH,GAAJ,OACR,EAAK6nC,gBAAgB7nC,EAAGgpC,EAAcpvC,OAExC6P,SACE,EAAKvQ,MAAMqwC,UACV,EAAKrwC,MAAM,SAAW8vC,EAAcpvC,MAEvCgP,SAAU,EAAK3P,MAAM2P,SACrBlJ,WAAY,CACVrB,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,OAAS,QAErDtW,WAAS,IAEVmpC,QAIF,CACL,IAAI5+B,EAAY,GACZjQ,EAAQ,OAERutC,EAAcoB,SAChBpB,EAAcoB,QAAQl+B,SAAQ,SAACm+B,EAAQx6B,GACrCnE,EAAU3I,KAAK,CAAEtH,MAAO4uC,EAAQvgC,KAAMugC,OAGC,OAAvCpjB,EAAe+hB,EAAcpvC,OAC/B8R,EAAU3I,KAAK,CAAEtH,MAAO,OAAQqO,KAAM,cAED,KAAnC,EAAK5Q,MAAM8vC,EAAcpvC,OAAgB,EAAKV,MAAMqwC,QACtD9tC,EAAQ,EAAKvC,MAAM8vC,EAAcpvC,MACe,OAAvCqtB,EAAe+hB,EAAcpvC,QACtC6B,EAAQwrB,EAAe+hB,EAAcpvC,OAEvCswC,EACE,kBAAC,GAAD,CACEphC,GAAI,OAASkgC,EAAcpvC,KAC3B6H,MAAOunC,EAAcrjB,YAAc,sBACnClqB,MAAOA,EACP2F,SAAU,SAAApB,GAAC,OAAI,EAAKshC,eAAethC,EAAGgpC,EAAcpvC,OACpD6P,SACE,EAAKvQ,MAAMqwC,UAAY,EAAKrwC,MAAM,SAAW8vC,EAAcpvC,MAE7DgP,SAAU,EAAK3P,MAAM2P,SACrBzD,KAAMuG,IA6Bdk+B,EAAc7mC,KACZ,yBAAKpB,UAAU,MAAM2I,IAAK0+B,EAAcpvC,MACtC,yBAAK+H,UAAU,SACZmoC,EACAroC,GAEH,yBACEE,UAAU,QACV7C,MAAO,CAAET,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,QAAU,OAE5DyyB,SAMT,IAAM14B,EAAOrW,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMyyC,eAAe,IAGpDmC,EAFY1yC,KAAKlC,MAAMquB,QAAQC,QAAQ/V,EAAK1I,IAC7B3N,KAAKlC,MAAMquB,QAAQC,QAAQ/V,EAAKgZ,cAK/CsjB,EAAmB,CAF2D,GAA7DvyC,OAAO9B,KAAK0B,KAAKlC,MAAM2uB,OAAOpW,EAAKqW,SAASxP,OAAO1d,OACU,GAA7DY,OAAO9B,KAAK0B,KAAKlC,MAAM8uB,OAAOvW,EAAKwW,SAAS3P,OAAO1d,QAChBozC,OAAM,SAAA/tC,GAAC,OAAU,IAANA,KAE/DguC,EAAmB,GACnBC,EAAkB,GAC8C,OAAhE9yC,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMyyC,eAAe,IAAIlhB,eAA8C,IAArBsjB,KACnD,IAAnBD,EACFG,EACI,kBAAC,IAAD,CACItsC,SAAO,EACPP,WAAS,EACTS,QAAS,kBAAM,EAAK4rC,2BAA0B,IAC9C/rC,MAAM,gBACN3C,MAAO,CAAEsf,aAAc,IACvBxV,SAAUzN,KAAKlC,MAAM2P,YAGD,IAAnBilC,IACTG,EACI,kBAAC,IAAD,CACItsC,SAAO,EACPP,WAAS,EACTS,QAAS,kBAAM,EAAK0rC,0BAAyB,IAC7C7rC,MAAM,gBACN3C,MAAO,CAAEsf,aAAc,IACvBxV,SAAUzN,KAAKlC,MAAM2P,aAKmC,OAAhEzN,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMyyC,eAAe,IAAIlhB,eAA8C,IAArBsjB,KACnD,IAAnBD,EACFI,EACI,kBAAC,IAAD,CACIvsC,SAAO,EACPP,WAAS,EACTS,QAAS,kBAAM,EAAK0rC,0BAAyB,IAC7C7rC,MAAM,gBACN3C,MAAO,CAAEsf,aAAc,IACvBxV,SAAUzN,KAAKlC,MAAM2P,YAGD,IAAnBilC,IACTI,EACI,kBAAC,IAAD,CACIvsC,SAAO,EACPP,WAAS,EACTS,QAAS,kBAAM,EAAK4rC,2BAA0B,IAC9C/rC,MAAM,gBACN3C,MAAO,CAAEsf,aAAc,IACvBxV,SAAUzN,KAAKlC,MAAM2P,aAKjC,IAAI6hC,EAAY,GACZtvC,KAAKjC,MAAMqwC,SAAWpuC,KAAKkuC,wBAC7BoB,EACE,kBAAC,IAAD,CACE/oC,SAAO,EACPP,WAAS,EACTS,QAASzG,KAAKiuC,YACd3nC,MAAM,iBACN3C,MAAO,CAAEsf,aAAc,IACvBxV,SAAUzN,KAAKlC,MAAM2P,YAI3B,IAAI8hC,EAAS,GACRvvC,KAAKjC,MAAMqwC,UACdmB,EACE,kBAAC,GAAD,CACErqC,OAAQ,CAAE4hC,SAAU9mC,KAAKlC,MAAMoH,OAAO4hC,UACtCnb,MAAO3rB,KAAKlC,MAAM6tB,MAClBQ,QAASnsB,KAAKlC,MAAMquB,QACpBkB,OAAQrtB,KAAKlC,MAAMuvB,OACnBU,SAAU/tB,KAAKlC,MAAMiwB,SACrBwiB,eAAgBvwC,KAAKlC,MAAMyyC,eAC3B54B,UAAW3X,KAAKlC,MAAM6Z,UACtBJ,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,YAI3B,IAmDIslC,EACAC,EACAC,EArDAtD,EACF,kBAAC,GAAD,CACE3pC,UAAWhG,KAAKjC,MAAMqwC,QACtBlpC,OAAQ,CACNikC,aAAcnpC,KAAKlC,MAAMoH,OAAOguC,WAChC9J,YAAappC,KAAKlC,MAAMoH,OAAOiuC,aAEjCzpB,gBAAiB1pB,KAAKlC,MAAMyyC,eAC5BnlB,WAAW,OACXO,MAAO3rB,KAAKlC,MAAM6tB,MAClB0B,OAAQrtB,KAAKlC,MAAMuvB,OACnBU,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB5U,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,WAIrB2lC,EACF,kBAAC,IAAD,eACE7sC,SAAO,EACPE,QAASzG,KAAKlC,MAAMu1C,iBACpB/sC,MAAM,kBACF7C,IAJN,CAKEE,MAAK,2BAAOF,IAAUE,OAAjB,IAAwBsf,aAAc,GAAInf,MAAO,SACtD2J,SAAUzN,KAAKlC,MAAM2P,YAGrB6lC,EAAsBtzC,KAAKjC,MAAMqwC,QACnC,kBAAC,IAAD,eACE7nC,SAAO,EACPE,QAAS,kBAAM,EAAK2qC,kBAAiB,IACrC9qC,MAAM,+BACF7C,IAJN,CAKEE,MAAK,2BAAOF,IAAUE,OAAjB,IAAwBsf,aAAc,GAAInf,MAAO,SACtD2J,SAAUzN,KAAKlC,MAAM2P,YAGvB,GAGF,GAAIzN,KAAKlC,MAAMyyC,eAAe/wC,OAAS,EACrC4zC,EAAgB,OACX,CACL,IAAIG,EAAYvzC,KAAKlC,MAAMyyC,eAAe5/B,KAAI,SAAAgqB,GAC5C,OAAO,EAAK78B,MAAM6tB,MAAMgP,GAAQ7N,YAGR,IADP,IAAI0mB,IAAID,GACV93B,OAAY23B,EAAgB,IAM/C,IAAIK,EAAkB,GAEtB,GAAyC,IAArCzzC,KAAKlC,MAAMyyC,eAAe/wC,OAAc,CAC1C,IAAM6W,EAAOrW,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMyyC,eAAe,IAClDthB,EAAQjvB,KAAKlC,MAAM2uB,OAAOpW,EAAKqW,SAC/BwC,EAAQlvB,KAAKlC,MAAM8uB,OAAOvW,EAAKwW,SAE/B0U,EAAWtS,EAAM/R,MAAQ+R,EAAM/R,MAAMxR,IAAM,KAC3Cg2B,EAAWxS,EAAMhS,MAAQgS,EAAMhS,MAAMxR,IAAM,KAC3C81B,IAAavS,EAAM/R,MAAM0mB,YAC3B3U,EAAM/R,MAAM0mB,WAAW57B,SAAS,OAE9B25B,IAAazS,EAAMhS,MAAM0mB,YAC3B1U,EAAMhS,MAAM0mB,WAAW57B,SAAS,OAE9B0rC,KAAczkB,EAAM/R,MAAMxR,MAAOujB,EAAM/R,MAAMxR,IAAI1D,SAAS,SAC1D2rC,KAAczkB,EAAMhS,MAAMxR,MAAOwjB,EAAMhS,MAAMxR,IAAI1D,SAAS,SAChE+qC,EACE,kBAAC,GAAD,CACEvR,WAAYA,EACZG,WAAYA,EACZJ,SAAUA,EACVG,SAAUA,IAId,IAAMkS,EAAc5zC,KAAKlC,MAAM6tB,MAAMtV,EAAKgZ,cAC1C,QAAoB/nB,IAAhBssC,EAA2B,CAE7B,IAAMC,EAAqB7zC,KAAKlC,MAAM8uB,OAAOvW,EAAKwW,SAC5CinB,EAAqB9zC,KAAKlC,MAAM2uB,OAAOmnB,EAAYlnB,SACnDqnB,EAAsB/zC,KAAKlC,MAAM2uB,OAAOpW,EAAKqW,SAC7CsnB,EAAsBh0C,KAAKlC,MAAM8uB,OAAOgnB,EAAY/mB,SAGpDonB,EAAwBJ,EAAmB32B,MAAQ22B,EAAmB32B,MAAMxR,IAAM,KAClFwoC,EAAwBJ,EAAmB52B,MAAQ42B,EAAmB52B,MAAMxR,IAAM,KAClFyoC,EAAyBJ,EAAoB72B,MAAQ62B,EAAoB72B,MAAMxR,IAAM,KACrF0oC,EAAyBJ,EAAoB92B,MAAQ82B,EAAoB92B,MAAMxR,IAAM,KAGrF2oC,IAA0BR,EAAmB32B,MAAM0mB,YACvBiQ,EAAmB32B,MAAM0mB,WAAW57B,SAAS,OAEzEssC,IAA0BR,EAAmB52B,MAAM0mB,YACvBkQ,EAAmB52B,MAAM0mB,WAAW57B,SAAS,OAEzEusC,IAA2BR,EAAoB72B,MAAM0mB,YACzBmQ,EAAoB72B,MAAM0mB,WAAW57B,SAAS,OAE1EwsC,IAA2BR,EAAoB92B,MAAM0mB,YACxBoQ,EAAoB92B,MAAM0mB,WAAW57B,SAAS,OAIjFgrC,EACI,kBAAC,GAAD,CAGIxR,WAAY6S,EACZ1S,WAAY2S,EACZ/S,SAAU0S,EACVvS,SAAUwS,IAGlBjB,EACI,kBAAC,GAAD,CACIzR,WAAYgT,EACZ7S,WAAY4S,EACZhT,SAAU6S,EACV1S,SAAUyS,IAIhB5S,GACFkS,EAAgB7rC,KACd,4BACEpB,UAAU,QACVV,aAAW,cACXqJ,IAAI,iBACJxL,MAAO,CAAEwO,QAAS,gBAClB1L,QAAS,kBAAM,EAAKwrC,kBAAiB,IACrCxkC,SAAUzN,KAAKlC,MAAM2P,UAErB,yBACE7C,IAAKqkB,EAAM7D,WACXzgB,IACG+oC,GAAYlS,EAAcD,EAAWA,EAAW,0BAEnD59B,MAAO,CAAEmhB,OAAQ,WACjBhhB,MAAO,KAET,6BACCmrB,EAAM7D,aAITsW,GACF+R,EAAgB7rC,KACd,4BACEpB,UAAU,QACVV,aAAW,cACXqJ,IAAI,iBACJxL,MAAO,CAAEkO,YAAa,EAAGM,QAAS,gBAClC1L,QAAS,kBAAM,EAAKwrC,kBAAiB,IACrCxkC,SAAUzN,KAAKlC,MAAM2P,UAErB,yBACE7C,IAAKskB,EAAM9D,WACXzgB,IACGgpC,GAAYhS,EAAcD,EAAWA,EAAW,0BAEnD/9B,MAAO,CAAEmhB,OAAQ,WACjBhhB,MAAO,KAET,6BACCorB,EAAM9D,aAMf,IAAM9F,EAAQtlB,KAAK6sC,cACnB,OACE,yBAAKrmC,UAAU,SACZioC,EACD,yBAAK9qC,MAAO,CAAEosC,MAAO,OAAQvnC,UAAW,SAAUnF,WAAY,KAC3DowC,GAEH,yBAAK9vC,MAAO,CAAEosC,MAAO,OAAQvnC,UAAW,SAAUnF,WAAY,KAC3DyvC,EACAD,GAEF7yC,KAAKlC,MAAMiuC,YAA+B,IAAjBzmB,EAAM9lB,OAC9B,GAEA,yBAAKmE,MAAO,CAAEsf,aAAc,KACzBjjB,KAAKlC,MAAMiuC,WACV,GAEA,kBAAC,GAAD,CACEhC,YAAa/pC,KAAKlC,MAAMisC,YACxBlb,MAAO7uB,KAAKlC,MAAM+wB,MAClB3pB,OAAQ,CACNwkC,SAAU1pC,KAAKlC,MAAMoH,OAAOwkC,SAC5BC,oBAAqB3pC,KAAKlC,MAAMoH,OAAOykC,qBAEzCM,WAAYjqC,KAAKlC,MAAMmsC,WACvB1yB,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,SACrBsgB,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,UAGxB,6BACE,wBAAIhd,IAAI,gBACL/O,OAAO9B,KAAK0B,KAAKlC,MAAMyyC,gBAAgB/wC,OAAS,EAC7C,kBACA,SAEN,yBAAKgH,UAAU,gBAAgB8e,KAIpCgqB,EAEAtvC,KAAKlC,MAAMiuC,WACV,GAEA,6BACE,uCACCqH,EACAE,EACA/D,EACAI,GAIL,kBAAC,IAAD,CACEh5B,OAAO,EACP7L,KAAM9K,KAAKjC,MAAMm0C,eACjBt7B,eAAgB,kBAAM,EAAKq7B,kBAAiB,IAC5CjnC,aAAc,CAAE8B,WAAY,OAAQ2nC,UAAW,WAC/CvzB,UAAW,CAAErW,QAAS,IAErBkoC,GAEH,kBAAC,IAAD,CACIp8B,OAAO,EACP7L,KAAM9K,KAAKjC,MAAMq0C,uBACjBx7B,eAAgB,kBAAM,EAAKu7B,0BAAyB,IACpDnnC,aAAc,CAAC8B,WAAY,OAAQ2nC,UAAW,WAC9CvzB,UAAW,CAACrW,QAAS,IAEtBmoC,GAEH,kBAAC,IAAD,CACIr8B,OAAO,EACP7L,KAAM9K,KAAKjC,MAAMu0C,wBACjB17B,eAAgB,kBAAM,EAAKy7B,2BAA0B,IACrDrnC,aAAc,CAAC8B,WAAY,OAAQ2nC,UAAW,WAC9CvzB,UAAW,CAACrW,QAAS,IAEtBooC,GAEH,kBAAC,GAAD,CACE5B,mBACErxC,KAAKlC,MAAMquB,QAAQC,QAAQpsB,KAAKlC,MAAMyyC,eAAe,IAAM,EAE7De,eAAgBtxC,KAAKjC,MAAMuzC,eAC3BF,iBAAkBpxC,KAAKoxC,iBACvBlsC,OAAQ,CACNgsC,qBAAsBlxC,KAAKlC,MAAMoH,OAAOgsC,qBACxCC,oBAAqBnxC,KAAKlC,MAAMoH,OAAOisC,4B,GAh+BVjxC,IAAMC,WCN1Bu0C,G,kDACnB,WAAY52C,GAAQ,IAAD,8BACjB,cAAMA,IAURkwC,qBAAuB,WACrB,IAAIjwC,EAAQ,GACZ,IAAK,IAAI+X,KAAK,EAAKhY,MAAM8rB,kBACvB7rB,EACE,oBAAsB,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OACpB,EAEN,OAAO/X,GAlBU,EAyBnBgwC,qBAAuB,WACrB,IAAIhwC,EAAQ,GACZ,IAAK,IAAI+X,KAAK,EAAKhY,MAAM8rB,kBACvB7rB,EAAM,SAAW,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OAA2C,EAC5D/X,EAAM,WAAa,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OAA2C,EAEhE,OAAO/X,GA/BU,EAqCnB+vC,oBAAsB,WACpB,IAAI/vC,EAAQ,GACZ,IAAK,IAAI+X,KAAK,EAAKhY,MAAM8rB,kBACvB7rB,EAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,MAA2C,KAEnD,OAAO/X,GA1CU,EA6CnBmwC,oBAAsB,WACpB,IAAK,IAAIp4B,KAAK,EAAKhY,MAAM8rB,kBAAmB,CAC1C,GAC8C,gBAA5C,EAAK9rB,MAAM8rB,kBAAkB9T,GAA7B,MACA,EAAK/X,MAAM,SAAW,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OACkC,cAAxD,EAAK/X,MAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,MAEX,OAAO,EACF,GACL,EAAK/X,MAAM,SAAW,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OACkC,SAAxD,EAAK/X,MAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,OAC6C,KAAxD,EAAK/X,MAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,MAEX,OAAO,EAGX,OAAO,GA7DU,EAyEnBqwB,eAAiB,SAAC7lC,EAAO0rB,GACvB,GAAK,EAAKjuB,MAAMqwC,QAGT,CAEL,IAAI3B,EAAmB,GACvBA,EAAiBzgB,GAAiB1rB,EAClC,EAAKP,SAAS0sC,QALd,EAAKD,aAAaxgB,EAAe1rB,IA5ElB,EAqFnBosC,gBAAkB,SAACpsC,EAAO0rB,GACxB,IAAI2gB,EAAoB,GACxBA,EAAkB3gB,GAAiB1rB,EACnC,IAAIssC,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9C,EAAKjsB,SAAL,2BAAmB4sC,GAAsBC,KA1FxB,EA6FnBwC,WAAa,SAACpqC,EAAGgnB,GACfhnB,EAAEC,iBACF,IAAI2nC,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9C,EAAKjsB,SAAL,eAAmB6sC,IACd,EAAK7uC,MAAMqwC,SACd,EAAK5B,aAAaxgB,EAAe,EAAKjuB,MAAMiuB,KAnG7B,EAuGnBwgB,aAAe,SAACxgB,EAAe1rB,GAC7B,IAAI4tB,EAAa,GACjBA,EAAWlC,GAAiB1rB,EAC5B,IAAIq0C,EAAS,EAAK72C,MAAM4zC,cAAc,GAClCt7B,EAAI,eACH8X,GAEL,EAAKpwB,MAAMoH,OAAO0vC,WAAWD,EAAQv+B,IA9GpB,EAiHnBi5B,WAAa,SAACrqC,EAAGgnB,GACf,IAAI2gB,EAAoB,GACxBA,EAAkB3gB,GAAiB,EAAKluB,MAAMosB,MAC5C,EAAKpsB,MAAM4zC,cAAc,IACzB1lB,GACF,IAAI4gB,EAAkB,GACtBA,EAAgB,WAAa5gB,IAAiB,EAC9C,EAAKjsB,SAAL,2BAAmB4sC,GAAsBC,KAxHxB,EA8HnBjxB,eAAiB,SAAA9M,GACf,IAAIs/B,EAAiB,GACrBA,EAAe,SAAWt/B,IAAW,EAAK9Q,MAAM,SAAW8Q,GAC3D,EAAK9O,SAASouC,IAjIG,EAoInBF,YAAc,WACZ,IAAI/f,EAAa,GACb2mB,EAAQ,GACZ,IAAK,IAAI/+B,KAAK,EAAKhY,MAAM8rB,kBAAmB,CAE1C,IAAIykB,EAAW,EAAKvwC,MAAM8rB,kBAAkB9T,GAA7B,KACf,GAAI,EAAK/X,MAAM,SAAWswC,GAAW,CAGnC,IAAIC,EAAY,EAAKvwC,MAAM,EAAKD,MAAM8rB,kBAAkB9T,GAA7B,MAEX,OAAdw4B,GACc,SAAdA,GACc,cAAdA,IAEApgB,EAAWmgB,GAAYC,IAI7B,GAAIluC,OAAO9B,KAAK4vB,GAAY1uB,OAAS,EAAG,CAAC,IAAD,iBACvB,EAAK1B,MAAM4zC,eADY,IACtC,2BAAyC,CAAC,IAAjC/jC,EAAgC,QACnCvN,OAAO9B,KAAK4vB,GAAY1uB,OAAS,GACnCq1C,EAAMjtC,KAAK,CAAE+F,KAAIugB,gBAHiB,8BAMtC,EAAKpwB,MAAMoH,OAAO4vC,YAAYD,GAEhC,EAAK90C,SAAL,eAAmB,EAAKguC,0BA/JP,EAkKnBW,mBAAqB,WAA+C,IAA9CgD,EAA6C,uDAA7B,EAAK5zC,MAAM4zC,cAC3CpnB,EAAiB,GACrB,IAAK,IAAIxU,KAAK,EAAKhY,MAAM8rB,kBAAmB,CAC1C,IAD0C,EACtCoC,EAAgB,EAAKluB,MAAM8rB,kBAAkB9T,GAA7B,KADsB,eAEvB47B,GAFuB,IAE1C,2BAAkC,CAAC,IAA1BiD,EAAyB,QAC1Bv+B,EAAO,EAAKtY,MAAMosB,MAAMyqB,GAC9B,QAAsCrtC,IAAlCgjB,EAAe0B,GACjB1B,EAAe0B,GAAiB5V,EAAK4V,QAChC,GAAI1B,EAAe0B,KAAmB5V,EAAK4V,GAAgB,CAChE1B,EAAe0B,GAAiB,KAChC,QARsC,+BAY5C,OAAO1B,GAhLU,EAmLnBuiB,YAAc,WACZ,IADkB,EACdC,EAAQ,GADM,eAEC,EAAKhvC,MAAMisC,aAFZ,IAElB,2BAA2C,CAAC,IAAnCxX,EAAkC,QACnCW,EAAO,EAAKp1B,MAAM+wB,MAAM0D,GAC9Bua,EAAMllC,KAAKgkC,GAAe,EAAK9tC,MAAOo1B,KAJtB,8BAMlB,OAAO4Z,GAzLU,EA4LnBC,gBAAkB,WAChB,EAAKhtC,SAAS,CAAEitC,WAAY,QA7LX,EAgMnBiF,iBAAmB,SAAAC,GACjB,EAAKnyC,SAAS,CAAEmyC,oBAjMC,EAoMnB1E,gBAAkB,SAACxhB,EAAe1rB,GACV,qBAAlB0rB,GACF,EAAKluB,MAAMoH,OAAOuoC,kBAAkB,CAClCr3B,KAAK,2BAAM,EAAKtY,MAAMoY,YAAYE,MAA9B,kBAAqC4V,EAAgB1rB,OAvM5C,EA4MnBotC,cAAgB,SAACC,EAAcC,EAAUC,GACvC,OACE,yBACErnC,UACE,EAAKzI,MAAM,oBAAsB8vC,EAAcpvC,MAC3C,cACA,OAENkF,MAAOvD,OAAO9B,KAAKsvC,GAAUpuC,OAAS,EAAI,CAAE2S,QAAS,QAAW,IAE/Dw7B,EACG,kCACA,oCAtNR,EAAK5vC,MAAL,qCACEm0C,gBAAgB,EAChB9D,QAAS,EAAKtwC,MAAM4zC,cAAclyC,OAAS,GACxC,EAAKsuC,uBACL,EAAKC,wBACL,EAAKC,wBAPO,E,sEAgEO3mC,GACxBrH,KAAKD,SAAS,CACZquC,QAAS/mC,EAAUqqC,cAAclyC,OAAS,IAEvCQ,KAAKjC,MAAMqwC,SACdpuC,KAAKD,SAAL,eAAmBC,KAAK8tC,0B,+BAuJlB,IAAD,OACHW,EAAgB,GAChBnkB,EAAiBtqB,KAAK0uC,qBAFnB,aAIL,IAAIb,EAAgB,EAAK/vC,MAAM8rB,kBAAkB9T,GACjD,GAA2B,QAAvB+3B,EAAcpvC,KAAgB,iBAElC,IAAI6H,EAAQunC,EAAcrjB,YAEtBmkB,EAAc,GAEdf,EAAW,GACXD,KACF,EAAK7vC,MAAMoY,YAAYE,OACvB,EAAKtY,MAAMoY,YAAYE,KAAKy3B,EAAcpvC,QACtC,EAAKX,MAAMoY,YAAYE,KAAKy3B,EAAcpvC,MAEpB,YAAxB,EAAKX,MAAM+mB,UACc,qBAAvBgpB,EAAcpvC,OAChBmvC,EAAW,CAAE5pC,KAAM,UAAW8gB,OAAQ,eACtC6oB,GAAe,GAGf,EAAK5vC,MAAMqwC,UAAY,EAAKtwC,MAAMiuC,YACpC4C,EACE,yBAAKnoC,UAAU,qBACb,kBAAC,KAAD,CACEV,aACE6nC,EACI,SACAE,EAAcrjB,YACd,2BACA,SACAqjB,EAAcrjB,YACd,2BAENokB,YAAa,kBAAC,KAAD,MACbC,cAAe,kBAAC,KAAD,MACfpoC,QAAS,kBACP,EAAK+mC,gBAAgBK,EAAcpvC,MAAOkvC,IAE5ChqC,MACE,EAAK7F,MAAMwe,aAAe,KACtB,CAAEnK,QAAS,QADf,aAEMA,QAAS,eAAgBrO,MAAO,QAAW8pC,GAEnD7pC,UAAS,2BAAO4nC,KAAgB5nC,WAAc6pC,GAC9Cl8B,QAASi8B,EACT5iB,aAAc,WACZ,EAAKhrB,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDqwC,WAAY,WACV,EAAK/uC,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDgP,SAAU,EAAK3P,MAAM2P,WAEtB,EAAKigC,cAAcC,EAAcC,EAAUC,IAGhDvnC,EACE,kBAAC,KAAD,CACER,aACE,WAAa+nC,EAAcrjB,YAAc,kBAE3ClkB,MAAOunC,EAAcrjB,YACrB/jB,QAAS,kBAAM,EAAKkV,eAAekyB,EAAcpvC,OACjDwE,WACG,EAAKlF,MAAM,SAAW8vC,EAAcpvC,MAArC,eAESktC,KAAgB1oC,YAFzB,aACMO,MAAO,QAAWmoC,KAAgB1oC,YAG1Cc,UAAS,eAAO4nC,KAAgB5nC,WAChC2N,QAAS,EAAK3T,MAAM,SAAW8vC,EAAcpvC,MAC7CkF,MAAO,CAAEwO,QAAS,eAAgBrO,MAAO,QACzCwK,SAAU,EAAKvQ,MAAMqwC,SAAkC,QAAvBP,EAAcpvC,KAC9CgP,SAAU,EAAK3P,MAAM2P,YAKzBnH,EACE,yBAAKE,UAAU,qBACb,kBAAC,KAAD,eACEV,aACE6nC,EACI,SACAE,EAAcrjB,YACd,2BACA,SACAqjB,EAAcrjB,YACd,2BAENlkB,MAAOunC,EAAcrjB,YACrBokB,YAAa,kBAAC,KAAD,MACbC,cAAe,kBAAC,KAAD,MACfpoC,QAAS,kBACP,EAAK+mC,gBAAgBK,EAAcpvC,MAAOkvC,IAE5ChqC,MAAK,aAAIwO,QAAS,eAAgBrO,MAAO,QAAW8pC,IAChDjC,KAjBN,CAkBE5nC,UAAS,2BACJ4nC,KAAgB5nC,WADZ,IAEPP,MAAO,QACJoqC,GAELl8B,QAASi8B,EACT5iB,aAAc,WACZ,EAAKhrB,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDqwC,WAAY,WACV,EAAK/uC,SAAL,eACG,oBAAsB8tC,EAAcpvC,MAAO,KAGhDgP,SAAU,EAAK3P,MAAM2P,YAEtB,EAAKigC,cAAcC,EAAcC,EAAUC,IAKlD,IAAIkB,EAAQzkB,EAAeujB,EAAcpvC,MACzC,GAAK,EAAKX,MAAMiuC,WAoGZgD,GADGA,GAAS,EAAKjxC,MAAM4zC,cAAclyC,OAAS,EAE5C,yBACEmE,MAAO,CACLH,MAAO,OACPwrC,UAAW,SACX9rC,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,QAAU,QACpDzR,QAAS,aALb,oBAaA,yBACElH,MAAO,CACLkH,QAAS,WACT3H,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,QAAU,OAGrDyyB,QAvHP,QAA8BznC,IAA1BumC,EAAcoB,QAAuB,CAEvC,IAAI1+B,EAAY,GAChB,IAASwkC,KAAKlH,EAAcoB,QAAS,CACnC,IAAIC,EAASrB,EAAcoB,QAAQ8F,GACnCxkC,EAAU3I,KAAK,CAAEtH,MAAO4uC,EAAQvgC,KAAMugC,IAEG,OAAvC5kB,EAAeujB,EAAcpvC,OAC/B8R,EAAU3I,KAAK,CAAEtH,MAAO,OAAQqO,KAAM,cAExC,IAAIrO,EAAQ,EAAKvC,MAAMqwC,QAAU,OAAS,GACH,OAAnC,EAAKrwC,MAAM8vC,EAAcpvC,OAAkB,EAAKV,MAAMqwC,QACxD9tC,EAAQ,EAAKvC,MAAM8vC,EAAcpvC,MACe,OAAvC6rB,EAAeujB,EAAcpvC,QACtC6B,EAAQgqB,EAAeujB,EAAcpvC,OAEvCswC,EACE,kBAAC,GAAD,CACEphC,GAAI,OAASkgC,EAAcpvC,KAC3B6H,MAAOunC,EAAcrjB,YAAc,sBACnClqB,MAAOA,EACP2F,SAAU,SAAApB,GAAC,OAAI,EAAKshC,eAAethC,EAAGgpC,EAAcpvC,OACpD6P,SACE,EAAKvQ,MAAMqwC,UAAY,EAAKrwC,MAAM,SAAW8vC,EAAcpvC,MAE7DgP,SAAU,EAAK3P,MAAM2P,SACrBzD,KAAMuG,QAGL,CAEL,IAAI4+B,EAAiB,IAElB,EAAKpxC,MAAMqwC,SACZ,EAAKrwC,MAAM,WAAa8vC,EAAcpvC,QAEtC0wC,EACE,6BACE,kBAAC,IAAD,CACErpC,aAAW,SACXS,SAAO,EACPiS,KAAM,kBAAC,KAAD,MACN7U,MAAO,CACLC,SAAU,EAAK9F,MAAMwe,aAAe,KAAO,OAAS,OACpD1K,WAAY,OAEdnL,QAAS,SAAAzB,GAAC,OAAI,EAAKoqC,WAAWpqC,EAAG6oC,EAAcpvC,OAC/CgP,SAAU,EAAK3P,MAAM2P,WAEvB,kBAAC,IAAD,CACE3H,aAAW,SACX2S,WAAS,EACTD,KAAM,kBAAC,KAAD,MACN7U,MAAO,CACLC,SAAU,EAAK9F,MAAMwe,aAAe,KAAO,OAAS,OACpD1K,WAAY,OAEdnL,QAAS,SAAAzB,GAAC,OAAI,EAAKqqC,WAAWrqC,EAAG6oC,EAAcpvC,OAC/CgP,SAAU,EAAK3P,MAAM2P,aAK7B,IAAInN,EAAQ,EAAKvC,MAAMqwC,QAAU,YAAc,GAC3C,EAAKrwC,MAAM,WAAa8vC,EAAcpvC,MACxC6B,EAAQ,EAAKvC,MAAM8vC,EAAcpvC,MACe,OAAvC6rB,EAAeujB,EAAcpvC,QACtC6B,EAAQgqB,EAAeujB,EAAcpvC,OAEvCswC,EACE,6BACE,0BAAMhpC,SAAU,SAAAf,GAAC,OAAI,EAAKoqC,WAAWpqC,EAAG6oC,EAAcpvC,QACpD,kBAAC,IAAD,CACEqH,aACE+nC,EAAcrjB,YAAc,uBAE9B/rB,KAAMovC,EAAcpvC,KACpBuH,WAAW,EACX1F,MAAOA,EACP2F,SAAU,SAACjB,EAAGH,GAAJ,OACR,EAAK6nC,gBAAgB7nC,EAAGgpC,EAAcpvC,OAExC6P,SACE,EAAKvQ,MAAMqwC,UACV,EAAKrwC,MAAM,SAAW8vC,EAAcpvC,MAEvCgP,SAAU,EAAK3P,MAAM2P,SACrBlJ,WAAY,CACVrB,SAAU,EAAKpF,MAAMwe,aAAe,IAAM,OAAS,UAGtD6yB,IAiCXV,EAAc7mC,KACZ,yBAAKpB,UAAU,MAAM2I,IAAK0+B,EAAcpvC,MACtC,yBAAK+H,UAAU,SACZmoC,EACAroC,GAEH,yBAAKE,UAAU,SAASuoC,MAhQ9B,IAAK,IAAIj5B,KAAK9V,KAAKlC,MAAM8rB,kBAAoB,KAiI9BmrB,EAjI6B,IAoQ5C,IAAMzvB,EAAQtlB,KAAK6sC,cACfmI,EAAW,GACTh1C,KAAKlC,MAAMiuC,YAA+B,IAAjBzmB,EAAM9lB,QACnCw1C,EAASptC,KACP,yBACEuH,IAAK,mBAAqBnP,KAAKlC,MAAMm3C,UACrCtxC,MAAO,CAAEN,WAAY,IAEpBrD,KAAKlC,MAAMiuC,WACV,GAEA,kBAAC,GAAD,CACEhC,YAAa/pC,KAAKlC,MAAMisC,YACxBlb,MAAO7uB,KAAKlC,MAAM+wB,MAClB3pB,OAAQ,CACNwkC,SAAU,SAAAnX,GAAM,OACd,EAAKz0B,MAAMoH,OAAOwkC,SAASnX,EAAQ,EAAKz0B,MAAMm3C,YAChDtL,oBAAqB3pC,KAAKlC,MAAMoH,OAAOykC,qBAEzCM,WAAYjqC,KAAKlC,MAAMmsC,WACvB1yB,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,SACrBsgB,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,UAGxB,4BACG/rB,OAAO9B,KAAK0B,KAAKlC,MAAM4zC,eAAelyC,OAAS,EAC5C,kBACA,SAEN,yBAAKgH,UAAU,gBAAgB8e,KAKrC,IAaIytB,EAbAzD,EAAY,GACZtvC,KAAKjC,MAAMqwC,SAAWpuC,KAAKkuC,wBAC7BoB,EACE,kBAAC,IAAD,CACE/oC,SAAO,EACPP,WAAS,EACTS,QAASzG,KAAKiuC,YACd3nC,MAAM,SACNmH,SAAUzN,KAAKlC,MAAM2P,YAM3B,IAAIynC,EAAiB,GAErB,GAAwC,IAApCl1C,KAAKlC,MAAM4zC,cAAclyC,OAAc,CACzC,IAAM4W,EAAOpW,KAAKlC,MAAMosB,MAAMlqB,KAAKlC,MAAM4zC,cAAc,IAEjDnQ,EAA+B,UAApBnrB,EAAKgV,WAAyBhV,EAAK8G,MAAMxR,IAAM,KAC1Dg2B,EAA+B,UAApBtrB,EAAKgV,WAAyBhV,EAAK8G,MAAMxR,IAAM,KAC1D81B,EACJprB,EAAK8G,MAAM0mB,YAAcxtB,EAAK8G,MAAM0mB,WAAW57B,SAAS,OACpD25B,EACJvrB,EAAK8G,MAAM0mB,YAAcxtB,EAAK8G,MAAM0mB,WAAW57B,SAAS,OAC1D+qC,EACE,kBAAC,GAAD,CACEvR,WAAYA,EACZG,WAAYA,EACZJ,SAAUA,EACVG,SAAUA,IAGVtrB,EAAK8G,MAAMxR,KACbwpC,EAAettC,KACb,4BACEpB,UAAU,QACVV,aAAYsQ,EAAKgV,WAAa,SAC9Bjc,IAAI,YACJxL,MAAO,CAAEN,WAAY,EAAGmF,UAAW,UACnC/B,QAAS,kBAAM,EAAKwrC,kBAAiB,IACrCxkC,SAAUzN,KAAKlC,MAAM2P,UAErB,yBACE7C,IAAKwL,EAAKzI,GACVhD,IACGyL,EAAK8G,MAAM0mB,WAAW57B,SAAS,QAAUoO,EAAK8G,MAAMxR,IAAI1D,SAAS,QAC7DoO,EAAK8G,MAAMxR,IACX0K,EAAK8G,MAAMxR,IAAM,0BAExB/H,MAAO,CAAEmhB,OAAQ,WACjBhhB,MAAO,OAOjB,OACE,yBAAK0C,UAAU,SACZioC,EACD,yBAAK9qC,MAAO,CAAEN,WAAY,GAAImF,UAAW,WACtC0sC,GAEFF,EACA1F,EACD,kBAAC,IAAD,CACE34B,OAAO,EACP7L,KAAM9K,KAAKjC,MAAMm0C,eACjBt7B,eAAgB,kBAAM,EAAKq7B,kBAAiB,IAC5CjnC,aAAc,CAAE8B,WAAY,OAAQ2nC,UAAW,WAC/CvzB,UAAW,CAAErW,QAAS,IAErBkoC,Q,GAjlB8B7yC,IAAMC,WChB3C+C,GAAW,KACXvE,OAAOwE,YAAY,IACrBD,GAAW,OACFvE,OAAOwE,YAAY,OAC5BD,GAAW,QAGb,IAMeiyC,GANI,CACjBpuB,IAAK,CACHvjB,MAAO,UACPN,cCVG,SAAS4jC,GAASzwB,EAAM0wB,GAC7B,IAAIpgC,EAAiB,8BAIrB,OAHIogC,EAAW2J,UAAY,IACzB/pC,EAAiB,iCAEZ,CACL8E,MAAO,CACL,yBACA,gCACA,gCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,SACJC,OAAQ,OACR3B,KAAM,CAAEqM,OAAM0wB,cACdpgC,iBACAc,aAAc,gCAGlBwf,YAAY,GAIT,SAASwqB,GAAW9W,EAAQtkB,GACjC,MAAO,CACL5K,MAAO,CACL,uBACA,8BACA,8BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,UAAD,OAAYivB,GACfhvB,OAAQ,MACR3B,KAAM,CAAEqM,QACR1P,eAAgB,gCAChBc,aAAc,gCAGlBwf,YAAY,GAIT,SAAS+qB,GAAYD,EAAOqD,GACjC,MAAO,CACL3pC,MAAO,CACL,yBACA,gCACA,gCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,SACJC,OAAQ,MACR3B,KAAM,CAAE+nC,QAAOqD,cACfzuC,eAAgB,kCAChBc,aAAc,gCAGlBwf,YAAY,GAmDT,SAASksB,GAAYpB,GAC1B,MAAO,CACLtmC,MAAO,CACL,yBACA,+BACA,+BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,SACJC,OAAQ,SACR3B,KAAM+nC,EACNprC,eAAgB,kCAChBc,aAAc,gCAGlBwf,YAAY,GC9HT,SAAS2gB,GAAU52B,EAAO+1B,GAC7B,MAAO,CACHt7B,MAAO,CAAC,yBAAyB,gCAAgC,gCACjE5B,QAAS,CACLR,QAAU,CACNqC,IAAI,UACJC,OAAQ,OACR3B,KAAM,CAACgH,QAAO+1B,cACdpgC,eAAgB,gCAChBc,aAAc,gCAGtBwf,YAAY,GAIb,SAASqY,GAAY5Q,EAAS1d,GACjC,MAAO,CACHvF,MAAO,CAAC,wBAAwB,+BAA+B,+BAC/D5B,QAAS,CACLR,QAAU,CACNqC,IAAI,WAAD,OAAagjB,GAChB/iB,OAAQ,MACR3B,KAAM,CAACgH,SACPrK,eAAgB,iCAChBc,aAAc,gCAGtBwf,YAAY,GAIb,SAASsnB,GAAaj4B,GACzB,MAAO,CACH7K,MAAO,CAAC,yBAAyB,gCAAgC,gCACjE5B,QAAS,CACLR,QAAU,CACNqC,IAAI,UACJC,OAAQ,MACR3B,KAAM,CAACsM,UACP3P,eAAgB,kCAChBc,aAAc,gCAGtBwf,YAAY,GAmBb,SAAS4oB,GAAav5B,EAAQqB,GACjC,MAAO,CACHlM,MAAO,CAAC,yBAAyB,gCAAgC,gCACjE5B,QAAS,CACLR,QAAU,CACNqC,IAAI,UACJC,OAAQ,SACR3B,KAAK,2BAAKsM,GAAN,IAAcqB,cAClBhR,eAAgB,kCAChBc,aAAc,gCAGtBwf,YAAY,GC5Eb,SAAS2tB,GAAWD,EAAQv+B,GAC/B,MAAO,CACH3K,MAAO,CAAC,uBAAuB,8BAA8B,8BAC7D5B,QAAS,CACLR,QAAU,CACNqC,IAAI,UAAD,OAAYipC,GACfhpC,OAAQ,MACR3B,KAAM,CAACoM,QACPzP,eAAgB,gCAChBc,aAAc,gCAGtBwf,YAAY,GAIb,SAAS6tB,GAAYD,GACxB,MAAO,CACHppC,MAAO,CAAC,wBAAwB,+BAA+B,+BAC/D5B,QAAS,CACLR,QAAU,CACNqC,IAAI,SACJC,OAAQ,MACR3B,KAAM,CAAC6qC,SACPluC,eAAgB,iCAChBc,aAAc,gCAGtBwf,YAAY,GC5Bb,SAASouB,GAAQniB,GAYtB,MAAO,CACLznB,MAAO,CACL,uBACA,8BACA,8BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,SACJC,OAAQ,OACR3B,KAAM,CAAEkpB,QACRvsB,eAAgB,gCAChBc,aAAc,iCAMf,SAAS6tC,GAAW/iB,EAAQW,GASjC,MAAO,CACLznB,MAAO,CACL,uBACA,8BACA,8BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,UAAD,OAAY6mB,GACf5mB,OAAQ,MACR3B,KAAM,CAAEkpB,QACRvsB,eAAgB,gCAChBc,aAAc,iCAMf,SAAS8tC,GAAWhjB,GACzB,MAAO,CACL9mB,MAAO,CACL,uBACA,8BACA,8BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,UAAD,OAAY6mB,GACf5mB,OAAQ,SACRhF,eAAgB,gCAChBc,aAAc,gCAGlBwf,YAAY,GAIT,SAASyiB,GAASnX,EAAQijB,GAS/B,MAAO,CACL/pC,MAAO,CACL,qBACA,4BACA,4BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,UAAD,OAAY6mB,EAAZ,SACH5mB,OAAQ,MACR3B,KAAM,CAAEwrC,WACR7uC,eAAgB,+BAChBc,aAAc,gCAGlBwf,YAAY,GAIT,SAAS6kB,GAAWvZ,EAAQijB,GASjC,MAAO,CACL/pC,MAAO,CACL,uBACA,8BACA,8BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,UAAD,OAAY6mB,EAAZ,WACH5mB,OAAQ,MACR3B,KAAM,CAAEwrC,WACR7uC,eAAgB,iCAChBc,aAAc,gCAGlBwf,YAAY,GAIT,SAASwuB,GAAenM,GAO7B,MAAO,CACL79B,MAAO,CACL,2BACA,kCACA,kCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,kBACJC,OAAQ,OACR3B,KAAM,CAAEs/B,YACR3iC,eAAgB,yCAChBc,aAAc,gCAGlBwf,YAAY,GAIT,SAASyuB,GAAepM,GAQ7B,MAAO,CACL79B,MAAO,CACL,2BACA,kCACA,kCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,kBACJC,OAAQ,MACR3B,KAAM,CAAEs/B,YACR3iC,eAAgB,yCAChBc,aAAc,gCAGlBwf,YAAY,GAIT,SAAS0uB,GAAerM,GAO7B,MAAO,CACL79B,MAAO,CACL,2BACA,kCACA,kCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,kBACJC,OAAQ,SACR3B,KAAM,CAAEs/B,YACR3iC,eAAgB,yCAChBc,aAAc,gCAGlBwf,YAAY,GC/MT,SAAS2uB,GAAe/wB,GAC7B,MAAO,CACL/f,KAAM,mBACN+E,QAASgb,GAIN,SAASgxB,GAAkBC,GAChC,MAAO,CACLhxC,KAAM,sBACN+E,QAASisC,GAuCN,SAAShrB,GAAkBpB,EAAiBqsB,EAAQloC,EAAO2nC,GAKhE,GAJA9rB,EAAe,2BACVA,GADU,IAEbI,QAAQ,aAAKJ,EAAgBI,WAG7Bjc,EAAM2V,SACN3V,EAAM4V,cACenc,IAApBuG,EAAMmoC,WAA2BnoC,EAAMmoC,UAAUC,QAClD,CAEIvsB,EAAgB5kB,OAASixC,EAAO3qB,aAClC1B,EAAgBI,QAAU,GAC1BJ,EAAgB5kB,KAAOixC,EAAO3qB,YAEhC,IAAM1W,EAAQgV,EAAgBI,QAAQsC,QAAQ2pB,EAAOpoC,KACtC,IAAX+G,EACFgV,EAAgBI,QAAQ5S,OAAOxC,EAAO,GAEtCgV,EAAgBI,QAAQliB,KAAKmuC,EAAOpoC,IAGxC,GAAqB,IAAjBE,EAAMqoC,aAAoC5uC,IAApBuG,EAAMmoC,UAAyB,CACvD,IAAIG,OACgB7uC,IAAlBuG,EAAM2V,UAA0B3V,EAAM2V,UAAY3V,EAAMuoC,SACtDC,OACgB/uC,IAAlBuG,EAAM4V,UAA0B5V,EAAM4V,UAAY5V,EAAMuoC,SACtDE,OACkBhvC,IAApBuG,EAAMmoC,YACLnoC,EAAMmoC,UAAUC,UAChBpoC,EAAMmoC,UAAUr2C,MASnB,IARKw2C,GAAWE,GAAWC,KAErB5sB,EAAgBI,QAAQ9hB,SAAS+tC,EAAOpoC,IAC1C+b,EAAgBI,QAAU,GAE1BJ,EAAgBI,QAAU,CAACisB,EAAOpoC,KAIpCE,EAAMuoC,eACe9uC,IAApBuG,EAAMmoC,WAA2BnoC,EAAMmoC,UAAUr2C,MAIlD,GAFAhB,OAAO43C,eAAeC,kBAElB9sB,EAAgB5kB,OAASixC,EAAO3qB,WAClC1B,EAAgBI,QAAU,CAACisB,EAAOpoC,QAC7B,CAEL,IAAM8oC,EAAwBjB,EAAQO,EAAO3qB,WAAa,KAAKgB,QAC7D2pB,EAAOpoC,IAKL+oC,EAAU,CAHalB,EAAQO,EAAO3qB,WAAa,KAAKgB,QAC1D1C,EAAgBitB,cAEiBF,GACnCC,EAAQE,MAAK,SAACn3C,EAAGG,GACf,OAAOH,EAAIG,KAEb,IAAMi3C,EAAe,aAAOntB,EAAgBI,SAC5CJ,EAAgBI,QAAU0rB,EAAQO,EAAO3qB,WAAa,KAAKub,MACzD+P,EAAQ,GACRA,EAAQ,GAAK,GAfV,qBAiBUG,GAjBV,IAiBL,2BAAgC,CAAC,IAAxBlpC,EAAuB,QACzB+b,EAAgBI,QAAQ9hB,SAAS2F,IACpC+b,EAAgBI,QAAQliB,KAAK+F,IAnB5B,gCAuCX,OAdA+b,EAAgBI,QAAQ8sB,MAAK,SAACn3C,EAAGG,GAAJ,OAC3B41C,EAAQO,EAAO3qB,WAAa,KAAKgB,QAAQ3sB,GACzC+1C,EAAQO,EAAO3qB,WAAa,KAAKgB,QAAQxsB,GACrC,GACC,KAGgC,IAAnC8pB,EAAgBI,QAAQtqB,OAC1BkqB,EAAgB5kB,KAAO,IAEvB4kB,EAAgB5kB,KAAOixC,EAAO3qB,WAC9B1B,EAAgBitB,aAAeZ,EAAOpoC,IAGjC,CACL7I,KAAM,0BACN+E,QAAS6f,GAuDN,SAASgQ,GAA2BrwB,GACzC,MAAO,CACLvE,KAAM,+BACN+E,QAASR,GCxKN,SAASytC,GAAqBn/B,EAAWgS,GAAU,IAC9CotB,EAAoBptB,EAApBotB,QACR,IAD4BptB,EAAXnE,OAEb,MAAO,CAAC1gB,KAAM,oBAClB,IAJqD,EAIjD4P,EAAQ,EACRsiC,GAAa,EALoC,eAMnCD,GANmC,IAMrD,2BAA2B,CAAC,IAAnBE,EAAkB,QACJ,OAAfA,EAAMnyC,OACNkyC,GAAa,GACO,KAApBC,EAAM1sB,YACNysB,GAAa,GACW,IAAxBC,EAAMpc,OAAOr7B,SACbw3C,GAAa,GACO,KAApBC,EAAMC,YACNF,GAAa,GACbtiC,IAAUqiC,EAAQv3C,OAAO,GACC,KAAtBy3C,EAAME,cACNH,GAAa,GACrBtiC,GAAS,GAlBwC,8BAoBrD,OAAKsiC,EAcE,CAAElyC,KAAM,oBAbJ,CACH2G,MAAO,CAAC,aAAa,yBAAyB,yBAC9C5B,QAAS,CACLR,QAAU,CACNqC,IAAI,aAAD,OAAeiM,EAAf,WACHhM,OAAQ,MACR3B,KAAM,CAAC+sC,WACPpwC,eAAgB,GAChBc,aAAc,iCAgC3B,SAAS2vC,GAAsBC,EAAWC,EAAuBC,GACpE,IAAIzyC,EAAOuyC,EAAU/3C,MAAM,KAAK,GAC1Bk4C,EAASH,EAAU/3C,MAAM,KAAK,GAChCoqB,EAAkB,CAAE5kB,KAAMA,EAAMA,EAAK6hC,MAAM,GAAG,GAAK7hC,EAAMglB,QAAS,GAAI6sB,aAAc,IAWxF,MAVa,QAATa,EACA9tB,EAAgBI,QAAUytB,EAAWzyC,EAAK6hC,MAAM,EAAG7hC,EAAKtF,OAAO,GAAG,OAClD,aAATg4C,IACP9tB,EAAgBI,QAAUytB,EAAWzyC,EAAK6hC,MAAM,EAAG7hC,EAAKtF,OAAO,GAAG,OAAO0P,QAAO,SAACvB,GAC7E,MAAW,WAAP7I,GAA0B,WAAPA,EACZwyC,EAAsBptB,MAAMliB,SAAS2F,GAErC2pC,EAAsBxyC,GAAMkD,SAAS2F,OAGjD,CACH7I,KAAM,0BACN+E,QAAS,CACLwtC,YACA3tB,oB,ICtEN+tB,G,kDACF,WAAY35C,GAAQ,IAAD,8BACf,cAAMA,IAMVmuC,qBAAuB,WAAoB,IAAnB3rC,EAAkB,wDACtC,EAAKP,SAAS,CAAEmsC,mBAAoB5rC,IACpC,EAAKxC,MAAMyZ,YAAYjX,IATR,EAYnBwmC,SAAW,SAAA98B,GAGP,IAFA,IAAImiB,EAAU,GACRrI,EAAS,EAAKhmB,MAAMyJ,KAAKoG,GACtB+pC,EAAQ,EAAGA,EAAQ1tC,EAAK+8B,WAAW2J,UAAWgH,IAAS,CAC5D,IACMC,EAAS7zB,EADFjL,KAAK++B,MAAMnoC,WACOioC,EAC/BvrB,EAAQvkB,KAAK+vC,EAAOtkB,OAAOskB,EAAOn4C,OAAS,KAG/C,IADA,IAAIq4C,EAAU,GAENH,EAAQvrB,EAAQ3sB,OACpBk4C,EAAQvrB,EAAQ3sB,OAAqC,EAA5BwK,EAAK+8B,WAAW2J,UACzCgH,IACF,CACE,IACMC,EAAS7zB,EADFjL,KAAK++B,MAAMnoC,WACOioC,EAC/BG,EAAQjwC,KAAK+vC,EAAOtkB,OAAOskB,EAAOn4C,OAAS,KAE/CwK,EAAK+8B,WAAL,QAA6B5a,EAC7BniB,EAAK+8B,WAAL,QAA6B8Q,EAC7B,EAAK/5C,MAAMgpC,SACP98B,EAAKqM,KACLrM,EAAK+8B,WACL,EAAKjpC,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UApCA,EAwCnB8nB,WAAa,SAAC9W,EAAQtkB,GAClB,EAAKvY,MAAM2zC,WACP9W,EACAtkB,EACA,EAAKvY,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UA7CA,EAiDnBqoB,YAAc,SAAAD,GACV,EAAKj0C,MAAMk0C,YAAYD,EAAO,EAAKj0C,MAAM6Z,UAAW,EAAK7Z,MAAM6rB,UAlDhD,EAqDnB0pB,iBAAmB,WACf,EAAKv1C,MAAMu1C,iBACP,EAAKv1C,MAAM4rB,gBAAgBI,QAC3B,EAAKhsB,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UAzDA,EA6DnBupB,WAAa,SAAAvY,GACT,EAAK78B,MAAMo1C,WAAWvY,EAAQ,EAAK78B,MAAM6Z,UAAW,EAAK7Z,MAAM6rB,UA9DhD,EAiEnBwpB,YAAc,SAAApB,GACV,EAAKj0C,MAAMq1C,YAAYpB,EAAO,EAAKj0C,MAAM6Z,UAAW,EAAK7Z,MAAM6rB,UAlEhD,EAqEnB2V,YAAc,SAAC5Q,EAAS1d,GACpB,EAAKlT,MAAMwhC,YACP5Q,EACA1d,EACA,EAAKlT,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UA1EA,EA8EnB4kB,aAAe,SAAAj4B,GACX,EAAKxY,MAAMywC,aAAaj4B,EAAQ,EAAKxY,MAAM6Z,UAAW,EAAK7Z,MAAM6rB,UA/ElD,EAkFnBie,UAAY,SAAA59B,GAGR,IAFA,IAAM8Z,EAAS,EAAKhmB,MAAMyJ,KAAKoG,GAC3BogB,EAAW,GACN2pB,EAAQ,EAAGA,EAAQ1tC,EAAK+8B,WAAWG,WAAYwQ,IAAS,CAC7D,IACMC,EAAS7zB,EADFjL,KAAK++B,MAAMnoC,WACOioC,EAC/B3pB,EAASnmB,KAAK+vC,EAAOtkB,OAAOskB,EAAOn4C,OAAS,KAGhD,IADA,IAAI2sB,EAAU,GAENurB,EAAQ3pB,EAASvuB,OACrBk4C,EAAQ3pB,EAASvuB,OAASuuB,EAASvuB,OAASwK,EAAK+8B,WAAW2J,UAC5DgH,IACF,CACE,IACMC,EAAS7zB,EADFjL,KAAK++B,MAAMnoC,WACOioC,EAC/BvrB,EAAQvkB,KAAK+vC,EAAOtkB,OAAOskB,EAAOn4C,OAAS,KAG/C,IADA,IAAIq4C,EAAU,GAENH,EAAQ3pB,EAASvuB,OAAS2sB,EAAQ3sB,OACtCk4C,EAAQ3pB,EAASvuB,OAAS2sB,EAAQ3sB,OAA0B,EAAjB2sB,EAAQ3sB,OACnDk4C,IACF,CACE,IACMC,EAAS7zB,EADFjL,KAAK++B,MAAMnoC,WACOioC,EAC/BG,EAAQjwC,KAAK+vC,EAAOtkB,OAAOskB,EAAOn4C,OAAS,KAE/CwK,EAAK+8B,WAAL,SAA8BhZ,EAC9B/jB,EAAK+8B,WAAL,QAA6B5a,EAC7BniB,EAAK+8B,WAAL,QAA6B8Q,EAC7B,EAAK/5C,MAAM8pC,UACP59B,EAAKgH,MACLhH,EAAK+8B,WACL,EAAKjpC,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UArHA,EA0HnBmuB,YAAc,SAACppB,GACX,IAAI1d,EAAQ,CACZA,SAAoB,GACpBA,OAAkB,IACd8b,EAAW,EAAKhvB,MAAMuvB,OAAOqB,GAAS5B,SAC1C,EAAKwS,YAAYxS,EAAU9b,IA/HZ,EAkInB4+B,YAAc,SAAAlhB,GAEN,EAAK5wB,MAAMuvB,OAAOqB,GAAS5B,UAC3B,EAAKgrB,YAAYppB,GAErB,EAAK5wB,MAAM8xC,YAAYlhB,EAAS,EAAK5wB,MAAM6Z,UAAW,EAAK7Z,MAAM6rB,UAvIlD,EA0InBkmB,aAAe,SAAAv5B,GACX,EAAKxY,MAAM+xC,aAAav5B,EAAQ,EAAKxY,MAAM6Z,UAAW,EAAK7Z,MAAM6rB,UA3IlD,EA8InBirB,WAAa,SAACD,EAAQv+B,GAClB,EAAKtY,MAAM82C,WACPD,EACAv+B,EACA,EAAKtY,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UAnJA,EAuJnBmrB,YAAc,SAAAD,GACV,EAAK/2C,MAAMg3C,YAAYD,EAAO,EAAK/2C,MAAM6Z,UAAW,EAAK7Z,MAAM6rB,UAxJhD,EA2JnB+f,SAAW,SAAAnX,GACP,IAAIijB,EAAU,GACV1wC,EAAO,EAAKhH,MAAM4rB,gBAAgB5kB,KACzB,UAATA,GAA6B,UAATA,IAAkBA,EAAO,QAHhC,qBAIF,EAAKhH,MAAM4rB,gBAAgBI,SAJzB,IAIjB,2BAAmD,CAAC,IAA3Cnc,EAA0C,QAC/C6nC,EAAQ5tC,KAAK,CAAE+F,KAAI7I,UALN,8BAOjB,EAAKhH,MAAMoH,OAAOwkC,SACdnX,EACAijB,EACA,EAAK13C,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UAtKA,EA0KnBmiB,WAAa,SAACvZ,EAAQ0iB,GAClB,IADgC,EAC5BO,EAAU,GACV1wC,EAAO,EAAKhH,MAAM4rB,gBAAgB5kB,KAFN,eAGjB,EAAKhH,MAAM4rB,gBAAgBI,SAHV,IAGhC,2BAAmD,CAAC,IAA3Cnc,EAA0C,QAC/C6nC,EAAQ5tC,KAAK,CAAE+F,KAAI7I,UAJS,8BAMhC,EAAKhH,MAAMoH,OAAO4mC,WACdvZ,EACAijB,EACA,EAAK13C,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UApLA,EAwLnBggB,oBAAsB,SAACvW,EAAWkW,EAAUC,EAAanxB,EAAKoa,GAC1D,IAAIgjB,EAAU,GACV1wC,EAAO,EAAKhH,MAAM4rB,gBAAgB5kB,KACzB,UAATA,GAA6B,UAATA,IAAkBA,EAAO,QAHkB,qBAIpD,EAAKhH,MAAM4rB,gBAAgBI,SAJyB,IAInE,2BAAmD,CAAC,IAA3Cnc,EAA0C,QAC/C6nC,EAAQ5tC,KAAK,CAAE+F,KAAI7I,UAL4C,8BAOnE,IAEM6yC,EAFS,EAAK75C,MAAMyJ,KAAKoG,GAClBkL,KAAK++B,MAAMnoC,WAElB9B,EAAKgqC,EAAOtkB,OAAOskB,EAAOn4C,OAAS,IACrC0zB,EAAO,CACPkiB,WAAY,EAAKt3C,MAAM6Z,UACvBhK,GAAIA,EACJvC,MAAOgoB,EACPkW,SAAUA,EACVC,YAAaA,EACbnxB,IAAKA,EACLoa,KAAMA,GAEV,EAAK10B,MAAM6rC,oBACPzW,EACAsiB,EACA,EAAK13C,MAAM6Z,UACX,EAAK7Z,MAAM6rB,UAhNA,EAoNnBunB,qBAAuB,SAAAD,GACnB,IAAI9kB,EAAU,EAAKruB,MAAM2rB,iBAAiBC,gBAAgBI,QAE1D,EAAKhsB,MAAMozC,qBAAqBD,EAAa9kB,IAvN9B,EA0NnBglB,oBAAsB,SAAAF,GAClB,IADiC,EAC7B9kB,EAAU,EAAKruB,MAAM2rB,iBAAiBC,gBAAgBI,QACtDiuB,EAAW,GACXC,EAAW,GAHkB,eAKZ7rB,GALY,IAKjC,2BAA8B,CAAC,IAApBwO,EAAmB,QACpBtkB,EAAO,EAAKvY,MAAM6tB,MAAMgP,GAC9Bod,EAASnwC,KAAKyO,EAAKqW,SACnBsrB,EAASpwC,KAAKyO,EAAKwW,UARU,8BAUjC,EAAK/uB,MAAMqzC,oBAAoBF,EAAa8G,EAAUC,IApOvC,EAuOnBC,uBAAyB,SAAC33C,EAAOuN,GAC7B,EAAK/P,MAAMo6C,iBACP53C,EACA,EAAKxC,MAAM4rB,gBACX,EAAK5rB,MAAM6tB,MACX,EAAK7tB,MAAM2uB,OACX,EAAK3uB,MAAM8uB,SA7OA,EAiPnB6gB,kBAAoB,SAAA0K,GAChB,IAAMjiC,EAAW,2BAAQ,EAAKpY,MAAMoY,aAAgBiiC,GACpD,EAAKr6C,MAAM2vC,kBAAkB,EAAK3vC,MAAM6Z,UAAW,CAAEzB,iBAjPrD,EAAKnY,MAAQ,CACTmuC,oBAAoB,GAHT,E,qDAsPT,IAAD,OACL,GAA8C,IAA1C9rC,OAAO9B,KAAK0B,KAAKlC,MAAMuvB,QAAQ7tB,OAC/B,OACI,6BACI,kBAAC,IAAD,CACI+G,SAAO,EACPD,MAAOtG,KAAKlC,MAAMuoC,eAAiB,MAAQ,gBAC3C1iC,MACI3D,KAAKlC,MAAMuoC,eACT,CAAEviC,MAAO,MAAOyU,MAAO,OAAQtU,YAAa,MAC5C,CAAEH,MAAO,OAAQyU,MAAO,OAAQtU,YAAa,MAEnDwC,QAAS,kBAAM,EAAKwlC,sBAAqB,MAE7C,kBAAC,GAAD,CACI/mC,OAAQ,CAAE0iC,UAAW5nC,KAAK4nC,WAC1BjwB,UAAW3X,KAAKlC,MAAM6Z,UACtB7M,KAAM9K,KAAKjC,MAAMmuC,mBACjB7F,eAAgBrmC,KAAKlC,MAAM4rB,gBAAgBI,QAC3Cqd,YAAannC,KAAKisC,wBAMlC,GAAkD,IAA9CjsC,KAAKlC,MAAM4rB,gBAAgBI,QAAQtqB,OACnC,OAAO,8BAGX,IAAM44C,EACF,kBAAClvB,GAAA,KAAD,CACIC,sBAAuB,CAAErP,gBAAiB,WAC1CxZ,MAAON,KAAKlC,MAAM4rB,gBAAgB5kB,KAClCmB,SAAUjG,KAAKi4C,wBAEf,kBAAC,OAAD,CACInyC,aAAW,WACXQ,MAAM,OACNhG,MAAM,OACNyC,YAAaoyC,GAAapuB,IAC1BtZ,SAAUzN,KAAKlC,MAAM2P,WAEzB,kBAAC,OAAD,CACI3H,aAAW,YACXQ,MAAM,QACNhG,MAAM,QACNyC,YAAaoyC,GAAapuB,IAC1BtZ,SAAUzN,KAAKlC,MAAM2P,WAEzB,kBAAC,OAAD,CACI3H,aAAW,YACXQ,MAAM,QACNhG,MAAM,QACNyC,YAAaoyC,GAAapuB,IAC1BtZ,SAAUzN,KAAKlC,MAAM2P,YAK3B4qC,EACF,kBAACnvB,GAAA,KAAD,CACIC,sBAAuB,CAAErP,gBAAiB,WAC1CxZ,MAAM,SAEN,kBAAC,OAAD,CACIgG,MAAM,QACNhG,MAAM,QACNyC,YAAaoyC,GAAapuB,IAC1BtZ,UAAW,KAKjB6qC,EAAc,CAChB5O,SAAU1pC,KAAK0pC,SACfoC,WAAY9rC,KAAK8rC,WACjBnC,oBAAqB3pC,KAAK2pC,qBAG9B,GAAwC,UAApC3pC,KAAKlC,MAAM4rB,gBAAgB5kB,KAC3B,OACI,yBAAK8H,KAAK,SAAS9G,aAAW,WACzBuyC,EACD,kBAAC,GAAD,CACInzC,OAAM,aACFo6B,YAAat/B,KAAKs/B,YAClBiP,aAAcvuC,KAAKuuC,aACnB3G,UAAW5nC,KAAK4nC,UAChBd,SAAU9mC,KAAK8mC,SACf8I,YAAa5vC,KAAK4vC,YAClBC,aAAc7vC,KAAK6vC,aACnBnW,2BAA4B15B,KAAKlC,MAAM47B,2BACvC+T,kBAAmBztC,KAAKytC,mBACrB6K,GAEP3gC,UAAW3X,KAAKlC,MAAM6Z,UACtBzB,YAAalW,KAAKlC,MAAMoY,YACxBmX,OAAQrtB,KAAKlC,MAAMuvB,OACnBU,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,SACrBrsB,MAAO3rB,KAAKlC,MAAM6tB,MAClBc,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnBiC,MAAO7uB,KAAKlC,MAAM+wB,MAClBob,WAAYjqC,KAAKlC,MAAMmsC,WACvBF,YAAa/pC,KAAKlC,MAAMisC,YACxBvZ,eAAgBxwB,KAAKlC,MAAM0yB,eAC3B3L,SAAU7kB,KAAKlC,MAAM2rB,iBAAiB5E,SACtCwhB,eAAgBrmC,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAC5DF,kBACI5pB,KAAKlC,MAAM2rB,iBAAiBG,kBAAkB5Y,MAElDunC,aAAcv4C,KAAKlC,MAAMy6C,aACzBnb,SAAUp9B,KAAKlC,MAAMs/B,SACrB2O,WAAqD,YAAzC/rC,KAAKlC,MAAM2rB,iBAAiB5E,SACxCtN,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,SACrB6O,YAAatc,KAAKlC,MAAMwe,eAIjC,GAAwC,SAApCtc,KAAKlC,MAAM4rB,gBAAgB5kB,KAClC,OACI,yBAAK8H,KAAK,SAAS9G,aAAW,WACzBsyC,EACD,kBAAC,GAAD,CACIlzC,OAAM,aACFusC,WAAYzxC,KAAKyxC,WACjBO,YAAahyC,KAAKgyC,YAClBlL,SAAU9mC,KAAK8mC,SACfoM,WAAYlzC,KAAKkzC,WACjBC,YAAanzC,KAAKmzC,YAClBjC,qBAAsBlxC,KAAKkxC,qBAC3BC,oBAAqBnxC,KAAKmxC,oBAC1B1D,kBAAmBztC,KAAKytC,mBACrB6K,GAEP3gC,UAAW3X,KAAKlC,MAAM6Z,UACtB0V,OAAQrtB,KAAKlC,MAAMuvB,OACnBU,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,SACrBrsB,MAAO3rB,KAAKlC,MAAM6tB,MAClBc,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnBiC,MAAO7uB,KAAKlC,MAAM+wB,MAClBob,WAAYjqC,KAAKlC,MAAMmsC,WACvBF,YAAa/pC,KAAKlC,MAAMisC,YACxBvZ,eAAgBxwB,KAAKlC,MAAM0yB,eAC3B3L,SAAU7kB,KAAKlC,MAAM2rB,iBAAiB5E,SACtC0rB,eAAgBvwC,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAC5DF,kBACI5pB,KAAKlC,MAAM2rB,iBAAiBG,kBAAkBvT,KAElDH,YAAalW,KAAKlC,MAAMoY,YACxBqiC,aAAcv4C,KAAKlC,MAAMy6C,aACzBlF,iBAAkBrzC,KAAKqzC,iBACvBtH,WAAqD,YAAzC/rC,KAAKlC,MAAM2rB,iBAAiB5E,SACxCtN,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,SACrB6O,YAAatc,KAAKlC,MAAMwe,eAIjC,GACiC,UAApCtc,KAAKlC,MAAM4rB,gBAAgB5kB,MACS,UAApC9E,KAAKlC,MAAM4rB,gBAAgB5kB,KAC7B,CACE,IAAMmwC,EAAgD,UAApCj1C,KAAKlC,MAAM4rB,gBAAgB5kB,KAAmB,EAAI,EACpE,OACI,yBAAK8H,KAAK,SAAS9G,aAAW,WACzBsyC,EACD,kBAAC,GAAD,CACIlzC,OAAM,aACF4vC,YAAa90C,KAAK80C,YAClBF,WAAY50C,KAAK40C,WACjBnH,kBAAmBztC,KAAKytC,mBACrB6K,GAEPpiC,YAAalW,KAAKlC,MAAMoY,YACxByB,UAAW3X,KAAKlC,MAAM6Z,UACtBoW,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,SACrB3qB,OAAQrtB,KAAKlC,MAAMuvB,OACnB1B,MAAO3rB,KAAKlC,MAAM6tB,MAClBc,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnB1C,MAAOlqB,KAAKlC,MAAMkC,KAAKlC,MAAM4rB,gBAAgB5kB,KAAO,KACpD+pB,MAAO7uB,KAAKlC,MAAM+wB,MAClBob,WAAYjqC,KAAKlC,MAAMmsC,WACvBF,YAAa/pC,KAAKlC,MAAMisC,YACxBvZ,eAAgBxwB,KAAKlC,MAAM0yB,eAC3B3L,SAAU7kB,KAAKlC,MAAM2rB,iBAAiB5E,SACtC6sB,cAAe1xC,KAAKlC,MAAM2rB,iBAAiBC,gBAAgBI,QAC3DF,kBACI5pB,KAAKlC,MAAM2rB,iBAAiBG,kBAAkBxT,KAElDmiC,aAAcv4C,KAAKlC,MAAMy6C,aACzBtD,UAAWA,EACXlJ,WAAqD,YAAzC/rC,KAAKlC,MAAM2rB,iBAAiB5E,SACxCtN,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,SACrB6O,YAAatc,KAAKlC,MAAMwe,eAKpC,OAAO,kC,GA3cGpc,IAAMC,WAqlBb6M,gBArIS,SAAAjP,GACpB,MAAO,CACHwJ,KAAMxJ,EAAMwJ,KACZoQ,UAAW5Z,EAAMynB,OAAOha,QAAQmC,GAChCuI,YAAanY,EAAMynB,OAAOha,QAAQ0K,YAClCmX,OAAQtvB,EAAMynB,OAAOha,QAAQ6hB,OAC7BU,SAAUhwB,EAAMynB,OAAOha,QAAQuiB,SAC/B5B,QAASpuB,EAAMynB,OAAOha,QAAQ2gB,QAC9B4rB,SAAUh6C,EAAMynB,OAAOha,QAAQusC,SAC/BC,SAAUj6C,EAAMynB,OAAOha,QAAQwsC,SAC/BrsB,MAAO5tB,EAAMynB,OAAOha,QAAQmgB,MAC5Bc,OAAQ1uB,EAAMynB,OAAOha,QAAQihB,OAC7BG,OAAQ7uB,EAAMynB,OAAOha,QAAQohB,OAC7BiC,MAAO9wB,EAAMynB,OAAOha,QAAQqjB,MAC5Bob,WAAYlsC,EAAMynB,OAAOha,QAAQy+B,WACjCvgB,gBAAiB3rB,EAAMynB,OAAOiE,iBAAiBC,gBAC/CD,iBAAkB1rB,EAAMynB,OAAOiE,iBAC/B8uB,aAAcx6C,EAAMynB,OAAO+yB,aAC3B5uB,QAAS5rB,EAAMynB,OAAOiE,iBAAiBE,QACvCyT,SAAUr/B,EAAMynB,OAAOiE,iBAAiB+uB,eAAepb,aAIpC,SAAA7zB,GACvB,MAAO,CACHmwB,2BAA4B,SAAA1vB,GACxBT,EAASmwB,GAA2B1vB,KAGxC88B,SAAU,SAACzwB,EAAM0wB,EAAYpvB,EAAWgS,GACpCpgB,EAASu9B,GAASzwB,EAAM0wB,IAAaxoC,MAAK,kBACtCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjD8nB,WAAY,SAAC9W,EAAQtkB,EAAMsB,EAAWgS,GAClCpgB,EAASkoC,GAAW9W,EAAQtkB,IAAO9X,MAAK,kBACpCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDqoB,YAAa,SAACD,EAAOp6B,EAAWgS,GAC5BpgB,EAASyoC,GAAYD,EAAOp6B,IAAYpZ,MAAK,kBACzCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjD0pB,iBAAkB,SAAClnB,EAASxU,EAAWgS,GN3dxC,IAA0BooB,EM4drBxoC,GN5dqBwoC,EM4dK5lB,EN3d7B,CACL1gB,MAAO,CACL,6BACA,oCACA,oCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,iBACJC,OAAQ,MACR3B,KAAM,CAAE+nC,SACRprC,eAAgB,oCAChBc,aAAc,gCAGlBwf,YAAY,KM4cgC1oB,MAAK,kBACrCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDupB,WAAY,SAACvY,EAAQhjB,EAAWgS,GAC5BpgB,EN9cL,SAAoBoxB,GACzB,MAAO,CACLlvB,MAAO,CACL,uBACA,8BACA,8BAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,UAAD,OAAYivB,GACfhvB,OAAQ,SACRhF,eAAgB,gCAChBc,aAAc,gCAGlBwf,YAAY,GM+bKisB,CAAWvY,IAASp8B,MAAK,kBAC9BgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDwpB,YAAa,SAACpB,EAAOp6B,EAAWgS,GAC5BpgB,EAAS4pC,GAAYpB,IAAQxzC,MAAK,kBAC9BgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDie,UAAW,SAAC52B,EAAO+1B,EAAYpvB,EAAWgS,GACtCpgB,EAASq+B,GAAU52B,EAAO+1B,IAAaxoC,MAAK,kBACxCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjD2V,YAAa,SAAC5Q,EAAS1d,EAAO2G,EAAWgS,GACrCpgB,EAAS+1B,GAAY5Q,EAAS1d,IAAQzS,MAAK,kBACvCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjD4kB,aAAc,SAACj4B,EAAQqB,EAAWgS,GAC9BpgB,EAASglC,GAAaj4B,IAAS/X,MAAK,kBAChCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDimB,YAAa,SAAClhB,EAAS/W,EAAWgS,GAC9BpgB,ELvhBL,SAAqBmlB,GACxB,MAAO,CACHjjB,MAAO,CAAC,wBAAwB,+BAA+B,+BAC/D5B,QAAS,CACLR,QAAU,CACNqC,IAAI,WAAD,OAAagjB,GAChB/iB,OAAQ,SACRhF,eAAgB,iCAChBc,aAAc,gCAGtBwf,YAAY,GK4gBC2oB,CAAYlhB,IAAUnwB,MAAK,kBAChCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDkmB,aAAc,SAACv5B,EAAQqB,EAAWgS,GAC9BpgB,EAASsmC,GAAav5B,EAAQqB,IAAYpZ,MAAK,kBAC3CgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDirB,WAAY,SAACD,EAAQv+B,EAAMuB,EAAWgS,GAClCpgB,EAASqrC,GAAWD,EAAQv+B,IAAO7X,MAAK,kBACpCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDmrB,YAAa,SAACD,EAAOl9B,EAAWgS,GAC5BpgB,EAASurC,GAAYD,IAAQt2C,MAAK,kBAC9BgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDuuB,iBAAkB,SAACO,EAAS/uB,EAAiBiC,EAAOc,EAAQG,GACxDrjB,EF7cL,SAA0BkvC,EAAS/uB,EAAiB8rB,GACzD,IAAIkD,EAAqB,CAAE5zC,KAAM2zC,EAAS3uB,QAAS,GAAI6sB,aAAc,IACrE,GAA6B,YAAzBjtB,EAAgB5kB,KAAoB,MAAO,CAAEA,KAAM,iBAEvD,IAAMixC,EAASP,EAAQ9rB,EAAgB5kB,KAAO,KAE9C,OAAQ2zC,GACN,IAAK,OAAL,qBACiB/uB,EAAgBI,SADjC,IACE,2BAAwC,CAAC,IAAhCnc,EAA+B,QACtC+qC,EAAmB5uB,QAAQliB,KAAKmuC,EAAOpoC,GAAImf,WAF/C,8BAIE,MACF,IAAK,QAAL,qBACiBpD,EAAgBI,SADjC,IACE,2BAAwC,CAAC,IAAhCnc,EAA+B,QACT,SAAzB+b,EAAgB5kB,KAClB4zC,EAAmB5uB,QAAQliB,KAAKmuC,EAAOpoC,GAAI+e,SAE3CgsB,EAAmB5uB,QAAQliB,KACzB4tC,EAAQ7pB,MAAMoqB,EAAOpoC,GAAImf,UAAUJ,UAN3C,8BASE,MACF,IAAK,QAAL,qBACiBhD,EAAgBI,SADjC,IACE,2BAAwC,CAAC,IAAhCnc,EAA+B,QACT,SAAzB+b,EAAgB5kB,KAClB4zC,EAAmB5uB,QAAQliB,KAAKmuC,EAAOpoC,GAAIkf,SAE3C6rB,EAAmB5uB,QAAQliB,KACzB4tC,EAAQ7pB,MAAMoqB,EAAOpoC,GAAImf,UAAUD,UAN3C,+BAiBF,OAHA6rB,EAAmB/B,aACjB+B,EAAmB5uB,QAAQ4uB,EAAmB5uB,QAAQtqB,OAAS,GAE1D,CACLsF,KAAM,0BACN+E,QAAS6uC,GEqaGR,CAAiBO,EAAS/uB,EAAiB,CAAEiC,QAAOc,SAAQG,aAIpE+c,oBAAqB,SAACzW,EAAMsiB,EAAS79B,EAAWgS,GAC5CpgB,EAAS8rC,GAAQniB,IACZ30B,MAAK,kBAAMgL,EAASmgC,GAASxW,EAAKvlB,GAAI6nC,OACtCj3C,MAAK,kBAAMgL,EAASutC,GAAqBn/B,EAAWgS,QAG7DunB,qBAAsB,SAACD,EAAa9kB,GAChC5iB,ENzeL,SAA8B0nC,EAAa9kB,GAChD,MAAO,CACL1gB,MAAO,CACL,kCACA,yCACA,yCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,uBACJC,OAAQ,MACR3B,KAAM,CAAEinC,cAAa9kB,WACrBxlB,eAAgB,2CAChBc,aAAc,gCAGlBwf,YAAY,GMydKiqB,CAAqBD,EAAa9kB,KAG/CglB,oBAAqB,SAACF,EAAa8G,EAAUC,GACzCzuC,ENzdL,SAA6B0nC,EAAa8G,EAAUC,GACzD,MAAO,CACLvsC,MAAO,CACL,iCACA,wCACA,wCAEF5B,QAAS,CACPR,QAAS,CACPqC,IAAI,4BACJC,OAAQ,MACR3B,KAAM,CAAEinC,cAAa8G,WAAUC,YAC/BrxC,eAAgB,0CAChBc,aAAc,gCAGlBwf,YAAY,GMycKkqB,CAAoBF,EAAa8G,EAAUC,KAGxDvK,kBAAmB,SAAC91B,EAAWnM,GAC3BjC,EzCljBL,SAA2BoO,EAAWnM,GAC3C,MAAO,CACLC,MAAO,CAAC,8BAA+B,GAAI,iCAC3C5B,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,GAClBhM,OAAQ,MACR3B,KAAM,CAAEwB,WACR7E,eAAgB,mCAChBc,aAAc,iCyCyiBDgmC,CAAkB91B,EAAWnM,QAKnCwB,CAA6CyqC,I,qBCjb7CkB,G,4MA3LbC,yBAA2B,WACzB,OAAI,EAAK96C,MAAMgH,KACN,EAAKhH,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,MAAM6L,IAAI,EAAKkoC,uBAEvD,I,EAIXC,0BAA4B,SAACxP,EAAU50B,GACrC,MAAO,CAAEvF,IAAIm6B,EAAS50B,EAAOpU,MAAMgpC,EAAU36B,KAAK26B,I,EAGpDuP,sBAAwB,SAACn+B,EAAMhG,GAC7B,MAAO,CAAEvF,IAAIuL,EAAKjc,KAAKiW,EAAOpU,MAAMoa,EAAKjc,KAAMkQ,KAAK+L,EAAK8P,c,EAG3DuuB,iBAAmB,SAACr+B,EAAMhG,GACxB,OAAO,kBAAC,KAAD,CAAUskC,eAAa,EAAC7pC,IAAKuL,EAAMpa,MAAOoa,EAAMmF,YAAanF,EAAMhJ,QAAS,EAAK5T,MAAM+8B,QAAU,EAAK/8B,MAAM+8B,OAAOzO,QAAQ1R,IAAS,K,EAG7Iu+B,kBAAoB,SAACv+B,GACnB,MAAO,CAAEvL,IAAIuL,EAAMpa,MAAMoa,EAAM/L,KAAK+L,I,EAGtCw+B,qBAAuB,SAACx+B,GACtB,IAAIy+B,GAAa,EACjB,IACEA,EAAc,EAAKr7C,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,MAAM,EAAKhH,MAAMs7C,gBAAzD,WACd,MAAOp0C,IACT,OAAUm0C,GAAcz+B,IAASA,EAAK1S,SAAS,UAAamxC,GAAcz+B,IAASA,EAAK1S,SAAS,Y,EAGnGqxC,iBAAmB,WACjB,IAAItK,EAAO,kBAAC,IAAD,eACPjpC,aAAW,cACX6J,SAAS,QACThM,MAAO,CAACN,WAAY,GAAIS,MAAO,QAC/BwK,UAAQ,EACRb,SAAU,EAAK3P,MAAM2P,UACjBjJ,IAER,GAAgC,KAA5B,EAAK1G,MAAMs7C,eACb,IACE,GAAI,EAAKt7C,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,YAA+FwC,IAAtF,EAAKxJ,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,MAAM,EAAKhH,MAAMs7C,gBAAzD,QACjDrK,EAAQ,kBAAC,GAAD,CACNphC,GAAG,mBACHrH,MAAM,iBACNJ,kBAAkB,QAClB8D,KAAM,EAAKlM,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,MAAM,EAAKhH,MAAMs7C,gBAAzD,QAAoFzoC,KAAI,SAACuL,GAAK,MAAM,CAACvN,KAAKuN,EAAE5b,MAAM4b,MACxHzO,SAAU,EAAK3P,MAAM2P,SACrBtH,UAA8B,OAAlB,EAAKrI,MAAMgH,MAA0C,IAA3B,EAAKhH,MAAM+8B,OAAOr7B,OAAY,WAAW,GAC/EyG,SAAU,SAACpB,EAAEiR,GAAH,OAAO,EAAKhY,MAAMmI,SAAS,EAAKnI,MAAMw7C,WAAW,SAASxjC,EAAE,CAACjR,YAGxE,GAAI,EAAK/G,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,OAA4F,iBAAnF,EAAKhH,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,MAAM,EAAKhH,MAAMs7C,gBAAzD,KACxDrK,EAEE,kBAAC,GAAD,CACEphC,GAAG,qBACHrH,MAAM,iBACNJ,kBAAkB,QAClB8D,KAAM,EAAKlM,MAAMy7C,wBACjB9rC,SAAU,EAAK3P,MAAM2P,SACrBxH,SAAU,SAACpB,EAAEiR,GAAH,OAAO,EAAKhY,MAAMmI,SAAS,EAAKnI,MAAMw7C,WAAW,SAASxjC,EAAE,CAACjR,YAIxE,GAAI,EAAK/G,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,OAA4F,SAAnF,EAAKhH,MAAM8rB,kBAAkB,EAAK9rB,MAAMgH,MAAM,EAAKhH,MAAMs7C,gBAAzD,KAA0F,CAClJ,IAAIvpC,EAAa,EAAK/R,MAAMmsC,WAAWt5B,KAAI,SAAC24B,GAC1C,MAAO,CAAC36B,KAAM26B,EAAUhpC,MAAOgpC,MAEjCyF,EAEI,kBAAC,GAAD,CACEphC,GAAG,sBACHrH,MAAM,iBACNJ,kBAAkB,QAClB8D,KAAM6F,EACNpC,SAAU,EAAK3P,MAAM2P,SACrBxH,SAAU,SAACpB,EAAEiR,GAAH,OAAO,EAAKhY,MAAMmI,SAAS,EAAKnI,MAAMw7C,WAAW,SAASxjC,EAAE,CAACjR,YAK7EkqC,EACE,kBAAC,IAAD,eACEp/B,SAAS,QACThM,MAAO,CAACN,WAAY,GAAIS,MAAO,QAC/BmC,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAK/G,MAAMmI,SAAS,EAAKnI,MAAMw7C,WAAW,SAAS,EAAE,CAACz0C,KACvE4I,SAAU,EAAK3P,MAAM2P,UACjBjJ,IAGV,MAAOQ,IAEX,OAAO+pC,G,EAGTyK,UAAY,WAiFV,OA/EE,yBAAKhzC,UAAU,aACb,yBAAKA,UAAU,eACb,kBAAC,GAAD,eACEmH,GAAI,gBAAgB,EAAK7P,MAAMw7C,WAC/BpzC,kBAAkB,OAClB5F,MAAO,EAAKxC,MAAMgH,KAClBmB,SAAU,SAACpB,EAAEiR,GAAK,IAAIwjC,EAAa,EAAKx7C,MAAMw7C,WAAY,EAAKx7C,MAAMmI,SAASqzC,EAAW,OAAOxjC,EAAEjR,IAClGyJ,SAAU,EAAKxQ,MAAM27C,cACrBhsC,SAAU,EAAK3P,MAAM2P,UACjBjJ,EAPN,CAQEwF,KAAM,CAAC,CAAC1J,MAAM,OAAOqO,KAAK,QAAQ,CAACrO,MAAM,QAAQqO,KAAK,SAAS,CAACrO,MAAM,OAAOqO,KAAK,QAAQ,CAACrO,MAAM,OAAOqO,KAAK,aAGjH,yBAAKnI,UAAU,eACb,kBAAC,GAAD,eACEmH,GAAI,qBAAqB,EAAK7P,MAAMw7C,WACpCpzC,kBAAkB,YAClB5F,MAAO,EAAKxC,MAAMysB,UAClBtkB,SAAU,SAACpB,EAAEiR,GAAK,IAAIwjC,EAAa,EAAKx7C,MAAMw7C,WAAY,EAAKx7C,MAAM47C,0BAA0BJ,EAAYz0C,EAAGiR,GAAI,EAAKhY,MAAMmI,SAAS,EAAKnI,MAAMw7C,WAAW,YAAYxjC,EAAEjR,IAC1KsB,UAA8B,KAAlB,EAAKrI,MAAMgH,MAA+B,OAAlB,EAAKhH,MAAMgH,MAAsC,KAAvB,EAAKhH,MAAMysB,UAAgB,WAAW,GACpGjc,SAAU,EAAKxQ,MAAM27C,gBAAgB,EAAK37C,MAAMgH,KAChD2I,SAAU,EAAK3P,MAAM2P,SACrBzD,KAAM,EAAK4uC,4BACPp0C,KAIR,yBAAKgC,UAAU,eACb,kBAAC,GAAD,eACEmH,GAAI,qBAAqB,EAAK7P,MAAMw7C,WACpCpzC,kBAAkB,YAClB5F,MAAO,EAAKxC,MAAMo5C,UAClBjxC,SAAU,SAACpB,EAAEiR,GAAH,OAAO,EAAKhY,MAAMmI,SAAS,EAAKnI,MAAMw7C,WAAW,YAAYxjC,EAAEjR,IACzEsB,UAA8B,KAAlB,EAAKrI,MAAMgH,MAA+B,OAAlB,EAAKhH,MAAMgH,MAAsC,KAAvB,EAAKhH,MAAMo5C,UAAgB,WAAW,GACpG5oC,SAAU,EAAKxQ,MAAM27C,cACrBhsC,SAAU,EAAK3P,MAAM2P,SACrBzD,KAAM,CAAC,SAAU,WAAY,aAAc,gBAAgBkF,QAAO,SAACwL,GAAD,OAAQ,EAAKw+B,qBAAqBx+B,MAAO/J,IAAI,EAAKsoC,oBAChHz0C,KAIR,yBAAKgC,UAAU,eACZ,EAAK6yC,oBAER,yBAAK7yC,UAAU,eACb,kBAAC,GAAD,eACEmH,GAAI,uBAAuB,EAAK7P,MAAMw7C,WACtCpzC,kBAAkB,cAClB5F,MAAO,EAAKxC,MAAMq5C,YAClBlxC,SAAU,SAACpB,EAAEiR,GAAH,OAAO,EAAKhY,MAAMmI,SAAS,EAAKnI,MAAMw7C,WAAW,cAAcxjC,EAAEjR,IAC3EyJ,SAAU,EAAKxQ,MAAM67C,QACrBxzC,UAAa,EAAKrI,MAAM67C,SAAoC,KAAzB,EAAK77C,MAAMq5C,YAA6B,GAAX,WAChE1pC,SAAU,EAAK3P,MAAM2P,SACrBzD,KAAM,CAAC,CAAC1J,MAAM,KAAMqO,KAAK,QACrBnK,KAIR,yBAAKgC,UAAU,cAAc7C,MAAO,CAACN,WAAY,GAAIu2C,SAAS,IACxD,kBAAC,KAAD,CACE9zC,aAAW,0BACXW,QAAS,kBAAI,EAAK3I,MAAM+7C,UAAU,EAAK/7C,MAAMw7C,aAC7C31C,MAAgC,IAAxB,EAAK7F,MAAMw7C,YAA6C,IAA3B,EAAKx7C,MAAMg8C,cAAoB,CAAC3nC,QAAQ,QAAS,IAEtF,kBAAC,KAAD,OAEF,kBAAC,KAAD,CACErM,aAAW,2BACXi0C,MAAI,EACJtzC,QAAS,kBAAI,EAAK3I,MAAMk8C,UACxBr2C,MAAQ,EAAK7F,MAAMw7C,aAAa,EAAKx7C,MAAMg8C,cAAc,EAAI,CAACloC,WAAW,IAAM,CAACsgB,QAAQ,EAAE+nB,cAAc,OAAOroC,WAAW,IAC1H6G,WAAS,EACTnK,SAAU,EAAKxQ,MAAMo8C,cACrBzsC,SAAU,EAAK3P,MAAM2P,UAErB,kBAAC,KAAD,U,uDAQV,OAAOzN,KAAKw5C,gB,GAzLMr5C,a,0CCOlBg6C,G,kDAEJ,WAAYr8C,GAAQ,IAAD,8BACjB,cAAMA,IA8ER+7C,UAAY,SAACP,GACX,IAAIc,EAAa,EAAKr8C,MAAMg5C,QAC5BqD,EAAWljC,OAAOoiC,EAAW,GAC7B,EAAKv5C,SAAS,CAAEg3C,QAASqD,IAAa,WACpC,EAAKlrC,SACL,EAAKpR,MAAMu8C,mBAAmBtrC,SAASgM,eAAe,mBAAmBu/B,kBApF1D,EAwFnBN,OAAS,WACP,IAAK,EAAKE,gBAAiB,CACzB,IAAIE,EAAa,EAAKr8C,MAAMg5C,QAC5BqD,EAAWxyC,KAAK,CACd9C,KAAM,KACNylB,UAAW,GACX6uB,eAAgB,GAChBve,OAAQ,GACRqc,UAAW,GACXC,YAAa,KAEf,EAAKp3C,SAAS,CAAEg3C,QAASqD,IAAa,WACpC,EAAKlrC,SACL,EAAKpR,MAAMu8C,mBAAmBtrC,SAASgM,eAAe,mBAAmBu/B,mBArG5D,EA2GnBr0C,SAAW,SAACqzC,EAAYiB,EAAW7lC,EAAOpU,EAAOuP,GAC/C,GAAIA,EAAW,CAAC,IAAD,iBACMA,GADN,IACb,2BAA8B,CAAC,IAAtBioB,EAAqB,QAC5B,GAAIA,EAAOnpB,OAAOrO,EAAM,CACtBA,EAAQ,CAACw3B,EAAOx3B,OAChB,QAJS,+BAQf,IAAIk6C,EAAiB,EAAKz8C,MAAMg5C,QAC5B,CAAC,QAAS,OAAQ,OAAQ,QAAQ/uC,SAAS1H,KAC7Ck6C,EAAiB,EAAKC,qBAAqBnB,EAAYh5C,IACzC,cAAZi6C,IACFC,EAAelB,GAAf,eAA+C5kC,GAEjD8lC,EAAelB,GAAYiB,GAAaj6C,EACxC,EAAKxC,MAAM48C,kBAAkBF,GAG7B,IADA,IAAIG,GAAe,EACV7kC,EAAE,EAAGA,EAAE0kC,EAAeh7C,OAAQsW,IAAK,CAG1C,KAD4C,OAAzB0kC,EAAe1kC,GAAGhR,MAA6C,KAA9B01C,EAAe1kC,GAAGyU,WAAqD,KAAnCiwB,EAAe1kC,GAAGsjC,gBAAqD,KAA9BoB,EAAe1kC,GAAGohC,WAAkBsD,EAAe1kC,GAAG+kB,OAAOr7B,OAAO,GAAKg7C,EAAe1kC,GAAG+kB,OAAOnsB,WAAU,SAACpO,GAAD,MAAiB,KAARA,KAAY,GACjP,CACfq6C,GAAe,EACf,OAGAA,GAAc,EAAKC,iBAtIN,EAyInBA,cAAgB,WAEd,IAFoB,EAEhBC,GAAW,EAFK,eAGF,EAAK98C,MAAMg5C,SAHT,IAGpB,2BAAqC,CAAC,IAA7BE,EAA4B,QACnC,IAAkB,SAAbA,EAAMnyC,MAAmC,yBAAlBmyC,EAAM1sB,WAClB,SAAb0sB,EAAMnyC,MAAmC,SAAlBmyC,EAAM1sB,aACzBrZ,MAAM4pC,QAAQ7D,EAAMpc,QAAQ,CAC/BggB,GAAW,EACX,QARc,8BAYhBA,GACF,EAAK/8C,MAAM88C,cAAc,EAAK98C,MAAM6Z,UAAW,CAACo/B,QAAS,EAAKh5C,MAAMg5C,WAtJrD,EA0JnBgE,aAAe,WACb,EAAKh7C,SAAS,CACZg3C,QAAS,CACP,CACEjyC,KAAM,GACNylB,UAAW,GACX6uB,eAAgB,GAChBve,OAAQ,GACRqc,UAAW,GACXC,YAAa,OAGhB,WACD,EAAKr5C,MAAMi9C,aAAa,EAAKh9C,MAAMg5C,SACnC,EAAKj5C,MAAMu8C,mBAAmBtrC,SAASgM,eAAe,mBAAmBu/B,kBAxK1D,EA4KnBG,qBAAuB,SAAC/lC,EAAO5P,GAC7B,IADsC,EAClCiyC,EAAU,GACViE,EAAe,EAFmB,eAGpB,EAAKj9C,MAAMg5C,SAHS,IAGtC,2BAAsC,CAAC,IAA9BE,EAA6B,QAChC+D,IAAetmC,GAAS5P,IAAOmyC,EAAMnyC,KACvCiyC,EAAQnvC,KAAK,CACX9C,KAAMA,EACNylB,UAAW,GACX6uB,eAAgB,GAChBve,OAAQ,GACRqc,UAAW,GACXC,YAAa,KAGfJ,EAAQnvC,KAAKqvC,GACf+D,GAAgB,GAfoB,8BAiBtC,OAAOjE,GA7LU,EAgMnB2C,0BAA4B,SAAChlC,EAAO6V,EAAW6uB,GAC7C,IADgE,EAC5DrC,EAAU,GACViE,EAAe,EAF6C,eAG9C,EAAKj9C,MAAMg5C,SAHmC,IAGhE,2BAAsC,CAAC,IAA9BE,EAA6B,QAChC+D,IAAetmC,GAAS6V,IAAY0sB,EAAM1sB,WAA+B,KAAlB0sB,EAAM1sB,UAC/DwsB,EAAQnvC,KAAK,CACX9C,KAAMmyC,EAAMnyC,KACZylB,UAAWA,EACX6uB,eAAgBA,EAChBve,OAAQ,GACRqc,UAAW,GACXC,YAAa,KAIfJ,EAAQnvC,KAAKqvC,GACf+D,GAAgB,GAhB8C,8BAkBhE,EAAKj7C,SAAS,CAACg3C,YAAU,kBAAM,EAAKj5C,MAAMi9C,aAAahE,OAlNtC,EAsNnB7nC,OAAS,WACP,IADa,EACTwF,EAAQ,EACRsiC,GAAa,EAFJ,eAGK,EAAKj5C,MAAMg5C,SAHhB,IAGb,2BAAsC,CAAC,IAA9BE,EAA6B,QACjB,OAAfA,EAAMnyC,OACRkyC,GAAa,GACS,KAApBC,EAAM1sB,YACRysB,GAAa,GACa,IAAxBC,EAAMpc,OAAOr7B,SACfw3C,GAAa,GACXC,EAAMpc,OAAOrrB,MAAK,SAAClP,GAAD,MAAiB,KAARA,MAAa,IAC1C02C,GAAa,GACS,KAApBC,EAAMC,YACRF,GAAa,GACXtiC,IAAU,EAAK3W,MAAMg5C,QAAQv3C,OAAO,GACZ,KAAtBy3C,EAAME,cACRH,GAAa,GACjBtiC,GAAS,GAjBE,8BAmBRsiC,GAAY,EAAK4D,iBAzOL,EA4OnBV,cAAgB,WACd,OAA6D,OAAzD,EAAKn8C,MAAMg5C,QAAQ,EAAKh5C,MAAMg5C,QAAQv3C,OAAO,GAAGsF,OAEc,KAA9D,EAAK/G,MAAMg5C,QAAQ,EAAKh5C,MAAMg5C,QAAQv3C,OAAO,GAAG+qB,YAEkB,IAAlE,EAAKxsB,MAAMg5C,QAAQ,EAAKh5C,MAAMg5C,QAAQv3C,OAAO,GAAGq7B,OAAOr7B,QAEO,KAA9D,EAAKzB,MAAMg5C,QAAQ,EAAKh5C,MAAMg5C,QAAQv3C,OAAO,GAAG03C,aAnPnC,EAwPnBuC,cAAgB,WACd,OAAQ,EAAK17C,MAAMg5C,QAAQv3C,OAAO,GAAqE,KAAhE,EAAKzB,MAAMg5C,QAAQ,EAAKh5C,MAAMg5C,QAAQv3C,OAAO,GAAG23C,aAzPtE,EA6PnB8D,gBAAkB,SAAC5D,GACb,EAAKv5C,MAAMo9C,kBAAkB7D,GAAyB,KAAZA,GAC5C,EAAKv5C,MAAMs5C,sBACTC,EACA,EAAKv5C,MAAMw5C,sBACX,EAAKx5C,MAAMiwB,SACX,EAAKjwB,MAAMquB,QACX,EAAKruB,MAAMi6C,SACX,EAAKj6C,MAAMk6C,WArQE,EAyQnBmD,iBAAmB,SAACttC,GAElBA,EAAM5I,iBACF,EAAKnH,MAAMs9C,cACb,EAAKr7C,SAAS,CACZs7C,eAAe,EACfxzB,gBAAiBha,EAAMiP,iBA/QV,EAoRnBw+B,kBAAoB,WAClB,EAAKv7C,SAAS,CACZs7C,eAAe,KApRjB,EAAKt9C,MAAQ,CACXg5C,QAASj5C,EAAMi5C,QACfwE,gBAAgB,EAChBhC,wBAAyB,GACzB/B,OAAQ,GACR3vB,gBAAiB,KACjBwzB,eAAe,EACft0C,QAAS,GACTy0C,kBAAmB,KAVJ,E,gEAejB,IAAIjC,EAA0B,GAC9BA,EAAwB3xC,KAAK,CAC3B+G,KAAM,OACNrO,MAAO,SAETi5C,EAAuB,uBAAOA,GAAP,aAClBv5C,KAAKlC,MAAMquB,QAAQxb,KAAI,SAAChD,EAAG+G,GAC5B,MAAO,CAAC/F,KAAK,QAAD,OAAU+F,EAAM,GAAKpU,MAAOqN,QAG5C3N,KAAKD,SAAS,CACZw5C,0BACAiC,kBAAmBzsC,SAASgM,eAAe,mBAAmBu/B,iB,gDAIxCjzC,GACxB,IAAIkyC,EAA0B,GAC9BA,EAAwB3xC,KAAK,CAC3B+G,KAAM,OACNrO,MAAO,SAETi5C,EAAuB,uBAAOA,GAAP,aAClBv5C,KAAKlC,MAAMquB,QAAQxb,KAAI,SAAChD,EAAG+G,GAC5B,MAAO,CAAC/F,KAAK,QAAD,OAAU+F,EAAM,GAAKpU,MAAOqN,QAG5C,IAAI8tC,EAAU,GACd,GAAIp0C,EAAUq0C,aAAal8C,OAAO,EAAG,CACnC,IAAIm8C,EAASt0C,EAAUq0C,aAAal8C,OAAO,EAAG,IAAM,GACpDi8C,EAAQ7zC,KAAKP,EAAUq0C,aAAal8C,OAAS,SAAWm8C,GAE1D,GAAIt0C,EAAUu0C,YAAYp8C,OAAO,EAAG,CAClC,IAAIm8C,EAASt0C,EAAUu0C,YAAYp8C,OAAO,EAAG,MAAQ,IACrDi8C,EAAQ7zC,KAAKP,EAAUu0C,YAAYp8C,OAAS,OAASm8C,GAEvD,GAAIt0C,EAAUw0C,YAAYr8C,OAAO,EAAG,CAClC,IAAIm8C,EAASt0C,EAAUw0C,YAAYr8C,OAAO,EAAG,IAAM,GACnDi8C,EAAQ7zC,KAAKP,EAAUw0C,YAAYr8C,OAAS,QAAUm8C,GAExD,GAAIt0C,EAAUy0C,YAAYt8C,OAAO,EAAG,CAClC,IAAIm8C,EAASt0C,EAAUy0C,YAAYt8C,OAAO,EAAG,IAAM,GACnDi8C,EAAQ7zC,KAAKP,EAAUy0C,YAAYt8C,OAAS,QAAUm8C,GAExD,IAAI50C,EAAU,oBACV00C,EAAQj8C,OAAO,IACfuH,EAAU,YAAc00C,EAAQphC,KAAK,OAEV,IAA3BhT,EAAU0vC,QAAQv3C,QACS,OAA5B6H,EAAU0vC,QAAQ,GAAGjyC,MAAgD,KAAjCuC,EAAU0vC,QAAQ,GAAGxsB,WACtB,KAAjCljB,EAAU0vC,QAAQ,GAAGG,WAAqD,IAArC7vC,EAAU0vC,QAAQ,GAAGlc,OAAOr7B,SAEpEuH,EAAU,IAGZ,IAAIy0C,EAAoBzsC,SAASgM,eAAe,mBAAmBu/B,aAEnEt6C,KAAKD,SAAS,CACZg3C,QAAS1vC,EAAU0vC,QACnBwC,0BACAxyC,UAASy0C,wB,+BA+MH,IAAD,OACHzE,EAAU,GACd,GAAI/2C,KAAKjC,MAAMg5C,SAAW/2C,KAAKlC,MAAMgN,KACnC,IAAK,IAAIgL,EAAE,EAAGA,EAAE9V,KAAKjC,MAAMg5C,QAAQv3C,OAAQsW,IACzCihC,EAAQnvC,KACN,kBAAC,GAAD,CACEuH,IAAK2G,EACLwjC,WAAYxjC,EACZhR,KAAM9E,KAAKjC,MAAMg5C,QAAQjhC,GAAGhR,KAC5BylB,UAAWvqB,KAAKjC,MAAMg5C,QAAQjhC,GAAGyU,UACjC6uB,eAAgBp5C,KAAKjC,MAAMg5C,QAAQjhC,GAAGsjC,eACtCve,OAAQ76B,KAAKjC,MAAMg5C,QAAQjhC,GAAG+kB,OAC9Bqc,UAAWl3C,KAAKjC,MAAMg5C,QAAQjhC,GAAGohC,UACjCC,YAAan3C,KAAKjC,MAAMg5C,QAAQjhC,GAAGqhC,YACnCvtB,kBAAmB5pB,KAAKlC,MAAM8rB,kBAC9B3jB,SAAUjG,KAAKiG,SACf4zC,UAAW75C,KAAK65C,UAChBF,QAAS7jC,IAAI9V,KAAKjC,MAAMg5C,QAAQv3C,OAAO,EACvCs6C,cAAe95C,KAAKjC,MAAMg5C,QAAQv3C,OAClCyqC,WAAYjqC,KAAKlC,MAAMmsC,WACvBwQ,qBAAsBz6C,KAAKy6C,qBAC3Bf,0BAA2B15C,KAAK05C,0BAChCH,wBAAyBv5C,KAAKjC,MAAMw7C,wBACpCS,OAAQh6C,KAAKg6C,OACbE,cAAel6C,KAAKk6C,gBACpBT,cAAe3jC,IAAK9V,KAAKjC,MAAMg5C,QAAQv3C,OAAO,GAAMQ,KAAKy5C,gBACzDhsC,SAAUzN,KAAKlC,MAAM2P,YAI7B,IAAIsuC,EAAuB/7C,KAAKlC,MAAMgN,KAAK,CAACI,IAAI,QAAQ,CAACA,IAAI,IAAIlL,KAAKjC,MAAMy9C,kBAAkB,MA0E5F,OAzEEx7C,KAAKlC,MAAMkI,YAAW+1C,EAAqBj4C,MAAM,QAErD,yBAAK8I,KAAM5M,KAAKlC,MAAMgN,KAAK,SAAS,GAAIhF,aAAY9F,KAAKlC,MAAMgN,KAAK,eAAe,GAAItE,UAAU,SAAS7C,MAAO3D,KAAKlC,MAAMgN,KAAK,CAAConB,QAAQ,GAAG,CAACA,QAAQ,IACpJ,yBAAKvkB,GAAG,kBAAkBnH,UAAU,kBAAkB7C,MAAOo4C,GAC1DhF,EACD,yBAAKpzC,MAAO,CAACkO,YAAa,GAAIM,QAAS,OAAQE,WAAY,WAAYD,eAAe,kBACpF,yBAAK5L,UAAU,iBACb,2BAAIxG,KAAKjC,MAAMgJ,UAEjB,yBAAKpD,MAAO,CAAEwO,QAAS,OAAQE,WAAY,aACzC,yBAAK1O,MAAO,CAACM,YAAa,KAC1B,kBAAC,KAAD,CACEqC,MAAM,mBACNR,aAAW,mBACXW,QAASzG,KAAKlC,MAAMk+C,oBACpB1tC,UAAWtO,KAAKlC,MAAMs9C,aACtBz3C,MAA8B,YAAtB3D,KAAKlC,MAAM+mB,UAAuB7kB,KAAKlC,MAAMgN,KAAwB,CAAChH,MAAM,WAAxB,CAACqO,QAAQ,QACrE8pC,cAAc,QACdh5C,WAAYjD,KAAKlC,MAAMs9C,aAAa,CAAC53C,MAAM,oBAAqBqR,cAAc,YAAaR,WAAY,IAAKnR,SAAU,IAAK,CAAC2R,cAAc,YAAaR,WAAY,IAAKnR,SAAU,IAClLuK,SAAUzN,KAAKlC,MAAM2P,YAGvB,yBAAK9J,MAAO,CAACM,YAAa,KAC1B,kBAAC,IAAD,CACEwC,QAASzG,KAAKm7C,iBACd7sC,UAAWtO,KAAKlC,MAAMs9C,aACtB90C,MACsB,KAApBtG,KAAKjC,MAAMy5C,OAEX,WAEAx3C,KAAKjC,MAAMy5C,OAAOzT,QAAQ,KAAM,KAElCkY,cAAc,SACdzjC,KAAM,kBAAC,KAAD,MACN/K,SAAUzN,KAAKlC,MAAM2P,SACrB9J,MAAO3D,KAAKlC,MAAMgN,KAAK,GAAG,CAACqH,QAAQ,UAErC,kBAAC,KAAD,CACErH,KAAM9K,KAAKjC,MAAMs9C,cACjBx+B,SAAU7c,KAAKjC,MAAM8pB,gBACrBjR,eAAgB5W,KAAKs7C,kBACrB7L,UAAWC,4BACXphC,UAAWtO,KAAKlC,MAAMs9C,cAEtB,kBAAC,KAAD,CACEn1C,SAAU,SAACjB,EAAEH,GAAK,EAAK9E,SAAS,CAACy3C,OAAO3yC,IAAI,EAAKo2C,gBAAgBp2C,KAEjE,kBAAC,KAAD,CAAUvE,MAAO,kBAAmBuf,YAAY,yBAAyBvR,WAAUtO,KAAKlC,MAAM49C,aAAal8C,OAAO,KAClH,kBAAC,KAAD,CAAUc,MAAO,iBAAkBuf,YAAY,yBAAyBvR,WAAUtO,KAAKlC,MAAM89C,YAAYp8C,OAAO,KAChH,kBAAC,KAAD,CAAUc,MAAO,kBAAmBuf,YAAY,yBAAyBvR,WAAUtO,KAAKlC,MAAM+9C,YAAYr8C,OAAO,KACjH,kBAAC,KAAD,CAAUc,MAAO,kBAAmBuf,YAAY,yBAAyBvR,WAAUtO,KAAKlC,MAAM+9C,YAAYr8C,OAAO,KAChHQ,KAAKlC,MAAM4rB,gBAAgBI,QAAQtqB,OAAS,EAC3C,kBAAC,KAAD,CAAUc,MAAO,GAAIuf,YAAY,oBAC/B,QAKR,6BACA,kBAAC,IAAD,CACEvZ,MAAM,eACNG,QAAS,kBAAI,EAAKs0C,gBAClBjhC,gBAAgB,UAChBV,WAAW,UACX3L,SAAUzN,KAAKlC,MAAM2P,SACrB9J,MAAO3D,KAAKlC,MAAMgN,KAAK,CAAC7G,YAAa,IAAI,CAACkO,QAAQ,mB,GA7X3ChS,aAkcN6M,gBA1DS,SAACjP,GACvB,MAAO,CACL4Z,UAAW5Z,EAAMynB,OAAOha,QAAQmC,GAChC+b,gBAAiB3rB,EAAMynB,OAAOiE,iBAAiBC,gBAC/C7E,SAAU9mB,EAAMynB,OAAOiE,iBAAiB5E,SACxC+E,kBAAmB7rB,EAAMynB,OAAOiE,iBAAiBG,kBACjDyD,OAAQtvB,EAAMynB,OAAOha,QAAQ6hB,OAC7B1B,MAAO5tB,EAAMynB,OAAOha,QAAQmgB,MAC5Bc,OAAQ1uB,EAAMynB,OAAOha,QAAQihB,OAC7BG,OAAQ7uB,EAAMynB,OAAOha,QAAQohB,OAC7BiC,MAAO9wB,EAAMynB,OAAOha,QAAQqjB,MAC5BqtB,gBAAiBn+C,EAAMynB,OAAOha,QAAQ0wC,gBACtCnF,QAASh5C,EAAMynB,OAAOiE,iBAAiBE,QAAQotB,QAC/C3sB,WAAYrsB,EAAMynB,OAAOiE,iBAAiBE,QAAQS,WAClDgxB,aAAcr9C,EAAMynB,OAAOiE,iBAAiBE,QAAQnE,OACpD01B,gBAAiBn9C,EAAMynB,OAAOiE,iBAAiBE,QAAQ0tB,UACvDpN,WAAYlsC,EAAMynB,OAAOha,QAAQy+B,WACjCyR,aAAc39C,EAAMynB,OAAOiE,iBAAiBE,QAAQ0D,OACpDuuB,YAAa79C,EAAMynB,OAAOiE,iBAAiBE,QAAQgC,MACnDkwB,YAAa99C,EAAMynB,OAAOiE,iBAAiBE,QAAQO,MACnD4xB,YAAa/9C,EAAMynB,OAAOiE,iBAAiBE,QAAQkF,MACnDyoB,sBAAuBv5C,EAAMynB,OAAOiE,iBAAiBE,QACrDwC,QAASpuB,EAAMynB,OAAOha,QAAQ2gB,QAC9B4B,SAAUhwB,EAAMynB,OAAOha,QAAQuiB,SAC/BgqB,SAAUh6C,EAAMynB,OAAOha,QAAQusC,SAC/BC,SAAUj6C,EAAMynB,OAAOha,QAAQwsC,aAGR,SAACzuC,GAC1B,MAAO,CACLqxC,cAAe,SAACjjC,EAAWo/B,GACzBxtC,EHxbC,SAAuBoO,EAAWo/B,GAYrC,MAAO,CACHtrC,MAAO,CAAC,eAAe,yBAAyB,yBAChD5B,QAAS,CACLR,QAAU,CACNqC,IAAI,aAAD,OAAeiM,EAAf,WACHhM,OAAQ,MACR3B,KAAM+sC,EACNpwC,eAAgB,oCAChBc,aAAc,iCGoafmzC,CAAcjjC,EAAWo/B,KAEpCgE,aAAc,SAAChE,GACbxtC,EH3XC,SAAsBwtC,GACzB,MAAO,CACHjyC,KAAM,gBACN+E,QAASktC,GGwXFgE,CAAahE,KAExBiF,oBAAqB,WACnBzyC,EHrXK,CACHzE,KAAM,2BGsXV41C,kBAAmB,SAACN,GAClB7wC,EHlXC,SAA2B6wC,GAC9B,MAAO,CACHt1C,KAAM,sBACN+E,QAASuwC,GG+WFM,CAAkBN,KAE7BhD,sBAAuB,SACrBC,EACAC,EACA6E,EACAC,EACAC,EACAC,GAEA/yC,EAAS6tC,GACPC,EACAC,EACA,CAAC6E,WAAUC,UAASC,WAAUC,kBAKvBtvC,CAA6CmtC,I,qBC5cvCoC,G,4MACnBx+C,MAAQ,CACN+M,MAAM,G,EAGR8a,WAAa,WACX,EAAK7lB,SAAS,CAAC+K,MAAM,IACrB,EAAKhN,MAAMyZ,aAAY,I,EAGzBwO,YAAc,WACZ,EAAKhmB,SAAS,CAAC+K,MAAM,IACrB,EAAKhN,MAAMyZ,aAAY,I,EAGzBxS,OAAS,WACe,SAAlB,EAAKjH,MAAM4c,KACb,EAAK5c,MAAMoH,OAAOqwC,WAAW,EAAKz3C,MAAMy0B,QAExC,EAAKz0B,MAAM0+C,SAAS,EAAK1+C,MAAM4W,OAEjC,EAAKqR,e,uDAIL,IAAM1M,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,SACNC,SAAO,EACPE,QAASzG,KAAK+lB,YACd7M,iBAAe,IAEjB,kBAAC,IAAD,CACE5S,MAAM,cACNG,QAASzG,KAAK+E,OACd+U,gBAAgB,UAChBV,WAAW,aAGXqjC,EAAa,yBAAK94C,MAAO,CAACN,WAAY,KAClC,kBAAC,IAAD,CACEyC,aAAY,cACZQ,MAAM,cACNG,QAASzG,KAAK4lB,WACd9L,gBAAgB,UAChBV,WAAW,UACX3L,SAAUzN,KAAKlC,MAAM2P,YAG3B1G,EAAU,8EAed,MAdsB,aAAlB/G,KAAKlC,MAAM4c,OACb+hC,EAAa,kBAAC,KAAD,CACG32C,aAAY,UAAY9F,KAAKlC,MAAMorC,SAAW,YAC9CziC,QAASzG,KAAK4lB,WACd1T,QAAS,UAAYlS,KAAKlC,MAAMorC,SAChCz7B,SAAUzN,KAAKlC,MAAM2P,UAErB,kBAAC,KAAD,CACEjK,MAAM,UACNk5C,WAAW,aAG7B31C,EAAU,qGAEU,KAAlB/G,KAAKlC,MAAM4c,KAEX,yBAAK/W,MAAyB,aAAlB3D,KAAKlC,MAAM4c,KAAkB,CAACnC,MAAM,SAAS,IACtDkkC,EACD,kBAAC,IAAD,CACErxC,MAAO,wCAA0CpL,KAAKlC,MAAM4c,KAAO,IACnErB,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKjC,MAAM+M,KACjB8L,eAAgB5W,KAAK+lB,aAEtBhf,IAKE,kC,GAhFmC7G,IAAMC,WCGjCw8C,G,kDACnB,WAAY7+C,GAAQ,IAAD,8BACjB,cAAMA,IAkCR8+C,cAAgB,SAAAxxC,GACd,IAAK,IAAImnB,KAAU,EAAKz0B,MAAM+wB,MAAO,CACnC,IAAMqE,EAAO,EAAKp1B,MAAM+wB,MAAM0D,GAC9B,GAAIW,EAAK9nB,QAAUA,GAAS8nB,EAAKvlB,KAAO,EAAK5P,MAAM4P,GAEjD,YADA,EAAK5N,SAAS,CAAE4F,OAAQ,CAAEyF,MAAO,qCAIjCA,EAAM5L,OAAS,IACjB,EAAKO,SAAS,CACZ4F,OAAQ,CAAEyF,MAAO,6CAEO,IAAjBA,EAAM5L,OACf,EAAKO,SAAS,CAAE4F,OAAQ,CAAEyF,MAAO,8BAEjC,EAAKrL,SAAS,CAAE4F,OAAQ,CAAEyF,MAAO,OAlDlB,EAsDnBnF,SAAW,SAACxH,EAAM6B,GAAW,IAAD,EAM1B,GALA,EAAKP,UAAL,mBACGtB,EAAO6B,GADV,mDAEgB,EAAKvC,MAAMqZ,SAF3B,kBAEqC3Y,GAAO,KAF5C,IAIa,UAATA,GAAkB,EAAKm+C,cAAct8C,EAAMu8C,QAClC,aAATp+C,EAAqB,CACvB,IAAI2Y,EAAU,CACZhM,MAAO,EAAKrN,MAAMqN,MAClBk+B,SAAUhpC,EACVipC,YAAa,EAAKxrC,MAAMwrC,YACxBnxB,IAAK,EAAKra,MAAMqa,KAEd,EAAKta,MAAMo1B,MACb,EAAKp1B,MAAMoH,OAAOowC,WAAW,EAAKx3C,MAAMo1B,KAAKvlB,GAAIyJ,KApEpC,EAwEnBmE,OAAS,SAAC1N,EAAOpP,GAEf,GADAoP,EAAM5I,iBACF,EAAKnH,MAAMo1B,KAAM,CACnB,IAAI9b,EAAU,CACZhM,MAAO,EAAKrN,MAAMqN,MAClBk+B,SAAU,EAAKvrC,MAAMurC,SACrBC,YAAa,EAAKxrC,MAAMwrC,YACxBnxB,IAAK,EAAKra,MAAMqa,KAElB,EAAKrY,SAAS,CAAEqX,QAAQ,2BAAM,EAAKrZ,MAAMqZ,SAAlB,kBAA4B3Y,GAAO,MAC1D,EAAKX,MAAMoH,OAAOowC,WAAW,EAAKx3C,MAAMo1B,KAAKvlB,GAAIyJ,KAlFlC,EAyFnB0lC,eAAiB,SAAAr+C,GAAS,IAAD,EACvB,EAAKsB,UAAL,mBACGtB,EAAO,EAAKX,MAAMo1B,KAAKz0B,IAD1B,mDAGO,EAAKV,MAAMqZ,SAHlB,kBAIK3Y,GAAO,KAJZ,kDAOO,EAAKV,MAAM4H,QAPlB,kBAQKlH,EAAO,MARZ,KA1FiB,EAuGnBorC,iBAAmB,SAAAprC,GACjB,MAAO,CAAE6B,MAAO7B,EAAMkQ,KAAMlQ,IAxGX,EA2GnBs+C,oBAAsB,SAAAt+C,GACpB,OACE,EAAKV,MAAMqZ,QAAQ3Y,IACC,OAApB,EAAKX,MAAMo1B,WACS5rB,IAApB,EAAKxJ,MAAMo1B,KAGT,yBAAKvvB,MAAO,CAAEG,MAAO,OAAQ0E,UAAW,UACtC,kBAAC,IAAD,CACE1C,aAAW,SACXS,SAAO,EACPiS,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAAEC,SAAU,OAAQgO,WAAY,OACvCnT,KAAK,SACLqG,KAAK,SACLwJ,SAAmB,UAAT7P,GAAgD,KAA5B,EAAKV,MAAM4H,OAAOyF,QAElD,kBAAC,IAAD,CACEtF,aAAW,SACX2S,WAAS,EACTD,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAAEC,SAAU,OAAQgO,WAAY,OACvCnL,QAAS,SAAAzB,GAAC,OAAI,EAAK83C,eAAer+C,OAKjC,IAtIQ,EA0InB6f,cAAgB,SAACC,EAAMzZ,GACrB,EAAKhH,MAAMoH,OAAOwkC,SAAS,EAAK5rC,MAAMo1B,KAAKvlB,GAAI,CAAC,CAAE7I,OAAM6I,GAAI4Q,EAAKje,UA3IhD,EA8InBme,iBAAmB,SAAC9Q,EAAI+G,EAAO5P,GAC7B,EAAKhH,MAAMoH,OAAO4mC,WAAW,EAAKhuC,MAAMo1B,KAAKvlB,GAAI,CAAC,CAAE7I,OAAM6I,SA7I1D,EAAK5P,MAAQ,CACX4P,GAAI7P,EAAMo1B,KAAKvlB,GACfvC,MAAOtN,EAAMo1B,KAAK9nB,MAClBk+B,SAAUxrC,EAAMo1B,KAAKoW,SACrBC,YAAazrC,EAAMo1B,KAAKqW,YACxBnxB,IAAKta,EAAMo1B,KAAK9a,IAChBhB,QAAS,CACPhM,OAAO,EACPm+B,aAAa,GAEf5jC,OAAQ,CACNyF,MAAO,KAbM,E,sEAkBO/D,GACxBrH,KAAKD,SAAS,CACZ4N,GAAItG,EAAU6rB,KAAKvlB,GACnBvC,MAAO/D,EAAU6rB,KAAK9nB,MACtBk+B,SAAUjiC,EAAU6rB,KAAKoW,SACzBC,YAAaliC,EAAU6rB,KAAKqW,YAC5BnxB,IAAK/Q,EAAU6rB,KAAK9a,IACpBhB,QAAS,CACPhM,OAAO,EACPm+B,aAAa,GAEf5jC,OAAQ,CACNyF,MAAO,Q,+BA2HX,IAPQ,IAAD,OACHA,EAAQpL,KAAKlC,MAAMiuC,WACnB/rC,KAAKlC,MAAMo1B,KAAK9nB,MAChB,QAAUpL,KAAKlC,MAAMo1B,KAAK9nB,MAC1B4xC,EAAgB,GAChBC,EAAe,GACfC,EAAW,GACNpnC,EAAI,EAAGA,EAAI9V,KAAKlC,MAAMquB,QAAQ3sB,OAAQsW,IAAK,CAClD,IAAMO,EAAOrW,KAAKlC,MAAM6tB,MAAM3rB,KAAKlC,MAAMquB,QAAQrW,IAC3CmZ,EAAQjvB,KAAKlC,MAAM2uB,OAAOpW,EAAKqW,SAC/BwC,EAAQlvB,KAAKlC,MAAM8uB,OAAOvW,EAAKwW,SAC/BswB,EACJluB,EAAM5D,cAAuC,KAAvB4D,EAAM5D,aACxB,IAAM4D,EAAM5D,aAAe,IAC3B,GACA+xB,EACJnuB,EAAM6G,aAAqC,KAAtB7G,EAAM6G,YACvB,IAAM7G,EAAM6G,YAAc,IAC1B,GACAunB,EACJnuB,EAAM7D,cAAuC,KAAvB6D,EAAM7D,aACxB,IAAM6D,EAAM7D,aAAe,IAC3B,GACAiyB,EACJpuB,EAAM4G,aAAqC,KAAtB5G,EAAM4G,YACvB,IAAM5G,EAAM4G,YAAc,IAC1B,GACNonB,EAASt1C,KAAK,CACZtH,MAAO+V,EAAKqW,QACZpmB,MACE,KACCtG,KAAKlC,MAAMquB,QAAQC,QAAQ/V,EAAK1I,IAAM,GACvC,UACAwvC,EACA,IACAC,IAEJF,EAASt1C,KAAK,CACZtH,MAAO+V,EAAKwW,QACZvmB,MACE,KACCtG,KAAKlC,MAAMquB,QAAQC,QAAQ/V,EAAK1I,IAAM,GACvC,UACA0vC,EACA,IACAC,IAGN,IAAMC,EACJ,yBAAK55C,MAAO,CAAEwO,QAAS,OAAQE,WAAY,WACzC,yBAAK1O,MAAO,CAAEG,MAAO,MAArB,UACA,yBAAKH,MAAO,CAAEG,MAAO,SACnB,kBAAC,KAAD,CACExD,MAAON,KAAKlC,MAAM0/C,aAClB1tC,iBAAkB,CAAEnB,KAAM,QAASrO,MAAO,SAC1CuP,WAAYzP,OAAO9B,KAAK0B,KAAKlC,MAAMuvB,QAAQ1c,KAAI,SAAC+3B,EAAQh0B,GACtD,MAAO,CAAEpU,MAAOooC,EAAQpiC,MAAO,UAAYoO,EAAQ,OAErD2K,aAAc,SAAAd,GAAI,OAAI,EAAKD,cAAcC,EAAM,UAC/Ce,gBAAiB,SAACf,EAAM7J,GAAP,OACf,EAAK+J,iBAAiBF,EAAM7J,EAAO,UAErC9E,aAAa,EACb5J,WAAW,EACXy3C,gBAAgB,EAChB9tC,SAAS,2CACTS,UAAW,CAAEC,UAAW,KACxB5C,SAAUzN,KAAKlC,MAAM2P,aAKvBiwC,EACJ,yBAAK/5C,MAAO,CAAEwO,QAAS,OAAQE,WAAY,WACzC,yBAAK1O,MAAO,CAAEG,MAAO,MAArB,UACA,yBAAKH,MAAO,CAAEG,MAAO,SACnB,kBAAC,KAAD,CACExD,MAAON,KAAKlC,MAAM6/C,aAClB7tC,iBAAkB,CAAEnB,KAAM,QAASrO,MAAO,SAC1CuP,WAAY7P,KAAKlC,MAAMquB,QAAQxb,KAAI,SAAC+3B,EAAQh0B,GAC1C,MAAO,CAAEpU,MAAOooC,EAAQpiC,MAAO,SAAWoO,EAAQ,OAEpD2K,aAAc,SAAAd,GAAI,OAAI,EAAKD,cAAcC,EAAM,SAC/Ce,gBAAiB,SAACf,EAAM7J,GAAP,OACf,EAAK+J,iBAAiBF,EAAM7J,EAAO,SAErC9E,aAAa,EACb5J,WAAW,EACXy3C,gBAAgB,EAChB9tC,SAAS,2CACTS,UAAW,CAAEC,UAAW,KACxB5C,SAAUzN,KAAKlC,MAAM2P,aAKvBmwC,EACJ,yBAAKj6C,MAAO,CAAEwO,QAAS,OAAQE,WAAY,WACzC,yBAAK1O,MAAO,CAAEG,MAAO,MAArB,SACA,yBAAKH,MAAO,CAAEG,MAAO,SACnB,kBAAC,KAAD,CACExD,MAAON,KAAKlC,MAAM+/C,YAClB/tC,iBAAkB,CAAEnB,KAAM,QAASrO,MAAO,SAC1CuP,WAAYqtC,EACZ79B,aAAc,SAAAd,GAAI,OAAI,EAAKD,cAAcC,EAAM,SAC/Ce,gBAAiB,SAACf,EAAM7J,GAAP,OACf,EAAK+J,iBAAiBF,EAAM7J,EAAO6J,EAAKjf,MAAM,KAAK,KAErDsQ,aAAa,EACb5J,WAAW,EACXy3C,gBAAgB,EAChB9tC,SAAS,0CACTS,UAAW,CAAEC,UAAW,KACxB5C,SAAUzN,KAAKlC,MAAM2P,aAmC7B,OA7BIzN,KAAKlC,MAAMo1B,OACb8pB,EACE,yBAAKx2C,UAAU,qBACZxG,KAAKlC,MAAMiuC,WACV,GAEA,6BACE,2CACC6R,EACAF,EACAH,IAKTN,EAAej9C,KAAKlC,MAAMiuC,WACxB,GAEA,yBAAKpoC,MAAO,CAAEG,MAAO,OAAQ0E,UAAW,UACtC,kBAAC,GAAD,CACEkS,KAAM1a,KAAKlC,MAAMo1B,KAAO,OAAS,GACjCX,OAAQvyB,KAAKlC,MAAMo1B,KAAOlzB,KAAKlC,MAAMo1B,KAAKvlB,GAAK,GAC/CzI,OAAQ,CAAEqwC,WAAYv1C,KAAKlC,MAAMoH,OAAOqwC,YACxCh+B,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,aAM3B,yBAAKjH,UAAU,aACb,4BAAK4E,GACL,yBAAK5E,UAAU,YACb,yBAAKA,UAAU,QAAQmH,GAAG,kBAA1B,SAGA,yBAAKnH,UAAU,SACZxG,KAAKlC,MAAMiuC,WACV,yBAAKvlC,UAAU,YAAYxG,KAAKjC,MAAMqN,OAEtC,0BAAMrF,SAAU,SAAAf,GAAC,OAAI,EAAKuW,OAAOvW,EAAG,WAClC,kBAAC,IAAD,CACEsI,kBAAgB,iBAChB7O,KAAK,QACL6B,MAAON,KAAKjC,MAAMqN,MAClBjF,UAAWnG,KAAKjC,MAAM4H,OAAOyF,MAC7BnF,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,QAASpB,IAC3CmB,WAAS,EACT4S,WAAS,EACTxS,eAAcpG,KAAKjC,MAAM4H,OAAOyF,MAAM5L,OAAS,EAC/CiO,SAAUzN,KAAKlC,MAAM2P,WAEtBzN,KAAK+8C,oBAAoB,WAIhC,yBAAKv2C,UAAU,QAAQmH,GAAG,iBAA1B,YAGA,yBAAKnH,UAAU,SACZxG,KAAKlC,MAAMiuC,WACV,yBAAKvlC,UAAU,YAAYxG,KAAKjC,MAAMurC,UAEtC,kBAAC,GAAD,CACE37B,GAAG,iBACHrH,MAAM,gBACNhG,MAAON,KAAKjC,MAAMurC,SAClBrjC,SAAU,SAAApB,GAAC,OAAI,EAAKoB,SAAS,WAAYpB,IACzC4I,SAAUzN,KAAKlC,MAAM2P,SACrBzD,KAAMhK,KAAKlC,MAAMmsC,WAAWt5B,IAAI3Q,KAAK6pC,qBAI3C,yBAAKrjC,UAAU,QAAQmH,GAAG,wBAA1B,eAGA,yBAAKnH,UAAU,SACZxG,KAAKlC,MAAMiuC,WACV,yBAAKvlC,UAAU,YAAYxG,KAAKjC,MAAMwrC,aAEtC,0BAAMxjC,SAAU,SAAAf,GAAC,OAAI,EAAKuW,OAAOvW,EAAG,iBAClC,kBAAC,IAAD,CACEsI,kBAAgB,uBAChB7O,KAAK,cACL6B,MAAON,KAAKjC,MAAMwrC,YAClBtjC,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,cAAepB,IACjDqlC,WAAS,EACTlkC,WAAS,EACTyH,SAAUzN,KAAKlC,MAAM2P,WAEtBzN,KAAK+8C,oBAAoB,iBAKhC,yBAAKv2C,UAAU,QAAQmH,GAAG,gBAA1B,OAGA,yBAAKnH,UAAU,SACZxG,KAAKlC,MAAMiuC,WACV,yBAAKvlC,UAAU,YAAYxG,KAAKjC,MAAMqa,KAEtC,0BAAMrS,SAAU,SAAAf,GAAC,OAAI,EAAKuW,OAAOvW,EAAG,SAClC,kBAAC,IAAD,CACEsI,kBAAgB,eAChB7O,KAAK,MACL6B,MAAON,KAAKjC,MAAMqa,IAElBnS,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,MAAOpB,IACzCqlC,WAAS,EACTlkC,WAAS,EACTyH,SAAUzN,KAAKlC,MAAM2P,WAEtBzN,KAAK+8C,oBAAoB,UAI9B/8C,KAAKlC,MAAMiuC,YACX,6BACE,yBAAKvlC,UAAU,QAAQmH,GAAG,iBAA1B,0CAGA,yBAAKnH,UAAU,SACb,kBAAC,KAAD,CACE8G,kBAAgB,gBAChBoE,QAAS1R,KAAKlC,MAAMo1B,KAAKV,KACzB7uB,MAAO,CAAEN,WAAY,IACrBoD,QAAS,kBACP,EAAK3I,MAAMoH,OAAOowC,WAAW,EAAKx3C,MAAMo1B,KAAKvlB,GAAI,CAC/CvC,MAAO,EAAKrN,MAAMqN,MAClBk+B,SAAU,EAAKvrC,MAAMurC,SACrBC,YAAa,EAAKxrC,MAAMwrC,YACxB/W,MAAO,EAAK10B,MAAMo1B,KAAKV,QAG3B/kB,SAAUzN,KAAKlC,MAAM2P,aAM5BuvC,EACAC,Q,GAxZ+B98C,aCLrB29C,G,4MACnBC,gBAAkB,WAIhB,OAH8B39C,OAAO9B,KAAK,EAAKR,MAAMuvB,QAAQne,QAAO,SAACwf,GACnE,OAAQ,EAAK5wB,MAAMuvB,OAAOqB,GAASpJ,MAAMtd,SAAS,EAAKlK,MAAMkvC,WAAWr/B,OAE7CgD,KAAI,SAACrQ,GAEhC,MAAO,CAACgG,MADG,gBAAY,EAAKxI,MAAMiwB,SAAS3B,QAAQ9rB,GAAO,GAC3CA,a,EAInB09C,gBAAkB,WAIhB,OAH6B59C,OAAO9B,KAAK,EAAKR,MAAM6tB,OAAOzc,QAAO,SAACyrB,GACjE,OAAQ,EAAK78B,MAAM6tB,MAAMgP,GAAQrV,MAAMtd,SAAS,EAAKlK,MAAMkvC,WAAWr/B,OAE5CgD,KAAI,SAACrQ,GAE/B,MAAO,CAACgG,MADG,eAAW,EAAKxI,MAAMquB,QAAQC,QAAQ9rB,GAAO,GACzCA,a,EAInB29C,eAAiB,WACf,IADqB,EACfC,EAAwB99C,OAAO9B,KAAK,EAAKR,MAAM2uB,QAAQvd,QAAO,SAACwd,GACnE,OAAQ,EAAK5uB,MAAM2uB,OAAOC,GAASpH,MAAMtd,SAAS,EAAKlK,MAAMkvC,WAAWr/B,OAEpEwwC,EAAwB/9C,OAAO9B,KAAK,EAAKR,MAAM8uB,QAAQ1d,QAAO,SAAC2d,GACnE,OAAQ,EAAK/uB,MAAM8uB,OAAOC,GAASvH,MAAMtd,SAAS,EAAKlK,MAAMkvC,WAAWr/B,OAEpEywC,EAAuB,GAPR,eAQHF,GARG,IAQrB,2BAAwC,CAAC,IAAhC59C,EAA+B,QAChC+9C,EAAY,EAAKvgD,MAAMquB,QAAQC,QAAQ,EAAKtuB,MAAM2uB,OAAOnsB,GAAOwsB,UAAY,EAC5EvW,EAAc,EAAKzY,MAAM2uB,OAAOnsB,GAAO+qB,cAAwD,KAAxC,EAAKvtB,MAAM2uB,OAAOnsB,GAAO+qB,aAAlE,WAAyF,EAAKvtB,MAAM2uB,OAAOnsB,GAAO+qB,aAAlH,KAAkI,GAChJ7U,EAAa,EAAK1Y,MAAM2uB,OAAOnsB,GAAOw1B,aAAsD,KAAvC,EAAKh4B,MAAM2uB,OAAOnsB,GAAOw1B,YAAjE,WAAuF,EAAKh4B,MAAM2uB,OAAOnsB,GAAOw1B,YAAhH,KAA+H,GAC5IxvB,EAAK,WAAO+3C,EAAP,kBAA0B9nC,EAA1B,YAAyCC,GACpD4nC,EAAqBx2C,KAAK,CAACtB,QAAOhG,WAbf,mDAeH69C,GAfG,IAerB,2BAAwC,CAAC,IAAhC79C,EAA+B,QAChC+9C,EAAY,EAAKvgD,MAAMquB,QAAQC,QAAQ,EAAKtuB,MAAM8uB,OAAOtsB,GAAOwsB,UAAY,EAC5EvW,EAAc,EAAKzY,MAAM8uB,OAAOtsB,GAAO+qB,cAAwD,KAAxC,EAAKvtB,MAAM8uB,OAAOtsB,GAAO+qB,aAAlE,WAAyF,EAAKvtB,MAAM8uB,OAAOtsB,GAAO+qB,aAAlH,KAAkI,GAChJ7U,EAAa,EAAK1Y,MAAM8uB,OAAOtsB,GAAOw1B,aAAsD,KAAvC,EAAKh4B,MAAM8uB,OAAOtsB,GAAOw1B,YAAjE,WAAuF,EAAKh4B,MAAM8uB,OAAOtsB,GAAOw1B,YAAhH,KAA+H,GAC5IxvB,EAAK,WAAO+3C,EAAP,kBAA0B9nC,EAA1B,YAAyCC,GACpD4nC,EAAqBx2C,KAAK,CAACtB,QAAOhG,WApBf,8BAsBrB,OAAO89C,G,EAGTE,mBAAqB,WAGnB,IAFA,IAAM7iC,EAAOrb,OAAO9B,KAAK,EAAKR,MAAM2uB,QAAQjtB,OACxCwU,EAAS,GACJ8B,EAAE,EAAGA,EAAE2F,EAAM3F,IAAI,CACxB,IAAM4W,EAAUtsB,OAAO9B,KAAK,EAAKR,MAAM2uB,QAAQ3W,GACzC+W,EAAUzsB,OAAO9B,KAAK,EAAKR,MAAM8uB,QAAQ9W,GAC/C9B,EAAO0Y,GAAW,EAAK5uB,MAAM2uB,OAAOC,GACpC1Y,EAAO6Y,GAAW,EAAK/uB,MAAM8uB,OAAOC,GAEtC,OAAO7Y,G,uDAKP,IAAMqF,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,QACNC,SAAS,EACTE,QAASzG,KAAKlC,MAAMivC,mBAGxB,OACE,kBAAC,IAAD,CACE1zB,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMgN,KACjB8L,eAAgB5W,KAAKlC,MAAMivC,gBAC3Bl2B,uBAAqB,EACrB7L,aAAc,CAAClH,MAAM,MAEtB9D,KAAKlC,MAAMgN,KACV,kBAAC,GAAD,CACE5F,OAAQ,CACNmwC,QAASr1C,KAAKlC,MAAMoH,OAAOmwC,QAC3BC,WAAYt1C,KAAKlC,MAAMoH,OAAOowC,WAC9BC,WAAYv1C,KAAKlC,MAAMoH,OAAOqwC,WAC9B7L,SAAU1pC,KAAKlC,MAAMoH,OAAOwkC,SAC5BoC,WAAY9rC,KAAKlC,MAAMoH,OAAO4mC,WAC9ByS,mBAAoBv+C,KAAKlC,MAAMoH,OAAOq5C,oBAExC5mC,UAAW3X,KAAKlC,MAAM6Z,UACtBkX,MAAO7uB,KAAKlC,MAAM+wB,MAClBqE,KAAQlzB,KAAKlC,MAAMkvC,WACnBwR,aAAcx+C,KAAKlC,MAAM0gD,aACzBC,aAAcz+C,KAAKlC,MAAM2gD,aACzBxU,WAAYjqC,KAAKlC,MAAMmsC,WACvB5c,OAAQrtB,KAAKlC,MAAMuvB,OACnB1B,MAAO3rB,KAAKlC,MAAM6tB,MAClBc,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnB1C,MAAOlqB,KAAKs+C,qBACZd,aAAcx9C,KAAK+9C,kBACnBJ,aAAc39C,KAAKg+C,kBACnBH,YAAa79C,KAAKi+C,iBAClBlS,WAAY/rC,KAAKlC,MAAMiuC,WACvBhe,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,SACrBzgC,YAAavX,KAAKlC,MAAMyZ,cACtB,Q,GA1G4BrX,IAAMC,WCyC/Bu+C,GA3CO,SAAA5gD,GACpB,OACE,kBAAC,GAAD,CACEsN,MAAM,WACN+b,aAAa,EACbE,WAAW,EACX5Z,SAAU3P,EAAM4mB,aAAe,EAAI,GAEnC,4BACEle,UACwB,qBAAtB1I,EAAMg4C,YACF,iBACA,UAENrvC,QAAS,kBAAM3I,EAAM+3C,kBAAkB,qBACvCpoC,SAAU3P,EAAM4mB,aAAe,EAAI,EACnC5e,aAAW,qBARb,aAYA,4BACEU,UACwB,iBAAtB1I,EAAMg4C,YAAiC,iBAAmB,UAE5DrvC,QAAS,kBAAM3I,EAAM+3C,kBAAkB,iBACvCpoC,SAAU3P,EAAM4mB,aAAe,EAAI,EACnC5e,aAAW,sBANb,cAUA,4BACEU,UACwB,iBAAtB1I,EAAMg4C,YAAiC,iBAAmB,UAE5DrvC,QAAS,kBAAM3I,EAAM+3C,kBAAkB,iBACvCpoC,SAAU3P,EAAM4mB,aAAe,EAAI,EACnC5e,aAAW,iBANb,YCeA64C,G,kDACF,WAAY7gD,GAAQ,IAAD,8BACf,cAAMA,IAmFVgrC,cAAgB,WACZ,EAAK/oC,SAAS,CAACuc,YAAa3d,OAAOwE,cArFpB,EAwFnBgiB,mBAAqB,WACjB,EAAKrnB,MAAM8gD,mBAAmB,EAAK9gD,MAAM+gD,iBACzC,IAAIrD,EAAoBzsC,SAASgM,eAAe,mBAC3Cu/B,aACD,EAAKx8C,MAAM+gD,kBACXrD,EAAoB,GAExB,EAAKnB,mBAAmBmB,IA/FT,EAkGnBjwB,kBAAoB,SAACwqB,EAAQloC,GACzB,EAAK/P,MAAMytB,kBAAkB,EAAKztB,MAAM4rB,gBAAiBqsB,EAAQloC,IAnGlD,EAsGnBid,kBAAoB,SAACirB,EAAQloC,GACzBA,EAAMyZ,kBACN,EAAKxpB,MAAMgtB,kBACP,EAAKhtB,MAAM4rB,gBACXqsB,EACAloC,EACA,EAAK/P,MAAM0N,QAAQuiB,SACnB,EAAKjwB,MAAM0N,QAAQ2gB,QACnB,EAAKruB,MAAM0N,QAAQusC,SACnB,EAAKj6C,MAAM0N,QAAQwsC,WA/GR,EAmHnB8G,qBAAuB,SAAAx+C,GACL,YAAVA,EACA,EAAKP,SAAS,CAACg/C,iBAAiB,EAAMn6B,oBAAoB,IAAQ,kBAC9D,EAAK9mB,MAAM83C,eAAet1C,MAEb,YAAVA,IAAsD,IAA/B,EAAKvC,MAAMghD,gBACzC,EAAKh/C,SAAS,CAACg/C,iBAAiB,IAAO,kBACnC,EAAKjhD,MAAM83C,eAAet1C,MAG9B,EAAKxC,MAAM83C,eAAet1C,IA7Hf,EAiInB+5C,mBAAqB,SAAA/5C,GACjB,IAAI0+C,EAAgB,MAChB1+C,EAAQ,IAAG0+C,EAAgBrgD,OAAO8d,YAAcnc,EAAQ,GAAK,GAAK,MACtE,EAAKP,SAAS,CACViL,aAAa,2BAAK,EAAKjN,MAAMiN,cAAjB,IAA+BE,IAAK5K,EAAQ,KACxD60C,aAAc,CAAC9kC,UAAW2uC,MAtIf,EA0InB1f,YAAc,SAAC5Q,EAAS1d,GACpB,EAAKlT,MAAMwhC,YAAY5Q,EAAS1d,EAAO,EAAKlT,QA3I7B,EA8InBmhD,SAAW,WAMP,EAAKnhD,MAAMohD,iBACX,EAAKphD,MAAM8Z,cANK,CACZ1B,YAAa,CACTC,UAAU,IAIgB,EAAKrY,MAAM0N,QAAQmC,KArJtC,EAwJnBstC,gBAAkB,SAAA5D,GACd,EAAKv5C,MAAMs5C,sBACPC,EACA,EAAKv5C,MAAM0N,QAAQuiB,SACnB,EAAKjwB,MAAM0N,QAAQ2gB,QACnB,EAAKruB,MAAM0N,QAAQusC,SACnB,EAAKj6C,MAAM0N,QAAQwsC,WA9JR,EAkKnB3T,mBAAqB,SAACv5B,EAAMhG,EAAMwB,EAAO64C,EAAYC,GACjD,EAAKr/C,SACD,CAACs/C,OAAQ,CAACv0C,OAAMhG,OAAMwB,QAAO64C,aAAYC,iBACzC,WACQ,EAAKrhD,MAAMshD,OAAOv0C,MAAiB,UAAThG,GAC1B,EAAKhH,MAAMwhD,cAAc,EAAKxhD,MAAM0N,QAAQmC,GAAI7I,MAG5D,EAAKhH,MAAMyZ,YAAYzM,IA1KR,EA6KnBk6B,gCAAkC,WAC9B,EAAKlnC,MAAMknC,mCA9KI,EAiLnBua,cAAgB,WACZ,IADkB,EACdA,EAAgB,EADF,eAEQn/C,OAAOugC,QAC7B,EAAK7iC,MAAM0N,QAAQ6hB,QACrBsT,WAJgB,IAElB,2BAEa,CAAC,IAAD,0BACe,IADf,wBACChS,WACN4wB,KANU,8BASlB,OAAOA,GA1LQ,EA6LnBC,eAAiB,WAEb,IAFmB,EAEfC,EAAc1wC,SAASgM,eAAe,gBACtC2kC,EAAYxuC,MAAM,EAAKquC,iBACtBv7C,OACA2M,KAAI,SAAC9L,EAAGiR,GAAJ,MAAU,SAAWA,KAC1BkrB,EAAW,GANI,eAOJ0e,GAPI,IAOnB,2BAA0B,CAAC,IAAlB/xC,EAAiB,QACtBqzB,EAASp5B,KAAKmH,SAASgM,eAAepN,KARvB,8BAYnB,IAFA,IAAIyG,EAAO,GACPurC,EAAUptC,SAAS,EAAKxU,MAAMshD,OAAOF,YAChCrpC,EAAI,EAAGA,EAAIkrB,EAASxhC,OAAQsW,GAAK6pC,EACtCvrC,EAAKxM,KAAKo5B,EAAS2F,MAAM7wB,EAAGA,EAAI6pC,IAGpC,IADA,IAAIC,EAAc,EACT9pC,EAAI,EAAGA,EAAI6pC,EAAS7pC,IACzB8pC,GAAe5e,EAASlrB,GAAGhS,MAG/B,IADA,IAAI+7C,EAAe,EACV/pC,EAAI,EAAGA,EAAI1B,EAAK5U,OAAQsW,IAAK,CAGlC,IAFA,IAAIgqC,EAAM1rC,EAAK0B,GACXiqC,EAAe,EACVhL,EAAI,EAAGA,EAAI+K,EAAItgD,OAAQu1C,IAC5BgL,EAAe//B,KAAKue,IAAIwhB,EAAcD,EAAI/K,GAAG/xC,QAEjD68C,GAAgBE,EAEpBN,EAAY37C,MAAQ87C,EACpBH,EAAYz8C,OAAS68C,EAKrB,IAFA,IAAIG,EAAeP,EAAYQ,WAAW,MACtCC,EAAU,EACLpqC,EAAI,EAAGA,EAAI1B,EAAK5U,OAAQsW,IAAK,CAKlC,IAJA,IAAIgqC,EAAM1rC,EAAK0B,GACXoG,EAAI,EACJoe,EAAW4lB,EACXC,EAAkB,EACbpL,EAAI,EAAGA,EAAI+K,EAAItgD,OAAQu1C,IAAK,CACjC,IAAI/c,EAAS8nB,EAAI/K,GACjBiL,EAAaI,UAAUpoB,EAAQ9b,EAAGoe,GAClCpe,GAAK8b,EAAOl0B,MACZq8C,EAAkBngC,KAAKue,IAAI4hB,EAAiBnoB,EAAOh1B,QAEvDk9C,GAAWC,IA1OA,EA8OnBE,+BAAiC,WAChBtxC,SAASgM,eAAe,gBAC9BulC,QAAO,SAAAhc,GACV,IAAMnqB,EAAW,EAAKrc,MAAM0N,QAAQJ,MAAM24B,QAAQ,MAAO,KACzDI,KAAaG,EAAD,UAAUnqB,EAAV,aAlPD,EAsPnB+K,kBAAoB,WAChB,EAAKnlB,SAAS,CACV6kB,oBAAqB,EAAK7mB,MAAM6mB,mBAChCm6B,iBAAkB,EAAKhhD,MAAMghD,mBAzPlB,EA6PnBhS,gBAAkB,WACd,EAAKhtC,SAAS,CAACitC,WAAY,KAAMuT,oBAAoB,IAAQ,kBACzD,EAAKziD,MAAMyZ,aAAY,OA/PZ,EAkQnBiZ,eAAiB,SAAC0C,GAAsC,IAAhCqtB,EAA+B,wDACnD,EAAKxgD,SAAS,CAACitC,WAAY9Z,EAAMqtB,uBAAqB,kBAClD,EAAKziD,MAAMyZ,aAAY,OApQZ,EAwQnBipC,eAAiB,WAAyB,IAAxB1iD,EAAuB,uDAAf,EAAKA,MAErBstB,EAAattB,EAAM4rB,gBAAgB5kB,KACnCglB,EAAUhsB,EAAM4rB,gBAAgBI,QAClCxE,EAAQ,GACZ,GAAIwE,EAAQtqB,OAAS,EAAG,CACpB8lB,EAAQxnB,EAAM0N,QAAQ4f,EAAa,KAAKtB,EAAQ,IAAIxE,MADhC,qBAELwE,GAFK,IAEpB,2BAAwB,CAAC,IAAhBnc,EAAe,QACpB2X,EAAQ,EAAKpH,UACToH,EACAxnB,EAAM0N,QAAQ4f,EAAa,KAAKzd,GAAI2X,QALxB,+BASxB,OAAOA,GAtRQ,EA4RnBpH,UAAY,SAACC,EAAOC,GAChB,OAAID,EAAM3e,QAAU4e,EAAM5e,OACf2e,EAAMjP,QAAO,SAAAmP,GAChB,OAAOD,EAAMpW,SAASqW,MAGnBD,EAAMlP,QAAO,SAAAmP,GAChB,OAAOF,EAAMnW,SAASqW,OAnSf,EAuSnBi3B,WAAa,SAAC/iB,EAAQW,GAClB,EAAKp1B,MAAMw3C,WACP/iB,EACAW,EACA,EAAKp1B,MAAM0N,QAAQmC,GACnB,EAAK7P,MAAM2rB,iBAAiBE,UA5SjB,EAgTnB82B,eAAiB,SAACluB,EAAQijB,GACtB,EAAK13C,MAAM4rC,SACPnX,EACAijB,EACA,EAAK13C,MAAM0N,QAAQmC,GACnB,EAAK7P,MAAM2rB,iBAAiBE,UArTjB,EAyTnB40B,mBAAqB,SAAChsB,EAAQmuB,EAAaC,GACvC,EAAK7iD,MAAMygD,mBACPhsB,EACAmuB,EACAC,EACA,EAAK7iD,MAAM0N,QAAQmC,GACnB,EAAK7P,MAAM2rB,iBAAiBE,UA/TjB,EAmUnBi3B,iBAAmB,SAACruB,EAAQijB,GACxB,EAAK13C,MAAMguC,WACPvZ,EACAijB,EACA,EAAK13C,MAAM0N,QAAQmC,GACnB,EAAK7P,MAAM2rB,iBAAiBE,UAxUjB,EA4UnB4rB,WAAa,SAAAhjB,GACT,EAAKwa,kBACL,EAAKjvC,MAAMy3C,WACPhjB,EACA,EAAKz0B,MAAM0N,QAAQmC,GACnB,EAAK7P,MAAM2rB,iBAAiBE,UAjVjB,EAqVnBk3B,kBAAoB,SAACvgD,EAAOgG,GACxB,OACI,kBAACyO,GAAA,YAAD,eACIzU,MAAOA,EACPwF,aAAYQ,EACZA,MAAOA,EACPw6C,UAAU,EACVrzC,SAAU,EAAK3P,MAAM4mB,aAAe,EAAI,GACpC7gB,OA7VG,EAkWnBk9C,UAAY,SAACtiD,EAAM6B,GACf,EAAKP,SAAS,CAACs/C,OAAO,2BAAK,EAAKthD,MAAMshD,QAAjB,kBAA0B5gD,EAAO6B,OAjWtD,EAAKvC,MAAQ,CACTue,YAAa3d,OAAOwE,WACpB6H,aAAc,CACVg2C,WAAY,2CACZ91C,IAAK,IAET+1C,aAAc,CACV5wC,UAAW,OAEfgvC,OAAQ,CACJv0C,MAAM,EACNxE,MAAO,GACPxB,KAAM,GACNq6C,WAAY,EACZC,aAAa,GAEjB1gC,UAAW,GACXqgC,iBAAiB,EACjB5oC,SAAUrY,EAAMoY,YAAYC,SAC5ByO,oBAAoB,EACpBooB,WAAY,KACZkU,SAAU,GAvBC,E,gEA6Bf,GADAviD,OAAOigB,iBAAiB,SAAU5e,KAAK8oC,eACnC9oC,KAAKlC,MAAM+gD,gBAAiB,CAC5B,IAAIsC,EAAkBpyC,SAASgM,eAAe,mBAC9C,GAAIomC,EAAiB,CACjB,IAAI3F,EAAoB2F,EAAgB7G,aACxCt6C,KAAKq6C,mBAAmBmB,O,6CAMhC78C,OAAOkgB,oBAAoB,SAAU7e,KAAK8oC,iB,gDAGpBzhC,GAAY,IAAD,OAC3BqxC,EACFrxC,EAAUqiB,kBAAoB1pB,KAAKlC,MAAM4rB,gBACvC03B,EACFphD,KAAKjC,MAAM2gB,WACXrX,EAAUqiB,gBAAgBI,QAAQtqB,SAClCY,OAAO9B,KAAK0B,KAAKlC,MAAM0N,QAAQxL,KAAKjC,MAAM2gB,YAAYlf,OACpD6hD,EACFrhD,KAAKjC,MAAM2gB,YAAcrX,EAAUqiB,gBAAgB5kB,KAAO,IAE1D9E,KAAKjC,MAAM2gB,WACXg6B,IACC2I,GAAkCD,IAEnCphD,KAAKD,SAAS,CAAC2e,UAAW,KAG1BrX,EAAUqiB,gBAAgB5kB,MAC1B1E,OAAO9B,KAAK+I,EAAUmE,QAAQnE,EAAUqiB,gBAAgB5kB,KAAO,MAC1DtF,SAAW6H,EAAUqiB,gBAAgBI,QAAQtqB,QAElDQ,KAAKD,SAAS,CAAC2e,UAAWrX,EAAUqiB,gBAAgB5kB,KAAO,MAI/D,IAAMilC,EAAc/pC,KAAKwgD,eAAen5C,GAEV,OAA1BrH,KAAKjC,MAAMivC,YACXjD,EAAYr7B,WAAU,SAAA6jB,GAAM,OAAIA,IAAW,EAAKx0B,MAAMivC,WAAWr/B,MACjE,IACC3N,KAAKjC,MAAMwiD,mBAGZvgD,KAAKD,SAAS,CAACitC,WAAY,OACpBhtC,KAAKjC,MAAMivC,YAElBhtC,KAAKD,SAAS,CACVitC,WAAY3lC,EAAUmE,QAAQqjB,MAAM7uB,KAAKjC,MAAMivC,WAAWr/B,Q,+BAuR5D,IAAD,OAQA3N,KAAKjC,MAAMghD,gBAIhB,IA4DIuC,EA5DEC,EACF,kBAAC,GAAD,CACIp8B,mBAAoBnlB,KAAKmlB,mBACzBvI,WAAY5c,KAAKlC,MAAM+gD,gBACvBh6B,SAAU7kB,KAAKlC,MAAM2rB,iBAAiB5E,SACtCld,QAAS3H,KAAKlC,MAAM6J,QACpBsd,sBAC6C,YAAzCjlB,KAAKlC,MAAM2rB,iBAAiB5E,SAEhCD,mBAAoB5kB,KAAKjC,MAAM6mB,mBAC/BM,kBAAmBllB,KAAKklB,kBACxBzX,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCnN,YAAavX,KAAKlC,MAAMyZ,YACxBmN,YAAa1kB,KAAKlC,MAAM4mB,YACxBpI,YAAatc,KAAKjC,MAAMue,YACxB0I,aAAuD,YAAzChlB,KAAKlC,MAAM2rB,iBAAiB5E,UAE1C,kBAACqE,GAAA,KAAD,CACIC,sBAAuB,CAACrP,gBAAiB,WACzCxZ,MAAON,KAAKlC,MAAM2rB,iBAAiB5E,SACnC5e,SAAUjG,KAAK8+C,sBAEf,kBAAC,OAAD,CACIx4C,MAAM,cACNhG,MAAM,SACNyC,YAAa+jB,KAAcC,IAC3BtZ,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,IAE5C,kBAAC,OAAD,CACIpe,MAAM,eACNhG,MAAM,UACNyC,YAAa+jB,KAAcC,IAC3BtZ,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,IAE5C,kBAAC,OAAD,CACIpe,MAAM,eACNhG,MAAM,UACNyC,YAAa+jB,KAAcC,IAC3BtZ,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,MAUlD88B,EAAM,CACRxhD,KAAKlC,MAAM4rB,gBAAgBI,QAAQtqB,OAAS,EAF5C,8GAFA,oJAOA,iJACA,yGACA,gHACA,gIACA,iHACA,4JACA,8HAI2B,qBAA3BQ,KAAKlC,MAAMg4C,cACyB,IAApC91C,KAAKlC,MAAMoY,YAAYC,WAEvBmrC,EACI,yBAAK96C,UAAU,cACX,yBAAKA,UAAU,SACX,kBAAC,KAAD,CACIV,aAAW,kBACXW,QAASzG,KAAKi/C,SACdt7C,MAAO,CAACG,MAAO,UAAWd,OAAQ,UAAW6H,QAAS,GACtD9G,UAAW,CAACP,MAAO,WACnBiK,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,GAExC,kBAAC,KAAD,QAGR,yBAAKle,UAAU,OACX,sCADJ,IACuBg7C,EAAIxhD,KAAKjC,MAAMmjD,UAClC,yBAAKv9C,MAAO,CAAC6E,UAAW,UACpB,4BACI1D,KAAK,SACLrG,KAAK,WACLqH,aAAW,WACXW,QAAS,kBACL,EAAK1G,SAAS,CACVmhD,UAAW,EAAKnjD,MAAMmjD,SAAW,GAAKM,EAAIhiD,UAGlDiO,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxC/gB,MAAO,CAACH,MAAO,UAAWsJ,WAAY,OAAQzI,OAAQ,IAV1D,uBAoBpB,IAAMo9C,EACF,kBAAC1sC,GAAA,iBAAD,CACItW,KAAK,sBACLuW,gBAAiBhV,KAAKjC,MAAM2gB,UAC5BgjC,cAAe1hD,KAAKjC,MAAM2gB,UAC1BzY,SAAU,SAACjB,EAAGH,GAAJ,OACN,EAAK9E,SAAS,CAAC2e,UAAW7Z,IAAI,WAC1B,EAAKo2C,gBAAgBp2C,EAAI,aAIhC7E,KAAK6gD,kBAAkB,SAAU,qBACjC7gD,KAAK6gD,kBAAkB,QAAS,qBAChC7gD,KAAK6gD,kBAAkB,SAAU,qBACjC7gD,KAAK6gD,kBAAkB,SAAU,sBAIpCc,EACF,kBAAC,GAAD,CACIhqC,UAAW3X,KAAKlC,MAAM0N,QAAQmC,GAC9BrH,MAAOtG,KAAKjC,MAAMshD,OAAO/4C,MACzB2+B,WAAYjlC,KAAKjC,MAAMshD,OAAOv0C,KAC9Bu5B,mBAAoBrkC,KAAKqkC,mBACzBD,aAAcpkC,KAAKlC,MAAMsmC,aACzBH,eAAgBjkC,KAAKlC,MAAMmmC,eAC3BD,aAAchkC,KAAKjC,MAAMshD,OAAOv6C,KAChCg/B,aAAc9jC,KAAKlC,MAAM0N,QAAQJ,MACjC45B,gCAAiChlC,KAAKglC,gCACtC4c,cAAe,WACX,EAAKpC,iBACL,EAAKa,kCAETd,cAAev/C,KAAKu/C,gBACpBwB,UAAW/gD,KAAK+gD,UAChB5B,WAAYn/C,KAAKjC,MAAMshD,OAAOF,WAC9BC,YAAap/C,KAAKjC,MAAMshD,OAAOD,cAInCyC,EAAiB,UAChB7hD,KAAKjC,MAAMghD,kBAAiB8C,GAAkB,WAC/C7hD,KAAKlC,MAAM4mB,cAAam9B,GAAkB,gBAE9C,IAAMn5B,EACF,yBAAK9b,KAAK,SAAS9G,aAAW,UAAUU,UAAWq7C,GAC/C,6BACCP,EACyC,YAAzCthD,KAAKlC,MAAM2rB,iBAAiB5E,SACzB,kBAAC,GAAD,CACIH,YAAa1kB,KAAKlC,MAAM4mB,YACxBoxB,YAAa91C,KAAKlC,MAAMg4C,YACxBD,kBAAmB71C,KAAKlC,MAAM+3C,oBAGlC,GAEJ,kBAAC,GAAD,CACIzqC,MAAM,WACN+b,aAAa,EACb1Z,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,GAEvC+8B,EACD,kBAAC,IAAD,CACI37C,aAAW,kBACXQ,MAAM,kBACNG,QAAS,SAAAzB,GAAC,OACN,EAAKjF,SAAS,CAAC2e,UAAW,IAAK,EAAKu8B,gBAAgB,MAExDxiC,WAAS,EACTzS,WAAS,EACTrC,MAAgC,KAAzB3D,KAAKjC,MAAM2gB,UAAmB,CAACvM,QAAS,QAAU,GACzD1E,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCzhB,WACIjD,KAAKjC,MAAMue,aAAe,IACpB,CAACpZ,SAAU,SAAU2H,QAAS,GAC9B,MAIlB,kBAAC,GAAD,CACIO,MAAM,QACN+b,aAAa,EACb1Z,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,GAExC,yBAAKle,UAAU,UACX,kBAAC,IAAD,CACIF,MAAO,oBACPR,aAAY,6BACZ7C,WAAY,CACRO,MAAO,UACPN,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAEzDxC,gBAAgB,4BAChBnW,MAAO,CAACG,MAAO,QACf2C,QAAS,WACL,EAAK49B,oBACD,EACA,QACA,qBACA,GACA,IAGR52B,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,MAIpD,kBAAC,GAAD,CACItZ,MAAM,SACN+b,aAAa,EACb1Z,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,GAExC,qDACA,yBAAKle,UAAU,UACX,kBAAC,IAAD,CACIF,MAAM,OACNR,aAAW,iBACX7C,WAC0C,IAAtCjD,KAAKlC,MAAM0N,QAAQ2gB,QAAQ3sB,OACrB,CACEgE,MAAO,UACPshB,OAAQ,cACR5hB,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAEvD,CACE9Y,MAAO,UACPN,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAGjExC,gBAAgB,4BAChBnW,MAAO,CAACG,MAAO,QACf2C,QAAS,kBAAM,EAAK49B,oBAAmB,EAAM,OAAQ,SACrD52B,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCpW,SAAgD,IAAtCtO,KAAKlC,MAAM0N,QAAQ2gB,QAAQ3sB,SAEzC,kBAAC,IAAD,CACI8G,MAAM,cACNR,aAAW,wBACX7C,WAC0C,IAAtCjD,KAAKlC,MAAM0N,QAAQ2gB,QAAQ3sB,OACrB,CACEgE,MAAO,UACPshB,OAAQ,cACR5hB,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAEvD,CACE9Y,MAAO,UACPN,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAGjExC,gBAAgB,4BAChBnW,MAAO,CAACG,MAAO,QACf2C,QAAS,kBAAM,EAAK49B,oBAAmB,EAAM,MAAO,QACpD52B,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCpW,SAAgD,IAAtCtO,KAAKlC,MAAM0N,QAAQ2gB,QAAQ3sB,UAG7C,wDAEA,yBAAKgH,UAAU,UACX,kBAAC,IAAD,CACIF,MAAM,MACNR,aAAW,gBACX7C,WAAY,CACRO,MAAO,UACPN,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAEzDxC,gBAAgB,4BAChBnW,MAAO,CAACG,MAAO,QACf2C,QAAS,WACL,EAAK49B,oBAAmB,EAAM,MAAO,QAEzC52B,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,KAGhD,yBAAKle,UAAU,UACX,kBAAC,IAAD,CACIF,MAC6C,YAAzCtG,KAAKlC,MAAM2rB,iBAAiB5E,SACtB,sBACA,MAEV/e,aAC6C,YAAzC9F,KAAKlC,MAAM2rB,iBAAiB5E,SACtB,2DACA,gBAEV5hB,WAC6C,YAAzCjD,KAAKlC,MAAM2rB,iBAAiB5E,UACU,IAAtC7kB,KAAKlC,MAAM0N,QAAQ2gB,QAAQ3sB,OACrB,CACEgE,MAAO,UACPshB,OAAQ,cACR5hB,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAEvD,CACE9Y,MAAO,UACPN,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAGjExC,gBAAgB,4BAChBnW,MAAO,CAACG,MAAO,QACf2C,QAAS,WACL,EAAK49B,oBAAmB,EAAM,MAAO,MAAO,GAAG,IAEnD/1B,SAC6C,YAAzCtO,KAAKlC,MAAM2rB,iBAAiB5E,UACU,IAAtC7kB,KAAKlC,MAAM0N,QAAQ2gB,QAAQ3sB,OAE/BiO,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,KAGhD,wDACA,yBAAKle,UAAU,UACX,kBAAC,IAAD,CACIF,MAAM,UACNR,aAAW,2BACX7C,WAAY,CACRO,MAAO,UACPN,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAEzDxC,gBAAgB,4BAChBnW,MAAO,CAACG,MAAO,QACf2C,QAAS,WACL,EAAK49B,oBAAmB,EAAM,UAAW,YAE7C52B,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,KAGhD,2CACA,yBAAKle,UAAU,UACX,kBAAC,IAAD,CACIF,MAAM,OACNR,aAAW,cACX7C,WAAY,CACRO,MAAO,UACPN,SAAUlD,KAAKjC,MAAMue,aAAe,IAAM,SAAW,MAEzDxC,gBAAgB,4BAChBnW,MAAO,CAACG,MAAO,QACf2C,QAAS,WACL,EAAK49B,oBAAmB,EAAM,OAAQ,SAE1C52B,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,MAIpD,kBAAC,GAAD,CACItZ,MAAM,UACN+b,aAAa,EACb1Z,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,GAExC,yBAAKle,UAAU,eACX,uBAAGmgB,KAAK,kCAAkC9X,OAAO,UAC7C,yBAAKlE,IAAKge,KAAQ/d,IAAI,gCAE1B,uBAAG+b,KAAK,mCAAmC9X,OAAO,UAC9C,yBAAKlE,IAAKie,KAAQhe,IAAI,wCAOpCk3C,EACF,yBACIt7C,UAAU,UACV7C,MAAK,2BAAM3D,KAAKjC,MAAMiN,cAAiBhL,KAAKjC,MAAMo3C,eAElD,kBAAC,GAAD,CACIrwC,KAAM9E,KAAKlC,MAAM4rB,gBAAgB5kB,KACjCyC,KAAMvH,KAAKlC,MAAMyJ,KACjBwlC,gBAAiB/sC,KAAK+sC,gBACtBhD,YAAa/pC,KAAKwgD,iBAClBhwB,eAAgBxwB,KAAKwwB,eACrBtrB,OAAQ,CACJwkC,SAAU1pC,KAAKlC,MAAM4rC,SACrBoC,WAAY9rC,KAAKlC,MAAMguC,WACvB2B,kBAAmBztC,KAAKlC,MAAM2vC,mBAElCl2B,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCpI,YAAatc,KAAKjC,MAAMue,eAKhCylC,EAAY,8BA2GhB,OA1GI/hD,KAAKlC,MAAM0N,QAAQuiB,SAASvuB,OAAS,IAEjCuiD,EADyC,YAAzC/hD,KAAKlC,MAAM2rB,iBAAiB5E,SAExB,yBAAKjY,KAAK,QACN,yBAAKpG,UAAU,mBAAmB7C,MAAO3D,KAAKjC,MAAMiN,cAChD,4BAAKhL,KAAKlC,MAAM0N,QAAQJ,OACxB,kBAAC,GAAD,CACII,QAASxL,KAAKlC,MAAM0N,QACpBie,iBAAkBzpB,KAAKlC,MAAM2rB,iBAC7BqB,kBAAmB9qB,KAAK8qB,kBACxBS,kBAAmBvrB,KAAKurB,kBACxB7G,YAAa1kB,KAAKlC,MAAM4mB,YACxBjX,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCqJ,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,WAG3B21B,EACAH,GAGuC,WAAzC3hD,KAAKlC,MAAM2rB,iBAAiB5E,SAE/B,yBAAKjY,KAAK,QACN,yBAAKpG,UAAU,mBAAmB7C,MAAO3D,KAAKjC,MAAMiN,cAChD,4BAAKhL,KAAKlC,MAAM0N,QAAQJ,OACxB,kBAAC,GAAD,CACII,QAASxL,KAAKlC,MAAM0N,QACpBie,iBAAkBzpB,KAAKlC,MAAM2rB,iBAC7BqB,kBAAmB9qB,KAAK8qB,kBACxBsS,SAAUp9B,KAAKlC,MAAM2rB,iBAAiB+uB,eAAepb,SACrDT,OAAQ38B,KAAKlC,MAAM2rB,iBAAiB+uB,eAAe7b,OACnDjD,2BACI15B,KAAKlC,MAAM47B,2BAEf4F,YAAat/B,KAAKs/B,YAClB9O,eAAgB,SAAA0C,GAAI,OAAI,EAAK1C,eAAe0C,GAAM,IAClDzlB,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,KAG/Co9B,EACAH,GAKL,yBAAK/0C,KAAK,QACN,yBACIpG,UAAU,mBACV7C,MACI3D,KAAKjC,MAAMghD,gBAAX,eACU/+C,KAAKjC,MAAMiN,cADrB,2BAEUhL,KAAKjC,MAAMiN,cAFrB,IAEmCG,KAAM,EAAGrH,MAAO,SAGvD,4BAAK9D,KAAKlC,MAAM0N,QAAQJ,OACxB,kBAAC,GAAD,CACII,QAASxL,KAAKlC,MAAM0N,QACpBie,iBAAkBzpB,KAAKlC,MAAM2rB,iBAC7BqB,kBAAmB9qB,KAAK8qB,kBACxBpB,gBAAiB1pB,KAAKlC,MAAM4rB,gBAC5B9E,mBAAoB5kB,KAAKjC,MAAM6mB,sBAGtCk9B,EACAH,IAK0B,IAAvC3hD,KAAKlC,MAAM0N,QAAQuiB,SAASvuB,QAAiBQ,KAAKlC,MAAME,UACxD+jD,EACI,yBAAKn1C,KAAK,QACN,yBAAKpG,UAAU,oBACX,6GAKHs7C,IAIT9hD,KAAKjC,MAAMshD,OAAOv0C,MAAoC,QAA5B9K,KAAKjC,MAAMshD,OAAO/4C,QAC5Cy7C,EACI,yBAAKn1C,KAAK,QACN,yBAAKpG,UAAU,mBAAmB7C,MAAO3D,KAAKjC,MAAMiN,cAChD,4BAAKhL,KAAKlC,MAAM0N,QAAQJ,OACxB,kBAAC,GAAD,CACII,QAASxL,KAAKlC,MAAM0N,QACpBie,iBAAkBzpB,KAAKlC,MAAM2rB,iBAC7BqB,kBAAmB9qB,KAAK8qB,kBACxBsS,SAAUp9B,KAAKlC,MAAM2rB,iBAAiB+uB,eAAepb,SACrDT,OAAQ38B,KAAKlC,MAAM2rB,iBAAiB+uB,eAAe7b,OACnDjD,2BAA4B15B,KAAKlC,MAAM47B,2BACvC4F,YAAat/B,KAAKs/B,YAClB9O,eAAgB,SAAA0C,GAAI,OAAI,EAAK1C,eAAe0C,GAAM,IAClDzlB,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCmb,UAAW7/B,KAAKjC,MAAMshD,OAAOD,eAGpC0C,EACAH,IAKT,yBAAKn7C,UAAU,oBACV+6C,EACA74B,EACD,kBAAC,GAAD,CACI5d,KAAM9K,KAAKlC,MAAM+gD,gBACjBxE,mBAAoBr6C,KAAKq6C,mBACzBr0C,UAC6C,YAAzChG,KAAKlC,MAAM2rB,iBAAiB5E,UAC5B7kB,KAAKjC,MAAM6mB,mBAEfnX,SACIzN,KAAKlC,MAAM4mB,cAAgB1kB,KAAKlC,MAAM+gD,iBAAmB,EAAI,IAGpEkD,EACD,kBAAC,GAAD,CACIj3C,KAAgC,OAA1B9K,KAAKjC,MAAMivC,WACjBjD,YAAa/pC,KAAKwgD,iBAClBxT,WACIhtC,KAAKjC,MAAMivC,WAAahtC,KAAKjC,MAAMivC,WAAa,CAACr/B,GAAI,MAEzDo/B,gBAAiB/sC,KAAK+sC,gBACtB7nC,OAAQ,CACJowC,WAAYt1C,KAAKs1C,WACjBC,WAAYv1C,KAAKu1C,WACjB7L,SAAU1pC,KAAKygD,eACf3U,WAAY9rC,KAAK4gD,iBACjBrC,mBAAoBv+C,KAAKu+C,oBAE7B5mC,UAAW3X,KAAKlC,MAAM0N,QAAQmC,GAC9Bs8B,WAAYjqC,KAAKlC,MAAM0N,QAAQy+B,WAC/Bpb,MAAO7uB,KAAKlC,MAAM0N,QAAQqjB,MAC1BxB,OAAQrtB,KAAKlC,MAAM0N,QAAQ6hB,OAC3BU,SAAU/tB,KAAKlC,MAAM0N,QAAQuiB,SAC7BpC,MAAO3rB,KAAKlC,MAAM0N,QAAQmgB,MAC1BQ,QAASnsB,KAAKlC,MAAM0N,QAAQ2gB,QAC5BM,OAAQzsB,KAAKlC,MAAM0N,QAAQihB,OAC3BsrB,SAAU/3C,KAAKlC,MAAM0N,QAAQusC,SAC7BnrB,OAAQ5sB,KAAKlC,MAAM0N,QAAQohB,OAC3BorB,SAAUh4C,KAAKlC,MAAM0N,QAAQwsC,SAC7BjM,WAAqD,YAAzC/rC,KAAKlC,MAAM2rB,iBAAiB5E,SACxCtN,YAAavX,KAAKlC,MAAMyZ,mB,GA74BbpX,aA0iChB6M,gBAtJS,SAAAjP,GACpB,MAAO,CACHwJ,KAAMxJ,EAAMwJ,KACZiE,QAASzN,EAAMynB,OAAOha,QACtB0K,YAAanY,EAAMynB,OAAOha,QAAQ0K,YAClC4/B,YAAa/3C,EAAMynB,OAAOswB,YAC1B+I,gBAAiB9gD,EAAMynB,OAAOiE,iBAAiBE,QAAQk1B,gBACvDn1B,gBAAiB3rB,EAAMynB,OAAOiE,iBAAiBC,gBAC/CD,iBAAkB1rB,EAAMynB,OAAOiE,iBAC/BzrB,QAASD,EAAMN,OAAOO,QACtBomC,aAAcrmC,EAAMynB,OAAO4e,aAC3BH,eAAgBlmC,EAAMynB,OAAOye,eAC7BlW,SAAUhwB,EAAMynB,OAAOha,QAAQuiB,SAC/B5B,QAASpuB,EAAMynB,OAAOha,QAAQ2gB,YAIX,SAAA5iB,GACvB,MAAO,CACHkc,YAAa,SAAC9N,EAAW7Z,GACrByL,EAASkc,GAAY9N,KAGzBi+B,eAAgB,SAAA/wB,GACZtb,EAASqsC,GAAe/wB,KAG5B0G,kBAAmB,SAAC7B,EAAiBqsB,EAAQloC,GACzCtE,ET97BL,SAA2BmgB,EAAiBqsB,EAAQloC,GAQzD,OAPA6b,EAAe,2BACVA,GADU,IAEbI,QAAQ,aAAKJ,EAAgBI,YAEfhlB,KAAOixC,EAAO3qB,WAC9B1B,EAAgBI,QAAU,CAACisB,EAAOpoC,IAE3B,CACL7I,KAAM,0BACN+E,QAAS6f,GSo7BQ6B,CAAkB7B,EAAiBqsB,KAGhDjrB,kBAAmB,SACfpB,EACAqsB,EACAloC,EACAwf,EACA1B,EACAc,EACAG,GAEArjB,EACIuhB,GAAkBpB,EAAiBqsB,EAAQloC,EAAO,CAC9Cwf,SACA1B,QACAc,SACAG,aAKZipB,kBAAmB,SAAAC,GACfvsC,EAASssC,GAAkBC,KAG/B8I,kBAAmB,SAAAt+C,GACfiJ,ETh+BL,SAA2BjJ,GAChC,MAAO,CACLwE,KAAM,sBACN+E,QAASvJ,GS69BQs+C,CAAkBt+C,KAG/BsX,cAAe,SAACpM,EAASmM,GACrBpO,EAASqO,GAAcD,EAAWnM,KAGtC0zC,eAAgB,WACZ31C,EAAS,CAACzE,KAAM,sBAGpBw6B,YAAa,SAAC5Q,EAAS1d,EAAOlT,GAC1ByL,EAAS+1B,GAAY5Q,EAAS1d,KAGlCskC,WAAY,SAAC/iB,EAAQW,EAAMvb,EAAWgS,GAClCpgB,EAAS+rC,GAAW/iB,EAAQW,IAAO30B,MAAK,kBACpCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjD4rB,WAAY,SAAChjB,EAAQ5a,EAAWgS,GAC5BpgB,EAASgsC,GAAWhjB,IAASh0B,MAAK,kBAC9BgL,EAASutC,GAAqBn/B,EAAWgS,QAIjD+f,SAAU,SAACnX,EAAQwjB,EAAQp+B,EAAWgS,GAClCpgB,EAASmgC,GAASnX,EAAQwjB,IAASx3C,MAAK,kBACpCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjDmiB,WAAY,SAACvZ,EAAQwjB,EAAQp+B,EAAWgS,GACpCpgB,EAASuiC,GAAWvZ,EAAQwjB,IAASx3C,MAAK,kBACtCgL,EAASutC,GAAqBn/B,EAAWgS,QAIjD40B,mBAAoB,SAChBhsB,EACAmuB,EACAC,EACAhpC,EACAgS,GAEI+2B,EAAYlhD,OAAS,GAAKmhD,EAAcnhD,OAAS,EACjD+J,EAASmgC,GAASnX,EAAQmuB,IACrBniD,MAAK,SAAA2G,GAAM,OAAIqE,EAASuiC,GAAWvZ,EAAQouB,OAC3CpiD,MAAK,kBAAMgL,EAASutC,GAAqBn/B,EAAWgS,OAClD+2B,EAAYlhD,OAAS,EAC5B+J,EAASmgC,GAASnX,EAAQmuB,IAAcniD,MAAK,kBACzCgL,EAASutC,GAAqBn/B,EAAWgS,OAEtCg3B,EAAcnhD,OAAS,GAC9B+J,EAASuiC,GAAWvZ,EAAQouB,IAAgBpiD,MAAK,kBAC7CgL,EAASutC,GAAqBn/B,EAAWgS,QAIrD+P,2BAA4B,SAAA1vB,GACxBT,EAASmwB,GAA2B1vB,KAGxCotC,sBAAuB,SACnBC,EACA8E,EACAC,EACAC,EACAC,GAEA/yC,EACI6tC,GAAsBC,EAAW,GAAI,CACjC8E,WACAC,UACAC,WACAC,eAKZgD,cAAe,SAAC3nC,EAAWiP,GACvBrd,EhD37BL,SAAuBoO,EAAWiP,GACvC,MAAO,CACLnb,MAAO,CAAC,eAAgB,iBAAkB,iBAC1C5B,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,EAAf,mBAAmCiP,GACtCjb,OAAQ,MACRhF,eAAgB,GAChBc,aAAc,iCgDm7BD63C,CAAc3nC,EAAWiP,KAGtCoe,gCAAiC,WAC7Bz7B,EAAS,CACLzE,KAAM,oBACN+E,QAAS,qCAEbK,YAAW,kBAAMX,EAAS,CAACzE,KAAM,wBAAuB,SAKrDkI,CAA6C2xC,ICplCvCqD,G,kDACnB,WAAYlkD,GAAQ,IAAD,8BACjB,cAAMA,IAcRmkD,aAAe,GAfI,EAkBnBrF,cAAgB,SAAAxxC,GACd,IAAK,IAAImnB,KAAU,EAAKz0B,MAAM+wB,MAAO,CAEnC,GADa,EAAK/wB,MAAM+wB,MAAM0D,GACrBnnB,QAAUA,EAEjB,YADA,EAAKrL,SAAS,CAAE4F,OAAQ,CAAEyF,MAAO,qCAIjCA,EAAM5L,OAAS,IACjB,EAAKO,SAAS,CACZ4F,OAAQ,CAAEyF,MAAO,6CAEO,IAAjBA,EAAM5L,OACf,EAAKO,SAAS,CAAE4F,OAAQ,CAAEyF,MAAO,8BAEjC,EAAKrL,SAAS,CAAE4F,OAAQ,CAAEyF,MAAO,OAjClB,EAqCnBnF,SAAW,SAACxH,EAAM6B,GAAW,IAAD,EAM1B,GALA,EAAKP,UAAL,mBACGtB,EAAO6B,GADV,mDAEgB,EAAKvC,MAAMqZ,SAF3B,kBAEqC3Y,GAAO,KAF5C,IAIa,UAATA,GAAkB,EAAKm+C,cAAct8C,EAAMu8C,QAClC,aAATp+C,EAAqB,CACvB,IAAI2Y,EAAU,CACZhM,MAAO,EAAKrN,MAAMqN,MAClBk+B,SAAUhpC,EACVipC,YAAa,EAAKxrC,MAAMwrC,YACxB/W,KAAM,EAAKz0B,MAAMy0B,MAEf,EAAK10B,MAAMo1B,MACb,EAAKp1B,MAAMoH,OAAOowC,WAAW,EAAKx3C,MAAMo1B,KAAKvlB,GAAIyJ,KAnDpC,EAuDnBpO,OAAS,WACP,IAAIkqB,EAAO,CACTkiB,WAAY,EAAKt3C,MAAM6Z,UACvBvM,MAAO,EAAKrN,MAAMqN,MAClBk+B,SAAU,EAAKvrC,MAAMurC,SACrBC,YAAa,EAAKxrC,MAAMwrC,YACxBnxB,IAAK,EAAKra,MAAMqa,IAChBoa,KAAM,EAAKz0B,MAAMy0B,MAEnB,EAAK10B,MAAMoH,OAAOmwC,QAAQniB,GAE1B,EAAKnzB,SAAS,CACZqL,MAAO,GACPk+B,SAAU,GACVC,YAAa,GACbnxB,IAAK,GACLoa,MAAM,EACN7sB,OAAQ,CACNyF,MAAO,OAzEM,EAkFnBY,MAAQ,SAAAlO,GACN,EAAKiC,SAAS,CACZqL,MAAO,GACPk+B,SAAU,GACVC,YAAa,GACbnxB,IAAK,GACLzS,OAAQ,CACNyF,MAAO,GACPk+B,SAAU,GACVC,YAAa,GACbnxB,IAAK,GACLoa,MAAM,MA7FO,EAkGnBqX,iBAAmB,SAAAprC,GACjB,MAAO,CAAE6B,MAAO7B,EAAMkQ,KAAMlQ,IAnGX,EAsGnBosC,eAAiB,SAACnwB,EAAM5V,EAAM4P,GAC5B,IAAIpO,EAAQ,GACZ,GAAa,SAATxB,EAAiB,CACnB,IAAIo9C,EAA8B,MAAnBxnC,EAAKwQ,OAAO,GAAa,QAAU,QAClD5kB,EAAK,eAAW0Z,KAAKmiC,MAAMztC,EAAQ,GAAK,GAAnC,aAA0C5P,EAA1C,YAAkDo9C,OAClD,CACL,IAAMjZ,EACJ,EAAKnrC,MAAL,UAAcgH,EAAKwV,cAAnB,QAAuC8R,QAAQ1R,EAAK/M,IAAM,EAC5DrH,EAAK,UAAMxB,EAAN,YAAcmkC,GAErB,OACE,yBAAK95B,IAAKuL,EAAK/M,GAAIrN,MAAOoa,EAAK/M,GAAIrH,MAAOA,GACvCA,IAhHL,EAAKvI,MAAQ,CAEXqN,MAAO,GACPk+B,SAAU,GACVC,YAAa,GACbnxB,IAAK,GACLoa,MAAM,EACN7sB,OAAQ,CACNyF,MAAO,KAVM,E,qDAuHT,IAAD,OAEHg3C,EACF,yBAAK57C,UAAU,WACb,kBAAC,IAAD,CACEF,MAAO,QACPG,QAAS,kBAAM,EAAKuF,SACpBrI,MAAO,CAAEG,MAAO,OACf,IALL,OAOE,kBAAC,IAAD,CACEwC,MAAO,SACPC,SAAO,EACP5C,MAAO,CAAEG,MAAO,KAChB2C,QAAS,kBAAM,EAAKuC,UACpBsF,SAC8B,KAA5BtO,KAAKjC,MAAM4H,OAAOyF,OACM,KAAxBpL,KAAKjC,MAAMurC,UACU,KAArBtpC,KAAKjC,MAAMqN,SAMnB,OACE,yBAAK5E,UAAU,aACb,4BAzBQ,qBA0BR,yBAAKA,UAAU,YACb,yBAAKA,UAAU,QAAQmH,GAAG,gBAA1B,SAGA,yBAAKnH,UAAU,SACb,kBAAC,IAAD,CACE8G,kBAAgB,eAChB7O,KAAK,QACL6B,MAAON,KAAKjC,MAAMqN,MAClBjF,UAAWnG,KAAKjC,MAAM4H,OAAOyF,MAC7BnF,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,QAASpB,IAC3CmB,WAAS,EACTI,eAAcpG,KAAKjC,MAAM4H,OAAOyF,MAAM5L,OAAS,KAGnD,yBAAKgH,UAAU,QAAQmH,GAAG,eAA1B,YAGA,yBAAKnH,UAAU,SACb,kBAAC,GAAD,CACEF,MAAM,cACNqH,GAAG,cACHrN,MAAON,KAAKjC,MAAMurC,SAClBrjC,SAAU,SAACpB,EAAGiR,GAAJ,OAAU,EAAK7P,SAAS,WAAYpB,IAC9CmF,KAAMhK,KAAKlC,MAAMmsC,WAAWt5B,IAAI3Q,KAAK6pC,qBAGzC,yBAAKrjC,UAAU,QAAQmH,GAAG,sBAA1B,eAGA,yBAAKnH,UAAU,SACb,kBAAC,IAAD,CACE8G,kBAAgB,qBAChB7O,KAAK,cACL6B,MAAON,KAAKjC,MAAMwrC,YAClBtjC,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,cAAepB,IACjDqlC,WAAS,EACTlkC,WAAS,KAGb,yBAAKQ,UAAU,QAAQmH,GAAG,cAA1B,OAGA,yBAAKnH,UAAU,SACb,kBAAC,IAAD,CACE8G,kBAAgB,aAChB7O,KAAK,MACL6B,MAAON,KAAKjC,MAAMqa,IAClBnS,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAAS,MAAOpB,IACzCqlC,WAAS,EACTlkC,WAAS,KAGb,yBAAKQ,UAAU,QAAQ7C,MAAO,CAAEN,WAAY,IAAMsK,GAAG,eAArD,2CAGA,yBAAKnH,UAAU,SACb,kBAAC,KAAD,CACE8G,kBAAgB,cAChB7O,KAAK,OACL6B,MAAON,KAAKjC,MAAMy0B,KAClB9gB,QAAS1R,KAAKjC,MAAMy0B,KACpB7uB,MAAO,CAAEN,WAAY,IACrBoD,QAAS,kBAAM,EAAKR,SAAS,QAAS,EAAKlI,MAAMy0B,UAGpD4vB,Q,GArN8BjiD,aCCpBkiD,G,kDACnB,WAAYvkD,GAAQ,IAAD,8BACjB,cAAMA,IAYRwkD,aAAe,SAAAtV,GACb,EAAKjtC,SAAS,CAAEitC,gBAdC,EAyBnBuV,WAAa,SAAAhwB,GACX,IAAMW,EAAO,EAAKp1B,MAAM+wB,MAAM0D,GAC9B,OACE,4BACEztB,KAAK,SACLrG,KAAK,aACLqH,aAAY,SAAWotB,EAAK9nB,MAC5B5E,UACE,EAAKzI,MAAMivC,YAAc,EAAKjvC,MAAMivC,WAAWr/B,KAAO4kB,EAClD,yBACA,kBAEN9rB,QAAS,kBAAM,EAAK67C,aAAapvB,IACjCzlB,SAAU,EAAK3P,MAAM2P,SACrB0B,IAAKojB,GAEL,6BACE,yBAAK/rB,UAAU,SACZ0sB,EAAK9nB,MAAM5L,OAAS,GACjB0zB,EAAK9nB,MAAM2Q,UAAU,EAAG,IAAM,MAC9BmX,EAAK9nB,OAEX,yBAAK5E,UAAU,YAAY0sB,EAAKoW,aA/CrB,EAwDnBt9B,MAAQ,WACN,EAAKjM,SAAS,CACZqL,MAAO,GACPk+B,SAAU,GACVC,YAAa,MA5DE,EAgEnBgM,WAAa,SAAAhjB,GACX,EAAKz0B,MAAMoH,OAAOqwC,WAAWhjB,GAC7B,EAAKxyB,SAAS,CAAEitC,WAAY,QAlEX,EAqEnBsI,WAAa,SAAC/iB,EAAQW,GACpB,EAAKp1B,MAAMoH,OAAOowC,WAAW/iB,EAAQW,IAtEpB,EAyEnBwW,SAAW,SAACnX,EAAQwjB,GAClB,EAAKj4C,MAAMoH,OAAOwkC,SAASnX,EAAQwjB,IA1ElB,EA6EnBjK,WAAa,SAACvZ,EAAQwjB,GACpB,EAAKj4C,MAAMoH,OAAO4mC,WAAWvZ,EAAQwjB,IA9EpB,EAiFnBwI,mBAAqB,SAAChsB,EAAQmuB,EAAaC,GACzC,EAAK7iD,MAAMoH,OAAOq5C,mBAAmBhsB,EAAQmuB,EAAaC,IAlFzC,EAqFnB5C,gBAAkB,WAQhB,OAP8B39C,OAAO9B,KAAK,EAAKR,MAAMuvB,QAAQne,QAC3D,SAAAwf,GACE,OAAO,EAAK5wB,MAAMuvB,OAAOqB,GAASpJ,MAAMtd,SACtC,EAAKjK,MAAMivC,WAAWr/B,OAICgD,KAAI,SAAArQ,GAE/B,MAAO,CAAEgG,MADE,gBAAY,EAAKxI,MAAMiwB,SAAS3B,QAAQ9rB,GAAS,GAC5CA,aA/FD,EAmGnB09C,gBAAkB,WAQhB,OAP6B59C,OAAO9B,KAAK,EAAKR,MAAM6tB,OAAOzc,QACzD,SAAAyrB,GACE,OAAO,EAAK78B,MAAM6tB,MAAMgP,GAAQrV,MAAMtd,SACpC,EAAKjK,MAAMivC,WAAWr/B,OAIAgD,KAAI,SAAArQ,GAE9B,MAAO,CAAEgG,MADE,eAAW,EAAKxI,MAAMquB,QAAQC,QAAQ9rB,GAAS,GAC1CA,aA7GD,EAiHnB29C,eAAiB,WACf,IADqB,EACfC,EAAwB99C,OAAO9B,KAAK,EAAKR,MAAM2uB,QAAQvd,QAC3D,SAAAwd,GACE,OAAO,EAAK5uB,MAAM2uB,OAAOC,GAASpH,MAAMtd,SACtC,EAAKjK,MAAMivC,WAAWr/B,OAItBwwC,EAAwB/9C,OAAO9B,KAAK,EAAKR,MAAM8uB,QAAQ1d,QAC3D,SAAA2d,GACE,OAAO,EAAK/uB,MAAM8uB,OAAOC,GAASvH,MAAMtd,SACtC,EAAKjK,MAAMivC,WAAWr/B,OAItBywC,EAAuB,GAfR,eAgBHF,GAhBG,IAgBrB,2BAAyC,CAAC,IAAjC59C,EAAgC,QACjC+9C,EACJ,EAAKvgD,MAAMquB,QAAQC,QAAQ,EAAKtuB,MAAM2uB,OAAOnsB,GAAOwsB,UAAY,EAC5DvW,EACJ,EAAKzY,MAAM2uB,OAAOnsB,GAAO+qB,cACiB,KAA1C,EAAKvtB,MAAM2uB,OAAOnsB,GAAO+qB,aADzB,WAEQ,EAAKvtB,MAAM2uB,OAAOnsB,GAAO+qB,aAFjC,KAGI,GACA7U,EACJ,EAAK1Y,MAAM2uB,OAAOnsB,GAAOw1B,aACgB,KAAzC,EAAKh4B,MAAM2uB,OAAOnsB,GAAOw1B,YADzB,WAEQ,EAAKh4B,MAAM2uB,OAAOnsB,GAAOw1B,YAFjC,KAGI,GACAxvB,EAAK,WAAO+3C,EAAP,kBAA0B9nC,EAA1B,YAAyCC,GACpD4nC,EAAqBx2C,KAAK,CAAEtB,QAAOhG,WA9BhB,mDAgCH69C,GAhCG,IAgCrB,2BAAyC,CAAC,IAAjC79C,EAAgC,QACjC+9C,EACJ,EAAKvgD,MAAMquB,QAAQC,QAAQ,EAAKtuB,MAAM8uB,OAAOtsB,GAAOwsB,UAAY,EAC5DvW,EACJ,EAAKzY,MAAM8uB,OAAOtsB,GAAO+qB,cACiB,KAA1C,EAAKvtB,MAAM8uB,OAAOtsB,GAAO+qB,aADzB,WAEQ,EAAKvtB,MAAM8uB,OAAOtsB,GAAO+qB,aAFjC,KAGI,GACA7U,EACJ,EAAK1Y,MAAM8uB,OAAOtsB,GAAOw1B,aACgB,KAAzC,EAAKh4B,MAAM8uB,OAAOtsB,GAAOw1B,YADzB,WAEQ,EAAKh4B,MAAM8uB,OAAOtsB,GAAOw1B,YAFjC,KAGI,GACAxvB,EAAK,WAAO+3C,EAAP,kBAA0B9nC,EAA1B,YAAyCC,GACpD4nC,EAAqBx2C,KAAK,CAAEtB,QAAOhG,WA9ChB,8BAgDrB,OAAO89C,GAjKU,EAoKnBE,mBAAqB,WAGnB,IAFA,IAAM7iC,EAAOrb,OAAO9B,KAAK,EAAKR,MAAM2uB,QAAQjtB,OACxCwU,EAAS,GACJ8B,EAAI,EAAGA,EAAI2F,EAAM3F,IAAK,CAC7B,IAAM4W,EAAUtsB,OAAO9B,KAAK,EAAKR,MAAM2uB,QAAQ3W,GACzC+W,EAAUzsB,OAAO9B,KAAK,EAAKR,MAAM8uB,QAAQ9W,GAC/C9B,EAAO0Y,GAAW,EAAK5uB,MAAM2uB,OAAOC,GACpC1Y,EAAO6Y,GAAW,EAAK/uB,MAAM8uB,OAAOC,GAEtC,OAAO7Y,GA3KP,EAAKjW,MAAQ,CACXivC,WAAY,KACZ5hC,MAAO,GACPk+B,SAAU,GACVC,YAAa,IANE,E,sEAiBOliC,GACpBrH,KAAKjC,MAAMivC,YACbhtC,KAAKD,SAAS,CAAEitC,WAAY3lC,EAAUwnB,MAAM7uB,KAAKjC,MAAMivC,WAAWr/B,Q,+BA6J5D,IACJ60C,EADG,OAgDP,OAhCEA,EAdGxiD,KAAKjC,MAAMivC,WAeZ,kBAAC,GAAD,CACE9nC,OAAQ,CACNmwC,QAASr1C,KAAKlC,MAAMoH,OAAOmwC,QAC3BC,WAAYt1C,KAAKs1C,WACjBC,WAAYv1C,KAAKu1C,WACjB7L,SAAU1pC,KAAK0pC,SACfoC,WAAY9rC,KAAK8rC,WACjByS,mBAAoBv+C,KAAKu+C,oBAE3B5mC,UAAW3X,KAAKlC,MAAM6Z,UACtBkX,MAAO7uB,KAAKlC,MAAM+wB,MAClBqE,KAAMlzB,KAAKjC,MAAMivC,WACjB/C,WAAYjqC,KAAKlC,MAAMmsC,WACvB5c,OAAQrtB,KAAKlC,MAAMuvB,OACnB1B,MAAO3rB,KAAKlC,MAAM6tB,MAClBc,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnBmB,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,SACrB9tB,MAAOlqB,KAAKs+C,qBACZd,aAAcx9C,KAAK+9C,kBACnBJ,aAAc39C,KAAKg+C,kBACnBH,YAAa79C,KAAKi+C,iBAClB1mC,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM2P,WAvCvB,kBAAC,GAAD,CACEohB,MAAO7uB,KAAKlC,MAAM+wB,MAClBlX,UAAW3X,KAAKlC,MAAM6Z,UACtBzS,OAAQ,CAAEmwC,QAASr1C,KAAKlC,MAAMoH,OAAOmwC,SACrCpL,WAAYjqC,KAAKlC,MAAMmsC,WACvBlc,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,WAqCzB,yBAAKxxC,UAAU,UACb,yBAAKA,UAAU,aACb,yBAAKoG,KAAK,SAAS9G,aAAW,sBAC5B,kBAAC,IAAD,eACES,UAAUvG,KAAKjC,MAAMivC,WACrBxmC,UAAW,gBACXC,QAAS,kBAAM,EAAK67C,aAAa,OACjC3+C,MAAO,CAAEG,MAAO,QACZR,EALN,CAMEgD,MAAM,kBACNrD,WAAU,eAAOQ,IAAUR,YAC3BuV,KAAM,kBAAC,KAAD,MACNY,WAAY,UACZU,gBAAiB,UACjBrM,SAAUzN,KAAKlC,MAAM2P,YAEtBrN,OAAO9B,KAAK0B,KAAKlC,MAAM+wB,OAAOle,IAAI3Q,KAAKuiD,cAG5C,yBAAK/7C,UAAU,UAAUoG,KAAK,SAAS9G,aAAW,gBAC/C08C,Q,GAtP8BriD,aCApBsiD,G,kDACnB,WAAY3kD,GAAQ,IAAD,8BACjB,cAAMA,IAqBR4kD,aAAe,WACb,EAAK3iD,SAAS,CACZqX,QAAS,IAAIlG,MAAM,EAAKpT,MAAMmsC,WAAWzqC,QAAQwE,MAAK,GACtD2+C,YAAa,MAzBE,EA6BnBC,oBAAsB,SAAAD,GACpB,EAAK5iD,SAAS,CAAE4iD,gBAAe,WAC7B,GAAK,EAAKE,QAAQF,EAAY9F,QAK5B,EAAK98C,SAAS,CAAE+iD,iBAAkB,SALG,CACrC,IAAIr7C,EAAY,6BAAyBk7C,EAAzB,mCACW,IAAvBA,EAAYnjD,SAAciI,EAAe,IAC7C,EAAK1H,SAAS,CAAE+iD,iBAAkBr7C,SAlCrB,EAyCnBxB,SAAW,SAAC08C,EAAajuC,GAGvB,GAFA,EAAKquC,YAAYruC,EAAOiuC,GACxB,EAAKK,WAAWtuC,GAAO,GAClB,EAAKmuC,QAAQF,GAMhB,EAAKM,SAASvuC,EAAO,QANS,CAC9B,IAAIjN,EAAY,6BAAyBk7C,EAAzB,mCACZA,IAAgB,EAAK7kD,MAAMmsC,WAAWv1B,KAAQjN,EAAe,IACtC,IAAvBk7C,EAAYnjD,SAAciI,EAAY,4BAC1C,EAAKw7C,SAASvuC,EAAOjN,KAhDN,EAsDnBy7C,SAAW,SAACr1C,EAAO6G,GACjB7G,EAAM5I,iBACN,IAAM09C,EAAc,EAAK5kD,MAAMksC,WAAWv1B,GAC1C,GAAIiuC,IAAgB,EAAK7kD,MAAMmsC,WAAWv1B,GAAQ,CAChD,EAAK3U,SAAS,CAAEojD,cAAezuC,IAC/B,IAAI40B,EAAW,CACb8L,WAAY,EAAKt3C,MAAM6Z,UACvB2xB,SAAUqZ,EACVS,aAAc,EAAKtlD,MAAMmsC,WAAWv1B,IAEtC,EAAK5W,MAAMoH,OAAOwwC,eAAepM,GAEnC,EAAK0Z,WAAWtuC,GAAO,IAlEN,EAqEnBmuC,QAAU,SAAAF,GACR,OAAQ,EAAK7kD,MAAMmsC,WAAWjiC,SAAS26C,IAAuC,IAAvBA,EAAYnjD,QAtElD,EAyEnBg9C,SAAW,SAAA9nC,GACT,IAAI40B,EAAW,CACb8L,WAAY,EAAKt3C,MAAM6Z,UACvB2xB,SAAU,EAAKvrC,MAAMksC,WAAWv1B,IAE9B2uC,EAAc,aAAO,EAAKtlD,MAAMqZ,SACpCisC,EAAensC,OAAOxC,EAAO,GAC7B,EAAK3U,SAAS,CAAEqX,QAASisC,IAAkB,WACzC,EAAKvlD,MAAMoH,OAAOywC,eAAerM,OAjFlB,EAqFnBwB,SAAW,SAAAj9B,GACTA,EAAM5I,iBACN,IAAIqkC,EAAW,CACb8L,WAAY,EAAKt3C,MAAM6Z,UACvB2xB,SAAU,EAAKvrC,MAAM4kD,YAAY9F,QAEnC,EAAK/+C,MAAMoH,OAAOuwC,eAAenM,GACjC,EAAKoZ,eACL,EAAK3iD,SAAS,CAAEojD,eAAgB,KA7Ff,EAgGnBrG,eAAiB,SAAApoC,GACf,EAAKquC,YAAYruC,EAAO,EAAK5W,MAAMmsC,WAAWv1B,IAC9C,EAAKuuC,SAASvuC,EAAO,IACrB,EAAKsuC,WAAWtuC,GAAO,IAnGN,EAsGnBquC,YAAc,SAACruC,EAAOpU,GACpB,IAAIgjD,EAAa,aAAO,EAAKvlD,MAAMksC,YACnCqZ,EAAc5uC,GAASpU,EACvB,EAAKP,SAAS,CAAEkqC,WAAYqZ,KAzGX,EA4GnBN,WAAa,SAACtuC,EAAOpU,GACnB,IAAIijD,EAAU,aAAO,EAAKxlD,MAAMqZ,SAChCmsC,EAAW7uC,GAASpU,EACpB,EAAKP,SAAS,CAAEqX,QAASmsC,KA/GR,EAkHnBN,SAAW,SAACvuC,EAAOpU,GACjB,IAAIkjD,EAAS,aAAO,EAAKzlD,MAAM0lD,YAC/BD,EAAU9uC,GAASpU,EACnB,EAAKP,SAAS,CAAE0jD,WAAYD,KArHX,EAwHnBzG,oBAAsB,SAAAroC,GACpB,OAAI,EAAK3W,MAAMqZ,QAAQ1C,GAEnB,yBAAK/Q,MAAO,CAAE4U,MAAO,QAAStU,YAAa,QACzC,kBAAC,IAAD,CACE6B,aAAW,SACXS,SAAO,EACPiS,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAAEC,SAAU,OAAQgO,WAAY,OACvCnT,KAAK,SACLqG,KAAK,SACLwJ,UAAW,EAAKu0C,QAAQ,EAAK9kD,MAAMksC,WAAWv1B,MAEhD,kBAAC,IAAD,CACE5O,aAAW,SACX2S,WAAS,EACTD,KAAM,kBAAC,KAAD,MACN7U,MAAO,CAAEC,SAAU,OAAQgO,WAAY,OACvCnL,QAAS,SAAAzB,GAAC,OAAI,EAAK83C,eAAepoC,OAKjC,IA/IQ,EAmJnBgvC,eAAiB,SAACpa,EAAU50B,GAC1B,OACE,yBAAKvF,IAAK,YAAcuF,EAAOlO,UAAU,QACvC,0BAAMT,SAAU,SAAAf,GAAC,OAAI,EAAKk+C,SAASl+C,EAAG0P,KACpC,kBAAC,IAAD,CACE5O,aAAYwjC,EAAW,YACvB7qC,KAAM,YAAciW,EACpBpU,MAAO,EAAKvC,MAAMksC,WAAWv1B,GAC7BzO,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAKoB,SAASpB,EAAG6P,IACrCvO,UAAW,EAAKpI,MAAM0lD,WAAW/uC,GACjCtO,oBACmCkB,IAAjC,EAAKvJ,MAAM0lD,WAAW/uC,IACtB,EAAK3W,MAAM0lD,WAAW/uC,GAAOlV,OAAS,EAExCmE,MAAO,CAAEG,MAAO,OAChB2J,SAAU,EAAK3P,MAAM2P,WAET,YAAb67B,EACC,GAEA,kBAAC,GAAD,CACE5uB,KAAK,WACL8hC,SAAU,EAAKA,SACf9nC,MAAOA,EACPw0B,SAAUI,EACV/xB,YAAa,EAAKzZ,MAAMyZ,YACxB9J,SAAU,EAAK3P,MAAM2P,WAGxB,EAAKsvC,oBAAoBroC,MAhLf,EAsLnBivC,eAAiB,SAAC5N,EAAQrhC,GACxB,MAAsB,eAAfqhC,EAAO5mC,KArLd,EAAKpR,MAAQ,CACX4kD,YAAa,GACb1Y,WAAW,aAAKnsC,EAAMmsC,YACtB7yB,QAAS,IAAIlG,MAAMpT,EAAMmsC,WAAWzqC,QAAQwE,MAAK,GACjD8+C,iBAAkB,GAClBW,WAAY,IAAIvyC,MAAMpT,EAAMmsC,WAAWzqC,QAAQwE,KAAK,IACpDm/C,eAAgB,GARD,E,sEAYO97C,GAEtBrH,KAAKjC,MAAMksC,WAAWzqC,SAAW6H,EAAU4iC,WAAWzqC,QACtDQ,KAAKlC,MAAMmsC,aAAe5iC,EAAU4iC,aAEpCjqC,KAAKD,SAAS,CAAEkqC,WAAW,aAAK5iC,EAAU4iC,cAC1CjqC,KAAK0iD,kB,+BAwKC,IAAD,OACP,OACE,yBAAKl8C,UAAU,WAAWoG,KAAK,SAAS9G,aAAW,QACjD,wBAAInC,MAAO,CAAEN,WAAY,IAAzB,sBACA,0BAAM0C,SAAU,SAAAf,GAAC,OAAI,EAAK8lC,SAAS9lC,KACjC,yBAAKwB,UAAU,UACb,yBAAKA,UAAU,SACb,kBAAC,IAAD,CACEV,aAAW,eACXrH,KAAK,cACL6B,MAAON,KAAKjC,MAAM4kD,YAClB18C,SAAU,SAACjB,EAAGH,GAAJ,OAAU,EAAK+9C,oBAAoB/9C,IAC7CsB,UAAWnG,KAAKjC,MAAM+kD,iBACtB18C,eAAcpG,KAAKjC,MAAM+kD,iBAAiBtjD,OAAS,EACnDmE,MAAO,CAAEG,MAAO,KAChB2J,SAAUzN,KAAKlC,MAAM2P,YAGzB,yBAAKjH,UAAU,UACb,kBAAC,IAAD,CACEF,MAAM,SACNC,SAAO,EACPzB,KAAK,SACLwJ,UAAWtO,KAAK6iD,QAAQ7iD,KAAKjC,MAAM4kD,aACnCl1C,SAAUzN,KAAKlC,MAAM2P,cAK7B,+CACA,yBAAKjH,UAAU,SACZxG,KAAKlC,MAAMmsC,WACTt5B,IAAI3Q,KAAK0jD,gBACTx0C,OAAOlP,KAAK2jD,sB,GA5NaxjD,aCiBhCyjD,G,kDACJ,WAAY9lD,GAAQ,IAAD,8BACjB,cAAMA,IA0BRgrC,cAAgB,WACd,EAAK/oC,SAAS,CAAEuc,YAAa3d,OAAOwE,cA5BnB,EA+BnB0gD,YAAc,WACZ,EAAKt+B,YAAY,EAAKxnB,MAAMuC,MAAO,EAAKvC,MAAMqlB,cAhC7B,EAmCnBD,cAAgB,SAACne,EAAG1E,GAClB,EAAKP,SAAS,CAAEO,UAAS,kBAAM,EAAKujD,kBApCnB,EAuCnBxgC,aAAe,SAACve,EAAM4M,GACpB,EAAK3R,SACH,CAAEqjB,YAAY,2BAAM,EAAKrlB,MAAMqlB,aAAlB,kBAAgCte,EAAO4M,MACpD,kBAAM,EAAKmyC,kBA1CI,EA8CnBC,cAAgB,SAAA5wB,GACd,IAEMykB,EAFS,EAAK75C,MAAMyJ,KAAKoG,GAClBkL,KAAK++B,MAAMnoC,WAExByjB,EAAI,GAASykB,EAAOtkB,OAAOskB,EAAOn4C,OAAS,IAC3C,EAAK1B,MAAMu3C,QAAQniB,IAnDF,EAsDnB3N,YAAc,SAACjlB,EAAO8iB,GACpB,GAAc,KAAV9iB,EACF,EAAKP,SAAS,CAAE8uB,MAAO,EAAK/wB,MAAM+wB,YAC7B,CAGL,IAFA,IAAIk1B,EAAgB,GAChBC,GAAiB,EACrB,MAAiB5jD,OAAO9B,KAAK8kB,GAA7B,eAA2C,CACzC,GAAIA,EADO,MACY,CACrB4gC,GAAiB,EACjB,OAKJ,IAAK,IAAIzxB,KAFLyxB,IACF5gC,EAAc,CAAEhY,OAAO,EAAMk+B,UAAU,EAAMC,aAAa,IACzC,EAAKzrC,MAAM+wB,MAE5B,IADA,IAAMqE,EAAO,EAAKp1B,MAAM+wB,MAAM0D,GAC9B,MAAiBnyB,OAAO9B,KAAK8kB,GAA7B,eAA2C,CAAtC,IAAIte,EAAI,KACX,GACEse,EAAYte,IACZouB,EAAKpuB,GAAMm/C,cAAcj8C,SAAS1H,EAAM2jD,eAExC,IAAIF,EAAcxxB,GAAS,MACtBwxB,EAAcxxB,GAAUW,GAGnC,EAAKnzB,SAAS,CAAE8uB,MAAOk1B,MA/ER,EAmFnB5+B,mBAAqB,WACnB,EAAKplB,SAAS,CAAE6c,YAAa,EAAK7e,MAAM6e,cApFvB,EAuFnB04B,WAAa,SAAC/iB,EAAQW,GACpB,EAAKp1B,MAAMw3C,WAAW/iB,EAAQW,EAAM,EAAKp1B,QAxFxB,EA2FnB4rC,SAAW,SAACnX,EAAQwjB,GAClB,EAAKj4C,MAAM4rC,SAASnX,EAAQwjB,EAAQ,EAAKj4C,QA5FxB,EA+FnBguC,WAAa,SAACvZ,EAAQwjB,GACpB,EAAKj4C,MAAMguC,WAAWvZ,EAAQwjB,EAAQ,EAAKj4C,QAhG1B,EAmGnBygD,mBAAqB,SAAChsB,EAAQmuB,EAAaC,GACzC,EAAK7iD,MAAMygD,mBACThsB,EACAmuB,EACAC,EACA,EAAK7iD,QAtGP,EAAKC,MAAQ,CACX8wB,MAAO/wB,EAAM+wB,MACbvuB,MAAO,GACP8iB,YAAa,CACXhY,OAAO,EACPk+B,UAAU,EACVC,aAAa,GAGfjtB,YAAa3d,OAAOwE,YAXL,E,gEAgBjBxE,OAAOigB,iBAAiB,SAAU5e,KAAK8oC,iB,6CAIvCnqC,OAAOkgB,oBAAoB,SAAU7e,KAAK8oC,iB,gDAGlBzhC,GAAY,IAAD,OACnCrH,KAAKD,SAAS,CAAE8uB,MAAOxnB,EAAUwnB,QAAS,kBAAM,EAAKg1B,mB,+BAoF7C,IAAD,OACH/7C,EAAU,GAEe,WAAzB9H,KAAKlC,MAAMomD,UACbp8C,EACE,kBAAC,GAAD,CACE5C,OAAQ,CACNowC,WAAYt1C,KAAKs1C,WACjBD,QAASr1C,KAAK8jD,cACdvO,WAAYv1C,KAAKlC,MAAMy3C,WACvB7L,SAAU1pC,KAAK0pC,SACfoC,WAAY9rC,KAAK8rC,WACjByS,mBAAoBv+C,KAAKu+C,oBAE3B5mC,UAAW3X,KAAKlC,MAAM6Z,UACtBvL,aAAcpM,KAAKlC,MAAMsO,aACzB69B,WAAYjqC,KAAKlC,MAAMmsC,WACvBpb,MAAO7uB,KAAKjC,MAAM8wB,MAClBxB,OAAQrtB,KAAKlC,MAAMuvB,OACnB1B,MAAO3rB,KAAKlC,MAAM6tB,MAClBc,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnBmB,SAAU/tB,KAAKlC,MAAMiwB,SACrB5B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,SACrBzgC,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCpI,YAAatc,KAAKjC,MAAMue,cAGM,UAAzBtc,KAAKlC,MAAMomD,YACpBp8C,EACE,kBAAC,GAAD,CACE+mB,MAAO7uB,KAAKjC,MAAM8wB,MAClBlX,UAAW3X,KAAKlC,MAAM6Z,UACtBsyB,WAAYjqC,KAAKlC,MAAMmsC,WACvB/kC,OAAQ,CACNuwC,eAAgBz1C,KAAKlC,MAAM23C,eAC3BC,eAAgB11C,KAAKlC,MAAM43C,eAC3BC,eAAgB,SAAAwO,GAAU,OACxB,EAAKrmD,MAAM63C,eAAewO,EAAY,EAAKrmD,SAE/CyZ,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,KAK9C,IAAIm9B,EAAiB,UACjB7hD,KAAKlC,MAAM4mB,cAAam9B,GAAkB,gBAE9C,IAAMn5B,EACJ,yBAAKliB,UAAWq7C,EAAgBj1C,KAAK,SAAS9G,aAAW,WACvD,6BACA,kBAAC,GAAD,CACE4e,YAAa1kB,KAAKlC,MAAM4mB,YACxBoxB,YAAa91C,KAAKlC,MAAMg4C,YACxBD,kBAAmB71C,KAAKlC,MAAM+3C,qBAKpC,OACE,yBAAKrvC,UAAU,gBACb,kBAAC,GAAD,CACE6e,YAAsC,WAAzBrlB,KAAKlC,MAAMomD,UACxB3+B,YAAavlB,KAAKulB,YAClBpC,cAAenjB,KAAKmjB,cACpBE,aAAcrjB,KAAKqjB,aACnBD,YAAapjB,KAAKjC,MAAMqlB,YACxBzb,QAAS3H,KAAKlC,MAAM6J,QACpB8F,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCA,YAAa1kB,KAAKlC,MAAM4mB,YACxBpI,YAAatc,KAAKjC,MAAMue,YACxB0I,cAAc,GAEd,kBAACkE,GAAA,KAAD,CACEC,sBAAuB,CAAErP,gBAAiB,WAC1CxZ,MAAON,KAAKlC,MAAMomD,UAClBj+C,SAAU,SAAApB,GAAC,OAAI,EAAK/G,MAAMsmD,eAAev/C,KAEzC,kBAAC,OAAD,CACEyB,MAAM,eACNhG,MAAM,SACNyC,YAAa+jB,KAAcC,IAC3BtZ,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,IAE1C,kBAAC,OAAD,CACEpe,MAAM,kBACNhG,MAAM,QACNyC,YAAa+jB,KAAcC,IAC3BtZ,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,MAI7CgE,EACD,yBAAKliB,UAAU,kBAAkBsB,Q,GA9Md3H,aAmRZ6M,gBAhES,SAAAjP,GACtB,MAAO,CACLwJ,KAAMxJ,EAAMwJ,KACZoQ,UAAW5Z,EAAMynB,OAAOha,QAAQmC,GAChCogB,SAAUhwB,EAAMynB,OAAOha,QAAQuiB,SAC/B5B,QAASpuB,EAAMynB,OAAOha,QAAQ2gB,QAC9B4rB,SAAUh6C,EAAMynB,OAAOha,QAAQusC,SAC/BC,SAAUj6C,EAAMynB,OAAOha,QAAQwsC,SAC/B3qB,OAAQtvB,EAAMynB,OAAOha,QAAQ6hB,OAC7B1B,MAAO5tB,EAAMynB,OAAOha,QAAQmgB,MAC5Bc,OAAQ1uB,EAAMynB,OAAOha,QAAQihB,OAC7BG,OAAQ7uB,EAAMynB,OAAOha,QAAQohB,OAC7BiC,MAAO9wB,EAAMynB,OAAOha,QAAQqjB,MAC5Bob,WAAYlsC,EAAMynB,OAAOha,QAAQy+B,WACjCia,UAAWnmD,EAAMynB,OAAO+yB,aAAa2L,UACrC3L,aAAcx6C,EAAMynB,OAAO+yB,aAC3BzC,YAAa/3C,EAAMynB,OAAOswB,gBAGH,SAAAvsC,GACzB,MAAO,CACLssC,kBAAmB,SAAAC,GACjBvsC,EAASssC,GAAkBC,KAE7BsO,eAAgB,SAAAC,GACd96C,EbtPG,CACLzE,KAAM,mBACN+E,QaoP0Bw6C,KAE1BhP,QAAS,SAAAniB,GACP3pB,EAAS8rC,GAAQniB,KAEnBoiB,WAAY,SAAC/iB,EAAQW,EAAMp1B,GACzByL,EAAS+rC,GAAW/iB,EAAQW,KAE9BqiB,WAAY,SAAAhjB,GACVhpB,EAASgsC,GAAWhjB,KAEtBkjB,eAAgB,SAAAnM,GACd//B,EAASksC,GAAenM,KAE1BoM,eAAgB,SAAApM,GACd//B,EAASmsC,GAAepM,KAE1BqM,eAAgB,SAACrM,EAAUxrC,GACzByL,EAASosC,GAAerM,KAE1BI,SAAU,SAACnX,EAAQwjB,EAAQj4C,GACzByL,EAASmgC,GAASnX,EAAQwjB,KAE5BjK,WAAY,SAACvZ,EAAQwjB,EAAQj4C,GAC3ByL,EAASuiC,GAAWvZ,EAAQwjB,KAE9BwI,mBAAoB,SAAChsB,EAAQmuB,EAAaC,EAAe7iD,GACnD4iD,EAAYlhD,OAAS,GACvB+J,EAASmgC,GAASnX,EAAQmuB,IAExBC,EAAcnhD,OAAS,GACzB+J,EAASuiC,GAAWvZ,EAAQouB,KAGhCr1C,aAAc,SAACF,EAAOrE,EAAS+c,GAC7Bva,EAAS+B,GAAaF,EAAOrE,EAAS+c,QAI7B9W,CAA6C42C,ICzSrD,SAASU,GAAe3sC,EAAW4sC,GACxC,MAAO,CACL94C,MAAO,CAAC,eAAe,0BAA0B,0BACjD5B,QAAS,CACPR,QAAU,CACRqC,IAAI,aAAD,OAAeiM,EAAf,cACHhM,OAAQ,OACR3B,KAAMu6C,EACN59C,eAAgB,6CAChBc,aAAc,iCAOf,SAAS+8C,GAAe7sC,EAAW4sC,GACxC,MAAO,CACL94C,MAAO,CAAC,2BAA2B,kCAAkC,kCACrE5B,QAAS,CACPR,QAAU,CACRqC,IAAI,aAAD,OAAeiM,EAAf,cACHhM,OAAQ,MACR3B,KAAMu6C,EACN59C,eAAgB,6CAChBc,aAAc,gCAGlBwf,YAAY,G,cCvBKw9B,G,kDACnB,WAAY3mD,GAAQ,IAAD,8BACjB,cAAMA,IAgBRmI,SAAW,SAACnB,EAAMxE,GAChB,EAAKP,SAAL,eAAgB+E,EAAOxE,IAAQ,WAAK,EAAKokD,oBAlBxB,EAqBnB3+C,SAAW,SAACf,GACVA,EAAEC,iBACF,IAAMs/C,EAAW,CAAC74C,IAAK,EAAK3N,MAAM2N,KAClC,EAAK5N,MAAMoH,OAAOo/C,eAAe,CAACC,cAxBjB,EA2BnBI,SAAW,SAAC3/C,GACV,EAAKjF,SAAS,CAAC2L,IAAK,GAAIk5C,SAAU,KAClC,EAAK9mD,MAAMoH,OAAO2/C,wBA7BD,EAgCnBH,cAAgB,WAEd,IAAK,IAAM9gB,KAAc,EAAK9lC,MAAMgnD,UAAU,CAC5C,IAAMP,EAAW,EAAKzmD,MAAMgnD,UAAUlhB,GACtC,GAAI2gB,EAAS74C,MAAM,EAAK3N,MAAM2N,IAE5B,YADA,EAAK3L,SAAS,CAAC6kD,SAAS,sBAAD,OAAwBL,EAAS74C,IAAjC,sBAK3B5M,MAAM,EAAKf,MAAM2N,KAChBnN,MAAK,SAAAQ,GACJ,IAAMgmD,EAAchmD,EAAS2K,QAAQs7C,IAAI,gBACtCD,IAAgD,IAAjCA,EAAY34B,QAAQ,SAEhCrtB,EAAS2M,MAAM,EAAK3N,MAAM2N,KAE5B,EAAK3L,SAAS,CAAC2L,IAAK3M,EAAS2M,IAAKk5C,SAAU,KAE5C,EAAK7kD,SAAS,CAAC6kD,SAAU,MAE3B,EAAK7kD,SAAS,CAAC6kD,SAAU,8DAG5Bn6C,OAAM,WACL,EAAK1K,SAAS,CAAC6kD,SAAU,+DAzDV,EA6DnB/B,QAAU,WACR,MAA8B,KAAtB,EAAK9kD,MAAM6mD,UAAkC,KAAjB,EAAK7mD,MAAM2N,KA5D/C,EAAK3N,MAAQ,CACX2N,IAAK,GACLk5C,SAAU,IAJK,E,sEAQOv9C,GACY,KAAhCA,EAAU49C,oBACc,KAAtBjlD,KAAKjC,MAAM6mD,UACb5kD,KAAKD,SAAS,CAAC6kD,SAAUv9C,EAAU49C,sBAErCjlD,KAAKD,SAAS,CAAC2L,IAAK,GAAIk5C,SAAU,O,+BAoD5B,IAAD,OACP,OACE,6BACA,8CACA,yBAAKp+C,UAAU,aACb,6BACE,6CACA,kBAAC,GAAD,CACEkV,OAAQ1b,KAAKlC,MAAM4d,OACnBxW,OAAQ,CACN2V,aAAc7a,KAAKlC,MAAMoH,OAAO2V,iBAItC,6BACE,kEACE,0BAAMrU,UAAU,OAAOT,SAAU,SAACf,GAAD,OAAK,EAAKe,SAASf,KAClD,yBAAKwB,UAAU,OACb,yBAAKA,UAAU,SACb,kBAAC,IAAD,eACEmH,GAAG,MACHzH,kBAAkB,eAClBJ,aAAW,eACXK,UAAWnG,KAAKjC,MAAM6mD,SACtB5+C,WAAS,EACT1F,MAAON,KAAKjC,MAAM2N,IAClBzF,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKoB,SAAS,MAAOpB,IACtC4I,SAAUzN,KAAKlC,MAAM2P,UACjBjJ,MAIV,yBAAKb,MAAO,CAAC6E,UAAU,QAASnF,WAAW,KACzC,kBAAC,IAAD,eACEiL,SAA2B,KAAjBtO,KAAKjC,MAAM2N,IACrBpF,MAAM,SACNG,QAAS,SAACzB,GAAD,OAAK,EAAK2/C,SAAS3/C,KACxBvB,IAJN,CAKEE,MAAK,2BAAMF,IAAUE,OAAhB,IAAuBM,YAAa,IACzCwJ,SAAUzN,KAAKlC,MAAM2P,YAEvB,kBAAC,IAAD,eACEa,UAAWtO,KAAK6iD,UAChBt8C,SAAO,EACPD,MAAM,MACNxB,KAAK,SACLrG,KAAK,SACLgI,QAAS,SAACzB,GAAD,OAAK,EAAKe,SAASf,IAC5ByI,SAAUzN,KAAKlC,MAAM2P,UACjBhK,e,GAnHmBtD,a,8BCSpB+kD,G,kDACnB,WAAYpnD,GAAQ,IAAD,8BACjB,cAAMA,IAiBR+b,mBAAqB,SAACvZ,GACpB,EAAKP,SAAS,CAAColD,iBAAiB7kD,KAnBf,EAsBnB2F,SAAW,SAACnB,EAAMxE,GAChB,EAAKP,SAAL,eAAgB+E,EAAOxE,IAAQ,WAAK,EAAKokD,oBAvBxB,EA0BnB3+C,SAAW,SAACf,GACVA,EAAEC,iBACF,IAAMs/C,EAAW,CAAC52C,GAAI,EAAK7P,MAAMymD,SAAS52C,GAAIlP,KAAM,EAAKV,MAAMU,KAAKo+C,QACpE,EAAK98C,SAAS,CAACtB,KAAM,KAAK,WACxB,EAAKX,MAAMoH,OAAOs/C,eAAe,CAACD,aAClC,EAAKzmD,MAAMioB,kBA/BI,EAmCnB4+B,SAAW,SAAC3/C,GACV,EAAKjF,SAAS,CAACtB,KAAM,MApCJ,EAuCnBimD,cAAgB,WACd,IAAK,IAAM9gB,KAAc,EAAK9lC,MAAMgnD,UAAU,CAC5C,IAAMP,EAAW,EAAKzmD,MAAMgnD,UAAUlhB,GACtC,GAAIA,IAAa,EAAK9lC,MAAMymD,SAAS52C,IAAM42C,EAAS9lD,OAAO,EAAKV,MAAMU,KAAKo+C,OAEzE,YADA,EAAK98C,SAAS,CAACqlD,UAAU,uBAAD,OAAyBb,EAAS9lD,KAAlC,sBAEnB,GAAI,EAAKV,MAAMU,KAAKe,OAAO,GAEhC,YADA,EAAKO,SAAS,CAACqlD,UAAU,+CAK7B,EAAKrlD,SAAS,CAACqlD,UAAW,MAnDT,EAsDnBvC,QAAU,WACR,MAA+B,KAAvB,EAAK9kD,MAAMqnD,WAAoC,KAAlB,EAAKrnD,MAAMU,MAAa,EAAKX,MAAMymD,SAAS9lD,OAAO,EAAKV,MAAMU,KAAKo+C,QAvDvF,EA0DnBlgC,kBAAoB,SAAC3X,GACnBA,EAAEC,iBACF,EAAKlF,SAAS,CACZ6c,YAAY,EACZC,SAAU7X,EAAE8X,iBA9DG,EAkEnBE,mBAAqB,SAAC1c,EAAOqO,GAC3B,EAAK5O,SAAS,CACZmP,OAAQ,CAAC5O,QAAOqO,QAChBiO,YAAY,KArEG,EAyEnByoC,gBAAkB,SAAC3wC,EAAO/Q,EAAO+X,GAC/B,IAAM/B,EAAM+B,EAAOhH,GACf4wC,EAAmB,GACvB,GAAI3rC,EAAIgF,WAAY,CAClB,IAAM4mC,EAAmB5rC,EAAIgF,WAAW3W,SAAS,EAAKlK,MAAM6Z,WAC5D,GAA4B,IAAxBgC,EAAIgF,WAAWnf,QAAc+lD,EAC/BD,EAAmB,0BACd,GAA4B,IAAxB3rC,EAAIgF,WAAWnf,OACxB8lD,EAAmB,oBAEnB,GAAIC,EAAkB,CACpB,IAAM5J,EAAUhiC,EAAIgF,WAAWnf,OAAO,EAAG,EAAE,IAAI,GAC/C8lD,EAAmB,2BAA6B3rC,EAAIgF,WAAWnf,OAAO,GAAK,iBAAmBm8C,OAE9F2J,EAAmB,MAAQ3rC,EAAIgF,WAAWnf,OAAS,YAIzD,OAAIma,EACK,yBAAKxK,IAAK,UAAUwK,EAAIrT,MAAO3C,MAAK,aAAG6hD,aAAa,qBAAwB7hD,IACjF,yBAAKA,MAAO,CAACX,OAAO,OAAQmP,QAAQ,OAAQE,WAAW,SAAUuL,SAAS,WACxE,6BACE,yBACEjT,IAAKgP,EAAIjO,IACTd,IAAK,gBAAgB+O,EAAIrT,MACzBxC,MAAM,WAGV,yBAAKH,MAAO,CAACkO,YAAY,QACvB,wBAAIlO,MAAO,CAACH,MAAM,UAAW6J,OAAO,EAAExC,QAAQ,EAAGkY,SAAS,QAAS0iC,UAAU,SAAUC,WAAW,SAAU7nC,aAAa,aAAclE,EAAIrT,OAC1Ig/C,GAEH,yBAAK3hD,MAAO,CAACkO,YAAY,QACvB,kBAAC,KAAD,CACE/L,aAAY,QAAU6T,EAAIrT,MAAQ,cAClC4L,QAASyH,EAAIgF,YAAchF,EAAIgF,WAAWjQ,WAAU,SAACiJ,GAAD,OAAaA,IAAY,EAAK7Z,MAAM6Z,cAAY,EAAE,GAAG,wBACzG5T,UAAW,CAACP,MAAM,UAClBG,MAAQgW,EAAIiqB,aAAa,EAAK9lC,MAAMymD,SAAS52C,IAAMgM,EAAIgF,YAAchF,EAAIgF,WAAWjQ,WAAU,SAACiJ,GAAD,OAAaA,IAAY,EAAK7Z,MAAM6Z,cAAY,EAAG,CAACxF,QAAQ,QAAQ,CAACrO,MAAM,OAAO+G,QAAQ,GACxLpE,QAAS,kBAAI,EAAK3I,MAAMoH,OAAOsZ,WAAW,CAAC7E,EAAIhM,OAE/C,kBAAC,KAAD,OAEF,kBAAC,KAAD,CACE7H,aAAY,UAAY6T,EAAIrT,MAAQ,qBACpC4L,QAAS,iCACTnO,UAAW,CAACP,MAAM,UAClBG,MAAOgW,EAAIiqB,aAAa,EAAK9lC,MAAMymD,SAAS52C,GAAG,CAAC7J,MAAM,OAAO+G,QAAQ,GAAG,CAACsH,QAAQ,QACjF1L,QAAS,WAAK,EAAK1G,SAAS,CAAColD,iBAAiB,OAAQQ,UAAUhsC,MAEhE,kBAAC,KAAD,OAEF,kBAAC,KAAD,CACE7T,aAAY,UAAY6T,EAAIrT,MAC5B4L,QAAS,eACTnO,UAAW,CAACP,MAAM,UAClBiD,QAAS,WACP,EAAK1G,SAAS,CAAColD,iBAAiB,SAAUQ,UAAUhsC,KAEtDhW,MAAO,CAACG,MAAM,OAAO+G,QAAQ,IAE7B,kBAAC,KAAD,UAMD,+BAzIT,EAAK9M,MAAQ,CACXU,KAAMX,EAAMymD,SAAUzmD,EAAMymD,SAAS9lD,KAAK,GAC1C2mD,UAAW,GACXD,iBAAkB,GAClBQ,UAAW,GACXz2C,OAAO,CAAC5O,MAAM,OAAQqO,KAAK,kCAC3BiO,YAAY,GARG,E,sEAYOvV,GACpBA,EAAUk9C,UACZvkD,KAAKD,SAAS,CAACtB,KAAM4I,EAAUk9C,SAAS9lD,S,+BAiIlC,IAAD,OACDmnD,EAAW,0BAAMp/C,UAAU,OAAOT,SAAU,SAACf,GAAD,OAAK,EAAKe,SAASf,KACnE,yBAAKwB,UAAU,OACb,yBAAKA,UAAU,QAAQmH,GAAG,qBAA1B,iBACA,yBAAKnH,UAAU,SACb,kBAAC,IAAD,CACEmH,GAAG,OACHL,kBAAgB,oBAChBhN,MAAON,KAAKjC,MAAMU,KAClB0H,UAAWnG,KAAKjC,MAAMqnD,UACtBn/C,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAKoB,SAAS,OAAQpB,IACvCmB,WAAS,EACT4S,WAAS,OAMjB,GAAI5Y,KAAKlC,MAAMgN,KAAM,CACnB,IAAMuO,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAOtG,KAAKlC,MAAMymD,SAAS52C,GAAG3F,SAAS,OAAO,QAAQ,SACtDzB,SAAS,EACTE,QAASzG,KAAKlC,MAAMioB,cAEtB,kBAAC,IAAD,CACEzf,MAAM,SACNC,SAAS,EACT+H,UAAWtO,KAAK6iD,UAChB/9C,KAAK,SACL2B,QAASzG,KAAK+F,SACdpC,MAAO3D,KAAKlC,MAAMymD,SAAS52C,GAAG3F,SAAS,OAAO,CAACmK,QAAQ,QAAQ,MAG/DuJ,EAAS1b,KAAKlC,MAAMymD,SAAS7oC,OAKjC,MAJ8B,QAA1B1b,KAAKjC,MAAMmR,OAAO5O,QACpBob,EAAS1b,KAAKlC,MAAM4d,QAIpB,6BACE,kBAAC,IAAD,CACErC,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMgN,KACjB8L,eAAgB5W,KAAKlC,MAAMioB,YAC3B7E,UAAW,CAACukC,UAAU,UACtB5uC,uBAAuB,EACvBgvC,wBAAsB,GAExB,4BAAK7lD,KAAKlC,MAAMymD,SAAS52C,GAAG3F,SAAS,OAAQ,cAAc,iBAC3D,yBAAKxB,UAAU,gBACZxG,KAAKlC,MAAMymD,SAAS52C,GAAG3F,SAAS,OAC/B,6BACE,yBAAKrE,MAAO,CAAC6E,UAAU,QAAQg9C,aAAa,sBAC1C,kBAAC,IAAD,CACEl/C,MAAOtG,KAAKjC,MAAMmR,OAAOP,KACzBlI,QAASzG,KAAK2c,kBACdhZ,MAAO,CAAC8wC,UAAU,QAClBj8B,KAAM,kBAAC,KAAD,CAAY7U,MAAO,CAACX,OAAO,QAEjC,kBAAC,KAAD,CACE8H,KAAM9K,KAAKjC,MAAM6e,WACjBC,SAAU7c,KAAKjC,MAAM8e,SACrB4C,aAAc,CAACC,WAAY,OAAQC,SAAU,UAC7CC,aAAc,CAACF,WAAY,OAAQC,SAAU,OAC7C/I,eAAgB,kBAAI,EAAK7W,SAAS,CAAC6c,YAAY,MAE/C,kBAAC,KAAD,KACE,kBAAC,KAAD,CAAUnW,QAAS,kBAAI,EAAKuW,mBAAmB,OAAQ,mCAAmC6C,YAAY,gCACtG,kBAAC,KAAD,CAAUpZ,QAAS,kBAAI,EAAKuW,mBAAmB,MAAO,uBAAuB6C,YAAY,uBAIjG,kBAAC,KAAD,CACE/b,MAAM,OACNd,OAAO,OACP8iD,SAAU,IACVC,UAAWrqC,EAAOlc,OAClBwmD,WAAY,gBAAEtxC,EAAF,EAAEA,MAAO/Q,EAAT,EAASA,MAAT,OAAoB,EAAK0hD,gBAAgB3wC,EAAO/Q,EAAO+X,IACnEuqC,cAAe,GACfC,kBAAmB,OAIvBN,IAIJ,kBAAC,GAAD,CACE96C,KAAM9K,KAAKjC,MAAMonD,iBAAiB3lD,OAAO,EACzCqa,mBAAoB7Z,KAAK6Z,mBACzBJ,aAAczZ,KAAKlC,MAAMoH,OAAOuU,aAChCG,aAAc5Z,KAAKlC,MAAMoH,OAAO0U,aAChCF,KAAM1Z,KAAKjC,MAAM4nD,UAAU,CAAC,CAACr/C,MAAMtG,KAAKjC,MAAM4nD,UAAUr/C,MAAOqH,GAAG3N,KAAKjC,MAAM4nD,UAAUj6C,IAAIpM,MAAM,KAAK6mD,MAAM7mD,MAAM,KAAK,KAAK,CAAC,CAACqO,GAAG,GAAGrH,MAAM,KAC1IkT,WAAYxZ,KAAKjC,MAAMonD,iBACvBprC,YAAa,KAKnB,OAAO,kC,GArP6B5Z,aCXrBimD,G,uKACT,IAAD,OACD/sC,EAAU,CACd,kBAAC,IAAD,CACE/S,MAAM,SACNC,SAAS,EACTE,QAASzG,KAAKlC,MAAMioB,YACpB7M,iBAAe,IAEjB,kBAAC,IAAD,CACE5S,MAAM,SACNG,QAAS,WAAK,EAAK3I,MAAMioB,cAAe,EAAKjoB,MAAMuoD,kBACnDvsC,gBAAgB,UAChBV,WAAW,aAIf,OAAIpZ,KAAKlC,MAAMgN,KAEX,6BACE,kBAAC,IAAD,CACEM,MAAM,gDACNiO,QAASA,EACT1C,OAAO,EACP7L,KAAM9K,KAAKlC,MAAMgN,KACjB8L,eAAgB5W,KAAKlC,MAAMioB,eAM1B,kC,GA/B+B5lB,aCIvBmmD,G,kDACnB,WAAYxoD,GAAQ,IAAD,8BACjB,cAAMA,IASR8nB,WAAa,SAACnnB,EAAMmlC,GAAgB,IAAD,EACjC,EAAK7jC,UAAL,mBAAgBtB,GAAO,GAAvB,iCAA8CmlC,GAA9C,IACA,EAAK9lC,MAAMyZ,aAAY,IAZN,EAenBwO,YAAc,SAACtnB,GACb,EAAKsB,SAAL,eAAgBtB,GAAO,IACvB,EAAKX,MAAMyZ,aAAY,IAjBN,EAoBnB06B,iBAAmB,SAACC,EAAgBqU,GAClC,EAAKxmD,SAAS,CAACmyC,iBAAgBqU,gBAC/B,EAAKzoD,MAAMyZ,YAAY26B,IAtBN,EAyBnBsU,mBAAqB,SAAC5iB,GACpB,IAAM2gB,EAAW,EAAKzmD,MAAMgnD,UAAUlhB,GACtC,OACE,yBAAKz0B,IAAKy0B,GACR,kBAAC6iB,GAAA,KAAD,KACE,yBAAKjgD,UAAU,gBACb,yBAAKA,UAAU,QACb,4BAAK+9C,EAAS9lD,MACd,8BAAO8lD,EAAS74C,MAElB,yBAAKlF,UAAU,cACV+9C,EAAS7oC,OAAOirB,MAAM,EAAE,GAAGh2B,KAAI,SAACgJ,GAAD,OAC9B,4BACExK,IAAKwK,EAAIjO,IACT/H,MAAO,CAACwO,QAAQ,eAAgBP,WAAY,GAAIvN,OAAO,EAAEyI,WAAW,OAAOjC,QAAQ,GACnFpE,QAAS,kBAAI,EAAKwrC,kBAAiB,EAAMt4B,IACzClM,SAAU,EAAK3P,MAAM2P,UAErB,yBACE9C,IAAMgP,EAAIjO,IAAI1D,SAAS,SAAW2R,EAAIiqB,WAAW57B,SAAS,OACnD2R,EAAIjO,IAAMiO,EAAIjO,IAAM,0BAC3Bd,IAAK,gBAAgB+O,EAAIrT,MACzB3C,MAAO,CAACmhB,OAAQ,WAChBhhB,MAAM,eAMhB,kBAAC2iD,GAAA,YAAD,CAAa9iD,MAAO,CAACosC,MAAM,OAAQvnC,UAAU,SAC3C,kBAAC,IAAD,CACElC,MAAM,OACNG,QAAS,kBAAI,EAAKmf,WAAW,WAAYge,IACzCn2B,SAAU,EAAK3P,MAAM2P,WAEvB,kBAAC,IAAD,CACEnH,MAAM,SACNG,QAAS,kBAAI,EAAKmf,WAAW,aAAcge,IAC3Cn2B,SAAU,EAAK3P,MAAM2P,SACrBa,SAAUi2C,EAAS52C,GAAG3F,SAAS,WAIzC,+BAlEF,EAAKjK,MAAQ,CACX2oD,UAAU,EACVC,YAAY,EACZC,iBAAkB,GAClB1U,gBAAgB,EAChBqU,YAAa,CAAC3iB,WAAW,KAPV,E,qDAyET,IAAD,OACP,OACE,yBAAKp9B,UAAU,mBACb,kBAAC,GAAD,CACEs+C,UAAW9kD,KAAKlC,MAAMgnD,UACtB5/C,OAAU,CACR2V,aAAc7a,KAAKlC,MAAMoH,OAAO2V,aAChCypC,eAAetkD,KAAKlC,MAAMoH,OAAOo/C,eACjCO,qBAAqB7kD,KAAKlC,MAAMoH,OAAO2/C,sBAEzCI,oBAAqBjlD,KAAKlC,MAAMmnD,oBAChCvpC,OAAQ1b,KAAKlC,MAAM4d,OACnBjO,SAAUzN,KAAKlC,MAAM2P,WAEvB,kBAAC,GAAD,CACE3C,KAAM9K,KAAKjC,MAAM2oD,SACjB3gC,YAAa,kBAAI,EAAKA,YAAY,aAClCw+B,SAAUvkD,KAAKlC,MAAMgnD,UAAU9kD,KAAKjC,MAAM6oD,kBAC1C9B,UAAW9kD,KAAKlC,MAAMgnD,UACtBppC,OAAQ1b,KAAKlC,MAAM4d,OACnB/D,UAAW3X,KAAKlC,MAAM6Z,UACtBzS,OAAQ,CACNs/C,eAAgBxkD,KAAKlC,MAAMoH,OAAOs/C,eAClChmC,WAAYxe,KAAKlC,MAAMoH,OAAOsZ,WAC9B5E,aAAc5Z,KAAKlC,MAAMoH,OAAO0U,aAChCH,aAAczZ,KAAKlC,MAAMoH,OAAOuU,gBAGpC,kBAAC,GAAD,CACE3O,KAAM9K,KAAKjC,MAAM4oD,WACjB5gC,YAAa,kBAAI,EAAKA,YAAY,eAClCsgC,eAAgB,kBAAI,EAAKvoD,MAAMoH,OAAOmhD,eAAe,CAAC9B,SAAU,CAAC52C,GAAI,EAAK5P,MAAM6oD,uBAElF,6BACA,iDACC5mD,KAAKlC,MAAMgnD,UAAW1kD,OAAO9B,KAAK0B,KAAKlC,MAAMgnD,WAAWn0C,IAAI3Q,KAAKwmD,oBAAsB,GACxF,kBAAC,IAAD,CACE7vC,OAAO,EACP7L,KAAM9K,KAAKjC,MAAMm0C,eACjBt7B,eAAgB,kBAAI,EAAKq7B,kBAAiB,IAC1CjnC,aAAc,CAAC8B,WAAY,OAAQ2nC,UAAW,WAC9CvzB,UAAW,CAACrW,QAAQ,IAEnB7K,KAAKjC,MAAMwoD,YACZ,kBAAC,GAAD,CACE/kB,WAAYxhC,KAAKjC,MAAMwoD,YAAY3iB,WAAW57B,SAAS,OACvDu5B,SAAUvhC,KAAKjC,MAAMwoD,YAAY76C,MAChC,S,GAzHgCvL,a,qBCJxB0mD,G,4MAEnBC,eAAiB,SAACpyC,EAAO/Q,GACvB,IAAMgxC,EAAS,EAAK72C,MAAM+5C,QAAQnjC,GAC5BqyC,EAA8B,MAAnBpS,EAAOzpB,OAAO,GAAU,QAAU,QAC7C9U,EAAoB,UAAb2wC,EAAuB,EAAKjpD,MAAM2uB,OAAOkoB,GAAU,EAAK72C,MAAM8uB,OAAO+nB,GAC5Ep+B,EAAcH,EAAKiV,cAAoC,KAApBjV,EAAKiV,aAAoB,IAAIjV,EAAKiV,aAAa,IAAM,GACxF7U,EAAaJ,EAAK0f,aAAkC,KAAnB1f,EAAK0f,YAAmB,IAAI1f,EAAK0f,YAAY,IAAM,GACpFuoB,EAAY,EAAKvgD,MAAMquB,QAAQC,QAAQhW,EAAK0W,UAAU,EACxDk6B,EACF,yBAAKrjD,MAAO,CAACmO,aAAc,OAAQrL,QAAS,SAACoH,GAAD,OAAUA,EAAMyZ,oBAC1D,kBAAC,KAAD,CACEpV,QAAQ,kBACRpM,aAAY,aAAeu4C,EAAY,IAAM0I,EAAW,cACxDtgD,QAAS,kBAAI,EAAK3I,MAAMmpD,eAAe,CAACtS,GAAS,eAAgB,gBACjElnC,SAAU,EAAK3P,MAAM2P,UAErB,kBAAC,KAAD,QAIFy5C,EAAc,GAGlB,OAFI,EAAKppD,MAAM4rB,gBAAgBI,QAAQ9hB,SAAS2sC,KAC9CuS,EAAc,CAACptC,gBAAiB,YAEhC,yBAAK3K,IAAKiH,EAAKzI,GAAIhK,MAAK,2BAAMA,GAAUujD,GAAc1gD,UAAU,eAAeC,QAAS,SAACoH,GAAD,OAAS,EAAK/P,MAAMgtB,kBAAkB,EAAKhtB,MAAM6P,GAAIgnC,EAAQ9mC,KACnJ,yBAAKrH,UAAU,QACZ,QAAU63C,EAAY,IAAMjoC,EAAKgV,WAAa,IAAM7U,EAAc,IAAMC,GAE1EwwC,I,uDAKG,IAAD,OACP,MAAoB,iBAAhBhnD,KAAKlC,MAAM6P,GAEX,6BACE,kBAAC,KAAD,CACE7J,MAAM,OACNd,OAAO,OACP8iD,SAAU,GACVC,UAAW/lD,KAAKlC,MAAM+5C,QAAQr4C,OAC9BwmD,WAAY,gBAAEtxC,EAAF,EAAEA,MAAO/Q,EAAT,EAASA,MAAT,OAAoB,EAAKmjD,eAAepyC,EAAO/Q,IAC3DsiD,cAAe,GACfC,kBAAmB,OAQzB,kBAAC,KAAD,CACEpiD,MAAM,OACNd,OAAO,OACP8iD,SAAU,GACVC,UAAW/lD,KAAKlC,MAAM+5C,QAAQr4C,OAC9BwmD,WAAY,gBAAEtxC,EAAF,EAAEA,MAAO/Q,EAAT,EAASA,MAAT,OAAoB,EAAKmjD,eAAepyC,EAAO/Q,IAC3DsiD,cAAe,GACfC,kBAAmB,U,GA5Dc/lD,a,qBCCpBgnD,G,4MAEnBC,gBAAkB,SAAC1yC,EAAO/Q,GACxB,IAAMuZ,EAAQ,EAAKpf,MAAM4d,OAAOhH,GAC5BsyC,EACF,yBAAKrjD,MAAO,CAACM,YAAa,QACxB,kBAAC,KAAD,CACEiO,QAAQ,kBACRzL,QAAS,SAACoH,GAASA,EAAMyZ,kBAAkB,EAAKxpB,MAAMmpD,eAAe,CAAC/pC,GAAQ,gBAAiB,iBAC/FzP,SAAU,EAAK3P,MAAM2P,UAErB,kBAAC,KAAD,QAIFy5C,EAAc,GAGlB,OAFI,EAAKppD,MAAM4rB,gBAAgBI,QAAQta,MAAK,SAAAkL,GAAI,OAAIA,EAAKhP,MAAMwR,EAAMxR,KAAOgP,EAAKkpB,aAAa1mB,EAAM0mB,gBAClGsjB,EAAc,CAACptC,gBAAiB,YAEhC,yBAAK3K,IAAKuF,EAAO/Q,MAAK,2BAAMA,GAAUujD,GAAc1gD,UAAU,eAAeC,QAAS,SAACoH,GAAD,OAAS,EAAK/P,MAAMgtB,kBAAkB,EAAKhtB,MAAM6P,GAAIuP,EAAOrP,KAChJ,yBAAKlK,MAAO,CAACwO,QAAS,OAAOE,WAAW,WACtC,yBAAK7L,UAAU,YAAYC,QAAS,SAACzB,GAAKA,EAAEsiB,kBAAkB,EAAKxpB,MAAMm0C,kBAAiB,EAAM/0B,EAAMxR,IAAKwR,EAAM0mB,WAAW57B,SAAS,UACnI,kBAAC,KAAD,CAAYlC,aAAY,QAAUoX,EAAM5W,MAAQ,SAAU4L,QAAQ,aAAazE,SAAU,EAAK3P,MAAM2P,UAClG,kBAAC,KAAD,QAGJ,yBAAKjH,UAAU,OAAO7C,MAAO,CAACia,SAAS,SAAUC,aAAa,WAAYkF,SAAgC,IAAvB,EAAKjlB,MAAMwe,YAAiB,MAC5GY,EAAM5W,MACP,6BACA,8BAAO,EAAKxI,MAAMupD,eAAe5oD,QAGpCuoD,I,uDAKG,IAAD,OACP,MAAoB,kBAAhBhnD,KAAKlC,MAAM6P,GAEX,6BACE,kBAAC,KAAD,CACE7J,MAAM,OACNd,OAAO,OACP8iD,SAAU,GACVC,UAAW/lD,KAAKlC,MAAM4d,OAAOlc,OAC7BwmD,WAAY,gBAAEtxC,EAAF,EAAEA,MAAO/Q,EAAT,EAASA,MAAT,OAAoB,EAAKyjD,gBAAgB1yC,EAAO/Q,IAC5DsiD,cAAe,GACfC,kBAAmB,OAQzB,kBAAC,KAAD,CACEpiD,MAAM,OACNd,OAAO,OACP8iD,SAAU,GACVC,UAAW/lD,KAAKlC,MAAM4d,OAAOlc,OAC7BwmD,WAAY,gBAAEtxC,EAAF,EAAEA,MAAO/Q,EAAT,EAASA,MAAT,OAAoB,EAAKyjD,gBAAgB1yC,EAAO/Q,IAC5DsiD,cAAe,GACfC,kBAAmB,U,GA/De/lD,a,0CCErBmnD,G,4MAEnBR,eAAiB,SAACpyC,GAChB,IAAMigC,EAAS,EAAK72C,MAAM+5C,QAAQnjC,GAC5BqyC,EAA8B,MAAnBpS,EAAOzpB,OAAO,GAAU,QAAU,QAC7C9U,EAAoB,UAAb2wC,EAAuB,EAAKjpD,MAAM2uB,OAAOkoB,GAAU,EAAK72C,MAAM8uB,OAAO+nB,GAC5Ep+B,EAAcH,EAAKiV,cAAoC,KAApBjV,EAAKiV,aAAoB,IAAIjV,EAAKiV,aAAa,IAAM,GACxF7U,EAAaJ,EAAK0f,aAAkC,KAAnB1f,EAAK0f,YAAmB,IAAI1f,EAAK0f,YAAY,IAAM,GACpFuoB,EAAY,EAAKvgD,MAAMquB,QAAQC,QAAQhW,EAAK0W,UAAU,EAExDk6B,EACF,yBAAKrjD,MAAO,CAACmO,aAAc,OAAQrL,QAAS,SAACoH,GAAD,OAAUA,EAAMyZ,oBAC1D,kBAAC,KAAD,CACEpV,QAAiB,IAARwC,EAAU,GAAG,UACtB5O,aAAY,aAAeu4C,EAAY,IAAM0I,EAAW,cACxDtgD,QAAS,kBAAI,EAAK3I,MAAMypD,iBAAiB5S,EAAQ,eAAgB,OACjErmC,SAAkB,IAARoG,EACVjH,SAAU,EAAK3P,MAAM2P,SACrB9J,MAAO,EAAK7F,MAAMwe,aAAa,IAAI,CAACxY,MAAM,GAAGd,OAAO,IAAI,IAExD,kBAAC,KAAD,OAEF,kBAAC,KAAD,CACEkP,QAASwC,IAAQ,EAAK5W,MAAM+5C,QAAQr4C,OAAO,EAAE,GAAG,YAChDsG,aAAY,QAAUyQ,EAAc,QACpC9P,QAAS,kBAAI,EAAK3I,MAAMypD,iBAAiB5S,EAAQ,eAAgB,SACjErmC,SAAUoG,IAAQ,EAAK5W,MAAM+5C,QAAQr4C,OAAO,EAC5CiO,SAAU,EAAK3P,MAAM2P,SACrB9J,MAAO,EAAK7F,MAAMwe,aAAa,IAAI,CAACxY,MAAM,GAAGd,OAAO,IAAI,IAExD,kBAAC,KAAD,OAEF,kBAAC,KAAD,CACEkP,QAAQ,SACRpM,aAAY,UAAYyQ,EACxB9P,QAAS,kBAAI,EAAK3I,MAAM0pD,mBAAmB,CAAC7S,GAAS,eAAgB,gBACrElnC,SAAU,EAAK3P,MAAM2P,UAErB,kBAAC,KAAD,QAIFy5C,EAAc,GAGlB,OAFI,EAAKppD,MAAM4rB,gBAAgBI,QAAQ9hB,SAAS2sC,KAC9CuS,EAAc,CAACptC,gBAAiB,YAEhC,yBAAK3K,IAAKiH,EAAKzI,GAAIhK,MAAK,2BAAMujD,GAAN,IAAmBpjD,MAAO,EAAKhG,MAAMwe,aAAa,KAAK,MAAM,QAAS/D,MAAO,SAAS/R,UAAU,eAAeC,QAAS,SAACoH,GAAD,OAAS,EAAK/P,MAAMgtB,kBAAkB,eAAgB6pB,EAAQ9mC,KAC5M,yBAAKrH,UAAU,OAAO7C,MAAO,CAACwO,QAAS,iBACpC,QAAUksC,EAAY,IAAMjoC,EAAKgV,WAAa,IAAM7U,EAAc,IAAMC,GAG1EwwC,I,EAKPS,oBAAsB,SAAC/yC,GACrB,OAAQ,yBAAKvF,IAAKuF,EAAO/Q,MAAO,CAACG,MAAO,EAAKhG,MAAMwe,aAAa,KAAK,MAAM,QAAS/D,MAAO,OAAQuB,gBAAiB,UAAW1X,YAAY,WAAYoE,UAAU,kB,EAGnK4gD,gBAAkB,SAAC1yC,GACjB,IAAMwI,EAAQ,EAAKpf,MAAM4d,OAAOhH,GAC5BsyC,EACF,yBAAKrjD,MAAO,CAACmO,aAAc,OAAQrL,QAAS,SAACoH,GAAD,OAAUA,EAAMyZ,oBAC1D,kBAAC,KAAD,CACEpV,QAAiB,IAARwC,EAAU,GAAG,UACtB5O,aAAY,QAAUoX,EAAM5W,MAAQ,MACpCG,QAAS,kBAAI,EAAK3I,MAAMypD,iBAAiBrqC,EAAO,gBAAiB,OACjE5O,SAAkB,IAARoG,EACVjH,SAAU,EAAK3P,MAAM2P,UAErB,kBAAC,KAAD,OAEF,kBAAC,KAAD,CACEyE,QAASwC,IAAQ,EAAK5W,MAAM4d,OAAOlc,OAAO,EAAE,GAAG,YAC/CsG,aAAY,QAAUoX,EAAM5W,MAAQ,QACpCG,QAAS,kBAAI,EAAK3I,MAAMypD,iBAAiBrqC,EAAO,gBAAiB,SACjEzP,SAAU,EAAK3P,MAAM2P,SACrBa,SAAUoG,IAAQ,EAAK5W,MAAM4d,OAAOlc,OAAO,GAE3C,kBAAC,KAAD,OAEF,kBAAC,KAAD,CACE0S,QAAQ,SACRpM,aAAY,UAAYoX,EAAM5W,MAC9BG,QAAS,kBAAI,EAAK3I,MAAM0pD,mBAAmB,CAACtqC,GAAQ,gBAAiB,iBACrEzP,SAAU,EAAK3P,MAAM2P,UAErB,kBAAC,KAAD,QAIFy5C,EAAc,GACd,EAAKppD,MAAM4rB,gBAAgBI,QAAQta,MAAK,SAAAkL,GAAI,OAAIA,EAAKhP,MAAMwR,EAAMxR,KAAOgP,EAAKkpB,aAAa1mB,EAAM0mB,gBAClGsjB,EAAc,CAACptC,gBAAiB,YAClC,IAAI4tC,EAAe,EAAK5pD,MAAMgnD,UAAU5nC,EAAM0mB,YAAYnlC,KAM1D,OALI,EAAKX,MAAMwe,aAAa,IAC1BorC,EAAeA,EAAa3rC,UAAU,EAAE,GAAK,MACpC,EAAKje,MAAMwe,aAAa,OACjCorC,EAAeA,EAAa3rC,UAAU,EAAE,IAAM,OAG9C,yBAAK5M,IAAK,QAAQuF,EAAO/Q,MAAK,2BAAMujD,GAAN,IAAmBpjD,MAAO,EAAKhG,MAAMwe,aAAa,KAAK,MAAM,QAAS/D,MAAO,UAAU/R,UAAU,eAAeC,QAAS,SAACoH,GAAD,OAAS,EAAK/P,MAAMgtB,kBAAkB,gBAAiB5N,EAAOrP,KACnN,yBAAKlK,MAAO,CAACwO,QAAQ,OAAOE,WAAW,WACrC,yBAAK7L,UAAU,YAAYC,QAAS,SAACzB,GAAKA,EAAEsiB,kBAAkB,EAAKxpB,MAAMm0C,kBAAiB,EAAM/0B,EAAMxR,IAAKwR,EAAM0mB,WAAW57B,SAAS,UACnI,kBAAC,KAAD,CAAYlC,aAAY,QAAUoX,EAAM5W,MAAQ,SAAU4L,QAAQ,aAAazE,SAAU,EAAK3P,MAAM2P,UAClG,kBAAC,KAAD,QAGJ,yBAAKjH,UAAU,OAAO7C,MAAO,CAACia,SAAS,SAAUC,aAAa,WAAYkF,SAAiC,IAAvB,EAAKjlB,MAAMwe,YAAiB,MAC7GY,EAAM5W,MACP,6BACA,8BAAOohD,KAGVV,I,EAMPW,qBAAuB,SAACjzC,GACtB,OAAQ,yBAAKvF,IAAKuF,EAAO/Q,MAAO,CAACG,MAAO,EAAKhG,MAAMwe,aAAa,KAAK,MAAM,QAAS/D,MAAO,QAASuB,gBAAiB,UAAW1X,YAAY,WAAYoE,UAAU,kB,EAIpKw/C,WAAa,SAACtxC,EAAO/Q,GACnB,OACE,yBAAKwL,IAAK,YAAYuF,EAAO/Q,MAAK,eAAMA,IACrC,EAAK7F,MAAM+5C,QAAQnjC,GAClB,EAAKoyC,eAAepyC,GAEpB,EAAK+yC,oBAAoB/yC,GAE1B,EAAK5W,MAAM4d,OAAOhH,GACjB,EAAK0yC,gBAAgB1yC,GAErB,EAAKizC,qBAAqBjzC,K,uDAOxB,IAAD,OACP,OAAgC,IAA5B1U,KAAKlC,MAAM+5C,QAAQr4C,QAAyC,IAA3BQ,KAAKlC,MAAM4d,OAAOlc,OAEnD,yBAAKgH,UAAU,WAAU,8EAK3B,kBAAC,KAAD,CACE1C,MAAM,OACNd,OAAO,OACP8iD,SAAU,GACVC,UAAW/lC,KAAKue,IAAIv+B,KAAKlC,MAAM+5C,QAAQr4C,OAAQQ,KAAKlC,MAAM4d,OAAOlc,QACjEwmD,WAAY,gBAAEtxC,EAAF,EAAEA,MAAO/Q,EAAT,EAASA,MAAT,OAAoB,EAAKqiD,WAAWtxC,EAAO/Q,IACvDsiD,cAAe,GACfC,kBAAmB,U,GA/JW/lD,aCEjBynD,G,kDAEnB,WAAY9pD,GAAQ,IAAD,8BACjB,cAAMA,IA2BR+pD,aAAe,SAAC/pD,GAId,IAJwB,IAEhB2uB,EAAuC3uB,EAAvC2uB,OAAQsrB,EAA+Bj6C,EAA/Bi6C,SAAUnrB,EAAqB9uB,EAArB8uB,OAAQorB,EAAal6C,EAAbk6C,SAC9B8P,EAAe,GACnB,MAAqB1nD,OAAOugC,QAAQ7iC,EAAMgnD,WAA1C,eAAsD,CAAjD,IAAIP,EAAQ,KACfuD,EAAeA,EAAajyC,OAAO0uC,EAAS,GAAG7oC,QAC3B,cAAhB6oC,EAAS,KACXuD,EAAeA,EAAalR,MAAK,SAACn3C,EAAGG,GAAJ,OAAWH,EAAE6G,MAAQ1G,EAAE0G,MAAS,GAAK,MAG1E,IAVwB,EAUpByhD,EAAc,aAAIhQ,GAAUpnC,KAAI,SAAC+b,EAAShY,GAAV,MAAoB,CAACgY,EAASsrB,EAAStjC,OAAS4hB,QAAO,SAAC72B,EAAEG,GAAH,OAAQH,EAAEoW,OAAOjW,KAAI,IAC5GooD,EAAgB,GAChBC,EAAe,GAZK,eAcHF,GAdG,IAcxB,2BAAkC,CAAC,IAAxBpT,EAAuB,QAC1Bv+B,EAA0B,MAAnBu+B,EAAOzpB,OAAO,GAAWuB,EAAOkoB,GAAU/nB,EAAO+nB,GAC1Dv+B,EAAK8G,MAAM5W,QACb2hD,EAAargD,KAAK+sC,GAClBqT,EAAcpgD,KAAKwO,EAAK8G,SAlBJ,8BAsBxB4qC,EAAeA,EAAa54C,QAAO,SAAAg5C,GAAY,OAAKF,EAAcx4C,MAAK,SAAA24C,GAAQ,OAAIA,EAASz8C,MAAMw8C,EAAax8C,KAAOy8C,EAASvkB,aAAaskB,EAAatkB,iBACzJmkB,EAAcA,EAAY74C,QAAO,SAAAylC,GAAM,OAAKsT,EAAajgD,SAAS2sC,MAClE,EAAK50C,SAAS,CAAC+nD,eAAcC,cAAaE,eAAcD,gBAAeI,eAAe,CAACN,eAAcC,cAAaE,eAAcD,oBApD/G,EAuDnBK,qBAAuB,SAAAzB,GAAgB,OAAI,EAAK7mD,SAAS,CAACsnD,eAAgB,EAAKvpD,MAAMgnD,UAAU8B,MAvD5E,EAyDnB3U,iBAAmB,SAACC,EAAgBxmC,EAAK48C,GAAW,EAAKxqD,MAAMyZ,YAAY26B,GAAiB,EAAKnyC,SAAS,CAACmyC,iBAAgBqU,YAAa,CAAC76C,MAAK48C,YAzD3H,EA2DnBC,aAAe,WAAO,IAAD,EACgD,EAAKxqD,MAAMqqD,eAAtEN,EADW,EACXA,aAAcC,EADH,EACGA,YAAaE,EADhB,EACgBA,aAAcD,EAD9B,EAC8BA,cAE3CX,EAAiB,EAAKvpD,MAAMgnD,UAAU1kD,OAAO9B,KAAK,EAAKR,MAAMgnD,WAAW,IAC9E,EAAK/kD,SAAS,CAAE+nD,eAAcC,cAAaE,eAAcD,gBAAet+B,gBAFhD,CAAC5kB,KAAM,GAAIglB,QAAS,GAAI6sB,aAAc,MAE2B0Q,oBA/DxE,EAkEnBv8B,kBAAoB,SAAChmB,EAAMixC,EAAQloC,GACjC,IAOM6G,EAPFgV,EAAe,2BAAO,EAAK3rB,MAAM2rB,iBAAlB,IAAmCI,QAAQ,aAAK,EAAK/rB,MAAM2rB,gBAAgBI,YAC1Fjc,EAAM2V,SAAW3V,EAAM4V,cAA8Bnc,IAAlBuG,EAAMmoC,WAAyBnoC,EAAMmoC,UAAUC,WAEhFvsB,EAAgB5kB,OAASA,IAC3B4kB,EAAgBI,QAAU,GAC1BJ,EAAgB5kB,KAAOA,IAOf,KAHR4P,EADE5P,EAAKkD,SAAS,SACR0hB,EAAgBI,QAAQpb,WAAU,SAAAopB,GAAM,OAAIA,EAAOpsB,MAAMqqC,EAAOrqC,KAAOosB,EAAO8L,aAAamS,EAAOnS,cAElGla,EAAgBI,QAAQsC,QAAQ2pB,IAC3BrsB,EAAgBI,QAAQ5S,OAAOxC,EAAO,GAAKgV,EAAgBI,QAAQliB,KAAKmuC,IAEzF,GAAqB,IAAjBloC,EAAMqoC,aAAkC5uC,IAAlBuG,EAAMmoC,UAAuB,CACrD,IAAIG,OAA0B7uC,IAAlBuG,EAAM2V,UAA0B3V,EAAM2V,UAAY3V,EAAMuoC,SAChEC,OAAyB/uC,IAAlBuG,EAAM4V,UAA0B5V,EAAM4V,UAAY5V,EAAMuoC,SAC/DE,OAAiChvC,IAApBuG,EAAMmoC,YAA4BnoC,EAAMmoC,UAAUC,UAAYpoC,EAAMmoC,UAAUr2C,MAU/F,IATKw2C,GAASE,GAASC,KAEjB5sB,EAAgBI,QAAQ9hB,SAAS+tC,GACnCrsB,EAAgBI,QAAU,GAG1BJ,EAAgBI,QAAU,CAACisB,IAG3BloC,EAAMuoC,eAA+B9uC,IAAlBuG,EAAMmoC,WAAyBnoC,EAAMmoC,UAAUr2C,MAGpE,GAFAhB,OAAO43C,eAAeC,kBAElB9sB,EAAgB5kB,OAASA,EAC3B4kB,EAAgBI,QAAU,CAACisB,OACtB,CAEL,IACIyS,EAAuBC,EADvBC,EAAU,aAAO,EAAK3qD,MAAM+G,IAE5BA,EAAKkD,SAAS,UAChBwgD,EAAwBE,EAAWh6C,WAAU,SAAAopB,GAAM,OAAIA,EAAOpsB,MAAMqqC,EAAOrqC,KAAOosB,EAAO8L,aAAamS,EAAOnS,cAC7G6kB,EAAqBC,EAAWh6C,WAAU,SAAAopB,GAAM,OAAIA,EAAOpsB,MAAMge,EAAgBitB,aAAajrC,KAAOosB,EAAO8L,aAAala,EAAgBitB,aAAa/S,gBAGtJ4kB,EAAwBE,EAAWt8B,QAAQ2pB,GAC3C0S,EAAqBC,EAAWt8B,QAAQ1C,EAAgBitB,eAE1D,IAAID,EAAU,CAAC+R,EAAoBD,GACnC9R,EAAQE,MAAK,SAACn3C,EAAGG,GAAO,OAAOH,EAAEG,KACjC,IAAMi3C,EAAe,aAAOntB,EAAgBI,SAC5CJ,EAAgBI,QAAU4+B,EAAW/hB,MAAM+P,EAAQ,GAAIA,EAAQ,GAAG,GAf7D,qBAgBcG,GAhBd,IAgBL,2BAAmC,CAAC,IAA3Bd,EAA0B,QAC5BrsB,EAAgBI,QAAQ9hB,SAAS+tC,IACpCrsB,EAAgBI,QAAQliB,KAAKmuC,IAlB5B,gCAuB4B,IAAnCrsB,EAAgBI,QAAQtqB,OAC1BkqB,EAAgB5kB,KAAO,IAEvB4kB,EAAgB5kB,KAAOA,EACvB4kB,EAAgBitB,aAAeZ,GAEjC,EAAKh2C,SAAS,CAAE2pB,qBAhIC,EAmInB69B,iBAAmB,SAAC7sC,EAAMiuC,EAAc19C,GACtC,IACI29C,EADAC,EAAW,aAAO,EAAK9qD,MAAM4qD,IAG/BC,EADiB,kBAAfD,EACYE,EAAYn6C,WAAU,SAAAwO,GAAK,OAAIA,EAAMxR,MAAMgP,EAAKhP,KAAOwR,EAAM0mB,aAAalpB,EAAKkpB,cAE/EilB,EAAYz8B,QAAQ1R,GAEpC,IAAMouC,EAAiC,SAAX79C,EAAoB29C,EAAY,EAAIA,EAAY,EACtEG,EAAcF,EAAYC,GAChCD,EAAYD,GAAeG,EAC3BF,EAAYC,GAAuBpuC,EACnC,EAAK3a,SAAL,eAAiB4oD,EAAeE,KA/If,EAkJnB5B,eAAiB,WAA+E,IAAD,EAEzF+B,EAFYC,EAA6E,uDAAvE,EAAKlrD,MAAM2rB,gBAAgBI,QAAS6+B,EAAmC,uCAArBO,EAAqB,uCACzFL,EAAW,uBAAO,EAAK9qD,MAAM4qD,IAAlB,aAAoCM,IAGjDD,EADiB,kBAAfL,EACgB,aAAI,EAAK5qD,MAAMmrD,IAAmBh6C,QAAO,SAAAgO,GAAK,OAAK+rC,EAAMz5C,MAAK,SAAAkL,GAAI,OAAIA,EAAKhP,MAAMwR,EAAMxR,KAAOgP,EAAKkpB,aAAa1mB,EAAM0mB,iBAEtH,aAAI,EAAK7lC,MAAMmrD,IAAmBh6C,QAAO,SAAAwL,GAAI,OAAKuuC,EAAMjhD,SAAS0S,MAErF,IAAIgP,EAAe,2BAAO,EAAK3rB,MAAM2rB,iBAAlB,IAAmCI,QAAQ,aAAK,EAAK/rB,MAAM2rB,gBAAgBI,WAC9FJ,EAAgB5kB,KAAO6jD,EACvB,EAAK5oD,UAAL,mBAAiB4oD,EAAeE,GAAhC,cAA8CK,EAAmBF,GAAjE,gCAAkFt/B,GAAlF,KA5JiB,EA+JnB89B,mBAAqB,WAA+E,IAAD,EAE7FqB,EAFgBI,EAA6E,uDAAvE,EAAKlrD,MAAM2rB,gBAAgBI,QAAS6+B,EAAmC,uCAArBO,EAAqB,uCAC7FF,EAAe,uBAAO,EAAKjrD,MAAMmrD,IAAlB,aAAwCD,IAExC,kBAAfN,GACFE,EAAc,aAAI,EAAK9qD,MAAM4qD,IAAez5C,QAAO,SAAAgO,GAAK,OAAK+rC,EAAMz5C,MAAK,SAAAkL,GAAI,OAAIA,EAAKhP,MAAMwR,EAAMxR,KAAOgP,EAAKkpB,aAAa1mB,EAAM0mB,iBAChIolB,EAAgBpS,MAAK,SAACn3C,EAAGG,GAAJ,OAAQ,EAAK7B,MAAMqqD,eAAec,GAAkBx6C,WAAU,SAAAwO,GAAK,OAAIA,EAAMxR,MAAMjM,EAAEiM,KAAOwR,EAAM0mB,aAAankC,EAAEmkC,cAAc,EAAK7lC,MAAMqqD,eAAec,GAAkBx6C,WAAU,SAAAwO,GAAK,OAAIA,EAAMxR,MAAM9L,EAAE8L,KAAOwR,EAAM0mB,aAAahkC,EAAEgkC,cAAc,GAAK,OAGhRilB,EAAc,aAAI,EAAK9qD,MAAM4qD,IAAez5C,QAAO,SAAAwL,GAAI,OAAKuuC,EAAMjhD,SAAS0S,MAC3EsuC,EAAgBpS,MAAK,SAACn3C,EAAGG,GAAJ,OAAQ,EAAK7B,MAAMqqD,eAAec,GAAkB98B,QAAQ3sB,GAAK,EAAK1B,MAAMqqD,eAAec,GAAkB98B,QAAQxsB,GAAK,GAAK,MAEtJ,IAAI8pB,EAAe,2BAAO,EAAK3rB,MAAM2rB,iBAAlB,IAAmCI,QAAQ,aAAK,EAAK/rB,MAAM2rB,gBAAgBI,WAC9FJ,EAAgB5kB,KAAOokD,EACvB,EAAKnpD,UAAL,mBAAiB4oD,EAAeE,GAAhC,cAA8CK,EAAmBF,GAAjE,gCAAkFt/B,GAAlF,KA5KiB,EA+KnBy/B,iBAAmB,WAEjB,IAAMlB,EAAe,EAAKlqD,MAAMkqD,aAC1BmB,EAAsB,EAAKrrD,MAAMqqD,eAAeH,aAClDoB,EAA0BpB,EAAazoD,SAAS4pD,EAAoB5pD,QAAUyoD,EAAarV,OAAM,SAAC/tC,EAAEiR,GAAH,OAASjR,IAAIukD,EAAoBtzC,MAEhIkyC,EAAgB,EAAKjqD,MAAMiqD,cAC3BsB,EAAuB,EAAKvrD,MAAMqqD,eAAeJ,cACnDuB,EAA2BvB,EAAcxoD,SAAS8pD,EAAqB9pD,QAAUwoD,EAAcpV,OAAM,SAAC/tC,EAAEiR,GAAH,OAASjR,EAAE6G,MAAM49C,EAAqBxzC,GAAGpK,KAAO7G,EAAE++B,aAAa0lB,EAAqBxzC,GAAG8tB,cAE1L4lB,EAAYH,GAA2BE,EAE7C,OADsB,EAAKxrD,MAAMkqD,aAAazoD,SAAS,EAAKzB,MAAMiqD,cAAcxoD,QACxDgqD,GA3LP,EA8LnBC,oBAAsB,WACpB,IAD0B,EACtBC,EAAkB,SAASxsC,GAC7B,OAAOld,KAAKuW,aAAe2G,EAAM5W,MAAM0B,SAAShI,KAAKuW,YAAY+D,gBAFzC,eAIL,EAAKvc,MAAMgqD,aAJN,IAI1B,2BAA6C,CAAC,IAAnCpT,EAAkC,QACrCv+B,EAA0B,MAAnBu+B,EAAOzpB,OAAO,GAAW,EAAKptB,MAAM2uB,OAAOkoB,GAAU,EAAK72C,MAAM8uB,OAAO+nB,GAEpF,GAAI,EAAK52C,MAAM+pD,aAAat4C,KAAKk6C,EAAiB,CAACnzC,YAAaH,EAAKiV,eAAgB,OAAO,GAPpE,8BAS1B,OAAO,GAvMU,EA0MnBs+B,UAAY,WACV,IADgB,EACZC,EAAoB,SAAS1sC,GAC/B,IAAI2sC,EAAiB3sC,EAAM5W,MAAMhH,MAAM,KAEvC,OADYuqD,EAAeA,EAAerqD,OAAO,GACpCsqD,SAAS9pD,KAAKoW,KAAKiV,aAAa/Q,gBAE3CyvC,EAAiB,GACjBC,EAAkB,GAPN,eAQK,EAAKjsD,MAAMgqD,aARhB,IAQhB,2BAA6C,CAAC,IAAnCpT,EAAkC,QACrCv+B,EAA0B,MAAnBu+B,EAAOzpB,OAAO,GAAW,EAAKptB,MAAM2uB,OAAOkoB,GAAU,EAAK72C,MAAM8uB,OAAO+nB,GAC9Ez3B,EAAQ,EAAKnf,MAAM+pD,aAAat4C,KAAKo6C,EAAmB,CAACxzC,SAC3D8G,IACF6sC,EAAeniD,KAAK+sC,GACpBqV,EAAgBpiD,KAAKsV,KAbT,8BAgBhB,EAAK+pC,eAAe8C,EAAgB,eAAgB,eACpD,EAAK9C,eAAe+C,EAAiB,gBAAiB,iBA3NrC,EA8NnBC,cAAgB,WACd,IADoB,EAChBC,EAAkB,GAClBC,EAAuB,GACvBC,EAAmB,EAAKrsD,MAAMkqD,aAAat3C,KAAI,SAACgkC,EAAQ7+B,GAAT,MAAe,CAAC6+B,EAAQ,EAAK52C,MAAMiqD,cAAclyC,OAHhF,eAIQs0C,GAJR,IAIpB,2BAA6C,CAAC,IAAD,0BAAnCzV,EAAmC,KAA3Bz3B,EAA2B,KAC3CgtC,EAAgBtiD,KAAK,CAAE+F,GAAIgnC,EAAQzmB,WAAY,CAAChR,YAL9B,mDAOD,EAAKnf,MAAMqqD,eAAeH,cAPzB,IAOpB,2BAA2D,CAAC,IAAnDtT,EAAkD,SACV,IAA3C,EAAK52C,MAAMkqD,aAAa77B,QAAQuoB,IAClCwV,EAAqBviD,KAAK,CAAE+F,GAAIgnC,EAAQzmB,WAAY,CAAChR,MAAO,OAT5C,8BAWpB,EAAKpf,MAAMusD,iBAAiBH,EAAgBr0C,OAAOs0C,IAEnD,EAAKpqD,SAAS,CACZqoD,eAAgB,CAACJ,cAAe,EAAKjqD,MAAMiqD,cAAeC,aAAc,EAAKlqD,MAAMkqD,aAAcH,aAAc,EAAK/pD,MAAM+pD,aAAcC,YAAa,EAAKhqD,MAAMgqD,gBA5OjJ,EAgPnBuC,mBAAqB,SAACz7C,GACpB,IAAM07C,EAAW17C,EAAS,WACpB27C,EAAU37C,EAAS,UACzB,OACE,kBAAC,IAAD,eACEtI,SAAO,EACPD,MAAO,EAAKxI,MAAMwe,aAAa,IAAI,SAAI,yBACvC7V,QAAS,kBAAI,EAAKwgD,oBAAe3/C,EAAWijD,EAAUC,IACtDl8C,SAAsD,IAA5C,EAAKvQ,MAAM2rB,gBAAgBI,QAAQtqB,QAAc,EAAKzB,MAAM2rB,gBAAgB5kB,OAAO0lD,GACzF/mD,IALN,CAMEE,MAAK,2BAAMF,IAAUE,OAAhB,IAAuBM,YAAY,UACxCwJ,SAAU,EAAK3P,MAAM2P,aA3PR,EA+PnBg9C,qBAAuB,SAAC57C,GACtB,IAAM07C,EAAW17C,EAAS,WACpB27C,EAAU37C,EAAS,UACzB,OACE,kBAAC,IAAD,eACEtI,SAAO,EACPD,MAAO,EAAKxI,MAAMwe,aAAa,IAAI,SAAI,yBACvC7V,QAAS,kBAAI,EAAK+gD,wBAAmBlgD,EAAWijD,EAAUC,IAC1Dl8C,SAAsD,IAA5C,EAAKvQ,MAAM2rB,gBAAgBI,QAAQtqB,QAAc,EAAKzB,MAAM2rB,gBAAgB5kB,OAAOylD,EAC7F98C,SAAU,EAAK3P,MAAM2P,UACjBhK,OAvQR,EAAK1F,MAAQ,CACXiqD,cAAe,GACfC,aAAc,GACdH,aAAc,GACdC,YAAa,GACbV,eAAgB,EAAKvpD,MAAMgnD,UAAU1kD,OAAO9B,KAAK,EAAKR,MAAMgnD,WAAW,IACvEsD,eAAgB,CAACJ,cAAe,GAAIC,aAAc,GAAIH,aAAc,GAAIC,YAAa,IACrFr+B,gBAAiB,CAAC5kB,KAAM,GAAIglB,QAAS,GAAI6sB,aAAc,MACvDzE,gBAAgB,EAChBqU,YAAa,MAXE,E,iEAgBjBvmD,KAAK6nD,aAAa7nD,KAAKlC,S,gDAGCuJ,GACxB,IAAIyiB,EAAU,GACY,KAAtBziB,EAAUqX,YACZoL,EAAO,aAAO9pB,KAAKjC,MAAMsJ,EAAUqX,aACrC,IAAMgL,EAAkB,CAAC5kB,KAAMuC,EAAUqX,UAAWoL,UAAS6sB,aAAc7sB,GAAS,IACpF9pB,KAAKD,SAAS,CAAE2pB,oBACZriB,EAAUolB,SAASzsB,KAAKlC,MAAM2uB,QAAQplB,EAAUulB,SAAS5sB,KAAKlC,MAAM8uB,QAAQ5sB,KAAK6nD,aAAaxgD,K,+BAsP1F,IAAD,OACP,GAAIjH,OAAO9B,KAAK0B,KAAKlC,MAAMgnD,WAAWtlD,OAAO,EAC3C,OACE,yBAAKmE,MAAO,CAACkO,YAAa,MAAOxO,WAAW,QAC1C,+CACA,uHAKN,IAAMqnD,EACJ,kBAAC,GAAD,CACE7S,QAAS73C,KAAKjC,MAAMkqD,aACpBx7B,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnBlR,OAAQ1b,KAAKjC,MAAMiqD,cACnBX,eAAgBrnD,KAAKjC,MAAMspD,eAC3BvC,UAAW9kD,KAAKlC,MAAMgnD,UACtB7S,iBAAkBjyC,KAAKiyC,iBACvBnnB,kBAAmB9qB,KAAK8qB,kBACxBpB,gBAAiB1pB,KAAKjC,MAAM2rB,gBAC5B69B,iBAAkBvnD,KAAKunD,iBACvBC,mBAAoBxnD,KAAKwnD,mBACzB/5C,SAAUzN,KAAKlC,MAAM2P,SACrB0e,QAASnsB,KAAKlC,MAAMquB,QACpB7P,YAAatc,KAAKlC,MAAMwe,cAItBquC,EACJ,yBAAKnkD,UAAU,aACb,6BACGxG,KAAKsqD,mBAAmB,QACxBtqD,KAAKyqD,qBAAqB,SAE7B,6BACE,kBAAC,IAAD,CACEnkD,MAAM,YACNG,QAASzG,KAAK2pD,UACdr7C,SAAUtO,KAAKypD,sBACfh8C,SAAUzN,KAAKlC,MAAM2P,YAGzB,6BACGzN,KAAKsqD,mBAAmB,SACxBtqD,KAAKyqD,qBAAqB,WAK3B1C,EACJ,yBAAKvhD,UAAU,eACb,yBAAKA,UAAU,YACb,yBAAKA,UAAU,SAAf,kBAEF,yBAAKA,UAAU,aAAaoG,KAAK,SAAS9G,aAAW,iBACnD,kBAAC,GAAD,CACE6H,GAAI,cACJkqC,QAAS73C,KAAKjC,MAAMgqD,YACpBt7B,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnB9B,kBAAmB9qB,KAAK8qB,kBACxBpB,gBAAiB1pB,KAAKjC,MAAM2rB,gBAC5Bu9B,eAAgBjnD,KAAKinD,eACrBx5C,SAAUzN,KAAKlC,MAAM2P,SACrB0e,QAASnsB,KAAKlC,MAAMquB,YAMtB27B,EACJ,yBAAKthD,UAAU,gBACb,yBAAKA,UAAU,YACb,yBAAKA,UAAU,SAAf,iBACA,yBAAKA,UAAU,qBACb,yBAAKA,UAAU,OAAQoG,KAAK,SAAS9G,aAAW,sBAC9C,kBAAC,GAAD,CACEQ,MAAM,kBACNqH,GAAG,iBACHrN,MAAON,KAAKjC,MAAMspD,eAAe15C,GACjC1H,SAAU,SAAC29B,GAAD,OAAc,EAAKykB,qBAAqBzkB,IAClDn2B,SAAUzN,KAAKlC,MAAM2P,SACrBzD,KAAM5J,OAAOugC,QAAQ3gC,KAAKlC,MAAMgnD,WAAWn0C,KAAI,YAA2B,IAAD,oBACvE,MAAO,CAACrQ,MAD+D,KAC5CqO,KAD4C,KAC7BlQ,cAOpD,yBAAKmO,KAAK,SAAS9G,aAAW,iBAC5B,kBAAC,GAAD,CACE6H,GAAI,eACJ+N,OAAQ1b,KAAKjC,MAAM+pD,aAAa54C,QAAO,SAAAg5C,GAAY,OAAIA,EAAatkB,aAAa,EAAK7lC,MAAMspD,eAAe15C,MAC3G05C,eAAgBrnD,KAAKjC,MAAMspD,eAC3BvC,UAAW9kD,KAAKlC,MAAMgnD,UACtB7S,iBAAkBjyC,KAAKiyC,iBACvBnnB,kBAAmB9qB,KAAK8qB,kBACxBpB,gBAAiB1pB,KAAKjC,MAAM2rB,gBAC5Bu9B,eAAgBjnD,KAAKinD,eACrBx5C,SAAUzN,KAAKlC,MAAM2P,SACrB6O,YAAatc,KAAKlC,MAAMwe,gBAM1BsuC,EACJ,yBAAKpkD,UAAU,eACb,yBAAKA,UAAU,WAAf,WAAkCxG,KAAKjC,MAAMkqD,aAAazoD,OAA1D,aAA4EQ,KAAKjC,MAAMiqD,cAAcxoD,OAArG,WACA,yBAAKgH,UAAU,UAAUoG,KAAK,SAAS9G,aAAW,mBAChD,kBAAC,IAAD,CACEQ,MAAM,gBACNG,QAASzG,KAAKuoD,aACd5kD,MAAO,CAACM,YAAa,IACrBwJ,SAAUzN,KAAKlC,MAAM2P,WAEvB,kBAAC,IAAD,CACElH,SAAO,EACP+H,SAAUtO,KAAKmpD,mBACf7iD,MAAM,iBACNG,QAASzG,KAAKiqD,cACdx8C,SAAUzN,KAAKlC,MAAM2P,aAMvBo9C,EACJ,kBAAC,IAAD,CACEl0C,OAAO,EACP7L,KAAM9K,KAAKjC,MAAMm0C,eACjBt7B,eAAgB,kBAAI,EAAKq7B,kBAAiB,IAC1CjnC,aAAc,CAAC8B,WAAY,OAAQ2nC,UAAW,WAC9CvzB,UAAW,CAACrW,QAAQ,IAEpB,kBAAC,GAAD,CACE22B,aAAYxhC,KAAKjC,MAAMwoD,aAAavmD,KAAKjC,MAAMwoD,YAAY+B,MAC3D/mB,SAAUvhC,KAAKjC,MAAMwoD,YAAavmD,KAAKjC,MAAMwoD,YAAY76C,IAAM,MAKrE,OACE,yBAAKlF,UAAU,eACb,yBAAKA,UAAU,YACb,yBAAKA,UAAU,SAASoG,KAAK,SAAS9G,aAAW,aAC9C4kD,IAGJC,EACD,yBAAKnkD,UAAU,eACZuhD,EACAD,GAEF8C,EACAC,O,GA9a8B1qD,aCsBjC2qD,G,kDAEJ,WAAYhtD,GAAQ,IAAD,8BACjB,cAAMA,IAeRgrC,cAAgB,WACd,EAAK/oC,SAAS,CAACuc,YAAY3d,OAAOwE,cAjBjB,EAoBnBmhD,eAAiB,SAACC,GAChB,EAAKzmD,MAAMwmD,eAAe,EAAKxmD,MAAM6Z,UAAW4sC,IArB/B,EAwBnBC,eAAiB,SAACD,GAChB,EAAKzmD,MAAM0mD,eAAe,EAAK1mD,MAAM6Z,UAAW4sC,IAzB/B,EA4BnB8B,eAAiB,SAAC9B,GAChB,EAAKzmD,MAAMuoD,eAAe,EAAKvoD,MAAM6Z,UAAW4sC,IA7B/B,EAgCnB/lC,WAAa,SAACwI,GACZ,EAAKlpB,MAAM0gB,WAAW,CAAC,EAAK1gB,MAAM6Z,WAAYqP,EAAU,EAAKlpB,MAAMgnD,UAAX,UAAmC,EAAKhnD,MAAM4d,SAjCrF,EAoCnB9B,aAAe,SAACoN,GACd,EAAKlpB,MAAM8b,aAAa,CAAC,EAAK9b,MAAM6Z,WAAYqP,EAAU,EAAKlpB,MAAMgnD,UAAX,YArCzC,EAwCnBjqC,aAAe,SAACa,GACd,EAAK5d,MAAM+c,aAAaa,EAAQ,EAAK5d,MAAM6Z,YAzC1B,EA4CnBsjC,gBAAkB,SAACv8B,GACjB,EAAK3e,SAAS,CAAE2e,eA7CC,EAiDnBjF,aAAe,SAACuN,GACd,EAAKlpB,MAAM2b,aAAauN,EAAU,EAAKlpB,MAAMgnD,UAAX,YAlDjB,EAqDnBjE,kBAAoB,SAACvgD,EAAOgG,GAC1B,OACE,kBAACyO,GAAA,YAAD,eACEzU,MAAOA,EACPgG,MAAOA,EACPR,aAAYQ,EACZrD,WAAY,CAACO,MAAM,UAAUN,SAAS,SACtCa,UAAW,CAACC,KAAK,WACjByJ,SAAU,EAAK3P,MAAM4mB,aAAa,EAAE,GAChC7gB,OA5DR,EAAK9F,MAAQ,CACX2gB,UAAW,GACXpC,YAAa3d,OAAOwE,YAJL,E,gEASjBxE,OAAOigB,iBAAiB,SAAU5e,KAAK8oC,iB,6CAIvCnqC,OAAOkgB,oBAAoB,SAAU7e,KAAK8oC,iB,+BAsDlC,IAAD,OACHhhC,EAAU,GAEZA,EADyB,WAAvB9H,KAAKlC,MAAMomD,UAEX,kBAAC,GAAD,CACEvsC,UAAW3X,KAAKlC,MAAM6Z,UACtBmtC,UAAW9kD,KAAKlC,MAAMgnD,UACtB5/C,OAAQ,CACNo/C,eAAetkD,KAAKskD,eACpBE,eAAexkD,KAAKwkD,eACpB6B,eAAermD,KAAKqmD,eACpBxB,qBAAqB7kD,KAAKlC,MAAM+mD,qBAChCrmC,WAAYxe,KAAKwe,WACjB5E,aAAa5Z,KAAK4Z,aAClBH,aAAazZ,KAAKyZ,aAClBoB,aAAc7a,KAAK6a,cAErBoqC,oBAAqBjlD,KAAKlC,MAAMmnD,oBAChCvpC,OAAQ1b,KAAKlC,MAAM4d,OACnBjO,SAAUzN,KAAKlC,MAAM4mB,aAAa,EAAE,EACpCnN,YAAavX,KAAKlC,MAAMyZ,cAK1B,kBAAC,GAAD,CACEutC,UAAW9kD,KAAKlC,MAAMgnD,UACtB34B,QAASnsB,KAAKlC,MAAMquB,QACpB4rB,SAAU/3C,KAAKlC,MAAMi6C,SACrBC,SAAUh4C,KAAKlC,MAAMk6C,SACrBrsB,MAAO3rB,KAAKlC,MAAM6tB,MAClBc,OAAQzsB,KAAKlC,MAAM2uB,OACnBG,OAAQ5sB,KAAKlC,MAAM8uB,OACnBlO,UAAW1e,KAAKjC,MAAM2gB,UACtB2rC,iBAAkBrqD,KAAKlC,MAAMusD,iBAC7B58C,SAAUzN,KAAKlC,MAAM4mB,aAAa,EAAE,EACpCnN,YAAavX,KAAKlC,MAAMyZ,YACxB+E,YAAatc,KAAKjC,MAAMue,cAK9B,IAAImlC,EACF,kBAAC1sC,GAAA,iBAAD,CACEtW,KAAK,sBACLuW,gBAAiBhV,KAAKjC,MAAM2gB,UAC5BgjC,cAAe1hD,KAAKjC,MAAM2gB,UAC1BzY,SAAU,SAACjB,EAAEH,GAAH,OAAO,EAAK9E,SAAS,CAAC2e,UAAW7Z,MAE1C7E,KAAK6gD,kBAAkB,eAAgB,2BACvC7gD,KAAK6gD,kBAAkB,gBAAiB,4BACxC7gD,KAAK6gD,kBAAkB,cAAe,4BACtC7gD,KAAK6gD,kBAAkB,eAAgB,8BAIxCgB,EAAiB,UACjB7hD,KAAKlC,MAAM4mB,cAAam9B,GAAkB,gBAE9C,IAAMn5B,EACJ,yBAAKliB,UAAWq7C,EAAgBj1C,KAAK,SAAS9G,aAAW,WACvD,6BACA,kBAAC,GAAD,CACE4e,YAAa1kB,KAAKlC,MAAM4mB,YACxBoxB,YAAa91C,KAAKlC,MAAMg4C,YACxBD,kBAAmB71C,KAAKlC,MAAM+3C,oBAER,QAAvB71C,KAAKlC,MAAMomD,UACV,kBAAC,GAAD,CAAO94C,MAAM,WAAW+b,aAAa,EAAM1Z,SAAUzN,KAAKlC,MAAM4mB,aAAa,EAAE,GAC5E+8B,EACD,kBAAC,IAAD,CACEn7C,MAAM,kBACNG,QAAS,SAACzB,GAAD,OAAK,EAAKjF,SAAS,CAAC2e,UAAU,MACvCjG,WAAS,EACTzS,WAAS,EACTrC,MAA8B,KAAvB3D,KAAKjC,MAAM2gB,UAAe,CAACvM,QAAQ,QAAQ,GAClD1E,SAAUzN,KAAKlC,MAAM4mB,aAAa,EAAE,KAGtC,MAKR,OACE,6BACE,yBAAKle,UAAU,gBACb,kBAAC,GAAD,CACEmB,QAAS3H,KAAKlC,MAAM6J,QACpBwb,cAAenjB,KAAKmjB,cACpBE,aAAcrjB,KAAKqjB,aACnB9L,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM4mB,aAAa,EAAE,EACpCA,YAAa1kB,KAAKlC,MAAM4mB,YACxBpI,YAAatc,KAAKjC,MAAMue,YACxB0I,cAAc,GAEd,kBAACkE,GAAA,KAAD,CACEC,sBAAuB,CAACrP,gBAAiB,WACzCxZ,MAAON,KAAKlC,MAAMomD,UAClBj+C,SAAU,SAACpB,GAAD,OAAK,EAAK/G,MAAMitD,eAAelmD,KAEzC,kBAAC,OAAD,CAAKyB,MAAM,gBAAgBhG,MAAM,SAASyC,YAAa+jB,KAAcC,IAAKtZ,SAAUzN,KAAKlC,MAAM4mB,aAAa,EAAE,IAC9G,kBAAC,OAAD,CAAKpe,MAAM,aAAahG,MAAM,MAAMyC,YAAa+jB,KAAcC,IAAKtZ,SAAUzN,KAAKlC,MAAM4mB,aAAa,EAAE,MAG3GgE,EACD,yBAAKliB,UAAU,kBACZsB,S,GAjLc3H,aAiPZ6M,gBAxDS,SAACjP,GACvB,MAAO,CACL4Z,UAAW5Z,EAAMynB,OAAOha,QAAQmC,GAChCm3C,UAAW/mD,EAAMynB,OAAOha,QAAQs5C,UAChCn5B,MAAO5tB,EAAMynB,OAAOha,QAAQmgB,MAC5Bc,OAAQ1uB,EAAMynB,OAAOha,QAAQihB,OAC7BG,OAAQ7uB,EAAMynB,OAAOha,QAAQohB,OAC7BT,QAASpuB,EAAMynB,OAAOha,QAAQ2gB,QAC9B4rB,SAAUh6C,EAAMynB,OAAOha,QAAQusC,SAC/BC,SAAUj6C,EAAMynB,OAAOha,QAAQwsC,SAC/BkM,UAAWnmD,EAAMynB,OAAOwlC,aAAa9G,UACrCpO,YAAa/3C,EAAMynB,OAAOswB,YAC1BmP,oBAAqBlnD,EAAMynB,OAAOwlC,aAAaC,cAAc9jD,MAC7DuU,OAAQ3d,EAAMsrB,UAAU3N,WAGD,SAACnS,GAC1B,MAAO,CACLssC,kBAAmB,SAACC,GAClBvsC,EAASssC,GAAkBC,KAE7BiV,eAAgB,SAAC1G,GACf96C,EvB1NG,CACLzE,KAAM,oBACN+E,QuBwN0Bw6C,KAE1B/4C,aAAc,SAACF,EAAOrE,GACpBwC,EAAS+B,GAAaF,EAAOrE,KAE/Bu9C,eAAgB,SAAC3sC,EAAW4sC,GAC1Bh7C,EAAS+6C,GAAe3sC,EAAW4sC,KAErCC,eAAgB,SAAC7sC,EAAW4sC,GAC1Bh7C,EAASi7C,GAAe7sC,EAAW4sC,KAErC8B,eAAgB,SAAC1uC,EAAW4sC,GAC1Bh7C,ETxNC,SAAwBoO,EAAW4sC,GACxC,MAAO,CACL94C,MAAO,CAAC,2BAA2B,kCAAkC,kCACrE5B,QAAS,CACPR,QAAU,CACRqC,IAAI,aAAD,OAAeiM,EAAf,cACHhM,OAAQ,SACR3B,KAAMu6C,EACN59C,eAAgB,6CAChBc,aAAc,gCAGlBwf,YAAY,GS4MDo/B,CAAe1uC,EAAW4sC,KAErCM,qBAAsB,WACpBt7C,ET1MG,CAACzE,KAAM,4BS4MZulD,iBAAkB,SAACa,GACjB3hD,E3DhLC,SAA0B2hD,GAE/B,MAAO,CACLz/C,MAAO,CAAC,qBAAqB,4BAA4B,4BACzD5B,QAAS,CACPR,QAAU,CACRqC,IAAI,SACJC,OAAQ,MACR3B,KAAM,CAAC6qC,MAAOqW,GACdvkD,eAAgB,iCAChBc,aAAc,gCAGlBwf,YAAY,G2DmKDojC,CAAiBa,KAE5B1sC,WAAY,SAACG,EAAYqI,EAAUu9B,EAAU4G,GAC3C5hD,EAASiV,GAAWG,EAAYqI,KAElCpN,aAAc,SAAC+E,EAAYqI,EAAUu9B,GACnCh7C,EAASqQ,GAAa+E,EAAYqI,KAEpCvN,aAAc,SAACuN,EAAUu9B,GACvBh7C,EAASkQ,GAAauN,KAExBnM,aAAc,SAACa,EAAQ/D,GACrBpO,EAASsR,GAAaa,EAAQ/D,QAIrB3K,CAA6C89C,ICrQtDM,G,kDAEJ,WAAYttD,GAAQ,IAAD,8BACjB,cAAMA,IAeRyZ,YAAc,SAACjX,GACb,EAAKP,SAAS,CAAC2kB,YAAapkB,KAf5B,EAAKvC,MAAQ,CACX2mB,aAAa,GAHE,E,iEAQjB,IAAM/M,EAAY3X,KAAKlC,MAAMc,SAAS0N,SAAShN,MAAM,KAAK,GAC1DU,KAAKlC,MAAMyJ,KAAKG,cAAgB1H,KAAKlC,MAAM2nB,YAAY9N,GAAa3X,KAAKlC,MAAM6J,QAAQC,KAAK,O,2CAIvF5H,KAAKlC,MAAMyJ,KAAKG,eAAe1H,KAAKlC,MAAM6J,QAAQC,KAAK,O,+BAQ5D,IAGIonB,EAHEvF,EAAoB,kBAAC,GAAD,CAAkB9hB,QAAS3H,KAAKlC,MAAM6J,QAAS4P,YAAavX,KAAKuX,YAAamN,YAAa1kB,KAAKjC,MAAM2mB,aAAa1kB,KAAKlC,MAAME,UAClJu6C,EAAgB,kBAAC,GAAD,CAAc5wC,QAAS3H,KAAKlC,MAAM6J,QAAS4P,YAAavX,KAAKuX,YAAamN,YAAa1kB,KAAKjC,MAAM2mB,aAAa1kB,KAAKlC,MAAME,UAC1IgtD,EAAgB,kBAAC,GAAD,CAAcrjD,QAAS3H,KAAKlC,MAAM6J,QAAS4P,YAAavX,KAAKuX,YAAamN,YAAa1kB,KAAKjC,MAAM2mB,aAAa1kB,KAAKlC,MAAME,UAEhJ,OAAQgC,KAAKlC,MAAMg4C,aACjB,IAAK,mBACH9mB,EAAUvF,EACV,MACF,IAAK,eACHuF,EAAUupB,EACV,MACF,IAAK,eACHvpB,EAAUg8B,EACV,MACF,QAEEh8B,EAAW,gEAEf,OACE,6BACGA,EACD,kBAAC,GAAD,CAAehxB,QAASgC,KAAKlC,MAAME,UACnC,kBAAC,GAAD,CAAc+I,QAAS/G,KAAKlC,MAAMsO,eAClC,kBAAC,GAAD,CAAUmL,YAAavX,KAAKuX,YAAa9J,SAAUzN,KAAKjC,MAAM2mB,aAAa,EAAE,IAC7E,kBAAC,GAAD,MACA,kBAAC,EAAD,W,GAhDcvkB,aAyEP6M,gBAnBS,SAACjP,GACvB,MAAO,CACLwJ,KAAMxJ,EAAMwJ,KACZuuC,YAAa/3C,EAAMynB,OAAOswB,YAC1B93C,QAASD,EAAMN,OAAOO,QACtBoO,aAAcrO,EAAMN,OAAO2O,aAC3BuL,UAAW5Z,EAAMynB,OAAOha,QAAQmC,OAIT,SAACpE,GAC1B,MAAO,CACLkc,YAAa,SAAC9N,GACZpO,EAASkc,GAAY9N,QAMZ3K,CAA6Co+C,IC1EtDC,G,kDACJ,WAAYvtD,GAAQ,IAAD,8BACjB,cAAMA,IAqBRgrC,cAAgB,WACd,EAAK/oC,SAAS,CAAEuc,YAAa3d,OAAOwE,cAvBnB,EA0BnB2nB,kBAAoB,SAACirB,EAAQloC,GAC3BA,EAAMyZ,kBACN,EAAKxpB,MAAMgtB,kBACT,EAAKhtB,MAAM4rB,gBACXqsB,EACAloC,EACA,EAAK/P,MAAM0N,QAAQuiB,SACnB,EAAKjwB,MAAM0N,QAAQ2gB,QACnB,EAAKruB,MAAM0N,QAAQusC,SACnB,EAAKj6C,MAAM0N,QAAQwsC,WAnCJ,EAuCnBjL,gBAAkB,WAChB,EAAKhtC,SAAS,CAAEitC,WAAY,KAAMuT,oBAAoB,IAAS,kBAAM,EAAKziD,MAAMyZ,aAAY,OAxC3E,EA2CnBiZ,eAAiB,SAAC0C,GAAsC,IAAhCqtB,EAA+B,wDACrD,EAAKxgD,SAAS,CAAEitC,WAAY9Z,EAAMqtB,uBAAsB,kBAAM,EAAKziD,MAAMyZ,aAAY,OA5CpE,EA+CnBipC,eAAiB,WAAyB,IAAxB1iD,EAAuB,uDAAf,EAAKA,MAEvBstB,EAAattB,EAAM4rB,gBAAgB5kB,KACnCglB,EAAUhsB,EAAM4rB,gBAAgBI,QAClCxE,EAAQ,GACZ,GAAIwE,EAAQtqB,OAAS,EAAG,CACtB8lB,EAAQxnB,EAAM0N,QAAQ4f,EAAa,KAAKtB,EAAQ,IAAIxE,MAD9B,qBAEPwE,GAFO,IAEtB,2BAAwB,CAAC,IAAhBnc,EAAe,QACtB2X,EAAQ,EAAKpH,UAAUoH,EAAOxnB,EAAM0N,QAAQ4f,EAAa,KAAKzd,GAAI2X,QAH9C,+BAMxB,OAAOA,GA1DU,EAgEnBpH,UAAY,SAACC,EAAOC,GAClB,OAAID,EAAM3e,QAAU4e,EAAM5e,OACjB2e,EAAMjP,QAAO,SAACmP,GAAU,OAAOD,EAAMpW,SAASqW,MAE9CD,EAAMlP,QAAO,SAACmP,GAAU,OAAOF,EAAMnW,SAASqW,OAlEvD,EAAKtgB,MAAQ,CACXue,YAAa3d,OAAOwE,WACpB6H,aAAc,CACZg2C,WAAY,2CACZ91C,IAAK,IAEP6zC,iBAAiB,EACjB/R,WAAY,MATG,E,gEAcjBruC,OAAOigB,iBAAiB,SAAU5e,KAAK8oC,eACvC9oC,KAAKlC,MAAM83C,eAAe,a,6CAI1Bj3C,OAAOkgB,oBAAoB,SAAU7e,KAAK8oC,iB,+BAuDrC9oC,KAAKjC,MAAMghD,gBAIhB,IAAM+C,EACJ,yBACEt7C,UAAU,UACV7C,MAAK,uCAAO3D,KAAKjC,MAAMiN,cAAiBhL,KAAKjC,MAAMo3C,cAA9C,IAA4DljC,MAAO,QAExE,kBAAC,GAAD,CACEnN,KAAM9E,KAAKlC,MAAM4rB,gBAAgB5kB,KACjCyC,KAAMvH,KAAKlC,MAAMyJ,KACjBwlC,gBAAiB/sC,KAAK+sC,gBACtBhD,YAAa/pC,KAAKwgD,iBAClBhwB,eAAgBxwB,KAAKwwB,eACrBtrB,OAAQ,CACNwkC,SAAU,aACVoC,WAAY,aACZ2B,kBAAmB,cAErBl2B,YAAavX,KAAKlC,MAAMyZ,YACxB9J,SAAUzN,KAAKlC,MAAM4mB,aAAe,EAAI,EACxCpI,YAAatc,KAAKjC,MAAMue,eAK1BylC,EAAY,8BA8BhB,OA7BI/hD,KAAKlC,MAAM0N,QAAQuiB,SAASvuB,OAAS,IACvCuiD,EACE,yBAAKn1C,KAAK,QACR,yBAAKpG,UAAU,mBAAmB7C,MAAK,2BAAO3D,KAAKjC,MAAMiN,cAAlB,IAAgCG,KAAM,KAAMrH,MAAO,aACxF,4BAAK9D,KAAKlC,MAAM0N,QAAQJ,OACxB,kBAAC,GAAD,CACEI,QAASxL,KAAKlC,MAAM0N,QACpBie,iBAAkBzpB,KAAKlC,MAAM2rB,iBAC7BqB,kBAAmB9qB,KAAK8qB,kBACxBpB,gBAAiB1pB,KAAKlC,MAAM4rB,gBAC5B9E,oBAAoB,KAGvBk9B,IAIoC,IAAvC9hD,KAAKlC,MAAM0N,QAAQuiB,SAASvuB,QAAiBQ,KAAKlC,MAAME,UAC1D+jD,EACE,yBAAKn1C,KAAK,QACR,yBAAKpG,UAAU,oBACb,wBAAI7C,MAAO,CAAC6E,UAAW,WAAvB,gDASN,yBAAKhC,UAAU,oBACZu7C,EACD,kBAAC,GAAD,CACEj3C,KAAgC,OAA1B9K,KAAKjC,MAAMivC,WACjBjD,YAAa/pC,KAAKwgD,iBAClBxT,WAAYhtC,KAAKjC,MAAMivC,WAAahtC,KAAKjC,MAAMivC,WAAa,CAAEr/B,GAAI,MAClEo/B,gBAAiB/sC,KAAK+sC,gBACtB7nC,OAAQ,CACNowC,WAAY,aACZC,WAAY,aACZ7L,SAAU,aACVoC,WAAY,aACZyS,mBAAoB,cAEtB5mC,UAAW3X,KAAKlC,MAAM0N,QAAQmC,GAC9Bs8B,WAAYjqC,KAAKlC,MAAM0N,QAAQy+B,WAC/Bpb,MAAO7uB,KAAKlC,MAAM0N,QAAQqjB,MAC1BxB,OAAQrtB,KAAKlC,MAAM0N,QAAQ6hB,OAC3BU,SAAU/tB,KAAKlC,MAAM0N,QAAQuiB,SAC7BpC,MAAO3rB,KAAKlC,MAAM0N,QAAQmgB,MAC1BQ,QAASnsB,KAAKlC,MAAM0N,QAAQ2gB,QAC5BM,OAAQzsB,KAAKlC,MAAM0N,QAAQihB,OAC3BsrB,SAAU/3C,KAAKlC,MAAM0N,QAAQusC,SAC7BnrB,OAAQ5sB,KAAKlC,MAAM0N,QAAQohB,OAC3BorB,SAAUh4C,KAAKlC,MAAM0N,QAAQwsC,SAC7BzgC,YAAavX,KAAKlC,MAAMyZ,YACxBw0B,YAAY,S,GA/JiB5rC,aAiMxB6M,gBA1BS,SAACjP,GACvB,MAAO,CACLwJ,KAAMxJ,EAAMwJ,KACZiE,QAASzN,EAAMynB,OAAOha,QACtBsqC,YAAa/3C,EAAMynB,OAAOswB,YAC1B+I,gBAAiB9gD,EAAMynB,OAAOiE,iBAAiBE,QAAQk1B,gBACvDn1B,gBAAiB3rB,EAAMynB,OAAOiE,iBAAiBC,gBAC/CD,iBAAkB1rB,EAAMynB,OAAOiE,iBAC/BzrB,QAASD,EAAMN,OAAOO,QACtB+vB,SAAUhwB,EAAMynB,OAAOha,QAAQuiB,SAC/B5B,QAASpuB,EAAMynB,OAAOha,QAAQ2gB,YAIP,SAAC5iB,GAC1B,MAAO,CACLqsC,eAAgB,SAAC/wB,GACftb,EAASqsC,GAAe/wB,KAE1BiG,kBAAmB,SAACpB,EAAiBqsB,EAAQloC,EAAOwf,EAAQ1B,EAAOc,EAAQG,GACzErjB,EAASuhB,GAAkBpB,EAAiBqsB,EAAQloC,EAAO,CAAEwf,SAAQ1B,QAAOc,SAAQG,gBAM3E5f,CAA6Cq+C,ICpMtDD,G,kDAEJ,WAAYttD,GAAQ,IAAD,8BACjB,cAAMA,IAWRyZ,YAAc,SAACjX,GACb,EAAKP,SAAS,CAAC2kB,YAAapkB,KAX5B,EAAKvC,MAAQ,CACX2mB,aAAa,GAHE,E,iEAQjB,IAAM/M,EAAY3X,KAAKlC,MAAMc,SAAS0N,SAAShN,MAAM,KAAK,GAC1DU,KAAKlC,MAAMwtD,oBAAoB3zC,K,+BAQ/B,OACE,6BACE,kBAAC,GAAD,CACEhQ,QAAS3H,KAAKlC,MAAM6J,QACpB4P,YAAavX,KAAKuX,YAClBmN,YAAa1kB,KAAKjC,MAAM2mB,aAAe1kB,KAAKlC,MAAME,UAEpD,kBAAC,GAAD,CAAeA,QAASgC,KAAKlC,MAAME,UACnC,kBAAC,GAAD,CAAc+I,QAAS/G,KAAKlC,MAAMsO,eAClC,kBAAC,EAAD,W,GA5BcjM,aAoDP6M,gBAlBS,SAACjP,GACvB,MAAO,CACLwJ,KAAMxJ,EAAMwJ,KACZvJ,QAASD,EAAMN,OAAOO,QACtBoO,aAAcrO,EAAMN,OAAO2O,aAC3BuL,UAAW5Z,EAAMynB,OAAOha,QAAQmC,OAIT,SAACpE,GAC1B,MAAO,CACL+hD,oBAAqB,SAAC3zC,GACpBpO,EjEzCC,SAA6BoO,GAA0C,IAA/B+N,EAA8B,uDAAhB,eAC3D,MAAO,CACLja,MAAO,CACLia,EACA,iCACA,iCAEF7b,QAAS,CACPR,QAAS,CACPqC,IAAI,aAAD,OAAeiM,EAAf,aACHhM,OAAQ,MACRhF,eAAgB,GAChBc,aAAc,iCiE6BP6jD,CAAoB3zC,QAMpB3K,CAA6Co+C,I,mBC7D/CnJ,GAAe,CAC1Bv6C,eAAe,EACf+B,MAAO,GACP9D,OAAQ,CACN6B,MAAO,CAACC,aAAc,IACtB7B,SAAU,CAACR,MAAO,GAAIC,SAAU,IAChCkW,OAAQ,CAAClW,SAAU,GAAI8c,iBAAkB,GAAI/c,MAAO,IACpD+G,aAAc,KCPX,IAAM81C,GAAe,CAC1BhkC,SAAU,GACVvC,OAAQ,GACRpI,aAAc,MCHT,IAAM2uC,GAAe,CAC1Bz2C,QAAS,CACPmC,GAAI,GACJvC,MAAO,GACP8C,UAAW,GACXkK,IAAK,GACL3C,cAAe,CACbhX,KAAM,gBACN+rB,YAAa,iBACbykB,QAAS,CAAC,MAAO,cAAe,OAChCkK,YAAY,GAEdljC,SAAU,CACR9H,KAAM,IAER22C,UAAW,CACTyG,UAAW,CACT59C,GAAI,YACJlP,KAAM,kBACNid,OAAQ,KAGZqS,SAAU,GACV5B,QAAS,GACT4rB,SAAU,GACVC,SAAU,GACV3qB,OAAQ,GACR1B,MAAO,GACPc,OAAQ,GACRG,OAAQ,GACRqd,WAAY,GACZpb,MAAO,GACP3Y,YAAa,CACXC,UAAU,IAId2/B,YAAa,mBACbrsB,iBAAkB,CAChBC,gBAAiB,CACf5kB,KAAM,GACNglB,QAAS,GACT6sB,aAAc,IAEhB9xB,SAAU,SACV+E,kBAAmB,CACjBvT,KAAM,CACJ,CACE5X,KAAM,OACN+rB,YAAa,OACbykB,QAAS,CACP,OACA,WACA,QACA,UACA,OACA,UACA,YAEFkK,YAAY,GAEd,CACE16C,KAAM,WACN+rB,YAAa,WACbykB,QAAS,CAAC,OAAQ,YAAa,QAAS,SACxCkK,YAAY,GAEd,CACE16C,KAAM,eACN+rB,YAAa,eACb2uB,YAAY,GAEd,CACE16C,KAAM,iBACN+rB,YAAa,iBACbykB,QAAS,CACP,OACA,OACA,SACA,SACA,UACA,WACA,SAEFkK,YAAY,GAEd,CACE16C,KAAM,iBACN+rB,YAAa,iBACbykB,QAAS,CACP,OACA,OACA,SACA,SACA,UACA,WACA,SAEFkK,YAAY,GAEd,CACE16C,KAAM,OACN+rB,YAAa,OACbykB,QAAS,CAAC,KAAM,OAChBkK,YAAY,GAEd,CACE16C,KAAM,eACN+rB,YAAa,iBAGjBxZ,MAAO,CACL,CACEvS,KAAM,OACN+rB,YAAa,OACbykB,QAAS,CAAC,QAAS,WACnBkK,YAAY,GAEd,CACE16C,KAAM,QACN+rB,YAAa,UAGjBpU,KAAM,CACJ,CACE3X,KAAM,UACN+rB,YAAa,UACbykB,QAAS,CAAC,OAAQ,OAAQ,QAAS,OAAQ,QAC3CkK,YAAY,GAEd,CACE16C,KAAM,mBACN+rB,YAAa,mBACbykB,QAAS,CAAC,OAAQ,gBAAiB,gBAAiB,iBACpDkK,YAAY,GAEd,CACE16C,KAAM,cACN+rB,YAAa,eAEf,CACE/rB,KAAM,MACN+rB,YAAa,QAGjB0I,KAAM,CACJ,CACEz0B,KAAM,QACN+rB,YAAa,SAEf,CACE/rB,KAAM,WACN+rB,YAAa,WACb2uB,YAAY,GAEd,CACE16C,KAAM,cACN+rB,YAAa,eAEf,CACE/rB,KAAM,MACN+rB,YAAa,SAInBb,QAAS,CACPk1B,iBAAiB,EACjBxxB,OAAQ,GACR1B,MAAO,GACPzB,MAAO,GACP2E,MAAO,GACPvB,sBAAuB,GACvB1B,qBAAsB,GACtB2B,sBAAuB,GACvBC,sBAAuB,GACvB3B,qBAAsB,GACtB7B,qBAAsB,GACtBxE,QAAQ,EACR4E,YAAY,EACZ2sB,QAAS,CACP,CACEjyC,KAAM,KACNylB,UAAW,GACX6uB,eAAgB,GAChBve,OAAQ,GACRqc,UAAW,GACXC,YAAa,KAGjBE,UAAW,IAEb3rB,WAAY,CACVza,OAAQ,GACRqF,OAAQ,IAEVkiC,eAAgB,CACdpb,SAAU,GACVT,OAAQ,KAGZ4b,aAAc,CACZ2L,UAAW,UAEb8G,aAAc,CACZ9G,UAAW,SACX+G,cAAe,CACb9jD,MAAO,KAGXi9B,aAAc,GACdH,eAAgB,I,SClNX,IAAMge,GAAe,CAC1BjkD,SAAS,EACT4L,oBAAqB,EACrBwC,aAAc,GACdkV,aAAa,EACbkqC,mBAAmB,GCLd,IAAMvJ,GAAe,CAC1Br+B,KAAM,GACNC,KAAM,I,yBCFD,SAAS4nC,GAAe/9B,EAAW3vB,GAAoB,IAAD,EAAZouB,EAAY,uDAAJ,GAAI,eACtCuB,GADsC,IAC3D,2BAA+B,CAAC,IAAvBC,EAAsB,QACJ,MAArBA,EAASzC,OAAO,GAClBugC,GAAe1tD,EAAMyN,QAAQ6hB,OAAOM,GAAUD,UAAW3vB,EAAOouB,GAEhEA,EAAQvkB,KAAK+lB,IAL0C,+BCEtD,SAAS0lB,GACdnuC,EACAnH,EACAkT,GAEC,IAAD,EADAy6C,EACA,uEAEmBz6C,GAFnB,IAEA,2BAA2B,CAAC,IAAnB0pB,EAAkB,QACnBgxB,EAAoB5tD,EAAMyN,QAAQmgB,MAAMgP,GAAQtL,aAClDs8B,IACF5tD,EAAMyN,QAAQmgB,MAAMggC,GAAmBt8B,aAAe,OAL1D,8BASA,GAAIpe,EAAOzR,OAAS,IAAM,EAAG,CAC3B,IAAIosD,EACkBA,EAAlBF,EAA8Bz6C,EAAOy6C,EAAmB,GAC3Cz6C,EAAO+O,KAAKC,MAAMhP,EAAOzR,OAAS,IACnD,IAAMqsD,EAAiB56C,EAAOmb,QAAQw/B,GACtC36C,EAAOiG,OAAO20C,EAAgB,GAC9B9tD,EAAMyN,QAAQmgB,MAAMigC,GAAWv8B,aAAe,KAEhD,IAAK,IAAIvZ,EAAI,EAAGA,EAAI7E,EAAOzR,QACrByR,EAAOzR,OAAS,IAAMsW,EADOA,IAAK,CAGpC,IAAMg2C,EAAY76C,EAAO6E,GACnBi2C,EAAY96C,EAAOA,EAAOzR,OAASsW,EAAI,GAC7C/X,EAAMyN,QAAQmgB,MAAMmgC,GAAWz8B,aAAe08B,EAC9ChuD,EAAMyN,QAAQmgB,MAAMogC,GAAW18B,aAAey8B,EAGlD,OAAO/tD,EAGF,SAASiuD,GAAa9mD,EAAQnH,GAanC,IAbsE,IAgE9C,IAhEkBkuD,EAA2B,wDAC/DC,EAAgBhnD,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKyW,SACjD2K,EAAc15B,EAAMyN,QAAQ6hB,OAAO6+B,GACnCC,EAAajnD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW2J,UACpDtJ,EAAcliC,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWK,YACrDglB,EAAclnD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW5X,MACrDk9B,EAAcnnD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWp1B,QACrD+5C,EACJxmD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW2kB,iBACnCv/B,EAAUjnB,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW5a,QACjD0rB,EAAU3yC,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW8Q,QACnDyU,EAAoB,GACpBC,EAAY,EACP7U,EAAQ,EAAGA,EAAQyU,EAAYzU,IAEtC35C,EAAMyN,QAAQmgB,MAAM,QAAUQ,EAAQurB,IAAU,CAC9C/pC,GAAI,QAAUwe,EAAQurB,GACtBzmB,SAAU/rB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAK4a,SACvC/rB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAK4a,SACjC,OACJnsB,KAAMI,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKvR,KACnCI,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKvR,KACjC,OACJumB,aAAc,KACdgE,aAAc,KACd2D,eAAgB,OAChBsd,eAAgB,OAChB5e,KAAMxsB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKqb,KACnCxsB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKqb,KACjC,KACJ/C,UAAW8I,EAAY9I,UACvB7B,SAAUo/B,EACVx/B,QAAS,SAAWmrB,EAAQ0U,GAC5B1/B,QAAS,SAAWgrB,EAAQ0U,EAAY,GACxCjnC,MAAO,GACP8F,WAAY,QAEdkhC,EAAkB1kD,KAAK,QAAUukB,EAAQurB,IAEzC35C,EAAMyN,QAAQihB,OAAO,SAAWorB,EAAQ0U,IAAc,CACpD5+C,GAAI,SAAWkqC,EAAQ0U,GACvBz/B,SAAU,QAAUX,EAAQurB,GAC5B5hB,YAAa,KACbC,QAAS,OACT7Y,MAAO,GACPsvC,iBAAkB,OAClBlnC,MAAO,GACP8F,WAAY,SAEdrtB,EAAMyN,QAAQusC,SAASnwC,KAAK,SAAWiwC,EAAQ0U,IAE/CxuD,EAAMyN,QAAQohB,OAAO,SAAWirB,EAAQ0U,EAAY,IAAM,CACxD5+C,GAAI,SAAWkqC,EAAQ0U,EAAY,GACnCz/B,SAAU,QAAUX,EAAQurB,GAC5B5hB,YAAa,KACbC,QAAS,QACT7Y,MAAO,GACPsvC,iBAAkB,OAClBlnC,MAAO,GACP8F,WAAY,SAEdrtB,EAAMyN,QAAQwsC,SAASpwC,KAAK,SAAWiwC,EAAQ0U,EAAY,IAC3DA,GAAa,EAEf,IAAKN,EAQH,IANA,EAAAluD,EAAMyN,QAAQ6hB,OAAO6+B,GAAex+B,WAAUxW,OAA9C,SACEkwB,EAAc,EACd,GAFF,OAGKklB,IAGDF,GACF,EAAAruD,EAAMyN,QAAQ2gB,SAAQjV,OAAtB,SAA6Bk1C,EAAc,EAAG,GAA9C,OAAoDE,QACjD,CAEH,IAFG,EAECG,EAAiB,GAFlB,eAGiB1uD,EAAMyN,QAAQuiB,UAH/B,IAGH,2BAA4C,CAAC,IAApCW,EAAmC,QACpC1d,EAAQjT,EAAMyN,QAAQ6hB,OAAOqB,GACX,IAApB1d,EAAM2d,WACR88B,GAAez6C,EAAM0c,UAAW3vB,EAAO0uD,IANxC,8BAQH1uD,EAAMyN,QAAQ2gB,QAAUsgC,EAQ5B,OAJIJ,GACFhZ,GAAiBnuC,EAAQnH,EAAOuuD,EAAmBZ,GAErD3tD,EAAM0rB,iBAAiBiC,WAAWza,OAAlC,UAA+Cq7C,GACxCvuD,EAwET,SAAS2uD,GAAkB3uD,EAAO48B,GAChC,IAAMtkB,EAAOtY,EAAMyN,QAAQmgB,MAAMgP,GAGjC,OAFA58B,EAAMyN,QAAQihB,OAAOpW,EAAKqW,SAASqJ,QAAU,OAC7Ch4B,EAAMyN,QAAQohB,OAAOvW,EAAKwW,SAASkJ,QAAU,OACtCh4B,EAqBF,SAASm1C,GAAWyZ,EAAe5uD,GACxC,IAAM6uD,EAAc7uD,EAAMyN,QAAQmgB,MAAMghC,GAClCE,EAAoB9uD,EAAMyN,QAAQ6hB,OAAOu/B,EAAY9/B,UACrDggC,EAAyBD,EAAkBn/B,UAAUtB,QACzDugC,GAMF,GAHiC,OAA7BC,EAAYv9B,eACdtxB,EAAMyN,QAAQmgB,MAAMihC,EAAYv9B,cAAcA,aAAe,MAE5B,SAA/Bu9B,EAAY55B,eAA2B,CACzC,IAAM+5B,EACJF,EAAkBn/B,UAAUo/B,EAAyB,GACnDC,IAEFhvD,EAAMyN,QAAQmgB,MAAMohC,GAAqBzc,eAAiB,QAI9D,GAAmC,SAA/Bsc,EAAYtc,eAA2B,CACzC,IAAM0c,EACJH,EAAkBn/B,UAAUo/B,EAAyB,GACnDE,IAEFjvD,EAAMyN,QAAQmgB,MAAMqhC,GAAqBh6B,eAAiB,QAG9D,IAAIi6B,EAAqBlvD,EAAMyN,QAAQ2gB,QAAQC,QAAQugC,GAuBvD,IAAK,IAAIp6B,KAtBTx0B,EAAMyN,QAAQ2gB,QAAQjV,OAAO+1C,EAAoB,GAEjDA,EAAqBJ,EAAkBn/B,UAAUtB,QAAQugC,GACzD5uD,EAAMyN,QAAQ6hB,OAAOu/B,EAAY9/B,UAAUY,UAAUxW,OACnD+1C,EACA,IAI0B,KAD5BA,EAAqBJ,EAAkBzvB,SAAShR,QAAQugC,KAEtD5uD,EAAMyN,QAAQ6hB,OAAOu/B,EAAY9/B,UAAUsQ,SAASlmB,OAClD+1C,EACA,IAIwB,KAD5BA,EAAqBJ,EAAkBlwB,OAAOvQ,QAAQugC,KAEpD5uD,EAAMyN,QAAQ6hB,OAAOu/B,EAAY9/B,UAAU6P,OAAOzlB,OAChD+1C,EACA,GAGelvD,EAAMyN,QAAQqjB,MAAO,CACtCo+B,EAAqBlvD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQhqB,KAAKY,QAC5DugC,GAEF,IAAIO,EAAenvD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQ2X,MAAM/gC,QAC3DwgC,EAAYlgC,SAEV0gC,EAAervD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQ6X,MAAMjhC,QAC3DwgC,EAAY//B,UAEc,IAAxBogC,GACFlvD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQhqB,KAAKtU,OAAO+1C,EAAoB,IAChD,IAAlBC,GACFnvD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQ2X,MAAMj2C,OAAOg2C,EAAc,IAC3C,IAAlBE,GACFrvD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQ6X,MAAMn2C,OAAOk2C,EAAc,UAG5DrvD,EAAMyN,QAAQihB,OAAOmgC,EAAYlgC,gBACjC3uB,EAAMyN,QAAQohB,OAAOggC,EAAY//B,SACxC,IAAMqgC,EAAenvD,EAAMyN,QAAQusC,SAAS3rB,QAAQwgC,EAAYlgC,SAChE3uB,EAAMyN,QAAQusC,SAAS7gC,OAAOg2C,EAAc,GAC5C,IAAME,EAAervD,EAAMyN,QAAQwsC,SAAS5rB,QAAQwgC,EAAY//B,SAUhE,OATA9uB,EAAMyN,QAAQwsC,SAAS9gC,OAAOk2C,EAAc,GAE5CrvD,EAAM0rB,iBAAiBC,gBAAkB,CACvC5kB,KAAM,GACNglB,QAAS,GACT6sB,aAAc,WAGT54C,EAAMyN,QAAQmgB,MAAMghC,GACpB5uD,EC3NF,SAAS6xC,GAAY0d,EAAgBvvD,GAC1C,IAAMwvD,EAAexvD,EAAMyN,QAAQ6hB,OAAOigC,GAEtCE,EAAsBzvD,EAAMyN,QAAQuiB,SAAS3B,QAAQkhC,GAGzD,IAAK,IAAI/6B,KAFTx0B,EAAMyN,QAAQuiB,SAAS7W,OAAOs2C,EAAqB,GAEhCzvD,EAAMyN,QAAQqjB,OAEF,KAD7B2+B,EAAsBzvD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQtoB,MAAMd,QAAQkhC,KAExEvvD,EAAMyN,QAAQqjB,MAAM0D,GAAQijB,QAAQtoB,MAAMhW,OAAOs2C,EAAqB,GAGpED,EAAazgC,WAEf0gC,EAD2BzvD,EAAMyN,QAAQ6hB,OAAOkgC,EAAazgC,UACpBY,UAAUtB,QAAQkhC,GAC3DvvD,EAAMyN,QAAQ6hB,OAAOkgC,EAAazgC,UAAUY,UAAUxW,OAAOs2C,EAAqB,IAGpF,2BAAyBD,EAAa7/B,WAAtC,eAAiD,CAA5C,IAAIC,EAAQ,KACU,MAArBA,EAASzC,OAAO,GAClB0kB,GAAYjiB,EAAU5vB,GAEtBm1C,GAAWvlB,EAAU5vB,GAMzB,OAHAA,EAAM0rB,iBAAiBC,gBAAkB,CAAE5kB,KAAM,GAAIglB,QAAS,GAAI6sB,aAAc,WAEzE54C,EAAMyN,QAAQ6hB,OAAOigC,GACrBvvD,ECvGF,SAAS+2C,GAAY5vC,EAAQnH,GAClC,IADyC,EACnC0vD,EAAevoD,EAAO2E,QAAQR,QAAQW,KAAK6qC,MADR,eAEjB4Y,GAFiB,IAEzC,2BAAsC,CAAC,IAA9BC,EAA6B,QAEH,MAA7BA,EAAY//C,GAAGud,OAAO,GACxBntB,EAAMyN,QAAQihB,OAAOihC,EAAY//C,IAAjC,2BAA4C5P,EAAMyN,QAAQihB,OAAOihC,EAAY//C,KAAQ+/C,EAAYx/B,YAEjGnwB,EAAMyN,QAAQohB,OAAO8gC,EAAY//C,IAAjC,2BAA4C5P,EAAMyN,QAAQohB,OAAO8gC,EAAY//C,KAAQ+/C,EAAYx/B,aAP5D,8BASzC,OAAOnwB,ECpBF,SAASygB,GAAWtZ,EAAQmkB,EAAW7D,GAI5C,MAHwB,KAApBA,EAAOha,QAAQmC,IAoBd,SAA+BzI,EAAQmkB,EAAW7D,GACvD,IAD+D,EACzDwB,EAAW9hB,EAAO2E,QAAQR,QAAQW,KAAKgd,SADkB,eAE3CA,GAF2C,yBAEtD2mC,EAFsD,QAIvDC,EAAavkC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAOggD,KAC9DzwC,EAAQmM,EAAU3N,OAAOkyC,GAC/BpoC,EAAOha,QAAQs5C,UAAUyG,UAAU7vC,OAAO9T,KAAK,CAC7CtB,MAAO4W,EAAM5W,MACboF,IAAKwR,EAAMxR,IACXk4B,WAAY,eAPhB,2BAA+B,IAFgC,+BAnB7DiqB,CAAsB3oD,EAAQmkB,EAAW7D,GAuDtC,SAAiCtgB,EAAQmkB,GAC9C,IADyD,EACnD1K,EAAazZ,EAAO2E,QAAQR,QAAQW,KAAK2U,WACzCqI,EAAW9hB,EAAO2E,QAAQR,QAAQW,KAAKgd,SAFY,eAGnCrI,GAHmC,IAGzD,2BAAiC,CAAC,IAAD,EAAxBhH,EAAwB,uBAEXqP,GAFW,yBAEtB2mC,EAFsB,QAGzBC,EAAavkC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAOggD,MAE1C,IADHtkC,EAAU3N,OAAOkyC,GAAYjvC,WAAWyN,QAAQzU,IAEnE0R,EAAU3N,OAAOkyC,GAAYjvC,WAAW/W,KAAK+P,IAJjD,2BAA+B,IAFA,gCAHwB,+BAtDzDm2C,CAAwB5oD,EAAQmkB,GACzB,CAACA,YAAW7D,UAGd,SAAS5L,GAAa1U,EAAQmkB,EAAW7D,GAI9C,MAH0B,KAAtBA,EAAOha,QAAQmC,IACjBogD,GAAwB7oD,EAAQmkB,EAAW7D,GA8DxC,SAAmCtgB,EAAQmkB,GAChD,IAD2D,EACrD1K,EAAazZ,EAAO2E,QAAQR,QAAQW,KAAK2U,WACzCqI,EAAW9hB,EAAO2E,QAAQR,QAAQW,KAAKgd,SAFc,eAGrCrI,GAHqC,IAG3D,2BAAkC,CAAC,IAAD,EAAzBhH,EAAyB,uBAEZqP,GAFY,yBAEvB2mC,EAFuB,QAG1BC,EAAavkC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAOggD,KAC9DK,EAAiB3kC,EAAU3N,OAAOkyC,GAAYjvC,WAAWyN,QAAQzU,IAC7C,IAApBq2C,GACF3kC,EAAU3N,OAAOkyC,GAAYjvC,WAAWzH,OAAO82C,EAAgB,IAJnE,2BAA+B,IAFC,gCAHyB,+BA7D3DC,CAA0B/oD,EAAQmkB,GAC3B,CAAEA,YAAW7D,UAGf,SAAS/L,GAAavU,EAAQmkB,EAAW7D,GAI9C,MAH0B,KAAtBA,EAAOha,QAAQmC,IACjBogD,GAAwB7oD,EAAQmkB,EAAW7D,GAqExC,SAAmCtgB,EAAQmkB,GAChD,IAD2D,EACrDrC,EAAW9hB,EAAO2E,QAAQR,QAAQW,KAAKgd,SADc,eAGvCA,GAHuC,yBAGlD2mC,EAHkD,QAIrDC,EAAavkC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAOggD,KAClEtkC,EAAU3N,OAAOxE,OAAO02C,EAAY,IAFtC,2BAA+B,IAH4B,+BApE3DM,CAA0BhpD,EAAQmkB,GAC3B,CAAEA,YAAW7D,UAiBtB,SAAS2oC,GAAaC,GACpB,OAAOA,EAAS9nD,QAAUtG,KAAKsG,MAG1B,SAASynD,GAAwB7oD,EAAQmkB,EAAW7D,GACzD,IADiE,EAC3DwB,EAAW9hB,EAAO2E,QAAQR,QAAQW,KAAKgd,SADoB,eAE7CA,GAF6C,yBAExD2mC,EAFwD,QAI3DC,EAAavkC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAOggD,KAC5DzwC,EAAQmM,EAAU3N,OAAOkyC,GAC/BA,EAAapoC,EAAOha,QAAQs5C,UAAUyG,UAAU7vC,OAAOhN,UAAUy/C,GAAa,CAAC7nD,MAAM4W,EAAM5W,QAC3Fkf,EAAOha,QAAQs5C,UAAUyG,UAAU7vC,OAAOxE,OAAO02C,EAAY,GAPE,qBAS5C1wC,EAAM26B,SATsC,IAS/D,2BAAkC,CAAC,IAA1BlD,EAAyB,QAC5BnvB,EAAOha,QAAQihB,OAAO4hC,eAAe1Z,KACvCnvB,EAAOha,QAAQihB,OAAOkoB,GAAQz3B,MAAQ,IACpCsI,EAAOha,QAAQohB,OAAOyhC,eAAe1Z,KACvCnvB,EAAOha,QAAQohB,OAAO+nB,GAAQz3B,MAAQ,KAbqB,gCAEjE,2BAA+B,IAFkC,+BCgBnE,IA0OeoxC,GA1OyB,SAAAC,GAAK,OAAI,SAAAC,GAAI,OAAI,SAAAtpD,GAevD,OAdIA,EAAOJ,KAAKkD,SAAS,eAErB9C,EAAO2E,QAAQR,QAAQ1C,gBACmB,KAA1CzB,EAAO2E,QAAQR,QAAQ1C,gBACtBzB,EAAOupD,QACPvpD,EAAOwpD,SAERF,EAAK,CACH1pD,KAAM,oBACN+E,QAAS3E,EAAO2E,QAAQR,QAAQ1C,iBAElCuD,YAAW,kBAAMskD,EAAK,CAAE1pD,KAAM,wBAAwB,OAGlDI,EAAOJ,MAEb,IAAK,0BACHI,EAAO2E,QAAQ9K,SCzEd,SAAuBmG,EAAQnH,GACpC,IAAM4wD,EAAiBzpD,EAAO2E,QAAQR,QAAQW,KAAKwB,QAC7CojD,EAAmB1pD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MACzD5xC,EAAexW,EAAMkgB,SAASvP,WAAU,SAAAlD,GAAO,OAAIA,EAAQmC,KAAOihD,KAExE,OADA7wD,EAAMkgB,SAAS1J,GAAf,2BAAmCxW,EAAMkgB,SAAS1J,IAAkBo6C,GAC7D5wD,EDoEuB6Z,CACxB1S,EACA2pD,qBAAUN,EAAMjlD,WAAW+f,YAE7B,MACF,IAAK,8BACHnkB,EAAO2E,QAAQ9K,SCvEd,SAA2BmG,EAAQnH,GACxC,IAAMmY,EAAchR,EAAO2E,QAAQR,QAAQW,KAAKwB,QAAQ0K,YAMxD,OALAnY,EAAMyN,QAAQ0K,YAAc,CAC1BlF,MAAM,2BAAIjT,EAAMyN,QAAQ0K,YAAYlF,OAAUkF,EAAYlF,OAC1DqF,KAAK,2BAAItY,EAAMyN,QAAQ0K,YAAYG,MAASH,EAAYG,MACxDD,KAAK,2BAAIrY,EAAMyN,QAAQ0K,YAAYE,MAAQF,EAAYE,OAElDrY,EDgEuB0vC,CACxBvoC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,0BACHtgB,EAAO2E,QAAQ9K,SCnEd,SAAuBmG,EAAQnH,GACpC,IAAM+wD,EAAmB5pD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MACzD4I,EAAsBhxD,EAAMkgB,SAASvP,WAAU,SAAAlD,GAAO,OAAIA,EAAQmC,KAAOmhD,KAC/E/wD,EAAMkgB,SAAS/G,OAAO63C,EAAqB,GAE3C,IAL2C,iBAKtC,IAAI7xC,EAAK,KACN8wC,EAAiB9wC,EAAMyB,WAAWyN,QAAQ0iC,GAC1ClB,EAAa7vD,EAAM2d,OAAOhN,WAAU,SAAA0/C,GAAQ,OAAIA,EAASzgD,KAAOuP,EAAMvP,OACpD,IAApBqgD,GACFjwD,EAAM2d,OAAOkyC,GAAYjvC,WAAWzH,OAAO82C,EAAgB,IAGvC,IAAlBA,GAAiD,IAA1B9wC,EAAMyB,WAAWnf,QAAc0F,EAAO2E,QAAQR,QAAQW,KAAKgO,sBACpFja,EAAM2d,OAAOxE,OAAO02C,EAAY,IARpC,mBAAsB7vD,EAAM2d,QAA5B,eAAqC,IAWrC,OAAO3d,EDmDuBga,CACxB7S,EACA2pD,qBAAUN,EAAMjlD,WAAW+f,YAE7B,MAEF,IAAK,2BACHnkB,EAAO2E,QAAQ9K,SE5Fd,SAAwBmG,EAAQnH,GACrC,IAAM4kD,EAAcz9C,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAASA,SAEzD,OADAvrC,EAAMyN,QAAQy+B,WAAWriC,KAAK+6C,GACvB5kD,EFyFuB03C,CACxBvwC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,2BACHtgB,EAAO2E,QAAQ9K,SE5Fd,SAAwBmG,EAAQnH,GACrC,IAAMixD,EAAkB9pD,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAASA,SACvD2lB,EAAc/pD,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAAS8Z,aAEzD,IAAK,IAAI7wB,KAAUx0B,EAAMyN,QAAQqjB,MAC3B9wB,EAAMyN,QAAQqjB,MAAM0D,GAAQ+W,WAAa2lB,IAC3ClxD,EAAMyN,QAAQqjB,MAAM0D,GAAQ+W,SAAW0lB,GAG3C,IAAME,EAAmBnxD,EAAMyN,QAAQy+B,WAAW7d,QAAQ6iC,GAE1D,OADAlxD,EAAMyN,QAAQy+B,WAAWilB,GAAoBF,EACtCjxD,EFiFuB23C,CACxBxwC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,2BACHtgB,EAAO2E,QAAQ9K,SEpFd,SAAwBmG,EAAQnH,GACrC,IAAMoxD,EAAkBjqD,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAASA,SAE7D,IAAK,IAAI/W,KAAUx0B,EAAMyN,QAAQqjB,MAC3B9wB,EAAMyN,QAAQqjB,MAAM0D,GAAQ+W,WAAa6lB,IAC3CpxD,EAAMyN,QAAQqjB,MAAM0D,GAAQ+W,SAAW,WAG3C,IAAM8lB,EAAuBrxD,EAAMyN,QAAQy+B,WAAW7d,QAAQ+iC,GAE9D,OADApxD,EAAMyN,QAAQy+B,WAAW/yB,OAAOk4C,EAAsB,GAC/CrxD,EF0EuB43C,CACxBzwC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MAEF,IAAK,uBACHtgB,EAAO2E,QAAQ9K,SE9Ed,SAAoBmG,EAAQnH,GACjC,IAAMsxD,EAAUnqD,EAAO2E,QAAQR,QAAQW,KAAKkpB,KAW5C,OATAn1B,EAAMyN,QAAQqjB,MAAMwgC,EAAQ1hD,IAAM,CAChCA,GAAI0hD,EAAQ1hD,GACZvC,MAAOikD,EAAQjkD,MACfk+B,SAAU+lB,EAAQ/lB,SAClBC,YAAa8lB,EAAQ9lB,YACrBnxB,IAAKi3C,EAAQj3C,IACboa,KAAM68B,EAAQ78B,KACdgjB,QAAS,CAAEtoB,MAAO,GAAI1B,KAAM,GAAI2hC,MAAO,GAAIE,MAAO,KAE7CtvD,EFkEuBuxD,CACxBpqD,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,uBACHtgB,EAAO2E,QAAQ9K,SErEd,SAAoBmG,EAAQnH,GACjC,IAAMwxD,EAAgBrqD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MACtDqJ,EAActqD,EAAO2E,QAAQR,QAAQW,KAAKkpB,KAMhD,OAJAn1B,EAAMyN,QAAQqjB,MAAM0gC,GAApB,2BACKxxD,EAAMyN,QAAQqjB,MAAM0gC,IACpBC,GAEEzxD,EF6DuBu3C,CACxBpwC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,qBACHtgB,EAAO2E,QAAQ9K,SEhEd,SAAkBmG,EAAQnH,GAC/B,IADsC,EAChC0xD,EAAevqD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAKqnC,OAAO,GAAG,GAC/DqW,EAAgB93C,EAAO2E,QAAQR,QAAQW,KAAKwrC,QAFZ,eAInBwH,GAJmB,IAItC,2BAAkC,CAAC,IAA1BjH,EAAyB,QACZ,SAAhBA,EAAOjxC,OACTixC,EAAOjxC,KAA+B,MAAxBixC,EAAOpoC,GAAGud,OAAO,GAAa,QAAU,SACxDntB,EAAMyN,QAAN,UAAiBuqC,EAAOjxC,KAAxB,MAAiCixC,EAAOpoC,IAAI2X,MAAM1d,KAAK6nD,GAEvD1xD,EAAMyN,QAAQqjB,MAAM4gC,GAAcja,QAAQO,EAAOjxC,MAAM8C,KAAKmuC,EAAOpoC,KAT/B,8BAWtC,OAAO5P,EFqDuB2rC,CACxBxkC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,uBACHtgB,EAAO2E,QAAQ9K,SExDd,SAAoBmG,EAAQnH,GACjC,IADwC,EAClC2xD,EAAiBxqD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAKqnC,OAAO,GAAG,GACjEgpB,EAAkBzqD,EAAO2E,QAAQR,QAAQW,KAAKwrC,QAFZ,eAIrBma,GAJqB,IAIxC,2BAAoC,CAAC,IAA5B5Z,EAA2B,QACd,SAAhBA,EAAOjxC,OACTixC,EAAOjxC,KAA+B,MAAxBixC,EAAOpoC,GAAGud,OAAO,GAAa,QAAU,SACxD,IAAM0kC,EAAsB7xD,EAAMyN,QAAN,UAAiBuqC,EAAOjxC,KAAxB,MAC1BixC,EAAOpoC,IACP2X,MAAM8G,QAAQsjC,GAChB3xD,EAAMyN,QAAN,UAAiBuqC,EAAOjxC,KAAxB,MAAiCixC,EAAOpoC,IAAI2X,MAAMpO,OAChD04C,EACA,GAGF,IAAMC,EAAwB9xD,EAAMyN,QAAQqjB,MAAM6gC,GAAgBla,QAChEO,EAAOjxC,MACPsnB,QAAQ2pB,EAAOpoC,IACjB5P,EAAMyN,QAAQqjB,MAAM6gC,GAAgBla,QAAQO,EAAOjxC,MAAMoS,OACvD24C,EACA,IApBoC,8BAuBxC,OAAO9xD,EFiCuB+tC,CACxB5mC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,uBACHtgB,EAAO2E,QAAQ9K,SEpCd,SAAoBmG,EAAQnH,GACjC,IADwC,EAClC+xD,EAAgB5qD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MADpB,eAGpBpoD,EAAMyN,QAAQqjB,MAAMihC,GAAeta,QAAQtoB,OAHvB,IAGxC,2BAAsE,CAAC,IAA9DwB,EAA6D,QAC9DqhC,EAAqBhyD,EAAMyN,QAAQ6hB,OAAOqB,GAASpJ,MAAM8G,QAC7D0jC,GAEF/xD,EAAMyN,QAAQ6hB,OAAOqB,GAASpJ,MAAMpO,OAAO64C,EAAoB,IAPzB,mDASrBhyD,EAAMyN,QAAQqjB,MAAMihC,GAAeta,QAAQhqB,MATtB,IASxC,2BAAoE,CAAC,IAA5DmP,EAA2D,QAC5Do1B,EAAqBhyD,EAAMyN,QAAQmgB,MAAMgP,GAAQrV,MAAM8G,QAC3D0jC,GAEF/xD,EAAMyN,QAAQmgB,MAAMgP,GAAQrV,MAAMpO,OAAO64C,EAAoB,IAbvB,mDAepBhyD,EAAMyN,QAAQqjB,MAAMihC,GAAeta,QAAQ2X,OAfvB,IAexC,2BAAsE,CAAC,IAA9DzgC,EAA6D,QAC9DqjC,EAAqBhyD,EAAMyN,QAAQihB,OAAOC,GAASpH,MAAM8G,QAC7D0jC,GAEF/xD,EAAMyN,QAAQihB,OAAOC,GAASpH,MAAMpO,OAAO64C,EAAoB,IAnBzB,mDAqBpBhyD,EAAMyN,QAAQqjB,MAAMihC,GAAeta,QAAQ6X,OArBvB,IAqBxC,2BAAsE,CAAC,IAA9DxgC,EAA6D,QAC9DkjC,EAAqBhyD,EAAMyN,QAAQohB,OAAOC,GAASvH,MAAM8G,QAC7D0jC,GAEF/xD,EAAMyN,QAAQohB,OAAOC,GAASvH,MAAMpO,OAAO64C,EAAoB,IAzBzB,8BA6BxC,cADOhyD,EAAMyN,QAAQqjB,MAAMihC,GACpB/xD,EFOuBw3C,CACxBrwC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MAEF,IAAK,yBACHtgB,EAAO2E,QAAQ9K,SH3Id,SAAsBmG,EAAQnH,GAiBnC,IAjB2C,IAAD,IACpCmuD,EAAgBhnD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWmlB,cACvDz0B,EAAcy0B,EAAgBnuD,EAAMyN,QAAQ6hB,OAAO6+B,GAAiB,KACpEhlB,EAAahiC,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWG,WACpDilB,EAAajnD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW2J,UACpDtJ,EAAcliC,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWK,YACrDglB,EAAclnD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW5X,MACrDk9B,EAAcnnD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWp1B,QACrD+5C,EAAmBxmD,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW2kB,iBAC1D39B,EAAW7oB,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWhZ,SAClD5B,EAAUjnB,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW5a,QACjD0rB,EAAU3yC,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW8Q,QACjDzsC,EAAQlG,EAAO2E,QAAQR,QAAQW,KAAKgH,MAAM5F,MAC1CtG,EAAOI,EAAO2E,QAAQR,QAAQW,KAAKgH,MAAMlM,KACzCs4B,EAAWl4B,EAAO2E,QAAQR,QAAQW,KAAKgH,MAAMosB,SAC7CT,EAASz3B,EAAO2E,QAAQR,QAAQW,KAAKgH,MAAM2rB,OAC7CqzB,EAAqB,GAChBtY,EAAQ,EAAGA,EAAQxQ,EAAYwQ,IAEtC35C,EAAMyN,QAAQ6hB,OAAO,SAAWU,EAAS2pB,IAAU,CACjD/pC,GAAI,SAAWogB,EAAS2pB,GACxBtsC,MAAOA,GAAe,OACtBtG,KAAMA,GAAa,QACnBs4B,SAAUA,GAAqB,GAC/BT,OAAQA,GAAiB,GACzBhO,UAAW8I,EAAcA,EAAY9I,UAAU,EAAI,EACnD7B,SAAU2K,EAAcA,EAAY9pB,GAAK,KACzC2X,MAAO,GACP8F,WAAY,QACZsC,UAAWvB,EAAQwa,MAAM+Q,EAAMyU,EAAYzU,EAAMyU,EAAWA,GAAYx7C,KAAI,SAAAgqB,GAAM,MAAI,QAAQA,MAEhGq1B,EAAmBpoD,KAAK,SAAWmmB,EAAS2pB,IAG1CjgB,IAAa,EAAA15B,EAAMyN,QAAQ6hB,OAAO6+B,GAAex+B,WAAUxW,OAA9C,SAAqDkwB,EAAY,EAAG,GAApE,OAA0E4oB,KAE3F,EAAAjyD,EAAMyN,QAAQuiB,UAAS7W,OAAvB,SAA8Bk1C,EAAY,EAAG,GAA7C,OAAmD4D,IAEnD,IAtC0C,EAsCtCvD,EAAiB,GAtCqB,eAuCtB1uD,EAAMyN,QAAQuiB,UAvCQ,IAuC1C,2BAA4C,CAAC,IAApCW,EAAmC,QACpC1d,EAAQjT,EAAMyN,QAAQ6hB,OAAOqB,GACb,IAAlB1d,EAAM2d,WAAe88B,GAAez6C,EAAM0c,UAAW3vB,EAAO0uD,IAzCxB,8BA2C1C1uD,EAAMyN,QAAQ2gB,QAAUsgC,EAGxB,IADA,IAAI7mB,EAAa,EACjB,MAAoBoqB,EAApB,eAAuC,CAWrCjyD,EAAQiuD,GAVO,CAACniD,QAAS,CAACR,QAAS,CAACW,KAAM,CACxCqM,KAAM,CAAEyW,SAFI,MAGZia,WAAY,CACV2J,UAAWyb,EACXx6C,QAAS06C,EACTX,iBAAkBA,EAClBv/B,QAASA,EAAQwa,MAAMf,EAAWumB,EAAYvmB,EAAWumB,EAAWA,GACpEtU,QAASA,EAAQlR,MAAiB,EAAXf,EAAaumB,EAAuB,EAAXvmB,EAAaumB,EAAW,EAAEA,QAGjDpuD,GAAO,GACpC6nC,GAAc,EAKhB,OAFA7nC,EAAM0rB,iBAAiBiC,WAAWza,OAASkb,EAAQxb,KAAI,SAACgqB,GAAD,MAAU,QAAQA,KACzE58B,EAAM0rB,iBAAiBiC,WAAWpV,OAAlC,UAA+C05C,GACxCjyD,EG4EuBkyD,CACxB/qD,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7Btb,YAAW,kBAAMskD,EAAK,CAAE1pD,KAAM,cAAc,KAC5C,MACF,IAAK,wBACHI,EAAO2E,QAAQ9K,SHhFd,SAAqBmG,EAAQnH,GAClC,IAAMmyD,EAAiBhrD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MACvDpwC,EAAe7Q,EAAO2E,QAAQR,QAAQW,KAAKgH,MAGjD,OADAjT,EAAMyN,QAAQ6hB,OAAO6iC,GAArB,2BAA4CnyD,EAAMyN,QAAQ6hB,OAAO6iC,IAAoBn6C,GAC9EhY,EG2EuBuhC,CACxBp6B,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,yBACHtgB,EAAO2E,QAAQ9K,SH9Ed,SAAsBmG,EAAQnH,GACnC,IAD0C,EACpCoyD,EAAgBjrD,EAAO2E,QAAQR,QAAQW,KAAKsM,OADR,eAEjB65C,GAFiB,IAE1C,2BAAwC,CAAC,IAAhCp6C,EAA+B,QAEtChY,EAAMyN,QAAQ6hB,OAAOtX,EAAapI,IAAlC,2BAA6C5P,EAAMyN,QAAQ6hB,OAAOtX,EAAapI,KAAQoI,EAAamY,aAJ5D,8BAM1C,OAAOnwB,EGwEuBwwC,CACxBrpC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,wBACH,IAAM8nC,EAAiBpoD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MAC7DjhD,EAAO2E,QAAQ9K,SAAW6wC,GACxB0d,EACAuB,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,yBACH,IAAM4qC,EAAkBlrD,EAAO2E,QAAQR,QAAQW,KAAKsM,OACpDpR,EAAO2E,QAAQ9K,SHpDd,SAAsBqxD,EAAiBryD,GAAQ,IAAD,iBACxBqyD,GADwB,IACnD,2BAA4C,CAAC,IAApC9C,EAAmC,QACtCvvD,EAAMyN,QAAQ6hB,OAAOghC,eAAef,IACtC1d,GAAY0d,EAAgBvvD,IAHmB,8BAKnD,OAAOA,EG+CuB8xC,CACxBugB,EACAvB,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MAEF,IAAK,kCACHtgB,EAAO2E,QAAQ9K,SJ0Jd,SAA8BmG,EAAQnH,GAC3C,IAAIsyD,EAAcnrD,EAAO2E,QAAQR,QAAQW,KAAKinC,YAC1C9kB,EAAUjnB,EAAO2E,QAAQR,QAAQW,KAAKmiB,QAC1C,IAAK,IAAMzX,KAASyX,EAAS,CACdpuB,EAAMyN,QAAQmgB,MAAMQ,EAAQzX,IACrC,aAAJ,UAA0B27C,GAC1BA,IAEF,OAAOtyD,EIlKuBmzC,CACxBhsC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,iCACHtgB,EAAO2E,QAAQ9K,SJqId,SAA6BmG,EAAQnH,GAC1C,IAAIsyD,EAAcnrD,EAAO2E,QAAQR,QAAQW,KAAKinC,YAC1C8G,EAAW7yC,EAAO2E,QAAQR,QAAQW,KAAK+tC,SACvCC,EAAW9yC,EAAO2E,QAAQR,QAAQW,KAAKguC,SAC3C,IAAK,IAAMtjC,KAASqjC,EAAU,CAC5B,IAAM9oB,EAAQlxB,EAAMyN,QAAQihB,OAAOsrB,EAASrjC,IACtCwa,EAAQnxB,EAAMyN,QAAQohB,OAAOorB,EAAStjC,IAC5Cua,EAAK,YAAkBohC,EACvBA,IACAnhC,EAAK,YAAkBmhC,EACvBA,IAEF,OAAOtyD,EIjJuBozC,CACxBjsC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,6BACH,IAAI8qC,EAAuBprD,EAAO2E,QAAQR,QAAQW,KAAK+nC,MACvD7sC,EAAO2E,QAAQ9K,SAAWs0C,GACxBnuC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,QAC3B8qC,GAEF,MACF,IAAK,yBACHprD,EAAO2E,QAAQ9K,SAAWitD,GACxB9mD,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7Btb,YAAW,kBAAMskD,EAAK,CAAE1pD,KAAM,cAAc,KAC5C,MACF,IAAK,uBACHI,EAAO2E,QAAQ9K,SJ1Ed,SAAoBmG,EAAQnH,GACjC,IAAMwyD,EAAgBrrD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MACtDqK,EAActrD,EAAO2E,QAAQR,QAAQW,KAAKqM,KAmChD,OAjCInR,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKg4C,eAAe,gBAClDtwD,EAmCJ,SAAuBA,EAAO48B,EAAQ81B,GACpC,IAAMp6C,EAAOtY,EAAMyN,QAAQmgB,MAAMgP,GAC7BtkB,EAAKgZ,eACPtxB,EAAMyN,QAAQmgB,MAAMtV,EAAKgZ,cAAcA,aAAe,MAExD,GAAIohC,EAAe,CACjB,IAAMC,EAAkB3yD,EAAMyN,QAAQmgB,MAAM8kC,GACxCC,EAAgBrhC,eAClBtxB,EAAMyN,QAAQmgB,MAAM+kC,EAAgBrhC,cAAcA,aAAe,MAEnEtxB,EAAMyN,QAAQmgB,MAAM8kC,GAAephC,aAAesL,EAEpD,OAAO58B,EA/CG4yD,CACN5yD,EACAwyD,EACArrD,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKgZ,cAGnCnqB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKg4C,eAAe,kBAEhDtwD,EA0CJ,SAA2BA,EAAO48B,EAAQi2B,GACxC,IAAMC,EACJ9yD,EAAMyN,QAAQ2gB,QAAQpuB,EAAMyN,QAAQ2gB,QAAQC,QAAQuO,GAAU,GAEhE,OADA58B,EAAMyN,QAAQmgB,MAAMklC,GAAavgB,eAAiBsgB,EAC3C7yD,EA9CG+yD,CACN/yD,EACAwyD,EACArrD,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAK2c,gBAGnC9tB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKg4C,eAAe,kBAEhDtwD,EAyCJ,SAA2BA,EAAO48B,EAAQi2B,GACxC,IAAMG,EACJhzD,EAAMyN,QAAQ2gB,QAAQpuB,EAAMyN,QAAQ2gB,QAAQC,QAAQuO,GAAU,GAEhE,OADA58B,EAAMyN,QAAQmgB,MAAMolC,GAAa/9B,eAAiB49B,EAC3C7yD,EA7CGizD,CACNjzD,EACAwyD,EACArrD,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKi6B,gBAGnCprC,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAKg4C,eAAe,aACF,UAA9CnpD,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAK4a,WAEjClzB,EAAQ2uD,GAAkB3uD,EAAOwyD,IAGnCxyD,EAAMyN,QAAQmgB,MAAM4kC,GAApB,2BACKxyD,EAAMyN,QAAQmgB,MAAM4kC,IACpBC,GAEEzyD,EIqCuB0zC,CACxBvsC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,yBACHtgB,EAAO2E,QAAQ9K,SJJd,SAAsBmG,EAAQnH,GACnC,IAD0C,EACpCkzD,EAAgB/rD,EAAO2E,QAAQR,QAAQW,KAAK+nC,MADR,eAElBkf,GAFkB,IAE1C,2BAAuC,CAAC,IAA/BT,EAA8B,QAErCzyD,EAAMyN,QAAQmgB,MAAM6kC,EAAY7iD,IAAhC,2BACK5P,EAAMyN,QAAQmgB,MAAM6kC,EAAY7iD,KAChC6iD,EAAYtiC,YAGfsiC,EAAYtiC,WAAWmgC,eAAe,aACF,UAApCmC,EAAYtiC,WAAW+C,WAEvBlzB,EAAQ2uD,GAAkB3uD,EAAOyyD,EAAY7iD,MAZP,8BAe1C,OAAO5P,EIXuBmzD,CACxBhsD,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,uBACH,IAAMmnC,EAAgBznD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MAC5DjhD,EAAO2E,QAAQ9K,SAAWm0C,GACxByZ,EACAkC,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,yBACH,IAAM2rC,EAAiBjsD,EAAO2E,QAAQR,QAAQW,KAAK+nC,MACnD7sC,EAAO2E,QAAQ9K,SJqFd,SAAsBoyD,EAAgBpzD,GAAQ,IAAD,iBACxBozD,GADwB,IAClD,2BAA0C,CACxCje,GADwC,QACdn1C,IAFsB,8BAIlD,OAAOA,EIzFuBqzD,CACxBD,EACAtC,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MAEF,IAAK,uBACHtgB,EAAO2E,QAAQ9K,SFtOd,SAAoBmG,EAAQnH,GACjC,IAAMszD,EAAgBnsD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MACtDuH,EAAcxoD,EAAO2E,QAAQR,QAAQW,KAAKoM,KAMhD,MAJ8B,MAA1Bi7C,EAAcnmC,OAAO,GACvBntB,EAAMyN,QAAQihB,OAAO4kC,GAArB,2BAA2CtzD,EAAMyN,QAAQihB,OAAO4kC,IAAmB3D,GAEnF3vD,EAAMyN,QAAQohB,OAAOykC,GAArB,2BAA2CtzD,EAAMyN,QAAQohB,OAAOykC,IAAmB3D,GAC9E3vD,EE8NuB62C,CACxB1vC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,wBACHtgB,EAAO2E,QAAQ9K,SAAW+1C,GACxB5vC,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,qBACHtgB,EAAO2E,QAAQ9K,SF3Nd,SAAkBmG,EAAQsgB,EAAQ6D,GAEvC,IAFkD,EAE5CioC,EAAcpsD,EAAO2E,QAAQR,QAAQW,KAAK6qC,MAFE,eAG3Byc,GAH2B,yBAGzCC,EAHyC,QAI1CC,EAAeD,EAAW5jD,GAC1B8jD,EAAkBF,EAAWrjC,WAAWhR,MACxCw0C,EAAyC,MAA3BF,EAAatmC,OAAO,GAAa,SAAW,SAC1DymC,EAAmBnsC,EAAOha,QAAQkmD,GAAaF,GAAct0C,MAC/D00C,GAAgB,EAEpB,GAAIH,EAAgBpD,eAAe,eAA8C,cAA7BoD,EAAgB7tB,WAAyB,CAC3FguB,EAAgBH,EAAgB/lD,IAAIpM,MAAM,KAAK6mD,MAAM7mD,MAAM,KAAK,GAChE,IAAIuyD,EAAqBxoC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAKikD,KACxE,GAAIC,GAAoB,GAGG,IAFDxoC,EAAU3N,OAAOm2C,GAAoBha,QAAQzrB,QAAQolC,IAG3EnoC,EAAU3N,OAAOm2C,GAAoBha,QAAQjwC,KAAK4pD,GAIxD,GAAIC,EAAgBpD,eAAe,eAAiBsD,EAAiBtD,eAAe,eAAiD,cAAhCsD,EAAiB/tB,WAA4B,CAChJ,IAAIkuB,EAAkBH,EAAiBjmD,IAAIpM,MAAM,KAAK6mD,MAAM7mD,MAAM,KAAK,GACvE,IAAKsyD,GAAiBA,IAAkBE,EAAiB,CACvD,IAAIC,EAAuB1oC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAOmkD,KACxEE,EAAoB3oC,EAAU3N,OAAOq2C,GAAsBla,QAAQzrB,QAAQolC,IACpD,IAAvBQ,GACF3oC,EAAU3N,OAAOq2C,GAAsBla,QAAQ3gC,OAAO86C,EAAmB,IAI/E,IAAKP,EAAgBpD,eAAe,eAAiBsD,EAAiBtD,eAAe,eAA+C,cAA9BsD,EAAiB/tB,WAAyB,CAC9I,IAAI+pB,EAAUgE,EAAiBjmD,IAAIpM,MAAM,KAAK6mD,MAAM7mD,MAAM,KAAK,GAC3DsuD,EAAavkC,EAAU3N,OAAOhN,WAAU,SAAAwO,GAAK,OAAIA,EAAMvP,KAAOggD,KAClE,GAAIC,GAAY,EAAG,CACjB,IAAIoE,EAAoB3oC,EAAU3N,OAAOkyC,GAAY/V,QAAQzrB,QAAQolC,IAC1C,IAAvBQ,GACF3oC,EAAU3N,OAAOkyC,GAAY/V,QAAQ3gC,OAAO86C,EAAmB,MAlCvE,2BAAoC,IAHc,8BA0ClD,OADAld,GAAY5vC,EAAQsgB,GACb,CAAE6D,YAAW7D,UEiLUysC,CACxB/sD,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,QAC3BqpC,qBAAUN,EAAMjlD,WAAW+f,YAE7B,MAEF,IAAK,uBACHnkB,EAAO2E,QAAQ9K,SAAWyf,GACxBtZ,EACA2pD,qBAAUN,EAAMjlD,WAAW+f,WAC3BwlC,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,yBACHtgB,EAAO2E,QAAQ9K,SAAW6a,GACxB1U,EACA2pD,qBAAUN,EAAMjlD,WAAW+f,WAC3BwlC,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,yBACHtgB,EAAO2E,QAAQ9K,SAAW0a,GACxBvU,EACA2pD,qBAAUN,EAAMjlD,WAAW+f,WAC3BwlC,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MAEF,IAAK,2BACHtgB,EAAO2E,QAAQ9K,SGhRd,SAAwBmG,EAAQnH,GACrC,IAAMm0D,EAAkBhtD,EAAO2E,QAAQR,QAAQW,KAAKu6C,SAGpD,OADAxmD,EAAMyN,QAAQs5C,UAAUoN,EAAgBvkD,IAAIlP,KAAOyzD,EAAgBzzD,KAC5DV,EH4QuBymD,CACxBt/C,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAE7B,MACF,IAAK,2BACHtgB,EAAO2E,QAAQ9K,SG/Qd,SAAwBmG,EAAQnH,GACrC,IAAMo0D,EAAkBjtD,EAAO2E,QAAQR,QAAQW,KAAKu6C,gBAE7CxmD,EAAMyN,QAAQs5C,UAAUqN,EAAgBxkD,IAE/C,2BAAwBvN,OAAO9B,KAAKP,EAAMyN,QAAQihB,SAAlD,eAA2D,CAAtD,IAAIC,EAAO,KACRF,EAAYzuB,EAAMyN,QAAQihB,OAAOC,GACnCF,EAAUtP,MAAMmxC,eAAe,eAAiB7hC,EAAUtP,MAAM0mB,aAAauuB,EAAgBxkD,KAC/F5P,EAAMyN,QAAQihB,OAAOC,GAASxP,MAAQ,IAE1C,2BAAwB9c,OAAO9B,KAAKP,EAAMyN,QAAQohB,SAAlD,eAA4D,CAAvD,IAAIC,EAAO,KACRF,EAAY5uB,EAAMyN,QAAQohB,OAAOC,GACnCF,EAAUzP,MAAMmxC,eAAe,eAAiB1hC,EAAUzP,MAAM0mB,aAAeuuB,EAAgBxkD,KACjG5P,EAAMyN,QAAQohB,OAAOC,GAAS3P,MAAQ,IAE1C,OAAOnf,EHgQuBsoD,CACxBnhD,EACA2pD,qBAAUN,EAAMjlD,WAAWkc,SAMjCgpC,EAAKtpD,MIzRP,IAaektD,GAbwB,SAAA7D,GAAK,OAAI,SAAAC,GAAI,OAAI,SAAAtpD,GACtD,OAAQA,EAAOJ,MAEb,IAAK,gCACHI,EAAO2E,QAAQ9K,SCTd,SAAiCmG,EAAQmkB,EAAW7D,GACzD,IAAM6sC,EAAentD,EAAO2E,QAAQ6R,OAWpC,OAVA2N,EAAU3N,OAAV,uBAAuB2N,EAAU3N,QAAjC,aAA4C22C,IAClB,KAAtB7sC,EAAOha,QAAQmC,KAEjB6X,EAAOha,QAAQs5C,UAAUyG,UAAU7vC,OAAnC,uBACK8J,EAAOha,QAAQs5C,UAAUyG,UAAU7vC,QADxC,aAEK22C,EAAa1hD,KAAI,SAAAuM,GAClB,MAAO,CAAE5W,MAAO4W,EAAM5W,MAAOoF,IAAKwR,EAAMxR,IAAKk4B,WAAY,mBAIxD,CAACva,YAAW7D,UDHW8sC,CAAwBptD,EAAQ2pD,qBAAUN,EAAMjlD,WAAW+f,WAAYwlC,qBAAUN,EAAMjlD,WAAWkc,SAKhIgpC,EAAKtpD,MEkIA,SAASqtD,GAAuBpmC,EAASpuB,GAC9C,IADqD,EAC/Cy0D,EAAiB,GAGjBC,EA3BR,SAAqCtmC,EAASpuB,GAE5C,IADA,IAAM20D,EAAiB,CAAC,CAACvmC,EAAQ,KACxBrW,EAAI,EAAGA,EAAIqW,EAAQ3sB,OAAQsW,IAAK,CACvC,IAAM6kB,EAASxO,EAAQrW,GACjB68C,EAAcD,EAAeA,EAAelzD,OAAS,GACrDozD,EAAeD,EAAYA,EAAYnzD,OAAS,GAEpDzB,EAAMyN,QAAQmgB,MAAMinC,GAAc9lC,WAChC/uB,EAAMyN,QAAQmgB,MAAMgP,GAAQ7N,UAC9B/uB,EAAMyN,QAAQ2gB,QAAQC,QAAQuO,GAC5B58B,EAAMyN,QAAQ2gB,QAAQC,QAAQwmC,KAC9B,EAGFD,EAAY/qD,KAAK+yB,GAGjB+3B,EAAe9qD,KAAK,CAAC+yB,IAGzB,OAAO+3B,EAOeG,CAA4B1mC,EAASpuB,GAJN,eAM/B00D,GAN+B,IAMrD,2BAAqC,CAAC,IAA3BtmC,EAA0B,QAC7BW,EAAW/uB,EAAMyN,QAAQmgB,MAAMQ,EAAQ,IAAIW,SAC3C+qB,EAAU1rB,EACbxb,KAAI,SAAAgqB,GAAM,MAAI,CACb58B,EAAMyN,QAAQmgB,MAAMgP,GAAQjO,QAAQptB,MAAM,KAAK,GAC/CvB,EAAMyN,QAAQmgB,MAAMgP,GAAQ9N,QAAQvtB,MAAM,KAAK,OAEhDg3B,QAAO,SAAC72B,EAAGG,GAAJ,OAAUH,EAAEoW,OAAOjW,MAgBvBkzD,EAAgBhsB,GAdT,CACXsO,WAAYr3C,EAAMyN,QAAQmC,GAC1Bmf,SAAUA,EACV6B,UAAW5wB,EAAMyN,QAAQ6hB,OAAOP,GAAU6B,WAEzB,CACjBhd,SAAS,EACTwa,QAASA,EAAQxb,KAAI,SAAAhD,GAAE,OAAIA,EAAGrO,MAAM,KAAK,MACzC8nC,YACErpC,EAAMyN,QAAQ6hB,OAAOP,GAAUY,UAAUtB,QAAQD,EAAQ,IAAM,EACjEukB,UAAWvkB,EAAQ3sB,OACnB2vB,MAAOpxB,EAAMyN,QAAQ2gB,QAAQC,QAAQD,EAAQ,IAAM,EACnD0rB,QAASA,IAGX2a,EAAe5qD,KAAKkrD,IA9B+B,8BAkCrD,IAlCqD,EAkC/C/gB,EAAQ,GAlCuC,eAmChC5lB,GAnCgC,IAmCrD,2BAA8B,CAAC,IAApBwO,EAAmB,QACtBtkB,EAAOtY,EAAMyN,QAAQmgB,MAAMgP,GAC7BzM,EAAa,GAajB,GAZAA,EAAU,aAAmB7X,EAAKgV,aAClC6C,EAAU,KAAW7X,EAAKvR,KAC1BopB,EAAU,SAAe7X,EAAK4a,SAC9B/C,EAAU,KAAW7X,EAAKqb,KACtBrb,EAAKgZ,eACPnB,EAAU,aAAmB7X,EAAKgZ,aAElC0iB,EAAMnqC,KAAK,CACT+F,GAAI0I,EAAKgZ,aACTnB,WAAY,CAAEmB,aAAcsL,MAGJ,SAAxBtkB,EAAK2c,eAA2B,CAClC9E,EAAU,eAAqB7X,EAAK2c,eAEpC,IAAM+/B,EACJh1D,EAAMyN,QAAQ2gB,QAAQpuB,EAAMyN,QAAQ2gB,QAAQC,QAAQuO,GAAU,GAC3DxO,EAAQnkB,SAAS+qD,IACpBhhB,EAAMnqC,KAAK,CACT+F,GAAIolD,EACJ7kC,WAAY,CAAEoiB,eAAgBj6B,EAAK2c,kBAGzC,GAA4B,SAAxB3c,EAAKi6B,eAA2B,CAClCpiB,EAAU,eAAqB7X,EAAKi6B,eAEpC,IAAM0iB,EACJj1D,EAAMyN,QAAQ2gB,QAAQpuB,EAAMyN,QAAQ2gB,QAAQC,QAAQuO,GAAU,GAC3DxO,EAAQnkB,SAASgrD,IACpBjhB,EAAMnqC,KAAK,CACT+F,GAAIqlD,EACJ9kC,WAAY,CAAE8E,eAAgB3c,EAAKi6B,kBAGzCyB,EAAMnqC,KAAK,CACT+F,GAAIgtB,EACJzM,gBA1EiD,8BA6ErD,IAAM+kC,EAAqBjhB,GAAYD,EAAOh0C,EAAMyN,QAAQmC,IAC5D6kD,EAAe5qD,KAAKqrD,GAGpB,IAjFqD,EAiF/Cpe,EAAQ,GAjFuC,eAkFhC1oB,GAlFgC,IAkFrD,2BAA8B,CAAC,IAApBwO,EAAmB,QACtBtkB,EAAOtY,EAAMyN,QAAQmgB,MAAMgP,GAC3B1L,EAAQlxB,EAAMyN,QAAQihB,OAAOpW,EAAKqW,SAClCwC,EAAQnxB,EAAMyN,QAAQohB,OAAOvW,EAAKwW,SACxCgoB,EAAMjtC,KAAK,CACT+F,GAAIshB,EAAMthB,GACVugB,WAAY,CACV6H,QAAS9G,EAAM8G,QACf1K,aAAc4D,EAAM5D,aAAe4D,EAAM5D,aAAe,GACxDmhC,iBAAkBv9B,EAAMu9B,oBAG5B3X,EAAMjtC,KAAK,CACT+F,GAAIuhB,EAAMvhB,GACVugB,WAAY,CACV6H,QAAS7G,EAAM6G,QACf1K,aAAc6D,EAAM7D,aAAe6D,EAAM7D,aAAe,GACxDmhC,iBAAkBt9B,EAAMs9B,qBAnGuB,8BAuGrD,IAAM0G,EAAcpe,GAAYD,GAChC2d,EAAe5qD,KAAKsrD,GAxGiC,qBA2GhC/mC,GA3GgC,IA2GrD,2BAA8B,CAAC,IAApBwO,EAAmB,QACtBtkB,EAAOtY,EAAMyN,QAAQmgB,MAAMgP,GAC3B1L,EAAQlxB,EAAMyN,QAAQihB,OAAOpW,EAAKqW,SAClCwC,EAAQnxB,EAAMyN,QAAQohB,OAAOvW,EAAKwW,SAExC,GAAIxW,EAAKiP,MAAM9lB,OAAS,EAAG,CACzB,IADyB,EACnBg2C,EAAU,CAAC,CAAE7nC,GAAIgtB,EAAQ71B,KAAM,SADZ,eAEJuR,EAAKiP,OAFD,IAEzB,2BAAiC,CAAC,IAC1B6tC,EAAczpB,GADW,QACM8L,GACrCgd,EAAe5qD,KAAKurD,IAJG,+BAO3B,GAAIlkC,EAAM3J,MAAM9lB,OAAS,EAAG,CAC1B,IAD0B,EACpBg2C,EAAU,CAAC,CAAE7nC,GAAIshB,EAAMthB,GAAI7I,KAAM,SADb,eAELmqB,EAAM3J,OAFD,IAE1B,2BAAkC,CAAC,IAC3B6tC,EAAczpB,GADY,QACK8L,GACrCgd,EAAe5qD,KAAKurD,IAJI,+BAO5B,GAAIjkC,EAAM5J,MAAM9lB,OAAS,EAAG,CAC1B,IAD0B,EACpBg2C,EAAU,CAAC,CAAE7nC,GAAIuhB,EAAMvhB,GAAI7I,KAAM,SADb,eAELoqB,EAAM5J,OAFD,IAE1B,2BAAkC,CAAC,IAC3B6tC,EAAczpB,GADY,QACK8L,GACrCgd,EAAe5qD,KAAKurD,IAJI,iCA9HuB,8BAuIrD,IAvIqD,EAuI/CC,EAAgB,GAvI+B,eAwIhCjnC,GAxIgC,IAwIrD,2BAA8B,CAAC,IAApBwO,EAAmB,QACtBtkB,EAAOtY,EAAMyN,QAAQmgB,MAAMgP,GAC3B3pB,EAAQjT,EAAMyN,QAAQ6hB,OAAOhX,EAAKyW,UAEtC9b,EAAM2rB,OAAOn9B,OAAS,IACrBwR,EAAM2rB,OAAO,KAAOhC,GAClB3pB,EAAM2rB,OAAO,IAAM3rB,EAAM2rB,OAAO,KAAOhC,IAE1Cy4B,EAAcxrD,KAAK,CACjB+F,GAAIqD,EAAMrD,GACVugB,WAAY,CACVyO,OAAQ3rB,EAAM2rB,UAKlB3rB,EAAMosB,SAAS59B,OAAS,IACvBwR,EAAMosB,SAAS,KAAOzC,GACpB3pB,EAAMosB,SAAS,IAAMpsB,EAAMosB,SAAS,KAAOzC,IAE9Cy4B,EAAcxrD,KAAK,CACjB+F,GAAIqD,EAAMrD,GACVugB,WAAY,CACVkP,SAAUpsB,EAAMosB,aA/J6B,8BAsKrD,OAFIg2B,EAAc5zD,OAAS,GACzBgzD,EAAe5qD,KAAK2mC,GAAa6kB,IAC5BZ,ECjPT,SAASa,GAAsB3kC,EAAS3wB,GACtC,IAAMiT,EAAQjT,EAAMyN,QAAQ6hB,OAAOqB,GAC/B8jC,EAAiB,GAEfc,EAAY,CAChBle,WAAYr3C,EAAMyN,QAAQmC,GAC1BvC,MAAO4F,EAAM5F,MACbtG,KAAMkM,EAAMlM,KACZs4B,SAAUpsB,EAAMosB,SAChBT,OAAQ3rB,EAAM2rB,QAEVoK,EAAa,CACjBG,WAAY,EACZ/a,QAAS,GACT0rB,QAAS,GACT9pB,SAAU,CAACW,EAAQpvB,MAAM,KAAK,IAC9B6vB,MAAOpxB,EAAMyN,QAAQuiB,SAAS3B,QAAQsC,GAAW,GAE/C1d,EAAM8b,UACRia,EAAU,YAAkBhpC,EAAMyN,QAAQ6hB,OAAOrc,EAAM8b,UAAUY,UAAUtB,QAAQsC,GAAW,EAC9FqY,EAAU,cAAoB/1B,EAAM8b,UAEpCia,EAAU,YAAkBA,EAAW5X,MAEzCqjC,EAAe5qD,KAAKggC,GAAU0rB,EAAWvsB,IAGzC,IA3B6C,EA2BvCwsB,EAuBR,SAA+B7lC,GAE7B,IADA,IAAI1Z,EAAS0Z,EAAUluB,OAAO,EAAG,CAAC,CAACkuB,EAAU,KAAO,GAC3C5X,EAAE,EAAGA,EAAE4X,EAAUluB,OAAQsW,IAAK,CACrC,IAAM68C,EAAc3+C,EAAOA,EAAOxU,OAAO,GACnCg0D,EAAab,EAAYA,EAAYnzD,OAAO,GAC5CkpC,EAAShb,EAAU5X,GACT,MAAZ4yB,EAAO,IAA4B,MAAhB8qB,EAAW,GAChCx/C,EAAOpM,KAAK,CAAC8gC,IAEbiqB,EAAY/qD,KAAK8gC,GAGrB,OAAO10B,EAnCgBy/C,CAAsBziD,EAAM0c,WA3BN,eA4BzB6lC,GA5ByB,IA4B7C,2BAAoC,CAAC,IAA5BzpC,EAA2B,QAEhC0oC,EADkB,MAAhB1oC,EAAQ,GAAG,GACI0oC,EAAe38C,OAAO08C,GAAuBzoC,EAAS/rB,IAGtDy0D,EAAe38C,OAAOw9C,GAAsBvpC,EAAQ,GAAI/rB,KAjChC,8BAqC7C,GAAIiT,EAAMsU,MAAM9lB,OAAO,EAAG,CACxB,IADwB,EAClBg2C,EAAU,CAAC,CAAE7nC,GAAI+gB,EAAS5pB,KAAM,UADd,eAEHkM,EAAMsU,OAFH,IAExB,2BAAkC,CAAC,IAC3B6tC,EAAczpB,GADY,QACK8L,GACrCgd,EAAe5qD,KAAKurD,IAJE,+BAO1B,OAAOX,ECjGF,SAASkB,GAAgBxuD,EAAQnH,GACtC,IAD6C,EACvC41D,EAAWzuD,EAAO2E,QAAQR,QAAQW,KAAK6qC,MACvCA,EAAQ,GAF+B,eAIvB8e,GAJuB,IAI7C,2BAAgC,CAAC,IAAtBtqD,EAAqB,QACxB09C,EAAW19C,EAAQsE,GAAGrO,MAAM,KAAK,GAAK,IACtC8W,EAAOrY,EAAMyN,QAAQu7C,GAAU19C,EAAQsE,IACvC+M,EAAO,CACX/M,GAAItE,EAAQsE,GACZugB,WAAY,IAEd,IAAK,IAAM3D,KAAalhB,EAAQ6kB,WACzB7kB,EAAQ6kB,WAAWmgC,eAAe9jC,KACvC7P,EAAKwT,WAAW3D,GAAanU,EAAKmU,IAEpCsqB,EAAMjtC,KAAK8S,IAfgC,8BAkB7C,MAAO,CADgBo6B,GAAYD,ICYrC,IChCI+e,GDkOWC,GAlMY,SAAAtF,GAAK,OAAI,SAAAC,GAAI,OAAI,SAAAtpD,GAAW,SACtC4uD,EADqC,8EACpD,WAAkCH,GAAlC,mBAAAl0D,EAAA,0DACMk0D,EAAS,GAAGloD,MAAM,GAAGzD,SAAS,UADpC,gBAIIumD,EAAMhlD,SAASoqD,EAAS,IAJ5B,uBAMQA,EAASn0D,OAAS,IAEpBm0D,EAASz8C,OAAO,EAAG,EAAG,CACpBpS,KAAM,uBACN+E,QAAS8pD,EAASn0D,SAEpBm0D,EAASz8C,OAAO,EAAG,EAAG,CAAEpS,KAAM,kBAZpC,eAc0B6uD,GAd1B,gEAcetqD,EAdf,kBAeYklD,EAAMhlD,SAASF,GAf3B,wMADoD,sBAoBpD,IAAI0qD,EAAgB,GAEdpmD,GADI,IAAIkL,MACDm7C,UACb,OAAQ9uD,EAAOJ,MACb,IAAK,OACH,IAAImvD,EAAepF,qBAAUN,EAAMjlD,WAAW3B,QAAQic,MAClDswC,EAAiBD,EAAa9N,MAClCjhD,EAAO2E,QAAUoqD,EACbC,GAMFJ,EALAI,EAAiBA,EAAevjD,KAAI,SAAAtH,GAGlC,OAFAA,EAAQolD,QAAS,EACjBplD,EAAQ8qD,KAAOxmD,EACRtE,MAIX,MACF,IAAK,OACH,IAAI+qD,EAAevF,qBAAUN,EAAMjlD,WAAW3B,QAAQkc,MAClDwwC,EAAiBD,EAAajO,MAClCjhD,EAAO2E,QAAUuqD,EACbC,GAMFP,EALAO,EAAiBA,EAAe1jD,KAAI,SAAAtH,GAGlC,OAFAA,EAAQqlD,QAAS,EACjBrlD,EAAQ8qD,KAAOxmD,EACRtE,MAIX,MACF,IAAK,uBACH0qD,EH9EC,SAAwB7uD,EAAQnH,GACrC,IAAMy0D,EAAiB,GACjB73B,EAASz1B,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MAC/C57B,EAAYnqB,OAAO9B,KAAK4G,EAAO2E,QAAQR,QAAQW,KAAKqM,MAAM,GAE1DA,EAAI,eACPkU,EAAYxsB,EAAMyN,QAAQmgB,MAAMgP,GAAQpQ,IA2B3C,OAzBAioC,EAAe5qD,KAAK6pC,GAAW9W,EAAQtkB,IAEvB,aAAdkU,GAC+C,UAA9CrlB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAK4a,UACc,cAA9C/rB,EAAO2E,QAAQR,QAAQW,KAAKqM,KAAK4a,UAEnCuhC,EAAe5qD,KACbktC,GAAY,CACV,CACEnnC,GAAI5P,EAAMyN,QAAQmgB,MAAMgP,GAAQjO,QAChCwB,WAAY,CACV6H,QACEh4B,EAAMyN,QAAQihB,OAAO1uB,EAAMyN,QAAQmgB,MAAMgP,GAAQjO,SAASqJ,UAGhE,CACEpoB,GAAI5P,EAAMyN,QAAQmgB,MAAMgP,GAAQ9N,QAChCqB,WAAY,CACV6H,QACEh4B,EAAMyN,QAAQohB,OAAO7uB,EAAMyN,QAAQmgB,MAAMgP,GAAQ9N,SAASkJ,aAM/Dy8B,EG6Ca8B,CAAepvD,EAAQqpD,EAAMjlD,WAAWkc,QACxD,MACF,IAAK,yBACHuuC,EH7CC,SAA0B7uD,EAAQnH,GACvC,IAD8C,EACxCw2D,EAAcrvD,EAAO2E,QAAQR,QAAQW,KAAK+nC,MAC1CA,EAAQ,GACRygB,EAAiB,GAHuB,eAKxB+B,GALwB,IAK9C,2BAAmC,CAAC,IAAzBlrD,EAAwB,QAC3BgN,EAAOtY,EAAMyN,QAAQmgB,MAAMtiB,EAAQsE,IACnC+M,EAAO,CACX/M,GAAItE,EAAQsE,GACZugB,WAAY,IAEd,IAAK,IAAM3D,KAAalhB,EAAQ6kB,WACzB7kB,EAAQ6kB,WAAWmgC,eAAe9jC,KACvC7P,EAAKwT,WAAW3D,GAAalU,EAAKkU,GAElB,aAAdA,GACmC,UAAlClhB,EAAQ6kB,WAAW3D,IACgB,cAAlClhB,EAAQ6kB,WAAW3D,IAErBioC,EAAe5qD,KACbktC,GAAY,CACV,CACEnnC,GAAI5P,EAAMyN,QAAQmgB,MAAMtV,EAAK1I,IAAI+e,QACjCwB,WAAY,CACV6H,QACEh4B,EAAMyN,QAAQihB,OAAO1uB,EAAMyN,QAAQmgB,MAAMtV,EAAK1I,IAAI+e,SAC/CqJ,UAGT,CACEpoB,GAAI5P,EAAMyN,QAAQmgB,MAAMtV,EAAK1I,IAAIkf,QACjCqB,WAAY,CACV6H,QACEh4B,EAAMyN,QAAQohB,OAAO7uB,EAAMyN,QAAQmgB,MAAMtV,EAAK1I,IAAIkf,SAC/CkJ,cAOjBgc,EAAMnqC,KAAK8S,IAzCiC,8BA4C9C,OADA83C,EAAe5qD,KAAKoqC,GAAYD,EAAOh0C,EAAMyN,QAAQmC,KAC9C6kD,EGCagC,CAAiBtvD,EAAQqpD,EAAMjlD,WAAWkc,QAC1D,MACF,IAAK,uBACHuuC,EHOC,SAAwB7uD,EAAQnH,GAGrC,OADuBw0D,GAAuB,CAD/BrtD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,OACGpoD,GGTpC02D,CAAevvD,EAAQqpD,EAAMjlD,WAAWkc,QACxD,MACF,IAAK,yBACHuuC,EHJC,SAA0B7uD,EAAQnH,GAKvC,OAJuBw0D,GACrBrtD,EAAO2E,QAAQR,QAAQW,KAAK+nC,MAC5Bh0C,GGCkB22D,CAAiBxvD,EAAQqpD,EAAMjlD,WAAWkc,QAC1D,MACF,IAAK,yBACHuuC,EHlGC,SAA0B7uD,EAAQnH,GAKvC,MAAO,CADeo1C,GAAY,CAAEpB,MAHpB7sC,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAW5a,QAAQxb,KAAI,SAAAhD,GACjE,MAAO,QAAUA,QGgGCgnD,CAAiBzvD,EAAQqpD,EAAMjlD,WAAWkc,QAC1D,MACF,IAAK,6BACHuuC,EH0MC,SAAyB7uD,EAAQnH,GACtC,IAD6C,EACvCouB,EAAUjnB,EAAO2E,QAAQR,QAAQW,KAAK+nC,MACtCA,EAAQ,GAF+B,eAGxB5lB,GAHwB,IAG7C,2BAA8B,CAAC,IAApBwO,EAAmB,QAC5BoX,EAAMnqC,KAAK,CACT+F,GAAIgtB,EACJzM,WAAY,CAAEmB,aAActxB,EAAMyN,QAAQmgB,MAAMgP,GAAQtL,iBANf,8BAU7C,MAAO,CADe2iB,GAAYD,EAAOh0C,EAAMyN,QAAQmC,KGnNnCinD,CAAgB1vD,EAAQqpD,EAAMjlD,WAAWkc,QACzD,MACF,IAAK,kCACHuuC,EHoNC,SAA0B7uD,EAAQnH,GACvC,IAD8C,EACxCouB,EAAUjnB,EAAO2E,QAAQR,QAAQW,KAAKmiB,QACtClb,EAAS,GAF+B,eAGzBkb,GAHyB,IAG9C,2BAA8B,CAAC,IAApBwO,EAAmB,QACtBjgB,EAAO,CACX/M,GAAIgtB,EACJzM,WAAY,CACV7C,aAActtB,EAAMyN,QAAN,MAAuBmvB,GAAvB,eAGlB1pB,EAAOrJ,KAAK8S,IAVgC,8BAa9C,MAAO,CADgBs3B,GAAY/gC,EAAQlT,EAAMyN,QAAQmC,KGhOrCknD,CAAiB3vD,EAAQqpD,EAAMjlD,WAAWkc,QAC1D,MACF,IAAK,iCACHuuC,EHiOC,SAAyB7uD,EAAQnH,GACtC,IAD6C,EACvC85C,EAAU3yC,EAAO2E,QAAQR,QAAQW,KAAK+tC,SAASliC,OACnD3Q,EAAO2E,QAAQR,QAAQW,KAAKguC,UAExBnD,EAAQ,GAJ+B,eAKxBgD,GALwB,IAK7C,2BAA8B,CAAC,IAApBlD,EAAmB,QACtBoS,EAAWpS,EAAOr1C,MAAM,KAAK,GAAK,IAClCob,EAAO,CACX/M,GAAIgnC,EACJzmB,WAAY,CACV4H,YAAa/3B,EAAMyN,QAAQu7C,GAAUpS,GAAxB,cAGjBE,EAAMjtC,KAAK8S,IAbgC,8BAgB7C,MAAO,CADgBo6B,GAAYD,IGhPfigB,CAAgB5vD,EAAQqpD,EAAMjlD,WAAWkc,QACzD,MACF,IAAK,yBACHuuC,EFnGC,SAA0B7uD,EAAQnH,GACvC,IAD8C,EACxCw2D,EAAcrvD,EAAO2E,QAAQR,QAAQW,KAAKsM,OAC5CA,EAAS,GAFiC,eAGxBi+C,GAHwB,IAG9C,2BAAmC,CAAC,IAAzBlrD,EAAwB,QAC3B2H,EAAQjT,EAAMyN,QAAQ6hB,OAAOhkB,EAAQsE,IACvC+M,EAAO,CACT/M,GAAItE,EAAQsE,GACZugB,WAAY,IAEd,IAAK,IAAI3D,KAAalhB,EAAQ6kB,WACvB7kB,EAAQ6kB,WAAWmgC,eAAe9jC,KACvC7P,EAAKwT,WAAW3D,GAAavZ,EAAMuZ,IAErCjU,EAAO1O,KAAK8S,IAbgC,8BAgB9C,MAAO,CADe6zB,GAAaj4B,IEoFfy+C,CAAiB7vD,EAAQqpD,EAAMjlD,WAAWkc,QAC1D,MACF,IAAK,wBACHuuC,EFnFC,SAAyB7uD,EAAQnH,GACtC,IAAM2wB,EAAUxpB,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MAClD57B,EAAYnqB,OAAO9B,KAAK4G,EAAO2E,QAAQR,QAAQW,KAAKgH,OAAO,GAM/D,MAAO,CADesuB,GAAY5Q,EAHzB,eACNnE,EAAYxsB,EAAMyN,QAAQ6hB,OAAOqB,GAASnE,ME8EzByqC,CAAgB9vD,EAAQqpD,EAAMjlD,WAAWkc,QACzD,MACF,IAAK,yBACHuuC,EF/GC,SAA0B7uD,EAAQnH,GAGvC,MAAO,CADe8xC,GAAa,CAACv5B,OADnBpR,EAAO2E,QAAQR,QAAQW,KAAK+8B,WAAWhZ,SAASpd,KAAI,SAAChD,GAAM,MAAQ,SAASA,MACtC5P,EAAMyN,QAAQmC,KE6GjDsnD,CAAiB/vD,EAAQqpD,EAAMjlD,WAAWkc,QAC1D,MACF,IAAK,wBACHuuC,EF9EC,SAAyB7uD,EAAQnH,GAGtC,OADuBs1D,GADPnuD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MACApoD,GE4ElCm3D,CAAgBhwD,EAAQqpD,EAAMjlD,WAAWkc,QACzD,MACF,IAAK,yBACHuuC,EF3EC,SAA0B7uD,EAAQnH,GACvC,IAD8C,EACxCgwB,EAAW7oB,EAAO2E,QAAQR,QAAQW,KAAKsM,OACzCk8C,EAAiB,GAFyB,eAGxBzkC,GAHwB,IAG9C,2BAAgC,CAAC,IAAtBW,EAAqB,QACxB1d,EAAQjT,EAAMyN,QAAQ6hB,OAAOqB,GAC7B1d,EAAM8b,UAAYiB,EAAS/lB,SAASgJ,EAAM8b,YAC9C0lC,EAAiBA,EAAe38C,OAAOw9C,GAAsB3kC,EAAS3wB,MAN5B,8BAS9C,OAAOy0D,EEkEa2C,CAAiBjwD,EAAQqpD,EAAMjlD,WAAWkc,QAC1D,MACF,IAAK,uBACHuuC,EDlIC,SAAwB7uD,EAAQnH,GACrC,IAAM42C,EAASzvC,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MAC/C57B,EAAYnqB,OAAO9B,KAAK4G,EAAO2E,QAAQR,QAAQW,KAAKoM,MAAM,GAC1D2wC,EAAWpS,EAAOr1C,MAAM,KAAK,GAAK,IAKxC,MAAO,CADes1C,GAAWD,EAHvB,eACPpqB,EAAYxsB,EAAMyN,QAAQu7C,GAAUpS,GAAQpqB,MC6H3B6qC,CAAelwD,EAAQqpD,EAAMjlD,WAAWkc,QACxD,MACF,IAAK,wBAGL,IAAK,qBACHuuC,EAAgBL,GAAgBxuD,EAAQqpD,EAAMjlD,WAAWkc,QACzD,MACF,IAAK,uBACHuuC,EE3IC,SAAwB7uD,GAI7B,MAAO,CADe0U,GAFH1U,EAAO2E,QAAQR,QAAQW,KAAK2U,WAC9BzZ,EAAO2E,QAAQR,QAAQW,KAAKgd,WFyIzBquC,CAAenwD,GAC/B,MACF,IAAK,yBACH6uD,EEvIC,SAA0B7uD,GAI/B,MAAO,CADesZ,GAFHtZ,EAAO2E,QAAQR,QAAQW,KAAK2U,WAC9BzZ,EAAO2E,QAAQR,QAAQW,KAAKgd,WFqIzBsuC,CAAiBpwD,GACjC,MACF,IAAK,2BACH6uD,EG7IC,SAA4B7uD,EAAQnH,GACzC,IAAMwmD,EAAW,CACf52C,GAAIzI,EAAO2E,QAAQR,QAAQW,KAAKu6C,SAAS52C,GACzClP,KAAMV,EAAMyN,QAAQs5C,UAAU5/C,EAAO2E,QAAQR,QAAQW,KAAKu6C,SAAS52C,IAAIlP,MAGzE,MAAO,CADe+lD,GAAezmD,EAAMyN,QAAQmC,GAAI,CAAC42C,cHwIpCgR,CAAmBrwD,EAAQqpD,EAAMjlD,WAAWkc,QAC5D,MACF,IAAK,2BACHuuC,EGvIC,SAA4B7uD,EAAQnH,GACzC,IAAMy0D,EAAiB,GACjB5uB,EAAa1+B,EAAO2E,QAAQR,QAAQW,KAAKu6C,SAAS52C,GAElD42C,EAAW,CACf52C,GAAIi2B,EACJl4B,IAAK3N,EAAMyN,QAAQs5C,UAAUlhB,GAAYl4B,KAErC8pD,EAAelR,GAAevmD,EAAMyN,QAAQmC,GAAI,CAAC42C,aACvDiO,EAAe5qD,KAAK4tD,GAGpB,IAZgD,EAY1C3gB,EAAQ,GAZkC,eAa1B92C,EAAMyN,QAAQusC,UAbY,IAahD,2BAA8C,CAAC,IAApCrrB,EAAmC,QACtCuC,EAAQlxB,EAAMyN,QAAQihB,OAAOC,GACnC,GAAIuC,EAAM/R,MAAM0mB,YAAc3U,EAAM/R,MAAM0mB,aAAeA,EAAY,CACnE,IAAMlpB,EAAO,CACX/M,GAAIshB,EAAMthB,GACVugB,WAAY,CACVhR,MAAM,eAAK+R,EAAM/R,SAGrB23B,EAAMjtC,KAAK8S,KAtBiC,mDAyB1B3c,EAAMyN,QAAQwsC,UAzBY,IAyBhD,2BAA8C,CAAC,IAApCnrB,EAAmC,QACtCqC,EAAQnxB,EAAMyN,QAAQohB,OAAOC,GACnC,GAAIqC,EAAMhS,MAAM0mB,YAAc1U,EAAMhS,MAAM0mB,aAAeA,EAAY,CACnE,IAAMlpB,EAAO,CACX/M,GAAIuhB,EAAMvhB,GACVugB,WAAY,CACVhR,MAAM,eAAKgS,EAAMhS,SAGrB23B,EAAMjtC,KAAK8S,KAlCiC,8BAqChD,GAAIm6B,EAAMr1C,OAAO,EAAG,CAClB,IAAMi2D,EAAY3gB,GAAYD,GAC9B2d,EAAe5qD,KAAK6tD,GAEtB,OAAOjD,EH8FakD,CAAmBxwD,EAAQqpD,EAAMjlD,WAAWkc,QAC5D,MACF,IAAK,2BACHuuC,EIlJC,SAA4B7uD,EAAQnH,GAOzC,MAAO,CADe23C,GALL,CACfN,WAAYr3C,EAAMyN,QAAQmC,GAC1By1C,aAAcl+C,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAASA,SACnDA,SAAUpkC,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAAS8Z,gBJ8I7BuS,CAAmBzwD,EAAQqpD,EAAMjlD,WAAWkc,QAC5D,MACF,IAAK,2BACHuuC,EI3IC,SAA4B7uD,EAAQnH,GAMzC,MAAO,CADe43C,GAJL,CACfP,WAAYr3C,EAAMyN,QAAQmC,GAC1B27B,SAAUpkC,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAASA,YJwI7BssB,CAAmB1wD,EAAQqpD,EAAMjlD,WAAWkc,QAC5D,MACF,IAAK,2BACHuuC,EIrIC,SAA4B7uD,EAAQnH,GACzC,IAAMy0D,EAAiB,GAEjBqD,EAAM3wD,EAAO2E,QAAQR,QAAQW,KAAKs/B,SAASA,SAC3CA,EAAW,CACf8L,WAAYr3C,EAAMyN,QAAQmC,GAC1BkoD,OAIF,IAAK,IAAM1mD,KAFXqjD,EAAe5qD,KAAK6tC,GAAenM,IAEjBvrC,EAAMyN,QAAQqjB,MACzB9wB,EAAMyN,QAAQqjB,MAAMw/B,eAAel/C,IACpCpR,EAAMyN,QAAQqjB,MAAM1f,GAAKm6B,WAAausB,GACxCrD,EAAe5qD,KAAK0tC,GAAWnmC,EAAK,CAAC0mD,SAGzC,OAAOrD,EJqHasD,CAAmB5wD,EAAQqpD,EAAMjlD,WAAWkc,QAC5D,MACF,IAAK,qBACHuuC,EIrHC,SAAsB7uD,EAAQnH,GACnC,IAAMg4D,EAAW7wD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAGlD,MAAO,CADewsC,GADPiqB,EAASA,EAASv2D,OAAO,GACC0F,EAAO2E,QAAQR,QAAQW,KAAKwrC,UJkHjDwgB,CAAa9wD,EAAQqpD,EAAMjlD,WAAWkc,QACtD,MACF,IAAK,uBACHuuC,EIjHC,SAAwB7uD,EAAQnH,GACrC,IAAMg4D,EAAW7wD,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAGlD,MAAO,CADeoqC,GADPqsB,EAASA,EAASv2D,OAAO,GACD0F,EAAO2E,QAAQR,QAAQW,KAAKwrC,UJ8G/CygB,CAAe/wD,EAAQqpD,EAAMjlD,WAAWkc,QACxD,MACF,IAAK,uBACHuuC,EI7GC,SAAwB7uD,EAAQnH,GACrC,IAAMy0D,EAAiB,GACjBjgC,EAASrtB,EAAO2E,QAAQR,QAAQqC,IAAIpM,MAAM,KAAK6mD,MAC/CjzB,EAAOn1B,EAAMyN,QAAQqjB,MAAM0D,GAG3B2jC,EAAW,CACf9gB,WAAYr3C,EAAMyN,QAAQmC,GAC1BA,GAAI4kB,EACJnnB,MAAO8nB,EAAK9nB,MACZk+B,SAAUpW,EAAKoW,SACfC,YAAarW,EAAKqW,YAClB/W,KAAMU,EAAKV,MAEbggC,EAAe5qD,KAAKytC,GAAQ6gB,IAG5B,IAjB4C,EAiBtC1gB,EAAU,GAjB4B,eAkB3BtiB,EAAKsiB,QAAQtoB,OAlBc,IAkB5C,2BAAqC,CAAC,IAA3Bvf,EAA0B,QACnC6nC,EAAQ5tC,KAAK,CAAC+F,KAAI7I,KAAK,WAnBmB,mDAqB3BouB,EAAKsiB,QAAQhqB,MArBc,IAqB5C,2BAAoC,CAAC,IAA1B7d,EAAyB,QAClC6nC,EAAQ5tC,KAAK,CAAC+F,KAAI7I,KAAK,UAtBmB,mDAwB3BouB,EAAKsiB,QAAQ2X,OAxBc,IAwB5C,2BAAqC,CAAC,IAA3Bx/C,EAA0B,QACnC6nC,EAAQ5tC,KAAK,CAAC+F,KAAI7I,KAAK,WAzBmB,mDA2B3BouB,EAAKsiB,QAAQ6X,OA3Bc,IA2B5C,2BAAqC,CAAC,IAA3B1/C,EAA0B,QACnC6nC,EAAQ5tC,KAAK,CAAC+F,KAAI7I,KAAK,WA5BmB,8BAgC5C,OAFA0tD,EAAe5qD,KAAK8hC,GAASnX,EAAQijB,IAE9Bgd,EJ6Ea2D,CAAejxD,EAAQqpD,EAAMjlD,WAAWkc,QAK5D,GAAItgB,EAAO+hB,WAAY,CACrB,IAAImvC,EACJ,GAAIlxD,EAAOupD,OAGT,IADA2H,EAAevH,qBAAUN,EAAMjlD,WAAW3B,QAAQkc,OACjCrkB,OAAS,EAAG,CAC3B,IAAI62D,EAAgBD,EAAaA,EAAa52D,OAAS,GACvD,GAAI0F,EAAOivD,MAAQkC,EAAc,GAAGlC,OAASjvD,EAAOivD,KAAM,CACxD,IAAIp+C,EAAeqgD,EAAajQ,MAChCiQ,EAAaxuD,KAAKmO,EAAaF,OAAOk+C,SAEtCA,EAAgBA,EAAcpjD,KAAI,SAAAtH,GAEhC,OADAA,EAAQ8qD,KAAOjvD,EAAOivD,KACf9qD,KAET+sD,EAAaxuD,KAAKmsD,QAGpBA,EAAgBA,EAAcpjD,KAAI,SAAAtH,GAEhC,OADAA,EAAQ8qD,KAAOjvD,EAAOivD,KACf9qD,KAET+sD,EAAaxuD,KAAKmsD,QAMpB,IADAqC,EAAevH,qBAAUN,EAAMjlD,WAAW3B,QAAQic,OACjCpkB,OAAS,EAAG,CAC3B,IAAI82D,EAAgBF,EAAaA,EAAa52D,OAAS,GACvD,GAAI0F,EAAOivD,MAAQmC,EAAc,GAAGnC,OAASjvD,EAAOivD,KAAM,CACxD,IAAIp+C,EAAeqgD,EAAajQ,MAChCiQ,EAAaxuD,KAAKmO,EAAaF,OAAOk+C,SAEtCA,EAAgBA,EAAcpjD,KAAI,SAAAtH,GAEhC,OADAA,EAAQ8qD,KAAOjvD,EAAOivD,KACf9qD,KAET+sD,EAAaxuD,KAAKmsD,QAGpBA,EAAgBA,EAAcpjD,KAAI,SAAAtH,GAEhC,OADAA,EAAQ8qD,KAAOjvD,EAAOivD,KACf9qD,KAET+sD,EAAaxuD,KAAKmsD,GAItB,IAAIwC,EAAW,EACXH,EAAa52D,OAAS,KACxB+2D,EAAWH,EAAa52D,OAAS,IAEnC42D,EAAal/C,OAAO,EAAGq/C,GACnBrxD,EAAOupD,OACTD,EAAK,CAAE1pD,KAAM,YAAa+E,QAASusD,IAEnC5H,EAAK,CAAE1pD,KAAM,YAAa+E,QAASusD,IAGvC5H,EAAKtpD,MC7ML0uD,GAAiB4C,aACfC,aACEC,KAAgB5tD,EAAQK,GACxB0qD,GACAvF,GACA8D,IAEFuE,gBAIJ,IAYepI,GAZDqI,aACZC,aAAgB,CACdtvD,KI1CW,WAAkD,IAA7BxJ,EAA4B,uDAAtBkkD,GAAc/8C,EAAQ,uCAC9D,IACMA,EAAOiC,QAAOjC,EAAS,CAACJ,KAAMI,EAAOJ,KAAM+E,QAAS3E,EAAOiC,MAAMpI,SAASiL,OAC9E,MAAOhF,IACT,IAAIyC,EAAe,GAEnB,OADA1J,EAAMqO,aAAe,GACdlH,EAAOJ,MACZ,IAAK,2BACH/G,EAAK,uCAAOA,GAAUmH,EAAO2E,QAAQtC,MAAhC,IAAsC5B,OAAQs8C,GAAat8C,UACnDF,gBACb,MACF,IAAK,gBACH1H,EAAK,2BACEA,GADF,IAED4P,GAAIzI,EAAO2E,QAAQoD,QAAQU,GAC3BlP,KAAMyG,EAAO2E,QAAQoD,QAAQxO,KAC7B2G,MAAOF,EAAO2E,QAAQoD,QAAQ7H,MAC9BqE,MAAOvE,EAAO2E,QAAQoD,QAAQ6pD,IAC9BpvD,eAAe,EACfqvD,aAAc7xD,EAAO2E,QAAQoD,QAAQ8pD,aACrC7gD,YAAahR,EAAO2E,QAAQoD,QAAQiJ,cAExC,MACF,IAAK,eACChR,EAAO2E,SAAW3E,EAAO2E,QAAQlE,SAAQ8B,EAAevC,EAAO2E,QAAQlE,OAAOsH,SAC9E/H,EAAOiC,QAAOM,EAAe,CAACvC,EAAOiC,MAAM6C,OAC/CjM,EAAK,2BACAA,GADA,IAEH4H,OAAO,2BACF5H,EAAM4H,QADL,IAEJ6B,MAAO,CACLC,oBAIN,MACF,IAAK,mBACH1J,EAAK,2BACAA,GADA,IAEH0H,iBAAiB,IAEnB,MACF,IAAK,kBACH1H,EAAK,2BACAA,GADA,IAEH4H,OAAO,2BACF5H,EAAM4H,QADL,IAEJC,SAAUV,EAAO2E,QAAQlE,WAG7B,MACF,IAAK,yBACH5H,EAAK,2BACAA,GADA,IAEH4H,OAAQs8C,GAAat8C,QAClBT,EAAO2E,SAEZ,MACF,IAAK,wBACH9L,EAAK,2BACAA,GADA,IAEH4H,OAAO,2BACF5H,EAAM4H,QADL,IAEJ4V,OAAO,2BAAKxd,EAAM4H,OAAO4V,QAAWrW,EAAO2E,aAG/C,MACF,IAAK,iBACL,IAAK,yBACH9L,EAAQkkD,GACR,MACF,IAAK,kBACHlkD,EAAK,2BACAA,GADA,IAEHqO,aAAc,yCAEhB,MACF,IAAK,wBACL,IAAK,uBACL,IAAK,gBACL,IAAK,eACL,IAAK,gBACL,IAAK,wBACH,MACF,IAAK,iBACH3E,EAAe,iCACXvC,EAAO2E,QAAQlE,OAAOuH,mBAAmB1N,OAAO,IAClDiI,EAAe,sBAAwBvC,EAAO2E,QAAQlE,OAAOuH,mBAAmB,IAElFnP,EAAK,2BACAA,GADA,IAEH4H,OAAO,2BACF5H,EAAM4H,QADL,IAEJwG,aAAc1E,MAQtB,OAAO1J,GJ1DLsrB,UK3CW,WAAyD,IAA/BtrB,EAA8B,uDAAtBkkD,GAAc/8C,EAAQ,uCACrE,IACMA,EAAOiC,QACTjC,EAAS,CAAEJ,KAAMI,EAAOJ,KAAM+E,QAAS3E,EAAOiC,MAAMpI,SAASiL,OAE/D,MAAOhF,IAET,OAAQE,EAAOJ,MACb,IAAK,uBACH/G,EAAQmH,EAAO2E,QAAQwf,UACvB,MACF,IAAK,wBACL,IAAK,yBACL,IAAK,wBACHtrB,EAAQ,CACNkgB,SAAU/Y,EAAO2E,QAAQoU,SACzBvC,OAAQxW,EAAO2E,QAAQ6R,QAEzB,MACF,IAAK,+BACL,IAAK,0BACH3d,EAAQmH,EAAO2E,QACf,MACF,IAAK,yBACH9L,EAAQ,CACNkgB,SAAU/Y,EAAO2E,QAAQoU,SACzBvC,OAAQxW,EAAO2E,QAAQ6R,OACvBpI,aAAc,WAEhB,MACF,IAAK,kCACHvV,EAAK,2BAAQA,GAAR,IAAeuV,aAAc,OAClC,MACF,IAAK,iBACL,IAAK,yBACHvV,EAAQkkD,GACR,MACF,IAAK,wBACHlkD,EAAK,2BACAA,GADA,IAEHuV,aAAcpO,EAAO2E,QAAQ1C,QAE/B,MACF,IAAK,wBACL,IAAK,uBACL,IAAK,8BACH,MAGF,IAAK,0BACL,IAAK,0BACHpJ,EAAQmH,EAAO2E,QAAQ9K,SACvB,MACF,IAAK,uBACL,IAAK,yBACL,IAAK,yBACL,IAAK,qBAGL,IAAK,gCACHhB,EAAQmH,EAAO2E,QAAQ9K,SAASsqB,UAChC,MACF,IAAK,iCACHtrB,EAAQmH,EAAO2E,QAKnB,OAAO9L,GLxBLynB,OM3CW,WAA6D,IAA/BznB,EAA8B,uDAAtBkkD,GAAc/8C,EAAQ,uCACzE,IACMA,EAAOiC,QACTjC,EAAS,CAAEJ,KAAMI,EAAOJ,KAAM+E,QAAS3E,EAAOiC,MAAMpI,SAASiL,OAE/D,MAAOhF,IAOT,OAJGE,EAAOJ,KAAKkD,SAAS,aACN,kCAAhB9C,EAAOJ,OAEP/G,EAAQ8wD,qBAAU9wD,IACZmH,EAAOJ,MAEb,IAAK,uBACH/G,EAAMyN,QAAUtG,EAAO2E,QAAQ2b,OAC/B,MACF,IAAK,iCACHznB,EAAMyN,QAAN,uCACKtG,EAAO2E,QAAQ2B,SACftG,EAAO2E,SAFZ,IAGEwjB,OAAQnoB,EAAO2E,QAAQyM,OACvBqV,MAAOzmB,EAAO2E,QAAQkoC,MACtBtlB,OAAQvnB,EAAO2E,QAAQmtD,OACvBpqC,OAAQ1nB,EAAO2E,QAAQotD,OACvBpoC,MAAO3pB,EAAO2E,QAAQyb,QAExB,MACF,IAAK,0BACHvnB,EAAMyN,QAAUtG,EAAO2E,QAAQ2b,OAC/BznB,EAAMitD,aAAaC,cAAc9jD,MAAQ,GACzC,MACF,IAAK,yBACHpJ,EAAMitD,aAAaC,cAAc9jD,MAAQjC,EAAO2E,QAAQlE,OACxD,MACF,IAAK,kCACH5H,EAAMitD,aAAaC,cAAc9jD,MAAQ,GACzC,MACF,IAAK,+BACHpJ,EAAM0rB,iBAAiB+uB,eAAetzC,EAAO2E,QAAQ/E,MACnDI,EAAO2E,QAAQvJ,MACjB,MACF,IAAK,iBACL,IAAK,yBACL,IAAK,wBACHvC,EAAQkkD,GACR,MACF,IAAK,sBACL,IAAK,uBACL,IAAK,wBACL,IAAK,gBACH,MACF,IAAK,mBACHlkD,EAAMyN,QAAQ0K,YAAYC,UAAW,EACrC,MACF,IAAK,mBACHpY,EAAM0rB,iBAAiB5E,SAAW3f,EAAO2E,QACzC,MACF,IAAK,sBACH9L,EAAM+3C,YAAc5wC,EAAO2E,QAC3B,MACF,IAAK,mBACH9L,EAAMw6C,aAAa2L,UAAYh/C,EAAO2E,QACtC,MACF,IAAK,oBACH9L,EAAMitD,aAAa9G,UAAYh/C,EAAO2E,QACtC,MACF,IAAK,sBACH9L,EAAM0rB,iBAAiBE,QAAQk1B,gBAAkB35C,EAAO2E,QACxD,MACF,IAAK,0BACL,IAAK,kCACH9L,EAAM0rB,iBAAiBC,gBAAkBxkB,EAAO2E,QAChD,MACF,IAAK,yBACH9L,EAAM0rB,iBAAiBE,QAAvB,uCACK5rB,EAAM0rB,iBAAiBE,SACvBzkB,EAAO2E,SAFZ,IAGE2b,QAAQ,IAEVznB,EAAMyN,QAAQ0K,YAAc,CAC1BlF,MAAM,eAAM9L,EAAO2E,QAAQknB,kBAAkB/f,OAC7CqF,KAAK,eAAMnR,EAAO2E,QAAQknB,kBAAkB1a,MAC5CD,KAAK,eAAMlR,EAAO2E,QAAQknB,kBAAkB3a,cAEvCrY,EAAM0rB,iBAAiBE,QAAvB,kBACP,MACF,IAAK,gBACH5rB,EAAM0rB,iBAAiBE,QAAvB,2BACKs4B,GAAax4B,iBAAiBE,SADnC,IAEEk1B,iBAAiB,EACjB9H,QAAS7xC,EAAO2E,UAElB,MACF,IAAK,wBACH9L,EAAM0rB,iBAAiBE,QAAQS,YAAcrsB,EAAM0rB,iBAChDE,QAAQS,WACX,MACF,IAAK,sBACHrsB,EAAM0rB,iBAAiBE,QAAQotB,QAAU7xC,EAAO2E,QAChD,MACF,IAAK,0BACH9L,EAAM0rB,iBAAiBE,QAAQ0tB,UAAYnyC,EAAO2E,QAAQwtC,UAC1Dt5C,EAAM0rB,iBAAiBE,QAAQS,YAAa,EAC5CrsB,EAAM0rB,iBAAiBC,gBAAkBxkB,EAAO2E,QAAQ6f,gBACxD,MACF,IAAK,UACH3rB,EAAM0rB,iBAAiBiC,WAAWpV,OAAS,GAC3CvY,EAAM0rB,iBAAiBiC,WAAWza,OAAS,GAC3C,MACF,IAAK,iBACHlT,EAAMqmC,aAEoB,QAAxBl/B,EAAO2E,QAAQ/E,MACS,QAAxBI,EAAO2E,QAAQ/E,MACS,QAAxBI,EAAO2E,QAAQ/E,MACS,YAAxBI,EAAO2E,QAAQ/E,KACXI,EAAO2E,QAAQG,KACfmc,KAAKC,UAAUlhB,EAAO2E,QAAQg6B,OAAQ,KAAM,GAClD9lC,EAAMkmC,eAAiB/+B,EAAO2E,QAAQqtD,OAAOjzB,eAC7C,MAGF,IAAK,2BACL,IAAK,2BACL,IAAK,2BACL,IAAK,uBACL,IAAK,uBACL,IAAK,qBACL,IAAK,uBACL,IAAK,6BACL,IAAK,yBACL,IAAK,wBACL,IAAK,yBACL,IAAK,wBACL,IAAK,yBACL,IAAK,yBACL,IAAK,uBACL,IAAK,yBACL,IAAK,uBACL,IAAK,yBACL,IAAK,uBACL,IAAK,wBACL,IAAK,2BACL,IAAK,2BACL,IAAK,uBACL,IAAK,kCACL,IAAK,iCACHlmC,EAAQmH,EAAO2E,QAAQ9K,SACvB,MACF,IAAK,8BACH,IAAMoX,OACqD7O,IAAzDpC,EAAO2E,QAAQ9K,SAASyM,QAAQ0K,YAAYC,SACxCjR,EAAO2E,QAAQ9K,SAASyM,QAAQ0K,YAAYC,SAC5CpY,EAAMyN,QAAQ0K,YAAYC,SAChCpY,EAAMyN,QAAQ0K,YAAc,CAC1BC,WACAnF,MAAM,2BACDjT,EAAMyN,QAAQ0K,YAAYlF,OAC1B9L,EAAO2E,QAAQ9K,SAASyM,QAAQ0K,YAAYlF,OAEjDqF,KAAK,2BACAtY,EAAMyN,QAAQ0K,YAAYG,MAC1BnR,EAAO2E,QAAQ9K,SAASyM,QAAQ0K,YAAYG,MAEjDD,KAAK,2BACArY,EAAMyN,QAAQ0K,YAAYE,MAC1BlR,EAAO2E,QAAQ9K,SAASyM,QAAQ0K,YAAYE,OAGnD,MACF,IAAK,uBACL,IAAK,yBACL,IAAK,yBACL,IAAK,qBACL,IAAK,gCACHrY,EAAQmH,EAAO2E,QAAQ9K,SAASymB,OAKpC,OAAOznB,GNzILN,OO7CW,WAAoD,IAA7BM,EAA4B,uDAAtBkkD,GAAc/8C,EAAQ,uCAIhE,OAHIA,EAAOiC,OAA+B,IAAtBjC,EAAOiC,MAAMgD,SAC/BpM,EAAK,2BAAOA,GAAP,IAAcujB,aAAa,KAE3Bpc,EAAOJ,MACZ,IAAK,eACH/G,EAAK,2BAAOA,GAAP,IAAcC,SAAS,IAC5B,MACF,IAAK,eACHD,EAAK,2BAAOA,GAAP,IAAcC,SAAS,IAC5B,MACF,IAAK,oBACHD,EAAK,2BAAOA,GAAP,IAAcqO,aAAclH,EAAO2E,UACxC,MACF,IAAK,oBACH9L,EAAK,2BAAOA,GAAP,IAAcqO,aAAc,KACjC,MACF,IAAK,uBACHrO,EAAK,2BAAOA,GAAP,IAAc6L,oBAAqB1E,EAAO2E,UAC/C,MACF,IAAK,yBACL,IAAK,iBACH9L,EAAQkkD,GACR,MACF,IAAK,uBACHlkD,EAAK,2BAAOA,GAAP,IAAcujB,aAAa,IAKpC,OAAOvjB,GPgBL4J,QQ9CW,WAAqD,IAA7B5J,EAA4B,uDAAtBkkD,GAAc/8C,EAAQ,uCACjE,OAAOA,EAAOJ,MACZ,IAAK,OACL,IAAK,YACH/G,EAAM6lB,KAAO1e,EAAO2E,QACpB,MACF,IAAK,OACL,IAAK,YACH9L,EAAM8lB,KAAO3e,EAAO2E,QACpB,MACF,IAAK,uBACH9L,EAAM6lB,KAAO,GACb7lB,EAAM8lB,KAAO,GAKjB,OAAO9lB,KR+BP,GACA61D,I,qBS7BauD,GAjBU,SAAAr5D,GACvB,IAAM4M,EAAO,yBAAKC,IAAKysD,IAASxsD,IAAI,OAAO9G,MAAM,SACjD,OAAIhG,EAAME,QAEN,yBAAKwI,UAAU,cACb,yBAAKA,UAAU,aACb,yBAAKA,UAAU,QAAQkE,GACvB,yBAAKlE,UAAU,YACb,kBAAC,KAAD,CAAkBhD,MAAM,UAAUiY,KAAM,QAMzC,+B,qBCfU47C,G,uKACT,IAAD,OACP,OAAO,yBAAK7wD,UAAU,cACpB,yBAAKA,UAAU,aACb,oCACA,0EACA,uBAAGmgB,KAAK,cACR,kBAAC,IAAD,CACErgB,MAAM,UACNmS,WAAS,EACThS,QAAS,kBAAI,EAAK3I,MAAM6J,QAAQC,KAAK,wB,GAVLzH,a,wCCmB1Cm3D,M,IA2DeC,G,kDAtDX,aAAe,IAAD,8BACV,gBACKx5D,MAAQ,CAAEy5D,YAAY,GAFjB,E,iEAKQ,IAAD,OACjBC,aAAalJ,GAAO,CAAEmJ,QAASC,KAAaC,UAAW,CAAC,UAAW,WAC/D1tD,YAAW,WACP,EAAKnK,SAAS,CAAEy3D,YAAY,MAC7B,U,+BAKP,OAAKx3D,KAAKjC,MAAMy5D,WAQZ,kBAAC35D,GAAA,EAAD,MACK,YAA0D,IAAvDG,EAAsD,EAAtDA,QAASC,EAA6C,EAA7CA,gBAAiBC,EAA4B,EAA5BA,sBAC1B,OAAIF,EAAgB,MACfA,GAAYC,GAEbC,IAIA,kBAAC,IAAD,CAAUqwD,MAAOA,IACb,kBAAC,KAAD,KACI,kBAAC,IAAD,CAAkBsJ,SAAUC,IAAY/qD,MACpC,kBAACgrD,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,CAAOC,OAAK,EAAC7nC,KAAK,IAAI8nC,UAAWC,KACjC,kBAACH,GAAA,EAAD,CAAO5nC,KAAK,gBAAgB8nC,UAAWC,KACvC,kBAACH,GAAA,EAAD,CAAO5nC,KAAK,YAAY8nC,UAAWC,KACnC,kBAACH,GAAA,EAAD,CAAO5nC,KAAK,aAAa8nC,UAAW1wC,KACpC,kBAACwwC,GAAA,EAAD,CAAOC,OAAK,EAAC7nC,KAAK,eAAe8nC,UAAW9M,KAC5C,kBAAC4M,GAAA,EAAD,CAAOC,OAAK,EAAC7nC,KAAK,wBAAwB8nC,UAAWE,KACrD,kBAACJ,GAAA,EAAD,CAAOE,UAAWb,aAzB1C,kBAAC,IAAD,CAAkBQ,SAAUC,IAAY/qD,MACpC,kBAAC,GAAD,CAAkB/O,SAAS,S,GAnB7BmC,a,OCnBlBk4D,IAASC,OACL,kBAAC,GAAD,MACAvpD,SAASgM,eAAe,SCEmB,kBAAmBw9C,WAC9D55D,OAAOigB,iBAAiB,QAAQ,WAC9B,IAAM45C,EAAK,UAAMC,GAAN,sBACXF,UAAUG,cACP9yD,SAAS4yD,GACTj6D,MAAK,SAAAo6D,GACJA,EAAaC,cAAgB,WAC3B,IAAMC,EAAmBF,EAAaG,WACtCD,EAAiBE,cAAgB,WACA,cAA3BF,EAAiB96D,QACfw6D,UAAUG,cAAcM,WAK1B76D,QAAQC,IAAI,6CAKZD,QAAQC,IAAI,4CAMrBqM,OAAM,SAAAtD,GACLhJ,QAAQgJ,MAAM,4CAA6CA,W","file":"static/js/main.6613246e.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/vceditor_logo.26b299b6.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/upenn_logo.03d8aa16.png\";","module.exports = __webpack_public_path__ + \"static/media/blank_page.c0abdb00.png\";","module.exports = __webpack_public_path__ + \"static/media/collation.58898883.png\";","module.exports = __webpack_public_path__ + \"static/media/viscoll_loading.d1c85f16.gif\";","module.exports = __webpack_public_path__ + \"static/media/vceditor_logo.3cdfd79d.svg\";","import React from 'react'\nimport packageJson from '../../../package.json'\n\nglobal.appVersion = packageJson.version;\n\n// version from response is the first param\n// local version is the second param\nconst semverGreaterThan = (versionA, versionB) => {\n const versionsA = versionA.split(/\\./g);\n const versionsB = versionB.split(/\\./g);\n\n while (versionsA.length || versionsB.length) {\n const a = Number(versionsA.shift());\n const b = Number(versionsB.shift());\n\n if (a === b) continue;\n return a > b || isNaN(b);\n }\n return false;\n};\n\nclass CacheBuster extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n loading: true,\n isLatestVersion: false,\n refreshCacheAndReload: () => {\n console.log('Clearing cache and hard reloading...')\n if (caches) {\n caches.keys().then(function (names) {\n for (let name of names) caches.delete(name)\n })\n }\n // delete cache and reload\n window.location.reload(true);\n }\n }\n }\n\n componentDidMount() {\n fetch('/meta.json')\n .then((response) => response.json())\n .then((meta) => {\n const latestVersion = meta.version; // from latest build\n const currentVersion = global.appVersion; //cached browser version\n\n const shouldForceRefresh = semverGreaterThan(latestVersion, currentVersion);\n if (shouldForceRefresh) {\n console.log(`We have a new version - ${latestVersion}. Should force refresh`)\n this.setState({ loading: false, isLatestVersion: false })\n } else {\n console.log(`You already have the latest version - ${latestVersion}. No cache refresh needed.`)\n this.setState({ loading: false, isLatestVersion: true })\n }\n })\n }\n\n render() {\n const { loading, isLatestVersion, refreshCacheAndReload } = this.state;\n return this.props.children({ loading, isLatestVersion, refreshCacheAndReload });\n }\n}\n\nexport default CacheBuster;","Object.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _colors = require('material-ui/styles/colors');\n\nvar _colorManipulator = require('material-ui/utils/colorManipulator');\n\nvar _spacing = require('material-ui/styles/spacing');\n\nvar _spacing2 = _interopRequireDefault(_spacing);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n spacing: _spacing2.default,\n fontFamily: 'Roboto, sans-serif',\n borderRadius: 2,\n palette: {\n stagingColor: '#B81616',\n primary1Color: '#526C91',\n primary2Color: '#3A4B55',\n primary3Color: _colors.grey400,\n accent1Color: '#4ED6CB',\n accent2Color: _colors.grey100,\n accent3Color: _colors.grey500,\n textColor: \"#4e4e4e\",\n secondaryTextColor: (0, _colorManipulator.fade)(_colors.darkBlack, 0.54),\n alternateTextColor: _colors.white,\n canvasColor: _colors.white,\n borderColor: _colors.grey300,\n disabledColor: (0, _colorManipulator.fade)(_colors.darkBlack, 0.3),\n pickerHeaderColor: _colors.cyan500,\n clockCircleColor: (0, _colorManipulator.fade)(_colors.darkBlack, 0.07),\n shadowColor: _colors.fullBlack\n },\n tableRow: {\n selectedColor: '#fff',\n },\n}; /**\n * NB: If you update this file, please also update `docs/src/app/customization/Themes.js`\n */","export let btnLg = {\n buttonStyle: {\n height: 60,\n },\n labelStyle: {\n fontSize: window.innerWidth<=768?18:20,\n },\n overlayStyle: {\n paddingTop: 12,\n height: 48,\n }\n}\n\n\nexport let btnMd = {\n buttonStyle: {\n height: 50,\n },\n labelStyle: {\n fontSize: window.innerWidth<=768?16:18,\n },\n overlayStyle: {\n paddingTop: 8,\n height: 42,\n }\n}\n\nexport let btnAuthCancel = {\n labelStyle: {\n color: \"#a5bde0\",\n }\n}\n\n\nexport let btnBase = () => { \n let fontSize = \"0.9em\";\n if (window.innerWidth<=1024) {\n fontSize = \"0.8em\";\n } \n if (window.innerWidth<=768) {\n fontSize = \"0.7em\";\n } \n return {\n labelStyle:{\n fontSize, \n },\n buttonStyle: {\n lineHeight: window.innerWidth<=768?\"32px\":\"36px\",\n },\n style: {\n minWidth: window.innerWidth<=1024?\"30px\":\"78px\", \n },\n }\n}\n\nexport let radioBtnDark = () => {\n return {\n labelStyle: {\n color:\"#ffffff\",\n fontSize:window.innerWidth<=768?\"0.6em\":\"0.9em\", \n width:window.innerWidth<=768?\"inherit\":\"\",\n lineHeight: window.innerWidth<=768?\"inherit\":null,\n paddingTop:window.innerWidth<=768?5:null,\n },\n iconStyle: {\n fill:\"#4ED6CB\", \n marginRight:window.innerWidth<=768?\"10px\":\"12px\",\n }\n }\n}","const floatFieldDark = {\n floatingLabelStyle: {\n color: \"#a5bde0\",\n },\n underlineStyle: {\n border: \"1px solid #526C91\",\n },\n underlineFocusStyle: {\n border: \"1px solid #4ED6CB\",\n },\n inputStyle: {\n color: \"white\",\n }\n}\nconst floatFieldLight = {\n floatingLabelShrinkStyle: {color: \"#526C91\"},\n floatingLabelStyle: {color: \"#6E6E6E\"},\n hintStyle: {color: \"#6E6E6E\"},\n}\n\nexport {\n floatFieldDark,\n floatFieldLight,\n}","import React, { Component } from 'react';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport { btnLg, btnAuthCancel } from '../../styles/button';\nimport {floatFieldDark} from '../../styles/textfield';\n\n/**\n * Contains the registration form that is used by the landing page component called `Landing`.\n */\nclass Register extends Component {\n constructor(props) {\n super(props);\n this.state = {\n name: \"\",\n email: \"\",\n password: \"\",\n };\n this.submit = this.submit.bind(this);\n }\n /**\n * Update state when user inputs new value in a text field \n */\n onInputChange = (v, type) => {\n this.setState({[type]: v});\n }\n /**\n * Submit registration information\n */\n submit = (e) => {\n if (e) e.preventDefault();\n this.props.action.registerUser({...this.state});\n }\n\n render() {\n let emailError = \"\";\n let passwordError = \"\";\n let registerSuccess = false;\n try {\n emailError = this.props.userState.errors.register.email;\n passwordError = this.props.userState.errors.register.password;\n registerSuccess = this.props.userState.registerSuccess;\n } catch (e) {}\n\n let registerForm = (\n
\n this.onInputChange(v, \"name\")} \n name=\"name\" \n floatingLabelText=\"Name\" \n {...floatFieldDark} \n />\n \n this.onInputChange(v, \"email\")} \n name=\"email\" \n floatingLabelText=\"E-mail\" \n {...floatFieldDark} \n errorText={emailError} \n aria-invalid={emailError && emailError.length>0}\n aria-required={true}\n />\n \n this.onInputChange(v, \"password\")} \n name=\"password\" \n floatingLabelText=\"Password\" \n {...floatFieldDark} \n errorText={passwordError} \n type=\"password\" \n aria-invalid={passwordError && passwordError.length>0}\n aria-required={true}\n />\n\n

\n \n
\n this.props.tapCancel()}\n label=\"Go back\" \n {...btnAuthCancel}\n />\n
\n \n );\n\n const successMessage = (\n
\n

\n Registration successful! You will be notified by email once your account has been approved.\n

\n
\n this.props.tapCancel()}\n label=\"Okay\" \n />\n
\n );\n \n if (registerSuccess) {\n return successMessage;\n } else {\n return registerForm;\n }\n }\n}\nexport default Register;\n","import React, { Component } from 'react';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport { btnLg, btnAuthCancel } from '../../styles/button';\nimport {floatFieldDark} from '../../styles/textfield';\n\n/**\n * Resend confirmation form.\n */\nclass ResendConfirmation extends Component {\n constructor(props) {\n super(props);\n this.state = {\n message: props.message,\n email: props.email,\n submitted: false,\n };\n }\n\n /**\n * Update state when user inputs new value in a text field \n */\n onChange(v, type) {\n this.setState({[type]: v});\n }\n\n /**\n * Send confirmation email \n */\n resendConfirmation = () => {\n this.props.action.resendConfirmation(this.state.email);\n this.setState({submitted:true, message: \"An email confirmation has been resent to \" + this.state.email});\n }\n\n render() {\n let form = this.state.submitted? \"\":
\n this.onChange(v,\"email\")} name=\"email\" floatingLabelText=\"E-mail\" {...floatFieldDark} />\n

\n this.resendConfirmation()}\n />\n ;\n\n let cancel = this.props.tapCancel()}\n label=\"Go back\"\n {...btnAuthCancel} \n />;\n\n if (this.state.submitted) {\n cancel = this.props.tapCancel()}\n />;\n }\n\n return (\n
\n

{this.state.message}

\n {form}\n
\n {cancel}\n
\n
);\n }\n}\nexport default ResendConfirmation;","import React, { Component } from 'react';\nimport ResendConfirmation from './ResendConfirmation';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport { btnLg, btnAuthCancel } from '../../styles/button';\nimport {floatFieldDark} from '../../styles/textfield';\n\n/**\n * Contains the login form that is used by the landing page component called `Landing`.\n */\nclass Login extends Component {\n constructor(props) {\n super(props);\n this.state = {\n email: \"\",\n password: \"\",\n error: \"\",\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.user.errors.login.errorMessage!==undefined) {\n this.setState({error: nextProps.user.errors.login.errorMessage[0]});\n }\n }\n\n componentDidUpdate() {\n if (this.props.user.authenticated) {\n this.props.history.push(\"/dashboard\");\n }\n }\n\n /**\n * Update state when user inputs new value in a text field \n */\n onInputChange(v, type) {\n this.setState({[type]: v});\n }\n /**\n * Submit login information and clear any message\n */\n submit = (e) => {\n if (e) e.preventDefault();\n this.setState({ error: \"\"});\n this.props.action.loginUser({email: this.state.email, password: this.state.password});\n }\n\n /**\n * Cancel button. Resets local Login state.\n */\n cancel = () => {\n this.setState({email:\"\",password:\"\",error:\"\"});\n this.props.tapCancel();\n }\n\n render() {\n let submitButton = \n let content =
\n

{this.state.error}

\n this.onInputChange(v,\"email\")} name=\"email\" floatingLabelText=\"E-mail\" {...floatFieldDark} aria-invalid={this.state.error && this.state.error.length>0} aria-required={true}/>\n this.onInputChange(v,\"password\")} name=\"password\" type=\"password\" floatingLabelText=\"Password\" {...floatFieldDark} aria-invalid={this.state.error && this.state.error.length>0} aria-required={true} />\n

\n {submitButton}\n
\n this.cancel()}\n label={\"Go back\"} \n {...btnAuthCancel}\n />\n this.props.toggleResetRequest()}\n />\n
\n \n ;\n if (this.state.error && this.state.error.includes(\"unconfirmed\")) {\n content = \n }\n return (\n content\n );\n }\n}\n\nexport default Login;\n","import React, { Component } from 'react';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport { btnLg } from '../../styles/button';\nimport {floatFieldDark} from '../../styles/textfield';\n/**\n * Contains the form to update password when user forgets password.\n */\nclass ResetPassword extends Component {\n constructor(props) {\n super(props);\n this.state = {\n password: \"\",\n passwordConfirm: \"\",\n resetMessage: \"\"\n };\n }\n\n /**\n * Update state when user inputs new value in a text field \n */\n onInputChange = (v, type) => {\n this.setState({ [type]: v });\n }\n\n /**\n * Validate password input and submit password change\n */\n submit = (e) => {\n if (e) e.preventDefault();\n let resetMessage = \"\"\n if (!this.state.password || !this.state.passwordConfirm) {\n resetMessage = \"Error: Both Password & Password Confirmation must be filled\";\n } else if (this.state.password !== this.state.passwordConfirm) {\n resetMessage = \"Error: Both Password & Password Confirmation must match\";\n }\n else {\n const reset_password_token = this.props.reset_password_token;\n const password = {\n password: this.state.password,\n password_confirmation: this.state.passwordConfirm\n };\n this.props.resetPassword(reset_password_token, password);\n this.props.handleResetPasswordSuccess();\n }\n this.setState({ resetMessage })\n };\n\n render() {\n return (\n
\n

{this.state.resetMessage}

\n this.onInputChange(v, \"password\")} name=\"password\" type=\"password\" floatingLabelText=\"New Password\" {...floatFieldDark} />\n this.onInputChange(v, \"passwordConfirm\")} name=\"passwordConfirm\" type=\"password\" floatingLabelText=\"Confirm New Password\" {...floatFieldDark} />\n

\n this.submit(null)}\n />\n \n );\n }\n}\nexport default ResetPassword;\n","import React, { Component } from 'react';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport { btnLg, btnAuthCancel } from '../../styles/button';\nimport {floatFieldDark} from '../../styles/textfield';\n/**\n * Contains the reset password request form that is used by the landing page \n * component called `Landing`. User inputs their email address and the app \n * will email them a link to change their password. The component that handles the\n * password change is `ResetPassword`.\n */\nclass ResetPasswordRequest extends Component {\n constructor(props) {\n super(props);\n this.state = {\n email: \"\",\n resetMessage: \"\",\n requested: false,\n };\n }\n\n /**\n * Update state when user inputs new value in a text field \n */\n onInputChange(v, type) {\n this.setState({[type]: v});\n }\n\n /**\n * Validate email address and submit password reset request\n */\n resetPasswordRequest = (e) => {\n if (e) e.preventDefault();\n let re = /[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}/igm;\n let resetMessage = \"\"\n if (!this.state.email) {\n resetMessage = \"Please enter your email address to reset the password.\";\n } else if (!re.test(this.state.email)) {\n resetMessage = \"Please enter a valid email address.\";\n }\n else {\n this.props.action.resetPasswordRequest(this.state.email);\n resetMessage = \"If this email address exists in our system, we've sent a password reset link to it.\"\n this.setState({requested:true});\n }\n this.setState({ resetMessage })\n };\n\n render() {\n let cancelButton = this.props.tapCancel()}\n label=\"Go back\" \n {...btnAuthCancel}\n />;\n let submit = \n
\n this.resetPasswordRequest(null)}\n />\n
;\n if (this.state.requested) {\n cancelButton = this.props.tapCancel()}\n label=\"Okay\" \n {...btnLg}\n />;\n submit = \"\";\n }\n return (\n
\n

{this.state.resetMessage}

\n this.onInputChange(v,\"email\")} name=\"email\" floatingLabelText=\"E-mail\" {...floatFieldDark} />\n { submit }\n
\n { cancelButton }\n
\n \n )\n }\n}\nexport default ResetPasswordRequest;\n","import axios from 'axios';\n\nexport let API_URL = '';\n\n// IN DEVELOPMENT\nif (process.env.NODE_ENV === 'development') {\n API_URL = 'http://localhost:3001';\n}\nexport const client = axios.create({\n baseURL: API_URL,\n responseType: 'json',\n});\n\nexport const clientOptions = {\n interceptors: {\n request: [\n ({ getState, dispatch, getSourceAction }, request) => {\n if (getState().user.token)\n request.headers['Authorization'] = getState().user.token;\n return request;\n },\n ],\n response: [\n {\n success: function ({ getState, dispatch, getSourceAction }, response) {\n if (getState().global.loading) {\n if (getState().global.loadingRequestCount > 0)\n dispatch({\n type: 'UPDATE_LOADING_COUNT',\n payload: getState().global.loadingRequestCount - 1,\n });\n if (getState().global.loadingRequestCount <= 1)\n dispatch({ type: 'HIDE_LOADING' });\n }\n return Promise.resolve(response.data);\n },\n error: function ({ getState, dispatch, getSourceAction }, error) {\n if (getState().global.loading) dispatch({ type: 'HIDE_LOADING' });\n if (error.config.errorMessage) {\n dispatch({\n type: 'SHOW_NOTIFICATION',\n payload: error.config.errorMessage,\n });\n setTimeout(() => dispatch({ type: 'HIDE_NOTIFICATION' }), 4000);\n }\n if (\n error.response &&\n (error.response.status === 401 || error.response.status !== 422)\n ) {\n dispatch({ type: 'BACKEND_SERVER_ERROR' });\n }\n return Promise.reject(error);\n },\n },\n ],\n },\n};\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport {API_URL} from '../../store/axiosConfig';\n\n/** Dialog to show disconnection from API */\nexport default class NetworkErrorScreen extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isOffline: false,\n }\n }\n\n componentWillMount() {\n let that = this;\n let healthCheckURL = API_URL + '/status';\n let apiRequest = () => {\n fetch(healthCheckURL)\n .then(() => {\n if (that.state.isOffline) that.setState({isOffline:false});\n }).catch(e=> {\n if (!that.state.isOffline) that.setState({isOffline:true});\n });\n }\n setInterval(apiRequest, 20000);\n }\n\n render() {\n\n const imgSrc = \"data:image/gif;base64,R0lGODlh+gD6APf/AIqctVFrkJnY1tLZ46XZ16Sxxfb4+krVyllylnqOqu7x9EbUyEZiio3h20pljExnjeLy81rDueHm7FzJvPT2+Pj5+uTo7ljNyFSdqrLb27G9zfL091Jljkhjivr7/HfKxMrR3a66y1bFumd+nvn6+0LQxmbLxlrQyo/a0dzx8XvT0N3i6e/7+qjk4bXA0HGHpNLt7WrTzvDz9tbc5fv8/YGUr1x1l+j19vH5+ff8/E7YzJ2swcXO2mV8nZChuEPNxLzg4IWYsn6RrU7XzMzr6+ns8UpeiXPSz2yCobLj48Lk5EJdhaXf3rvG1Kq2yUzMxpmpvjzNw3OIpuz29kfOxc7W4ITKyFVxlWF4mkRgiIKVr/39/ubq75WlvGqAoMPp6dfd5tns7Zvd3JSkusHK2Mbn6GPPy5HTzrnE00ZiiFRuknaKqLrF007Ryb3H1evu8kpkjKGvw0TSx/P19/3+/mHCu9jv8FvIvFTBt26Do+v490vWy9Tb5LHf3tvh6Ozv82nFvvb6+4DW0/P8+0PUyM3U30lki01njr/J18vl5mXc0o/b2bTo5rjC0j1ag4zXz9DX4YnY1d/k62HMv0rQx+73+E7ez/P6+r/o6EXczUnSyLnn5svT3mLLv8jv7W7d1E9qkLHs6MLL2EzYzG+FpMfP201ojVjHumJ6m0ViiYXa1o6guGR7nZenvc/08U7Wy/b7+1Zvk/X5+nDGwEfKw0HKwkLTx2HKvkdjiuL590d3lkDMxP///09pj/7///Dy9U9qj/7+/k5pjv7+//b4+U5pj/b3+U5oju/x9WHLvk7Xy0VhiWHLv+jr8PT1+GLRwV/Lvu3w9EvYy1F/m+rt8kNgiOrt8UvYzEZhiu3w82mAoE/XzE5oj09pjtnf5/Hz9tPa409ojorq4F93mWh/n05ijEvXy0Nfh/P5+Y2et3CptEViiu3v86i1yKa0x8jQ3LS/z1vPvrTA0M/o6FDVy0hrj1HOx0dpjk3Dtfj7/F7KvWzVz4jc2FrAuFJskf///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkMWUyYmU2NS00MmU1LTQ1OWYtODQ0ZC03NWEzNGJjNDc5NWEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkE3N0I3NTQzRTRGMTFFN0FGQjhDMDgyNjAyQjEzMTEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDBERTZBRkMzRTRFMTFFN0FGQjhDMDgyNjAyQjEzMTEiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpkMWUyYmU2NS00MmU1LTQ1OWYtODQ0ZC03NWEzNGJjNDc5NWEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ZDFlMmJlNjUtNDJlNS00NTlmLTg0NGQtNzVhMzRiYzQ3OTVhIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJ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\";\n const logo = \"logo\" ;\n\n return (\n \n
\n {logo}\n
\n Cannot connect to VCEditor. Trying to re-connect..\n
\n \n );\n }\n}","\nexport function login(session) {\n return { \n types: ['NO_LOADING','LOGIN_SUCCESS','LOGIN_FAILED'],\n payload: {\n request : {\n url: `/session`,\n method: 'post',\n data: { session },\n successMessage: \"You have successfully logged in\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function register(user) {\n return { \n types: ['NO_LOADING','REGISTER_SUCCESS','REGISTER_FAILED'],\n payload: {\n request : {\n url: `/registration`,\n method: 'post',\n data: {user},\n successMessage: \"You have successfully registered\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function confirm(confirmation_token) {\n return { \n types: ['NO_LOADING','CONFIRM_SUCCESS','CONFIRM_FAILED'],\n payload: {\n request : {\n url: `/confirmation`,\n method: 'put',\n data: { confirmation_token },\n successMessage: \"You have successfully confirmed your account\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function resendConfirmation(email) {\n return {\n type: 'RESEND_CONFIRMATION',\n payload: {\n request : {\n url: `/confirmation`,\n method: 'post',\n data: {\n confirmation: {\n email: email\n }\n },\n successMessage: \"You have successfully resent the confirmation email\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n }\n}\n\nexport function logout() {\n return { \n types: ['NO_LOADING','LOGOUT_SUCCESS','LOGOUT_FAILED'],\n payload: {\n request : {\n url: `/session`,\n method: 'delete',\n successMessage: \"You have successfully logged out\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function resetPasswordRequest(email) {\n return { \n types: ['NO_LOADING','REQUEST_RESET_SUCCESS','REQUEST_RESET_FAILED'],\n payload: {\n request : {\n url: `/password`,\n method: 'post',\n data: {password: { email }},\n successMessage: \"You have successfully requested to reset password\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function resetPassword(reset_password_token, password) {\n return { \n types: ['NO_LOADING','RESET_SUCCESS','RESET_FAILED'],\n payload: {\n request : {\n url: `/password`,\n method: 'put',\n data: {reset_password_token, password},\n successMessage: \"You have successfully reset your password\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function updateProfile(user, userID) {\n return { \n types: ['SHOW_LOADING','UPDATE_PROFILE_SUCCESS','UPDATE_PROFILE_FAILED'],\n payload: {\n request : {\n url: `/users/${userID}`,\n method: 'put',\n data: user,\n successMessage: \"You have successfully updated your account\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function deleteProfile(userID) {\n return { \n types: ['SHOW_LOADING','DELETE_PROFILE_SUCCESS','DELETE_PROFILE_FAILED'],\n payload: {\n request : {\n url: `/users/${userID}`,\n method: 'delete',\n successMessage: \"You have successfully deleted your account\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function sendFeedback(title, message, browserInformation, project) {\n return {\n types: ['NO_LOADING', 'SEND_FEEDBACK_SUCCESS', 'SEND_FEEDBACK_FAILED'],\n payload: {\n request: {\n url: `/feedback`,\n method: 'post',\n data: {title, message, browserInformation, project},\n successMessage: \"You have successfully sent a feedback!\",\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n }\n}\n\n","import React, { Component } from 'react';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport imgCollation from '../assets/collation.png';\nimport imgLogo from '../assets/vceditor_logo.png';\nimport Register from '../components/authentication/Register';\nimport Login from '../components/authentication/Login';\nimport ResetPassword from '../components/authentication/ResetPassword';\nimport ResetPasswordRequest from '../components/authentication/ResetPasswordRequest';\nimport ResendConfirmation from '../components/authentication/ResendConfirmation';\nimport { btnLg } from '../styles/button';\nimport { connect } from 'react-redux';\nimport NetworkErrorScreen from '../components/global/NetworkErrorScreen';\nimport {\n login,\n register,\n confirm,\n resetPasswordRequest,\n resetPassword,\n logout,\n resendConfirmation,\n} from '../actions/backend/userActions';\nimport { API_URL } from '../store/axiosConfig';\nimport light from \"../styles/light.js\";\n\n/** Landing page of the app. Contain register, login and password reset forms. */\nclass Landing extends Component {\n constructor(props) {\n super(props);\n this.state = {\n register: false,\n login: false,\n reset: false,\n resetRequest: false,\n reset_token: '',\n message: '',\n resendConfirmation: false,\n resendConfirmationSuccess: false,\n };\n }\n\n toggleRegister = () => {\n this.setState({ register: !this.state.register, message: '' });\n };\n\n toggleLogin = () => {\n this.setState({ login: !this.state.login, message: '' });\n };\n\n toggleResetRequest = () => {\n this.setState({ resetRequest: !this.state.resetRequest, message: '' });\n };\n\n tapCancel = () => {\n this.setState({\n login: false,\n register: false,\n resetRequest: false,\n resendConfirmation: false,\n message: '',\n });\n };\n\n handleResetPasswordSuccess = () => {\n this.setState({\n reset: false,\n message:\n 'Your password has been successfully updated. Go ahead and login.',\n });\n };\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.user.errors.confirmation.length > 0) {\n this.setState({ resendConfirmation: true });\n }\n if (\n nextProps.notification.includes('Successfully confirmed your account')\n ) {\n this.setState({\n message: nextProps.notification,\n resendConfirmationSuccess: true,\n });\n }\n }\n\n componentDidMount() {\n const token = this.props.location.search.split('=')[1];\n if (token) {\n if (this.props.location.pathname.includes('confirmation')) {\n this.props.confirmUser(token);\n if (this.props.user.authenticated) this.props.logoutUser();\n } else if (this.props.location.pathname.includes('password')) {\n this.setState({ reset: true, reset_token: token });\n }\n } else {\n if (this.props.user.authenticated) {\n this.props.history.push('/dashboard');\n }\n }\n // set instance into state\n let instanceURL = API_URL + '/instance'\n let instanceRequest = () => {\n fetch(instanceURL).then(async (response) => {\n const data = await response.json();\n this.setState({instance:data.current_instance})\n })\n }\n instanceRequest();\n }\n\n render() {\n const message = this.state.message ?

{this.state.message}

: '';\n let resetPassword = '';\n let resetPasswordRequest = '';\n let resendConfirmation = '';\n\n let register = (\n
\n this.toggleRegister()}\n label=\"Create account\"\n {...btnLg}\n />\n
\n );\n let login = (\n
\n this.toggleLogin()}\n label=\"Login\"\n {...btnLg}\n />\n
\n );\n\n if (this.state.register) {\n register = (\n \n );\n login = '';\n } else if (this.state.resetRequest) {\n login = '';\n register = '';\n resetPassword = '';\n resetPasswordRequest = (\n \n );\n } else if (this.state.login) {\n register = '';\n login = (\n \n );\n } else if (this.state.reset) {\n login = '';\n register = '';\n resetPassword = (\n \n );\n } else if (this.state.resendConfirmation) {\n login = '';\n register = '';\n resendConfirmation = (\n \n );\n } else if (this.state.resendConfirmationSuccess) {\n register = '';\n }\n\n return (\n
\n
\n
\n \"Collation\n
\n
\n \"VCEditor\n
\n
\n {message}\n {register}\n {login}\n {resetPasswordRequest}\n {resetPassword}\n {resendConfirmation}\n
\n
\n
\n \n
\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n user: state.user,\n notification:\n 'notification' in state.user\n ? state.user.notification\n : state.global.notification,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n logoutUser: () => {\n dispatch(logout());\n },\n loginUser: user => {\n dispatch(login(user));\n },\n registerUser: user => {\n dispatch(register(user));\n },\n confirmUser: confirmation_token => {\n dispatch(confirm(confirmation_token));\n },\n resetPasswordRequest: email => {\n dispatch(resetPasswordRequest(email));\n },\n resetPassword: (reset_token, password) => {\n dispatch(resetPassword(reset_token, password));\n },\n resendConfirmation: email => {\n dispatch(resendConfirmation(email));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Landing);\n","import React from 'react';\nimport AddIcon from 'material-ui/svg-icons/content/add';\nimport CopyIcon from 'material-ui/svg-icons/content/content-copy';\nimport ImportIcon from 'material-ui/svg-icons/action/system-update-alt';\n\n/** New Project dialog - select between creating new, importing and cloning project */\nconst NewProjectSelection = (props) => {\n return (\n
\n \n\n props.setProjectType(\"import\")}\n tabIndex=\"2\"\n >\n
\n
\n \n
\n
\n Import\n Import a collation from VCEditor (JSON Only)\n
\n
\n \n\n \n
\n );\n}\nexport default NewProjectSelection;","import React from 'react';\nimport { floatFieldLight } from '../../styles/textfield';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\n\n/** New Project dialog - panel with a form to fill out project details */\nconst ProjectDetails = props => {\n let submit = event => {\n if (event) event.preventDefault();\n if (!props.doErrorsExist()) props.nextStep();\n };\n return (\n
\n

Object Details

\n
\n
\n 0}\n onChange={(event, newValue) => props.set('title', newValue)}\n fullWidth\n />\n 0}\n onChange={(event, newValue) => props.set('shelfmark', newValue)}\n fullWidth\n />\n 0}\n onChange={(event, newValue) => props.set('date', newValue)}\n fullWidth\n />\n
\n
\n props.previousStep()}\n aria-label=\"Back\"\n />\n \n
\n
\n
\n );\n};\nexport default ProjectDetails;\n","import React from 'react';\nimport AutoComplete from 'material-ui/AutoComplete';\nimport {floatFieldLight} from '../../styles/textfield';\n\n/** Custom select field */\nexport default class SelectField extends React.Component {\n\n constructor(props) {\n super(props);\n let searchText = \"\";\n if (props.value!==undefined) {\n const targetData = props.data.find((data)=>data.value===props.value);\n if (targetData) searchText = targetData.text;\n }\n this.state = {\n searchText: searchText.toString(),\n prevSearchText: searchText.toString(),\n filteredDropDown: [],\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.value && nextProps.value!==this.props.value) {\n const targetData = nextProps.data.find((data)=>data.value===nextProps.value);\n if (targetData) this.setState({searchText: targetData.text, prevSearchText: targetData.text});\n } else if (nextProps.value===\"\") {\n this.setState({searchText:\"\", prevSearchText:\"\"});\n }\n }\n\n onMenuClose = () => {\n const targetIndex = this.props.data.findIndex((data)=>data.text===this.state.searchText);\n if (targetIndex>=0) {\n const target = this.props.data[targetIndex];\n if (this.state.searchText!==this.state.prevSearchText) {\n const searchTextExists = target !==undefined;\n if (searchTextExists) {\n // User entered a valid value \n this.setState({prevSearchText: this.state.searchText});\n // Return selected value to caller component\n this.props.onChange(target.value, targetIndex);\n } else {\n // Reset text field to have the previous valid search text\n this.setState({searchText: this.state.prevSearchText});\n }\n }\n }\n \n // Unfocus the input field\n document.querySelector(\"#\"+this.props.id).blur();\n }\n\n filter = (searchText, key) => {\n if (searchText===this.state.prevSearchText || searchText.length===0) { \n return AutoComplete.noFilter(searchText, key);\n } else {\n return AutoComplete.caseInsensitiveFilter(searchText, key);\n }\n }\n\n render() {\n let style=this.props.style? this.props.style : {};\n if (this.props.width) style[\"width\"] = this.props.width.width;\n return {this.setState({searchText:v})}}\n onClose={this.onMenuClose}\n fullWidth\n style={style}\n textFieldStyle={{fontSize:window.innerWidth<=1024?\"12px\":null}}\n disabled={this.props.disabled}\n errorText={this.props.errorText}\n {...floatFieldLight}\n menuProps={{maxHeight:this.props.maxHeight?this.props.maxHeight:300}}\n />\n }\n\n}","import React from 'react';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport {\n Table,\n TableBody,\n TableHeader,\n TableHeaderColumn,\n TableRow,\n TableRowColumn,\n} from 'material-ui/Table';\nimport IconClear from 'material-ui/svg-icons/content/clear';\nimport IconHelp from 'material-ui/svg-icons/action/help';\nimport IconButton from 'material-ui/IconButton';\nimport SelectField from '../global/SelectField';\n\n/** New Project dialog - panel to create initial collation structure */\nconst ProjectStructure = (props) => {\n\n /**\n * Return a list of MenuItem's for the unconjoined drop down menu \n */\n let menuItems = (selectedValue, unconjoinLeafsList, isDisabled) => {\n if (isDisabled) {\n return ([{\n key: selectedValue+\"blank\",\n value: 0,\n text: \"\",\n }])\n }\n return unconjoinLeafsList.map((val) => { \n return {\n key:val,\n value:val+1,\n text:\"Leaf \"+(val+1),\n }\n }\n );\n }\n\n const collationGroupsRows = [];\n props.collationGroups.forEach((group) => {\n const unconjoinLeafsList = !group.leaves? [] : Array.from(Array(group.leaves).keys());\n collationGroupsRows.push(\n \n {group.number}\n \n props.onInputChangeCollationGroupsRows(e, group, \"leaves\")}\n style={{width:50}}\n />\n \n \n props.handleToggleConjoin(group)}\n checked={group.conjoin}\n disabled={group.leaves<=1}\n style={{marginLeft:8}}\n /> \n \n \n {props.onInputChangeCollationGroupsRows(null, group, \"oddLeaf\", value)}}\n data={menuItems(group.oddLeaf, unconjoinLeafsList, (!group.conjoin || group.leaves%2 === 0))}\n value={group.oddLeaf}\n disabled={(!group.conjoin || group.leaves%2 === 0)}\n maxHeight={200}\n >\n \n \n \n props.handleRemoveCollationGroupRow(group.number)}\n >\n \n \n \n \n );\n });\n\n return (\n
\n
\n \n \n \n
\n

Structure

\n

\n Pre-populate your collation with quires and leaves by using the formula below. \n Generate the items by clicking the \"Add\" button. You can add multiple times.\n

\n

\n Note: you can change this later.\n

\n
\n \n
\n {props.set(\"quireNo\", parseInt(newValue, 10))}}\n style={{width:50}}\n type=\"number\"\n />\n
\n \n
\n {props.set(\"leafNo\", parseInt(newValue, 10))}}\n style={{width:50}}\n type=\"number\"\n min=\"1\"\n />\n
\n
\n props.set(\"conjoined\", !props.conjoined)}\n />\n
\n
\n props.addCollationRows()}\n primary\n />\n
\n
\n {collationGroupsRows.length>0?\n
\n \n \n \n Quire no.\n Number of leaves\n Conjoin\n Unconjoined leaf\n \n \n \n {collationGroupsRows}\n \n
\n
: \"\"\n }\n \n
\n props.previousStep()}\n />\n {props.collationGroups.length>0?\n props.nextStep()}\n />:\"\"}\n
\n
\n );\n}\nexport default ProjectStructure;\n","import React from 'react';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton';\n\n/** New Project dialog - import existing project */\nexport default class ImportProject extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n importData: \"\",\n importFormat: \"json\",\n imageData:\"\",\n }\n }\n\n isDisabled = () => {\n if (this.state.importData)\n return (this.state.importData.length===0);\n else \n return true\n }\n\n submit = (event) => {\n if (event) event.preventDefault();\n if (!this.isDisabled()) {\n this.props.importProject({importData: this.state.importData, importFormat: this.state.importFormat, imageData: this.state.imageData});\n } \n }\n\n onChange = (value, type) => {\n this.setState({ [type]: value });\n }\n\n componentWillReceiveProps = (nextProps) => {\n if (nextProps.importStatus===\"SUCCESS\") {\n nextProps.reset();\n nextProps.close();\n }\n }\n\n checkIfFileTypeIsInvalid = (file) => {\n const allowedFileTypes = [\"json\", \"xml\"];\n return !allowedFileTypes.includes(file.type)\n }\n\n\n handleFileSelected = (files) => {\n let file = files[0];\n let importFormat = file.type.split(\"/\")[1];\n let reader = new FileReader();\n reader.readAsText(file);\n reader.onloadend = ()=>this.setState({importData: reader.result, importFormat})\n }\n\n handleImageFile = (files) => {\n let file = files[0];\n let reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onloadend = ()=> {this.setState({imageData: reader.result})}\n }\n\n render() {\n let xmlMessage = \"\";\n if (this.state.importFormat===\"xml\")\n xmlMessage =

Note: If the XML file was not originally created by this application, \n some attributes and mappings may not be successfully imported. \n However, the collation structure will always be importable from any XML file that follows the VisColl schema.

\n return (\n
\n
\n

Import

\n
\n

Import collation

\n

Upload your exported collation file or directly paste the content of the file in the textbox below.

\n
\n
\n this.handleFileSelected(event.target.files)}\n onClick={(event)=>event.target.value=null}\n />\n
\n
\n this.onChange(e.target.value, \"importData\")}\n />\n
\n
\n {/*

Import format:

*/}\n {/*
*/}\n {/* disable import selection radio, since we only upload JSON (default)*/}\n {/*this.onChange(v, \"importFormat\")}*/}\n {/*>*/}\n {/* */}\n {/* */}\n {/**/}\n {/*{xmlMessage}*/}\n {/*
*/}\n

Import images

\n

If you have images in your collation, upload the zipped file.

\n
\n this.handleImageFile(event.target.files)}\n onClick={(event)=>event.target.value=null}\n />\n
\n
\n {this.props.importStatus!==undefined? \n

{this.props.importStatus}

\n : \"\" \n }\n \n
\n this.props.previousStep()}\n />\n \n
\n
\n
\n );\n };\n}\n","import React from 'react';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport SelectField from '../global/SelectField';\n\n/** New Project dialog - clone existing project */\nexport default class CloneProject extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n projectIndex: -1\n }\n }\n\n onChange = (projectIndex) => {\n this.setState({ projectIndex });\n }\n\n submit = (event) => {\n if (event) event.preventDefault();\n this.props.cloneProject(this.props.allProjects[this.state.projectIndex].id);\n this.props.reset();\n this.props.close();\n }\n\n render(){\n if (this.props.allProjects.length>0) {\n const data = this.props.allProjects.map((project, index)=>{\n return (\n {text: project.title, value:index} \n );\n });\n return (\n
\n

Clone Existing Collation

\n
\n \n
\n this.props.previousStep()}\n />\n this.submit(null)}\n />\n
\n \n
\n );\n } else {\n return
\n

Clone Existing Collation

\n

You do not have any projects to clone.

\n
\n this.props.previousStep()}\n />\n
\n
\n }\n }\n}\n","import React from 'react';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport {btnMd} from '../../styles/button';\n\n/** New Project dialog - select between starting with an empty project or pre-poulating it */\nconst NewProjectChoice = (props) => {\n return
\n \n\n OR\n\n \n
\n}\nexport default NewProjectChoice;","import React from 'react';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton';\nimport SelectField from '../global/SelectField';\nimport IconButton from 'material-ui/IconButton';\nimport IconHelp from 'material-ui/svg-icons/action/help';\n\n/** New Project dialog - panel with additional options for project creation */\nconst ProjectOptions = props => {\n\n let handleChange = (e, v) => {\n // assigning values to null would not have to happen if generateFolioNumber\n // and generatePageNumber were combined into a single variable\n if (v === 'folio_number') {\n props.set('generateFolioNumber', v);\n props.set('generatePageNumber', null)\n } else if (v === 'page_number') {\n props.set('generatePageNumber', v);\n props.set('generateFolioNumber', null)\n } else {\n console.log(e, v);\n }\n };\n\n return (\n
\n

Project Options

\n

Generate page/folio numbers

\n
\n handleChange(e, v)}\n style={{width: 240}}\n >\n \n \n \n
\n\n {props.generateFolioNumber || props.generatePageNumber ? (\n \n \n Starting number\n \n
\n {\n props.set('startFolioPageNumber', parseInt(newValue, 10));\n }}\n style={{width: 50}}\n type=\"number\"\n />\n
\n
\n ) : (\n ''\n )}\n\n

\n Select starting texture\n \n \n \n

\n \n {\n if (props.startingTexture === 'Hair') {\n props.set('startingTexture', 'Flesh');\n } else {\n props.set('startingTexture', 'Hair');\n }\n }}\n width={250}\n />\n \n

\n Select side notation style\n \n \n \n

\n \n {\n props.set('notationStyle', e);\n console.log(e);\n }}\n width={250}\n />\n \n\n
\n props.previousStep()}\n />\n props.finish()}\n />\n
\n \n );\n};\nexport default ProjectOptions;\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport NewProjectSelection from './NewProjectSelection';\nimport ProjectDetails from './ProjectDetails';\nimport ProjectStructure from './ProjectStructure';\nimport ImportProject from './ImportProject';\nimport CloneProject from './CloneProject';\nimport NewProjectChoice from './NewProjectChoice';\nimport ProjectOptions from './ProjectOptions';\n\n/** New Project dialog wrapper */\nexport default class NewProjectContainer extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n projectType: '',\n step: 1,\n title: '',\n shelfmark: '',\n notationStyle: 'r-v',\n date: '',\n quireNo: 2,\n leafNo: 10,\n conjoined: true,\n startFolioPageNumber: 1,\n generateFolioNumber: 'folio_number',\n generatePageNumber: 'page_number',\n startingTexture: 'Hair',\n collationGroups: [],\n errors: {\n title: '',\n shelfmark: '',\n date: '',\n },\n };\n }\n\n set = (name, value) => {\n this.setState({ [name]: value }, () => {\n this.setState({\n errors: { ...this.state.errors, ...this.checkValidationError(name) },\n });\n });\n };\n\n reset = () => {\n this.setState({\n projectType: '',\n step: 1,\n title: '',\n shelfmark: '',\n notationStyle: '',\n date: '',\n quireNo: 1,\n leafNo: 10,\n conjoined: true,\n startFolioPageNumber: 1,\n generateFolioNumber: null,\n generatePageNumber: null,\n collationGroups: [],\n errors: {\n title: '',\n shelfmark: '',\n date: '',\n },\n });\n };\n\n /**\n * Validate user input and display appropriate error message\n * @param {string} type text field name\n * @public\n */\n checkValidationError = type => {\n const errors = {};\n this.props.allProjects.forEach(project => {\n if (type === 'title') {\n if (project.title === this.state.title) {\n errors.title = 'Project title should be unique';\n } else if (!this.state.title) {\n errors.title = 'Project title is required';\n }\n } else if (type === 'shelfmark') {\n if (project.shelfmark === this.state.shelfmark) {\n errors.shelfmark = 'Manuscript shelfmark should be unique';\n } else if (!this.state.shelfmark) {\n errors.shelfmark = 'Manuscript shelfmark is required';\n }\n }\n });\n if (Object.keys(errors).length === 0) {\n errors[type] = '';\n }\n return errors;\n };\n /**\n * Return true if any errors exist in the project form\n * @public\n */\n doErrorsExist = () => {\n if (this.state.errors.title) return true;\n if (this.state.errors.shelfmark) return true;\n for (let group in this.state.collationGroups) {\n if (!this.state.collationGroups[group].leaves && this.state.step === 2)\n return true;\n }\n if (!this.state.title && this.state.step === 1) return true;\n if (!this.state.shelfmark && this.state.step === 1) return true;\n return false;\n };\n\n /**\n * Remove a group\n * @param {number} groupNo group number\n * @public\n */\n handleRemoveCollationGroupRow = groupNo => {\n let newCollationGroups = [];\n this.state.collationGroups.forEach(group => {\n if (group.number < groupNo) {\n newCollationGroups.push(group);\n } else if (group.number > groupNo) {\n newCollationGroups.push({ ...group, number: group.number - 1 });\n }\n });\n this.setState({ collationGroups: newCollationGroups });\n };\n\n /**\n * Add a new group\n * @public\n */\n handleAddNewCollationGroupRow = () => {\n let newCollationGroups = [].concat(this.state.collationGroups);\n for (let i = 0; i < parseInt(this.state.quireNo, 10); i++) {\n newCollationGroups.push({\n number: newCollationGroups.length + 1,\n leaves: this.state.leafNo,\n conjoin: this.state.conjoined,\n oddLeaf: 1,\n });\n }\n this.setState({ collationGroups: newCollationGroups });\n };\n\n /**\n * Update a group\n * @param {object} event\n * @param {object} updatedGroup\n * @param {string} field\n * @param {string} value\n * @public\n */\n onInputChangeCollationGroupsRows = (event, updatedGroup, field, value) => {\n let newCollationGroups = [];\n this.state.collationGroups.forEach((group, i) => {\n if (updatedGroup.number === i + 1) {\n updatedGroup = { ...group };\n if (field === 'oddLeaf') {\n updatedGroup[field] = value;\n } else if (field === 'leaves') {\n updatedGroup[field] = parseInt(event.target.value, 10);\n if (updatedGroup[field] < updatedGroup['oddLeaf']) {\n updatedGroup['oddLeaf'] = 1;\n }\n if (updatedGroup[field] === 1) {\n updatedGroup['conjoin'] = false;\n }\n }\n newCollationGroups.push(updatedGroup);\n } else {\n newCollationGroups.push(group);\n }\n });\n this.setState({ collationGroups: newCollationGroups });\n };\n\n /**\n * Toggle the conjoin option for a specific group\n * @param {object} updatedGroup\n * @public\n */\n handleToggleConjoin = updatedGroup => {\n let newCollationGroups = [];\n this.state.collationGroups.forEach((group, i) => {\n if (updatedGroup.number === i + 1) {\n updatedGroup = { ...group };\n updatedGroup.conjoin = !updatedGroup.conjoin;\n newCollationGroups.push(updatedGroup);\n } else {\n newCollationGroups.push(group);\n }\n });\n this.setState({ collationGroups: newCollationGroups });\n };\n\n finish = () => {\n const user = {\n id: this.props.user.id,\n token: this.props.user.token,\n };\n let request = {\n project: {\n title: this.state.title,\n shelfmark: this.state.shelfmark,\n notationStyle: this.state.notationStyle,\n metadata: {\n date: this.state.date,\n },\n preferences: {\n showTips: true,\n side:\n this.state.generatePageNumber !== null\n ? { [this.state.generatePageNumber]: true }\n : {},\n leaf:\n this.state.generateFolioNumber !== null\n ? { [this.state.generateFolioNumber]: true }\n : {},\n },\n },\n groups: [],\n folioNumber:\n // generateFolioNumber and generatePageNumber could be replaced by a single\n // generateFolioPageNumber variable that is assigned the correct value based on state\n // either 'folio_number' or 'page_number'\n this.state.generateFolioNumber === 'folio_number'\n ? this.state.startFolioPageNumber\n : null,\n pageNumber:\n this.state.generatePageNumber === 'page_number'\n ? this.state.startFolioPageNumber\n : null,\n startingTexture: this.state.startingTexture,\n };\n this.state.collationGroups.forEach(group => request.groups.push(group));\n this.props.createProject(request, user);\n this.reset();\n this.props.close();\n console.log(request);\n };\n\n handleRequestClose = () => {\n if (this.state.step === 1) {\n this.reset();\n this.props.close();\n }\n };\n\n render() {\n let content = (\n this.set('projectType', type)}\n />\n );\n if (this.state.projectType === 'new') {\n if (this.state.step === 1) {\n content = (\n this.set('step', 2)}\n previousStep={this.reset}\n doErrorsExist={this.doErrorsExist}\n />\n );\n } else if (this.state.step === 2) {\n content = (\n this.set('step', 1)}\n nextStep={() => this.set('step', 3)}\n finish={this.finish}\n />\n );\n } else if (this.state.step === 3) {\n content = (\n \n this.setState({\n step: 1,\n quireNo: 2,\n leafNo: 10,\n conjoined: true,\n collationGroups: [],\n })\n }\n nextStep={() => this.set('step', 4)}\n set={this.set}\n quireNo={this.state.quireNo}\n leafNo={this.state.leafNo}\n conjoined={this.state.conjoined}\n collationGroups={this.state.collationGroups}\n handleToggleConjoin={this.handleToggleConjoin}\n onInputChangeCollationGroupsRows={\n this.onInputChangeCollationGroupsRows\n }\n addCollationRows={this.handleAddNewCollationGroupRow}\n handleRemoveCollationGroupRow={this.handleRemoveCollationGroupRow}\n />\n );\n } else {\n content = (\n this.set('step', 3)}\n finish={this.finish}\n set={this.set}\n />\n );\n }\n } else if (this.state.projectType === 'import') {\n content = (\n \n );\n } else if (this.state.projectType === 'clone') {\n content = (\n \n );\n }\n if (this.props.open) {\n return (\n
\n this.handleRequestClose()}\n className=\"newProjectDialog\"\n autoScrollBodyContent\n >\n {content}\n \n
\n );\n } else {\n return
;\n }\n }\n}\n","import React from 'react';\nimport IconButton from 'material-ui/IconButton';\nimport CloseIcon from 'material-ui/svg-icons/navigation/close';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport TextField from 'material-ui/TextField';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport IconSubmit from 'material-ui/svg-icons/action/done';\nimport IconClear from 'material-ui/svg-icons/content/clear';\nimport Checkbox from 'material-ui/Checkbox';\n\n/** Form to edit project information on the project panel in the dashboard */\nclass EditProjectForm extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n unsavedDialog: false,\n deleteDialog: false,\n deleteUnlinkedImages: false,\n editing: {\n title: false,\n shelfmark: false,\n date: false,\n },\n errors: {\n title: \"\",\n shelfmark: \"\",\n date: \"\",\n },\n };\n }\n\n /**\n * Update project pane if a new project was selected in the dashboard\n */\n componentWillReceiveProps(nextProps) {\n if (nextProps.selectedProject) {\n let title = nextProps.selectedProject.title;\n let shelfmark = nextProps.selectedProject.shelfmark;\n let date = nextProps.selectedProject.metadata.date;\n if (this.props.selectedProject && this.props.selectedProject.id === nextProps.selectedProject.id) {\n // Do not update the fields if they are currently editing and did not submit\n if (this.state.title !== title && this.state.editing.title) title = this.state.title;\n if (this.state.shelfmark !== shelfmark && this.state.editing.shelfmark) shelfmark = this.state.shelfmark;\n if (this.state.date !== date && this.state.editing.date) date = this.state.date;\n } else {\n // Switched project selection - reset editing states\n this.setState({\n editing: {\n title: false,\n shelfmark: false,\n date: false,\n },\n });\n }\n this.setState({\n title: title,\n shelfmark: shelfmark,\n date: date,\n errors: {\n title: \"\",\n shelfmark: \"\",\n date: \"\",\n },\n selectedProject: nextProps.selectedProject,\n allProjects: nextProps.allProjects,\n })\n }\n }\n\n /**\n * Validate user input and display appropriate error message\n */\n checkValidationError = (type) => {\n const errors = {title:\"\", shelfmark:\"\", date:\"\"};\n const allProjectsExceptCurrent = [...this.state.allProjects];\n const selectedProjectIndex = this.state.allProjects.findIndex((project)=>project.id===this.props.selectedProject.id);\n allProjectsExceptCurrent.splice(selectedProjectIndex, 1);\n allProjectsExceptCurrent.forEach(project => {\n if (type===\"title\"){\n if (project.title === this.state.title)\n errors.title = \"Project title should be unique\";\n if (!this.state.title)\n errors.title = \"Project title is required\";\n } else {\n if (project.shelfmark === this.state.shelfmark)\n errors.shelfmark = \"Manuscript shelfmark should be unique\";\n if (!this.state.shelfmark)\n errors.shelfmark = \"Manuscript shelfmark is required\";\n }\n });\n return errors;\n }\n\n /**\n * Return true if any errors exist in the project form\n */\n ifErrorsExist = () => {\n if (this.state.errors.title)\n return true;\n if (this.state.errors.shelfmark)\n return true;\n return false;\n }\n\n /**\n * Update state when user inputs new value in a text field \n */\n onInputChange = (event, newValue, type) => {\n this.setState({[type]: newValue, editing: {...this.state.editing, [type]:true}}, () => {\n this.setState({errors: this.checkValidationError(type)}) \n });\n }\n\n /**\n * Toggle delete confirmation dialog\n */\n handleDeleteDialogToggle = (deleteDialog=false) => {\n this.props.togglePopUp(deleteDialog);\n this.setState({ deleteDialog });\n };\n\n /**\n * Toggle unsaved changes dialog\n */\n handleUnsavedDialogToggle = (unsavedDialog=false) => {\n this.setState({ unsavedDialog });\n };\n\n /**\n * Submit project update of a specific input field \n */\n handleProjectUpdate = (event, field) => {\n if (event) event.preventDefault();\n const projectID = this.props.selectedProject.id;\n const project = {\n title: this.state.title,\n shelfmark: this.state.shelfmark, \n metadata: {\n date: this.state.date\n }\n };\n const user = {\n id: this.props.user.id,\n token: this.props.user.token\n };\n this.setState({editing: {...this.state.editing, [field]: false }});\n this.props.updateProject(projectID, project, user);\n }\n /**\n * Submit project delete \n */\n handleProjectDelete = () => {\n this.props.closeProjectPanel();\n this.setState({deleteDialog: false});\n const projectID = this.props.selectedProject.id;\n this.props.deleteProject(projectID, this.state.deleteUnlinkedImages);\n };\n\n /**\n * Close project panel\n */\n handleProjectPanelClose = (ignoreChanges=false) => {\n // Check for any unsaved changes before closing and show the warning dialog.\n if (!ignoreChanges && this.isEditing()) \n this.setState({ unsavedDialog: true });\n else {\n this.setState({ unsavedDialog: false });\n this.props.closeProjectPanel();\n }\n }\n\n /**\n * Return true if any input fields have been changed and not saved\n */\n isEditing = () => {\n return (this.state.editing.title||this.state.editing.shelfmark||this.state.editing.uri||this.state.editing.date);\n }\n\n /**\n * Reset text field to original values\n */\n handleProjectCancelUpdate = (field) => {\n this.setState({\n [field]: this.props.selectedProject[field], \n editing: {...this.state.editing, [field]: false },\n errors: {...this.state.errors, [field]: \"\"},\n });\n }\n\n /**\n * Return a generated HTML of submit and cancel buttons for a specific input name\n */\n submitButtons = (field) => {\n if (this.state.editing[field]) {\n return (\n
\n }\n style={{minWidth:\"60px\",marginLeft:\"5px\"}}\n name=\"submit\"\n type=\"submit\"\n disabled={this.ifErrorsExist()}\n onClick={() => this.handleProjectUpdate(null, field)}\n />\n }\n style={{minWidth:\"60px\",marginLeft:\"5px\"}}\n onClick={() => this.handleProjectCancelUpdate(field)}\n />\n
\n )\n } else {\n return \"\";\n }\n }\n\n render() {\n const selectedProject = this.props.selectedProject;\n if (!selectedProject)\n return
;\n\n let projectPanelData = (\n
\n
this.handleProjectUpdate(e, \"title\")}>\n 0}\n onChange={(event, newValue) => this.onInputChange(event, newValue, \"title\")}\n floatingLabelStyle={{fontSize: 25, color: \"#526C91\"}}\n fullWidth={true}\n tabIndex={this.props.tabIndex}\n autoFocus={true}\n />\n {this.submitButtons(\"title\")}\n \n
this.handleProjectUpdate(e, \"shelfmark\")}>\n this.onInputChange(event, newValue, \"shelfmark\")}\n floatingLabelStyle={{fontSize: 25, color: \"#526C91\"}}\n fullWidth={true}\n tabIndex={this.props.tabIndex}\n />\n {this.submitButtons(\"shelfmark\")}\n \n
this.handleProjectUpdate(e, \"date\")}>\n 0}\n onChange={(event, newValue) => this.onInputChange(event, newValue, \"date\")}\n floatingLabelStyle={{fontSize: 25, color: \"#526C91\"}}\n fullWidth={true}\n hintText=\"N/A\"\n tabIndex={this.props.tabIndex}\n /> \n {this.submitButtons(\"date\")}\n \n
\n Created at: {new Date(selectedProject.created_at).toLocaleString('en-US')}
\n Last modified: {new Date(selectedProject.updated_at).toLocaleString('en-US')}
\n
\n\n
\n );\n\n const deleteActions = [\n this.handleDeleteDialogToggle()}\n />,\n this.handleProjectDelete()}\n />,\n ];\n\n const unsaveActions = [\n this.handleUnsavedDialogToggle()}\n />,\n this.handleProjectPanelClose(true)}\n />,\n ];\n\n \n return (\n
\n\n this.handleProjectPanelClose()}\n tabIndex={this.props.tabIndex}\n > \n \n \n\n {projectPanelData}\n\n
\n\n this.props.history.push(`/project/${this.props.selectedProject.id}`)}\n style={{width:\"49%\",float:\"left\",marginRight:\"2%\"}}\n tabIndex={this.props.tabIndex}\n />\n this.handleDeleteDialogToggle(true)}\n labelColor=\"#b53c3c\"\n style={{width:\"49%\"}}\n tabIndex={this.props.tabIndex}\n />\n\n \n this.setState({deleteUnlinkedImages: !this.state.deleteUnlinkedImages})}\n />\n \n \n \n\n
\n );\n }\n}\nexport default EditProjectForm;\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\n\n/** Confirmation dialog to delete or unlink image(s) */\nexport default class RemveImageConfirmation extends React.Component {\n\n submit = () => {\n if (this.props.actionType===\"delete\") {\n this.props.deleteImages(this.props.imgs.map((img)=>img.id));\n } else {\n this.props.unlinkImages(this.props.imgs.map((img)=>img.id));\n }\n this.props.toggleConfirmation(\"\");\n }\n render() {\n const actions = [\n this.props.toggleConfirmation(\"\")}\n />,\n ,\n ];\n let title, message;\n if (this.props.numToRemove===1) {\n title = \"Are you sure you want to \" + this.props.actionType + \" \" + this.props.imgs[0].label + \"?\";\n if (!this.props.collectionsMode && this.props.actionType===\"hide\") {\n message = \"You can add the image back to this project again by switching to 'view all images'.\";\n } else if (!this.props.collectionsMode && this.props.actionType===\"delete\") {\n message = \"If this image is used in other projects, deleting this image will remove it from other projects as well.\";\n } else if (this.props.actionType===\"delete\") {\n message = \"Deleting this image will remove it from all projects that it is linked to.\";\n }\n } else {\n // Multiple images to remove\n title = \"Are you sure you want to \" + this.props.actionType + \" \" + this.props.numToRemove + \" images?\"\n if (!this.props.collectionsMode && this.props.actionType===\"hide\") {\n message = \"You can add the images back to this project again by switching to 'view all images'.\";\n } else if (!this.props.collectionsMode && this.props.actionType===\"delete\") {\n message = \"If these images are used in other projects, deleting these images will remove them from other projects as well.\";\n } else if (this.props.actionType===\"delete\") {\n message = \"Deleting these images will remove them from all the projects that they are linked to.\";\n }\n }\n return (\n
\n this.props.toggleConfirmation(\"\")}\n >\n { message }\n \n
\n );\n }\n}","import React, {Component} from 'react';\nimport update from 'immutability-helper';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport { btnBase } from '../../styles/button';\n\n/** Upload image component */\nclass UploadImages extends Component {\n constructor(props) {\n super(props);\n this.state = {\n uploadedImages: [],\n uploadedDuplicates: [],\n duplicatesToUpload: [],\n filesizeExceeded: [],\n };\n }\n\n /**\n * Removes file extension and replaces any \".\" with underscore\n */\n parseFilename = (filename) => {\n let tokenizedName = filename.split(/[\\s.-]+/);\n tokenizedName.splice(-1);\n tokenizedName = tokenizedName.join(\"_\");\n return tokenizedName.toLowerCase();\n }\n\n submitUpload = (e) => {\n e.preventDefault();\n const duplicateImageUploads = this.state.uploadedDuplicates.filter((item,i)=>this.state.duplicatesToUpload[i]);\n const uploadedImages = this.state.uploadedImages.concat(duplicateImageUploads);\n this.props.action.uploadImages(uploadedImages);\n // Clear input file list\n this.setState({uploadedImages:[], filesizeExceeded: [], duplicatesToUpload:[], uploadedDuplicates:[]});\n document.getElementById(\"uploadImages\").value=\"\";\n }\n\n resetUpload = (e) => {\n e.preventDefault();\n this.setState({uploadedImages:[], filesizeExceeded:[], duplicatesToUpload:[], uploadedDuplicates:[]});\n document.getElementById(\"uploadImages\").value=\"\";\n }\n\n handleFiles = (files) => {\n let findIfExists = function(img) {\n return img.label===this.filename+\".\"+this.fileExtension;\n }\n let that = this;\n let onLoadEnd = function(filename, targetState) {\n return function (event) {\n const newImageList = update(that.state[targetState], {$push:[{filename, content:this.result}]});\n that.setState({[targetState]: newImageList});\n }\n }\n this.setState({uploadedImages: []}, ()=>{\n let duplicatesToUpload = [];\n let filesizeExceeded = [];\n for (let i=0; i15728640) {\n // Filesize is greater than 15mb, do not upload\n filesizeExceeded.push(filename);\n } else {\n const reader = new FileReader();\n // Read file content\n reader.readAsDataURL(file);\n if (this.props.images.findIndex(findIfExists, {filename, fileExtension})>=0) {\n // Filename already exists, read file and store in 'uploadedDuplicates' state\n duplicatesToUpload.push(true);\n reader.onloadend = onLoadEnd(filename,\"uploadedDuplicates\");\n } else {\n // Filename doesn't exist, read file and store in 'uploadedImages' state\n reader.onloadend = onLoadEnd(filename, \"uploadedImages\");\n }\n }\n }\n if (duplicatesToUpload.length>0) {\n this.setState({duplicatesToUpload});\n }\n if (filesizeExceeded.length>0) {\n this.setState({filesizeExceeded});\n }\n })\n }\n\n toggleCheckbox = (index) => {\n let duplicatesToUpload = [...this.state.duplicatesToUpload];\n duplicatesToUpload[index] = !duplicatesToUpload[index];\n this.setState({duplicatesToUpload});\n }\n\n render() {\n // Generate file duplicate error message content if neccessary\n let duplicateErrorSection = null;\n let filesizeErrorSection = null;\n let errorText = \"\";\n if (this.state.duplicatesToUpload.length>0) {\n duplicateErrorSection =
\n
\n

The following file{this.state.duplicatesToUpload.length>1?\"s \":\" \"} \n already exist{this.state.duplicatesToUpload.length>1?\"\":\"s\"}. If you choose to upload \n {this.state.duplicatesToUpload.length>1?\" them\":\" it\"}, {this.state.duplicatesToUpload.length>1?\"they \":\"it \"} \n will get renamed.

\n {\n this.state.uploadedDuplicates.map((file,i)=>\n 30?file.filename.substring(0,30)+\"...\": file.filename} \n labelStyle={{color:\"#bd4a4a\"}}\n checked={this.state.duplicatesToUpload[i]}\n onClick={()=>this.toggleCheckbox(i)}\n />\n )\n }\n
\n
\n }\n if (this.state.filesizeExceeded.length>0) {\n filesizeErrorSection =
0?{wordWrap: \"break-word\",marginTop:5}:{wordWrap: \"break-word\"}}>\n
\n

The following file{this.state.filesizeExceeded.length>1?\"s are\":\" is\"} greater than 15mb and will not be uploaded:

\n
    \n {this.state.filesizeExceeded.map((filename)=>
  • {filename}
  • )}\n
\n
\n
\n }\n\n if ((duplicateErrorSection || filesizeErrorSection) && this.state.uploadedImages.length>0) {\n errorText =
There {this.state.uploadedImages.length>1?\"are\":\"is\"} {this.state.uploadedImages.length} other file{this.state.uploadedImages.length>1?\"s\":\"\"} ready for upload.
;\n }\n\n return
\n
\n this.handleFiles(event.target.files)}\n onClick={(event)=>{event.target.value=null; this.setState({uploadedImages:[], filesizeExceeded:[], duplicatesToUpload:[], uploadedDuplicates:[]})}}\n multiple\n style={{width:\"100%\"}}\n />\n

\n Accepted formats: .png, .jpeg, .jpg, .gif, .tiff\n

\n
\n {duplicateErrorSection}\n {filesizeErrorSection}\n {errorText}\n
\n this.resetUpload(e)}\n tabIndex={this.props.tabIndex}\n {...btnBase()}\n style={{...btnBase().style, marginRight: 5}}\n />\n x)<0)}\n onClick={this.submitUpload}\n primary\n {...btnBase()}\n />\n
\n
\n }\n}\nexport default UploadImages;","import React, {Component} from 'react';\nimport { Grid } from 'react-virtualized';\nimport Checkbox from 'material-ui/Checkbox';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport ChipInput from 'material-ui-chip-input'\nimport Popover from 'material-ui/Popover';\nimport Menu from 'material-ui/Menu';\nimport MenuItem from 'material-ui/MenuItem';\nimport IconFilter from 'material-ui/svg-icons/content/filter-list';\nimport ArrowDropRight from 'material-ui/svg-icons/navigation-arrow-drop-right';\nimport RemoveImageConfirmation from '../imageManager/RemoveImageConfirmation';\nimport UploadImages from '../imageManager/UploadImages';\nimport { btnBase } from '../../styles/button';\n\n/** Image collection page in dashboard section */\nclass ImageCollection extends Component {\n constructor(props) {\n super(props);\n this.state = {\n columnCount: 3,\n selectedImages: props.images? props.images.map((image)=>false):[],\n filterOpen: false,\n filter: {value:\"all\", text:\"Show all images\"},\n removeConfirmationOpen: \"\",\n windowWidth: window.innerWidth,\n gridWidth: window.innerWidth*0.50,\n gridHeight: window.innerHeight-150,\n columnWidth: window.innerWidth*0.50*0.33,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.state.selectedImages.length===0||nextProps.images.length!==this.props.images.length) {\n this.setState({selectedImages:nextProps.images.map((image)=>false)});\n }\n }\n\n componentDidMount() {\n window.addEventListener(\"resize\", this.windowResize);\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.windowResize);\n }\n\n toggleConfirmation = (value) => {\n this.setState({removeConfirmationOpen:value});\n if (value.length>0) {\n this.props.togglePopUp(true);\n } else {\n this.props.togglePopUp(false);\n }\n }\n\n windowResize = () => {\n this.setState({\n windowWidth: window.innerWidth,\n gridWidth: window.innerWidth*0.50,\n gridHeight: window.innerHeight-150,\n columnWidth: window.innerWidth*0.50*0.33,\n });\n }\n\n handleFilterClick = (e) => {\n e.preventDefault(); // Prevent ghost click\n this.setState({\n filterOpen: true,\n anchorEl: e.currentTarget,\n });\n }\n handleFilterClose = () => {\n this.setState({\n filterOpen: false,\n });\n }\n handleFilterChoice = (value, text) => {\n this.setState({\n filter: {value, text},\n filterOpen: false,\n selectedImages: this.props.images.map((image)=>false),\n })\n }\n\n toggleCheckbox = (index) => {\n let newArray = Object.assign([], this.state.selectedImages);\n newArray[index] = !newArray[index];\n this.setState({selectedImages: newArray}, ()=>this.forceUpdate());\n }\n\n cellRenderer = ({ columnIndex, key, rowIndex, style }, imagesToRender) => {\n const index = this.state.columnCount*rowIndex+columnIndex;\n if (indeximage.id===img.id);\n return (\n \n
\n {img.label}\n\n
\n {this.toggleCheckbox(globalIndex)}}\n labelStyle={{overflow:\"hidden\", textOverflow: \"ellipsis\", wordWrap:\"break-word\", width:this.state.windowWidth*0.50*0.25-50}}\n />\n \n )\n }\n }\n\n getActiveImages = () => {\n let ids=[];\n for (let i=0; i {\n return this.props.projects.find((project)=>project.id===projectID);\n }\n\n /**\n * Returns items in common\n */\n intersect = (list1, list2) => {\n if (list1.length >= list2.length)\n return list1.filter((id1)=>{return list2.includes(id1)});\n else\n return list2.filter((id1)=>{return list1.includes(id1)});\n }\n\n handleAddChip = (chip) => {\n // Link project to selected images\n this.props.action.linkImages([chip.id],this.getActiveImages().map((img)=>img.id));\n }\n\n handleDeleteChip = (chip, index) => {\n // Unlink project from selected images\n this.props.action.unlinkImages([chip],this.getActiveImages().map((img)=>img.id)); \n }\n\n selectAll = () => {\n let selectedImages = [];\n if (this.state.filter.value === \"all\") {\n selectedImages = this.props.images.map(()=>true);\n } else if (this.state.filter.value === \"orphans\") {\n selectedImages = this.props.images.map((img)=>img.projectIDs.length===0);\n } else {\n // Filter is a project ID\n selectedImages = this.props.images.map((image)=>{if (image.projectIDs.includes(this.state.filter.value)) { return true } else { return false }});\n }\n this.setState({selectedImages});\n }\n\n render() {\n if (this.props.images) {\n let imagesToRender = this.props.images;\n if (this.state.filter.value.includes(\"orphans\")) {\n imagesToRender = imagesToRender.filter((img)=>img.projectIDs.length===0);\n } else if (this.state.filter.value!==\"all\") {\n imagesToRender = imagesToRender.filter((img)=>img.projectIDs.includes(this.state.filter.value));\n }\n\n // Generate info panel\n let infoPanel =

Select one or more images to edit

\n const numSelected = this.state.selectedImages.filter((x)=>x).length;\n const activeImages = this.getActiveImages();\n if (numSelected>0) {\n let projectInfo = \"\";\n // More than one image selected\n // Find all the projects in common \n let projectDataSource = this.props.projects.map((project)=>{return {id:project.id,title:project.title}});\n let commonProjectIDs = activeImages[0].projectIDs;\n let commonProjectDataSource = [];\n for (let img of activeImages) {\n commonProjectIDs = this.intersect(commonProjectIDs, img.projectIDs);\n }\n commonProjectIDs.forEach((id)=>commonProjectDataSource.push({id:id, title:this.getProject(id).title}));\n projectInfo =
\n

{numSelected>1?\"Projects in common\":\"Projects\"}

\n this.handleAddChip(chip)}\n onRequestDelete={(chip, index) => this.handleDeleteChip(chip, index)}\n dataSource={projectDataSource}\n dataSourceConfig={{text:'title', value:'id'}}\n openOnFocus={true}\n fullWidth\n hintText={\"Choose project..\"}\n />\n
\n infoPanel =
\n

{numSelected} image{numSelected>1?\"s\":\"\"} selected

\n {projectInfo}\n {this.toggleConfirmation(\"delete\")}}\n backgroundColor=\"#b53c3c\"\n labelColor=\"#ffffff\" \n fullWidth\n />\n
\n }\n // Generate file upload panel\n const uploadPanel =
\n

Upload images

\n \n
\n // Generate filter panel\n const filterPanel =
\n
\n }\n {...btnBase()}\n />\n \n \n this.handleFilterChoice(\"all\", \"Show all images\")} primaryText=\"Show all images\" />\n this.handleFilterChoice(\"orphans\", \"Show orphaned images\")} primaryText=\"Show orphaned images\" />\n }\n menuItems={this.props.projects.map((project)=>this.handleFilterChoice(project.id, project.title)} />)}\n />\n \n \n
\n
\n !x)===-1}\n />\n this.setState({selectedImages:this.props.images.map((image)=>false)})}\n labelStyle={this.state.windowWidth<=768?{fontSize:\"0.6em\"}:{}}\n disabled={this.state.selectedImages.findIndex((x)=>x)===-1}\n />\n
\n
\n\n return
\n
\n
\n {filterPanel}\n this.cellRenderer(data, imagesToRender)}\n columnCount={this.state.columnCount}\n columnWidth={this.state.columnWidth}\n height={this.state.gridHeight}\n rowCount={imagesToRender.length%3===0? imagesToRender.length/3 : Math.floor(imagesToRender.length/3)+1}\n rowHeight={200}\n width={this.state.gridWidth}\n id=\"grid\"\n />\n
\n
\n {numSelected>0?infoPanel:uploadPanel}\n
\n
\n 0}\n toggleConfirmation={this.toggleConfirmation}\n deleteImages={this.props.action.deleteImages}\n unlinkImages={this.props.action.unlinkImages}\n imgs={activeImages.map((img)=>{return {id:img.id, label:img.label}})}\n actionType={\"delete\"}\n numToRemove={numSelected}\n collectionsMode={true}\n />\n
\n } else {\n return
\n }\n }\n}\nexport default ImageCollection;","import React from 'react';\n\n/**\n * List the projects in a table format\n */\nconst ListView = ({selectedProjectID, selectProject, allProjects=[], doubleClick, tabIndex}) => {\n const viewDate = {year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'}\n const ariaDate = {year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit'}\n const projectsList = allProjects.map((project, i) => {\n return ( \n \n );\n });\n return (\n
\n
\n
Name
\n
Date Modified
\n
\n
\n {projectsList}\n
\n
\n );\n};\nexport default ListView;\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport loadingImg from '../../assets/viscoll_loading.gif';\n\n/** Stateless functional component for the loading screen */\nconst LoadingScreen = (props) => {\n const logo = \"logo\" ;\n return (\n \n {logo}\n \n );\n}\nexport default LoadingScreen;\n","import React, { Component } from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport { connect } from 'react-redux';\n\n/** Dialog for server error */\nclass ServerErrorScreen extends Component {\n render() {\n const actions = [\n this.props.logout()}\n />,\n ];\n\n return (\n \n Something has gone wrong likely having to do with internets and tubes.{' '}\n
\n Re-login into your account to get back to business.
\n \n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n serverError: state.global.serverError,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n logout: () => {\n dispatch({ type: 'LOGOUT_SUCCESS' });\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ServerErrorScreen);\n","import React from 'react';\nimport Snackbar from 'material-ui/Snackbar';\n\n/** Stateless functional component for snackbar notification */\nconst Notification = (props) => {\n return (\n \n );\n}\nexport default Notification;\n","import React from 'react';\nimport {floatFieldLight} from '../../styles/textfield';\nimport TextField from 'material-ui/TextField';\nimport Dialog from 'material-ui/Dialog';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport IconSubmit from 'material-ui/svg-icons/action/done';\nimport IconClear from 'material-ui/svg-icons/content/clear';\n\n/**\n * Form to edit user account information\n */\nclass UserProfileForm extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: props.name,\n email: props.email,\n emailMessagePending: false,\n emailMessage: false,\n currentPassword: \"\",\n newPassword: \"\",\n newPasswordConfirm: \"\",\n errors: {\n name: \"\",\n email: \"\",\n newPassword: \"\",\n newPasswordConfirm: \"\",\n currentPassword: \"\"\n },\n editing: {\n name: false,\n email: false,\n newPassword: false,\n newPasswordConfirm: false,\n currentPassword: false,\n },\n deleteDialog: false,\n unsavedDialog: false,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n this.setState({ \n name: nextProps.name,\n errors: {\n ...this.state.errors,\n currentPassword: nextProps.currentPasswordError.toString(),\n email: nextProps.emailTakenError.toString(),\n },\n currentPassword: \"\",\n newPassword: \"\",\n newPasswordConfirm: \"\",\n unsavedDialog: false, \n changed: false,\n }, () => {\n if (this.state.emailMessagePending && this.state.errors.email === \"\") {\n this.setState({emailMessage:true,emailMessagePending:false});\n }\n });\n }\n\n /**\n * Validate user input and display appropriate error message\n */\n checkValidationError = () => {\n const errors = {};\n // Validate password\n if (this.state.editing.currentPassword || this.state.newPassword) {\n if (!this.state.currentPassword) {\n errors.currentPassword = \"Current password cannot be blank\";\n } else {\n errors.currentPassword = \"\";\n }\n if (!this.state.newPasswordConfirm) {\n errors.newPasswordConfirm = \"New password confirmation cannot be blank\";\n } else if (this.state.newPassword !== this.state.newPasswordConfirm) {\n errors.newPasswordConfirm = \"Password confirmation does not match new password\";\n } else {\n errors.newPasswordConfirm = \"\";\n }\n if (!this.state.newPassword) {\n errors.newPassword = \"New password cannot be blank\";\n } else {\n errors.newPassword = \"\";\n }\n }\n // Validate name\n if (this.state.editing.name && !this.state.name) {\n errors.name = \"Name cannot be blank\";\n } else {\n errors.name = \"\";\n }\n // Validate email\n if (this.state.editing.email) {\n let re = /[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}/igm;\n if (!this.state.email) {\n errors.email = \"Email cannot be blank\";\n } else if (!re.test(this.state.email)) {\n errors.email = \"Invalid email address\";\n } else {\n errors.email = \"\";\n }\n } \n return errors;\n }\n\n ifErrorsExist = (type) => {\n return (this.state.errors[type]!==\"\");\n }\n\n /**\n * Return true if any input fields have been changed and not saved\n */\n isEditing = () => {\n return (this.state.editing.name || this.state.editing.email || this.state.editing.currentPassword || this.state.editing.newPassword || this.state.editing.newPasswordConfirm);\n }\n\n onInputChange = (newValue, type) => {\n this.setState({[type]: newValue, editing: {...this.state.editing, [type]:true}}, () => {\n this.setState({errors: {...this.state.errors, ...this.checkValidationError()}})\n });\n }\n\n handleDeleteDialogToggle = (deleteDialog=false) => {\n this.setState({ deleteDialog });\n };\n\n /**\n * Show ignore changes dialog or close user profile, depending on parameter\n */\n handleUserProfileClose = (ignoreChanges=false) => {\n // Check for any unsaved changes before closing and show the warning dialog.\n if (this.isEditing() && !ignoreChanges){\n this.setState({ unsavedDialog: true });\n }\n else {\n this.setState({\n name: this.props.name,\n email: this.props.email,\n currentPassword: \"\",\n newPassword: \"\",\n newPasswordConfirm: \"\",\n errors: {\n name: \"\",\n email: \"\",\n newPassword: \"\",\n newPasswordConfirm: \"\",\n currentPassword: \"\"\n },\n editing: {\n name: false,\n email: false,\n newPassword: false,\n newPasswordConfirm: false,\n currentPassword: false,\n }\n }, () => this.props.toggleUserProfile());\n \n }\n }\n\n handleUserAccountDelete = () => {\n this.props.toggleUserProfile(false);\n this.props.handleUserAccountDelete();\n }\n\n handleUnsavedDialogToggle = (unsavedDialog=false) => {\n this.setState({ unsavedDialog });\n };\n\n /**\n * Reset input field to original value \n */\n handleCancelUpdate = (type) => {\n if (type===\"currentPassword\") {\n this.setState({\n currentPassword:\"\",\n newPassword:\"\",\n newPasswordConfirm:\"\",\n editing: {\n ...this.state.editing,\n currentPassword: false,\n newPassword: false,\n newPasswordConfirm: false,\n },\n errors: {\n ...this.state.errors,\n currentPassword:\"\",\n newPassword:\"\",\n newPasswordConfirm:\"\",\n }\n });\n } else {\n this.setState({\n [type]: this.props[type],\n editing: {\n ...this.state.editing,\n [type]: false,\n },\n errors: {\n ...this.state.errors,\n [type]: \"\",\n }\n })\n }\n }\n\n submitButtons = (type) => {\n if (this.state.editing[type]) {\n return (\n
\n }\n style={{minWidth:\"60px\",marginLeft:\"5px\"}}\n name=\"submit\"\n type=\"submit\"\n disabled={type===\"currentPassword\"? (this.ifErrorsExist(\"currentPassword\")||this.ifErrorsExist(\"newPassword\")||this.ifErrorsExist(\"newPasswordConfirm\")) : this.ifErrorsExist(type) } \n onClick={() => this.handleUserUpdate(null, type)}\n />\n }\n style={{minWidth:\"60px\",marginLeft:\"5px\"}}\n onClick={() => this.handleCancelUpdate(type)}\n />\n
\n )\n } else {\n return \"\";\n }\n }\n\n handleUserUpdate = (event, type) => {\n if (event) event.preventDefault();\n let updatedUser = { \n user: {\n [type]: this.state[type],\n }\n };\n if (this.state.currentPassword!==\"\") {\n updatedUser = {user: {\n current_password: this.state.currentPassword,\n password: this.state.newPassword\n }};\n }\n this.props.handleUserProfileUpdate(updatedUser);\n let types = {};\n if (type===\"password\") {\n types = {currentPassword: false, newPassword: false, newPasswordConfirm: false};\n } else {\n types = {[type]: false};\n }\n this.setState({editing:{...this.state.editing, ...types}}, ()=> {\n if (type===\"email\") {\n this.setState({emailMessagePending:true});\n }\n });\n }\n\n render() {\n const userProfileActions = [\n this.handleUserProfileClose()}\n />,\n this.handleDeleteDialogToggle(true)}\n style={{float: 'left'}}\n />\n ];\n \n const deleteActions = [\n this.handleDeleteDialogToggle()}\n />,\n this.handleUserAccountDelete()}\n />,\n ];\n\n const unsaveActions = [\n this.handleUnsavedDialogToggle()}\n \n />,\n this.handleUserProfileClose(true)}\n />,\n ];\n\n const emailConfirmActions = [\n this.setState({emailMessage:false})}\n keyboardFocused\n />\n ];\n\n let nameField = (\n
\n
this.handleUserUpdate(e, \"name\")}>\n this.onInputChange(v, \"name\")} \n name=\"name\" \n floatingLabelText=\"Name\" \n floatingLabelStyle={{color:\"#6e6e6e\"}}\n errorText={this.state.errors.name}\n value={this.state.name}\n fullWidth\n />\n {this.submitButtons(\"name\")}\n \n
\n );\n\n let emailField = (\n
\n
this.handleUserUpdate(e, \"email\")}>\n this.onInputChange(v, \"email\")} \n name=\"email\" \n floatingLabelText=\"E-mail\" \n floatingLabelStyle={{color:\"#6e6e6e\"}}\n errorText={this.state.errors.email} \n value={this.state.email}\n fullWidth\n />\n {this.submitButtons(\"email\")}\n \n
\n );\n\n let password = (\n
\n
this.handleUserUpdate(e, \"password\")}>\n this.onInputChange(v, \"currentPassword\")} \n name=\"currentPassword\" \n floatingLabelText=\"Current Password\" \n {...floatFieldLight}\n errorText={this.state.errors.currentPassword} \n type=\"password\" \n value={this.state.currentPassword}\n fullWidth\n />\n this.onInputChange(v, \"newPassword\")} \n name=\"newPassword\" \n floatingLabelText=\"New Password\" \n {...floatFieldLight}\n errorText={this.state.errors.newPassword} \n type=\"password\" \n value={this.state.newPassword}\n fullWidth\n />\n this.onInputChange(v, \"newPasswordConfirm\")} \n name=\"newPasswordConfirm\" \n floatingLabelText=\"Confirm New Password\" \n {...floatFieldLight}\n errorText={this.state.errors.newPasswordConfirm} \n type=\"password\" \n value={this.state.newPasswordConfirm}\n fullWidth\n />\n {this.submitButtons(\"currentPassword\")}\n \n
\n );\n\n\n return (\n
\n \n \n {nameField}\n
\n {emailField}\n
\n

Update your password

\n {password}\n\n \n \n\n\n \n \n A confirmation link has been sent to your new email address. \n
\n Your current email will still remain active until the new email is activated.\n \n\n
\n );\n }\n}\n \nexport default UserProfileForm;\n","import React, {Component} from 'react';\nimport TextField from 'material-ui/TextField';\nimport Checkbox from 'material-ui/Checkbox';\nimport {floatFieldLight} from '../../styles/textfield';\n\n/** Filter terms */\nclass TermsFilter extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n value: \"\",\n }\n }\n \n render() {\n return ( \n
\n
\n {this.setState({value});this.props.onValueChange(e,value)}}\n style={window.innerWidth<=890?{marginLeft:10,marginRight:10, width:150}:{marginLeft:10,marginRight:10, width:200}}\n value={this.state.value}\n {...floatFieldLight}\n tabIndex={this.props.tabIndex}\n />\n
\n
0)?\"searchOptions active\":\"searchOptions\"}>\n this.props.onTypeChange(\"title\", !this.props.filterTypes[\"title\"])}\n tabIndex={this.props.tabIndex}\n />\n this.props.onTypeChange(\"type\", !this.props.filterTypes[\"type\"])}\n tabIndex={this.props.tabIndex}\n />\n this.props.onTypeChange(\"description\", !this.props.filterTypes[\"description\"])}\n tabIndex={this.props.tabIndex}\n />\n
\n
\n );\n }\n}\n\n\nexport default TermsFilter;\n","import React, { Component } from 'react';\nimport Toolbar from 'material-ui/Toolbar';\nimport { ToolbarGroup } from 'material-ui/Toolbar';\nimport IconMenu from 'material-ui/IconMenu';\nimport MenuItem from 'material-ui/MenuItem';\nimport IconButton from 'material-ui/IconButton';\nimport Avatar from 'material-ui/Avatar';\nimport UserProfileForm from '../components/topbar/UserProfileForm';\nimport FlatButton from 'material-ui/FlatButton';\nimport TermsFilter from '../components/termsManager/TermsFilter';\nimport FilterIcon from 'material-ui/svg-icons/content/filter-list';\nimport Undo from 'material-ui/svg-icons/content/undo';\nimport Redo from 'material-ui/svg-icons/content/redo';\nimport Image from 'material-ui/svg-icons/image/image';\nimport imgLogo from '../assets/vceditor_logo.svg';\nimport { btnBase } from '../styles/button';\nimport { connect } from 'react-redux';\nimport {\n logout,\n updateProfile,\n deleteProfile,\n} from '../actions/backend/userActions';\nimport { API_URL } from '../store/axiosConfig';\nimport light from '../styles/light';\n\n/** The topbar menu used in `Dashboard` and `Project` components */\nclass TopBar extends Component {\n constructor(props) {\n super(props);\n this.state = {\n userProfileModalOpen: false,\n };\n }\n\n componentDidMount() {\n window.addEventListener('keydown', this.shortcutListener);\n // set instance into state\n let instanceURL = API_URL + '/instance'\n let instanceRequest = () => {\n fetch(instanceURL).then(async (response) => {\n const data = await response.json();\n this.setState({instance:data.current_instance})\n })\n }\n instanceRequest();\n }\n\n componentWillUnmount() {\n window.removeEventListener('keydown', this.shortcutListener);\n }\n\n shortcutListener = event => {\n if ((event.ctrlKey || event.metaKey) && event.code === 'KeyZ') {\n if (this.props.actionHistory.undo.length > 0) this.props.undo();\n } else if ((event.ctrlKey || event.metaKey) && event.code === 'KeyY') {\n event.preventDefault();\n if (this.props.actionHistory.redo.length > 0) this.props.redo();\n }\n };\n\n handleUserProfileUpdate = user => {\n const userID = this.props.user.id;\n this.props.updateProfile(user, userID);\n };\n\n toggleUserProfile = (userProfileModalOpen = false) => {\n this.setState({ userProfileModalOpen });\n this.props.togglePopUp(userProfileModalOpen);\n };\n\n handleUserAccountDelete = () => {\n const userID = this.props.user.id;\n this.props.deleteProfile(userID);\n };\n\n handleUserLogout = () => {\n this.props.logoutUser();\n };\n\n goHome = () => {\n if (this.props.history.location.pathname.includes('dashboard')) {\n this.props.goToDashboardProjectList();\n } else {\n this.props.resetActionHistory();\n this.props.history.push('/dashboard');\n }\n };\n\n render() {\n // User icon menu on the right corner of Toolbar\n let UserMenu = (\n \n \n \n \n \n \n \n }\n targetOrigin={{ horizontal: 'right', vertical: 'top' }}\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\n >\n this.toggleUserProfile(true)}\n />\n this.handleUserLogout()}\n />\n \n );\n\n let topbarClasses = 'topbar';\n if (this.props.popUpActive) topbarClasses += ' lowerZIndex';\n let imageViewerTitle = '';\n if (this.props.windowWidth > 768 && this.props.imageViewerEnabled) {\n imageViewerTitle = 'Hide image viewer';\n } else if (this.props.windowWidth > 768) {\n imageViewerTitle = 'Image viewer';\n }\n return (\n \n \n \"VCEditor\n \n \n {this.props.children}\n \n {this.props.showUndoRedo ? (\n
\n {\n e.preventDefault();\n this.props.undo();\n }}\n >\n \n \n {\n e.preventDefault();\n this.props.redo();\n }}\n >\n \n \n
\n ) : null}\n\n {this.props.showImageViewerButton ? (\n this.props.toggleImageViewer()}\n icon={}\n labelStyle={{\n ...btnBase().labelStyle,\n padding:\n this.props.windowWidth <= 1024 ? '0px 10px 0px 0px' : 10,\n }}\n style={{ ...btnBase().style, marginRight: 5 }}\n tabIndex={this.props.tabIndex}\n />\n ) : null}\n {this.props.toggleFilterDrawer ? (\n \n {\n e.preventDefault();\n this.props.toggleFilterDrawer();\n }}\n tabIndex={this.props.tabIndex}\n >\n \n \n \n ) : null}\n {this.props.termsFilter ? (\n \n ) : null}\n\n {UserMenu}\n
\n
\n \n \n );\n }\n}\nconst mapStateToProps = state => {\n return {\n user: state.user,\n terms: state.active.terms,\n actionHistory: state.history,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n logoutUser: () => {\n dispatch(logout());\n },\n updateProfile: (user, userID) => {\n dispatch(updateProfile(user, userID));\n },\n deleteProfile: userID => {\n dispatch(deleteProfile(userID));\n },\n undo: () => {\n dispatch({ type: 'UNDO' });\n },\n redo: () => {\n dispatch({ type: 'REDO' });\n },\n resetActionHistory: () => {\n dispatch({ type: 'CLEAR_ACTION_HISTORY' });\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TopBar);\n","export function loadProject(projectID, showLoading = 'SHOW_LOADING') {\n return {\n types: [showLoading, 'LOAD_PROJECT_SUCCESS', 'LOAD_PROJECT_FAILED'],\n payload: {\n request: {\n url: `/projects/${projectID}`,\n method: 'get',\n successMessage: '',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function loadProjectViewOnly(projectID, showLoading = 'SHOW_LOADING') {\n return {\n types: [\n showLoading,\n 'LOAD_PROJECT_VIEW_ONLY_SUCCESS',\n 'LOAD_PROJECT_VIEW_ONLY_FAILED',\n ],\n payload: {\n request: {\n url: `/projects/${projectID}/viewOnly`,\n method: 'get',\n successMessage: '',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function createProject(newProject) {\n return {\n types: ['SHOW_LOADING', 'CREATE_PROJECT_SUCCESS', 'CREATE_PROJECT_FAILED'],\n payload: {\n request: {\n url: `/projects`,\n method: 'post',\n data: newProject,\n successMessage: 'Successfully created the project',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function updateProject(projectID, project) {\n return {\n types: [\n 'UPDATE_PROJECT_FRONTEND',\n 'UPDATE_PROJECT_SUCCESS_BACKEND',\n 'UPDATE_PROJECT_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/projects/${projectID}`,\n method: 'put',\n data: { project },\n successMessage: 'Successfully updated the project',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function updatePreferences(projectID, project) {\n return {\n types: ['UPDATE_PREFERENCES_FRONTEND', '', 'UPDATE_PROJECT_FAILED_BACKEND'],\n payload: {\n request: {\n url: `/projects/${projectID}`,\n method: 'put',\n data: { project },\n successMessage: 'Successfully updated the project',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function deleteProject(projectID, deleteUnlinkedImages) {\n return {\n types: [\n 'DELETE_PROJECT_FRONTEND',\n 'DELETE_PROJECT_SUCCESS_BACKEND',\n 'DELETE_PROJECT_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/projects/${projectID}`,\n method: 'delete',\n data: { deleteUnlinkedImages },\n successMessage: 'Successfully deleted the project',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function loadProjects() {\n return {\n types: ['NO_LOADING', 'LOAD_PROJECTS_SUCCESS', 'LOAD_PROJECTS_FAILED'],\n payload: {\n request: {\n url: `/projects`,\n method: 'get',\n successMessage: '',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\n/**\n *\n * @param {object} data {importData:\"\", importFormat:\"\", imageData:\"\"}\n */\nexport function importProject(data) {\n return {\n types: ['SHOW_LOADING', 'IMPORT_PROJECT_SUCCESS', 'IMPORT_PROJECT_FAILED'],\n payload: {\n request: {\n url: `/projects/import`,\n method: 'put',\n data: data,\n successMessage: 'Successfully imported the project',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function cloneProject(projectID) {\n return {\n types: ['SHOW_LOADING', 'CLONE_PROJECT_SUCCESS', 'CLONE_PROJECT_FAILED'],\n payload: {\n request: {\n url: `/projects/${projectID}/clone`,\n method: 'get',\n successMessage: 'Successfully cloned the project',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function exportProject(projectID, format) {\n return {\n types: ['SHOW_LOADING', 'EXPORT_SUCCESS', 'EXPORT_FAILED'],\n payload: {\n request: {\n url: `/projects/${projectID}/export/${format}`,\n method: 'get',\n successMessage: '',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function exportProjectBeforeFeedback(projectID, format) {\n return {\n types: ['NO_LOADING', 'EXPORT_SUCCESS', 'EXPORT_FAILED'],\n payload: {\n request: {\n url: `/projects/${projectID}/export/${format}`,\n method: 'get',\n successMessage: 'You have successfully sent a feedback!',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n","import React, { Component } from 'react';\nimport { connect } from \"react-redux\";\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport TextField from 'material-ui/TextField';\nimport ClientJS from 'clientjs';\nimport { exportProjectBeforeFeedback } from \"../actions/backend/projectActions\";\nimport { sendFeedback } from \"../actions/backend/userActions\";\n\n/** Feedback form that sends an email to admin for each feedback */\nclass Feedback extends Component {\n constructor(props) {\n super(props);\n this.state = {\n feedbackOpen: false,\n creditsOpen: false,\n title: \"\",\n feedback: \"\",\n }\n }\n handleOpen = (type) => {\n if (type === \"feedback\") {\n this.setState({ feedbackOpen: true });\n } else if (type === \"credits\") {\n this.setState({ creditsOpen: true });\n }\n }\n handleClose = (type) => {\n if (type === \"feedback\") {\n this.setState({\n feedbackOpen: false,\n title: \"\",\n feedback: \"\",\n });} else if (type === \"credits\") {\n this.setState({ creditsOpen: false });\n }\n this.props.togglePopUp(false);\n }\n onChange = (type, value) => {\n this.setState({ [type]: value });\n }\n submit = () => {\n let feedback = this.state.feedback;\n let browserInformation;\n try {\n const client = new ClientJS();\n const result = client.getResult();\n browserInformation = JSON.stringify(result);\n } catch (e) { }\n this.props.sendFeedback(this.state.title, feedback, browserInformation, this.props.projectID);\n this.handleClose(\"feedback\");\n }\n render() {\n const feedbackActions = [\n this.handleClose(\"feedback\")}\n />,\n this.submit()}\n />,\n ];\n const creditsActions = [\n this.handleClose(\"credits\")}\n />\n ]\n const openInNewTab = (url) => {\n const newWindow = window.open(url, '_blank', 'noopener,noreferrer')\n if (newWindow) newWindow.opener = null\n }\n return (\n
\n
\n { this.handleOpen(\"feedback\"); this.props.togglePopUp(true) }}\n backgroundColor=\"rgba(82, 108, 145, 0.2)\"\n tabIndex={this.props.tabIndex}\n />\n { this.handleOpen(\"credits\"); this.props.togglePopUp(true) }}\n backgroundColor=\"rgba(82, 108, 145, 0.2)\"\n tabIndex={this.props.tabIndex}\n />\n openInNewTab(\"https://viscoll.org/help/\")}\n backgroundColor=\"rgba(82, 108, 145, 0.2)\"\n tabIndex={this.props.tabIndex}\n />\n
\n \n

Bug? Suggestions? Let us know!

\n
\n
\n Title\n
\n
\n this.onChange(\"title\", v)}\n autoFocus\n />\n
\n
\n
\n
\n Feedback\n
\n
\n this.onChange(\"feedback\", e.target.value)}\n rows={5}\n />\n
\n
\n \n \n

\n VCEditor is a tool for building and visualizing the physical structure of manuscripts using the data model\n provided by VisColl: Modeling and Visualizing the\n Physical Construction of Codex Manuscripts, a project\n co-directed by Alberto Campagnolo and Dot Porter.\n

\n\n

\n VCEditor is a continuation of development of VisCodex,\n developed by the Old Books New Science lab at the University of Toronto, directed by Dr Alexandra Gillespie.\n The VisCodex development team consisted of Monica Ung, Janarthenan Rajakumar, and Rachel Di Cresce.\n

\n\n

\n For VCEditor we have made several\n modification, particularly to the back end, to ensure that the output\n validates to the most recent version of the VisColl data model. Development of the XSLT pipelines for\n VCEditor, called Idrovora, was done by Gregor Middel, and\n primary development of VCEditor was done by Patrick Perkins.\n

\n\n

\n Supervision of all development was provided by Doug Emery, and organizational support was provided by Lynn\n Ransom. We would like to thank the Schoenberg Institute for Manuscript Studies and the University of\n Pennsylvania Libraries for their continued support of the project.\n

\n \n
\n );\n }\n}\nconst mapStateToProps = (state) => {\n return {\n userID: state.user.id,\n projectID: state.active.project ? state.active.project.id : null\n };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n return {\n sendFeedback: (title, message, browserInformation, projectID) => {\n if (projectID) {\n dispatch(exportProjectBeforeFeedback(projectID, \"json\"))\n .then((action) => {\n if (action.type === \"EXPORT_SUCCESS\") {\n const project = JSON.stringify(action.payload);\n dispatch(sendFeedback(title, message, browserInformation, project));\n }\n })\n } else {\n dispatch(sendFeedback(title, message, browserInformation));\n }\n }\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Feedback);\n","let topbarStyle = () => {\n let width = 200;\n if (window.innerWidth<=870) {\n width = 120;\n } else if (window.innerWidth<=1024) {\n width = 150;\n }\n return {\n tab: {\n width, \n height: 55, \n color: '#6A6A6A',\n fontSize: window.innerWidth<=870?\"12px\":null,\n },\n }\n}\nexport default topbarStyle;","\n/**\n *\n * @param {list} projectIDs [ 5a26d22f3b0eb7594c9dec23, ... ]\n * @param {imageIDs} imageIDs [ 5a26d22f3b0eb7594c9dec23, ... ]\n */\nexport function linkImages(projectIDs, imageIDs) {\n return {\n types: ['LINK_IMAGES_FRONTEND','LINK_IMAGES_SUCCESS_BACKEND','LINK_IMAGE_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/images/link`,\n data: {projectIDs, imageIDs},\n method: 'put',\n successMessage: projectIDs.length>1 ? \"You have successfully linked the projects to this image\" : \"You have successfully linked the project to this image\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}\n\n/**\n *\n * @param {list} projectIDs [ 5a26d22f3b0eb7594c9dec23, ... ]\n * @param {imageIDs} imageIDs [ 5a26d22f3b0eb7594c9dec23, ... ]\n */\nexport function unlinkImages(projectIDs, imageIDs) {\n return {\n types: ['UNLINK_IMAGES_FRONTEND','UNLINK_IMAGES_SUCCESS_BACKEND','UNLINK_IMAGES_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/images/unlink`,\n data: {projectIDs, imageIDs},\n method: 'put',\n successMessage: projectIDs.length>1 ? \"You have successfully unlinked the projects to this image\" : \"You have successfully unlinked this project to this image\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}\n\n/**\n *\n * @param {list} imageIDs\n */\nexport function deleteImages(imageIDs) {\n return {\n types: ['DELETE_IMAGES_FRONTEND','DELETE_IMAGES_SUCCESS_BACKEND','DELETE_IMAGES_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/images/`,\n method: 'delete',\n data: {imageIDs},\n successMessage: imageIDs.length>1?\"You have successfully deleted the images\":\"You have successfully deleted the image\",\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\n/**\n *\n * @param {list} images [ { filename:\"\", contents: data(base64) } , ... ]\n */\nexport function uploadImages(images, projectID) {\n return {\n types: ['SHOW_LOADING','UPLOAD_IMAGES_SUCCESS_BACKEND','UPLOAD_IMAGES_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/images`,\n method: 'post',\n data: {projectID, images},\n successMessage: images.length>1? \"You have successfully uploaded your images\" : \"You have successfully uploaded your image\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\n\nexport function mapSidesToImages(sideMappings) {\n // sideMappings = [{id: 112, image: {}}, ...]\n return { \n types: ['MAP_SIDES_FRONTEND','MAP_SIDES_SUCCESS_BACKEND','MAP_SIDES_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/sides`,\n method: 'put',\n data: {sides: sideMappings},\n successMessage: \"Successfully updated the sides\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}","import React, {Component} from 'react';\nimport IconButton from 'material-ui/IconButton';\nimport ExpandMore from 'material-ui/svg-icons/navigation/expand-more';\nimport ExpandLess from 'material-ui/svg-icons/navigation/expand-less';\n\n/** Expandable panel component for the project sidebar. Panel examples: Filter, export.. */\nexport default class Panel extends Component {\n constructor(props) {\n super(props);\n this.state = {\n open: props.defaultOpen,\n }\n }\n \n handleChange = (type, value) => {\n this.setState({[type]: value});\n }\n\n render() {\n let paddingStyle = this.props.noPadding?{padding:0}:{};\n return (\n
\n
\n

{this.props.title}

\n {e.preventDefault(); e.stopPropagation(); this.handleChange(\"open\", !this.state.open)}}\n aria-label={this.state.open?\"Hide \" + this.props.title + \" panel\" : \"Expand \" + this.props.title + \" panel\"}\n iconStyle={{color:\"white\"}}\n tooltip={this.state.open?\"Hide panel\":\"Expand panel\"}\n style={{padding:0,width:\"inherit\",height:\"inherit\"}}\n tooltipPosition=\"bottom-left\"\n tabIndex={this.props.tabIndex}\n >\n {this.state.open? : }\n \n
\n
\n {this.props.children}\n
\n
\n )\n }\n\n}\n","import React, { Component } from 'react';\nimport Drawer from 'material-ui/Drawer';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport NewProjectContainer from '../components/dashboard/NewProjectContainer';\nimport EditProjectForm from '../components/dashboard/EditProjectForm';\nimport ImageCollections from '../components/dashboard/ImageCollections';\nimport ListView from '../components/dashboard/ListView';\nimport LoadingScreen from '../components/global/LoadingScreen';\nimport ServerErrorScreen from '../components/global/ServerErrorScreen';\nimport NetworkErrorScreen from '../components/global/NetworkErrorScreen';\nimport Notification from '../components/global/Notification';\nimport TopBar from './TopBar';\nimport Feedback from './Feedback';\nimport { Tabs, Tab } from 'material-ui/Tabs';\nimport topbarStyle from '../styles/topbar';\nimport { btnMd } from '../styles/button';\nimport { connect } from 'react-redux';\nimport {\n createProject,\n updateProject,\n deleteProject,\n loadProjects,\n importProject,\n cloneProject,\n} from '../actions/backend/projectActions';\nimport {\n uploadImages,\n linkImages,\n unlinkImages,\n deleteImages,\n} from '../actions/backend/imageActions';\nimport Panel from '../components/global/Panel';\nimport UTLogo from '../assets/ut_logo.png';\nimport UPLogo from '../assets/upenn_logo.png';\n\n/** Dashboard where user is directed to upon login. This is where the user an create a new project or edit an existing project. */\nclass Dashboard extends Component {\n constructor(props) {\n super(props);\n this.state = {\n newProjectPopoverOpen: false,\n newProjectModalOpen: false,\n selectedProject: null,\n projectDrawerOpen: false,\n userProfileDialogOpen: false,\n feedbackOpen: false,\n deleteConfirmationOpen: false,\n page: 'collations',\n };\n }\n\n componentWillMount() {\n this.props.user.authenticated ? this.props.loadProjects(this.props) : this.props.history.push('/');\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.notification !== '') {\n if (nextProps.projects.length >= this.props.projects.length && this.state.page === 'collations') {\n this.setState({\n selectedProject: nextProps.projects[0],\n projectDrawerOpen: true,\n })\n } else {\n this.setState({\n selectedProject: null,\n projectDrawerOpen: false,\n })\n }\n }\n }\n\n componentDidUpdate() {\n if (!this.props.user.authenticated) this.props.history.push('/');\n }\n\n closeProjectPanel = () => {\n this.setState({ projectDrawerOpen: false, selectedProject: null });\n }\n\n doubleClick = projectID => {\n this.props.resetActionHistory();\n this.props.history.push(`/project/${projectID}`);\n }\n\n handleProjectSelection = (index) => {\n if (index >= 0) {\n let project = this.props.projects[index];\n this.setState({ projectDrawerOpen: true, selectedProject: project });\n }\n }\n\n handleNewProjectTouchTap = (event) => {\n event.preventDefault();\n this.setState({ newProjectPopoverOpen: true, popoverAnchorEl: event.currentTarget });\n };\n\n handleNewProjectRequestClose = () => this.setState({ newProjectPopoverOpen: false });\n\n handleNewProjectModalToggle = (value) => {\n this.setState({ newProjectModalOpen: value, newProjectPopoverOpen: false });\n }\n\n handleDeleteConfirmModalToggle = (value) => {\n this.setState({ deleteConfirmationOpen: value });\n }\n\n handleImportProject = (data) => {\n this.props.importProject(data)\n .then((action) => {\n if (action.type === 'IMPORT_PROJECT_SUCCESS') {\n this.handleProjectSelection(0);\n this.props.importProjectCallback();\n }\n });\n }\n\n modalIsOpen = () => {\n return this.state.deleteConfirmationOpen || this.state.feedbackOpen || this.state.newProjectModalOpen || this.state.newProjectPopoverOpen || this.state.userProfileDialogOpen;\n }\n\n userProfileToggle = (userProfileDialogOpen) => {\n this.setState({ userProfileDialogOpen });\n }\n\n render() {\n let sidebar = (\n
\n
\n
\n this.handleNewProjectModalToggle(true)}\n tabIndex={this.modalIsOpen() ? -1 : 0}\n aria-label=\"Create new collation\"\n />\n
\n
\n
\n this.setState({\n page: 'collations',\n projectDrawerOpen: this.state.selectedProject !== null\n })}\n tabIndex={this.modalIsOpen() ? -1 : 0}\n aria-label=\"Collations\"\n >\n Collations\n \n this.setState({ page: 'image', projectDrawerOpen: false })}\n tabIndex={this.modalIsOpen() ? -1 : 0}\n aria-label=\"Image Collections\"\n >\n Image Collections\n \n \n
\n \n \"University\n \n \n \"University\n \n
\n \n
\n );\n let projectPane = (\n \n \n \n );\n\n return (\n
\n this.setState({ page: 'collations' })}\n showUndoRedo={this.state.page === 'image'}\n >\n \n \n \n \n {sidebar}\n {projectPane}\n this.handleNewProjectModalToggle(false)}\n user={this.props.user}\n createProject={this.props.createProject}\n importProject={this.handleImportProject}\n importStatus={this.props.importStatus}\n cloneProject={this.props.cloneProject}\n />\n
\n {this.state.page === 'collations' ?\n \n :\n this.setState({ deleteConfirmationOpen: v })}\n action={{\n uploadImages: this.props.uploadImages,\n linkImages: this.props.linkImages,\n unlinkImages: this.props.unlinkImages,\n deleteImages: this.props.deleteImages,\n }}\n />\n }\n
\n \n \n \n \n this.setState({ feedbackOpen: v })}/>\n
\n );\n }\n}\n\nconst mapStateToProps = (state) => {\n return {\n user: state.user,\n projects: state.dashboard.projects,\n images: state.dashboard.images,\n importStatus: state.dashboard.importStatus,\n loading: state.global.loading,\n notification: state.global.notification,\n actionHistory: state.history,\n };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n return {\n createProject: (newProject) => {\n dispatch(createProject(newProject));\n },\n updateProject: (projectID, project) => {\n dispatch(updateProject(projectID, project))\n },\n deleteProject: (projectID, deleteUnlinkedImages) => {\n dispatch(deleteProject(projectID, deleteUnlinkedImages));\n },\n loadProjects: (props) => {\n dispatch(loadProjects());\n },\n importProject: (data) => {\n return dispatch(importProject(data))\n },\n importProjectCallback: () => {\n dispatch({ type: 'IMPORT_PROJECT_SUCCESS_CALLBACK' });\n },\n cloneProject: (projectID) => {\n dispatch(cloneProject(projectID));\n },\n uploadImages: (images) => {\n dispatch(uploadImages(images));\n },\n linkImages: (projectIDs, imageIDs) => {\n dispatch(linkImages(projectIDs, imageIDs));\n },\n unlinkImages: (projectIDs, imageIDs) => {\n dispatch(unlinkImages(projectIDs, imageIDs));\n },\n deleteImages: (imageIDs) => {\n dispatch(deleteImages(imageIDs));\n },\n resetActionHistory: () => {\n dispatch({ type: 'CLEAR_ACTION_HISTORY' })\n }\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Dashboard);\n\n\n","import React from 'react';\n\n/** Side element of collation used in tabular edit mode */\nconst Side = (props) => {\n const { activeSide, project } = props;\n const { \n selectedObjects, \n filters, \n defaultAttributes, \n } = props.collationManager;\n const isActive = selectedObjects.members.includes(activeSide.id);\n const sidesOfMatchingElements = filters.SidesOfMatchingTerms;\n const isFiltered = filters.Sides.includes(activeSide.id);\n const isAffectedFiltered = sidesOfMatchingElements.includes(activeSide.id) && !isFiltered;\n const hideOthers = filters.hideOthers;\n const isFilterActive = filters.active;\n\n let sideAttributes = [];\n\n for (let attribute of defaultAttributes.side) {\n if (project.preferences.side && project.preferences.side[attribute.name]) {\n sideAttributes.push(\n
\n {attribute.displayName}: {activeSide[attribute.name]}\n
\n );\n } \n }\n\n let activeSideStyle = {};\n\n if (isFiltered && !hideOthers) {\n activeSideStyle[\"borderColor\"] = \"#0f7fdb\";\n }\n\n if (isAffectedFiltered && hideOthers && isFilterActive){\n activeSideStyle[\"backgroundColor\"] = \"#d9dbdb\";\n activeSideStyle[\"borderColor\"] = \"#d9dbdb\";\n }\n\n const activeSideName = activeSide.id.split(\"_\")[0];\n\n let classNames = \"side \";\n if (props.focusLeafID===props.activeSide.id) classNames += \"focus \";\n if (isActive) classNames += \"active \";\n\n let sideComponent = (\n
{props.handleObjectClick(activeSide, event); event.stopPropagation();}}\n style={{ ...activeSideStyle }}\n onMouseEnter={()=>props.toggleFocusLeaf(activeSide.id)}\n onMouseLeave={()=>props.toggleFocusLeaf(null)}\n >\n {activeSideName.charAt(0)}\n {if(e.key===\" \"){props.handleObjectPress(activeSide, e)}}}\n onClick={(e)=>{props.handleObjectPress(activeSide, e);e.stopPropagation();}}\n tabIndex={props.tabIndex}\n />\n
\n );\n\n if (sideAttributes.length>0) {\n sideComponent = (\n
{props.handleObjectClick(activeSide, event); event.stopPropagation();}}\n style={{ ...activeSideStyle }}\n onMouseEnter={()=>props.toggleFocusLeaf(activeSide.id)}\n onMouseLeave={()=>props.toggleFocusLeaf(null)}\n >\n
\n {activeSideName}\n {if(e.key===\" \"){props.handleObjectPress(activeSide, e)}}}\n onClick={(e)=>{props.handleObjectPress(activeSide, e);e.stopPropagation();}}\n tabIndex={props.tabIndex}\n />\n
\n {sideAttributes}\n
\n );\n }\n\n return (\n sideComponent\n );\n}\nexport default Side;\n","import React from 'react';\nimport Side from './Side';\n\n/** Leaf element of collation used in tabular edit mode*/\nconst Leaf = (props) => {\n const { activeLeaf, project } = props;\n const {\n selectedObjects,\n filters, \n defaultAttributes, \n flashItems,\n } = props.collationManager;\n const isActive = selectedObjects.members.includes(activeLeaf.id);\n const isFiltered = filters.Leafs.includes(activeLeaf.id);\n const leafsOfMatchingElements = filters.LeafsOfMatchingSides + filters.LeafsOfMatchingTerms;\n const isAffectedFiltered = leafsOfMatchingElements.includes(activeLeaf.id) && !isFiltered;\n const hideOthers = filters.hideOthers;\n const isFilterActive = filters.active;\n let leafAttributes = [];\n let sideAttributesActive = false;\n\n // Determine if any side attributes are active (visibility toggled)\n for (let sideAttribute of defaultAttributes.side) {\n let attributeName = sideAttribute.name;\n if (project.preferences.side && project.preferences.side[attributeName]) {\n sideAttributesActive = true;\n break;\n } \n }\n\n // Render any visible leaf attributes\n for (let leafAttribute of defaultAttributes.leaf) {\n let attributeName = leafAttribute.name;\n if (project.preferences.leaf && project.preferences.leaf[attributeName]) {\n let divStyle = \"attribute \";\n if (isActive) divStyle += \"active \";\n if (attributeName===\"conjoined_to\"){\n leafAttributes.push(\n
\n
\n {leafAttribute.displayName}\n {props.leafIDs.indexOf(activeLeaf[attributeName])!==-1 ? `Leaf ${props.leafIDs.indexOf(activeLeaf[attributeName])+1}` : \"None\"}\n
\n
\n );\n } else{\n leafAttributes.push(\n
\n
\n {leafAttribute.displayName}\n {activeLeaf[attributeName]}\n
\n
\n );\n }\n }\n }\n\n\n\n let activeLeafStyle = {};\n if (isFiltered && !hideOthers) {\n activeLeafStyle[\"borderColor\"] = \"#0f7fdb\";\n }\n if (isAffectedFiltered && hideOthers && isFilterActive){\n activeLeafStyle[\"backgroundColor\"] = \"#d9dbdb\";\n activeLeafStyle[\"borderColor\"] = \"#d9dbdb\";\n }\n \n let sideComponents;\n let sideClassName = \"sideToggle\";\n if (sideAttributesActive) {\n sideClassName = \"sideSection\";\n }\n const rectoSide = props.Rectos[activeLeaf.rectoID];\n const versoSide = props.Versos[activeLeaf.versoID];\n sideComponents = (\n
\n \n \n
\n );\n\n\n let sectionStyle = \"leafSection \";\n if (isActive) sectionStyle += \"active \";\n if (props.focusLeafID === activeLeaf.id) sectionStyle += \"focus\";\n\n let leafComponent =
\n
\n
{props.handleObjectClick(activeLeaf, event);event.stopPropagation()}}\n style={{ ...activeLeafStyle }}\n onMouseEnter={()=>props.toggleFocusLeaf(activeLeaf.id)}\n onMouseLeave={()=>props.toggleFocusLeaf(null)}\n >\n
\n Leaf {props.activeLeafOrder} \n {if(e.key===\" \"){props.handleObjectPress(activeLeaf, e)}}}\n onClick={(e)=>{props.handleObjectPress(activeLeaf, e);e.stopPropagation();}}\n tabIndex={props.tabIndex}\n />\n
\n {leafAttributes.length>0?\n
\n {leafAttributes}\n
\n :\"\"}\n
\n {sideComponents}\n
\n
\n\n if (!isFiltered && hideOthers && isFilterActive && !isAffectedFiltered)\n leafComponent =
;\n\n return (\n leafComponent\n );\n}\nexport default Leaf;\n","import React from 'react';\nimport Leaf from './Leaf';\nimport IconButton from 'material-ui/IconButton';\nimport ExpandMore from 'material-ui/svg-icons/navigation/expand-more';\nimport ExpandLess from 'material-ui/svg-icons/navigation/expand-less';\n\n/** Group element in the tabular edit mode. Recursively mounts nested groups and leaves. */\nexport default class Group extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n open: true,\n }\n }\n\n handleChange = (type, value) => {\n this.setState({[type]:value});\n }\n\n findItemByName = (attributeName) => {\n return this.props.collationManager.defaultAttributes.group.find((item)=>item.name===attributeName);\n }\n\n render() {\n\n const isActive = this.props.collationManager.selectedObjects.members.includes(this.props.activeGroup.id);\n const isFiltered = this.props.collationManager.filters.Groups.includes(this.props.activeGroup.id);\n const groupsOfMatchingElements = this.props.collationManager.filters.GroupsOfMatchingLeafs + this.props.collationManager.filters.GroupsOfMatchingSides + this.props.collationManager.filters.GroupsOfMatchingTerms;\n const isAffectedFiltered = groupsOfMatchingElements.includes(this.props.activeGroup.id) && !isFiltered;\n const hideOthers = this.props.collationManager.filters.hideOthers;\n const isFilterActive = this.props.collationManager.filters.active;\n // Populate all the members of this Group.\n let groupMembers = [];\n this.props.activeGroup.memberIDs.forEach((memberID, index) => {\n if (memberID.charAt(0)===\"L\"){\n let current_leaf = this.props.project.Leafs[memberID];\n groupMembers.push(\n \n );\n } else {\n let current_group = this.props.project.Groups[memberID];\n groupMembers.push(\n \n );\n }\n });\n\n let attributes = [];\n if (this.props.project.preferences.group) {\n for (var attributeName of Object.keys(this.props.project.preferences.group)) {\n if (this.props.project.preferences.group[attributeName]) {\n const item = this.findItemByName(attributeName);\n attributes.push(\n
\n
\n {item.displayName}\n {this.props.activeGroup[attributeName]}\n
\n
\n );\n }\n }\n }\n\n let activeGroupStyle = {};\n if (isFiltered && !hideOthers) {\n activeGroupStyle[\"borderColor\"] = \"#0f7fdb\";\n }\n if (isAffectedFiltered && hideOthers && isFilterActive){\n activeGroupStyle[\"backgroundColor\"] = \"#d9dbdb\";\n activeGroupStyle[\"borderColor\"] = \"#d9dbdb\";\n }\n let groupContainerClasses = \"groupContainer \";\n if (this.props.collationManager.flashItems.groups.includes(this.props.activeGroup.id)) groupContainerClasses += \"flash \";\n if (isActive) groupContainerClasses += \"active \";\n if (this.props.focusLeafID===null && this.props.focusGroupID === this.props.activeGroup.id) groupContainerClasses += \"focus \";\n\n let groupComponent =
this.props.toggleFocusGroup(this.props.activeGroup.id)}\n onMouseLeave={()=>this.props.toggleFocusGroup(null)}\n onClick={(event) =>this.props.handleObjectClick(this.props.activeGroup, event)}\n >\n
\n
\n
\n Group {this.props.activeGroupOrder}\n {if(e.key===\" \"){this.props.handleObjectPress(this.props.activeGroup, e)}}}\n onClick={(e)=>{this.props.handleObjectPress(this.props.activeGroup, e);}}\n tabIndex={this.props.tabIndex}\n />\n
\n {attributes}\n
\n
\n {e.stopPropagation();e.preventDefault();this.handleChange(\"open\", !this.state.open)}}\n aria-label={this.state.open?\"Collapse group \" + this.props.activeGroupOrder : \"Expand group \" + this.props.activeGroupOrder }\n tabIndex={this.props.tabIndex}\n tooltip={this.state.open?\"Collapse group\" : \"Expand group\"}\n >\n {this.state.open? : }\n \n
\n
\n
\n {groupMembers}\n
\n
\n\n if (!isFiltered && hideOthers && isFilterActive && !isAffectedFiltered)\n groupComponent =
;\n\n return (\n groupComponent\n );\n }\n }\n\n\n ","import React from 'react';\nimport update from 'immutability-helper';\nimport Group from './tabularMode/Group';\n\n\n/** Tabular mode - shows collation as table rows */\nexport default class TabularMode extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n focusGroupID: [],\n focusLeafID: null,\n }\n }\n \n toggleFocusGroup = (id) => {\n let newList = [];\n if (id!==null) {\n // Push to array\n newList = update(this.state.focusGroupID, {$push: [id]});\n } else {\n // Pop the array\n newList = update(this.state.focusGroupID, {$splice: [[this.state.focusGroupID.length-1, 1]]});\n }\n this.setState({focusGroupID: newList});\n }\n\n toggleFocusLeaf = (id) => {\n this.setState({focusLeafID: id, focusGroupID: [this.state.focusGroupID[this.state.focusGroupID.length-1]]});\n }\n\n render() { \n let group_components = [];\n for (let groupID of this.props.project.groupIDs){\n const group = this.props.project.Groups[groupID]\n if (group.nestLevel === 1)\n group_components.push(\n 0? this.state.focusGroupID[this.state.focusGroupID.length-1] : null}\n focusLeafID={this.state.focusLeafID}\n handleObjectPress={this.props.handleObjectPress}\n tabIndex={this.props.tabIndex}\n leafIDs={this.props.leafIDs}\n />\n );\n }\n\n let emptyResults = false;\n const activeFiltersLength = this.props.collationManager.filters.Groups.length + this.props.collationManager.filters.Leafs.length + this.props.collationManager.filters.Sides.length + this.props.collationManager.filters.Terms.length;\n if (activeFiltersLength===0)\n emptyResults = true && this.props.collationManager.filters.hideOthers && this.props.collationManager.filters.active\n\n return (\n
\n {emptyResults ?

No objects match the query

: group_components}\n
\n );\n }\n}\n","import paper from 'paper';\n\nPaperLeaf.prototype = {\n constructor: PaperLeaf,\n draw: function () {\n // Call this function only after ALL leaves have been instantiated\n // This is because we need all leaves present in order\n // to compute their indentations relative to each other\n this.setIndent();\n // Draw horizontal part\n let x1 =\n this.multiplier < 1\n ? 10 + this.indent * this.spacing * this.multiplier\n : this.indent * this.spacing * this.multiplier;\n let x2 = this.width;\n this.path.add(new paper.Point(x1, this.y));\n if (this.leaf.stub !== 'No') {\n x2 = this.width * 0.15 + x1;\n }\n this.path.add(new paper.Point(x2, this.y));\n // Draw vertical part\n if (this.isConjoined()) {\n var conjoinY = this.y_conjoin_center(this.conjoined_to);\n this.path.insert(\n 0,\n new paper.Point(this.path.segments[0].point.x, conjoinY)\n );\n }\n this.curveMe();\n\n this.path.name = 'leaf ' + this.order;\n\n // Create highlight path\n this.highlight = this.path.clone();\n this.highlight.dashArray = [0, 0];\n this.highlight.segments[this.highlight.segments.length - 1].point.x =\n this.highlight.segments[this.highlight.segments.length - 1].point.x + 5;\n if (this.leaf.conjoined_to === 'None') {\n this.highlight.segments[0].point.x =\n this.highlight.segments[0].point.x - 5;\n }\n this.highlight.strokeColor = this.strokeColorActive;\n this.highlight.strokeWidth = this.path.strokeWidth * 2;\n this.highlight.opacity = 0;\n this.highlight.name = 'leaf ' + this.order + ' highlight';\n this.highlight.insertBelow(this.path);\n\n if (this.isActive) {\n this.highlight.opacity = 0.35;\n this.highlight.strokeWidth = this.path.strokeWidth * 2;\n this.highlight.strokeColor = '#ffffff';\n }\n\n this.filterHighlight = this.path.clone();\n this.filterHighlight.dashArray = [0, 0];\n this.filterHighlight.segments[\n this.filterHighlight.segments.length - 1\n ].point.x =\n this.filterHighlight.segments[this.filterHighlight.segments.length - 1]\n .point.x + 5;\n if (this.leaf.conjoined_to === 'None') {\n this.filterHighlight.segments[0].point.x =\n this.filterHighlight.segments[0].point.x - 5;\n }\n this.filterHighlight.strokeColor = this.strokeColorFilter;\n this.filterHighlight.strokeWidth = this.path.strokeWidth * 2;\n this.filterHighlight.opacity = 0;\n this.filterHighlight.insertBelow(this.path);\n\n // this.path.fullySelected = true;\n this.showAttributes();\n this.createAttachments();\n\n const leafTermsToShow = this.leaf.terms\n .filter(termID => {\n return this.Terms[termID].show;\n })\n .reverse();\n const rectoTermsToShow = this.recto.terms\n .filter(termID => {\n return this.Terms[termID].show;\n })\n .reverse();\n const versoTermsToShow = this.verso.terms.filter(termID => {\n return this.Terms[termID].show;\n });\n\n let textX = 0;\n let textY = this.y;\n let fontSize = this.spacing * 0.5;\n let numChars = (this.path.bounds.width / fontSize) * 2.4;\n\n if (this.isConjoined()) {\n // This leaf is conjoined\n textX = this.path.segments[1].point.x;\n } else {\n // Separate leaf\n textX = this.path.segments[0].point.x + 10;\n }\n if (this.leaf.attached_above.includes('Partial')) {\n // This leaf has a partial glue attachment\n // Place text to the right of attachment drawing\n textX = this.attachment.bounds.right + 5;\n } else if (this.leaf.attached_above.includes('Glued')) {\n // Other type of glueing exists\n textY -= this.spacing * 0.7;\n }\n let that = this;\n let clickListener = function (term) {\n return function (event) {\n that.openTermDialog(term);\n };\n };\n // Draw recto term text\n for (let termIndex = 0; termIndex < rectoTermsToShow.length; termIndex++) {\n const term = this.Terms[rectoTermsToShow[termIndex]];\n const termTitle = this.folio_number\n ? 'â–¼ ' + this.folio_number + ' : ' + term.title.substr(0, numChars)\n : 'â–¼ R : ' + term.title.substr(0, numChars);\n let textTerm = new paper.PointText({\n content: termTitle,\n point: [\n textX,\n textY - termIndex * (this.spacing * 0.7) - this.spacing * 0.3,\n ],\n fillColor: this.strokeColor,\n fontSize: fontSize,\n });\n textTerm.onClick = !this.viewingMode && clickListener(term);\n this.textTerms.addChild(textTerm);\n }\n // Draw leaf term text\n for (let termIndex = 0; termIndex < leafTermsToShow.length; termIndex++) {\n const term = this.Terms[leafTermsToShow[termIndex]];\n\n let textTerm = new paper.PointText({\n content: 'â–¼ L' + this.order + ' : ' + term.title.substr(0, numChars),\n point: [\n textX,\n textY -\n rectoTermsToShow.length * (this.spacing * 0.7) -\n termIndex * (this.spacing * 0.7) -\n this.spacing * 0.3,\n ],\n fillColor: this.strokeColor,\n fontSize: fontSize,\n });\n textTerm.onClick = !this.viewingMode && clickListener(term);\n this.textTerms.addChild(textTerm);\n }\n // Draw verso term text\n for (let termIndex = 0; termIndex < versoTermsToShow.length; termIndex++) {\n const term = this.Terms[versoTermsToShow[termIndex]];\n const termTitle = this.folio_number\n ? 'â–² ' + this.folio_number + ' : ' + term.title.substr(0, numChars)\n : 'â–² V : ' + term.title.substr(0, numChars);\n let textTerm = new paper.PointText({\n content: termTitle,\n point: [\n textX,\n this.y + termIndex * (this.spacing * 0.7) + this.spacing * 0.8,\n ],\n fillColor: this.strokeColor,\n fontSize: fontSize,\n });\n textTerm.onClick = !this.viewingMode && clickListener(term);\n this.textTerms.addChild(textTerm);\n }\n this.textTerms.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n this.textTerms.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n return this;\n },\n setMouseEventHandlers: function () {\n // Set mouse event handlers\n let that = this;\n this.path.onClick = function (event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.textLeafOrder.onClick = function (event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.textRecto.onClick = function (event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.textVerso.onClick = function (event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.path.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n this.path.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n this.textLeafOrder.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n this.textLeafOrder.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n this.textRecto.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n this.textRecto.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n this.textVerso.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n this.textVerso.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n },\n removeMouseEventHandlers: function () {\n // Set mouse event handlers\n this.path.onClick = function (event) {};\n this.textLeafOrder.onClick = function (event) {};\n this.textRecto.onClick = function (event) {};\n this.textVerso.onClick = function (event) {};\n this.path.onMouseEnter = function (event) {};\n this.path.onMouseLeave = function (event) {};\n this.textLeafOrder.onMouseEnter = function (event) {};\n this.textLeafOrder.onMouseLeave = function (event) {};\n this.textRecto.onMouseEnter = function (event) {};\n this.textRecto.onMouseLeave = function (event) {};\n this.textVerso.onMouseEnter = function (event) {};\n this.textVerso.onMouseLeave = function (event) {};\n },\n createAttachments: function () {\n // determine what attachment is drawn based on method indicated\n if (this.order > 1) {\n if (this.leaf.attached_above !== 'None') {\n this.createAttachment();\n }\n }\n },\n createAttachment: function () {\n let x = this.path.segments[0].point.x;\n if (this.isConjoined() && this.conjoined_to < this.order) {\n if (this.conjoined_to + 1 === this.order) {\n x += this.strokeWidth;\n } else {\n x = this.prevPaperLeaf().path.segments[0].point.x;\n }\n }\n if (this.leaf.attached_above.includes('Sewn')) {\n let glueLineCount = 2;\n // Draw tip glue\n for (let i = 0; i < glueLineCount; i++) {\n let glueLine = new paper.Path();\n glueLine.add(new paper.Point(x + 10, this.y - this.spacing));\n glueLine.add(new paper.Point(x + 10, this.y - this.spacing * 0.1));\n glueLine.strokeColor = '#707070';\n glueLine.strokeWidth = 2;\n this.attachment.addChild(glueLine);\n x += 5;\n }\n } else if (this.leaf.attached_above.includes('Stitched')) {\n console.log(this)\n // Complete stitch\n let glueLineCount = 1;\n for (let i = 0; i < glueLineCount; i++) {\n let glueLine = new paper.Path();\n glueLine.add(new paper.Point(x + 10, this.y - this.spacing));\n glueLine.add(new paper.Point(x + 10, this.y - (this.spacing * 0.1)));\n glueLine.strokeColor = '#707070';\n glueLine.strokeWidth = 2;\n this.attachment.addChild(glueLine);\n x += 5;\n }\n } else if (this.leaf.attached_above.includes('Tipped')) {\n let glueLineCount = 4;\n // Draw tip glue\n for (let i = 0; i < glueLineCount; i++) {\n let glueLine = new paper.Path();\n glueLine.add(new paper.Point(x, this.y - this.spacing * 0.3));\n glueLine.add(new paper.Point(x - 10, this.y - this.spacing * 0.7));\n glueLine.strokeColor = '#707070';\n glueLine.strokeWidth = 2;\n this.attachment.addChild(glueLine);\n x += 5;\n }\n } else if (this.leaf.attached_above.includes('Drummed')) {\n let glueLineCount = 15;\n // Draw left drum glue\n for (let i = 0; i < glueLineCount; i++) {\n let glueLine = new paper.Path();\n glueLine.add(new paper.Point(x, this.y - this.spacing * 0.3));\n glueLine.add(new paper.Point(x - 10, this.y - this.spacing * 0.7));\n glueLine.strokeColor = '#707070';\n glueLine.strokeWidth = 2;\n this.attachment.addChild(glueLine);\n x += 5;\n }\n if (\n this.leaf.stub === 'No' &&\n this.prevPaperLeaf().leaf.stub === 'No'\n ) {\n // Draw right drum glue if above or below are not stubs\n x = this.path.segments[this.path.segments.length - 1].point.x;\n for (let i = 0; i < glueLineCount; i++) {\n let glueLine = new paper.Path();\n glueLine.add(new paper.Point(x - 10, this.y - this.spacing * 0.3));\n glueLine.add(new paper.Point(x, this.y - this.spacing * 0.7));\n glueLine.strokeColor = '#707070';\n glueLine.strokeWidth = 2;\n this.attachment.addChild(glueLine);\n x -= 5;\n }\n }\n } else if (this.leaf.attached_above.includes('Pasted')) {\n // Complete glue\n if (\n this.leaf.stub !== 'No' ||\n this.prevPaperLeaf().leaf.stub !== 'No'\n ) {\n let glueLineCount = 15;\n for (let i = 0; i < glueLineCount; i++) {\n let glueLine = new paper.Path();\n glueLine.add(new paper.Point(x + 10, this.y - this.spacing * 0.3));\n glueLine.add(new paper.Point(x, this.y - this.spacing * 0.7));\n glueLine.strokeColor = '#707070';\n glueLine.strokeWidth = 2;\n this.attachment.addChild(glueLine);\n x += 5;\n }\n } else {\n while (\n x <=\n this.path.segments[this.path.segments.length - 1].point.x - 10\n ) {\n let glueLine = new paper.Path();\n glueLine.add(new paper.Point(x + 10, this.y - this.spacing * 0.3));\n glueLine.add(new paper.Point(x, this.y - this.spacing * 0.7));\n glueLine.strokeColor = '#707070';\n glueLine.strokeWidth = 2;\n this.attachment.addChild(glueLine);\n x += 5;\n }\n }\n }\n },\n createOtherAttachment: function () {\n let x = this.path.segments[0].point.x;\n if (this.isConjoined() && this.conjoined_to < this.order) {\n if (this.conjoined_to + 1 === this.order) {\n x += this.strokeWidth;\n } else {\n x = this.prevPaperLeaf().path.segments[0].point.x;\n }\n }\n for (let i = 0; i < 6; i++) {\n let attachLine = new paper.Path();\n attachLine.add(new paper.Point(x, this.y - 10));\n attachLine.add(new paper.Point(x, this.y - 20));\n attachLine.strokeColor = '#707070';\n attachLine.strokeWidth = 2;\n this.attachment.addChild(attachLine);\n x += 5;\n }\n },\n isConjoined: function () {\n return this.conjoined_to > 0;\n },\n conjoinedLeaf: function () {\n return this.manager.getLeaf(this.conjoined_to);\n },\n y_conjoin_center: function (conjoin_order) {\n var y1 = this.path.segments[1].point.y;\n var y2 = this.manager.getLeaf(conjoin_order).getY();\n return y1 + (y2 - y1) / 2.0;\n },\n y_nonconjoin_center: function () {\n var y = this.y;\n var y_center = this.y_centerQuire();\n if (y === y_center) {\n return y_center;\n } else if (y < y_center) {\n var val = this.y_nextPaperLeaf() - this.spacing * 0.3;\n return val;\n } else {\n val = this.y_prevLeaf() - this.spacing * 0.3;\n return val;\n }\n },\n prevPaperLeaf: function () {\n // Previous leaf better exist or else!\n return this.manager.getLeaf(this.order - 1);\n },\n y_prevLeaf: function () {\n if (this.order - 1 < 0) {\n return 0;\n } else {\n return this.manager.getLeaf(this.order).path.segments[1].point.y;\n }\n },\n y_nextPaperLeaf: function () {\n if (this.order + 1 >= this.manager.numLeaves()) {\n return 0;\n } else {\n return this.manager.getLeaf(this.order + 1).y;\n }\n },\n curveMe: function () {\n var path_height = Math.abs(\n this.path.segments[0].point.y - this.path.segments[1].point.y\n );\n var midpoint = this.path.segments[1].point;\n if (this.isConjoined()) {\n var numLeavesInside = Math.abs(this.conjoined_to - this.order);\n // Remove the middle point and insert a new one with handles\n this.path.removeSegment(1);\n // // Calculate new point's location and radius\n var new_x = midpoint.x + 20;\n var radius = new_x - this.path.segments[0].point.x;\n var s1 = new paper.Segment(\n new paper.Point(new_x, midpoint.y),\n new paper.Point(-radius, 0),\n null\n );\n this.path.insert(1, s1);\n\n if (numLeavesInside > 5) {\n // Modify first point's handle so that the curve isn't too curvy\n var direction =\n this.path.segments[0].point.y > this.path.segments[1].point.y\n ? -1\n : 1;\n var oldPoint = this.path.segments[0].point;\n this.path.removeSegment(0);\n var s0 = new paper.Segment(\n new paper.Point(oldPoint.x, oldPoint.y),\n null,\n new paper.Point(0, direction * path_height)\n );\n this.path.insert(0, s0);\n }\n }\n },\n setIndent: function () {\n this.indent = this.leaf.nestLevel;\n if (this.isConjoined() && this.conjoinedLeaf().indent != null) {\n // Leaf is conjoined and conjoiner has indent, so copy that conjoiner's indent\n this.indent = this.conjoinedLeaf().indent;\n } else if (this.isBelowAConjoined()) {\n this.indent = this.prevPaperLeaf().indent + 1;\n } else if (\n this.order > 1 &&\n this.parentOrder === this.prevPaperLeaf().parentOrder\n ) {\n // Leaf is a sibling of previous leaf, so copy sibling's indent\n this.indent = this.prevPaperLeaf().indent;\n } else if (this.order > 1 && this.prevPaperLeaf().parentID !== this.leaf.parentID) {\n this.indent = this.prevPaperLeaf().indent\n }\n }\n ,\n isBelowAConjoined: function () {\n return (\n this.order > 1 &&\n this.prevPaperLeaf().isConjoined() &&\n this.prevPaperLeaf().conjoined_to > this.order\n );\n },\n y_centerQuire: function () {\n var last_leaf = this.manager.getLastLeaf().getY();\n return (last_leaf + this.spacing) / 2.0;\n },\n getY: function () {\n return this.y;\n },\n activate: function () {\n this.path.strokeColor = this.strokeColorActive;\n this.highlight.opacity = 0.35;\n this.highlight.strokeWidth = this.path.strokeWidth * 2;\n this.highlight.strokeColor = '#ffffff';\n },\n deactivate: function () {\n this.highlight.opacity = 0;\n this.highlight.strokeWidth = this.path.strokeWidth;\n this.highlight.strokeColor = this.strokeColorActive;\n\n if (this.leaf.type === 'Added') {\n this.path.strokeColor = this.strokeColorAdded;\n } else if (this.leaf.type === 'Endleaf') {\n this.path.strokeColor = '#727272';\n } else {\n this.path.strokeColor = this.strokeColor;\n }\n },\n setVisibility: function (visibleAttributes) {\n this.visibleAttributes = visibleAttributes;\n this.showAttributes();\n },\n showAttributes: function () {\n const rectoValues = [];\n const versoValues = [];\n if (this.visibleAttributes.side) {\n if (this.visibleAttributes.side.page_number) {\n if (this.recto.page_number) rectoValues.push(this.recto.page_number);\n if (this.verso.page_number) versoValues.push(this.verso.page_number);\n }\n if (this.visibleAttributes.side.texture) {\n rectoValues.push(this.recto.texture);\n versoValues.push(this.verso.texture);\n }\n }\n if (this.visibleAttributes.leaf) {\n if (this.visibleAttributes.leaf.folio_number) {\n let notationStyles = this.notationStyle.split('-');\n if (this.leaf.folio_number) {\n rectoValues.push(this.leaf.folio_number + notationStyles[0]);\n versoValues.push(this.leaf.folio_number + notationStyles[1]);\n }\n }\n }\n let rectoContent = '';\n let versoContent = '';\n for (let i = 0; i < rectoValues.length; i++) {\n rectoContent = rectoContent + rectoValues[i] + ' ';\n }\n for (let i = 0; i < versoValues.length; i++) {\n versoContent = versoContent + versoValues[i] + ' ';\n }\n\n const reducer = (acc, key) => {\n if (this.visibleAttributes.side[key]) return acc + 1;\n if (this.visibleAttributes.leaf[key]) return acc + 1;\n return acc;\n };\n const visibleAttributeCount = this.visibleAttributes.side\n ? Object.keys(this.visibleAttributes.side).reduce(reducer, 0) +\n Object.keys(this.visibleAttributes.leaf).reduce(reducer, 0)\n : 0;\n\n if (visibleAttributeCount === 3) {\n if (this.leaf.stub === 'No') {\n // Reduce leaf width so we can fit attribute text\n this.path.segments[this.path.segments.length - 1].point.x =\n this.width - this.spacing * 3;\n this.highlight.segments[this.highlight.segments.length - 1].point.x =\n this.width - this.spacing * 2.8;\n this.filterHighlight.segments[\n this.filterHighlight.segments.length - 1\n ].point.x = this.width - this.spacing * 2.8;\n }\n this.textLeafOrder.set({\n point: [this.width - this.spacing * 2.8, this.textLeafOrder.point.y],\n });\n this.textRecto.set({\n point: [\n this.textLeafOrder.bounds.right + this.spacing * 0.4,\n this.textRecto.point.y,\n ],\n content: rectoContent,\n });\n this.textVerso.set({\n point: [\n this.textLeafOrder.bounds.right + this.spacing * 0.4,\n this.textVerso.point.y,\n ],\n content: versoContent,\n });\n } else if (visibleAttributeCount === 2) {\n if (this.leaf.stub === 'No') {\n // Reduce leaf width so we can fit attribute text\n this.path.segments[this.path.segments.length - 1].point.x =\n this.width - this.spacing * 2;\n this.highlight.segments[this.highlight.segments.length - 1].point.x =\n this.width - this.spacing * 1.8;\n this.filterHighlight.segments[\n this.filterHighlight.segments.length - 1\n ].point.x = this.width - this.spacing * 1.8;\n }\n this.textLeafOrder.set({\n point: [this.width - this.spacing * 1.8, this.textLeafOrder.point.y],\n });\n this.textRecto.set({\n point: [\n this.textLeafOrder.bounds.right + this.spacing * 0.2,\n this.textRecto.point.y,\n ],\n content: rectoContent,\n });\n this.textVerso.set({\n point: [\n this.textLeafOrder.bounds.right + this.spacing * 0.2,\n this.textVerso.point.y,\n ],\n content: versoContent,\n });\n } else if (visibleAttributeCount === 1) {\n if (this.leaf.stub === 'No') {\n // Reduce leaf width so we can fit folio number text\n this.path.segments[this.path.segments.length - 1].point.x =\n this.width - this.spacing;\n this.highlight.segments[this.highlight.segments.length - 1].point.x =\n this.width - this.spacing * 0.8;\n this.filterHighlight.segments[\n this.filterHighlight.segments.length - 1\n ].point.x = this.width - this.spacing * 0.8;\n }\n this.textLeafOrder.set({\n point: [this.width - this.spacing * 0.8, this.textLeafOrder.point.y],\n });\n this.textRecto.set({\n point: [\n this.textLeafOrder.bounds.right + this.spacing * 0.2,\n this.textRecto.point.y,\n ],\n content: rectoContent,\n });\n this.textVerso.set({\n point: [\n this.textLeafOrder.bounds.right + this.spacing * 0.2,\n this.textVerso.point.y,\n ],\n content: versoContent,\n });\n } else {\n // Reset leaf\n if (this.leaf.stub === 'No') {\n this.path.segments[this.path.segments.length - 1].point.x = this.width;\n this.highlight.segments[this.highlight.segments.length - 1].point.x =\n this.width + 5;\n this.filterHighlight.segments[\n this.filterHighlight.segments.length - 1\n ].point.x = this.width + 5;\n }\n this.textLeafOrder.set({\n point: [this.width + 10, this.textLeafOrder.point.y],\n });\n }\n },\n};\n// Constructor for leaf\nfunction PaperLeaf(args) {\n this.manager = args.manager;\n this.Terms = args.Terms;\n this.leafIDs = args.leafIDs;\n this.leaf = args.leaf;\n this.recto = args.recto;\n this.verso = args.verso;\n this.order = args.leafIDs.indexOf(args.leaf.id) + 1;\n this.parentOrder = args.groupIDs.indexOf(this.leaf.parentID) + 1;\n this.conjoined_to =\n this.leaf.conjoined_to === null\n ? 'None'\n : this.leafIDs.indexOf(this.leaf.conjoined_to) + 1;\n this.indent = null;\n this.origin = args.origin;\n this.viewingMode = args.viewingMode;\n this.width = this.viewingMode ? args.width * 0.88 : args.width * 0.92;\n this.spacing = args.spacing;\n this.y = args.y;\n this.strokeWidth = args.strokeWidth;\n this.strokeColor = args.strokeColor;\n this.strokeColorActive = args.strokeColorActive;\n this.strokeColorGroupActive = args.strokeColorGroupActive;\n this.strokeColorFilter = args.strokeColorFilter;\n this.strokeColorAdded = args.strokeColorAdded;\n this.highlight = new paper.Path();\n this.filterHighlight = new paper.Path();\n this.path = new paper.Path();\n this.isActive = args.isActive;\n this.handleObjectClick = args.handleObjectClick;\n this.multiplier = args.multiplier;\n this.attachment = new paper.Group();\n this.textTerms = new paper.Group();\n this.openTermDialog = args.openTermDialog;\n this.notationStyle = args.notationStyle;\n\n this.textLeafOrder = new paper.PointText({\n point: [this.width, this.y + 5],\n content: 'L' + this.order,\n fillColor: this.strokeColor,\n fontSize: this.spacing * 0.48,\n });\n this.textRecto = new paper.PointText({\n point: [this.width + this.spacing, this.y - 3],\n fillColor: this.strokeColor,\n fontSize: this.spacing * 0.37,\n });\n this.textVerso = new paper.PointText({\n point: [this.width + this.spacing, this.y + this.spacing * 0.37 - 3],\n fillColor: this.strokeColor,\n fontSize: this.spacing * 0.37,\n });\n\n this.visibleAttributes = args.visibleAttributes;\n // Set path properties\n if (this.leaf.type === 'Added') {\n this.path.strokeColor = args.strokeColorAdded;\n } else if (this.leaf.type === 'Endleaf') {\n this.path.strokeColor = '#919191';\n } else {\n this.path.strokeColor = args.strokeColor;\n }\n if (this.leaf.type === 'Missing') {\n // If leaf is missing, make stroke dashed\n this.path.dashArray = [20, 10];\n }\n if (this.leaf.type === 'Replaced') {\n this.path.strokeColor = '#9d6464';\n }\n if (this.isActive) {\n this.path.strokeColor = args.strokeColorActive;\n }\n this.path.strokeWidth = this.strokeWidth;\n if (this.leaf.material === 'Parchment') {\n this.path.strokeWidth = this.path.strokeWidth * 1.2;\n } else if (this.leaf.material === 'Paper') {\n this.path.strokeWidth = this.path.strokeWidth * 0.8;\n }\n}\n\nexport default PaperLeaf;\n","import paper from 'paper';\n\nPaperGroup.prototype = {\n constructor: PaperGroup,\n draw: function () {\n // Create rectangle shapes\n let rectangle = new paper.Rectangle(\n new paper.Point(this.x + 10, this.y),\n new paper.Size(this.width - this.x - 20, this.groupHeight)\n );\n if (this.viewingMode) {\n rectangle = new paper.Rectangle(\n new paper.Point(this.x + 10, this.y),\n new paper.Size(this.width - this.x, this.groupHeight)\n );\n }\n let highlightRectangle = rectangle.clone();\n highlightRectangle.set(\n new paper.Point(this.x, this.y - 10),\n new paper.Size(this.width - this.x, this.groupHeight + 20)\n );\n\n // Create path from rectangle\n this.path = new paper.Path.Rectangle(rectangle);\n if (this.isActive) {\n this.path.fillColor = this.groupColorActive;\n } else {\n this.path.fillColor = this.groupColor;\n }\n if (this.group.nestLevel % 2 === 0) {\n this.path.fillColor.brightness -= 0.05;\n }\n this.path.name = 'group ' + this.groupOrder;\n\n // Create highlight path from rectangle\n this.highlight = new paper.Path.Rectangle(highlightRectangle);\n this.highlight.fillColor = new paper.Color(\n 112 / 255.0,\n 229 / 255.0,\n 220 / 255.0,\n 1\n );\n this.highlight.opacity = 0;\n this.highlight.name = 'group ' + this.groupOrder + ' highlight';\n this.highlight.insertBelow(this.path);\n\n this.filterHighlight = new paper.Path.Rectangle(highlightRectangle);\n this.filterHighlight.fillColor = this.filterColor;\n this.filterHighlight.opacity = 0;\n this.filterHighlight.insertBelow(this.path);\n\n // Set highlight path to be at the back\n paper.project.activeLayer.insertChild(0, this.highlight);\n paper.project.activeLayer.insertChild(0, this.filterHighlight);\n },\n setMouseEventHandlers: function () {\n // Set mouse event handlers\n let that = this;\n this.path.onClick = function (event) {\n that.handleObjectClick(that.group, event);\n };\n this.path.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n this.path.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n },\n removeMouseEventHandlers: function () {\n this.path.onClick = function (event) {};\n this.path.onMouseEnter = function (event) {};\n this.path.onMouseLeave = function (event) {};\n },\n activate: function () {\n this.path.fillColor = this.groupColorActive;\n this.isActive = true;\n this.highlight.opacity = 0.75;\n this.highlight.fillColor = '#ffffff';\n },\n deactivate: function () {\n this.path.fillColor = this.groupColor;\n if (this.group.nestLevel % 2 === 0) {\n this.path.fillColor.brightness -= 0.05;\n }\n this.isActive = false;\n this.highlight.opacity = 0;\n this.highlight.fillColor = new paper.Color(\n 112 / 255.0,\n 229 / 255.0,\n 220 / 255.0,\n 1\n );\n },\n // code here must mirror group_notation function in group.rb:23\n groupNotation: function(group) {\n // get all groupIDs as base nest level\n let outerGroupIDs = []\n this.groupIDs.forEach(gID => {\n if (this.Groups[gID].nestLevel === 1) {\n outerGroupIDs.push(gID)\n }\n })\n let notation = '';\n if (group.nestLevel === 1){\n // get index of current group within the context of all outer groups\n let groupOrder = outerGroupIDs.indexOf(group.id) + 1;\n notation = `${groupOrder}`;\n } else {\n // get parent of current group\n let parentGroup = this.Groups[group.parentID];\n // get children of parent group\n let parentGroupChildren = parentGroup.memberIDs.filter(g => g[0] === 'G');\n let subquireNotation = parentGroupChildren.indexOf(group.id) + 1;\n notation = `${this.groupNotation(parentGroup)}.${subquireNotation}`;\n }\n return notation;\n },\n setVisibility: function (visibleAttributes) {\n this.visibleAttributes = visibleAttributes;\n let groupText = this.group.type + ' ' + this.groupNotation(this.group);\n if (this.visibleAttributes && this.visibleAttributes.title)\n groupText = groupText + ': ' + this.group.title;\n this.text.set({\n content: groupText,\n });\n },\n};\n// Constructor for group\nfunction PaperGroup(args) {\n this.manager = args.manager;\n this.group = args.group;\n this.Groups = args.Groups;\n this.groupIDs = args.groupIDs;\n this.groupOrder = args.groupIDs.indexOf(args.group.id) + 1;\n this.notation = this.groupNotation(this.group);\n this.y = args.y;\n this.x = args.x;\n this.width = args.width;\n this.groupHeight = args.groupHeight;\n this.isActive = args.isActive;\n this.highlight = new paper.Path();\n this.filterHighlight = new paper.Path();\n this.path = new paper.Path();\n this.groupColor = args.groupColor;\n this.groupColorActive = args.groupColorActive;\n this.textColor = args.textColor;\n this.filterColor = args.filterColor;\n this.handleObjectClick = args.handleObjectClick;\n this.visibleAttributes = {};\n this.viewingMode = args.viewingMode;\n this.text = new paper.PointText({\n point: [this.x + args.spacing * 0.6, this.y + args.spacing * 0.6],\n fillColor: this.textColor,\n fontSize: args.spacing * 0.48,\n });\n this.setVisibility(args.visibleAttributes);\n}\nexport default PaperGroup;\n","export function getMemberOrder(member, Groups, groupIDs) {\n const parentID = member.parentID\n if (parentID){\n return Groups[parentID].memberIDs.indexOf(member.id)+1\n } else {\n // member is a root Group. Find member order from groupIDs\n return groupIDs.indexOf(member.id)+1\n }\n\n}\n","import paper from 'paper';\nimport PaperLeaf from './PaperLeaf.js';\nimport PaperGroup from './PaperGroup.js';\nimport { getMemberOrder } from '../../helpers/getMemberOrder';\n\nPaperManager.prototype = {\n constructor: PaperManager,\n createGroup: function (group) {\n let g = new PaperGroup({\n manager: this,\n group: group,\n Groups: this.Groups,\n groupIDs: this.groupIDs,\n y: this.groupYs[this.groupIDs.indexOf(group.id)],\n x: (this.paperLeaves.find(g => g.leaf.id === group.memberIDs[0])) ?\n (this.paperLeaves.find(g => g.leaf.id === group.memberIDs[0]).indent - 1) * this.spacing\n : (group.nestLevel - 1) * this.spacing,\n // x: (group.nestLevel - 1) * this.spacing,\n width: this.width,\n groupHeight: this.getGroupHeight(group),\n isActive: this.activeGroups.includes(group.id),\n groupColor: this.groupColor,\n groupColorActive: this.groupColorActive,\n filterColor: this.strokeColorFilter,\n handleObjectClick: this.handleObjectClick,\n textColor: this.groupTextColor,\n visibleAttributes: this.visibleAttributes.group,\n viewingMode: this.viewingMode,\n spacing: this.spacing,\n });\n\n g.draw();\n g.setMouseEventHandlers();\n\n // Add this group to collections\n this.groupGroups.addChild(g.filterHighlight);\n this.groupGroups.addChild(g.highlight);\n this.groupGroups.addChild(g.path);\n this.groupGroups.addChild(g.text);\n this.paperGroups.push(g);\n\n // Add this group to list of items to flash if it's in the flashItems list\n if (this.flashItems.groups.includes(group.id)) {\n this.flashGroups.push(g);\n }\n },\n createLeaf: function (leaf) {\n let l = new PaperLeaf({\n manager: this,\n origin: this.origin,\n width: this.width,\n spacing: this.spacing,\n strokeWidth:\n this.strokeWidth *\n Math.min(1.0, this.multipliers[this.leafIDs.indexOf(leaf.id) + 1]),\n strokeColor: this.strokeColor,\n strokeColorActive: this.strokeColorActive,\n strokeColorGroupActive: this.strokeColorGroupActive,\n strokeColorAdded: this.strokeColorAdded,\n leaf: leaf,\n recto: this.Rectos[leaf.rectoID],\n verso: this.Versos[leaf.versoID],\n groupIDs: this.groupIDs,\n leafIDs: this.leafIDs,\n Groups: this.Groups,\n Terms: this.Terms,\n y: this.leafYs[this.leafIDs.indexOf(leaf.id)],\n isActive:\n this.activeLeafs.includes(leaf.id) ||\n this.activeRectos.includes(leaf.rectoID) ||\n this.activeVersos.includes(leaf.versoID),\n customSpacings: this.customSpacings,\n handleObjectClick: this.handleObjectClick,\n multiplier: this.multipliers[this.leafIDs.indexOf(leaf.id) + 1],\n strokeColorFilter: this.strokeColorFilter,\n visibleAttributes: this.visibleAttributes,\n viewingMode: this.viewingMode,\n openTermDialog: this.openTermDialog,\n notationStyle: this.notationStyle,\n });\n this.paperLeaves.push(l);\n this.groupLeaves.addChild(l.path);\n this.groupLeaves.addChild(l.textLeafOrder);\n this.groupLeaves.addChild(l.textRecto);\n this.groupLeaves.addChild(l.textVerso);\n this.groupLeaves.addChild(l.attachment);\n this.groupLeaves.addChild(l.textTerms);\n if (this.flashItems.leaves.includes(leaf.id)) {\n this.flashLeaves.push(l);\n }\n return l;\n },\n draw: function () {\n // Clear existing drawn elements\n this.leafYs = [];\n this.groupYs = [];\n this.paperLeaves = [];\n this.paperGroups = [];\n this.flashGroups = [];\n this.flashLeaves = [];\n this.groupLeaves.removeChildren();\n this.groupGroups.removeChildren();\n this.groupContainer.removeChildren();\n this.groupTacket.removeChildren();\n\n // Calculate y positions of groups and leaves\n let currentY = 0;\n let prevRootGroupID = null;\n for (let i in this.groupIDs) {\n const groupID = this.groupIDs[i];\n const group = this.Groups[groupID];\n if (group.nestLevel === 1) {\n if (i > 0 && prevRootGroupID) {\n const prevGroupsLastMember = this.getLastMember(prevRootGroupID);\n const nestLevel = prevGroupsLastMember\n ? prevGroupsLastMember.nestLevel + 1\n : 1;\n currentY = currentY + this.spacing * nestLevel;\n }\n this.groupYs.push(currentY);\n currentY = this.calculateYs(group.memberIDs, currentY, this.spacing);\n\n if (group.memberIDs.length === 0) {\n currentY = currentY + this.spacing;\n }\n prevRootGroupID = groupID;\n }\n }\n\n // Create all the leaves\n for (let leafID of this.leafIDs) {\n this.createLeaf(this.Leafs[leafID]);\n }\n // Draw all leaves and set mouse event handlers\n this.paperLeaves.forEach(leaf => {\n leaf.draw();\n leaf.setMouseEventHandlers();\n });\n\n let nestLevel = 1;\n while (true) {\n let groupsAtLevel = Object.values(this.Groups).filter(g => g.nestLevel === nestLevel);\n if (groupsAtLevel.length === 0) {\n break;\n }\n for (let key in groupsAtLevel) {\n const g = groupsAtLevel[key];\n this.createGroup(g);\n }\n nestLevel++;\n }\n\n // Show filter\n this.showFilter();\n\n // Draw other visualizations\n this.drawTackets();\n this.drawSewing();\n\n this.groupContainer.addChild(this.groupGroups);\n this.groupContainer.addChild(this.groupLeaves);\n this.groupContainer.addChild(this.groupTacket);\n this.groupContainer.addChild(this.groupTacketGuide);\n // Reposition the drawing\n this.groupContainer.position.y += 10;\n this.fitCanvas();\n },\n tacketTargetLeaves: function (groupID, targets) {\n const targetGroup = this.paperGroups.find(member => {\n return member.group.id === groupID;\n })\n targetGroup.group.memberIDs.forEach(memberID => {\n if (memberID.charAt(0) === 'L') {\n const leaf = this.getLeaf(\n this.leafIDs.indexOf(this.Leafs[memberID].id) + 1\n );\n if (\n leaf.isConjoined() &&\n (this.tacketLineDrag.getIntersections(leaf.path).length > 0 ||\n this.tacketLineDrag.getIntersections(leaf.conjoinedLeaf().path)\n .length > 0)\n ) {\n leaf.path.strokeColor = '#ffffff';\n leaf.conjoinedLeaf().path.strokeColor = '#ffffff';\n // Add leaf to list of targets to tacket\n targets.push(leaf);\n } else {\n leaf.deactivate();\n }\n } else if (memberID.charAt(0) === 'G') {\n this.tacketTargetLeaves(memberID, targets)\n }\n })\n },\n activateTacketTool: function (groupID, type = 'tacketed') {\n // Remove existing tacket\n this.groupTacket.removeChildren();\n this.groupTacketGuide.removeChildren();\n this.groupTacketGuideLine.removeChildren();\n\n this.tacketToolIsActive = true;\n if (this.tool) this.tool.remove();\n this.tool = new paper.Tool();\n this.tool.minDistance = 5;\n let targets = [];\n\n // Remove hover cursor effect on groups and leaves\n this.paperGroups.forEach(group => group.removeMouseEventHandlers());\n this.paperLeaves.forEach(leaf => leaf.removeMouseEventHandlers());\n document.body.style.cursor = 'crosshair';\n\n this.drawTacketGuide(groupID, type);\n\n this.tool.onMouseDown = event => {\n this.tacketLineDrag = new paper.Path();\n this.tacketLineDrag.strokeColor = this.strokeColorTacket;\n this.tacketLineDrag.strokeWidth = 5;\n this.tacketLineDrag.add(event.point);\n this.groupTacketGuide.addChild(this.tacketLineDrag);\n };\n this.tool.onMouseUp = event => {\n // Remove line from canvas\n this.groupTacketGuide.removeChildren();\n // Reset colour of leaves\n this.paperLeaves.forEach(leaf => {\n leaf.deactivate();\n });\n this.toggleVisualizationDrawing({ type: type, value: '' });\n if (targets.length > 0) {\n let targetLeaf1 = targets[0];\n let targetLeaf2 = targets[targets.length / 2];\n this.addVisualization(targetLeaf1.leaf.parentID, type, [\n targetLeaf1.leaf.id,\n targetLeaf2.leaf.id,\n ]);\n } else {\n // Redraw old visualization\n if (type === 'tacketed') {\n this.drawTackets();\n } else {\n this.drawSewing();\n }\n }\n };\n this.tool.onMouseDrag = event => {\n // Update line\n if (!this.tacketLineDrag.segments[1]) {\n this.tacketLineDrag.add(event.point);\n } else {\n this.tacketLineDrag.segments[1].point = event.point;\n }\n targets = [];\n this.tacketTargetLeaves(groupID, targets)\n };\n this.tool.activate();\n },\n drawTacketGuide: function (groupID, type) {\n const targetGroup = this.paperGroups.find(member => {\n return member.group.id === groupID;\n });\n const guideY = targetGroup.path.bounds.height / 2;\n const guideX = targetGroup.path.bounds.left;\n let guideLine = new paper.Path();\n guideLine.strokeColor = '#ffffff';\n guideLine.strokeWidth = 5;\n guideLine.dashArray = [10, 10];\n guideLine.add(\n new paper.Point(\n guideX,\n targetGroup.path.bounds.y + guideY + this.strokeWidth / 2\n )\n );\n guideLine.add(\n new paper.Point(\n guideX + targetGroup.path.bounds.width / 3,\n targetGroup.path.bounds.y + guideY + this.strokeWidth / 2\n )\n );\n let guideLineArrow = new paper.Path();\n guideLineArrow.strokeColor = '#ffffff';\n guideLineArrow.strokeWidth = 3;\n guideLineArrow.add(\n guideLine.segments[1].point.x - 10,\n guideLine.segments[1].point.y - 10\n );\n guideLineArrow.add(\n guideLine.segments[1].point.x,\n guideLine.segments[1].point.y\n );\n guideLineArrow.add(\n guideLine.segments[1].point.x - 10,\n guideLine.segments[1].point.y + 10\n );\n let guideLineX1 = new paper.Path();\n guideLineX1.strokeColor = '#ffffff';\n guideLineX1.strokeWidth = 3;\n guideLineX1.add(\n new paper.Point(guideX - 10, guideLine.segments[0].point.y - 10)\n );\n guideLineX1.add(\n new paper.Point(guideX + 10, guideLine.segments[0].point.y + 10)\n );\n let guideLineX2 = new paper.Path();\n guideLineX2.strokeColor = '#ffffff';\n guideLineX2.strokeWidth = 3;\n guideLineX2.add(\n new paper.Point(guideX - 10, guideLine.segments[0].point.y + 10)\n );\n guideLineX2.add(\n new paper.Point(guideX + 10, guideLine.segments[0].point.y - 10)\n );\n\n const drawType = type === 'tacketed' ? 'TACKET' : 'SEWING';\n let guideText = new paper.PointText({\n content: 'DRAW ' + drawType + ' LINE',\n point: [guideX + 20, targetGroup.path.bounds.y + guideY - 20],\n fillColor: '#000000',\n fontSize: 12,\n });\n let guideTextRectangle = new paper.Rectangle(\n new paper.Point(guideX + 15, targetGroup.path.bounds.y + guideY - 35),\n new paper.Size(guideText.bounds.width + 10, guideText.bounds.height + 5)\n );\n let guideTextBackground = new paper.Path.Rectangle(guideTextRectangle);\n guideTextBackground.fillColor = 'rgba(255,255,255,0.75)';\n this.groupTacketGuideLine.addChild(guideLine);\n this.groupTacketGuideLine.addChild(guideLineArrow);\n this.tacketToolOriginalPosition = this.groupTacketGuideLine.position.x;\n this.groupTacketGuide.addChild(this.groupTacketGuideLine);\n this.groupTacketGuide.addChild(guideTextBackground);\n this.groupTacketGuide.addChild(guideText);\n this.groupTacketGuide.addChild(guideLineX1);\n this.groupTacketGuide.addChild(guideLineX2);\n },\n deactivateTacketTool: function () {\n this.tacketToolIsActive = false;\n this.groupTacketGuide.removeChildren();\n if (this.tool) {\n this.tool.remove();\n }\n document.body.style.cursor = 'default';\n this.paperGroups.forEach(group => group.setMouseEventHandlers());\n this.paperLeaves.forEach(leaf => leaf.setMouseEventHandlers());\n },\n drawSewing: function () {\n this.paperGroups.forEach(group => {\n if (group.group.sewing !== null && group.group.sewing.length > 0) {\n const leafID1 = group.group.sewing[0];\n const leafID2 =\n group.group.sewing.length > 1 ? group.group.sewing[1] : undefined;\n\n if (leafID1 !== undefined && this.leafIDs.indexOf(leafID1) >= 0) {\n let startX, startY, endX, endY;\n let paperLeaf1, paperLeaf2;\n\n paperLeaf1 = this.getLeaf(this.leafIDs.indexOf(leafID1) + 1);\n if (leafID2 !== undefined) {\n paperLeaf2 = this.getLeaf(this.leafIDs.indexOf(leafID2) + 1);\n startX = paperLeaf1.path.segments[0].point.x - this.strokeWidth;\n startY = paperLeaf2.path.segments[0].point.y;\n endX = paperLeaf2.path.segments[0].point.x;\n } else {\n startX = 15;\n startY = paperLeaf1.path.segments[0].point.y;\n endX = paperLeaf1.path.segments[0].point.x;\n }\n if (\n group.group.tacketed !== null &&\n group.group.tacketed.length > 0\n ) {\n startY -= this.spacing * 0.15;\n }\n endY = startY;\n let sewingPath = new paper.Path();\n sewingPath.name = 'tacket1';\n sewingPath.strokeColor = this.strokeColorTacket;\n sewingPath.strokeWidth = 3;\n sewingPath.add(new paper.Point(startX, startY));\n sewingPath.add(new paper.Point(endX + this.strokeWidth, endY));\n const that = this;\n // Add listeners\n sewingPath.onClick = function (event) {\n that.handleObjectClick(group.group, event);\n };\n sewingPath.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n sewingPath.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n this.groupTacket.addChild(sewingPath);\n }\n }\n });\n },\n drawTackets: function () {\n this.paperGroups.forEach(group => {\n if (group.group.tacketed !== null && group.group.tacketed.length > 0) {\n const leafID1 = group.group.tacketed[0];\n const leafID2 = group.group.tacketed[1];\n if (leafID1 !== undefined && this.leafIDs.indexOf(leafID1) >= 0) {\n let startX, startY, endX, endY;\n let paperLeaf1, paperLeaf2;\n\n paperLeaf1 = this.getLeaf(this.leafIDs.indexOf(leafID1) + 1);\n if (leafID2 !== undefined) {\n paperLeaf2 = this.getLeaf(this.leafIDs.indexOf(leafID2) + 1);\n startX = paperLeaf1.path.segments[0].point.x - this.strokeWidth;\n startY = paperLeaf2.path.segments[0].point.y;\n endX = paperLeaf2.path.segments[0].point.x;\n } else {\n startX = 15;\n startY = paperLeaf1.path.segments[0].point.y;\n endX = paperLeaf1.path.segments[0].point.x;\n }\n if (\n group.group.tacketed !== null &&\n group.group.tacketed.length > 0\n ) {\n startY -= this.spacing * 0.2;\n }\n if (group.group.sewing !== null && group.group.sewing.length > 0) {\n startY += this.spacing * 0.25;\n }\n endY = startY;\n let tacketPath1 = new paper.Path();\n tacketPath1.name = 'tacket1';\n tacketPath1.strokeColor = this.strokeColorTacket;\n tacketPath1.strokeWidth = 3;\n tacketPath1.add(new paper.Point(startX, startY - 2));\n tacketPath1.add(new paper.Point(endX + this.strokeWidth, endY - 2));\n tacketPath1.add(\n new paper.Point(\n tacketPath1.segments[1].point.x + 5,\n tacketPath1.segments[1].point.y - 3\n )\n );\n let tacketPath2 = new paper.Path();\n tacketPath2.name = 'tacket2';\n tacketPath2.strokeColor = this.strokeColorTacket;\n tacketPath2.strokeWidth = 3;\n tacketPath2.add(new paper.Point(startX, startY + 2));\n tacketPath2.add(new paper.Point(endX + this.strokeWidth, endY + 2));\n tacketPath2.add(\n new paper.Point(\n tacketPath2.segments[1].point.x + 5,\n tacketPath2.segments[1].point.y + 3\n )\n );\n const that = this;\n // Add listeners\n tacketPath1.onClick = function (event) {\n that.handleObjectClick(group.group, event);\n };\n tacketPath2.onClick = function (event) {\n that.handleObjectClick(group.group, event);\n };\n tacketPath1.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n tacketPath1.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n tacketPath2.onMouseEnter = function (event) {\n document.body.style.cursor = 'pointer';\n };\n tacketPath2.onMouseLeave = function (event) {\n document.body.style.cursor = 'default';\n };\n this.groupTacket.addChild(tacketPath1);\n this.groupTacket.addChild(tacketPath2);\n }\n }\n });\n },\n getYOfFirstMember: function (groupID) {\n let group = this.Groups[groupID];\n if (group.memberIDs.length === 0) {\n let y = this.groupYs[this.groupIDs.indexOf(group.id)];\n return y;\n }\n let firstMemberID = group.memberIDs[0];\n let firstMember = this[firstMemberID.split('_')[0] + 's'][firstMemberID];\n if (firstMemberID.memberType === 'Group') {\n return this.getYOfFirstMember(firstMemberID);\n } else {\n let firstLeafY = this.leafYs[this.leafIDs.indexOf(firstMember.id)];\n return firstLeafY;\n }\n },\n getYOfLastMember: function (groupID) {\n const group = this.Groups[groupID];\n const lastMember = this.getLastMember(groupID);\n if (lastMember && lastMember.memberType === 'Group') {\n let y = this.groupYs[this.groupIDs.indexOf(lastMember.id)];\n return y + (lastMember.nestLevel - group.nestLevel) * this.spacing;\n } else if (lastMember && lastMember.memberType === 'Leaf') {\n let lastLeafY =\n this.leafYs[this.leafIDs.indexOf(lastMember.id)] +\n this.strokeWidth +\n this.spacing / 2.0;\n return (\n lastLeafY + (lastMember.nestLevel - group.nestLevel - 1) * this.spacing\n );\n } else {\n return 0;\n }\n },\n getLastMember: function (groupID) {\n let lastMemberIDs = this.Groups[groupID].memberIDs;\n if (lastMemberIDs.length === 0) return null;\n let lastMemberID = lastMemberIDs[lastMemberIDs.length - 1];\n if (lastMemberID.charAt(0) === 'L') {\n return this.Leafs[lastMemberID];\n } else {\n let lastMember = this.Groups[lastMemberID];\n // Check if this group has members\n let innerLastMember = this.getLastMember(lastMemberID);\n if (innerLastMember) lastMember = innerLastMember;\n return lastMember;\n }\n },\n getGroupHeight: function (group) {\n if (group.memberIDs.length > 0) {\n let height =\n this.getYOfLastMember(group.id) -\n this.groupYs[this.groupIDs.indexOf(group.id)];\n return height + this.spacing;\n } else {\n return this.spacing;\n }\n },\n numLeaves: function () {\n return this.paperLeaves.length;\n },\n getLeaf: function (leaf_order) {\n return this.paperLeaves[leaf_order - 1];\n },\n getGroup: function (group_order) {\n return this.paperGroups[group_order - 1]\n },\n getLastLeaf: function () {\n return this.paperLeaves[this.numLeaves() - 1];\n },\n calculateYs: function (members, currentY, spacing) {\n if (members.length < 1) {\n return currentY;\n }\n let multiplier = 1;\n if (members.length > 70) {\n multiplier = 0.5;\n } else if (members.length > 45) {\n multiplier = 0.6;\n } else if (members.length > 35 || this.viewingMode) {\n multiplier = 0.8;\n }\n members.forEach((memberID, i) => {\n let memberObject = this[memberID.split('_')[0] + 's'][memberID];\n let termsToShowAbove = memberObject.terms.filter(termID => {\n return this.Terms[termID].show;\n }).length;\n let termsToShowBelow = 0;\n let glueSpacing = 0;\n if (memberObject.memberType === 'Leaf') {\n // Find if it has side terms\n termsToShowAbove += this.Rectos[memberObject.rectoID].terms.filter(\n termID => {\n return this.Terms[termID].show;\n }\n ).length;\n termsToShowBelow += this.Versos[memberObject.versoID].terms.filter(\n termID => {\n return this.Terms[termID].show;\n }\n ).length;\n // Find if leaf has glue that's not a partial glue\n glueSpacing =\n termsToShowAbove > 0 &&\n memberObject.attached_above.includes('Glued') &&\n !memberObject.attached_above.includes('Partial')\n ? 1\n : 0;\n }\n\n if (\n memberObject.memberType === 'Leaf' &&\n getMemberOrder(memberObject, this.Groups, this.groupIDs) === 1 &&\n termsToShowAbove > 0\n ) {\n // First leaf in the group with a term\n this.multipliers[\n this.leafIDs.indexOf(memberObject.id) + 1\n ] = multiplier;\n currentY = currentY + spacing * (termsToShowAbove + 1);\n this.leafYs.push(currentY);\n currentY = currentY + spacing * termsToShowBelow * 0.8;\n if (i === members.length - 1) {\n // Last member of group\n currentY = currentY + memberObject.nestLevel * spacing;\n }\n } else if (\n memberObject.memberType === 'Leaf' &&\n this.leafIDs.indexOf(memberObject.id) + 1 > 0\n ) {\n this.multipliers[\n this.leafIDs.indexOf(memberObject.id) + 1\n ] = multiplier;\n currentY =\n currentY +\n spacing * Math.max(1, termsToShowAbove) +\n spacing * glueSpacing;\n if (\n i > 0 &&\n members[i - 1].includes('Group') &&\n this.Groups[members[i - 1]].memberIDs.length\n ) {\n // Previous sibling is a group with children\n // Find difference of nest level between current leaf and previous group's last member\n const previousMember = this.getLastMember(members[i - 1]);\n currentY =\n currentY +\n (previousMember.nestLevel - memberObject.nestLevel) * spacing;\n }\n this.leafYs.push(currentY);\n currentY = currentY + spacing * termsToShowBelow * 0.8;\n } else if (memberObject.memberType === 'Group') {\n currentY = currentY + spacing;\n if (\n i > 0 &&\n members[i - 1].includes('Group') &&\n this.Groups[members[i - 1]].memberIDs.length > 0\n ) {\n // Previous sibling is a group with children\n const previousMember = this.getLastMember(members[i - 1]);\n currentY =\n currentY +\n (previousMember.nestLevel - memberObject.nestLevel + 1) * spacing;\n } else if (\n i > 0 &&\n members[i - 1].includes('Group') &&\n this.Groups[members[i - 1]].memberIDs.length === 0\n ) {\n // Previous sibling is a group without children\n currentY = currentY + spacing;\n }\n this.groupYs.push(currentY);\n\n // Recursify!!!\n currentY = this.calculateYs(memberObject.memberIDs, currentY, spacing);\n }\n });\n return currentY;\n },\n fitCanvas: function () {\n // Resize canvas so that nothing is cut off\n this.canvas.height = this.groupGroups.bounds.bottom + 10;\n },\n setWidth: function (value) {\n this.width = value;\n },\n setProject: function (project) {\n this.groupIDs = project.groupIDs;\n this.leafIDs = project.leafIDs;\n this.Groups = project.Groups;\n this.Leafs = project.Leafs;\n this.Rectos = project.Rectos;\n this.Versos = project.Versos;\n this.Terms = project.Terms;\n },\n setActiveGroups: function (value) {\n this.activeGroups = value;\n if (this.paperGroups.length > 0) {\n this.paperGroups.forEach(group => {\n group.deactivate();\n });\n this.paperGroups.forEach(paperGroup => {\n if (this.activeGroups.includes(paperGroup.group.id)) {\n paperGroup.activate();\n }\n });\n }\n },\n setActiveLeafs: function (value) {\n this.activeLeafs = value;\n if (this.paperLeaves.length > 0) {\n this.paperLeaves.forEach(leaf => {\n leaf.deactivate();\n });\n this.paperLeaves.forEach(paperLeaf => {\n if (this.activeLeafs.includes(paperLeaf.leaf.id)) {\n paperLeaf.activate();\n }\n });\n }\n },\n setActiveRectos: function (value) {\n this.activeRectos = value;\n if (this.paperLeaves.length > 0) {\n this.paperLeaves.forEach(leaf => {\n leaf.deactivate();\n });\n this.paperLeaves.forEach(paperLeaf => {\n if (this.activeRectos.includes(paperLeaf.leaf.rectoID)) {\n paperLeaf.activate();\n }\n });\n }\n },\n setActiveVersos: function (value) {\n this.activeVersos = value;\n if (this.paperLeaves.length > 0) {\n this.paperLeaves.forEach(leaf => {\n leaf.deactivate();\n });\n this.paperLeaves.forEach(paperLeaf => {\n if (this.activeVersos.includes(paperLeaf.leaf.versoID)) {\n paperLeaf.activate();\n }\n });\n }\n },\n setFlashItems: function (value) {\n this.flashItems = value;\n },\n setFilter: function (filters) {\n this.filters = filters;\n this.showFilter();\n },\n showFilter: function () {\n this.paperLeaves.forEach(leaf => {\n leaf.filterHighlight.opacity = 0;\n if (\n this.filters.Leafs.includes(leaf.leaf.id) ||\n this.filters.Sides.includes(leaf.leaf.rectoID) ||\n this.filters.Sides.includes(leaf.leaf.versoID)\n ) {\n leaf.filterHighlight.opacity = 1;\n }\n });\n this.paperGroups.forEach(group => {\n group.filterHighlight.opacity = 0;\n if (this.filters.Groups.includes(group.group.id)) {\n group.filterHighlight.opacity = 1;\n }\n });\n },\n setVisibility: function (visibleAttributes) {\n this.visibleAttributes = visibleAttributes;\n this.paperGroups.forEach(group =>\n group.setVisibility(visibleAttributes.group)\n );\n this.paperLeaves.forEach(leaf => leaf.setVisibility(visibleAttributes));\n },\n setScale: function (spacing, strokeWidth) {\n this.spacing = this.width * spacing;\n this.strokeWidth = this.width * strokeWidth;\n },\n};\n\nfunction PaperManager(args) {\n this.canvas = document.getElementById(args.canvasID);\n paper.setup(this.canvas);\n this.tool = null;\n this.groupIDs = args.groupIDs;\n this.leafIDs = args.leafIDs;\n this.Groups = args.Groups;\n this.Leafs = args.Leafs;\n this.Rectos = args.Rectos;\n this.Versos = args.Versos;\n this.Terms = args.Terms;\n this.origin = args.origin;\n this.width = paper.view.viewSize.width;\n this.spacing = this.width * args.spacing;\n this.strokeWidth = this.width * args.strokeWidth;\n this.strokeColor = args.strokeColor;\n this.strokeColorActive = args.strokeColorActive;\n this.strokeColorAdded = args.strokeColorAdded;\n this.strokeColorGroupActive = args.strokeColorGroupActive;\n this.strokeColorTacket = args.strokeColorTacket;\n this.groupColor = args.groupColor;\n this.groupColorActive = args.groupColorActive;\n this.groupTextColor = args.groupTextColor;\n this.handleObjectClick = args.handleObjectClick;\n this.groupLeaves = new paper.Group(); // Groups of leaf paths\n this.groupGroups = new paper.Group(); // Group of group paths\n this.groupContainer = new paper.Group();\n this.activeGroups = args.activeGroups;\n this.activeLeafs = args.activeLeafs;\n this.activeRectos = args.activeRectos;\n this.activeVersos = args.activeVersos;\n this.paperLeaves = [];\n this.paperGroups = [];\n this.leafYs = [];\n this.groupYs = [];\n this.multipliers = {};\n this.flashItems = args.flashItems;\n this.flashLeaves = [];\n this.flashGroups = [];\n this.filters = args.filters;\n this.strokeColorFilter = args.strokeColorFilter;\n this.visibleAttributes = args.visibleAttributes;\n this.viewingMode = args.viewingMode;\n this.tacketLineDrag = new paper.Path();\n this.groupTacketGuide = new paper.Group();\n this.groupTacketGuideLine = new paper.Group();\n this.groupTacket = new paper.Group();\n this.toggleVisualizationDrawing = args.toggleVisualizationDrawing;\n this.addVisualization = args.addVisualization;\n this.tacketToolIsActive = false;\n this.tacketToolOriginalPosition = 0;\n this.slideForward = true;\n this.openTermDialog = args.openTermDialog;\n this.leafIDs = args.leafIDs;\n this.notationStyle = args.notationStyle;\n\n let that = this;\n // Flash newly added items\n paper.view.onFrame = function (event) {\n for (let i = 0; i < that.flashLeaves.length; i++) {\n that.flashLeaves[i].highlight.opacity = Math.min(\n 0.8,\n that.flashLeaves[i].highlight.opacity + 0.05\n );\n }\n for (let i = 0; i < that.flashGroups.length; i++) {\n that.flashGroups[i].highlight.opacity = Math.min(\n 0.8,\n that.flashGroups[i].highlight.opacity + 0.05\n );\n }\n if (that.tacketToolIsActive) {\n if (that.slideForward) {\n that.groupTacketGuideLine.position.x += 0.5;\n if (\n that.groupTacketGuideLine.position.x >\n that.tacketToolOriginalPosition + 25\n ) {\n that.slideForward = false;\n }\n } else {\n that.groupTacketGuideLine.position.x -= 0.5;\n if (\n that.groupTacketGuideLine.position.x < that.tacketToolOriginalPosition\n ) {\n that.slideForward = true;\n }\n }\n }\n };\n}\n\nexport default PaperManager;\n","import React from 'react';\nimport PaperManager from '../../assets/visualMode/PaperManager.js';\n\n/** Contains the collation drawing in a canvas element */\nexport default class VisualMode extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n paperManager: {},\n };\n }\n\n componentDidMount() {\n this.props.toggleVisualizationDrawing({ type: 'tacketed', value: '' });\n this.props.toggleVisualizationDrawing({ type: 'sewing', value: '' });\n window.addEventListener('resize', this.drawOnCanvas);\n this.setState(\n {\n paperManager: new PaperManager({\n canvasID: 'myCanvas',\n origin: 0,\n spacing: 0.04,\n strokeWidth: 0.015,\n strokeColor: 'rgb(82,108,145)',\n strokeColorActive: 'rgb(78,214,203)',\n strokeColorGroupActive: 'rgb(82,108,145)',\n strokeColorFilter: '#95fff6',\n strokeColorAdded: '#5F95D6',\n groupColor: '#e7e7e7',\n groupColorActive: 'rgb(78,214,203)',\n groupTextColor: '#727272',\n strokeColorTacket: '#4e4e4e',\n handleObjectClick: this.props.handleObjectClick,\n groupIDs: this.props.project.groupIDs,\n leafIDs: this.props.project.leafIDs,\n Groups: this.props.project.Groups,\n Leafs: this.props.project.Leafs,\n Rectos: this.props.project.Rectos,\n Versos: this.props.project.Versos,\n Terms: this.props.project.Terms,\n activeGroups:\n this.props.collationManager.selectedObjects.type === 'Group'\n ? this.props.collationManager.selectedObjects.members\n : [],\n activeLeafs:\n this.props.collationManager.selectedObjects.type === 'Leaf'\n ? this.props.collationManager.selectedObjects.members\n : [],\n activeRectos:\n this.props.collationManager.selectedObjects.type === 'Recto'\n ? this.props.collationManager.selectedObjects.members\n : [],\n activeVersos:\n this.props.collationManager.selectedObjects.type === 'Verso'\n ? this.props.collationManager.selectedObjects.members\n : [],\n flashItems: this.props.collationManager.flashItems,\n filters: this.props.collationManager.filters,\n visibleAttributes: this.props.project.preferences,\n toggleVisualizationDrawing: this.props.toggleVisualizationDrawing,\n addVisualization: this.addVisualization,\n openTermDialog: this.props.openTermDialog,\n notationStyle: this.props.project.notationStyle,\n }),\n },\n () => {\n this.drawOnCanvas();\n }\n );\n }\n componentWillUnmount() {\n this.props.toggleVisualizationDrawing({ type: 'tacketed', value: '' });\n this.props.toggleVisualizationDrawing({ type: 'sewing', value: '' });\n this.state.paperManager.deactivateTacketTool();\n window.removeEventListener('resize', this.drawOnCanvas);\n }\n\n shouldComponentUpdate(nextProps) {\n return (\n this.props.project.Groups !== nextProps.project.Groups ||\n this.props.project.Sides !== nextProps.project.Sides ||\n this.props.project.Rectos !== nextProps.project.Rectos ||\n this.props.project.Versos !== nextProps.project.Versos ||\n this.props.project.Terms !== nextProps.project.Terms ||\n this.props.collationManager.selectedObjects !==\n nextProps.collationManager.selectedObjects ||\n this.props.collationManager.flashItems !==\n nextProps.collationManager.flashItems ||\n this.props.collationManager.filters !==\n nextProps.collationManager.filters ||\n this.props.project.preferences !== nextProps.project.preferences ||\n this.props.tacketed !== nextProps.tacketed ||\n this.props.sewing !== nextProps.sewing\n );\n }\n\n componentWillUpdate(nextProps) {\n if (Object.keys(this.state.paperManager).length > 0) {\n this.state.paperManager.setProject(nextProps.project);\n this.state.paperManager.setFlashItems(\n nextProps.collationManager.flashItems\n );\n this.state.paperManager.setActiveGroups(\n nextProps.collationManager.selectedObjects.type === 'Group'\n ? nextProps.collationManager.selectedObjects.members\n : []\n );\n this.state.paperManager.setActiveLeafs(\n nextProps.collationManager.selectedObjects.type === 'Leaf'\n ? nextProps.collationManager.selectedObjects.members\n : []\n );\n this.state.paperManager.setActiveRectos(\n nextProps.collationManager.selectedObjects.type === 'Recto'\n ? nextProps.collationManager.selectedObjects.members\n : []\n );\n this.state.paperManager.setActiveVersos(\n nextProps.collationManager.selectedObjects.type === 'Verso'\n ? nextProps.collationManager.selectedObjects.members\n : []\n );\n this.state.paperManager.setFilter(nextProps.collationManager.filters);\n this.state.paperManager.setVisibility(nextProps.project.preferences);\n this.drawOnCanvas();\n if (nextProps.tacketed !== '') {\n this.state.paperManager.activateTacketTool(nextProps.tacketed);\n } else if (nextProps.sewing !== '') {\n this.state.paperManager.activateTacketTool(nextProps.sewing, 'sewing');\n } else {\n this.state.paperManager.deactivateTacketTool();\n }\n }\n }\n\n addVisualization = (groupID, type, leafIDs) => {\n let updatedGroup = {\n [type]: leafIDs,\n };\n this.props.updateGroup(groupID, updatedGroup);\n };\n\n /**\n * Update canvas size based on current window size\n */\n updateCanvasSize = () => {\n // Resize the canvas\n let maxWidth = window.innerWidth - window.innerWidth * 0.46;\n document.getElementById('myCanvas').width = maxWidth;\n this.state.paperManager.setWidth(maxWidth);\n };\n\n /**\n * Draw canvas\n */\n drawOnCanvas = () => {\n // Create leaves through manager\n this.updateCanvasSize();\n this.state.paperManager.draw();\n };\n\n render() {\n let canvasAttr = {\n 'data-paper-hidpi': 'off',\n height: '99999999px',\n width: window.innerWidth - window.innerWidth * 0.46,\n };\n return (\n
\n \n
\n );\n }\n}\n","import paper from 'paper';\n\nPaperLeaf.prototype = {\n constructor: PaperLeaf,\n draw: function() {\n // Call this function only after ALL leaves have been instantiated\n // This is because we need all leaves present in order\n // to compute their indentations relative to each other\n this.setIndent();\n // Draw horizontal part\n let x1 = this.multiplier<1? 10 + this.indent*this.spacing*this.multiplier : this.indent*this.spacing*this.multiplier;\n let x2 = this.width;\n this.path.add(new paper.Point(x1, this.y));\n if (this.leaf.stub !== \"No\") {\n x2 = this.width*0.15+x1;\n }\n this.path.add(new paper.Point(x2, this.y));\n // Draw vertical part\n if (this.isConjoined()) {\n var conjoinY=this.y_conjoin_center(this.conjoined_to);\n this.path.insert(0, new paper.Point(this.path.segments[0].point.x, conjoinY));\n }\n this.curveMe();\n\n this.path.name = \"leaf \" + this.order;\n\n // Create highlight path\n this.highlight = this.path.clone();\n this.highlight.dashArray = [0, 0];\n this.highlight.segments[this.highlight.segments.length-1].point.x = this.highlight.segments[this.highlight.segments.length-1].point.x + 5;\n if (this.leaf.conjoined_to === \"None\") {\n this.highlight.segments[0].point.x = this.highlight.segments[0].point.x - 5;\n }\n this.highlight.strokeColor = this.strokeColorActive;\n this.highlight.strokeWidth = this.path.strokeWidth*2;\n this.highlight.opacity = 0;\n this.highlight.name = \"leaf \" + this.order + \" highlight\";\n this.highlight.insertBelow(this.path);\n\n if (this.isActive) {\n this.highlight.opacity = 0.35;\n this.highlight.strokeWidth = this.path.strokeWidth*2;\n this.highlight.strokeColor = \"#ffffff\";\n }\n \n this.filterHighlight = this.path.clone();\n this.filterHighlight.dashArray = [0, 0];\n this.filterHighlight.segments[this.filterHighlight.segments.length-1].point.x = this.filterHighlight.segments[this.filterHighlight.segments.length-1].point.x + 5;\n if (this.leaf.conjoined_to === \"None\") {\n this.filterHighlight.segments[0].point.x = this.filterHighlight.segments[0].point.x - 5;\n }\n this.filterHighlight.strokeColor = this.strokeColorFilter;\n this.filterHighlight.strokeWidth = this.path.strokeWidth*2;\n this.filterHighlight.opacity = 0;\n this.filterHighlight.insertBelow(this.path);\n\n // this.path.fullySelected = true;\n this.showAttributes();\n this.createAttachments();\n\n const leafTermsToShow = this.leaf.terms.filter((termID)=>{return this.Terms[termID].show}).reverse();\n const rectoTermsToShow = this.recto.terms.filter((termID)=>{return this.Terms[termID].show}).reverse();\n const versoTermsToShow = this.verso.terms.filter((termID)=>{return this.Terms[termID].show});\n\n let textX = 0;\n let textY = this.y;\n let fontSize = this.spacing*0.50;\n let numChars = this.path.bounds.width/fontSize*2.4;\n\n if (this.isConjoined()) {\n // This leaf is conjoined\n textX = this.path.segments[1].point.x;\n } else {\n // Separate leaf\n textX = this.path.segments[0].point.x + 10;\n }\n if (this.leaf.attached_above.includes(\"Partial\")) {\n // This leaf has a partial glue attachment\n // Place text to the right of attachment drawing\n textX = this.attachment.bounds.right+5;\n } else if (this.leaf.attached_above.includes(\"Glued\")) {\n // Other type of glueing exists\n textY -= this.spacing*0.7;\n } \n let that = this;\n let clickListener = function(term) {\n return function(event) {\n that.openTermDialog(term);\n }\n }\n if (this.showTerms) {\n // Draw recto term text\n for (let termIndex = 0; termIndex < rectoTermsToShow.length; termIndex++) {\n const term = this.Terms[rectoTermsToShow[termIndex]];\n const termTitle = this.recto.folio_number? \"â–¼ \" + this.recto.folio_number + \" : \" + term.title.substr(0,numChars) : \"â–¼ R : \" + term.title.substr(0,numChars) ;\n let textTerm = new paper.PointText({\n content: termTitle,\n point: [textX, textY - termIndex*(this.spacing*0.7) - this.spacing*0.3],\n fillColor: this.strokeColor,\n fontSize: fontSize,\n });\n textTerm.onClick = !this.viewingMode && clickListener(term);\n this.textTerms.addChild(textTerm);\n }\n // Draw leaf term text\n for (let termIndex = 0; termIndex < leafTermsToShow.length; termIndex++) {\n const term = this.Terms[leafTermsToShow[termIndex]];\n \n let textTerm = new paper.PointText({\n content: \"â–¼ L\" + this.order + \" : \" + term.title.substr(0,numChars),\n point: [textX, textY - rectoTermsToShow.length*(this.spacing*0.7) - termIndex*(this.spacing*0.7) - this.spacing*0.3],\n fillColor: this.strokeColor,\n fontSize: fontSize,\n });\n textTerm.onClick = !this.viewingMode && clickListener(term);\n this.textTerms.addChild(textTerm);\n }\n // Draw verso term text\n for (let termIndex = 0; termIndex < versoTermsToShow.length; termIndex++) {\n const term = this.Terms[versoTermsToShow[termIndex]];\n const termTitle = this.verso.folio_number? \"â–² \" + this.verso.folio_number + \" : \" + term.title.substr(0,numChars) : \"â–² V : \" + term.title.substr(0,numChars);\n let textTerm = new paper.PointText({\n content: termTitle,\n point: [textX, this.y + termIndex*(this.spacing*0.7) + this.spacing*0.8],\n fillColor: this.strokeColor,\n fontSize: fontSize,\n });\n textTerm.onClick = !this.viewingMode && clickListener(term);\n this.textTerms.addChild(textTerm);\n }\n this.textTerms.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n this.textTerms.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n }\n\n\n return this;\n },\n setMouseEventHandlers: function() {\n // Set mouse event handlers\n let that = this;\n this.path.onClick = function(event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.textLeafOrder.onClick = function(event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.textRecto.onClick = function(event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.textVerso.onClick = function(event) {\n that.handleObjectClick(that.leaf, event);\n };\n this.path.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n this.path.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n this.textLeafOrder.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n this.textLeafOrder.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n this.textRecto.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n this.textRecto.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n this.textVerso.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n this.textVerso.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n },\n removeMouseEventHandlers: function() {\n // Set mouse event handlers\n this.path.onClick = function(event) {};\n this.textLeafOrder.onClick = function(event) {};\n this.textRecto.onClick = function(event) {};\n this.textVerso.onClick = function(event) {};\n this.path.onMouseEnter = function(event) {};\n this.path.onMouseLeave = function(event) {};\n this.textLeafOrder.onMouseEnter = function(event) {};\n this.textLeafOrder.onMouseLeave = function(event) {};\n this.textRecto.onMouseEnter = function(event) {};\n this.textRecto.onMouseLeave = function(event) {};\n this.textVerso.onMouseEnter = function(event) {};\n this.textVerso.onMouseLeave = function(event) {};\n },\n createAttachments: function() {\n if (this.order>1 && this.leaf.attached_above.includes(\"Glued\")) {\n this.createGlue();\n } else if (this.order>1 && this.leaf.attached_above===\"Other\") {\n this.createOtherAttachment();\n } \n if (this.order>1 && this.leaf.conjoin_type===\"Sewn\") {\n this.createSewn();\n }\n },\n createGlue: function() {\n let x = this.path.segments[0].point.x;\n if (this.isConjoined() && this.conjoined_to0;\n },\n conjoinedLeaf: function() {\n return this.manager.getLeaf(this.conjoined_to);\n },\n y_conjoin_center: function(conjoin_order) {\n var y1 = this.path.segments[1].point.y;\n var y2 = (this.manager.getLeaf(conjoin_order)).getY();\n return y1+((y2-y1)/2.0);\n },\n y_nonconjoin_center: function() {\n var y = this.y\n var y_center = this.y_centerQuire();\n if (y===y_center) {\n return y_center;\n } else if (y= this.manager.numLeaves()) {\n return 0;\n } else {\n return this.manager.getLeaf(this.order+1).y;\n }\n },\n curveMe: function() {\n var path_height = Math.abs(this.path.segments[0].point.y - this.path.segments[1].point.y);\n var midpoint = this.path.segments[1].point;\n if (this.isConjoined() ) {\n var numLeavesInside = Math.abs(this.conjoined_to - this.order);\n // Remove the middle point and insert a new one with handles\n this.path.removeSegment(1);\n // // Calculate new point's location and radius\n var new_x = midpoint.x + 20;\n var radius = new_x - this.path.segments[0].point.x;\n var s1 = new paper.Segment(new paper.Point(new_x, midpoint.y), new paper.Point(-radius,0), null);\n this.path.insert(1, s1);\n\n if (numLeavesInside > 5) {\n // Modify first point's handle so that the curve isn't too curvy\n var direction = this.path.segments[0].point.y > this.path.segments[1].point.y? -1 : 1;\n var oldPoint = this.path.segments[0].point;\n this.path.removeSegment(0);\n var s0 = new paper.Segment(new paper.Point(oldPoint.x, oldPoint.y), null, new paper.Point(0,direction*(path_height)));\n this.path.insert(0, s0);\n }\n }\n },\n setIndent: function() {\n this.indent = this.leaf.nestLevel;\n if (this.isConjoined() && this.conjoinedLeaf().indent != null) {\n // Leaf is conjoined and conjoiner has indent, so copy that conjoiner's indent\n this.indent = this.conjoinedLeaf().indent;\n } else if (this.isBelowAConjoined()) {\n this.indent = (this.prevPaperLeaf().indent+1);\n } else if (this.localOrder>1 && this.parentOrder === this.prevPaperLeaf().parentOrder){\n // Leaf is a sibling of previous leaf, so copy sibling's indent\n this.indent = this.prevPaperLeaf().indent;\n }\n },\n isBelowAConjoined: function() {\n let previousLeafID = this.allLeafIDs[this.allLeafIDs.indexOf(this.leaf.id)-1];\n if (!previousLeafID) return false;\n let previousLeaf = this.Leafs[previousLeafID];\n return (this.order>1 && previousLeaf.conjoined_to!==null && (this.allLeafIDs.indexOf(previousLeaf.conjoined_to)+1)>this.order)\n },\n y_centerQuire: function () {\n var last_leaf = this.manager.getLastLeaf().getY();\n return (last_leaf+ this.spacing)/2.0 ;\n },\n getY: function() {\n return this.y;\n },\n activate: function() {\n this.path.strokeColor = this.strokeColorActive;\n this.highlight.opacity = 0.35;\n this.highlight.strokeWidth = this.path.strokeWidth*2;\n this.highlight.strokeColor = \"#ffffff\";\n },\n deactivate: function() {\n this.highlight.opacity = 0;\n this.highlight.strokeWidth = this.path.strokeWidth;\n this.highlight.strokeColor = this.strokeColorActive;\n \n if (this.leaf.type===\"Added\") {\n this.path.strokeColor = this.strokeColorAdded;\n } else if (this.leaf.type===\"Endleaf\") {\n this.path.strokeColor = \"#727272\";\n } else {\n this.path.strokeColor = this.strokeColor;\n }\n },\n setVisibility: function(visibleAttributes) {\n this.visibleAttributes = visibleAttributes;\n this.showAttributes();\n },\n showAttributes: function() {\n const rectoValues = [];\n const versoValues = [];\n if (this.visibleAttributes.side) {\n if (this.visibleAttributes.side.folio_number) {\n if (this.recto.folio_number) rectoValues.push(this.recto.folio_number)\n if (this.verso.folio_number) versoValues.push(this.verso.folio_number)\n }\n if (this.visibleAttributes.side.page_number) {\n if (this.recto.page_number) rectoValues.push(this.recto.page_number)\n if (this.verso.page_number) versoValues.push(this.verso.page_number)\n }\n if (this.visibleAttributes.side.texture) {\n rectoValues.push(this.recto.texture)\n versoValues.push(this.verso.texture)\n }\n }\n let rectoContent = \"\";\n let versoContent = \"\";\n for (let i=0; i {\n if (this.visibleAttributes.side[key]) return acc+1;\n return acc;\n }\n const visibleAttributeCount = this.visibleAttributes.side? Object.keys(this.visibleAttributes.side).reduce(reducer,0) : 0;\n\n if (visibleAttributeCount===3) {\n if (this.leaf.stub === \"No\") {\n // Reduce leaf width so we can fit attribute text\n this.path.segments[this.path.segments.length-1].point.x = this.width-this.spacing*3;\n this.highlight.segments[this.highlight.segments.length-1].point.x = this.width-this.spacing*2.8;\n this.filterHighlight.segments[this.filterHighlight.segments.length-1].point.x = this.width-this.spacing*2.8;\n }\n this.textLeafOrder.set({point: [this.width-this.spacing*2.8, this.textLeafOrder.point.y]});\n this.textRecto.set({point:[this.textLeafOrder.bounds.right+this.spacing*0.4, this.textRecto.point.y], content: rectoContent});\n this.textVerso.set({point:[this.textLeafOrder.bounds.right+this.spacing*0.4, this.textVerso.point.y], content: versoContent});\n } else if (visibleAttributeCount===2) {\n if (this.leaf.stub === \"No\") {\n // Reduce leaf width so we can fit attribute text\n this.path.segments[this.path.segments.length-1].point.x = this.width-this.spacing*2;\n this.highlight.segments[this.highlight.segments.length-1].point.x = this.width-this.spacing*1.8;\n this.filterHighlight.segments[this.filterHighlight.segments.length-1].point.x = this.width-this.spacing*1.8;\n }\n this.textLeafOrder.set({point: [this.width-this.spacing*1.8, this.textLeafOrder.point.y]});\n this.textRecto.set({point:[this.textLeafOrder.bounds.right+this.spacing*0.2, this.textRecto.point.y], content: rectoContent});\n this.textVerso.set({point:[this.textLeafOrder.bounds.right+this.spacing*0.2, this.textVerso.point.y], content: versoContent});\n } \n else if (visibleAttributeCount===1) {\n if (this.leaf.stub === \"No\") {\n // Reduce leaf width so we can fit folio number text\n this.path.segments[this.path.segments.length-1].point.x = this.width - this.spacing;\n this.highlight.segments[this.highlight.segments.length-1].point.x = this.width - this.spacing*0.8;\n this.filterHighlight.segments[this.filterHighlight.segments.length-1].point.x = this.width - this.spacing*0.8;\n }\n this.textLeafOrder.set({point: [this.width-this.spacing*0.8, this.textLeafOrder.point.y]});\n this.textRecto.set({point:[this.textLeafOrder.bounds.right+this.spacing*0.2, this.textRecto.point.y], content: rectoContent});\n this.textVerso.set({point:[this.textLeafOrder.bounds.right+this.spacing*0.2, this.textVerso.point.y], content: versoContent});\n } else {\n // Reset leaf \n if (this.leaf.stub === \"No\") {\n this.path.segments[this.path.segments.length-1].point.x = this.width;\n this.highlight.segments[this.highlight.segments.length-1].point.x = this.width + 5;\n this.filterHighlight.segments[this.filterHighlight.segments.length-1].point.x = this.width + 5;\n }\n this.textLeafOrder.set({point: [this.width+10, this.textLeafOrder.point.y]});\n }\n },\n}\n// Constructor for leaf\nfunction PaperLeaf(args) {\n this.manager = args.manager;\n this.Terms = args.Terms;\n this.leafIDs = args.leafIDs;\n this.allLeafIDs = args.allLeafIDs;\n this.Leafs = args.Leafs;\n this.leaf = args.leaf;\n this.recto = args.recto;\n this.verso = args.verso;\n this.order = args.allLeafIDs.indexOf(args.leaf.id) + 1;\n this.localOrder = args.leafIDs.indexOf(args.leaf.id) + 1;\n this.parentOrder = args.groupIDs.indexOf(this.leaf.parentID)+1;\n this.conjoined_to = this.leaf.conjoined_to===null ? \"None\" : this.leafIDs.indexOf(this.leaf.conjoined_to)+1;\n this.indent = null;\n this.origin = args.origin;\n this.viewingMode = args.viewingMode;\n this.width = this.viewingMode? args.width*0.88 : args.width*0.92;\n this.spacing = args.spacing;\n this.y = args.y;\n this.strokeWidth = args.strokeWidth;\n this.strokeColor = args.strokeColor;\n this.strokeColorActive = args.strokeColorActive;\n this.strokeColorGroupActive = args.strokeColorGroupActive;\n this.strokeColorFilter = args.strokeColorFilter;\n this.strokeColorAdded = args.strokeColorAdded;\n this.highlight = new paper.Path();\n this.filterHighlight = new paper.Path();\n this.path = new paper.Path();\n this.isActive = args.isActive;\n this.handleObjectClick = args.handleObjectClick;\n this.multiplier = args.multiplier;\n this.attachment = new paper.Group();\n this.textTerms = new paper.Group();\n this.openTermDialog = args.openTermDialog;\n this.showTerms = args.showTerms;\n\n this.textLeafOrder = new paper.PointText({\n point: [this.width, this.y+5],\n content: \"L\"+ this.order,\n fillColor: this.strokeColor,\n fontSize: this.spacing*0.48,\n });\n this.textRecto = new paper.PointText({\n point: [this.width+this.spacing, this.y-3],\n fillColor: this.strokeColor,\n fontSize: this.spacing*0.37,\n });\n this.textVerso = new paper.PointText({\n point: [this.width+this.spacing, this.y+this.spacing*0.37-3],\n fillColor: this.strokeColor,\n fontSize: this.spacing*0.37,\n });\n \n this.visibleAttributes = args.visibleAttributes;\n // Set path properties\n if (this.leaf.type===\"Added\") {\n this.path.strokeColor = args.strokeColorAdded;\n } else if (this.leaf.type===\"Endleaf\") {\n this.path.strokeColor = \"#919191\";\n } else {\n this.path.strokeColor = args.strokeColor;\n }\n if (this.leaf.type==='Missing') {\n // If leaf is missing, make stroke dashed\n this.path.dashArray = [20, 10];\n }\n if (this.leaf.type==='Replaced') {\n this.path.strokeColor = \"#9d6464\";\n }\n if (this.isActive) {\n this.path.strokeColor = args.strokeColorActive;\n }\n this.path.strokeWidth = this.strokeWidth;\n if (this.leaf.material === \"Parchment\") {\n this.path.strokeWidth = this.path.strokeWidth*1.20;\n } else if (this.leaf.material === \"Paper\") {\n this.path.strokeWidth = this.path.strokeWidth*0.80;\n }\n}\n\n\nexport default PaperLeaf;\n","import paper from 'paper';\n\nPaperGroup.prototype = {\n constructor: PaperGroup,\n draw: function() {\n // Create rectangle shapes\n let rectangle = new paper.Rectangle(\n new paper.Point(this.x+10, this.y),\n new paper.Size(this.width-this.x-20, this.groupHeight)\n );\n if (this.viewingMode) {\n rectangle = new paper.Rectangle(\n new paper.Point(this.x+10, this.y),\n new paper.Size(this.width-this.x, this.groupHeight)\n );\n }\n let highlightRectangle = rectangle.clone();\n highlightRectangle.set(\n new paper.Point(this.x, this.y-10),\n new paper.Size(this.width-this.x, this.groupHeight+20)\n );\n\n // Create path from rectangle\n this.path = new paper.Path.Rectangle(rectangle);\n if (this.isActive) {\n this.path.fillColor = this.groupColorActive;\n } else {\n this.path.fillColor = this.groupColor;\n }\n if (this.group.nestLevel%2===0) {\n this.path.fillColor.brightness -= 0.05;\n }\n this.path.name = \"group \" + this.groupOrder;\n\n // Create highlight path from rectangle\n this.highlight = new paper.Path.Rectangle(highlightRectangle);\n this.highlight.fillColor = new paper.Color(112/255.0, 229/255.0, 220/255.0, 1);\n this.highlight.opacity = 0;\n this.highlight.name = \"group \" + this.groupOrder + \" highlight\";\n this.highlight.insertBelow(this.path);\n\n this.filterHighlight = new paper.Path.Rectangle(highlightRectangle);\n this.filterHighlight.fillColor = this.filterColor;\n this.filterHighlight.opacity = 0;\n this.filterHighlight.insertBelow(this.path);\n\n // Set highlight path to be at the back\n paper.project.activeLayer.insertChild(0, this.highlight);\n paper.project.activeLayer.insertChild(0, this.filterHighlight);\n },\n setMouseEventHandlers: function() {\n // Set mouse event handlers\n let that = this;\n this.path.onClick = function(event) {\n that.handleObjectClick(that.group, event);\n };\n this.path.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n this.path.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n },\n removeMouseEventHandlers: function() {\n this.path.onClick = function(event) {};\n this.path.onMouseEnter = function(event) {};\n this.path.onMouseLeave = function(event) {};\n },\n activate: function() {\n this.path.fillColor = this.groupColorActive;\n this.isActive = true;\n this.highlight.opacity = 0.75;\n this.highlight.fillColor = \"#ffffff\";\n },\n deactivate: function() {\n this.path.fillColor = this.groupColor;\n if (this.group.nestLevel%2===0) {\n this.path.fillColor.brightness -= 0.05;\n }\n this.isActive = false;\n this.highlight.opacity = 0;\n this.highlight.fillColor = new paper.Color(112/255.0, 229/255.0, 220/255.0, 1);\n },\n setVisibility: function(visibleAttributes) {\n this.visibleAttributes = visibleAttributes;\n let groupText = this.group.type + \" \" + this.groupOrder;\n if (this.visibleAttributes && this.visibleAttributes.title) groupText = groupText + \": \" + this.group.title;\n this.text.set({\n content: groupText,\n });\n },\n}\n// Constructor for group\nfunction PaperGroup(args) {\n this.manager = args.manager;\n this.group = args.group;\n this.groupOrder = args.allGroupIDs.indexOf(args.group.id)+1\n this.y = args.y;\n this.x = args.x;\n this.width = args.width;\n this.groupHeight = args.groupHeight;\n this.isActive = args.isActive;\n this.highlight = new paper.Path();\n this.filterHighlight = new paper.Path();\n this.path = new paper.Path();\n this.groupColor = args.groupColor;\n this.groupColorActive = args.groupColorActive;\n this.textColor = args.textColor;\n this.filterColor = args.filterColor;\n this.handleObjectClick = args.handleObjectClick;\n this.visibleAttributes = {};\n this.viewingMode = args.viewingMode;\n this.text = new paper.PointText({\n point: [this.x+args.spacing*0.6, this.y+args.spacing*0.6],\n fillColor: this.textColor,\n fontSize: args.spacing*0.48,\n });\n this.setVisibility(args.visibleAttributes);\n}\nexport default PaperGroup;","import paper from 'paper';\nimport PaperLeaf from \"./PaperLeaf.js\";\nimport PaperGroup from \"./PaperGroup.js\";\nimport { getMemberOrder } from '../../../helpers/getMemberOrder';\n\nPaperManager.prototype = {\n constructor: PaperManager,\n createGroup: function(group) {\n let g = new PaperGroup({\n manager: this,\n group: group,\n allGroupIDs: this.allGroupIDs,\n y: this.groupYs[this.groupIDs.indexOf(group.id)],\n x: (group.nestLevel-1)*(this.spacing),\n width: this.width,\n groupHeight: this.getGroupHeight(group),\n isActive: this.activeGroups.includes(group.id),\n groupColor: this.groupColor,\n groupColorActive: this.groupColorActive,\n filterColor: this.strokeColorFilter,\n handleObjectClick: this.handleObjectClick,\n textColor: this.groupTextColor,\n visibleAttributes: this.visibleAttributes.group,\n viewingMode: this.viewingMode,\n spacing: this.spacing,\n });\n\n g.draw();\n g.setMouseEventHandlers();\n\n // Add this group to collections\n this.groupGroups.addChild(g.filterHighlight);\n this.groupGroups.addChild(g.highlight);\n this.groupGroups.addChild(g.path);\n this.groupGroups.addChild(g.text);\n this.paperGroups.push(g);\n \n // Add this group to list of items to flash if it's in the flashItems list\n if (this.flashItems.groups.includes(group.id)) {\n this.flashGroups.push(g);\n }\n \n },\n createLeaf: function(leaf) {\n let l = new PaperLeaf({\n manager: this,\n origin: this.origin,\n width: this.width,\n spacing: this.spacing,\n strokeWidth: this.strokeWidth * Math.min(1.0, this.multipliers[this.leafIDs.indexOf(leaf.id)+1]),\n strokeColor: this.strokeColor,\n strokeColorActive: this.strokeColorActive,\n strokeColorGroupActive: this.strokeColorGroupActive,\n strokeColorAdded: this.strokeColorAdded,\n leaf: leaf,\n recto: this.Rectos[leaf.rectoID],\n verso: this.Versos[leaf.versoID],\n groupIDs: this.groupIDs,\n leafIDs: this.leafIDs,\n allLeafIDs: this.allLeafIDs,\n Groups: this.Groups,\n Leafs: this.Leafs,\n Terms: this.Terms,\n y: this.leafYs[this.leafIDs.indexOf(leaf.id)],\n isActive: this.activeLeafs.includes(leaf.id) || this.activeRectos.includes(leaf.rectoID) || this.activeVersos.includes(leaf.versoID),\n customSpacings: this.customSpacings,\n handleObjectClick: this.handleObjectClick,\n multiplier: this.multipliers[this.leafIDs.indexOf(leaf.id)+1],\n strokeColorFilter: this.strokeColorFilter,\n visibleAttributes: this.visibleAttributes,\n viewingMode: this.viewingMode,\n openTermDialog: this.openTermDialog,\n showTerms: this.showTerms,\n });\n this.paperLeaves.push(l);\n this.groupLeaves.addChild(l.path);\n this.groupLeaves.addChild(l.textLeafOrder);\n this.groupLeaves.addChild(l.textRecto);\n this.groupLeaves.addChild(l.textVerso);\n this.groupLeaves.addChild(l.attachment);\n this.groupLeaves.addChild(l.textTerms);\n if (this.flashItems.leaves.includes(leaf.id)) {\n this.flashLeaves.push(l);\n }\n return l;\n },\n draw: function() {\n // Clear existing drawn elements\n this.leafYs = [];\n this.groupYs = [];\n this.paperLeaves = [];\n this.paperGroups = [];\n this.flashGroups = [];\n this.flashLeaves = [];\n this.groupLeaves.removeChildren();\n this.groupGroups.removeChildren();\n this.groupContainer.removeChildren();\n this.groupTacket.removeChildren();\n\n // Calculate y positions of groups and leaves\n let currentY = 0;\n let prevRootGroupID = null;\n for (let i in this.groupIDs) {\n const groupID = this.groupIDs[i];\n const group = this.Groups[groupID];\n if (group.nestLevel === 1) {\n currentY = 0;\n if (i>0 && prevRootGroupID) {\n const prevGroupsLastMember = this.getLastMember(prevRootGroupID)\n const nestLevel = prevGroupsLastMember? prevGroupsLastMember.nestLevel +1 : 1;\n currentY = currentY + this.spacing*(nestLevel);\n } \n this.groupYs.push(currentY);\n currentY = this.calculateYs(group.memberIDs, currentY, this.spacing);\n\n if (group.memberIDs.length===0) {\n currentY = currentY + this.spacing;\n }\n prevRootGroupID = groupID;\n }\n }\n\n // Create background Rectangle for each group\n for (let groupID of this.groupIDs) {\n const group = this.Groups[groupID];\n this.createGroup(group);\n }\n\n // Create all the leaves\n for (let leafID of this.leafIDs) {\n this.createLeaf(this.Leafs[leafID]);\n }\n // Draw all leaves and set mouse event handlers\n this.paperLeaves.forEach((leaf)=> {\n leaf.draw();\n leaf.setMouseEventHandlers();\n });\n \n // Show filter\n this.showFilter();\n \n // Draw other visualizations\n this.drawTackets();\n this.drawSewing();\n \n this.groupContainer.addChild(this.groupGroups);\n this.groupContainer.addChild(this.groupLeaves);\n this.groupContainer.addChild(this.groupTacket);\n this.groupContainer.addChild(this.groupTacketGuide);\n // Reposition the drawing\n this.groupContainer.position.y += 10;\n this.fitCanvas();\n },\n activateTacketTool: function(groupID, type=\"tacketed\") {\n // Remove existing tacket\n this.groupTacket.removeChildren();\n this.groupTacketGuide.removeChildren();\n this.groupTacketGuideLine.removeChildren();\n \n this.tacketToolIsActive = true;\n if (this.tool) this.tool.remove();\n this.tool = new paper.Tool();\n this.tool.minDistance=5;\n let targets = [];\n \n // Remove hover cursor effect on groups and leaves\n this.paperGroups.forEach((group)=>group.removeMouseEventHandlers());\n this.paperLeaves.forEach((leaf)=>leaf.removeMouseEventHandlers());\n document.body.style.cursor = \"crosshair\";\n \n this.drawTacketGuide(groupID, type);\n \n this.tool.onMouseDown = (event) => {\n this.tacketLineDrag = new paper.Path();\n this.tacketLineDrag.strokeColor = this.strokeColorTacket;\n this.tacketLineDrag.strokeWidth = 5;\n this.tacketLineDrag.add(event.point);\n this.groupTacketGuide.addChild(this.tacketLineDrag);\n }\n this.tool.onMouseUp = (event) => {\n // Remove line from canvas\n this.groupTacketGuide.removeChildren();\n // Reset colour of leaves\n this.paperLeaves.forEach((leaf)=> {\n leaf.deactivate();\n });\n this.toggleVisualizationDrawing({type: type, value: \"\"});\n if (targets.length>0) {\n let targetLeaf1 = targets[0];\n let targetLeaf2 = targets[targets.length/2];\n this.addVisualization(targetLeaf1.leaf.parentID, type, [targetLeaf1.leaf.id, targetLeaf2.leaf.id]);\n\n } else {\n // Redraw old visualization\n if (type===\"tacketed\") {\n this.drawTackets();\n } else {\n this.drawSewing();\n }\n }\n }\n this.tool.onMouseDrag = (event) => {\n // Update line\n if (!this.tacketLineDrag.segments[1]) {\n this.tacketLineDrag.add(event.point);\n } else {\n this.tacketLineDrag.segments[1].point = event.point;\n }\n targets = [];\n // Highlight leaves that intersect the line\n const targetGroup = this.paperGroups.find((member)=>{return (member.group.id===groupID)});\n targetGroup.group.memberIDs.forEach((memberID)=> {\n if (memberID.charAt(0)===\"L\") {\n const leaf = this.getLeaf(this.leafIDs.indexOf(this.Leafs[memberID].id)+1);\n if (leaf.isConjoined() && (this.tacketLineDrag.getIntersections(leaf.path).length>0 || \n this.tacketLineDrag.getIntersections(leaf.conjoinedLeaf().path).length>0)) {\n leaf.path.strokeColor = \"#ffffff\";\n leaf.conjoinedLeaf().path.strokeColor = \"#ffffff\";\n // Add leaf to list of targets to tacket\n targets.push(leaf);\n } else {\n leaf.deactivate();\n }\n }\n \n });\n }\n this.tool.activate();\n },\n drawTacketGuide: function(groupID, type) {\n const targetGroup = this.paperGroups.find((member)=>{return (member.group.id===groupID)});\n const guideY = targetGroup.path.bounds.height/2;\n const guideX = targetGroup.path.bounds.left;\n let guideLine = new paper.Path();\n guideLine.strokeColor = \"#ffffff\";\n guideLine.strokeWidth = 5;\n guideLine.dashArray = [10,10];\n guideLine.add(new paper.Point(guideX, targetGroup.path.bounds.y + guideY+ (this.strokeWidth/2)));\n guideLine.add(new paper.Point(guideX+targetGroup.path.bounds.width/3, targetGroup.path.bounds.y + guideY+(this.strokeWidth/2)));\n let guideLineArrow = new paper.Path();\n guideLineArrow.strokeColor = \"#ffffff\";\n guideLineArrow.strokeWidth = 3;\n guideLineArrow.add(guideLine.segments[1].point.x-10, guideLine.segments[1].point.y-10);\n guideLineArrow.add(guideLine.segments[1].point.x, guideLine.segments[1].point.y);\n guideLineArrow.add(guideLine.segments[1].point.x-10, guideLine.segments[1].point.y+10);\n let guideLineX1 = new paper.Path();\n guideLineX1.strokeColor = \"#ffffff\";\n guideLineX1.strokeWidth = 3;\n guideLineX1.add(new paper.Point(guideX-10, guideLine.segments[0].point.y-10));\n guideLineX1.add(new paper.Point(guideX+10, guideLine.segments[0].point.y+10));\n let guideLineX2 = new paper.Path();\n guideLineX2.strokeColor = \"#ffffff\";\n guideLineX2.strokeWidth = 3;\n guideLineX2.add(new paper.Point(guideX-10, guideLine.segments[0].point.y+10));\n guideLineX2.add(new paper.Point(guideX+10, guideLine.segments[0].point.y-10));\n\n const drawType = type===\"tacketed\"? \"TACKET\" : \"SEWING\";\n let guideText = new paper.PointText({\n content: \"DRAW \" + drawType + \" LINE\",\n point: [guideX+20, targetGroup.path.bounds.y + guideY - 20],\n fillColor: \"#000000\",\n fontSize: 12,\n });\n let guideTextRectangle = new paper.Rectangle(\n new paper.Point(guideX+15, targetGroup.path.bounds.y + guideY - 35),\n new paper.Size(guideText.bounds.width + 10, guideText.bounds.height + 5)\n );\n let guideTextBackground = new paper.Path.Rectangle(guideTextRectangle);\n guideTextBackground.fillColor = \"rgba(255,255,255,0.75)\";\n this.groupTacketGuideLine.addChild(guideLine);\n this.groupTacketGuideLine.addChild(guideLineArrow);\n this.tacketToolOriginalPosition = this.groupTacketGuideLine.position.x;\n this.groupTacketGuide.addChild(this.groupTacketGuideLine);\n this.groupTacketGuide.addChild(guideTextBackground);\n this.groupTacketGuide.addChild(guideText);\n this.groupTacketGuide.addChild(guideLineX1);\n this.groupTacketGuide.addChild(guideLineX2);\n },\n deactivateTacketTool: function() {\n this.tacketToolIsActive = false;\n this.groupTacketGuide.removeChildren();\n if (this.tool) {\n this.tool.remove();\n }\n document.body.style.cursor = \"default\";\n this.paperGroups.forEach((group)=>group.setMouseEventHandlers());\n this.paperLeaves.forEach((leaf)=>leaf.setMouseEventHandlers());\n },\n drawSewing: function() {\n this.paperGroups.forEach((group)=> {\n if (group.group.sewing!==null && group.group.sewing.length>0) {\n const leafID1 = group.group.sewing[0];\n const leafID2 = group.group.sewing.length>1? group.group.sewing[1] : undefined;\n\n if (leafID1!==undefined && this.leafIDs.indexOf(leafID1)>=0) {\n let startX, startY, endX, endY;\n let paperLeaf1, paperLeaf2;\n\n paperLeaf1 = this.getLeaf(this.leafIDs.indexOf(leafID1)+1);\n if (leafID2!==undefined) {\n paperLeaf2 = this.getLeaf(this.leafIDs.indexOf(leafID2)+1);\n startX = paperLeaf1.path.segments[0].point.x-this.strokeWidth;\n startY = paperLeaf2.path.segments[0].point.y;\n endX = paperLeaf2.path.segments[0].point.x;\n } else {\n startX = 15;\n startY = paperLeaf1.path.segments[0].point.y;\n endX = paperLeaf1.path.segments[0].point.x;\n }\n if (group.group.tacketed!==null && group.group.tacketed.length>0) {\n startY -= this.spacing*0.15;\n }\n endY = startY;\n let sewingPath = new paper.Path();\n sewingPath.name = \"tacket1\";\n sewingPath.strokeColor = this.strokeColorTacket;\n sewingPath.strokeWidth = 3;\n sewingPath.add(new paper.Point(startX, startY));\n sewingPath.add(new paper.Point(endX+this.strokeWidth, endY));\n const that = this;\n // Add listeners\n sewingPath.onClick = function(event) {\n that.handleObjectClick(group.group, event);\n }\n sewingPath.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n sewingPath.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n this.groupTacket.addChild(sewingPath);\n }\n }\n });\n },\n drawTackets: function() {\n this.paperGroups.forEach((group)=> {\n if (group.group.tacketed!==null && group.group.tacketed.length>0) {\n const leafID1 = group.group.tacketed[0];\n const leafID2 =group.group.tacketed[1];\n if (leafID1!==undefined && this.leafIDs.indexOf(leafID1)>=0) {\n let startX, startY, endX, endY;\n let paperLeaf1, paperLeaf2;\n\n paperLeaf1 = this.getLeaf(this.leafIDs.indexOf(leafID1)+1);\n if (leafID2!==undefined) {\n paperLeaf2 = this.getLeaf(this.leafIDs.indexOf(leafID2)+1);\n startX = paperLeaf1.path.segments[0].point.x-this.strokeWidth;\n startY = paperLeaf2.path.segments[0].point.y;\n endX = paperLeaf2.path.segments[0].point.x;\n } else {\n startX = 15;\n startY = paperLeaf1.path.segments[0].point.y;\n endX = paperLeaf1.path.segments[0].point.x;\n }\n if (group.group.tacketed!==null && group.group.tacketed.length>0) {\n startY -= this.spacing*0.2;\n }\n if (group.group.sewing!==null && group.group.sewing.length>0) {\n startY += this.spacing*0.25;\n }\n endY = startY;\n let tacketPath1 = new paper.Path();\n tacketPath1.name = \"tacket1\";\n tacketPath1.strokeColor = this.strokeColorTacket;\n tacketPath1.strokeWidth = 3;\n tacketPath1.add(new paper.Point(startX, startY-2));\n tacketPath1.add(new paper.Point(endX+this.strokeWidth, endY-2));\n tacketPath1.add(new paper.Point(tacketPath1.segments[1].point.x+5, tacketPath1.segments[1].point.y-3));\n let tacketPath2 = new paper.Path();\n tacketPath2.name = \"tacket2\";\n tacketPath2.strokeColor = this.strokeColorTacket;\n tacketPath2.strokeWidth = 3;\n tacketPath2.add(new paper.Point(startX, startY+2));\n tacketPath2.add(new paper.Point(endX+this.strokeWidth, endY+2));\n tacketPath2.add(new paper.Point(tacketPath2.segments[1].point.x+5, tacketPath2.segments[1].point.y+3));\n const that = this;\n // Add listeners\n tacketPath1.onClick = function(event) {\n that.handleObjectClick(group.group, event);\n }\n tacketPath2.onClick = function(event) {\n that.handleObjectClick(group.group, event);\n }\n tacketPath1.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n tacketPath1.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n tacketPath2.onMouseEnter = function(event) {\n document.body.style.cursor = \"pointer\";\n }\n tacketPath2.onMouseLeave = function(event) {\n document.body.style.cursor = \"default\";\n }\n this.groupTacket.addChild(tacketPath1);\n this.groupTacket.addChild(tacketPath2);\n }\n }\n });\n },\n getYOfFirstMember: function(groupID) {\n let group = this.Groups[groupID];\n if (group.memberIDs.length===0) {\n let y = this.groupYs[this.groupIDs.indexOf(group.id)];\n return y;\n } \n let firstMemberID = group.memberIDs[0];\n let firstMember = this[firstMemberID.split(\"_\")[0]+\"s\"][firstMemberID];\n if (firstMemberID.memberType===\"Group\") {\n return this.getYOfFirstMember(firstMemberID);\n } else {\n let firstLeafY = this.leafYs[this.leafIDs.indexOf(firstMember.id)];\n return firstLeafY;\n }\n },\n getYOfLastMember: function(groupID) {\n const group = this.Groups[groupID];\n const lastMember = this.getLastMember(groupID);\n if (lastMember && lastMember.memberType===\"Group\") {\n let y = this.groupYs[this.groupIDs.indexOf(lastMember.id)];\n return y+((lastMember.nestLevel-group.nestLevel)*this.spacing);\n } else if (lastMember && lastMember.memberType===\"Leaf\") {\n let lastLeafY = this.leafYs[this.leafIDs.indexOf(lastMember.id)] + this.strokeWidth + this.spacing/2.0;\n return lastLeafY+((lastMember.nestLevel-group.nestLevel-1)*this.spacing);\n } else {\n return 0;\n }\n },\n getLastMember: function(groupID) {\n let lastMemberIDs = this.Groups[groupID].memberIDs;\n if (lastMemberIDs.length===0) return null;\n let lastMemberID = lastMemberIDs[lastMemberIDs.length-1];\n if (lastMemberID.charAt(0)===\"L\") {\n return this.Leafs[lastMemberID];\n } else {\n let lastMember = this.Groups[lastMemberID];\n // Check if this group has members\n let innerLastMember = this.getLastMember(lastMemberID);\n if (innerLastMember) lastMember = innerLastMember;\n return lastMember;\n }\n }, \n getGroupHeight: function(group) {\n if (group.memberIDs.length>0) {\n let height = this.getYOfLastMember(group.id) - this.groupYs[this.groupIDs.indexOf(group.id)];\n return height+this.spacing;\n } else {\n return this.spacing;\n }\n },\n numLeaves: function() {\n return this.paperLeaves.length;\n },\n getLeaf: function(leaf_order) {\n return this.paperLeaves[leaf_order-1];\n },\n getLastLeaf: function() {\n return this.paperLeaves[this.numLeaves()-1];\n },\n calculateYs: function(members, currentY, spacing) {\n if (members.length<1) {\n return currentY;\n }\n let multiplier = 1; \n if (members.length>70) {\n multiplier = 0.5;\n } else if (members.length>45) {\n multiplier = 0.6;\n } else if (members.length>35 || this.viewingMode) {\n multiplier = 0.8;\n }\n members.forEach((memberID, i)=> {\n let memberObject = this[memberID.split(\"_\")[0]+\"s\"][memberID];\n let termsToShowAbove = memberObject.terms.filter((termID)=>{return this.Terms[termID].show&&this.showTerms}).length;\n let termsToShowBelow = 0;\n let glueSpacing = 0;\n if (memberObject.memberType===\"Leaf\") {\n // Find if it has side terms\n termsToShowAbove += this.Rectos[memberObject.rectoID].terms.filter((termID)=>{return this.Terms[termID].show&&this.showTerms}).length;\n termsToShowBelow += this.Versos[memberObject.versoID].terms.filter((termID)=>{return this.Terms[termID].show&&this.showTerms}).length;\n // Find if leaf has glue that's not a partial glue\n glueSpacing = (termsToShowAbove>0 && memberObject.attached_above.includes(\"Glued\") && !memberObject.attached_above.includes(\"Partial\"))? 1 : 0;\n }\n \n if (memberObject.memberType === \"Leaf\" && getMemberOrder(memberObject, this.Groups, this.groupIDs)===1 && termsToShowAbove>0) {\n // First leaf in the group with a term\n this.multipliers[this.leafIDs.indexOf(memberObject.id)+1] = multiplier;\n currentY = currentY + spacing*(termsToShowAbove+1);\n this.leafYs.push(currentY);\n currentY = currentY + spacing*termsToShowBelow*0.8;\n if (i===(members.length-1)) {\n // Last member of group\n currentY = currentY + (memberObject.nestLevel)*spacing;\n }\n } else if (memberObject.memberType===\"Leaf\" && this.leafIDs.indexOf(memberObject.id)+1 > 0) {\n this.multipliers[this.leafIDs.indexOf(memberObject.id)+1] = multiplier;\n currentY = currentY + spacing*(Math.max(1,termsToShowAbove)) + spacing*glueSpacing;\n if (i > 0 && members[i-1].includes(\"Group\") && this.Groups[members[i-1]].memberIDs.length) {\n // Previous sibling is a group with children\n // Find difference of nest level between current leaf and previous group's last member\n const previousMember = this.getLastMember(members[i-1]);\n currentY = currentY + (previousMember.nestLevel - memberObject.nestLevel)*spacing;\n }\n this.leafYs.push(currentY); \n currentY = currentY + spacing*termsToShowBelow*0.8;\n } else if (memberObject.memberType===\"Group\") {\n currentY = currentY + spacing;\n if (i > 0 && members[i-1].includes(\"Group\") && this.Groups[members[i-1]].memberIDs.length>0) {\n // Previous sibling is a group with children\n const previousMember = this.getLastMember(members[i-1]);\n currentY = currentY + (previousMember.nestLevel - memberObject.nestLevel + 1)*spacing;\n } else if (i > 0 && members[i-1].includes(\"Group\")&& this.Groups[members[i-1]].memberIDs.length===0) {\n // Previous sibling is a group without children\n currentY = currentY + spacing;\n }\n this.groupYs.push(currentY);\n\n // Recursify!!!\n currentY = this.calculateYs(memberObject.memberIDs, currentY, spacing);\n }\n });\n return currentY;\n },\n fitCanvas: function() {\n // Resize canvas so that nothing is cut off\n this.canvas.height = this.groupGroups.bounds.bottom+10;\n },\n setWidth: function(value) {\n this.width = value;\n },\n setProject: function(project) {\n this.groupIDs = project.groupIDs;\n this.leafIDs = project.leafIDs;\n this.Groups = project.Groups;\n this.Leafs = project.Leafs;\n this.Rectos = project.Rectos;\n this.Versos = project.Versos;\n this.Terms = project.Terms;\n },\n setActiveGroups: function(value) {\n this.activeGroups = value;\n if (this.paperGroups.length>0) {\n this.paperGroups.forEach((group)=>{\n group.deactivate();\n });\n this.paperGroups.forEach((paperGroup)=> {\n if (this.activeGroups.includes(paperGroup.group.id)) {\n paperGroup.activate();\n }\n });\n }\n },\n setActiveLeafs: function(value) {\n this.activeLeafs = value;\n if (this.paperLeaves.length>0) {\n this.paperLeaves.forEach((leaf)=>{\n leaf.deactivate();\n });\n this.paperLeaves.forEach((paperLeaf)=> {\n if (this.activeLeafs.includes(paperLeaf.leaf.id)) {\n paperLeaf.activate();\n }\n });\n }\n },\n setActiveRectos: function(value) {\n this.activeRectos = value;\n if (this.paperLeaves.length>0) {\n this.paperLeaves.forEach((leaf)=>{\n leaf.deactivate();\n });\n this.paperLeaves.forEach((paperLeaf)=> {\n if (this.activeRectos.includes(paperLeaf.leaf.rectoID)) {\n paperLeaf.activate();\n }\n });\n }\n },\n setActiveVersos: function(value) {\n this.activeVersos = value;\n if (this.paperLeaves.length>0) {\n this.paperLeaves.forEach((leaf)=>{\n leaf.deactivate();\n });\n this.paperLeaves.forEach((paperLeaf)=> {\n if (this.activeVersos.includes(paperLeaf.leaf.versoID)) {\n paperLeaf.activate();\n }\n });\n }\n },\n setFlashItems: function(value) {\n this.flashItems = value;\n },\n setFilter: function(filters) {\n this.filters = filters;\n this.showFilter();\n },\n showFilter: function() {\n this.paperLeaves.forEach((leaf)=>{\n leaf.filterHighlight.opacity = 0;\n if (this.filters.Leafs.includes(leaf.leaf.id) \n || this.filters.Sides.includes(leaf.leaf.rectoID)\n || this.filters.Sides.includes(leaf.leaf.versoID)) {\n leaf.filterHighlight.opacity = 1;\n }\n });\n this.paperGroups.forEach((group)=>{\n group.filterHighlight.opacity = 0;\n if (this.filters.Groups.includes(group.group.id)) {\n group.filterHighlight.opacity = 1;\n }\n });\n },\n setVisibility: function(visibleAttributes) {\n this.visibleAttributes = visibleAttributes;\n this.paperGroups.forEach((group)=>group.setVisibility(visibleAttributes.group));\n this.paperLeaves.forEach((leaf)=>leaf.setVisibility(visibleAttributes));\n },\n setScale: function(spacing, strokeWidth) {\n this.spacing = this.width*spacing;\n this.strokeWidth = this.width*strokeWidth;\n },\n}\nfunction PaperManager(args) {\n this.canvas = document.getElementById(args.canvasID);\n paper.setup(this.canvas);\n this.tool = null;\n this.allGroupIDs = args.allGroupIDs;\n this.allLeafIDs = args.allLeafIDs;\n this.groupIDs = args.groupIDs;\n this.leafIDs = args.leafIDs;\n this.Groups = args.Groups;\n this.Leafs = args.Leafs;\n this.Rectos = args.Rectos;\n this.Versos = args.Versos;\n this.Terms = args.Terms;\n this.origin = args.origin;\n this.width = paper.view.viewSize.width;\n this.spacing = this.width*args.spacing;\n this.strokeWidth = this.width*args.strokeWidth;\n this.strokeColor = args.strokeColor;\n this.strokeColorActive = args.strokeColorActive;\n this.strokeColorAdded = args.strokeColorAdded;\n this.strokeColorGroupActive = args.strokeColorGroupActive;\n this.strokeColorTacket = args.strokeColorTacket;\n this.groupColor = args.groupColor;\n this.groupColorActive = args.groupColorActive;\n this.groupTextColor = args.groupTextColor;\n this.handleObjectClick = args.handleObjectClick;\n this.groupLeaves = new paper.Group();// Groups of leaf paths\n this.groupGroups = new paper.Group();// Group of group paths\n this.groupContainer = new paper.Group();\n this.activeGroups = args.activeGroups;\n this.activeLeafs = args.activeLeafs;\n this.activeRectos = args.activeRectos;\n this.activeVersos = args.activeVersos;\n this.paperLeaves = [];\n this.paperGroups = [];\n this.leafYs = [];\n this.groupYs = [];\n this.multipliers = {};\n this.flashItems = args.flashItems;\n this.flashLeaves = [];\n this.flashGroups = [];\n this.filters = args.filters;\n this.strokeColorFilter = args.strokeColorFilter;\n this.visibleAttributes = args.visibleAttributes;\n this.viewingMode = args.viewingMode;\n this.tacketLineDrag = new paper.Path();\n this.groupTacketGuide = new paper.Group();\n this.groupTacketGuideLine = new paper.Group();\n this.groupTacket = new paper.Group();\n this.toggleVisualizationDrawing = args.toggleVisualizationDrawing;\n this.addVisualization = args.addVisualization;\n this.tacketToolIsActive = false;\n this.tacketToolOriginalPosition = 0;\n this.slideForward = true;\n this.openTermDialog = args.openTermDialog;\n this.leafIDs = args.leafIDs;\n this.showTerms = args.showTerms;\n\n let that = this;\n // Flash newly added items\n paper.view.onFrame = function(event) {\n for (let i=0; i that.tacketToolOriginalPosition+25) {\n that.slideForward = false;\n }\n } else {\n that.groupTacketGuideLine.position.x -= 0.5;\n if (that.groupTacketGuideLine.position.x < that.tacketToolOriginalPosition) {\n that.slideForward = true;\n }\n }\n }\n }\n}\nexport default PaperManager;\n","import React from 'react';\nimport PaperManager from \"../../assets/visualMode/export/PaperManager.js\";\n\n/** Contains the collation drawing in a canvas element */\nexport default class ExportMode extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n paperManagers: [],\n };\n }\n\n getChildrenByType = (type, memberIDs) => {\n let ids = [];\n for (let id of memberIDs) {\n if (id.includes(type)) ids.push(id);\n if (id.includes('Group')) {\n let itemMembers = this.props.project.Groups[id].memberIDs;\n ids = [...ids, ...this.getChildrenByType(type, itemMembers)];\n }\n }\n return ids;\n }\n\n componentDidMount() {\n this.props.toggleVisualizationDrawing({type:\"tacketed\", value: \"\"});\n this.props.toggleVisualizationDrawing({type:\"sewing\", value: \"\"});\n window.addEventListener(\"resize\", this.drawOnCanvas);\n this.updatePM();\n }\n\n componentWillUnmount() {\n this.props.toggleVisualizationDrawing({type:\"tacketed\", value: \"\"});\n this.props.toggleVisualizationDrawing({type:\"sewing\", value: \"\"});\n // this.state.paperManager.deactivateTacketTool();\n window.removeEventListener(\"resize\", this.drawOnCanvas);\n }\n\n shouldComponentUpdate(nextProps) {\n return (this.props.project.Groups!==nextProps.project.Groups || \n this.props.project.Sides!==nextProps.project.Sides || \n this.props.project.Rectos!==nextProps.project.Rectos || \n this.props.project.Versos!==nextProps.project.Versos ||\n this.props.project.Terms!==nextProps.project.Terms ||\n this.props.collationManager.selectedObjects!==nextProps.collationManager.selectedObjects ||\n this.props.collationManager.flashItems !== nextProps.collationManager.flashItems ||\n this.props.collationManager.filters !== nextProps.collationManager.filters ||\n this.props.project.preferences !== nextProps.project.preferences ||\n this.props.tacketed !== nextProps.tacketed || \n this.props.sewing !== nextProps.sewing ||\n this.props.showTerms !== nextProps.showTerms\n );\n }\n\n componentDidUpdate() {\n this.updatePM();\n }\n\n updatePM = () => {\n let pm = [];\n for (let [i, [groupID, group]] of Object.entries(this.props.project.Groups).entries()) {\n if (group.nestLevel > 1) continue;\n // Filter leaf ids for this group only\n let memberLeafIDs = this.getChildrenByType('Leaf', group.memberIDs);\n let memberGroupIDs = this.getChildrenByType('Group', group.memberIDs);\n let memberGroups = {};\n memberGroups[groupID] = this.props.project.Groups[groupID];\n for (let id of memberGroupIDs) {\n memberGroups[id] = this.props.project.Groups[id];\n }\n pm.push(\n new PaperManager({\n canvasID: 'canvas'+i,\n origin: 0,\n spacing: 0.04,\n strokeWidth: 0.015,\n strokeColor: 'rgb(82,108,145)',\n strokeColorActive: 'rgb(78,214,203)',\n strokeColorGroupActive: 'rgb(82,108,145)',\n strokeColorFilter: '#95fff6',\n strokeColorAdded: \"#5F95D6\",\n groupColor: '#e7e7e7',\n groupColorActive: 'rgb(78,214,203)',\n groupTextColor: \"#727272\",\n strokeColorTacket: \"#4e4e4e\",\n handleObjectClick: this.props.handleObjectClick,\n groupIDs: [this.props.project.groupIDs[i], ...memberGroupIDs],\n leafIDs: memberLeafIDs,\n allLeafIDs: this.props.project.leafIDs,\n allGroupIDs: this.props.project.groupIDs,\n Groups: memberGroups,\n Leafs: this.props.project.Leafs,\n Rectos: this.props.project.Rectos,\n Versos: this.props.project.Versos,\n Terms: this.props.project.Terms,\n activeGroups: this.props.collationManager.selectedObjects.type===\"Group\"? this.props.collationManager.selectedObjects.members : [],\n activeLeafs: this.props.collationManager.selectedObjects.type===\"Leaf\"? this.props.collationManager.selectedObjects.members : [],\n activeRectos: this.props.collationManager.selectedObjects.type===\"Recto\"? this.props.collationManager.selectedObjects.members : [],\n activeVersos: this.props.collationManager.selectedObjects.type===\"Verso\"? this.props.collationManager.selectedObjects.members : [],\n flashItems: this.props.collationManager.flashItems,\n filters: this.props.collationManager.filters,\n visibleAttributes: this.props.project.preferences,\n toggleVisualizationDrawing: this.props.toggleVisualizationDrawing,\n addVisualization: this.addVisualization,\n openTermDialog: this.props.openTermDialog,\n showTerms: this.props.showTerms\n })\n )\n }\n this.setState({paperManagers:pm}, ()=>{this.drawOnCanvas();});\n }\n\n addVisualization = (groupID, type, leafIDs) => {\n let updatedGroup = {\n [type]: leafIDs,\n }\n this.props.updateGroup(groupID, updatedGroup);\n }\n\n /**\n * Update canvas size based on current window size\n */\n updateCanvasSize = () => {\n // Resize the canvas\n let maxWidth = window.innerWidth-window.innerWidth*0.46;\n document.getElementById(\"myCanvas\").width=maxWidth;\n }\n \n /**\n * Draw canvas\n */\n drawOnCanvas = () => {\n // Create leaves through manager\n for (let i = 0; i < this.state.paperManagers.length; i++) {\n this.state.paperManagers[i].draw();\n }\n }\n \n render() {\n let canvases = [];\n let canvasAttr = {\n 'data-paper-hidpi': 'off',\n 'height': '500',\n 'width': window.innerWidth-window.innerWidth*0.46,\n };\n for (let [i, [, group]] of Object.entries(this.props.project.Groups).entries()) {\n if (group.nestLevel === 1) {\n canvases.push()\n }\n }\n return (\n
\n {canvases}\n
\n );\n }\n}\n","import React from 'react';\nimport OpenSeadragon from 'openseadragon';\nimport UUID from 'uuid';\nimport BlankPage from '../../assets/blank_page.png';\n\n/** Image viewing component (OpenSeaDragon) */\nexport default class ImageViewer extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n suffixedID: 'openseadragon-' + UUID.v4(),\n osd: null\n }\n }\n\n componentDidMount() {\n var tilesSources = [];\n // .+?(?=full)\n // https://exhibits.library.stonybrook.edu/iiif-img/3/5846/full/800,476/0/default.jpg\n if (this.props.rectoURL && !this.props.isRectoDIY) {\n tilesSources.push(this.getInfoURL(this.props.rectoURL));\n } else if (this.props.rectoURL && this.props.isRectoDIY) {\n tilesSources.push({type: \"image\", url: this.props.rectoURL});\n }\n if (this.props.versoURL && !this.props.isVersoDIY) {\n tilesSources.push(this.getInfoURL(this.props.versoURL))\n } else if (this.props.versoURL && this.props.isVersoDIY) {\n tilesSources.push({type: \"image\", url: this.props.versoURL});\n }\n if (!this.props.rectoURL && !this.props.versoURL) tilesSources = [{type: \"image\", url: BlankPage}];\n this.setState({\n osd: OpenSeadragon({\n id: this.state.suffixedID,\n prefixUrl: 'https://cdnjs.cloudflare.com/ajax/libs/openseadragon/2.4.2/images/',\n showNavigationControl: true,\n showFullPageControl: false,\n showRotationControl: true,\n showNavigator: true,\n collectionMode: true,\n collectionRows: 1,\n collectionTileMargin: 1,\n crossOriginPolicy: 'Anonymous',\n navImages: {\n zoomIn: {\n REST: \"zoomin_rest.png\",\n GROUP: \"zoomin_grouphover.png\",\n HOVER: \"zoomin_hover.png\",\n DOWN: \"zoomin_pressed.png\"\n },\n zoomOut: {\n REST: \"zoomout_rest.png\",\n GROUP: \"zoomout_grouphover.png\",\n HOVER: \"zoomout_hover.png\",\n DOWN: \"zoomout_pressed.png\"\n },\n home: {\n REST: \"home_rest.png\",\n GROUP: \"home_grouphover.png\",\n HOVER: \"home_hover.png\",\n DOWN: \"home_pressed.png\"\n },\n rotateleft: {\n REST: \"rotateleft_rest.png\",\n GROUP: \"rotateleft_grouphover.png\",\n HOVER: \"rotateleft_hover.png\",\n DOWN: \"rotateleft_pressed.png\"\n },\n rotateright: {\n REST: \"rotateright_rest.png\",\n GROUP: \"rotateright_grouphover.png\",\n HOVER: \"rotateright_hover.png\",\n DOWN: \"rotateright_pressed.png\"\n }\n },\n tileSources: tilesSources\n })\n });\n }\n\n componentWillUpdate(nextProps) {\n this.addTiles(nextProps.isRectoDIY, nextProps.isVersoDIY, nextProps.rectoURL, nextProps.versoURL);\n }\n\n getInfoURL(url) {\n if (url.includes(\"full\")) {\n return /.+?(?=\\/full)/.exec(url)[0] + '/info.json'\n } else {\n return url + '/info.json'\n }\n }\n\n addTiles(rDIY, vDIY, r, v) {\n if (this.state.osd) {\n let tilesSources = [];\n if (r && !rDIY) {\n tilesSources.push(this.getInfoURL(r))\n } else if (r && rDIY) {\n tilesSources.push({type: \"image\", url: r});\n }\n if (v && !vDIY) {\n tilesSources.push(this.getInfoURL(v))\n } else if (v && vDIY) {\n tilesSources.push({type: \"image\", url: v});\n }\n if (!r && !v) tilesSources = [{type: \"image\", url: BlankPage}];\n this.state.osd.open(tilesSources);\n }\n }\n\n render() {\n let style = {width: \"100%\", height: \"500px\", background: this.props.backgroundColor? this.props.backgroundColor:\"black\"};\n if (this.props.fixed) style = {position: \"fixed\", width:\"42.5%\",height:\"82%\", left: \"30%\", background: 'black', padding: 5};\n return (\n
\n
\n );\n }\n}\n","import React from 'react';\nimport PaperManager from \"../../assets/visualMode/PaperManager.js\";\nimport ImageViewer from \"../global/ImageViewer\";\n\n/** Contains the collation drawing in a canvas element */\nexport default class ViewingMode extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n paperManager: {},\n };\n }\n\n componentDidMount() {\n window.addEventListener(\"resize\", this.drawOnCanvas);\n this.setState({\n paperManager: new PaperManager({\n canvasID: 'myCanvas',\n origin: 0,\n spacing: 0.04,\n strokeWidth: 0.015,\n strokeColor: 'rgb(82,108,145)',\n strokeColorActive: 'rgb(78,214,203)',\n strokeColorGroupActive: 'rgb(82,108,145)',\n strokeColorFilter: '#95fff6',\n strokeColorAdded: \"#5F95D6\",\n groupColor: '#e7e7e7',\n groupColorActive: 'rgb(78,214,203)',\n groupTextColor: \"#727272\",\n strokeColorTacket: \"#4e4e4e\",\n handleObjectClick: this.props.handleObjectClick,\n groupIDs: this.props.project.groupIDs,\n leafIDs: this.props.project.leafIDs,\n Groups: this.props.project.Groups,\n Leafs: this.props.project.Leafs,\n Rectos: this.props.project.Rectos,\n Versos: this.props.project.Versos,\n Terms: this.props.project.Terms,\n activeGroups: this.props.collationManager.selectedObjects.type===\"Group\"? this.props.collationManager.selectedObjects.members : [],\n activeLeafs: this.props.collationManager.selectedObjects.type===\"Leaf\"? this.props.collationManager.selectedObjects.members : [],\n activeRectos: this.props.collationManager.selectedObjects.type===\"Recto\"? this.props.collationManager.selectedObjects.members : [],\n activeVersos: this.props.collationManager.selectedObjects.type===\"Verso\"? this.props.collationManager.selectedObjects.members : [],\n flashItems: this.props.collationManager.flashItems,\n filters: this.props.collationManager.filters,\n visibleAttributes: this.props.project.preferences,\n toggleTacket: this.props.toggleTacket,\n addTacket: this.addTacket,\n viewingMode: true,\n notationStyle: this.props.project.notationStyle,\n })\n }, ()=>{this.drawOnCanvas();});\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return (\n this.props.collationManager.selectedObjects!==nextProps.collationManager.selectedObjects ||\n this.props.collationManager.filters !== nextProps.collationManager.filters ||\n this.props.project.preferences !== nextProps.project.preferences ||\n this.props.project.Terms!==nextProps.project.Terms ||\n this.state.viewingMode !== nextState.viewingMode ||\n this.props.imageViewerEnabled !== nextProps.imageViewerEnabled\n );\n }\n\n componentWillUpdate(nextProps, nextState) {\n if (Object.keys(this.state.paperManager).length>0) {\n this.state.paperManager.setProject(nextProps.project);\n this.state.paperManager.setActiveGroups(nextProps.collationManager.selectedObjects.type===\"Group\"? nextProps.collationManager.selectedObjects.members : []);\n this.state.paperManager.setActiveLeafs(nextProps.collationManager.selectedObjects.type===\"Leaf\"? nextProps.collationManager.selectedObjects.members : []);\n this.state.paperManager.setActiveRectos(nextProps.collationManager.selectedObjects.type===\"Recto\"? nextProps.collationManager.selectedObjects.members : []);\n this.state.paperManager.setActiveVersos(nextProps.collationManager.selectedObjects.type===\"Verso\"? nextProps.collationManager.selectedObjects.members : []);\n this.state.paperManager.setFilter(nextProps.collationManager.filters);\n this.state.paperManager.setVisibility(nextProps.project.preferences);\n }\n }\n\n componentDidUpdate() {\n this.drawOnCanvas();\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.drawOnCanvas);\n }\n\n /**\n * Draw canvas\n */\n drawOnCanvas = () => {\n // Create leaves through manager\n this.updateCanvasSize();\n this.state.paperManager.draw();\n }\n /**\n * Update canvas size based on current window size\n */\n updateCanvasSize = () => {\n // Resize the canvas\n let maxWidth = window.innerWidth-window.innerWidth*0.46;\n if (this.props.imageViewerEnabled) {\n maxWidth = window.innerWidth-window.innerWidth*0.75;\n }\n document.getElementById(\"myCanvas\").width=maxWidth;\n this.state.paperManager.setWidth(maxWidth);\n if (this.props.imageViewerEnabled) {\n this.state.paperManager.setScale(0.06, 0.027);\n } else {\n this.state.paperManager.setScale(0.04, 0.015);\n }\n }\n \n render() {\n let canvasAttr = {\n 'data-paper-hidpi': 'off',\n 'height': \"99999999px\",\n 'width': this.props.imageViewerEnabled? window.innerWidth-window.innerWidth*0.75: window.innerWidth-window.innerWidth*0.46,\n };\n\n let leafID, leaf, recto, verso, isRectoDIY, isVersoDIY, rectoURL, versoURL;\n if (this.props.selectedObjects.type===\"Leaf\"){\n leafID = this.props.selectedObjects.members[0];\n leaf = this.props.project.Leafs[leafID];\n recto = this.props.project.Rectos[leaf.rectoID];\n verso = this.props.project.Versos[leaf.versoID];\n } else if (this.props.selectedObjects.type===\"Recto\") {\n recto = this.props.project.Rectos[this.props.selectedObjects.members[0]];\n } else if (this.props.selectedObjects.type===\"Verso\") {\n verso = this.props.project.Versos[this.props.selectedObjects.members[0]];\n }\n isRectoDIY = recto!==undefined && recto.image.manifestID!==undefined && recto.image.manifestID.includes(\"DIY\");\n isVersoDIY = verso!==undefined && verso.image.manifestID!==undefined && verso.image.manifestID.includes(\"DIY\");\n rectoURL = recto!==undefined && recto.image.url!==undefined? recto.image.url : null;\n versoURL = verso!==undefined && verso.image.url!==undefined? verso.image.url : null;\n return (\n
\n
\n \n \n
\n {this.props.imageViewerEnabled?\n \n :\"\"\n }\n
\n );\n }\n}\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport fileDownload from 'js-file-download';\nimport copy from 'copy-to-clipboard';\nimport IconCopy from 'material-ui/svg-icons/content/content-copy';\nimport IconDownload from 'material-ui/svg-icons/file/file-download';\nimport IconButton from 'material-ui/IconButton';\nimport JSZip from 'jszip';\nimport saveAs from 'file-saver';\n\n/** Dialog to export collation to JSON, XML or PNG */\nconst Export = props => {\n const filename = props.projectTitle.replace(/\\s/g, '_');\n const actions = [\n }\n style={\n props.exportedImages\n ? { marginRight: 10 }\n : { display: 'none' }\n }\n onClick={() => {\n downloadZip();\n }}\n />,\n }\n style={props.exportedType === 'xml' ? { marginRight: 10 } : { display: 'none' }}\n onClick={() => fileDownload(props.exportedData, `${filename}.${props.exportedType}`)}\n />,\n }\n style={\n props.exportedImages ||\n props.exportedType === 'xml' ||\n props.exportedType === 'share'\n ? { display: 'none' }\n : { marginRight: 10 }\n }\n onClick={() =>\n downloadZip()\n }\n />,\n props.handleExportToggle(false)}\n keyboardFocused\n />,\n ];\n\n const downloadZip = () => {\n fetch(props.exportedImages)\n .then(function (response) {\n if (response.status === 200 || response.status === 0) {\n return Promise.resolve(response.blob());\n } else {\n return Promise.reject(new Error(response.statusText));\n }\n })\n .then(JSZip.loadAsync)\n .then(function (zip) {\n zip.generateAsync({ type: 'blob' }).then(\n function (blob) {\n saveAs(blob, `${props.projectID}_${props.exportedType}.zip`);\n },\n function (err) {\n console.log('error saving zip file!');\n }\n );\n });\n };\n\n const exportedData =\n props.exportedType !== 'png' ? (\n \n {\n copy(\n props.exportedType === 'share'\n ? window.location.href + '/viewOnly'\n : props.exportedData\n );\n props.showCopyToClipboardNotification();\n }}\n >\n \n \n
\n                   { props.exportedType === 'share' && window.location.href + '/viewOnly' }\n                
\n\n {props.exportedType === 'svg' ? (\n //
\n // {Array.from(props.exportedData)\n // .map((value, index) => {\n // return (\n // \n // );\n // })}\n //
\n
Please download your SVGs below.
\n ) : (\n
{props.exportedData}
\n )}\n \n ) : (\n
\n Please download your PNGs below.\n\n
\n \n
\n
\n );\n return (\n props.handleExportToggle(false)}\n contentStyle={{ maxWidth: 1000 }}\n >\n {props.label === 'XML' ? (\n

\n Note: custom folio numbers and page numbers will be\n lost when exporting to XML format. If you wish to preserve all\n collation data, please choose JSON export.\n

\n ) : (\n ''\n )}\n {props.label === 'Share this project' ? (\n

The URL below shows the view-only mode of your project.

\n ) : (\n ''\n )}\n {exportedData}\n \n );\n};\n\nexport default Export;\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton';\nimport TextField from 'material-ui/TextField';\nimport IconButton from 'material-ui/IconButton';\nimport AddCircle from 'material-ui/svg-icons/content/add-circle';\nimport RemoveCircle from 'material-ui/svg-icons/content/remove-circle-outline';\nimport light from '../../../styles/light';\nimport { getMemberOrder } from '../../../helpers/getMemberOrder';\nimport SelectField from '../../global/SelectField';\n\n\n/** Dialog to add groups in a collation. This component is used in the visual and tabular edit modes. It is mounted by `InfoBox` and `GroupInfoBox` components. */\nexport default class AddGroupDialog extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n numberOfGroups: 1,\n hasLeaves: props.addLeafs || false,\n numberOfLeaves: 1,\n conjoin: false,\n oddLeaf: 2,\n copies: 1,\n location: 'inside',\n placementLocation: '',\n selectedChild: '',\n errorText: {\n numberOfGroups: '',\n numberOfLeaves: '',\n oddLeaf: '',\n copies: '',\n },\n memberOrder: 1,\n }\n };\n\n componentWillReceiveProps() {\n this.resetForm();\n }\n\n /**\n * Increment a state's value by one, bounded by `max` and `min`. If the user previously\n * entered an invalid value, the value is set to `min`.\n */\n incrementNumber = (name, min, max, e) => {\n if (e) e.preventDefault();\n let newCount = 0;\n if (!this.isNormalInteger(this.state[name])) {\n newCount = min;\n } else {\n newCount = Math.min(max, this.state[name] + 1);\n }\n let newState = { errorText: {} };\n newState[name] = (isNaN(newCount)) ? min : newCount;\n newState.errorText[name] = '';\n this.setState({ ...newState });\n }\n\n /**\n * Decrement a state by one, bounded by `max` and `min`. If the user previously\n * entered an invalid value, the value is set to min.\n */\n decrementNumber = (name, min, max, e) => {\n if (e) e.preventDefault();\n let newCount = Math.min(max, Math.max(min, this.state[name] - 1));\n let newState = { errorText: {} };\n newState[name] = (isNaN(newCount)) ? min : newCount;\n newState.errorText[name] = '';\n this.setState({ ...newState });\n }\n\n /**\n * get all children of a given group, including the children of child groups\n */\n getAllChildrenOfGroup = (inputGroupID) => {\n let allChildrenOfGroup = []\n let group = this.props.Groups[inputGroupID]\n group.memberIDs.forEach(memberID => {\n if (memberID[0] === 'L') {\n if (!allChildrenOfGroup.includes(memberID)) {\n allChildrenOfGroup.push(memberID);\n } else {\n allChildrenOfGroup.push(this.getAllChildrenOfGroup(memberID))\n }\n }\n })\n return allChildrenOfGroup;\n }\n\n countGroupChildren = (inputGroupID) => {\n let group = this.props.Groups[inputGroupID]\n let groupCount = 0;\n group.memberIDs.forEach(memberID => {\n if (memberID[0] === 'G') {\n groupCount++;\n // go into group\n groupCount += this.countGroupChildren(memberID)\n }\n })\n return groupCount;\n }\n\n /**\n * Generate group notation for dropdown.\n * Code here must mirror PaperGroup and Group model notation logic.\n */\n groupNotation = (group) => {\n // get all groups as base nest level\n let outerGroups = Object.values(this.props.Groups).filter(g => g.nestLevel === 1);\n let outerGroupIDs = outerGroups.map(g => g.id);\n let notation = '';\n if (group.nestLevel === 1) {\n // get index of current group within the context of all outer groups\n let groupOrder = outerGroupIDs.indexOf(group.id) + 1;\n notation = `${groupOrder}`;\n } else {\n // get parent of current group\n let parentGroup = this.props.Groups[group.parentID];\n // get children of parent group\n let parentGroupChildren = parentGroup.memberIDs.filter(g => g[0] === 'G');\n let subquireNotation = parentGroupChildren.indexOf(group.id) + 1;\n notation = `${this.groupNotation(parentGroup)}.${subquireNotation}`;\n }\n return notation;\n }\n\n /**\n * Validate user input. If invalid, display error message, otherwise update relevant state\n */\n onNumberChange = (name, value) => {\n let errorState = this.state.errorText;\n errorState[name] = '';\n if (!this.isNormalInteger(value)) {\n errorState[name] = 'Must be a number';\n } else {\n value = parseInt(value, 10);\n }\n if ((name === 'numberOfGroups' || name === 'copies') && (value < 1 || value > 99)) {\n errorState[name] = 'Number must be between 1 and 99';\n } else if (name === 'numberOfLeaves' && (value < 1 || value > 999)) {\n errorState[name] = 'Number must be between 1 and 999';\n } else if (name === 'oddLeaf' && (value < 1 || value > this.state.numberOfLeaves)) {\n errorState[name] = 'Number must be between 1 and ' + this.state.numberOfLeaves;\n }\n let newState = {};\n newState[name] = value;\n this.setState({ ...newState, errorText: errorState });\n }\n\n /**\n * Check if string is an integer\n */\n isNormalInteger = (str) => {\n return /^([1-9]\\d*)$/.test(str);\n }\n\n /**\n * Toggle a checkbox\n */\n onToggleCheckbox = (stateName, value) => {\n let newState = {};\n newState[stateName] = value;\n this.setState(newState);\n }\n\n /**\n * Change dropdown value\n */\n dropDownChange = (value, stateValue) => {\n if (Object.keys(this.props.selectedGroups).length === 1) {\n let updatedStateValue = {};\n updatedStateValue[stateValue] = value;\n this.setState(updatedStateValue);\n }\n }\n\n /**\n * Update location radio button group\n */\n onLocationChange = (value) => {\n this.setState({ location: value });\n ;\n }\n onPlacementLocationChange = (value) => {\n this.setState({ placementLocation: value });\n ;\n }\n /**\n * Returns next sibling of a group\n */\n getNextSibling = () => {\n let activeGroup = this.props.Groups[this.props.selectedGroups[0]];\n for (let groupID of this.props.groupIDs.slice(this.props.groupIDs.indexOf(activeGroup.id) + 1)) {\n const group = this.props.Groups[groupID]\n if (group.nestLevel === activeGroup.nestLevel)\n return group\n }\n return null;\n }\n\n /**\n * Returns the last child group\n */\n findLastChildGroup = (memberIDs) => {\n let lastGroup = null;\n for (let memberID of memberIDs) {\n if (memberID.charAt(0) === 'G') {\n const member = this.props.Groups[memberID]\n if (lastGroup === null || (this.props.groupIDs.indexOf(member.id) > this.props.groupIDs.indexOf(lastGroup.id))) {\n lastGroup = member;\n }\n if (member.memberIDs.length > 0) {\n let result = this.findLastChildGroup(member.memberIDs);\n if (result && this.props.groupIDs.indexOf(result.id) > this.props.groupIDs.indexOf(lastGroup.id)) lastGroup = result;\n }\n }\n }\n return lastGroup;\n }\n\n /**\n * Submit add group request\n */\n submit = () => {\n if (this.props.addLeafs || !this.isDisabled()) {\n let data = { group: {}, additional: {} };\n data.additional['noOfGroups'] = this.state.numberOfGroups;\n if (this.state.hasLeaves) {\n data.additional['noOfLeafs'] = this.state.numberOfLeaves;\n data.additional['conjoin'] = (this.state.numberOfLeaves > 1) ? this.state.conjoin : false;\n if (this.state.numberOfLeaves > 1 && this.state.conjoin && !(this.state.numberOfLeaves % 2 === 0)) {\n data.additional['oddMemberLeftOut'] = this.state.oddLeaf;\n }\n }\n if (this.props.selectedGroups.length === 0) {\n // Empty project. Add new group\n data.additional['order'] = 1;\n data.additional['memberOrder'] = 1;\n data.group['type'] = 'Quire';\n data.group['title'] = 'None';\n } else if (this.props.addLeafs) {\n // Add Leafs inside\n data = { leaf: {}, additional: { ...data.additional } };\n delete data.additional.noOfGroups\n data.leaf['project_id'] = this.props.projectID;\n data.leaf['parentID'] = this.props.selectedGroups[0];\n data.additional['memberOrder'] = 1;\n this.props.action.addLeafs(data);\n this.props.closeDialog();\n return;\n } else {\n // Add group(s)\n const group = this.props.Groups[this.props.selectedGroups[0]];\n let memberOrder = getMemberOrder(group, this.props.Groups, this.props.groupIDs);\n let groupOrder = this.props.groupIDs.indexOf(group.id) + 1;\n if (group.parentID) {\n // If active group is nested, the new group(s) must have the same parent as the active group\n data.additional['parentGroupID'] = group.parentID;\n }\n if (this.state.location === 'below') {\n // Add group below\n memberOrder += 1;\n let sibling = this.getNextSibling();\n if (sibling) {\n groupOrder = this.props.groupIDs.indexOf(sibling.id) + 1;\n } else {\n // No sibling..\n if (!group.parentID) {\n // Active group is a root group with no next sibling\n groupOrder = this.props.groupIDs.length + 1;\n } else {\n if (group.memberIDs.length > 0) {\n // Find the last child (possibly multi-nested)\n let lastChild = this.findLastChildGroup(group.memberIDs);\n if (lastChild === null) {\n groupOrder = this.props.groupIDs.indexOf(group.id) + 2;\n } else {\n groupOrder = this.props.groupIDs.indexOf(lastChild.id) + 2;\n }\n } else {\n // If no children\n groupOrder = groupOrder + 1;\n }\n }\n }\n } else if (this.state.location === 'inside') {\n // two values need to be calculated here. these values are memberOrder and groupOrder.\n // memberOrder represents the placement of the new group in context of it's parent group's memberIDs\n this.setState({ selectedChild: this.props.Groups[this.props.selectedGroups]['memberIDs'][0] })\n let selectedChildIndex = this.props.Groups[this.props.selectedGroups]['memberIDs'].indexOf(this.state.selectedChild)\n if (this.state.placementLocation === 'above') {\n memberOrder = selectedChildIndex + 1\n } else if (this.state.placementLocation === 'below') {\n memberOrder = selectedChildIndex + 2\n }\n //// determine groupOrder\n // generate an array of all groups and leaves in the project in order\n let orderedElements = []\n this.props.groupIDs.forEach(groupID => {\n if (!orderedElements.includes(groupID)) {\n orderedElements.push(groupID)\n // recursively get group children for nested subquires\n orderedElements.push(...this.getAllChildrenOfGroup(groupID))\n }\n })\n // find the user selected leaf/group in this array\n let selectedChildIndexInOrderedElements = orderedElements.indexOf(this.state.selectedChild)\n let orderedElementsSliced = []\n if (this.state.placementLocation === 'above') {\n orderedElementsSliced = orderedElements.slice(0, selectedChildIndexInOrderedElements)\n } else if (this.state.placementLocation === 'below') {\n orderedElementsSliced = orderedElements.slice(0, selectedChildIndexInOrderedElements + 1)\n }\n // count how many groups occur before this value in the array\n let groupCount = 0;\n orderedElementsSliced.forEach(member => {\n if (member[0] === 'G') {\n groupCount++;\n }\n })\n // add 1 to determine the new groupOrder\n if (this.state.selectedChild) {\n if (this.state.selectedChild[0] === 'G') {\n groupCount += this.countGroupChildren(this.state.selectedChild)\n }\n } else {\n groupCount = 1\n }\n groupOrder = groupCount + 1;\n data.additional['parentGroupID'] = group.id;\n }\n data.group = {\n title: 'None',\n type: 'Quire'\n };\n data.additional['memberOrder'] = memberOrder;\n data.additional['order'] = groupOrder;\n }\n data.group['project_id'] = this.props.projectID\n this.props.action.addGroups(data);\n this.props.closeDialog();\n this.setState({ location: 'below' });\n this.resetForm();\n }\n }\n\n\n /**\n * Return `true` if there are any errors in the input fields\n */\n isDisabled = () => {\n let copiesError = !(this.state.errorText.copies === undefined) && this.state.errorText.copies.length > 0;\n let numberOfGroupsError = !(this.state.errorText.numberOfGroups === undefined) && this.state.errorText.numberOfGroups.length > 0;\n let numberOfLeavesError = !(this.state.errorText.numberOfLeaves === undefined) && this.state.errorText.numberOfLeaves.length > 0;\n let oddLeafError = !(this.state.errorText.oddLeaf === undefined) && this.state.errorText.oddLeaf.length > 0;\n return this.state.location === '' || copiesError || numberOfGroupsError || numberOfLeavesError || oddLeafError;\n }\n\n /**\n * Reset state\n */\n resetForm = () => {\n this.setState({\n numberOfGroups: 1,\n hasLeaves: this.props.addLeafs || false,\n numberOfLeaves: 1,\n conjoin: false,\n oddLeaf: 2,\n copies: 1,\n location: this.props.selectedGroups.length > 0 ? '' : 'inside',\n placementLocation: '',\n selectedChild: this.props.Groups !== undefined ? this.props.Groups[this.props.selectedGroups[0]]['memberIDs'][0] : '',\n errorText: {\n numberOfGroups: '',\n numberOfLeaves: '',\n oddLeaf: '',\n copies: '',\n },\n memberOrder: 1,\n });\n }\n\n render() {\n const actions = [\n {\n this.props.closeDialog()\n }}\n style={{ width: '49%', marginRight: '1%', border: '1px solid #ddd' }}\n />,\n ,\n ];\n\n const styles = {\n radioButton: {\n marginBottom: 5,\n },\n };\n\n let conjoinOption = '';\n let oddLeaf = '';\n // let copies = \"\";\n let numberOfLeaves = '';\n if (this.state.hasLeaves) {\n numberOfLeaves =\n
\n
\n

Number of leaves

\n
\n
\n this.onNumberChange('numberOfLeaves', v)}\n style={{ width: '100px' }}\n inputStyle={{ textAlign: 'center' }}\n />\n this.decrementNumber('numberOfLeaves', 1, 999, e)}\n aria-label=\"Decrement number of leaves\"\n >\n \n \n this.incrementNumber('numberOfLeaves', 1, 999, e)}\n aria-label=\"Increment number of leaves\"\n >\n \n \n
\n
;\n }\n\n if (this.state.hasLeaves && this.state.numberOfLeaves > 1) {\n conjoinOption =\n
\n
\n

Conjoin leaves?

\n
\n
\n this.onToggleCheckbox('conjoin', !this.state.conjoin)}\n />\n
\n
\n }\n if (this.state.hasLeaves && this.state.conjoin && !(this.state.numberOfLeaves % 2 === 0)) {\n oddLeaf =\n
\n
\n

Odd leaf to not conjoin

\n
\n
\n this.onNumberChange('oddLeaf', v)}\n style={{ width: '100px' }}\n inputStyle={{ textAlign: 'center' }}\n />\n this.decrementNumber('oddLeaf', 1, this.state.numberOfLeaves, e)}\n aria-label=\"Decrement leaf number\"\n >\n \n \n this.incrementNumber('oddLeaf', 1, this.state.numberOfLeaves, e)}\n aria-label=\"Increment leaf number\"\n >\n \n \n
\n
\n }\n\n let numberOfGroups = this.state.location ?
\n
\n

Number of groups

\n
\n
\n this.onNumberChange('numberOfGroups', v)}\n style={{ width: '100px' }}\n inputStyle={{ textAlign: 'center' }}\n />\n this.decrementNumber('numberOfGroups', 1, 999, e)}\n >\n \n \n this.incrementNumber('numberOfGroups', 1, 999, e)}\n >\n \n \n
\n
: '';\n\n let radioButtonGroupHeader =

Add new group(s)

;\n let radioButtonGroup = this.onLocationChange(v)}>\n \n \n \n \n\n let addLeafsCheckbox = this.state.location !== '' ?
\n
\n

Add leaves inside?

\n
\n
\n this.onToggleCheckbox('hasLeaves', !this.state.hasLeaves)}\n />\n
\n
: '';\n let groupPosition = this.props.Groups !== undefined\n && this.props.Groups[this.props.selectedGroups[0]].memberIDs.length != 0\n && this.state.location === 'inside' ?
\n
\n Group position\n
\n\n
\n this.onPlacementLocationChange(v)}>\n \n \n \n
\n\n
\n this.dropDownChange(v, 'selectedChild')}\n value={this.props.Groups[this.props.selectedGroups[0]]['memberIDs'][0]}\n data={this.props.Groups[this.props.selectedGroups[0]]['memberIDs'].map((itemID) => {\n if (itemID[0] === 'L') {\n return { value: itemID, text: `Leaf ${this.props.leafIDs.indexOf(itemID) + 1}` }\n } else if (itemID[0] === 'G') {\n let groupType = this.props.Groups[itemID].type\n // quireNumber should be the notation value, which means we have to have\n // the notation logic here as well\n let groupNotation = this.groupNotation(this.props.Groups[itemID])\n return { value: itemID, text: `${groupType} ${groupNotation}` }\n }\n\n })}\n width={250}\n />\n
\n
: '';\n\n\n if (!this.props.selectedGroups) {\n radioButtonGroupHeader = '';\n radioButtonGroup = '';\n }\n\n if (this.props.selectedGroups.length === 0) {\n radioButtonGroup = '';\n }\n\n if (this.props.addLeafs) {\n numberOfGroups = '';\n radioButtonGroupHeader = '';\n radioButtonGroup = '';\n addLeafsCheckbox = '';\n }\n\n const dialog = (\n \n {radioButtonGroupHeader}\n {radioButtonGroup}\n {groupPosition}\n {numberOfGroups}\n {addLeafsCheckbox}\n {numberOfLeaves}\n {conjoinOption}\n {oddLeaf}\n \n );\n\n return (\n
\n {dialog}\n
\n );\n }\n}","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport {btnBase} from '../../../styles/button';\n\n/** Delete confirmation dialog for deleting group(s) and leaf(s) */\nexport default class DeleteConfirmationDialog extends React.Component {\n state = {\n open: false,\n windowWidth: window.innerWidth,\n };\n\n resizeHandler = () => {\n this.setState({windowWidth:window.innerWidth});\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.resizeHandler);\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.resizeHandler);\n }\n\n handleOpen = () => {\n this.setState({open: true});\n this.props.togglePopUp(true);\n };\n\n handleClose = () => {\n this.setState({open: false});\n this.props.togglePopUp(false);\n };\n\n containsTacketedLeaf = () => {\n if (this.props.memberType===\"Leaf\") {\n for (const leafID of this.props.selectedObjects) {\n const group = this.props.Groups[this.props.Leafs[leafID].parentID];\n if (\n (group.tacketed.length>0 && (group.tacketed[0]===leafID || (group.tacketed[1] && group.tacketed[1]===leafID)))\n ||\n (group.sewing.length>0 && (group.sewing[0]===leafID || (group.sewing[1] && group.sewing[1]===leafID)))\n ) return true;\n }\n }\n return false;\n }\n\n getTitle = () => {\n const memberType = this.props.memberType;\n const item = this.props[memberType+\"s\"][this.props.selectedObjects[0]];\n let itemOrder = this.props[`${item.memberType.toLowerCase()}IDs`].indexOf(item.id)+1;\n\n if (item){\n if (this.containsTacketedLeaf()) {\n if (this.props.selectedObjects.length>1) {\n return \"One of the selected leaves is tacketed or sewn. You cannot delete tacketed/sewn leaves.\";\n } else {\n return \"You cannot delete a leaf that is tacketed or sewn.\";\n }\n } else if (this.props.selectedObjects.length===1) {\n return \"Are you sure you want to delete \" + item.memberType.toLowerCase() + \" \" + itemOrder + \"?\";\n } else {\n let itemName = item.memberType.toLowerCase();\n if (itemName===\"leaf\") itemName = \"leave\";\n return \"Are you sure you want to delete \" + \n this.props.selectedObjects.length + \" \" + itemName + \"s?\";\n }\n }\n\n }\n\n submit = (e) => {\n if (e) e.preventDefault();\n if (this.props.selectedObjects.length===1) {\n // handle single delete\n let id = this.props.selectedObjects[0]\n this.props.action.singleDelete(id);\n } else {\n // handle batch delete\n const memberType = this.props.memberType.toLowerCase();\n let data = {};\n data[memberType+\"s\"]= [];\n for (var id of this.props.selectedObjects) {\n data[memberType+\"s\"].push(id);\n }\n this.props.action.batchDelete(data);\n }\n this.handleClose();\n }\n\n render() {\n const actions = [\n ,\n ,\n ];\n\n return (\n
\n \n \n \n
\n );\n }\n}\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport IconButton from 'material-ui/IconButton';\nimport IconAdd from 'material-ui/svg-icons/content/add';\nimport AutoComplete from 'material-ui/AutoComplete';\nimport SelectField from 'material-ui/SelectField';\nimport MenuItem from 'material-ui/MenuItem';\nimport TextField from 'material-ui/TextField';\nimport Checkbox from 'material-ui/Checkbox';\n\n/** Dialog to add a term to an object (leaf, side, or group). This component is used in the visual and tabular edit modes. */\nexport default class AddTerm extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n open: false,\n taxonomy: '',\n description: '',\n uri: '',\n show: false,\n searchText: '',\n termID: null,\n };\n }\n\n /** Open this modal component */\n handleOpen = () => {\n this.setState({\n open: true,\n taxonomy: '',\n description: '',\n uri: '',\n show: false,\n searchText: '',\n termID: null,\n });\n this.props.togglePopUp(true);\n };\n\n /** Close this modal component */\n handleClose = () => {\n this.setState({ open: false });\n this.props.togglePopUp(false);\n };\n\n handleUpdateInput = searchText => {\n this.setState({\n searchText: searchText,\n termID: null,\n });\n };\n\n handleNewRequest = request => {\n // User pressed enter instead of selecting a term in drop down\n // Look for key associated with user input\n let termID = null;\n for (let id in this.props.Terms) {\n const term = this.props.Terms[id];\n if (term.title === request) {\n termID = term.id;\n }\n }\n this.setState({ termID }, () => {\n if (termID) this.submit();\n });\n };\n\n submit = () => {\n if (this.state.termID !== null) {\n // Attach existing term to selected objects\n this.props.action.linkTerm(this.state.termID);\n } else {\n // Check if term exists (in case user types and did not press enter)\n let termID = null;\n for (let id in this.props.Terms) {\n const term = this.props.Terms[id];\n if (term.title === this.state.searchText) termID = term.id;\n }\n if (termID) {\n this.props.action.linkTerm(termID);\n } else {\n // Did not find term, so create and attach new term to object\n this.props.action.createAndAttachTerm(\n this.state.searchText,\n this.state.taxonomy,\n this.state.description,\n this.state.uri,\n this.state.show\n );\n }\n }\n this.handleClose();\n };\n\n termExists = () => {\n for (let termID in this.props.Terms) {\n const term = this.props.Terms[termID];\n if (term.title === this.state.searchText) {\n return true;\n }\n }\n return false;\n };\n\n /**\n * Mapping function to render one term taxonomy menu item\n */\n renderTaxonomies = name => {\n return ;\n };\n\n onChange = (name, value) => {\n this.setState({ [name]: value });\n };\n\n getFilteredTermTitlesDropDown = () => {\n return Object.keys(this.props.Terms).filter(termID => {\n return !this.props.commonTerms.includes(termID);\n });\n };\n\n render() {\n const dataSourceConfig = {\n text: 'textKey',\n value: 'valueKey',\n };\n\n const actions = [\n ,\n ,\n ];\n\n let newTermForm =
;\n if (!this.termExists() && this.state.searchText.length > 1) {\n newTermForm = (\n
\n this.onChange('taxonomy', v)}\n floatingLabelText=\"Taxonomy\"\n fullWidth\n style={{ marginTop: -20 }}\n >\n {this.props.Taxonomies.map(this.renderTaxonomies)}\n \n this.onChange('description', v)}\n multiLine\n fullWidth\n style={{ marginTop: -20 }}\n />\n this.onChange('uri', v)}\n multiLine\n fullWidth\n style={{ marginTop: -20 }}\n />\n
\n Show in diagram (leaves & sides only):\n
\n
\n this.onChange('show', !this.state.show)}\n />\n
\n
\n );\n }\n\n let dialog = (\n \n {\n return {\n textKey: this.props.Terms[termID].title,\n valueKey: termID,\n };\n })}\n filter={(searchText, key) => key.indexOf(searchText) !== -1}\n openOnFocus={true}\n dataSourceConfig={dataSourceConfig}\n fullWidth\n listStyle={{ maxHeight: 300, overflow: 'auto' }}\n errorText={\n !this.termExists() && this.state.searchText.length > 0\n ? \"This term doesn't exist. To create and attach it, fill out its taxonomy, description, and URI.\"\n : ''\n }\n errorStyle={{ color: '#727272' }}\n floatingLabelFocusStyle={{ color: '#3A4B55' }}\n />\n {newTermForm}\n \n );\n\n return (\n
\n \n \n \n {dialog}\n
\n );\n }\n}\n","export function getLeafsOfGroup(group, Leafs, includeNone=true){\n let leafMembersOfCurrentGroup = [];\n if (includeNone) {\n leafMembersOfCurrentGroup.push({\n order: \"None\",\n id: \"None\",\n })\n }\n for (let memberID of group.memberIDs) {\n if (memberID.charAt(0)===\"L\") leafMembersOfCurrentGroup.push(Leafs[memberID]);\n }\n return leafMembersOfCurrentGroup;\n}\n","import React from 'react';\nimport {getLeafsOfGroup} from '../../../helpers/getLeafsOfGroup';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport SelectField from '../../global/SelectField';\n\n/** Dialog for creating/editing sewing or tacketed attribute */\nexport default class VisualizationDialog extends React.Component {\n\n constructor(props) {\n super(props);\n this.state = {\n startLeaf: null,\n endLeaf: null,\n }\n }\n\n componentWillReceiveProps() {\n this.setState({\n startLeaf: null,\n endLeaf: null,\n });\n }\n\n handleChange = (type, value) => {\n this.setState({[type]:value});\n }\n\n renderMenuItem = (item, index) => {\n if (item.id) {\n return { \n value:item.id,\n text:\"Leaf \" + (this.props.leafIDs.indexOf(item.id)+1),\n }\n } else {\n return { \n value:\"spine\",\n text:\"Spine\",\n }\n }\n }\n\n onCreate = () => {\n let attributeValue = this.state.startLeaf===\"spine\"?[this.state.endLeaf]:[this.state.startLeaf,this.state.endLeaf];\n this.props.updateGroup(this.props.type, attributeValue); \n this.props.closeDialog();\n }\n\n render() {\n let isCreateAction = (this.props.type!==\"\" && this.props.group[this.props.type].length===0);\n const actions = [\n {this.props.closeDialog()}}\n />,\n ,\n {this.props.delete(); this.props.closeDialog()}}\n />,\n ];\n let selectFields = [];\n let leafMembersOfCurrentGroup = [{id:null}].concat(getLeafsOfGroup(this.props.activeGroup, this.props.Leafs, false));\n if (isCreateAction) {\n // Create new sewing/tacket\n let selectField1 = (\n this.handleChange(\"startLeaf\",v)}\n data={leafMembersOfCurrentGroup.map((v,i)=>this.renderMenuItem(v,0))}\n />)\n let selectField2 = (\n this.handleChange(\"endLeaf\",v)}\n data={leafMembersOfCurrentGroup.filter((item) => (item.id !== null && (this.state.startLeaf === null || this.state.startLeaf === \"spine\" || this.props.leafIDs.indexOf(item.id) > this.props.leafIDs.indexOf(this.state.startLeaf)))).map((v,i,a)=>this.renderMenuItem(v,1))}\n />)\n selectFields.push(selectField1);\n selectFields.push(selectField2);\n } else if (this.props.type!==\"\" && this.props.group[this.props.type].length>0) {\n // Edit existing sewing/tacket\n\n const leafStart = this.props.group[this.props.type].length===2? this.props.Leafs[this.props.group[this.props.type][0]] : null;\n const leafEnd = this.props.group[this.props.type].length===2? this.props.Leafs[this.props.group[this.props.type][1]] : this.props.Leafs[this.props.group[this.props.type][0]];\n const data1 = [{ id: null }].concat(leafMembersOfCurrentGroup.filter((item) => (item.id !== null && this.props.leafIDs.indexOf(item.id) < this.props.leafIDs.indexOf(leafEnd.id)+1)));\n const data2 = leafMembersOfCurrentGroup.filter((item) => (leafStart === null && item.id !== null) || (leafStart !== null && item.id !== null && this.props.leafIDs.indexOf(item.id) > this.props.leafIDs.indexOf(leafStart.id)+1));\n let selectField1 = (\n this.props.handleTacketSewingChange(this.props.type, v, 0)}\n data={data1.map((v,i)=>this.renderMenuItem(v,0))}\n />)\n let selectField2 = (\n this.props.handleTacketSewingChange(this.props.type, v, 1)}\n data={data2.map((v,i)=>this.renderMenuItem(v,1))}\n />)\n selectFields.push(selectField1);\n selectFields.push(selectField2);\n } \n \n return (\n
\n this.props.closeDialog()}\n contentStyle={{width: \"30%\", minWidth:\"320px\", maxWidth:\"450px\"}}\n >\n {selectFields}\n \n
\n );\n }\n}","export let checkboxStyle = () => { \n let fontSize = null;\n if (window.innerWidth<=1024) {\n fontSize = \"14px\";\n } \n if (window.innerWidth<=768) {\n fontSize = \"12px\";\n } \n return {\n iconStyle:{\n height:window.innerWidth<=1024?15:20,\n width:window.innerWidth<=1024?15:20,\n marginTop:window.innerWidth<=1024?\"2px\":null,\n marginRight:window.innerWidth<=1024?\"5px\":\"10px\",\n },\n labelStyle: {\n fontSize,\n lineHeight:\"21px\",\n }\n }\n}","import React from 'react';\nimport Chip from 'material-ui/Chip';\n\nexport function renderTermChip(props, term) {\n let deleteFn = () => {\n props.action.unlinkTerm(term.id);\n };\n if (props.isReadOnly) deleteFn = null;\n return (\n props.openTermDialog(term)}\n tabIndex={props.tabIndex}\n labelStyle={{ fontSize: props.windowWidth <= 1024 ? 12 : null }}\n >\n {term.title}\n \n );\n}\n","import React from 'react';\nimport MenuItem from 'material-ui/MenuItem';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport TextField from 'material-ui/TextField';\nimport IconSubmit from 'material-ui/svg-icons/action/done';\nimport IconClear from 'material-ui/svg-icons/content/clear';\nimport Visibility from 'material-ui/svg-icons/action/visibility';\nimport VisibilityOff from 'material-ui/svg-icons/action/visibility-off';\nimport AddGroupDialog from '../infoBox/dialog/AddGroupDialog';\nimport DeleteConfirmationDialog from '../infoBox/dialog/DeleteConfirmationDialog';\nimport Popover, { PopoverAnimationVertical } from 'material-ui/Popover';\nimport Menu from 'material-ui/Menu';\nimport Chip from 'material-ui/Chip';\nimport IconButton from 'material-ui/IconButton';\nimport IconAdd from 'material-ui/svg-icons/content/add';\nimport IconPencil from 'material-ui/svg-icons/content/create';\nimport Avatar from 'material-ui/Avatar';\nimport AddTerm from './dialog/AddTerm';\nimport VisualizationDialog from './dialog/VisualizationDialog';\nimport SelectField from '../global/SelectField';\nimport { btnBase } from '../../styles/button';\nimport { checkboxStyle } from '../../styles/checkbox';\nimport { renderTermChip } from '../../helpers/renderHelper';\n\n/** Group infobox */\nexport default class GroupInfoBox extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n ...this.emptyAttributeState(),\n ...this.otherAttributeStates(),\n ...this.visibilityHoverState(),\n addButtonPopoverOpen: false,\n addGroupDialogOpen: false,\n addLeafDialogOpen: false,\n visualizationDialogActive: '',\n };\n this.batchSubmit = this.batchSubmit.bind(this);\n this.hasActiveAttributes = this.hasActiveAttributes.bind(this);\n }\n\n visibilityHoverState() {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state[\n 'visibility_hover_' + this.props.defaultAttributes[i]['name']\n ] = false;\n }\n return state;\n }\n\n /**\n * Creates a dictionary of attributes and if its toggled on or off during batch edit\n * This is used for the checkbox states\n */\n otherAttributeStates() {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state['batch_' + this.props.defaultAttributes[i]['name']] = false;\n state['editing_' + this.props.defaultAttributes[i]['name']] = false;\n }\n return state;\n }\n\n /**\n * Creates a dictionary of attributes with no values\n */\n\n emptyAttributeState() {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state[this.props.defaultAttributes[i]['name']] = '';\n }\n return state;\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.selectedGroups.length < 2) {\n this.setState({ ...this.emptyAttributeState() });\n }\n }\n\n hasActiveAttributes() {\n for (var i in this.props.defaultAttributes) {\n if (\n this.state['batch_' + this.props.defaultAttributes[i]['name']] &&\n this.state[this.props.defaultAttributes[i]['name']] !== 'keep' &&\n this.state[this.props.defaultAttributes[i]['name']] !== ''\n ) {\n return true;\n }\n }\n return false;\n }\n\n toggleAddGroupDialog = (value = false) => {\n this.setState({ addGroupDialogOpen: value, addButtonPopoverOpen: false });\n if (value === false) this.props.togglePopUp(false);\n };\n\n toggleAddLeafDialog = (value = false) => {\n this.setState({ addLeafDialogOpen: value, addButtonPopoverOpen: false });\n if (value === false) this.props.togglePopUp(false);\n };\n\n handleAddButtonTouchTap = event => {\n event.preventDefault();\n this.setState({\n addButtonPopoverOpen: true,\n popoverAnchorEl: event.currentTarget,\n });\n };\n\n handleAddButtonRequestClose = () => {\n this.setState({\n addButtonPopoverOpen: false,\n });\n };\n\n toggleCheckbox(target) {\n let newToggleState = {};\n newToggleState['batch_' + target] = !this.state['batch_' + target];\n this.setState(newToggleState);\n }\n\n dropDownChange = (value, attributeName) => {\n if (Object.keys(this.props.selectedGroups).length === 1) {\n // In single edit - we submit change immediately\n this.singleSubmit(attributeName, value);\n } else {\n // In batch edit - save change of attribute to the state\n let updatedAttribute = {};\n updatedAttribute[attributeName] = value;\n this.setState(updatedAttribute);\n }\n };\n\n onTextboxChange = (value, attributeName) => {\n let newAttributeState = {};\n newAttributeState[attributeName] = value;\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = true;\n this.setState({ ...newAttributeState, ...newEditingState });\n };\n\n textSubmit(e, attributeName) {\n e.preventDefault();\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = false;\n this.setState({ ...newEditingState });\n if (!this.state.isBatch) {\n this.singleSubmit(attributeName, this.state[attributeName]);\n }\n }\n\n textCancel(e, attributeName) {\n let newAttributeState = {};\n newAttributeState[attributeName] = this.props.Groups[\n this.props.selectedGroups[0]\n ][attributeName];\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = false;\n this.setState({ ...newAttributeState, ...newEditingState });\n }\n\n singleSubmit = (attributeName, value) => {\n let group = {};\n group[attributeName] = value;\n let id = this.props.selectedGroups[0];\n this.props.action.updateGroup(id, group);\n };\n\n batchSubmit() {\n let attributes = {};\n for (var i in this.props.defaultAttributes) {\n let attrName = this.props.defaultAttributes[i]['name'];\n let attrValue = this.state[this.props.defaultAttributes[i]['name']];\n if (\n attrValue !== '' &&\n attrValue !== 'keep' &&\n attrValue !== 'Keep same'\n ) {\n attributes[attrName] = attrValue;\n }\n }\n let groups = [];\n for (let id of this.props.selectedGroups) {\n groups.push({ id, attributes });\n }\n this.props.action.updateGroups(groups);\n // Reset states\n this.setState({ ...this.otherAttributeStates() });\n }\n\n getAttributeValues(selectedGroups = this.props.selectedGroups) {\n let groupAttributes = {};\n for (var i in this.props.defaultAttributes) {\n let attributeName = this.props.defaultAttributes[i]['name'];\n for (let id of selectedGroups) {\n let group = this.props.Groups[id];\n if (groupAttributes[attributeName] === undefined) {\n groupAttributes[attributeName] = group[attributeName];\n } else if (groupAttributes[attributeName] !== group[attributeName]) {\n groupAttributes[attributeName] = null;\n break;\n }\n }\n }\n return groupAttributes;\n }\n\n renderTerms = () => {\n let chips = [];\n for (let termID of this.props.commonTerms) {\n const term = this.props.Terms[termID];\n chips.push(renderTermChip(this.props, term));\n }\n return chips;\n };\n\n closeTermDialog = () => {\n this.setState({ activeTerm: null });\n };\n\n toggleTacketDrawing = e => {\n e.stopPropagation();\n this.props.action.toggleVisualizationDrawing({\n type: 'tacketed',\n value: this.props.selectedGroups[0],\n });\n this.handleAddButtonRequestClose();\n };\n\n toggleSewingDrawing = e => {\n e.stopPropagation();\n this.props.action.toggleVisualizationDrawing({\n type: 'sewing',\n value: this.props.selectedGroups[0],\n });\n this.handleAddButtonRequestClose();\n };\n\n handleTacketSewingChange = (type, leafID, index) => {\n const targetGroup = this.props.Groups[this.props.selectedGroups[0]];\n const value = leafID === 'spine' ? null : leafID;\n let groupPayload = {};\n groupPayload[type] = targetGroup[type];\n if (groupPayload[type].length === 2) {\n groupPayload[type][index] = value;\n } else if (groupPayload[type].length === 1 && index === 0) {\n // Array has one item, which is the endleaf. Insert startleaf ID\n groupPayload[type].splice(index, 0, value);\n } else if (groupPayload[type].length === 1 && index === 1) {\n // Array has one item, which is the endleaf. Replace endleaf ID\n groupPayload[type] = [value];\n }\n if (!groupPayload[type][0]) groupPayload[type].splice(0, 1);\n this.props.action.updateGroup(targetGroup.id, groupPayload);\n };\n\n deleteTacket = () => {\n this.singleSubmit('tacketed', []);\n };\n\n deleteSewing = () => {\n this.singleSubmit('sewing', []);\n };\n\n toggleVisualizationDialog = value => {\n this.setState({ visualizationDialogActive: value });\n if (value === '') {\n this.props.togglePopUp(false);\n } else {\n this.props.togglePopUp(true);\n }\n };\n\n clickVisibility = (attributeName, value) => {\n if (attributeName !== 'type' || this.props.viewMode === 'TABULAR') {\n this.props.action.updatePreferences({\n group: { ...this.props.preferences.group, [attributeName]: value },\n });\n }\n };\n\n renderTooltip = (eyeIsChecked, eyeStyle, attributeDict) => {\n return (\n 0 ? { display: 'none' } : {}}\n >\n {eyeIsChecked\n ? 'Hide attribute in the collation'\n : 'Show attribute in the collation'}\n \n );\n };\n\n render() {\n const isBatch = this.props.selectedGroups.length > 1;\n let attributeDivs = [];\n let groupAttributes = this.getAttributeValues();\n this.props.defaultAttributes.forEach(attributeDict => {\n let label = attributeDict.displayName;\n let eyeCheckbox = '';\n let eyeStyle = {};\n let eyeIsChecked =\n this.props.preferences.group &&\n this.props.preferences.group[attributeDict.name]\n ? this.props.preferences.group[attributeDict.name]\n : false;\n if (this.props.viewMode !== 'TABULAR') {\n if (attributeDict.name === 'type') {\n eyeStyle = { fill: '#C2C2C2', cursor: 'not-allowed' };\n eyeIsChecked = false;\n }\n }\n if (isBatch && !this.props.isReadOnly) {\n eyeCheckbox = (\n
\n }\n uncheckedIcon={}\n onClick={() =>\n this.clickVisibility(attributeDict.name, !eyeIsChecked)\n }\n style={{\n display:\n this.props.windowWidth <= 1024 ? 'none' : 'inline-block',\n width: '25px',\n ...eyeStyle,\n }}\n iconStyle={{ ...checkboxStyle().iconStyle, ...eyeStyle }}\n checked={eyeIsChecked}\n onMouseEnter={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: true,\n });\n }}\n onMouseOut={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: false,\n });\n }}\n tabIndex={this.props.tabIndex}\n />\n {this.renderTooltip(eyeIsChecked, eyeStyle, attributeDict)}\n
\n );\n label = (\n this.toggleCheckbox(attributeDict.name)}\n labelStyle={\n !this.state['batch_' + attributeDict.name]\n ? {\n color: 'gray',\n fontSize: this.props.windowWidth <= 768 ? '12px' : null,\n }\n : { fontSize: this.props.windowWidth <= 768 ? '12px' : null }\n }\n checked={this.state['batch_' + attributeDict.name]}\n style={{ display: 'inline-block', width: '25px' }}\n iconStyle={{ ...checkboxStyle().iconStyle }}\n tabIndex={this.props.tabIndex}\n />\n );\n } else {\n // In single edit - display eye icon with label\n label = (\n
\n }\n uncheckedIcon={}\n onClick={() =>\n this.clickVisibility(attributeDict.name, !eyeIsChecked)\n }\n style={{ display: 'inline-block', width: '25px', ...eyeStyle }}\n {...checkboxStyle()}\n iconStyle={{\n ...checkboxStyle().iconStyle,\n color: 'gray',\n ...eyeStyle,\n }}\n checked={eyeIsChecked}\n onMouseEnter={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: true,\n });\n }}\n onMouseOut={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: false,\n });\n }}\n tabIndex={this.props.tabIndex}\n />\n {this.renderTooltip(eyeIsChecked, eyeStyle, attributeDict)}\n
\n );\n }\n // Generate dropdown or text box depending on the current attribute\n let input = groupAttributes[attributeDict.name];\n if (!this.props.isReadOnly) {\n if (attributeDict.options !== undefined) {\n // Drop down menu\n let menuItems = [];\n let value = 'keep';\n attributeDict.options.forEach((option, index) => {\n menuItems.push({ value: option, text: option });\n });\n if (groupAttributes[attributeDict.name] === null) {\n menuItems.push({ value: 'keep', text: 'Keep same' });\n }\n if (groupAttributes[attributeDict.name] !== null) {\n value = groupAttributes[attributeDict.name];\n }\n input = (\n this.dropDownChange(v, attributeDict.name)}\n disabled={isBatch && !this.state['batch_' + attributeDict.name]}\n tabIndex={this.props.tabIndex}\n data={menuItems}\n value={value}\n >\n );\n } else {\n // Text box\n let textboxButtons = '';\n if (!isBatch && this.state['editing_' + attributeDict.name]) {\n textboxButtons = (\n
\n }\n style={{\n minWidth: this.props.windowWidth <= 768 ? '35px' : '60px',\n marginLeft: '5px',\n }}\n onClick={e => this.textSubmit(e, attributeDict.name)}\n tabIndex={this.props.tabIndex}\n />\n }\n style={{\n minWidth: this.props.windowWidth <= 768 ? '35px' : '60px',\n marginLeft: '5px',\n }}\n onClick={e => this.textCancel(e, attributeDict.name)}\n tabIndex={this.props.tabIndex}\n />\n
\n );\n }\n let value = 'Keep same';\n if (this.state['editing_' + attributeDict.name]) {\n value = this.state[attributeDict.name];\n } else if (groupAttributes[attributeDict.name]) {\n value = groupAttributes[attributeDict.name];\n }\n input = (\n
\n
this.textSubmit(e, attributeDict.name)}>\n \n this.onTextboxChange(v, attributeDict.name)\n }\n disabled={\n isBatch && !this.state['batch_' + attributeDict.name]\n }\n tabIndex={this.props.tabIndex}\n inputStyle={{\n fontSize: this.props.windowWidth <= 1024 ? '12px' : '16px',\n }}\n />\n {textboxButtons}\n \n
\n );\n }\n } else {\n if (!input && this.props.selectedGroups.length > 1) {\n input = (\n \n Different values\n \n );\n } else {\n input = (\n \n {input}\n \n );\n }\n }\n attributeDivs.push(\n
\n
\n {eyeCheckbox}\n {label}\n
\n
{input}
\n
\n );\n });\n let submitBtn = '';\n if (isBatch && this.hasActiveAttributes()) {\n submitBtn = (\n \n );\n }\n let addBtn = '';\n let addButtonPopover = '';\n if (!isBatch) {\n addButtonPopover = (\n \n \n {\n this.props.togglePopUp(true);\n this.toggleAddGroupDialog(true);\n }}\n />\n {\n this.props.togglePopUp(true);\n this.toggleAddLeafDialog(true);\n }}\n />\n \n \n );\n\n addBtn = (\n \n );\n }\n let deleteBtn = (\n \n );\n let attributeSewing = '';\n const sewing = this.props.Groups[this.props.selectedGroups[0]].sewing;\n if (\n this.props.selectedGroups.length === 1 &&\n sewing.length === 0 &&\n this.props.viewMode !== 'VIEWING'\n ) {\n attributeSewing = (\n
\n
\n {\n if (this.props.viewMode === 'TABULAR') {\n this.toggleVisualizationDialog('sewing');\n } else {\n this.toggleSewingDrawing(e);\n }\n }}\n tabIndex={this.props.tabIndex}\n >\n \n \n
\n

Sewing

\n
\n );\n } else if (this.props.selectedGroups.length === 1 && sewing.length > 0) {\n attributeSewing = (\n
\n
\n

Sewing

\n {\n this.deleteSewing();\n }\n : null\n }\n onClick={() => {\n if (this.props.viewMode !== 'VIEWING')\n this.toggleVisualizationDialog('sewing');\n }}\n tabIndex={this.props.tabIndex}\n >\n
\n \n {sewing.length === 1\n ? 'Spine to Leaf ' +\n (this.props.leafIDs.indexOf(sewing[0]) + 1)\n : 'Leaf ' +\n (this.props.leafIDs.indexOf(sewing[0]) + 1) +\n ' to Leaf ' +\n (this.props.leafIDs.indexOf(sewing[1]) + 1)}\n
\n \n
\n \n }\n />\n
\n
\n
\n \n \n
\n \n );\n }\n const tacketed = this.props.Groups[this.props.selectedGroups[0]].tacketed;\n let attributeTacket = '';\n if (\n this.props.selectedGroups.length === 1 &&\n tacketed.length === 0 &&\n this.props.viewMode !== 'VIEWING'\n ) {\n attributeTacket = (\n
\n
\n {\n if (this.props.viewMode === 'VISUAL') {\n this.toggleTacketDrawing(e);\n } else {\n this.toggleVisualizationDialog('tacketed');\n }\n }}\n tabIndex={this.props.tabIndex}\n >\n \n \n
\n

Tacket

\n
\n );\n } else if (this.props.selectedGroups.length === 1 && tacketed.length > 0) {\n attributeTacket = (\n
\n
\n

Tacket

\n {\n this.deleteTacket();\n }\n : null\n }\n onClick={() => {\n if (this.props.viewMode !== 'VIEWING')\n this.toggleVisualizationDialog('tacketed');\n }}\n tabIndex={this.props.tabIndex}\n >\n
\n \n {tacketed.length === 1\n ? 'Spine to Leaf ' +\n (this.props.leafIDs.indexOf(tacketed[0]) + 1)\n : 'Leaf ' +\n (this.props.leafIDs.indexOf(tacketed[0]) + 1) +\n ' to Leaf ' +\n (this.props.leafIDs.indexOf(tacketed[1]) + 1)}\n
\n \n
\n \n }\n />\n
\n
\n
\n \n \n
\n \n );\n }\n const terms = this.renderTerms();\n return (\n
\n
\n {attributeDivs}\n {!this.props.isReadOnly ? (\n \n ) : (\n ''\n )}\n \n {this.props.selectedGroups.length > 1 ? 'Terms in common' : 'Terms'}\n \n \n {terms}\n
\n
\n {attributeSewing}\n {attributeTacket}\n {submitBtn}\n {addButtonPopover}\n
\n
\n

Actions

\n
\n {addBtn}\n {deleteBtn}\n
\n
\n \n \n this.toggleVisualizationDialog('')}\n group={\n this.props.selectedGroups.length > 0\n ? this.props.Groups[this.props.selectedGroups[0]]\n : null\n }\n groupIDs={this.props.groupIDs}\n leafIDs={this.props.leafIDs}\n tacketed={this.props.Groups[this.props.selectedGroups[0]].tacketed}\n sewing={this.props.Groups[this.props.selectedGroups[0]].sewing}\n Leafs={this.props.Leafs}\n activeGroup={this.props.Groups[this.props.selectedGroups[0]]}\n handleTacketSewingChange={this.handleTacketSewingChange}\n delete={() =>\n this.singleSubmit(this.state.visualizationDialogActive, [])\n }\n updateGroup={this.singleSubmit}\n popUpActive={this.props.popUpActive}\n />\n \n );\n }\n}\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton';\nimport TextField from 'material-ui/TextField';\nimport IconButton from 'material-ui/IconButton';\nimport AddCircle from 'material-ui/svg-icons/content/add-circle';\nimport RemoveCircle from 'material-ui/svg-icons/content/remove-circle-outline';\nimport light from '../../../styles/light';\nimport { getMemberOrder } from '../../../helpers/getMemberOrder';\nimport { btnBase } from '../../../styles/button';\n\n/** Dialog to add leaves in a collation. This component is used in the visual and tabular edit modes. */\nexport default class AddLeafDialog extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n open: false,\n numberOfLeaves: 1,\n conjoin: false,\n oddLeaf: 2,\n location: \"\",\n errorText: {\n numberOfLeaves: \"\",\n oddLeaf: \"\",\n },\n disabledAbove: false,\n disabledBelow: false,\n };\n }\n\n /** Open this modal component */\n handleOpen = () => {\n this.setState({open: true});\n this.props.togglePopUp(true);\n };\n\n /** Close this modal component */\n handleClose = () => {\n this.clearForm();\n this.setState({open: false});\n this.props.togglePopUp(false);\n };\n\n /**\n * Increment a state's value by one, bounded by `max` and `min`. If the user previously \n * entered an invalid value, the value is set to `min`. \n */\n incrementNumber = (name, min, max, e) => {\n if (e) e.preventDefault();\n let newCount = 0;\n if (!this.isNormalInteger(this.state[name])) {\n newCount = min; \n } else {\n newCount = Math.min(max, this.state[name]+1);\n }\n let newState = {errorText:{}};\n newState[name]=(isNaN(newCount))?1:newCount;\n newState.errorText[name]=\"\";\n this.setState({...newState});\n }\n\n /**\n * Decrement a state by one, bounded by `max` and `min`. If the user previously \n * entered an invalid value, the value is set to min. \n */\n decrementNumber = (name, min, max, e) => {\n if (e) e.preventDefault();\n let newCount = Math.min(max, Math.max(min, this.state[name]-1));\n let newState = {errorText:{}};\n newState[name]=(isNaN(newCount))?1:newCount;\n newState.errorText[name]=\"\";\n this.setState({...newState});\n }\n\n /**\n * Validate user input. If invalid, display error message, otherwise update relevant state \n */\n onNumberChange = (stateName, value) => {\n let errorState = this.state.errorText;\n errorState[stateName] = \"\";\n if (!this.isNormalInteger(value)) {\n errorState[stateName] = \"Must be a number\";\n } else {\n value = parseInt(value, 10);\n }\n if (stateName===\"numberOfLeaves\" && (value<1 || value>999)) {\n errorState[stateName] = \"Number must be between 1 and 999\";\n } else if (stateName===\"oddLeaf\" && (value<1 || value>this.state.numberOfLeaves)) {\n errorState[stateName] = \"Number must be between 1 and \" + this.state.numberOfLeaves;\n }\n let newState = {};\n newState[stateName] = value;\n this.setState({...newState, errorText: errorState});\n }\n\n /**\n * Check if string is an integer\n */\n isNormalInteger = (str) => {\n return /^([1-9]\\d*)$/.test(str);\n }\n\n /**\n * Toggle conjoin checkbox\n */\n onToggleConjoin = () => {\n this.setState({conjoin: !this.state.conjoin});\n }\n\n /**\n * Update location radio button group\n */\n onLocationChange = (value) => {\n this.setState({location: value});;\n }\n\n /**\n * Return `true` if there are any errors in the input fields\n */\n isDisabled = (activeLeaf) => {\n let addable = activeLeaf.attached_above!==\"None\" && activeLeaf.attached_below!==\"None\";\n let numberOfLeavesError = !(this.state.errorText.numberOfLeaves===undefined) && this.state.errorText.numberOfLeaves.length>0;\n let oddLeafError = !(this.state.errorText.oddLeaf===undefined) && this.state.errorText.oddLeaf.length>0;\n return this.state.location===\"\" || addable || numberOfLeavesError || oddLeafError;\n }\n\n /**\n * Submit add leaf request\n */\n submit = () => {\n const leaf = this.props.Leafs[this.props.selectedLeaves[0]];\n let data = {leaf:{}, additional:{}};\n data[\"additional\"][\"noOfLeafs\"] = this.state.numberOfLeaves;\n data[\"additional\"][\"conjoin\"] = (this.state.numberOfLeaves>1)? this.state.conjoin : false;\n if (this.state.conjoin && this.state.numberOfLeaves>1 && !(this.state.numberOfLeaves%2===0)) {\n data[\"additional\"][\"oddMemberLeftOut\"] = this.state.oddLeaf;\n } \n let memberOrder = getMemberOrder(leaf, this.props.Groups, this.props.groupIDs);\n if (this.state.location===\"below\") {\n memberOrder += 1;\n data[\"additional\"][\"order\"] = this.props.leafIDs.indexOf(leaf.id) + 2;\n } else {\n data[\"additional\"][\"order\"] = this.props.leafIDs.indexOf(leaf.id) + 1;\n }\n\n data[\"additional\"][\"memberOrder\"] = memberOrder;\n data[\"leaf\"][\"project_id\"] = this.props.projectID;\n data[\"leaf\"][\"parentID\"] = leaf.parentID;\n\n this.props.action.addLeafs(data);\n this.handleClose();\n this.clearForm();\n }\n\n /**\n * Reset state\n */\n clearForm = () => {\n this.setState({\n numberOfLeaves: 1,\n conjoin: false,\n oddLeaf: 2,\n location: \"\",\n errorText: {\n numberOfLeaves: \"\",\n oddLeaf: \"\",\n },\n disabledAbove: false,\n disabledBelow: false,\n })\n }\n\n render() {\n const activeLeaf = this.props.Leafs[this.props.selectedLeaves[0]];\n const activeLeafOrder = this.props.leafIDs.indexOf(activeLeaf.id)+1\n let defaultAddLocation = \"\";\n\n const actions = [\n ,\n ,\n ];\n\n const styles = {\n radioButton: {\n marginBottom: 5,\n },\n };\n\n let noOfLeafs = \"\";\n let conjoinOption = \"\";\n let oddLeaf = \"\";\n\n if (this.state.location!==\"\") {\n noOfLeafs = \n
\n
\n

Number of leaves

\n
\n
\n this.onNumberChange(\"numberOfLeaves\", v)}\n style={{width:\"100px\"}}\n inputStyle={{textAlign:\"center\"}}\n />\n this.decrementNumber(\"numberOfLeaves\", 1, 999, e)}\n >\n \n \n this.incrementNumber(\"numberOfLeaves\", 1, 999, e)}\n >\n \n \n
\n
;\n } \n\n if (this.state.numberOfLeaves>1) {\n conjoinOption = \n
\n
\n

Conjoin leaves?

\n
\n
\n this.onToggleConjoin()}\n checked={this.state.conjoin && this.state.numberOfLeaves>1}\n style={{verticalAlign:\"bottom\"}}\n />\n
\n
\n }\n if (this.state.conjoin && this.state.numberOfLeaves>1 && !(this.state.numberOfLeaves%2===0)) {\n oddLeaf = \n
\n
\n

Odd leaf to not conjoin

\n
\n
\n this.onNumberChange(\"oddLeaf\", v)}\n style={{width:\"100px\"}}\n inputStyle={{textAlign:\"center\"}}\n />\n this.decrementNumber(\"oddLeaf\", 1, this.state.numberOfLeaves, e)}\n >\n \n \n this.incrementNumber(\"oddLeaf\", 1, this.state.numberOfLeaves, e)}\n >\n \n \n
\n
\n }\n \n let disabledAddAbove = (activeLeaf.attached_above!==\"None\"?\n
\n
{this.setState({disabledAbove:true})}}\n onMouseOut={()=>{this.setState({disabledAbove:false})}}>\n above leaf {activeLeafOrder}\n
\n
\n Cannot insert a new leaf above leaf {activeLeafOrder} because leaf {activeLeafOrder} attached to leaf {activeLeafOrder-1}\n
\n
\n : \"\"\n );\n let disabledAddBelow = (activeLeaf.attached_below!==\"None\"?\n
\n
{this.setState({disabledBelow:true})}}\n onMouseOut={()=>{this.setState({disabledBelow:false})}}>\n below leaf {activeLeafOrder}\n
\n
\n Cannot insert a new leaf below leaf {activeLeafOrder} because leaf {activeLeafOrder} is attached to leaf {activeLeafOrder+1}\n
\n
\n : \"\"\n );\n\n let addLeaves = \n
\n

Add new leaves...

\n {disabledAddBelow}\n this.onLocationChange(v)}\n >\n \n \n \n {disabledAddAbove}\n
\n \n const dialog = (\n \n {addLeaves}\n {noOfLeafs}\n {conjoinOption}\n {oddLeaf}\n \n );\n\n return (\n
\n \n {dialog}\n
\n );\n }\n}\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport TextField from 'material-ui/TextField';\nimport IconButton from 'material-ui/IconButton';\nimport AddCircle from 'material-ui/svg-icons/content/add-circle';\nimport RemoveCircle from 'material-ui/svg-icons/content/remove-circle-outline';\nimport {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton';\nimport light from '../../../styles/light';\n\n/** Dialog to add leaves in a collation. This component is used in the visual and tabular edit modes. */\nexport default class FolioNumberDialog extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n folioOrPage: null,\n startNumber: this.props.defaultStartNumber,\n errorText: {\n startNumber: \"\",\n },\n };\n }\n\n componentWillReceiveProps(nextProps) {\n this.setState({startNumber: nextProps.defaultStartNumber});\n }\n\n /**\n * Increment a state's value by one, bounded by `max` and `min`. If the user previously \n * entered an invalid value, the value is set to `min`. \n */\n incrementNumber = (name, min, max, e) => {\n if (e) e.preventDefault();\n let newCount = 0;\n if (!this.isNormalInteger(this.state[name])) {\n newCount = min; \n } else {\n newCount = Math.min(max, this.state[name]+1);\n }\n let newState = {errorText:{}};\n newState[name]=(isNaN(newCount))?1:newCount;\n newState.errorText[name]=\"\";\n this.setState({...newState});\n }\n\n /**\n * Decrement a state by one, bounded by `max` and `min`. If the user previously \n * entered an invalid value, the value is set to min. \n */\n decrementNumber = (name, min, max, e) => {\n if (e) e.preventDefault();\n let newCount = Math.min(max, Math.max(min, this.state[name]-1));\n let newState = {errorText:{}};\n newState[name]=(isNaN(newCount))?1:newCount;\n newState.errorText[name]=\"\";\n this.setState({...newState});\n }\n\n /**\n * Validate user input. If invalid, display error message, otherwise update relevant state \n */\n onNumberChange = (stateName, value) => {\n let errorState = this.state.errorText;\n errorState[stateName] = \"\";\n if (!this.isNormalInteger(value)) {\n errorState[stateName] = \"Must be a number\";\n } else {\n value = parseInt(value, 10);\n }\n if (stateName===\"startNumber\" && (value<1 || value>9999)) {\n errorState[stateName] = \"Number must be between 1 and 9999\";\n }\n let newState = {};\n newState[stateName] = value;\n this.setState({...newState, errorText: errorState});\n }\n\n isNormalInteger = (str) => {\n return /^([1-9]\\d*)$/.test(str);\n }\n\n clearForm = () => {\n this.setState({\n folioOrPage: null,\n errorText: { startNumber: \"\" }, \n })\n }\n\n submit = () => {\n if (this.state.folioOrPage===\"folio_number\") {\n this.props.action.generateFolioNumbers(this.state.startNumber);\n } else {\n this.props.action.generatePageNumbers(this.state.startNumber);\n }\n this.clearForm();\n this.props.toggleFolioModal(false);\n }\n\n render() {\n const actions = [\n {this.clearForm();this.props.toggleFolioModal(false)}}\n style={{width:\"49%\", marginRight:\"1%\",border:\"1px solid #ddd\"}}\n \n />,\n ,\n ];\n\n return ({this.clearForm();this.props.toggleFolioModal(false)}}\n contentStyle={{width:\"450px\"}}\n titleStyle={{textAlign:\"center\"}}\n paperClassName=\"addDialog\"\n >\n
\n

Generate...

\n this.setState({folioOrPage: v})}\n >\n \n \n \n\n {this.state.folioOrPage? \n
\n
\n

Starting number

\n
\n
\n this.onNumberChange(\"startNumber\", v)}\n style={{width:\"100px\"}}\n inputStyle={{textAlign:\"center\"}}\n />\n this.decrementNumber(\"startNumber\", 1, 9999, e)}\n >\n \n \n this.incrementNumber(\"startNumber\", 1, 9999, e)}\n >\n \n \n
\n
\n :\"\"}\n
\n );\n }\n}\n","import React from 'react';\nimport AddLeafDialog from '../infoBox/dialog/AddLeafDialog';\nimport DeleteConfirmationDialog from '../infoBox/dialog/DeleteConfirmationDialog';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport Visibility from 'material-ui/svg-icons/action/visibility';\nimport VisibilityOff from 'material-ui/svg-icons/action/visibility-off';\nimport { getLeafsOfGroup } from '../../helpers/getLeafsOfGroup';\nimport Dialog from 'material-ui/Dialog';\nimport AddTerm from './dialog/AddTerm';\nimport ImageViewer from '../global/ImageViewer';\nimport SelectField from '../global/SelectField';\nimport { getMemberOrder } from '../../helpers/getMemberOrder';\nimport { checkboxStyle } from '../../styles/checkbox';\nimport { btnBase } from '../../styles/button';\nimport FolioNumberDialog from '../infoBox/dialog/FolioNumberDialog';\nimport { renderTermChip } from '../../helpers/renderHelper';\nimport TextField from 'material-ui/TextField/TextField';\nimport IconSubmit from 'material-ui/svg-icons/action/done';\nimport IconClear from 'material-ui/svg-icons/content/clear';\n\n/** Leaf infobox */\nexport default class LeafInfoBox extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n imageModalOpen: false,\n insideBifoliaModalOpen: false,\n outsideBifoliaModalOpen: false,\n folioModalOpen: false,\n isBatch: this.props.selectedLeaves.length > 1,\n ...this.emptyAttributeState(),\n ...this.batchAttributeToggleState(),\n ...this.visibilityHoverState(),\n };\n }\n\n visibilityHoverState() {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state[\n 'visibility_hover_' + this.props.defaultAttributes[i]['name']\n ] = false;\n }\n return state;\n }\n\n /**\n * Creates a dictionary of attributes and if its toggled on or off during batch edit\n * This is used for the checkbox states\n */\n batchAttributeToggleState = () => {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state['batch_' + this.props.defaultAttributes[i]['name']] = false;\n }\n return state;\n };\n\n /**\n * Creates a dictionary of attributes with no values\n */\n\n emptyAttributeState = () => {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state[this.props.defaultAttributes[i]['name']] = '';\n }\n return state;\n };\n\n componentWillReceiveProps(nextProps) {\n this.setState({\n isBatch: nextProps.selectedLeaves.length > 1,\n });\n if (!this.state.isBatch) {\n this.setState({ ...this.emptyAttributeState() });\n }\n }\n\n hasActiveAttributes = () => {\n for (var i in this.props.defaultAttributes) {\n if (\n this.state['batch_' + this.props.defaultAttributes[i]['name']] &&\n this.state[this.props.defaultAttributes[i]['name']] !== 'keep' &&\n this.state[this.props.defaultAttributes[i]['name']] !== ''\n ) {\n return true;\n }\n }\n return false;\n };\n\n onTextboxChange = (value, attributeName) => {\n let newAttributeState = {};\n newAttributeState[attributeName] = value;\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = true;\n this.setState({ ...newAttributeState, ...newEditingState });\n };\n\n textSubmit = (e, attributeName) => {\n e.preventDefault();\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = false;\n this.setState({ ...newEditingState });\n if (!this.state.isBatch) {\n this.singleSubmit(attributeName, this.state[attributeName]);\n }\n };\n\n singleSubmit = (attributeName, value) => {\n let attributes = {};\n attributes[attributeName] = value;\n let leafID = this.props.selectedLeaves[0];\n let leaf = {\n ...attributes,\n };\n this.props.action.updateLeaf(leafID, leaf);\n };\n\n textCancel = (e, attributeName) => {\n let newAttributeState = {};\n newAttributeState[attributeName] = this.props.Sides[\n this.props.selectedSides[0]\n ][attributeName];\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = false;\n this.setState({ ...newAttributeState, ...newEditingState });\n };\n\n dropDownChange = (value, attributeName) => {\n if (this.props.selectedLeaves.length === 1) {\n // In single edit - we submit change immediately\n let attributes = {};\n attributes[attributeName] = value;\n let leaf = {\n ...attributes,\n };\n this.props.action.updateLeaf(this.props.selectedLeaves[0], leaf);\n } else {\n // In batch edit - save change of attribute to the state\n let updatedAttribute = {};\n updatedAttribute[attributeName] = value;\n this.setState(updatedAttribute);\n }\n };\n\n onConjoinChange = (leaf, newID) => {\n if (newID === 'None') newID = null;\n let request = { conjoined_to: newID };\n this.props.action.updateLeaf(leaf.id, request);\n };\n\n onAttachedToChange = (event, activeLeaf, location, id, method) => {\n let request = { attached_to: activeLeaf.attached_to };\n if (method === 'None') {\n request.attached_to[location + 'ID'] = '';\n request.attached_to[location + 'Method'] = '';\n } else {\n request.attached_to[location + 'ID'] = id;\n request.attached_to[location + 'Method'] = method;\n }\n this.props.action.updateLeaf(activeLeaf.id, request);\n };\n\n batchSubmit = () => {\n let attributes = {};\n for (var i in this.props.defaultAttributes) {\n let attrName = this.props.defaultAttributes[i]['name'];\n let attrValue = this.state[this.props.defaultAttributes[i]['name']];\n if (attrValue !== '' && attrValue !== 'keep') {\n attributes[attrName] = attrValue;\n }\n }\n let leafs = [];\n for (var key of this.props.selectedLeaves) {\n const leaf = this.props.Leafs[key];\n leafs.push({ id: leaf.id, attributes });\n }\n this.props.action.updateLeafs(leafs);\n // Reset states\n this.setState({ ...this.batchAttributeToggleState() });\n };\n\n /**\n * Returns dictionary of attribute names and values\n * If multiple selected leaves have conflicting values,\n * the value of that attribute will be set to null\n */\n getAttributeValues() {\n let leafAttributes = {};\n for (var i in this.props.defaultAttributes) {\n let attributeName = this.props.defaultAttributes[i]['name'];\n for (var key of this.props.selectedLeaves) {\n const leaf = this.props.Leafs[key];\n if (leafAttributes[attributeName] === undefined) {\n leafAttributes[attributeName] = leaf[attributeName];\n } else if (leafAttributes[attributeName] !== leaf[attributeName]) {\n leafAttributes[attributeName] = null;\n break;\n }\n }\n }\n return leafAttributes;\n }\n\n /**\n * Handle checkbox toggling by updating relevant attribute state\n */\n toggleCheckbox = target => {\n let newToggleState = {};\n newToggleState['batch_' + target] = !this.state['batch_' + target];\n this.setState(newToggleState);\n };\n\n renderTerms = () => {\n let chips = [];\n for (let termID of this.props.commonTerms) {\n const term = this.props.Terms[termID];\n chips.push(renderTermChip(this.props, term));\n }\n return chips;\n };\n\n closeTermDialog = () => {\n this.setState({ activeTerm: null });\n this.props.togglePopUp(false);\n };\n\n toggleImageModal = imageModalOpen => {\n this.setState({ imageModalOpen });\n this.props.togglePopUp(imageModalOpen);\n };\n\n toggleInsideBifoliaModal = insideBifoliaModalOpen => {\n this.setState({ insideBifoliaModalOpen });\n this.props.togglePopUp(insideBifoliaModalOpen)\n }\n\n toggleOutsideBifoliaModal = outsideBifoliaModalOpen => {\n this.setState({ outsideBifoliaModalOpen });\n this.props.togglePopUp(outsideBifoliaModalOpen)\n }\n\n toggleFolioModal = folioModalOpen => {\n this.setState({ folioModalOpen });\n this.props.togglePopUp(folioModalOpen);\n };\n\n clickVisibility = (attributeName, value) => {\n this.props.action.updatePreferences({\n leaf: { ...this.props.preferences.leaf, [attributeName]: value },\n });\n };\n\n render() {\n let leafAttributes = this.getAttributeValues();\n let attributeDivs = [];\n const activeLeaf = this.props.Leafs[this.props.selectedLeaves[0]];\n const activeLeafOrder = this.props.leafIDs.indexOf(activeLeaf.id) + 1;\n const parentGroup = this.props.Groups[activeLeaf.parentID];\n const leafMembersOfCurrentGroup = getLeafsOfGroup(\n parentGroup,\n this.props.Leafs\n );\n const isFirstLeaf =\n getMemberOrder(activeLeaf, this.props.Groups, this.props.groupIDs) === 1;\n const isLastLeaf =\n activeLeaf.id ===\n leafMembersOfCurrentGroup[leafMembersOfCurrentGroup.length - 1].id;\n const hasOnlyActiveLeaf = leafMembersOfCurrentGroup.length === 2; // 2 because there's none leaf\n // Generate drop down for each leaf attribute\n this.props.defaultAttributes.forEach(attributeDict => {\n if (attributeDict.name.includes('attached')) {\n if (\n hasOnlyActiveLeaf ||\n (isFirstLeaf && attributeDict.name.includes('above')) ||\n (isLastLeaf && attributeDict.name.includes('below'))\n ) {\n return;\n }\n }\n let fontSize = null;\n if (this.props.windowWidth <= 768) {\n fontSize = '12px';\n } else if (this.props.windowWidth <= 1024 && this.state.isBatch) {\n fontSize = '13px';\n } else if (this.props.windowWidth <= 1024) {\n fontSize = '14px';\n }\n let label = (\n \n {attributeDict.displayName}\n \n );\n // Generate eye toggle checkbox\n let eyeCheckbox = '';\n let eyeIsChecked =\n this.props.preferences.leaf &&\n this.props.preferences.leaf[attributeDict.name]\n ? this.props.preferences.leaf[attributeDict.name]\n : false;\n\n if (this.props.viewMode === 'TABULAR' && this.state.isBatch) {\n eyeCheckbox = (\n
\n }\n uncheckedIcon={}\n onClick={() =>\n this.clickVisibility(attributeDict.name, !eyeIsChecked)\n }\n style={\n this.props.windowWidth <= 1024\n ? { display: 'none' }\n : { display: 'inline-block', width: '25px' }\n }\n iconStyle={{ ...checkboxStyle().iconStyle }}\n checked={eyeIsChecked}\n onMouseEnter={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: true,\n });\n }}\n onMouseOut={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: false,\n });\n }}\n tabIndex={this.props.tabIndex}\n />\n \n {this.props.preferences[attributeDict.name]\n ? 'Hide attribute in the collation'\n : 'Show attribute in the collation'}\n
\n \n );\n } else if (this.props.viewMode === 'TABULAR') {\n // In single edit tabular mode - display eye icon with label\n label = (\n
\n }\n uncheckedIcon={}\n onClick={() =>\n this.clickVisibility(attributeDict.name, !eyeIsChecked)\n }\n style={{ display: 'inline-block', width: '25px' }}\n checked={eyeIsChecked}\n iconStyle={{ ...checkboxStyle().iconStyle, color: 'gray' }}\n labelStyle={{ ...checkboxStyle().labelStyle }}\n onMouseEnter={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: true,\n });\n }}\n onMouseOut={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: false,\n });\n }}\n tabIndex={this.props.tabIndex}\n />\n \n {eyeIsChecked\n ? 'Hide attribute in the collation'\n : 'Show attribute in the collation'}\n
\n \n );\n } else if (\n this.props.viewMode === 'VISUAL' &&\n attributeDict.name === 'folio_number'\n ) {\n // In single edit tabular mode - display eye icon with label\n label = (\n
\n }\n uncheckedIcon={}\n onClick={() =>\n this.clickVisibility(attributeDict.name, !eyeIsChecked)\n }\n style={{ display: 'inline-block', width: '25px' }}\n checked={eyeIsChecked}\n iconStyle={{ ...checkboxStyle().iconStyle, color: 'gray' }}\n labelStyle={{ ...checkboxStyle().labelStyle }}\n onMouseEnter={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: true,\n });\n }}\n onMouseOut={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: false,\n });\n }}\n tabIndex={this.props.tabIndex}\n />\n \n {eyeIsChecked\n ? 'Hide attribute in the collation'\n : 'Show attribute in the collation'}\n
\n \n );\n }\n if (this.state.isBatch && !this.props.isReadOnly) {\n // In batch edit for either edit modes\n label = (\n this.toggleCheckbox(attributeDict.name)}\n labelStyle={\n !this.state['batch_' + attributeDict.name]\n ? { color: 'gray' }\n : {}\n }\n checked={this.state['batch_' + attributeDict.name]}\n style={{ display: 'inline-block', width: '25px' }}\n disabled={\n attributeDict.name === 'conjoined_to' ||\n attributeDict.name.includes('attached')\n }\n tabIndex={this.props.tabIndex}\n {...checkboxStyle()}\n />\n );\n }\n let input = leafAttributes[attributeDict.name];\n if (!this.props.isReadOnly) {\n if (attributeDict.name === 'conjoined_to') {\n let menuItems = [];\n let value = this.state.isBatch ? '' : 'None';\n leafMembersOfCurrentGroup.forEach(member => {\n if (activeLeafOrder !== this.props.leafIDs.indexOf(member.id) + 1) {\n menuItems.push({\n value: member.id,\n text:\n this.props.leafIDs.indexOf(member.id) > -1\n ? (this.props.leafIDs.indexOf(member.id) + 1).toString()\n : 'None',\n });\n }\n if (member.id === leafAttributes['conjoined_to']) {\n value = member.id;\n }\n });\n input = (\n this.onConjoinChange(activeLeaf, v)}\n disabled={this.state.isBatch}\n tabIndex={this.props.tabIndex}\n data={menuItems}\n value={value}\n >\n );\n // folio number should be a text box, not a dropdown\n } else if (attributeDict.name === 'folio_number') {\n // Text box\n let textboxButtons = '';\n if (\n !this.state.isBatch &&\n this.state['editing_' + attributeDict.name]\n ) {\n textboxButtons = (\n
\n }\n style={{\n minWidth: this.props.windowWidth <= 1024 ? '35px' : '60px',\n marginLeft: '5px',\n }}\n onClick={e => this.textSubmit(e, attributeDict.name)}\n tabIndex={this.props.tabIndex}\n />\n }\n style={{\n minWidth: this.props.windowWidth <= 1024 ? '35px' : '60px',\n marginLeft: '5px',\n }}\n onClick={e => this.textCancel(e, attributeDict.name)}\n tabIndex={this.props.tabIndex}\n />\n
\n );\n }\n let value = '';\n if (this.state['editing_' + attributeDict.name]) {\n value = this.state[attributeDict.name];\n } else if (leafAttributes[attributeDict.name] !== null) {\n value = leafAttributes[attributeDict.name];\n }\n input = (\n
\n
this.textSubmit(e, attributeDict.name)}>\n \n this.onTextboxChange(v, attributeDict.name)\n }\n disabled={\n this.state.isBatch &&\n !this.state['batch_' + attributeDict.name]\n }\n tabIndex={this.props.tabIndex}\n inputStyle={{\n fontSize: this.props.windowWidth <= 768 ? '12px' : '16px',\n }}\n fullWidth\n />\n {textboxButtons}\n \n
\n );\n } else {\n let menuItems = [];\n let value = 'keep';\n // Populate drop down items\n if (attributeDict.options) {\n attributeDict.options.forEach((option, index) => {\n menuItems.push({ value: option, text: option });\n });\n }\n if (leafAttributes[attributeDict.name] === null) {\n menuItems.push({ value: 'keep', text: 'Keep same' });\n }\n if (this.state[attributeDict.name] !== '' && this.state.isBatch) {\n value = this.state[attributeDict.name];\n } else if (leafAttributes[attributeDict.name] !== null) {\n value = leafAttributes[attributeDict.name];\n }\n input = (\n this.dropDownChange(v, attributeDict.name)}\n disabled={\n this.state.isBatch && !this.state['batch_' + attributeDict.name]\n }\n tabIndex={this.props.tabIndex}\n data={menuItems}\n >\n );\n }\n } else if (!input && this.props.selectedLeaves.length > 1) {\n // We're in readOnly mode with no common attribute value\n input = (\n \n Different values\n \n );\n } else if (attributeDict.name === 'conjoined_to') {\n if (leafAttributes[attributeDict.name]) {\n input =\n this.props.leafIDs.indexOf(\n this.props.Leafs[leafAttributes[attributeDict.name]].id\n ) + 1;\n } else {\n input = 'None';\n }\n } else if (attributeDict.name === 'folio_number') {\n input = this.props.Leafs[this.props.selectedLeaves[0]].folio_number\n }\n attributeDivs.push(\n
\n
\n {eyeCheckbox}\n {label}\n
\n \n {input}\n
\n \n );\n });\n\n const leaf = this.props.Leafs[this.props.selectedLeaves[0]];\n let leafIndex = this.props.leafIDs.indexOf(leaf.id);\n let conjoinIndex = this.props.leafIDs.indexOf(leaf.conjoined_to);\n let firstInConjoin = leafIndex < conjoinIndex;\n\n let rectoIsPresent = Object.keys(this.props.Rectos[leaf.rectoID].image).length != 0\n let versoIsPresent = Object.keys(this.props.Versos[leaf.versoID].image).length != 0\n let leafImagePresent = [rectoIsPresent, versoIsPresent].every(v => v === true)\n\n let outsideFacingBtn = '';\n let insideFacingBtn = '';\n if (this.props.Leafs[this.props.selectedLeaves[0]].conjoined_to !== null && leafImagePresent === true) {\n if (firstInConjoin === true) {\n outsideFacingBtn = (\n this.toggleOutsideBifoliaModal(true)}\n label=\"Inner Bifolia\"\n style={{ marginBottom: 10}}\n tabIndex={this.props.tabIndex}\n />\n )\n } else if (firstInConjoin === false) {\n outsideFacingBtn = (\n this.toggleInsideBifoliaModal(true)}\n label=\"Inner Bifolia\"\n style={{ marginBottom: 10}}\n tabIndex={this.props.tabIndex}\n />\n )\n }\n }\n if (this.props.Leafs[this.props.selectedLeaves[0]].conjoined_to !== null && leafImagePresent === true) {\n if (firstInConjoin === true) {\n insideFacingBtn = (\n this.toggleInsideBifoliaModal(true)}\n label=\"Outer Bifolia\"\n style={{ marginBottom: 10}}\n tabIndex={this.props.tabIndex}\n />\n )\n } else if (firstInConjoin === false) {\n insideFacingBtn = (\n this.toggleOutsideBifoliaModal(true)}\n label=\"Outer Bifolia\"\n style={{ marginBottom: 10}}\n tabIndex={this.props.tabIndex}\n />\n )\n }\n }\n let submitBtn = '';\n if (this.state.isBatch && this.hasActiveAttributes()) {\n submitBtn = (\n \n );\n }\n let addBtn = '';\n if (!this.state.isBatch) {\n addBtn = (\n \n );\n }\n let deleteBtn = (\n \n );\n\n let conjoinButton = (\n \n );\n let generateFolioButton = this.state.isBatch ? (\n this.toggleFolioModal(true)}\n label=\"Generate folio/page numbers\"\n {...btnBase()}\n style={{ ...btnBase().style, marginBottom: 10, width: '100%' }}\n tabIndex={this.props.tabIndex}\n />\n ) : (\n ''\n );\n\n if (this.props.selectedLeaves.length < 2) {\n conjoinButton = '';\n } else {\n let parentIDs = this.props.selectedLeaves.map(leafID => {\n return this.props.Leafs[leafID].parentID;\n });\n let parentIDsSet = new Set(parentIDs);\n if (parentIDsSet.size !== 1) conjoinButton = '';\n }\n\n let imageModalContent;\n let insideBifoliaModalContent;\n let outsideBifoliaModalContent;\n let imageThumbnails = [];\n // Show the side image if available\n if (this.props.selectedLeaves.length === 1) {\n const leaf = this.props.Leafs[this.props.selectedLeaves[0]];\n const recto = this.props.Rectos[leaf.rectoID];\n const verso = this.props.Versos[leaf.versoID];\n // replace imageModalContent view OSD component\n const rectoURL = recto.image ? recto.image.url : null;\n const versoURL = verso.image ? verso.image.url : null;\n const isRectoDIY = recto.image.manifestID\n ? recto.image.manifestID.includes('DIY')\n : false;\n const isVersoDIY = verso.image.manifestID\n ? verso.image.manifestID.includes('DIY')\n : false;\n const isRecto3 = !!(recto.image.url && recto.image.url.includes(\"full\"));\n const isVerso3 = !!(verso.image.url && verso.image.url.includes(\"full\"));\n imageModalContent = (\n \n );\n\n const conjoinLeaf = this.props.Leafs[leaf.conjoined_to];\n if (conjoinLeaf !== undefined) {\n // get bifolia side objects\n const insideBifoliaVerso = this.props.Versos[leaf.versoID];\n const insideBifoliaRecto = this.props.Rectos[conjoinLeaf.rectoID];\n const outsideBifoliaRecto = this.props.Rectos[leaf.rectoID];\n const outsideBifoliaVerso = this.props.Versos[conjoinLeaf.versoID];\n\n //set URLs for bifolia images\n const insideBifoliaVersoURL = insideBifoliaVerso.image ? insideBifoliaVerso.image.url : null;\n const insideBifoliaRectoURL = insideBifoliaRecto.image ? insideBifoliaRecto.image.url : null;\n const outsideBifoliaRectoURL = outsideBifoliaRecto.image ? outsideBifoliaRecto.image.url : null;\n const outsideBifoliaVersoURL = outsideBifoliaVerso.image ? outsideBifoliaVerso.image.url : null;\n\n //test if the images are DIY (user uploaded instead of from a manifest)\n const isInsideBifoliaVersoDIY = insideBifoliaVerso.image.manifestID\n ? insideBifoliaVerso.image.manifestID.includes('DIY')\n : false;\n const isInsideBifoliaRectoDIY = insideBifoliaRecto.image.manifestID\n ? insideBifoliaRecto.image.manifestID.includes('DIY')\n : false;\n const isOutsideBifoliaRectoDIY = outsideBifoliaRecto.image.manifestID\n ? outsideBifoliaRecto.image.manifestID.includes('DIY')\n : false;\n const isOutsideBifoliaVersoDIY = outsideBifoliaVerso.image.manifestID\n ? outsideBifoliaVerso.image.manifestID.includes('DIY')\n : false;\n\n //set content for the modals\n insideBifoliaModalContent = (\n \n );\n outsideBifoliaModalContent = (\n \n );\n }\n if (rectoURL) {\n imageThumbnails.push(\n this.toggleImageModal(true)}\n tabIndex={this.props.tabIndex}\n >\n \n
\n {recto.memberType}\n \n );\n }\n if (versoURL) {\n imageThumbnails.push(\n this.toggleImageModal(true)}\n tabIndex={this.props.tabIndex}\n >\n \n
\n {verso.memberType}\n \n );\n }\n }\n\n const terms = this.renderTerms();\n return (\n
\n {attributeDivs}\n
\n {imageThumbnails}\n
\n
\n {insideFacingBtn}\n {outsideFacingBtn}\n
\n {this.props.isReadOnly && terms.length === 0 ? (\n ''\n ) : (\n
\n {this.props.isReadOnly ? (\n ''\n ) : (\n \n )}\n
\n

\n {Object.keys(this.props.selectedLeaves).length > 1\n ? 'Terms in common'\n : 'Terms'}\n

\n
{terms}
\n
\n
\n )}\n {submitBtn}\n\n {this.props.isReadOnly ? (\n ''\n ) : (\n
\n

Actions

\n {conjoinButton}\n {generateFolioButton}\n {addBtn}\n {deleteBtn}\n
\n )}\n\n this.toggleImageModal(false)}\n contentStyle={{ background: 'none', boxShadow: 'inherit' }}\n bodyStyle={{ padding: 0 }}\n >\n {imageModalContent}\n \n this.toggleInsideBifoliaModal(false)}\n contentStyle={{background: 'none', boxShadow: 'inherit'}}\n bodyStyle={{padding: 0}}\n >\n {insideBifoliaModalContent}\n \n this.toggleOutsideBifoliaModal(false)}\n contentStyle={{background: 'none', boxShadow: 'inherit'}}\n bodyStyle={{padding: 0}}\n >\n {outsideBifoliaModalContent}\n \n \n
\n );\n }\n}\n","import React from 'react';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport TextField from 'material-ui/TextField';\nimport IconSubmit from 'material-ui/svg-icons/action/done';\nimport IconClear from 'material-ui/svg-icons/content/clear';\nimport Visibility from 'material-ui/svg-icons/action/visibility';\nimport VisibilityOff from 'material-ui/svg-icons/action/visibility-off';\nimport AddTerm from './dialog/AddTerm';\nimport Dialog from 'material-ui/Dialog';\nimport ImageViewer from '../global/ImageViewer';\nimport SelectField from '../global/SelectField';\nimport { checkboxStyle } from '../../styles/checkbox';\nimport { renderTermChip } from '../../helpers/renderHelper';\n\n/** Side infobox */\nexport default class SideInfoBox extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n imageModalOpen: false,\n isBatch: this.props.selectedSides.length > 1,\n ...this.emptyAttributeState(),\n ...this.otherAttributeStates(),\n ...this.visibilityHoverState(),\n };\n }\n\n visibilityHoverState = () => {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state[\n 'visibility_hover_' + this.props.defaultAttributes[i]['name']\n ] = false;\n }\n return state;\n };\n\n /**\n * Creates a dictionary of attributes and if its toggled on or off during batch edit\n * This is used for the checkbox states\n */\n otherAttributeStates = () => {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state['batch_' + this.props.defaultAttributes[i]['name']] = false;\n state['editing_' + this.props.defaultAttributes[i]['name']] = false;\n }\n return state;\n };\n\n /**\n * Creates a dictionary of attributes with no values\n */\n emptyAttributeState = () => {\n let state = {};\n for (var i in this.props.defaultAttributes) {\n state[this.props.defaultAttributes[i]['name']] = null;\n }\n return state;\n };\n\n hasActiveAttributes = () => {\n for (var i in this.props.defaultAttributes) {\n if (\n this.props.defaultAttributes[i]['name'] === 'page_number' &&\n this.state['batch_' + this.props.defaultAttributes[i]['name']] &&\n this.state[this.props.defaultAttributes[i]['name']] !== 'Keep same'\n ) {\n return true;\n } else if (\n this.state['batch_' + this.props.defaultAttributes[i]['name']] &&\n this.state[this.props.defaultAttributes[i]['name']] !== 'keep' &&\n this.state[this.props.defaultAttributes[i]['name']] !== ''\n ) {\n return true;\n }\n }\n return false;\n };\n\n componentWillReceiveProps(nextProps) {\n this.setState({\n isBatch: nextProps.selectedSides.length > 1,\n });\n if (!this.state.isBatch) {\n this.setState({ ...this.emptyAttributeState() });\n }\n }\n\n dropDownChange = (value, attributeName) => {\n if (!this.state.isBatch) {\n // In single edit - we submit change immediately\n this.singleSubmit(attributeName, value);\n } else {\n // In batch edit - save change of attribute to the state\n let updatedAttribute = {};\n updatedAttribute[attributeName] = value;\n this.setState(updatedAttribute);\n }\n };\n\n onTextboxChange = (value, attributeName) => {\n let newAttributeState = {};\n newAttributeState[attributeName] = value;\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = true;\n this.setState({ ...newAttributeState, ...newEditingState });\n };\n\n textSubmit = (e, attributeName) => {\n e.preventDefault();\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = false;\n this.setState({ ...newEditingState });\n if (!this.state.isBatch) {\n this.singleSubmit(attributeName, this.state[attributeName]);\n }\n };\n\n singleSubmit = (attributeName, value) => {\n let attributes = {};\n attributes[attributeName] = value;\n let sideID = this.props.selectedSides[0];\n let side = {\n ...attributes,\n };\n this.props.action.updateSide(sideID, side);\n };\n\n textCancel = (e, attributeName) => {\n let newAttributeState = {};\n newAttributeState[attributeName] = this.props.Sides[\n this.props.selectedSides[0]\n ][attributeName];\n let newEditingState = {};\n newEditingState['editing_' + attributeName] = false;\n this.setState({ ...newAttributeState, ...newEditingState });\n };\n\n /**\n * Handle checkbox toggling by updating relevant attribute state\n */\n toggleCheckbox = target => {\n let newToggleState = {};\n newToggleState['batch_' + target] = !this.state['batch_' + target];\n this.setState(newToggleState);\n };\n\n batchSubmit = () => {\n let attributes = {};\n let sides = [];\n for (var i in this.props.defaultAttributes) {\n // Go through each default attributes\n let attrName = this.props.defaultAttributes[i]['name'];\n if (this.state['batch_' + attrName]) {\n // This side attribute was selected for batch edit\n // Get its new value\n let attrValue = this.state[this.props.defaultAttributes[i]['name']];\n if (\n attrValue !== null &&\n attrValue !== 'keep' &&\n attrValue !== 'Keep same'\n ) {\n attributes[attrName] = attrValue;\n }\n }\n }\n if (Object.keys(attributes).length > 0) {\n for (let id of this.props.selectedSides) {\n if (Object.keys(attributes).length > 0) {\n sides.push({ id, attributes });\n }\n }\n this.props.action.updateSides(sides);\n }\n this.setState({ ...this.otherAttributeStates() });\n };\n\n getAttributeValues = (selectedSides = this.props.selectedSides) => {\n let sideAttributes = {};\n for (var i in this.props.defaultAttributes) {\n let attributeName = this.props.defaultAttributes[i]['name'];\n for (let sideID of selectedSides) {\n const side = this.props.Sides[sideID];\n if (sideAttributes[attributeName] === undefined) {\n sideAttributes[attributeName] = side[attributeName];\n } else if (sideAttributes[attributeName] !== side[attributeName]) {\n sideAttributes[attributeName] = null;\n break;\n }\n }\n }\n return sideAttributes;\n };\n\n renderTerms = () => {\n let chips = [];\n for (let termID of this.props.commonTerms) {\n const term = this.props.Terms[termID];\n chips.push(renderTermChip(this.props, term));\n }\n return chips;\n };\n\n closeTermDialog = () => {\n this.setState({ activeTerm: null });\n };\n\n toggleImageModal = imageModalOpen => {\n this.setState({ imageModalOpen });\n };\n\n clickVisibility = (attributeName, value) => {\n if (attributeName !== 'script_direction') {\n this.props.action.updatePreferences({\n side: { ...this.props.preferences.side, [attributeName]: value },\n });\n }\n };\n\n renderTooltip = (eyeIsChecked, eyeStyle, attributeDict) => {\n return (\n 0 ? { display: 'none' } : {}}\n >\n {eyeIsChecked\n ? 'Hide attribute in the collation'\n : 'Show attribute in the collation'}\n \n );\n };\n render() {\n let attributeDivs = [];\n let sideAttributes = this.getAttributeValues();\n for (var i in this.props.defaultAttributes) {\n let attributeDict = this.props.defaultAttributes[i];\n if (attributeDict.name === 'uri') continue;\n // Generate checkbox if we're in batch edit mode\n let label = attributeDict.displayName;\n // Generate eye toggle checkbox\n let eyeCheckbox = '';\n\n let eyeStyle = {};\n let eyeIsChecked =\n this.props.preferences.side &&\n this.props.preferences.side[attributeDict.name]\n ? this.props.preferences.side[attributeDict.name]\n : false;\n if (this.props.viewMode !== 'TABULAR') {\n if (attributeDict.name === 'script_direction') {\n eyeStyle = { fill: '#C2C2C2', cursor: 'not-allowed' };\n eyeIsChecked = false;\n }\n }\n if (this.state.isBatch && !this.props.isReadOnly) {\n eyeCheckbox = (\n
\n }\n uncheckedIcon={}\n onClick={() =>\n this.clickVisibility(attributeDict.name, !eyeIsChecked)\n }\n style={\n this.props.windowWidth <= 1024\n ? { display: 'none' }\n : { display: 'inline-block', width: '25px', ...eyeStyle }\n }\n iconStyle={{ ...checkboxStyle().iconStyle, ...eyeStyle }}\n checked={eyeIsChecked}\n onMouseEnter={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: true,\n });\n }}\n onMouseOut={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: false,\n });\n }}\n tabIndex={this.props.tabIndex}\n />\n {this.renderTooltip(eyeIsChecked, eyeStyle, attributeDict)}\n
\n );\n label = (\n this.toggleCheckbox(attributeDict.name)}\n labelStyle={\n !this.state['batch_' + attributeDict.name]\n ? { color: 'gray', ...checkboxStyle().labelStyle }\n : { ...checkboxStyle().labelStyle }\n }\n iconStyle={{ ...checkboxStyle().iconStyle }}\n checked={this.state['batch_' + attributeDict.name]}\n style={{ display: 'inline-block', width: '25px' }}\n disabled={this.state.isBatch && attributeDict.name === 'uri'}\n tabIndex={this.props.tabIndex}\n />\n );\n } else {\n // In single edit, display eye icon with label (no checkbox)\n label = (\n
\n }\n uncheckedIcon={}\n onClick={() =>\n this.clickVisibility(attributeDict.name, !eyeIsChecked)\n }\n style={{ display: 'inline-block', width: '25px', ...eyeStyle }}\n {...checkboxStyle()}\n iconStyle={{\n ...checkboxStyle().iconStyle,\n color: 'gray',\n ...eyeStyle,\n }}\n checked={eyeIsChecked}\n onMouseEnter={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: true,\n });\n }}\n onMouseOut={() => {\n this.setState({\n ['visibility_hover_' + attributeDict.name]: false,\n });\n }}\n tabIndex={this.props.tabIndex}\n />\n {this.renderTooltip(eyeIsChecked, eyeStyle, attributeDict)}\n
\n );\n }\n // Generate dropdown or text box depending on the current attribute\n let input = sideAttributes[attributeDict.name];\n if (!this.props.isReadOnly) {\n if (attributeDict.options !== undefined) {\n // Drop down menu\n let menuItems = [];\n for (var j in attributeDict.options) {\n let option = attributeDict.options[j];\n menuItems.push({ value: option, text: option });\n }\n if (sideAttributes[attributeDict.name] === null) {\n menuItems.push({ value: 'keep', text: 'Keep same' });\n }\n let value = this.state.isBatch ? 'keep' : '';\n if (this.state[attributeDict.name] !== null && this.state.isBatch) {\n value = this.state[attributeDict.name];\n } else if (sideAttributes[attributeDict.name] !== null) {\n value = sideAttributes[attributeDict.name];\n }\n input = (\n this.dropDownChange(v, attributeDict.name)}\n disabled={\n this.state.isBatch && !this.state['batch_' + attributeDict.name]\n }\n tabIndex={this.props.tabIndex}\n data={menuItems}\n >\n );\n } else {\n // Text box\n let textboxButtons = '';\n if (\n !this.state.isBatch &&\n this.state['editing_' + attributeDict.name]\n ) {\n textboxButtons = (\n
\n }\n style={{\n minWidth: this.props.windowWidth <= 1024 ? '35px' : '60px',\n marginLeft: '5px',\n }}\n onClick={e => this.textSubmit(e, attributeDict.name)}\n tabIndex={this.props.tabIndex}\n />\n }\n style={{\n minWidth: this.props.windowWidth <= 1024 ? '35px' : '60px',\n marginLeft: '5px',\n }}\n onClick={e => this.textCancel(e, attributeDict.name)}\n tabIndex={this.props.tabIndex}\n />\n
\n );\n }\n let value = this.state.isBatch ? 'Keep same' : '';\n if (this.state['editing_' + attributeDict.name]) {\n value = this.state[attributeDict.name];\n } else if (sideAttributes[attributeDict.name] !== null) {\n value = sideAttributes[attributeDict.name];\n }\n input = (\n
\n
this.textSubmit(e, attributeDict.name)}>\n \n this.onTextboxChange(v, attributeDict.name)\n }\n disabled={\n this.state.isBatch &&\n !this.state['batch_' + attributeDict.name]\n }\n tabIndex={this.props.tabIndex}\n inputStyle={{\n fontSize: this.props.windowWidth <= 768 ? '12px' : '16px',\n }}\n />\n {textboxButtons}\n \n
\n );\n }\n } else {\n // We're in readOnly mode with no common attribute value\n if (!input && this.props.selectedSides.length > 1) {\n input = (\n \n Different values\n \n );\n } else {\n input = (\n \n {input}\n \n );\n }\n }\n attributeDivs.push(\n
\n
\n {eyeCheckbox}\n {label}\n
\n
{input}
\n
\n );\n }\n const terms = this.renderTerms();\n let termsDiv = [];\n if (!(this.props.isReadOnly && terms.length === 0)) {\n termsDiv.push(\n \n {this.props.isReadOnly ? (\n ''\n ) : (\n \n this.props.action.linkTerm(termID, this.props.sideIndex),\n createAndAttachTerm: this.props.action.createAndAttachTerm,\n }}\n Taxonomies={this.props.Taxonomies}\n togglePopUp={this.props.togglePopUp}\n tabIndex={this.props.tabIndex}\n groupIDs={this.props.groupIDs}\n leafIDs={this.props.leafIDs}\n />\n )}\n

\n {Object.keys(this.props.selectedSides).length > 1\n ? 'Terms in common'\n : 'Terms'}\n

\n
{terms}
\n \n );\n }\n\n let submitBtn = '';\n if (this.state.isBatch && this.hasActiveAttributes()) {\n submitBtn = (\n \n );\n }\n\n let imageModalContent;\n let imageThumbnail = [];\n // Show the side image if available\n if (this.props.selectedSides.length === 1) {\n const side = this.props.Sides[this.props.selectedSides[0]];\n // replace imageModalContent view OSD component\n const rectoURL = side.memberType === 'Recto' ? side.image.url : null;\n const versoURL = side.memberType === 'Verso' ? side.image.url : null;\n const isRectoDIY =\n side.image.manifestID && side.image.manifestID.includes('DIY');\n const isVersoDIY =\n side.image.manifestID && side.image.manifestID.includes('DIY');\n imageModalContent = (\n \n );\n if (side.image.url) {\n imageThumbnail.push(\n this.toggleImageModal(true)}\n tabIndex={this.props.tabIndex}\n >\n \n \n );\n }\n }\n\n return (\n
\n {attributeDivs}\n
\n {imageThumbnail}\n
\n {termsDiv}\n {submitBtn}\n this.toggleImageModal(false)}\n contentStyle={{ background: 'none', boxShadow: 'inherit' }}\n bodyStyle={{ padding: 0 }}\n >\n {imageModalContent}\n \n
\n );\n }\n}\n","let fontSize = null;\nif (window.innerWidth<=768) {\n fontSize = \"12px\";\n} else if (window.innerWidth<=1024) {\n fontSize = \"14px\";\n}\n\nlet infoBoxStyle = {\n tab: {\n color: '#6A6A6A',\n fontSize,\n },\n}\nexport default infoBoxStyle;","export function addLeafs(leaf, additional) {\n let successMessage = 'Successfully added the leaf';\n if (additional.noOfLeafs > 1)\n successMessage = 'Successfully added the leaves';\n\n return {\n types: [\n 'CREATE_LEAVES_FRONTEND',\n 'CREATE_LEAVES_SUCCESS_BACKEND',\n 'CREATE_LEAVES_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/leafs`,\n method: 'post',\n data: { leaf, additional },\n successMessage,\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function updateLeaf(leafID, leaf) {\n return {\n types: [\n 'UPDATE_LEAF_FRONTEND',\n 'UPDATE_LEAF_SUCCESS_BACKEND',\n 'UPDATE_LEAF_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/leafs/${leafID}`,\n method: 'put',\n data: { leaf },\n successMessage: 'Successfully updated the leaf',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function updateLeafs(leafs, project_id) {\n return {\n types: [\n 'UPDATE_LEAVES_FRONTEND',\n 'UPDATE_LEAVES_SUCCESS_BACKEND',\n 'UPDATE_LEAVES_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/leafs`,\n method: 'put',\n data: { leafs, project_id },\n successMessage: 'Successfully updated the leaves',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\n/**\n leafs: [\n \"59ea025c3b0eb7168e9591de\",\n \"59ea025c3b0eb7168e9591de\",\n \"59ea025c3b0eb7168e9591de\",\n \"59ea025c3b0eb7168e9591de\"\n ]\n */\nexport function autoConjoinLeafs(leafs) {\n return {\n types: [\n 'AUTOCONJOIN_LEAFS_FRONTEND',\n 'AUTOCONJOIN_LEAFS_SUCCESS_BACKEND',\n 'AUTOCONJOIN_LEAFS_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/leafs/conjoin`,\n method: 'put',\n data: { leafs },\n successMessage: 'Successfully conjoined the leaves',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function deleteLeaf(leafID) {\n return {\n types: [\n 'DELETE_LEAF_FRONTEND',\n 'DELETE_LEAF_SUCCESS_BACKEND',\n 'DELETE_LEAF_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/leafs/${leafID}`,\n method: 'delete',\n successMessage: 'Successfully deleted the leaf',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function deleteLeafs(leafs) {\n return {\n types: [\n 'DELETE_LEAVES_FRONTEND',\n 'DELETE_LEAFS_SUCCESS_BACKEND',\n 'DELETE_LEAFS_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/leafs`,\n method: 'delete',\n data: leafs,\n successMessage: 'Successfully deleted the leaves',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function generateFolioNumbers(startNumber, leafIDs) {\n return {\n types: [\n 'GENERATE_FOLIO_NUMBERS_FRONTEND',\n 'GENERATE_FOLIO_NUMBERS_SUCCESS_BACKEND',\n 'GENERATE_FOLIO_NUMBERS_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/leafs/generateFolio`,\n method: 'put',\n data: { startNumber, leafIDs },\n successMessage: 'Successfully generated the folio numbers',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function generatePageNumbers(startNumber, rectoIDs, versoIDs) {\n return {\n types: [\n 'GENERATE_PAGE_NUMBERS_FRONTEND',\n 'GENERATE_PAGE_NUMBERS_SUCCESS_BACKEND',\n 'GENERATE_PAGE_NUMBERS_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/sides/generatePageNumber`,\n method: 'put',\n data: { startNumber, rectoIDs, versoIDs },\n successMessage: 'Successfully generated the page numbers',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n","\nexport function addGroups(group, additional) {\n return {\n types: ['CREATE_GROUPS_FRONTEND','CREATE_GROUPS_SUCCESS_BACKEND','CREATE_GROUPS_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/groups`,\n method: 'post',\n data: {group, additional},\n successMessage: \"Successfully added the groups\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}\n\nexport function updateGroup(groupID, group) {\n return {\n types: ['UPDATE_GROUP_FRONTEND','UPDATE_GROUP_SUCCESS_BACKEND','UPDATE_GROUP_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/groups/${groupID}`,\n method: 'put',\n data: {group},\n successMessage: \"Successfully updated the group\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}\n\nexport function updateGroups(groups) {\n return {\n types: ['UPDATE_GROUPS_FRONTEND','UPDATE_GROUPS_SUCCESS_BACKEND','UPDATE_GROUPS_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/groups`,\n method: 'put',\n data: {groups},\n successMessage: \"Successfully updated the groups\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}\n\nexport function deleteGroup(groupID) {\n return {\n types: ['DELETE_GROUP_FRONTEND','DELETE_GROUP_SUCCESS_BACKEND','DELETE_GROUP_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/groups/${groupID}`,\n method: 'delete',\n successMessage: \"Successfully deleted the group\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}\n\nexport function deleteGroups(groups, projectID) {\n return {\n types: ['DELETE_GROUPS_FRONTEND','DELETE_GROUPS_SUCCESS_BACKEND','DELETE_GROUPS_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/groups`,\n method: 'delete',\n data: {...groups, projectID},\n successMessage: \"Successfully deleted the groups\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}","export function updateSide(sideID, side) {\n return {\n types: ['UPDATE_SIDE_FRONTEND','UPDATE_SIDE_SUCCESS_BACKEND','UPDATE_SIDE_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/sides/${sideID}`,\n method: 'put',\n data: {side},\n successMessage: \"Successfully updated the side\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}\n\nexport function updateSides(sides) {\n return {\n types: ['UPDATE_SIDES_FRONTEND','UPDATE_SIDES_SUCCESS_BACKEND','UPDATE_SIDES_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/sides`,\n method: 'put',\n data: {sides},\n successMessage: \"Successfully updated the sides\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n };\n}","export function addTerm(term) {\n /**\n term: {\n \"project_id\": \"5951303fc9bf3c7b9a573a3f\",\n \"id\": \"595130sadsadsa9bf3c7b9a573a3f\"\n \"title\": \"some title for term\",\n \"taxonomy\": \"Ink\",\n \"description\": \"blue ink\",\n \"uri\": \"https://www.test.com/\",\n \"show\": \"true\"\n }\n */\n return {\n types: [\n 'CREATE_TERM_FRONTEND',\n 'CREATE_TERM_SUCCESS_BACKEND',\n 'CREATE_TERM_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms`,\n method: 'post',\n data: { term },\n successMessage: 'Successfully created the term',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function updateTerm(termID, term) {\n /**\n term: {\n \"title\": \"some title for term\",\n \"taxonomy\": \"Ink\",\n \"description\": \"blue ink\"\n \"uri\": \"https://www.test.com/\",\n }\n */\n return {\n types: [\n 'UPDATE_TERM_FRONTEND',\n 'UPDATE_TERM_SUCCESS_BACKEND',\n 'UPDATE_TERM_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms/${termID}`,\n method: 'put',\n data: { term },\n successMessage: 'Successfully updated the term',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n };\n}\n\nexport function deleteTerm(termID) {\n return {\n types: [\n 'DELETE_TERM_FRONTEND',\n 'DELETE_TERM_SUCCESS_BACKEND',\n 'DELETE_TERM_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms/${termID}`,\n method: 'delete',\n successMessage: 'Successfully deleted the term',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function linkTerm(termID, objects) {\n /**\n objects: [\n {\n \"id\": \"5951303fc9bf3c7b9a573a3f\",\n \"type\": \"Group\"\n },\n ]\n */\n return {\n types: [\n 'LINK_TERM_FRONTEND',\n 'LINK_TERM_SUCCESS_BACKEND',\n 'LINK_TERM_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms/${termID}/link`,\n method: 'put',\n data: { objects },\n successMessage: 'Successfully linked the term',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function unlinkTerm(termID, objects) {\n /**\n objects: [\n {\n \"id\": \"5951303fc9bf3c7b9a573a3f\",\n \"type\": \"Group\"\n },\n ]\n */\n return {\n types: [\n 'UNLINK_TERM_FRONTEND',\n 'UNLINK_TERM_SUCCESS_BACKEND',\n 'UNLINK_TERM_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms/${termID}/unlink`,\n method: 'put',\n data: { objects },\n successMessage: 'Successfully unlinked the term',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function createTaxonomy(taxonomy) {\n /**\n \"taxonomy\": {\n \"project_id\": \"5951303fc9bf3c7b9a573a3f\",\n \"taxonomy\": \"Ink\"\n }\n */\n return {\n types: [\n 'CREATE_TAXONOMY_FRONTEND',\n 'CREATE_TAXONOMY_SUCCESS_BACKEND',\n 'CREATE_TAXONOMY_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms/taxonomy`,\n method: 'post',\n data: { taxonomy },\n successMessage: 'Successfully created the term taxonomy',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function updateTaxonomy(taxonomy) {\n /**\n \"taxonomy\": {\n \"project_id\": \"5951303fc9bf3c7b9a573a3f\",\n \"taxonomy\": \"Ink\",\n \"old_taxonomy\": \"Inkss\"\n }\n */\n return {\n types: [\n 'UPDATE_TAXONOMY_FRONTEND',\n 'UPDATE_TAXONOMY_SUCCESS_BACKEND',\n 'UPDATE_TAXONOMY_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms/taxonomy`,\n method: 'put',\n data: { taxonomy },\n successMessage: 'Successfully updated the term taxonomy',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n\nexport function deleteTaxonomy(taxonomy) {\n /**\n \"taxonomy\": {\n \"project_id\": \"5951303fc9bf3c7b9a573a3f\",\n \"taxonomy\": \"Ink\"\n }\n */\n return {\n types: [\n 'DELETE_TAXONOMY_FRONTEND',\n 'DELETE_TAXONOMY_SUCCESS_BACKEND',\n 'DELETE_TAXONOMY_FAILED_BACKEND',\n ],\n payload: {\n request: {\n url: `/terms/taxonomy`,\n method: 'delete',\n data: { taxonomy },\n successMessage: 'Successfully deleted the term taxonomy',\n errorMessage: 'Ooops! Something went wrong',\n },\n },\n isUndoable: true,\n };\n}\n","export function changeViewMode(viewMode) {\n return {\n type: 'CHANGE_VIEW_MODE',\n payload: viewMode,\n };\n}\n\nexport function changeManagerMode(managerMode) {\n return {\n type: 'CHANGE_MANAGER_MODE',\n payload: managerMode,\n };\n}\n\nexport function changeTermsTab(newTab) {\n return {\n type: 'CHANGE_TERMS_TAB',\n payload: newTab,\n };\n}\n\nexport function changeImageTab(newTab) {\n return {\n type: 'CHANGE_IMAGES_TAB',\n payload: newTab,\n };\n}\n\nexport function toggleFilterPanel(value) {\n return {\n type: 'TOGGLE_FILTER_PANEL',\n payload: value,\n };\n}\n\nexport function handleObjectPress(selectedObjects, object, event) {\n selectedObjects = {\n ...selectedObjects,\n members: [...selectedObjects.members],\n };\n selectedObjects.type = object.memberType;\n selectedObjects.members = [object.id];\n\n return {\n type: 'TOGGLE_SELECTED_OBJECTS',\n payload: selectedObjects,\n };\n}\n\nexport function handleObjectClick(selectedObjects, object, event, objects) {\n selectedObjects = {\n ...selectedObjects,\n members: [...selectedObjects.members],\n };\n if (\n event.ctrlKey ||\n event.metaKey ||\n (event.modifiers !== undefined && event.modifiers.command)\n ) {\n // Toggle this object without clearing active objects unless type is different\n if (selectedObjects.type !== object.memberType) {\n selectedObjects.members = [];\n selectedObjects.type = object.memberType;\n }\n const index = selectedObjects.members.indexOf(object.id);\n if (index !== -1) {\n selectedObjects.members.splice(index, 1);\n } else {\n selectedObjects.members.push(object.id);\n }\n }\n if (event.button === 0 || event.modifiers !== undefined) {\n let notCtrl =\n event.ctrlKey !== undefined && !event.ctrlKey && !event.shiftKey;\n let notCmd =\n event.metaKey !== undefined && !event.metaKey && !event.shiftKey;\n let notCanvasCmd =\n event.modifiers !== undefined &&\n !event.modifiers.command &&\n !event.modifiers.shift;\n if ((notCtrl && notCmd) || notCanvasCmd) {\n // Clear all and toggle only this object\n if (selectedObjects.members.includes(object.id)) {\n selectedObjects.members = [];\n } else {\n selectedObjects.members = [object.id];\n }\n }\n if (\n event.shiftKey ||\n (event.modifiers !== undefined && event.modifiers.shift)\n ) {\n window.getSelection().removeAllRanges();\n // Object type changed, clear all active selected objects\n if (selectedObjects.type !== object.memberType) {\n selectedObjects.members = [object.id];\n } else {\n // Select all similar type objects within this object and last selected object\n const orderOfCurrentElement = objects[object.memberType + 's'].indexOf(\n object.id\n );\n const orderOfLastElement = objects[object.memberType + 's'].indexOf(\n selectedObjects.lastSelected\n );\n let indexes = [orderOfLastElement, orderOfCurrentElement];\n indexes.sort((a, b) => {\n return a - b;\n });\n const currentSelected = [...selectedObjects.members];\n selectedObjects.members = objects[object.memberType + 's'].slice(\n indexes[0],\n indexes[1] + 1\n );\n for (let id of currentSelected) {\n if (!selectedObjects.members.includes(id))\n selectedObjects.members.push(id);\n }\n }\n }\n }\n // Sort the selected members by ascending order\n selectedObjects.members.sort((a, b) =>\n objects[object.memberType + 's'].indexOf(a) >\n objects[object.memberType + 's'].indexOf(b)\n ? 1\n : -1\n );\n\n if (selectedObjects.members.length === 0) {\n selectedObjects.type = '';\n } else {\n selectedObjects.type = object.memberType;\n selectedObjects.lastSelected = object.id;\n }\n\n return {\n type: 'TOGGLE_SELECTED_OBJECTS',\n payload: selectedObjects,\n };\n}\n\n/**\n * Switch selectedObjects between types: Leaf, Recto, Verso\n * @param {object} selectedObjects currently selected objects\n * @param {string} newType new type to switch to (leaf, recto or verso)\n * @param {object} Leafs all Leaf, Recto & Verso objects of this project\n */\nexport function changeInfoBoxTab(newType, selectedObjects, objects) {\n let newSelectedObjects = { type: newType, members: [], lastSelected: '' };\n if (selectedObjects.type === 'newType') return { type: 'NO_TAB_CHANGE' };\n\n const object = objects[selectedObjects.type + 's'];\n\n switch (newType) {\n case 'Leaf':\n for (let id of selectedObjects.members) {\n newSelectedObjects.members.push(object[id].parentID);\n }\n break;\n case 'Recto':\n for (let id of selectedObjects.members) {\n if (selectedObjects.type === 'Leaf')\n newSelectedObjects.members.push(object[id].rectoID);\n else\n newSelectedObjects.members.push(\n objects.Leafs[object[id].parentID].rectoID\n );\n }\n break;\n case 'Verso':\n for (let id of selectedObjects.members) {\n if (selectedObjects.type === 'Leaf')\n newSelectedObjects.members.push(object[id].versoID);\n else\n newSelectedObjects.members.push(\n objects.Leafs[object[id].parentID].versoID\n );\n }\n break;\n default:\n break;\n }\n\n newSelectedObjects.lastSelected =\n newSelectedObjects.members[newSelectedObjects.members.length - 1];\n\n return {\n type: 'TOGGLE_SELECTED_OBJECTS',\n payload: newSelectedObjects,\n };\n}\n\nexport function toggleVisualizationDrawing(request) {\n return {\n type: 'TOGGLE_VISUALIZATION_DRAWING',\n payload: request,\n };\n}\n","\nexport function filterProject(projectID, queries) {\n /**\n \"queries\": [\n {\n \"type\": \"Leaf\",\n \"attribute\": \"material\",\n \"condition\": \"equals\",\n \"values\": [\"paper\"],\n \"conjunction\": \"AND\"\n }\n ]\n */\n return {\n types: ['SHOW_LOADING','FILTER_PROJECT_SUCCESS','FILTER_PROJECT_FAILED'],\n payload: {\n request : {\n url: `/projects/${projectID}/filter`,\n method: 'put',\n data: queries,\n successMessage: \"Successfully filtered the project\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}\n\nexport function reapplyFilterProject(projectID, filters) {\n const { queries, active } = filters;\n if (!active)\n return {type: \"NO_FILTER_CHANGE\"}\n let index = 0;\n let haveErrors = false;\n for (let query of queries) {\n if (query.type === null)\n haveErrors = true\n if (query.attribute === \"\")\n haveErrors = true\n if (query.values.length === 0)\n haveErrors = true\n if (query.condition === \"\")\n haveErrors = true\n if (index !== queries.length-1)\n if (query.conjunction === \"\")\n haveErrors = true\n index += 1;\n }\n if (!haveErrors){\n return {\n types: ['NO_LOADING','FILTER_PROJECT_SUCCESS','FILTER_PROJECT_FAILED'],\n payload: {\n request : {\n url: `/projects/${projectID}/filter`,\n method: 'put',\n data: {queries},\n successMessage: \"\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n }\n return { type: \"NO_FILTER_CHANGE\" }\n}\n\n\nexport function resetFilters(queries) {\n return {\n type: 'RESET_FILTERS',\n payload: queries,\n };\n}\n\n\nexport function toggleFilterDisplay() {\n return {\n type: 'TOGGLE_FILTER_DISPLAY'\n };\n}\n\n\nexport function updateFilterQuery(newQueries) {\n return {\n type: 'UPDATE_FILTER_QUERY',\n payload: newQueries\n };\n}\n\n\nexport function updateFilterSelection(selection, matchingFilterObjects, allObjects) {\n let type = selection.split(\"_\")[0];\n const select = selection.split(\"_\")[1];\n let selectedObjects = { type: type? type.slice(0,-1) : type, members: [], lastSelected: \"\" };\n if (select===\"all\"){\n selectedObjects.members = allObjects[type.slice(0, type.length-1)+\"IDs\"];\n } else if (select===\"matching\") {\n selectedObjects.members = allObjects[type.slice(0, type.length-1)+\"IDs\"].filter((id) => {\n if (type===\"Rectos\" || type===\"Versos\")\n return matchingFilterObjects.Sides.includes(id)\n else\n return matchingFilterObjects[type].includes(id)\n })\n }\n return {\n type: 'UPDATE_FILTER_SELECTION',\n payload: {\n selection,\n selectedObjects\n }\n };\n}","import React from 'react';\nimport GroupInfoBox from '../components/infoBox/GroupInfoBox';\nimport LeafInfoBox from '../components/infoBox/LeafInfoBox';\nimport SideInfoBox from '../components/infoBox/SideInfoBox';\nimport infoBoxStyle from '../styles/infobox';\nimport { Tabs, Tab } from 'material-ui/Tabs';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport AddGroupDialog from '../components/infoBox/dialog/AddGroupDialog';\nimport { connect } from 'react-redux';\nimport {\n addLeafs,\n updateLeaf,\n updateLeafs,\n autoConjoinLeafs,\n deleteLeaf,\n deleteLeafs,\n generateFolioNumbers,\n generatePageNumbers,\n} from '../actions/backend/leafActions';\nimport {\n addGroups,\n updateGroup,\n updateGroups,\n deleteGroup,\n deleteGroups,\n} from '../actions/backend/groupActions';\nimport { updateSide, updateSides } from '../actions/backend/sideActions';\nimport { addTerm, linkTerm } from '../actions/backend/termActions';\nimport {\n changeInfoBoxTab,\n toggleVisualizationDrawing,\n} from '../actions/backend/interactionActions';\nimport { reapplyFilterProject } from '../actions/backend/filterActions';\nimport { updatePreferences } from '../actions/backend/projectActions';\n\n/** Container of the leaf, group and side infoboxes */\nclass InfoBox extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n addGroupDialogOpen: false,\n };\n }\n\n toggleAddGroupDialog = (value = false) => {\n this.setState({ addGroupDialogOpen: value });\n this.props.togglePopUp(value);\n };\n\n addLeafs = data => {\n let leafIDs = [];\n const userID = this.props.user.id;\n for (let count = 0; count < data.additional.noOfLeafs; count++) {\n const date = Date.now().toString();\n const IDHash = userID + date + count;\n leafIDs.push(IDHash.substr(IDHash.length - 24));\n }\n let sideIDs = [];\n for (\n let count = leafIDs.length;\n count < leafIDs.length + data.additional.noOfLeafs * 2;\n count++\n ) {\n const date = Date.now().toString();\n const IDHash = userID + date + count;\n sideIDs.push(IDHash.substr(IDHash.length - 24));\n }\n data.additional['leafIDs'] = leafIDs;\n data.additional['sideIDs'] = sideIDs;\n this.props.addLeafs(\n data.leaf,\n data.additional,\n this.props.projectID,\n this.props.filters\n );\n };\n\n updateLeaf = (leafID, leaf) => {\n this.props.updateLeaf(\n leafID,\n leaf,\n this.props.projectID,\n this.props.filters\n );\n };\n\n updateLeafs = leafs => {\n this.props.updateLeafs(leafs, this.props.projectID, this.props.filters);\n };\n\n autoConjoinLeafs = () => {\n this.props.autoConjoinLeafs(\n this.props.selectedObjects.members,\n this.props.projectID,\n this.props.filters\n );\n };\n\n deleteLeaf = leafID => {\n this.props.deleteLeaf(leafID, this.props.projectID, this.props.filters);\n };\n\n deleteLeafs = leafs => {\n this.props.deleteLeafs(leafs, this.props.projectID, this.props.filters);\n };\n\n updateGroup = (groupID, group) => {\n this.props.updateGroup(\n groupID,\n group,\n this.props.projectID,\n this.props.filters\n );\n };\n\n updateGroups = groups => {\n this.props.updateGroups(groups, this.props.projectID, this.props.filters);\n };\n\n addGroups = data => {\n const userID = this.props.user.id;\n let groupIDs = [];\n for (let count = 0; count < data.additional.noOfGroups; count++) {\n const date = Date.now().toString();\n const IDHash = userID + date + count;\n groupIDs.push(IDHash.substr(IDHash.length - 24));\n }\n let leafIDs = [];\n for (\n let count = groupIDs.length;\n count < groupIDs.length + groupIDs.length * data.additional.noOfLeafs;\n count++\n ) {\n const date = Date.now().toString();\n const IDHash = userID + date + count;\n leafIDs.push(IDHash.substr(IDHash.length - 24));\n }\n let sideIDs = [];\n for (\n let count = groupIDs.length * leafIDs.length;\n count < groupIDs.length * leafIDs.length + leafIDs.length * 2;\n count++\n ) {\n const date = Date.now().toString();\n const IDHash = userID + date + count;\n sideIDs.push(IDHash.substr(IDHash.length - 24));\n }\n data.additional['groupIDs'] = groupIDs;\n data.additional['leafIDs'] = leafIDs;\n data.additional['sideIDs'] = sideIDs;\n this.props.addGroups(\n data.group,\n data.additional,\n this.props.projectID,\n this.props.filters\n );\n };\n\n // if the group is a subgroup, reset tacketing on the parent\n resetTacket = (groupID) => {\n let group = {};\n group['tacketed'] = [];\n group['sewing'] = []\n let parentID = this.props.Groups[groupID].parentID\n this.updateGroup(parentID, group);\n }\n\n deleteGroup = groupID => {\n // reset tacket on parent\n if (this.props.Groups[groupID].parentID) {\n this.resetTacket(groupID)\n }\n this.props.deleteGroup(groupID, this.props.projectID, this.props.filters);\n };\n\n deleteGroups = groups => {\n this.props.deleteGroups(groups, this.props.projectID, this.props.filters);\n };\n\n updateSide = (sideID, side) => {\n this.props.updateSide(\n sideID,\n side,\n this.props.projectID,\n this.props.filters\n );\n };\n\n updateSides = sides => {\n this.props.updateSides(sides, this.props.projectID, this.props.filters);\n };\n\n linkTerm = termID => {\n let objects = [];\n let type = this.props.selectedObjects.type;\n if (type === 'Recto' || type === 'Verso') type = 'Side';\n for (let id of this.props.selectedObjects.members) {\n objects.push({ id, type });\n }\n this.props.action.linkTerm(\n termID,\n objects,\n this.props.projectID,\n this.props.filters\n );\n };\n\n unlinkTerm = (termID, sideIndex) => {\n let objects = [];\n let type = this.props.selectedObjects.type;\n for (let id of this.props.selectedObjects.members) {\n objects.push({ id, type });\n }\n this.props.action.unlinkTerm(\n termID,\n objects,\n this.props.projectID,\n this.props.filters\n );\n };\n\n createAndAttachTerm = (termTitle, taxonomy, description, uri, show) => {\n let objects = [];\n let type = this.props.selectedObjects.type;\n if (type === 'Recto' || type === 'Verso') type = 'Side';\n for (let id of this.props.selectedObjects.members) {\n objects.push({ id, type });\n }\n const userID = this.props.user.id;\n const date = Date.now().toString();\n const IDHash = userID + date;\n const id = IDHash.substr(IDHash.length - 24);\n let term = {\n project_id: this.props.projectID,\n id: id,\n title: termTitle,\n taxonomy: taxonomy,\n description: description,\n uri: uri,\n show: show,\n };\n this.props.createAndAttachTerm(\n term,\n objects,\n this.props.projectID,\n this.props.filters\n );\n };\n\n generateFolioNumbers = startNumber => {\n let leafIDs = this.props.collationManager.selectedObjects.members;\n\n this.props.generateFolioNumbers(startNumber, leafIDs);\n };\n\n generatePageNumbers = startNumber => {\n let leafIDs = this.props.collationManager.selectedObjects.members;\n let rectoIDs = [];\n let versoIDs = [];\n\n for (const leafID of leafIDs) {\n const leaf = this.props.Leafs[leafID];\n rectoIDs.push(leaf.rectoID);\n versoIDs.push(leaf.versoID);\n }\n this.props.generatePageNumbers(startNumber, rectoIDs, versoIDs);\n };\n\n handleChangeInfoBoxTab = (value, event) => {\n this.props.changeInfoBoxTab(\n value,\n this.props.selectedObjects,\n this.props.Leafs,\n this.props.Rectos,\n this.props.Versos\n );\n };\n\n updatePreferences = newPreferences => {\n const preferences = { ...this.props.preferences, ...newPreferences };\n this.props.updatePreferences(this.props.projectID, { preferences });\n };\n\n render() {\n if (Object.keys(this.props.Groups).length === 0) {\n return (\n
\n this.toggleAddGroupDialog(true)}\n />\n \n
\n );\n }\n\n if (this.props.selectedObjects.members.length === 0) {\n return
;\n }\n\n const leafSideTabs = (\n \n \n \n \n \n );\n\n const groupTab = (\n \n \n \n );\n\n const termActions = {\n linkTerm: this.linkTerm,\n unlinkTerm: this.unlinkTerm,\n createAndAttachTerm: this.createAndAttachTerm,\n };\n\n if (this.props.selectedObjects.type === 'Group') {\n return (\n
\n {groupTab}\n \n
\n );\n } else if (this.props.selectedObjects.type === 'Leaf') {\n return (\n
\n {leafSideTabs}\n \n
\n );\n } else if (\n this.props.selectedObjects.type === 'Recto' ||\n this.props.selectedObjects.type === 'Verso'\n ) {\n const sideIndex = this.props.selectedObjects.type === 'Recto' ? 0 : 1;\n return (\n
\n {leafSideTabs}\n \n
\n );\n } else {\n return
;\n }\n }\n}\n\nconst mapStateToProps = state => {\n return {\n user: state.user,\n projectID: state.active.project.id,\n preferences: state.active.project.preferences,\n Groups: state.active.project.Groups,\n groupIDs: state.active.project.groupIDs,\n leafIDs: state.active.project.leafIDs,\n rectoIDs: state.active.project.rectoIDs,\n versoIDs: state.active.project.versoIDs,\n Leafs: state.active.project.Leafs,\n Rectos: state.active.project.Rectos,\n Versos: state.active.project.Versos,\n Terms: state.active.project.Terms,\n Taxonomies: state.active.project.Taxonomies,\n selectedObjects: state.active.collationManager.selectedObjects,\n collationManager: state.active.collationManager,\n termsManager: state.active.termsManager,\n filters: state.active.collationManager.filters,\n tacketed: state.active.collationManager.visualizations.tacketed,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n toggleVisualizationDrawing: data => {\n dispatch(toggleVisualizationDrawing(data));\n },\n\n addLeafs: (leaf, additional, projectID, filters) => {\n dispatch(addLeafs(leaf, additional)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n updateLeaf: (leafID, leaf, projectID, filters) => {\n dispatch(updateLeaf(leafID, leaf)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n updateLeafs: (leafs, projectID, filters) => {\n dispatch(updateLeafs(leafs, projectID)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n autoConjoinLeafs: (leafIDs, projectID, filters) => {\n dispatch(autoConjoinLeafs(leafIDs)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n deleteLeaf: (leafID, projectID, filters) => {\n dispatch(deleteLeaf(leafID)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n deleteLeafs: (leafs, projectID, filters) => {\n dispatch(deleteLeafs(leafs)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n addGroups: (group, additional, projectID, filters) => {\n dispatch(addGroups(group, additional)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n updateGroup: (groupID, group, projectID, filters) => {\n dispatch(updateGroup(groupID, group)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n updateGroups: (groups, projectID, filters) => {\n dispatch(updateGroups(groups)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n deleteGroup: (groupID, projectID, filters) => {\n dispatch(deleteGroup(groupID)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n deleteGroups: (groups, projectID, filters) => {\n dispatch(deleteGroups(groups, projectID)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n updateSide: (sideID, side, projectID, filters) => {\n dispatch(updateSide(sideID, side)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n updateSides: (sides, projectID, filters) => {\n dispatch(updateSides(sides)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n changeInfoBoxTab: (newType, selectedObjects, Leafs, Rectos, Versos) => {\n dispatch(\n changeInfoBoxTab(newType, selectedObjects, { Leafs, Rectos, Versos })\n );\n },\n\n createAndAttachTerm: (term, objects, projectID, filters) => {\n dispatch(addTerm(term))\n .then(() => dispatch(linkTerm(term.id, objects)))\n .then(() => dispatch(reapplyFilterProject(projectID, filters)));\n },\n\n generateFolioNumbers: (startNumber, leafIDs) => {\n dispatch(generateFolioNumbers(startNumber, leafIDs));\n },\n\n generatePageNumbers: (startNumber, rectoIDs, versoIDs) => {\n dispatch(generatePageNumbers(startNumber, rectoIDs, versoIDs));\n },\n\n updatePreferences: (projectID, project) => {\n dispatch(updatePreferences(projectID, project));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InfoBox);\n","import React, {Component} from 'react';\nimport {floatFieldLight} from '../../styles/textfield';\nimport MenuItem from 'material-ui/MenuItem';\nimport TextField from 'material-ui/TextField';\nimport IconClear from 'material-ui/svg-icons/content/clear';\nimport ContentAdd from 'material-ui/svg-icons/content/add';\nimport IconButton from 'material-ui/IconButton';\nimport FloatingActionButton from 'material-ui/FloatingActionButton';\nimport SelectField from '../global/SelectField';\n\n/** A row of filter query */\nclass FilterRow extends Component {\n\n renderAttributeMenuItems = () => {\n if (this.props.type) {\n return this.props.defaultAttributes[this.props.type].map(this.mapAttributeMenuItems);\n } else {\n return [];\n }\n }\n\n mapTermAttributeMenuItems = (taxonomy, index) => {\n return { key:taxonomy+index, value:taxonomy, text:taxonomy }\n }\n\n mapAttributeMenuItems = (item, index) => {\n return { key:item.name+index, value:item.name, text:item.displayName}\n }\n \n renderValueItems = (item, index) => {\n return -1} />;\n }\n\n mapConditionItems = (item) => {\n return { key:item, value:item, text:item}\n }\n\n filterConditionItems = (item) => {\n let isDropdown = false;\n try {\n isDropdown = (this.props.defaultAttributes[this.props.type][this.props.attributeIndex]['isDropdown']);\n } catch (e) { }\n return ((!isDropdown && item && !item.includes(\"equal\"))|| (isDropdown && item && !item.includes(\"contain\")));\n }\n\n renderValueField = () => {\n let input =;\n if (this.props.attributeIndex!==\"\") {\n try {\n if (this.props.defaultAttributes[this.props.type] && this.props.defaultAttributes[this.props.type][this.props.attributeIndex]['options']!==undefined) {\n input = {return{text:x,value:x}})}\n tabIndex={this.props.tabIndex}\n errorText={(this.props.type!==null && this.props.values.length===0)?\"Required\":\"\"}\n onChange={(v,i)=>this.props.onChange(this.props.queryIndex,\"values\",i,[v])}\n />\n } \n else if (this.props.defaultAttributes[this.props.type] && this.props.defaultAttributes[this.props.type][this.props.attributeIndex]['name']===\"conjoined_to\"){\n input = \n (\n this.props.onChange(this.props.queryIndex,\"values\",i,[v])}\n />\n );\n } \n else if (this.props.defaultAttributes[this.props.type] && this.props.defaultAttributes[this.props.type][this.props.attributeIndex]['name']===\"type\"){\n let dataSource = this.props.Taxonomies.map((taxonomy) => {\n return {text: taxonomy, value: taxonomy}\n })\n input = \n (\n this.props.onChange(this.props.queryIndex,\"values\",i,[v])}\n />\n );\n } \n else {\n input = \n this.props.onChange(this.props.queryIndex,\"values\",0,[v])}\n tabIndex={this.props.tabIndex}\n {...floatFieldLight}\n />;\n }\n } catch (e) {}\n }\n return input;\n }\n\n renderRow = () => {\n let row =\n
\n
\n {let queryIndex = this.props.queryIndex; this.props.onChange(queryIndex,\"type\",i,v);}}\n disabled={this.props.disableNewRow}\n tabIndex={this.props.tabIndex}\n {...floatFieldLight}\n data={[{value:\"leaf\",text:\"Leaf\"},{value:\"group\",text:\"Group\"},{value:\"side\",text:\"Side\"},{value:\"term\",text:\"Term\"}]}\n />\n
\n
\n {let queryIndex = this.props.queryIndex; this.props.clearFilterRowOnAttribute(queryIndex, v, i); this.props.onChange(this.props.queryIndex,\"attribute\",i,v)}}\n errorText={(this.props.type!==\"\" && this.props.type!==null && this.props.attribute===\"\")?\"Required\":\"\"}\n disabled={this.props.disableNewRow||!this.props.type}\n tabIndex={this.props.tabIndex}\n data={this.renderAttributeMenuItems()}\n {...floatFieldLight}\n >\n \n
\n
\n this.props.onChange(this.props.queryIndex,\"condition\",i,v)}\n errorText={(this.props.type!==\"\" && this.props.type!==null && this.props.condition===\"\")?\"Required\":\"\"}\n disabled={this.props.disableNewRow}\n tabIndex={this.props.tabIndex}\n data={['equals', 'contains', 'not equals', 'not contains'].filter((item)=>this.filterConditionItems(item)).map(this.mapConditionItems)}\n {...floatFieldLight}\n >\n \n
\n
\n {this.renderValueField()}\n
\n
\n this.props.onChange(this.props.queryIndex,\"conjunction\",i,v)}\n disabled={this.props.lastRow}\n errorText={(!this.props.lastRow && this.props.conjunction===\"\")?\"Required\":\"\"}\n tabIndex={this.props.tabIndex}\n data={[{value:\"OR\", text:\"OR\"}]}\n {...floatFieldLight}\n >\n \n
\n
\n this.props.removeRow(this.props.queryIndex)}\n style={(this.props.queryIndex===0 && this.props.queriesLength===1)? {display:\"none\"}: {}}\n >\n \n \n this.props.addRow()}\n style={(this.props.queryIndex===this.props.queriesLength-1)? {marginLeft:10} : {opacity:0,pointerEvents:'none',marginLeft:10}}\n secondary\n disabled={this.props.disableAddRow}\n tabIndex={this.props.tabIndex}\n >\n \n \n
\n
\n return row;\n }\n\n render() {\n return this.renderRow();\n }\n\n}\nexport default FilterRow;\n","import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport FilterRow from '../components/filter/FilterRow';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport MenuItem from 'material-ui/MenuItem';\nimport Toggle from 'material-ui/Toggle';\nimport Popover, {PopoverAnimationVertical} from 'material-ui/Popover';\nimport Menu from 'material-ui/Menu';\nimport ArrowDown from 'material-ui/svg-icons/navigation/arrow-drop-down'\nimport { \n filterProject, \n resetFilters,\n toggleFilterDisplay,\n updateFilterQuery,\n updateFilterSelection\n} from \"../actions/backend/filterActions\";\n\n/** Filter groups, leaves and sides */\nclass Filter extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n queries: props.queries,\n submitDisabled: false,\n conjoinedToAutoComplete: [],\n select: \"\",\n popoverAnchorEl: null,\n selectPopover: false,\n message: \"\",\n filterPanelHeight: '0',\n }\n }\n\n componentDidMount() {\n let conjoinedToAutoComplete = [];\n conjoinedToAutoComplete.push({\n text: 'None',\n value: 'None',\n });\n conjoinedToAutoComplete = [...conjoinedToAutoComplete, \n ...this.props.leafIDs.map((id,index)=>{\n return {text: `Leaf ${index+1}`, value: id }\n })\n ]\n this.setState({\n conjoinedToAutoComplete, \n filterPanelHeight: document.getElementById('filterContainer').offsetHeight\n });\n }\n\n componentWillReceiveProps(nextProps) {\n let conjoinedToAutoComplete = [];\n conjoinedToAutoComplete.push({\n text: 'None',\n value: 'None',\n });\n conjoinedToAutoComplete = [...conjoinedToAutoComplete, \n ...this.props.leafIDs.map((id,index)=>{\n return {text: `Leaf ${index+1}`, value: id }\n })\n ]\n let matches = [];\n if (nextProps.groupMatches.length>0) {\n let plural = nextProps.groupMatches.length>1? \"s\" : \"\";\n matches.push(nextProps.groupMatches.length + \" group\" + plural);\n }\n if (nextProps.leafMatches.length>0) {\n let plural = nextProps.leafMatches.length>1? \"ves\" : \"f\";\n matches.push(nextProps.leafMatches.length + \" lea\" + plural);\n }\n if (nextProps.sideMatches.length>0) {\n let plural = nextProps.sideMatches.length>1? \"s\" : \"\";\n matches.push(nextProps.sideMatches.length + \" side\" + plural);\n }\n if (nextProps.termMatches.length>0) {\n let plural = nextProps.termMatches.length>1? \"s\" : \"\";\n matches.push(nextProps.termMatches.length + \" term\" + plural);\n }\n let message = \"No matches found.\"; \n if (matches.length>0) {\n message = \"Matches: \" + matches.join(\", \");\n }\n if (nextProps.queries.length===1 && \n (nextProps.queries[0].type===null || nextProps.queries[0].attribute===\"\" \n || nextProps.queries[0].condition===\"\"||nextProps.queries[0].values.length===0)) {\n // Set message to empty if user cleared all filters\n message = \"\";\n }\n\n let filterPanelHeight = document.getElementById('filterContainer').offsetHeight;\n\n this.setState({\n queries: nextProps.queries, \n conjoinedToAutoComplete, \n message, filterPanelHeight\n });\n }\n\n removeRow = (queryIndex) => {\n let newQueries = this.state.queries;\n newQueries.splice(queryIndex,1);\n this.setState({ queries: newQueries}, ()=>{\n this.filter();\n this.props.filterHeightChange(document.getElementById('filterContainer').offsetHeight);\n });\n }\n\n addRow = () => {\n if (!this.disableAddRow()) {\n let newQueries = this.state.queries;\n newQueries.push({\n type: null,\n attribute: \"\",\n attributeIndex: \"\",\n values: [],\n condition: \"\",\n conjunction: \"\",\n })\n this.setState({ queries: newQueries}, () => {\n this.filter();\n this.props.filterHeightChange(document.getElementById('filterContainer').offsetHeight);\n });\n \n }\n }\n\n onChange = (queryIndex, fieldName, index, value, dataSource) => {\n if (dataSource){\n for (let member of dataSource){\n if (member.text===value){\n value = [member.value];\n break;\n }\n }\n }\n let updatedQueries = this.state.queries;\n if ([\"group\", \"leaf\", \"side\", \"term\"].includes(value))\n updatedQueries = this.clearFilterRowOnType(queryIndex, value); \n if (fieldName===\"attribute\") {\n updatedQueries[queryIndex][\"attributeIndex\"] = index;\n }\n updatedQueries[queryIndex][fieldName] = value;\n this.props.updateFilterQuery(updatedQueries);\n // If queries are valid, filter!\n let validQueries = true;\n for (let i=0; i0 && updatedQueries[i].values.findIndex((value)=>value===\"\")<0;\n if (!isComplete) {\n validQueries = false;\n break;\n }\n }\n if (validQueries) this.filterProject();\n }\n\n filterProject = () => {\n // Check if correct values are being passed in auto-complete dropdown cases\n let toFilter = true;\n for (let query of this.state.queries){\n if ((query.type===\"leaf\" && query.attribute===\"conjoined_leaf_order\") ||\n (query.type===\"term\" && query.attribute===\"type\")){\n if (!Array.isArray(query.values)){\n toFilter = false;\n break;\n }\n }\n }\n if (toFilter) {\n this.props.filterProject(this.props.projectID, {queries: this.state.queries});\n }\n }\n\n resetFilters = () => {\n this.setState({\n queries: [\n {\n type: \"\",\n attribute: \"\",\n attributeIndex: \"\",\n values: [],\n condition: \"\",\n conjunction: \"\",\n }\n ],\n }, () => {\n this.props.resetFilters(this.state.queries);\n this.props.filterHeightChange(document.getElementById('filterContainer').offsetHeight);\n });\n }\n\n clearFilterRowOnType = (index, type) => {\n let queries = [];\n let currentIndex = 0;\n for (let query of this.state.queries) {\n if (currentIndex===index && type!==query.type)\n queries.push({\n type: type,\n attribute: \"\",\n attributeIndex: \"\",\n values: [],\n condition: \"\",\n conjunction: \"\",\n })\n else\n queries.push(query);\n currentIndex += 1;\n }\n return queries;\n }\n\n clearFilterRowOnAttribute = (index, attribute, attributeIndex) => {\n let queries = [];\n let currentIndex = 0;\n for (let query of this.state.queries) {\n if (currentIndex===index && attribute!==query.attribute && query.attribute!==\"\"){\n queries.push({\n type: query.type,\n attribute: attribute,\n attributeIndex: attributeIndex,\n values: [],\n condition: \"\",\n conjunction: \"\",\n })\n }\n else\n queries.push(query);\n currentIndex += 1;\n }\n this.setState({queries}, () => this.props.resetFilters(queries))\n }\n\n\n filter = () => {\n let index = 0;\n let haveErrors = false\n for (let query of this.state.queries) {\n if (query.type === null)\n haveErrors = true\n if (query.attribute === \"\")\n haveErrors = true\n if (query.values.length === 0)\n haveErrors = true\n if (query.values.find((value)=>value===\"\")>=0)\n haveErrors = true\n if (query.condition === \"\")\n haveErrors = true\n if (index !== this.state.queries.length-1)\n if (query.conjunction === \"\")\n haveErrors = true\n index += 1;\n }\n if (!haveErrors) this.filterProject();\n }\n\n disableAddRow = () => {\n if (this.state.queries[this.state.queries.length-1].type === null)\n return true;\n if (this.state.queries[this.state.queries.length-1].attribute === \"\")\n return true;\n if (this.state.queries[this.state.queries.length-1].values.length === 0)\n return true;\n if (this.state.queries[this.state.queries.length-1].condition === \"\")\n return true;\n return false;\n }\n\n disableNewRow = () => {\n return (this.state.queries.length>1 && this.state.queries[this.state.queries.length-2].conjunction === \"\");\n }\n\n\n handleSelection = (selection) => {\n if (this.props.filterSelection!==selection || selection===\"\")\n this.props.updateFilterSelection(\n selection, \n this.props.matchingFilterObjects,\n this.props.groupIDs,\n this.props.leafIDs,\n this.props.rectoIDs,\n this.props.versoIDs\n );\n }\n\n handleSelectOpen = (event) => {\n // This prevents ghost click.\n event.preventDefault();\n if (this.props.filterActive) {\n this.setState({\n selectPopover: true,\n popoverAnchorEl: event.currentTarget,\n });\n }\n }\n\n handleSelectClose = () => {\n this.setState({\n selectPopover: false,\n });\n };\n\n render() {\n let queries = [];\n if (this.state.queries && this.props.open)\n for (let i=0; i\n );\n }\n let filterContainerStyle = this.props.open?{top:'56px'}:{top:'-'+this.state.filterPanelHeight+'px'};\n if (this.props.fullWidth) filterContainerStyle.width=\"100%\";\n let panel = \n
\n
\n {queries}\n
\n
\n

{this.state.message}

\n
\n
\n
\n \n
\n
\n }\n tabIndex={this.props.tabIndex}\n style={this.props.open?{}:{display:\"none\"}}\n />\n \n {this.setState({select:v});this.handleSelection(v)}}\n >\n 0?false:true} />\n 0?false:true}/>\n 0?false:true}/>\n 0?false:true}/>\n {this.props.selectedObjects.members.length > 0 ? \n \n : null\n }\n \n \n
\n
\n this.resetFilters()}\n backgroundColor=\"#b53c3c\"\n labelColor=\"#ffffff\"\n tabIndex={this.props.tabIndex}\n style={this.props.open?{marginRight: 15}:{display:\"none\"}}\n />\n
\n
\n
\n
\n
\n return panel;\n }\n}\n\nconst mapStateToProps = (state) => {\n return {\n projectID: state.active.project.id,\n selectedObjects: state.active.collationManager.selectedObjects,\n viewMode: state.active.collationManager.viewMode,\n defaultAttributes: state.active.collationManager.defaultAttributes,\n Groups: state.active.project.Groups,\n Leafs: state.active.project.Leafs,\n Rectos: state.active.project.Rectos,\n Versos: state.active.project.Versos,\n Terms: state.active.project.Terms,\n attachedToLeafs: state.active.project.attachedToLeafs,\n queries: state.active.collationManager.filters.queries,\n hideOthers: state.active.collationManager.filters.hideOthers,\n filterActive: state.active.collationManager.filters.active,\n filterSelection: state.active.collationManager.filters.selection,\n Taxonomies: state.active.project.Taxonomies,\n groupMatches: state.active.collationManager.filters.Groups,\n leafMatches: state.active.collationManager.filters.Leafs,\n sideMatches: state.active.collationManager.filters.Sides,\n termMatches: state.active.collationManager.filters.Terms,\n matchingFilterObjects: state.active.collationManager.filters,\n leafIDs: state.active.project.leafIDs,\n groupIDs: state.active.project.groupIDs,\n rectoIDs: state.active.project.rectoIDs,\n versoIDs: state.active.project.versoIDs,\n };\n};\nconst mapDispatchToProps = (dispatch) => {\n return {\n filterProject: (projectID, queries) => {\n dispatch(filterProject(projectID, queries));\n },\n resetFilters: (queries) => {\n dispatch(resetFilters(queries));\n },\n toggleFilterDisplay: () => {\n dispatch(toggleFilterDisplay());\n },\n updateFilterQuery: (newQueries) => {\n dispatch(updateFilterQuery(newQueries));\n },\n updateFilterSelection: (\n selection, \n matchingFilterObjects,\n GroupIDs,\n LeafIDs,\n RectoIDs,\n VersoIDs\n ) => {\n dispatch(updateFilterSelection(\n selection, \n matchingFilterObjects,\n {GroupIDs, LeafIDs, RectoIDs, VersoIDs}\n ));\n }\n };\n};\nexport default connect(mapStateToProps, mapDispatchToProps)(Filter);\n","import React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport IconDelete from 'material-ui/svg-icons/action/delete';\nimport IconButton from 'material-ui/IconButton';\n\n/** Delete confirmation dialog for deleting terms and term taxonomies */\nexport default class DeleteConfirmation extends React.Component {\n state = {\n open: false,\n };\n\n handleOpen = () => {\n this.setState({open: true});\n this.props.togglePopUp(true);\n };\n\n handleClose = () => {\n this.setState({open: false});\n this.props.togglePopUp(false);\n };\n\n submit = () => {\n if (this.props.item===\"term\") {\n this.props.action.deleteTerm(this.props.termID);\n } else {\n this.props.onDelete(this.props.index)\n }\n this.handleClose();\n }\n\n render() {\n const actions = [\n ,\n ,\n ];\n let deleteIcon =
\n \n
\n let message = \"This term will be removed from all groups/sides/leaves that have this term.\";\n if (this.props.item===\"taxonomy\") {\n deleteIcon = \n \n \n message = \"Any existing terms associated with this term taxonomy will be assigned to the taxonomy 'Unknown'.\";\n }\n if (this.props.item!==\"\") {\n return (\n
\n {deleteIcon}\n \n {message}\n \n
\n );\n } else {\n return
;\n }\n }\n}","import React, { Component } from 'react';\nimport DeleteConfirmation from './DeleteConfirmation';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport IconSubmit from 'material-ui/svg-icons/action/done';\nimport IconClear from 'material-ui/svg-icons/content/clear';\nimport Checkbox from 'material-ui/Checkbox';\nimport SelectField from '../global/SelectField';\nimport ChipInput from 'material-ui-chip-input';\n\n/** Create New Term tab in the Term Manager */\nexport default class EditTermForm extends Component {\n constructor(props) {\n super(props);\n this.state = {\n id: props.term.id,\n title: props.term.title,\n taxonomy: props.term.taxonomy,\n description: props.term.description,\n uri: props.term.uri,\n editing: {\n title: false,\n description: false,\n },\n errors: {\n title: '',\n },\n };\n }\n\n componentWillReceiveProps(nextProps) {\n this.setState({\n id: nextProps.term.id,\n title: nextProps.term.title,\n taxonomy: nextProps.term.taxonomy,\n description: nextProps.term.description,\n uri: nextProps.term.uri, // added URI\n editing: {\n title: false,\n description: false,\n },\n errors: {\n title: '',\n },\n });\n }\n\n validateTitle = title => {\n for (let termID in this.props.Terms) {\n const term = this.props.Terms[termID];\n if (term.title === title && term.id !== this.state.id) {\n this.setState({ errors: { title: 'This term title already exists.' } });\n return;\n }\n }\n if (title.length > 100) {\n this.setState({\n errors: { title: 'Title must be less than 100 characters.' },\n });\n } else if (title.length === 0) {\n this.setState({ errors: { title: 'Title must not be empty.' } });\n } else {\n this.setState({ errors: { title: '' } });\n }\n };\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n editing: { ...this.state.editing, [name]: true },\n });\n if (name === 'title') this.validateTitle(value.trim());\n if (name === 'taxonomy') {\n let editing = {\n title: this.state.title,\n taxonomy: value,\n description: this.state.description,\n uri: this.state.uri, // added URI\n };\n if (this.props.term)\n this.props.action.updateTerm(this.props.term.id, editing);\n }\n };\n\n update = (event, name) => {\n event.preventDefault();\n if (this.props.term) {\n let editing = {\n title: this.state.title,\n taxonomy: this.state.taxonomy,\n description: this.state.description,\n uri: this.state.uri, // added URI\n };\n this.setState({ editing: { ...this.state.editing, [name]: false } });\n this.props.action.updateTerm(this.props.term.id, editing);\n }\n };\n\n /**\n * Reset input field to original value\n */\n onCancelUpdate = name => {\n this.setState({\n [name]: this.props.term[name],\n editing: {\n ...this.state.editing,\n [name]: false,\n },\n errors: {\n ...this.state.errors,\n [name]: '',\n },\n });\n };\n\n renderTaxonomies = name => {\n return { value: name, text: name };\n };\n\n renderSubmitButtons = name => {\n if (\n this.state.editing[name] &&\n this.props.term !== null &&\n this.props.term !== undefined\n ) {\n return (\n
\n }\n style={{ minWidth: '60px', marginLeft: '5px' }}\n name=\"submit\"\n type=\"submit\"\n disabled={name === 'title' && this.state.errors.title !== ''}\n />\n }\n style={{ minWidth: '60px', marginLeft: '5px' }}\n onClick={e => this.onCancelUpdate(name)}\n />\n
\n );\n } else {\n return '';\n }\n };\n\n handleAddChip = (chip, type) => {\n this.props.action.linkTerm(this.props.term.id, [{ type, id: chip.value }]);\n };\n\n handleDeleteChip = (id, index, type) => {\n this.props.action.unlinkTerm(this.props.term.id, [{ type, id }]);\n };\n\n render() {\n let title = this.props.isReadOnly\n ? this.props.term.title\n : 'Edit ' + this.props.term.title;\n let linkedObjects = '';\n let deleteButton = '';\n let sideData = [];\n for (let i = 0; i < this.props.leafIDs.length; i++) {\n const leaf = this.props.Leafs[this.props.leafIDs[i]];\n const recto = this.props.Rectos[leaf.rectoID];\n const verso = this.props.Versos[leaf.versoID];\n const rectoFolioNumber =\n recto.folio_number && recto.folio_number !== ''\n ? '(' + recto.folio_number + ')'\n : '';\n const rectoPageNumber =\n recto.page_number && recto.page_number !== ''\n ? '(' + recto.page_number + ')'\n : '';\n const versoFolioNumber =\n verso.folio_number && verso.folio_number !== ''\n ? '(' + verso.folio_number + ')'\n : '';\n const versoPageNumber =\n verso.page_number && verso.page_number !== ''\n ? '(' + verso.page_number + ')'\n : '';\n sideData.push({\n value: leaf.rectoID,\n label:\n 'L' +\n (this.props.leafIDs.indexOf(leaf.id) + 1) +\n ' Recto ' +\n rectoFolioNumber +\n ' ' +\n rectoPageNumber,\n });\n sideData.push({\n value: leaf.versoID,\n label:\n 'L' +\n (this.props.leafIDs.indexOf(leaf.id) + 1) +\n ' Verso ' +\n versoFolioNumber +\n ' ' +\n versoPageNumber,\n });\n }\n const linkToGroups = (\n
\n
Groups
\n
\n {\n return { value: itemID, label: 'Group ' + (index + 1) };\n })}\n onRequestAdd={chip => this.handleAddChip(chip, 'Group')}\n onRequestDelete={(chip, index) =>\n this.handleDeleteChip(chip, index, 'Group')\n }\n openOnFocus={true}\n fullWidth={true}\n fullWidthInput={false}\n hintText=\"Click here to attach groups to this term\"\n menuProps={{ maxHeight: 200 }}\n tabIndex={this.props.tabIndex}\n />\n
\n
\n );\n const linkToLeaves = (\n
\n
Leaves
\n
\n {\n return { value: itemID, label: 'Leaf ' + (index + 1) };\n })}\n onRequestAdd={chip => this.handleAddChip(chip, 'Leaf')}\n onRequestDelete={(chip, index) =>\n this.handleDeleteChip(chip, index, 'Leaf')\n }\n openOnFocus={true}\n fullWidth={true}\n fullWidthInput={false}\n hintText=\"Click here to attach leaves to this term\"\n menuProps={{ maxHeight: 200 }}\n tabIndex={this.props.tabIndex}\n />\n
\n
\n );\n const linkToSides = (\n
\n
Sides
\n
\n this.handleAddChip(chip, 'Side')}\n onRequestDelete={(chip, index) =>\n this.handleDeleteChip(chip, index, chip.split('_')[0])\n }\n openOnFocus={true}\n fullWidth={true}\n fullWidthInput={false}\n hintText=\"Click here to attach sides to this term\"\n menuProps={{ maxHeight: 200 }}\n tabIndex={this.props.tabIndex}\n />\n
\n
\n );\n\n if (this.props.term) {\n linkedObjects = (\n
\n {this.props.isReadOnly ? (\n ''\n ) : (\n
\n

Attached to

\n {linkToSides}\n {linkToLeaves}\n {linkToGroups}\n
\n )}\n
\n );\n deleteButton = this.props.isReadOnly ? (\n ''\n ) : (\n
\n \n
\n );\n }\n return (\n
\n

{title}

\n
\n
\n Title\n
\n
\n {this.props.isReadOnly ? (\n
{this.state.title}
\n ) : (\n
this.update(e, 'title')}>\n this.onChange('title', v)}\n fullWidth\n autoFocus\n aria-invalid={this.state.errors.title.length > 0}\n tabIndex={this.props.tabIndex}\n />\n {this.renderSubmitButtons('title')}\n \n )}\n
\n
\n Taxonomy\n
\n
\n {this.props.isReadOnly ? (\n
{this.state.taxonomy}
\n ) : (\n this.onChange('taxonomy', v)}\n tabIndex={this.props.tabIndex}\n data={this.props.Taxonomies.map(this.renderTaxonomies)}\n />\n )}\n
\n
\n Description\n
\n
\n {this.props.isReadOnly ? (\n
{this.state.description}
\n ) : (\n
this.update(e, 'description')}>\n this.onChange('description', v)}\n multiLine\n fullWidth\n tabIndex={this.props.tabIndex}\n />\n {this.renderSubmitButtons('description')}\n \n )}\n
\n {/* added URI input to view */}\n
\n URI\n
\n
\n {this.props.isReadOnly ? (\n
{this.state.uri}
\n ) : (\n
this.update(e, 'uri')}>\n this.onChange('uri', v)}\n multiLine\n fullWidth\n tabIndex={this.props.tabIndex}\n />\n {this.renderSubmitButtons('uri')}\n \n )}\n
\n {!this.props.isReadOnly && (\n
\n
\n Show in diagram (leaves & sides only):\n
\n
\n \n this.props.action.updateTerm(this.props.term.id, {\n title: this.state.title,\n taxonomy: this.state.taxonomy,\n description: this.state.description,\n show: !this.props.term.show,\n })\n }\n tabIndex={this.props.tabIndex}\n />\n
\n
\n )}\n\n {linkedObjects}\n {deleteButton}\n
\n
\n );\n }\n}\n","import React from 'react';\nimport EditTermForm from '../../termsManager/EditTermForm';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\n\n/** Term dialog */\nexport default class TermDialog extends React.Component {\n getLinkedGroups = () => {\n const groupsWithCurrentTerm = Object.keys(this.props.Groups).filter((groupID) => {\n return (this.props.Groups[groupID].terms.includes(this.props.activeTerm.id))\n });\n return groupsWithCurrentTerm.map((value) => {\n const label = `Group ${this.props.groupIDs.indexOf(value)+1}`;\n return {label, value};\n });\n }\n\n getLinkedLeaves = () => {\n const leafsWithCurrentTerm = Object.keys(this.props.Leafs).filter((leafID) => {\n return (this.props.Leafs[leafID].terms.includes(this.props.activeTerm.id))\n });\n return leafsWithCurrentTerm.map((value)=>{\n const label = `Leaf ${this.props.leafIDs.indexOf(value)+1}`;\n return {label, value};\n });\n }\n\n getLinkedSides = () => {\n const rectosWithCurrentTerm = Object.keys(this.props.Rectos).filter((rectoID) => {\n return (this.props.Rectos[rectoID].terms.includes(this.props.activeTerm.id))\n });\n const versosWithCurrentTerm = Object.keys(this.props.Versos).filter((versoID) => {\n return (this.props.Versos[versoID].terms.includes(this.props.activeTerm.id))\n });\n const sidesWithCurrentTerm = [];\n for (let value of rectosWithCurrentTerm){\n const leafOrder = this.props.leafIDs.indexOf(this.props.Rectos[value].parentID) + 1;\n const folioNumber = this.props.Rectos[value].folio_number && this.props.Rectos[value].folio_number!==\"\"? `(${this.props.Rectos[value].folio_number})`:\"\";\n const pageNumber = this.props.Rectos[value].page_number && this.props.Rectos[value].page_number!==\"\"? `(${this.props.Rectos[value].page_number})`:\"\";\n const label = `L${leafOrder} Recto ${folioNumber} ${pageNumber}`;\n sidesWithCurrentTerm.push({label, value})\n }\n for (let value of versosWithCurrentTerm){\n const leafOrder = this.props.leafIDs.indexOf(this.props.Versos[value].parentID) + 1;\n const folioNumber = this.props.Versos[value].folio_number && this.props.Versos[value].folio_number!==\"\"? `(${this.props.Versos[value].folio_number})`:\"\";\n const pageNumber = this.props.Versos[value].page_number && this.props.Versos[value].page_number!==\"\"? `(${this.props.Versos[value].page_number})`:\"\";\n const label = `L${leafOrder} Verso ${folioNumber} ${pageNumber}`;\n sidesWithCurrentTerm.push({label, value})\n }\n return sidesWithCurrentTerm;\n }\n\n getRectosAndVersos = () => {\n const size = Object.keys(this.props.Rectos).length;\n let result = {};\n for (let i=0; i,\n ];\n return (\n \n {this.props.open? \n : \"\"}\n \n );\n }\n\n}\n\n\n\n\n","import React from 'react';\nimport Panel from './Panel';\n\n/** Stateless functional component for the Managers panel in sidebar of project edit page */\nconst ManagersPanel = props => {\n return (\n \n props.changeManagerMode('collationManager')}\n tabIndex={props.popUpActive ? -1 : 0}\n aria-label=\"Collation Manager\"\n >\n Collation\n \n props.changeManagerMode('termsManager')}\n tabIndex={props.popUpActive ? -1 : 0}\n aria-label=\"Taxonomies Manager\"\n >\n Taxonomies\n \n props.changeManagerMode('imageManager')}\n tabIndex={props.popUpActive ? -1 : 0}\n aria-label=\"Image Manager\"\n >\n Images\n \n \n );\n};\nexport default ManagersPanel;\n","import React, {Component} from 'react';\nimport {Tabs, Tab} from 'material-ui/Tabs';\nimport FlatButton from 'material-ui/FlatButton';\nimport TabularMode from '../components/collationManager/TabularMode';\nimport VisualMode from '../components/collationManager/VisualMode';\nimport ExportMode from '../components/collationManager/ExportMode';\nimport ViewingMode from '../components/collationManager/ViewingMode';\nimport Panel from '../components/global/Panel';\nimport Export from '../components/export/Export';\nimport InfoBox from './InfoBox';\nimport Filter from './Filter';\nimport TopBar from './TopBar';\nimport topbarStyle from '../styles/topbar';\nimport IconClear from 'material-ui/svg-icons/content/clear';\nimport IconButton from 'material-ui/IconButton';\nimport {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton';\nimport {connect} from 'react-redux';\nimport UTLogo from '../assets/ut_logo.png'\nimport UPLogo from '../assets/upenn_logo.png'\nimport {\n changeViewMode,\n handleObjectClick,\n handleObjectPress,\n changeManagerMode,\n toggleFilterPanel,\n toggleVisualizationDrawing,\n} from '../actions/backend/interactionActions';\nimport {\n updateFilterSelection,\n reapplyFilterProject,\n} from '../actions/backend/filterActions';\nimport {updateGroup} from '../actions/backend/groupActions';\nimport {\n updateTerm,\n deleteTerm,\n linkTerm,\n unlinkTerm,\n} from '../actions/backend/termActions';\nimport {\n loadProject,\n exportProject,\n updateProject,\n} from '../actions/backend/projectActions';\nimport fileDownload from 'js-file-download';\nimport TermDialog from '../components/collationManager/dialog/TermDialog';\nimport {radioBtnDark} from '../styles/button';\nimport ManagersPanel from '../components/global/ManagersPanel';\n\n/** Container for `TabularMode`, `VisualMode`, `InfoBox`, `TopBar`, `LoadingScreen`, and `Notification`. This container has the project sidebar embedded directly. */\nclass CollationManager extends Component {\n constructor(props) {\n super(props);\n this.state = {\n windowWidth: window.innerWidth,\n contentStyle: {\n transition: 'top 450ms cubic-bezier(0.23, 1, 0.32, 1)',\n top: 40,\n },\n infoboxStyle: {\n maxHeight: '90%',\n },\n export: {\n open: false,\n label: '',\n type: '',\n exportCols: 1,\n exportTerms: true,\n },\n selectAll: '',\n leftSideBarOpen: true,\n showTips: props.preferences.showTips,\n imageViewerEnabled: false,\n activeTerm: null,\n tipIndex: 0,\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.resizeHandler);\n if (this.props.filterPanelOpen) {\n let filterContainer = document.getElementById('filterContainer');\n if (filterContainer) {\n let filterPanelHeight = filterContainer.offsetHeight;\n this.filterHeightChange(filterPanelHeight);\n }\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.resizeHandler);\n }\n\n componentWillReceiveProps(nextProps) {\n const newSelectedObjects =\n nextProps.selectedObjects !== this.props.selectedObjects;\n const differentNumOfSelectedObjects =\n this.state.selectAll &&\n nextProps.selectedObjects.members.length !==\n Object.keys(this.props.project[this.state.selectAll]).length;\n const differentTypeOfSelectedObjects =\n this.state.selectAll !== nextProps.selectedObjects.type + 's';\n if (\n this.state.selectAll &&\n newSelectedObjects &&\n (differentTypeOfSelectedObjects || differentNumOfSelectedObjects)\n ) {\n this.setState({selectAll: ''});\n }\n if (\n nextProps.selectedObjects.type &&\n Object.keys(nextProps.project[nextProps.selectedObjects.type + 's'])\n .length === nextProps.selectedObjects.members.length\n ) {\n this.setState({selectAll: nextProps.selectedObjects.type + 's'});\n }\n\n // Update active term\n const commonTerms = this.getCommonTerms(nextProps);\n if (\n this.state.activeTerm !== null &&\n commonTerms.findIndex(termID => termID === this.state.activeTerm.id) <\n 0 &&\n !this.state.clickedFromDiagram\n ) {\n // Hide term when term was clicked from infobox and removed from selected object\n this.setState({activeTerm: null});\n } else if (this.state.activeTerm) {\n // Update term object\n this.setState({\n activeTerm: nextProps.project.Terms[this.state.activeTerm.id],\n });\n }\n }\n\n resizeHandler = () => {\n this.setState({windowWidth: window.innerWidth});\n };\n\n toggleFilterDrawer = () => {\n this.props.toggleFilterPanel(!this.props.filterPanelOpen);\n let filterPanelHeight = document.getElementById('filterContainer')\n .offsetHeight;\n if (this.props.filterPanelOpen) {\n filterPanelHeight = 0;\n }\n this.filterHeightChange(filterPanelHeight);\n };\n\n handleObjectPress = (object, event) => {\n this.props.handleObjectPress(this.props.selectedObjects, object, event);\n };\n\n handleObjectClick = (object, event) => {\n event.stopPropagation();\n this.props.handleObjectClick(\n this.props.selectedObjects,\n object,\n event,\n this.props.project.groupIDs,\n this.props.project.leafIDs,\n this.props.project.rectoIDs,\n this.props.project.versoIDs\n );\n };\n\n handleViewModeChange = value => {\n if (value === 'VIEWING') {\n this.setState({leftSideBarOpen: true, imageViewerEnabled: false}, () =>\n this.props.changeViewMode(value)\n );\n } else if (value !== 'VIEWING' && this.state.leftSideBarOpen === false) {\n this.setState({leftSideBarOpen: true}, () =>\n this.props.changeViewMode(value)\n );\n } else {\n this.props.changeViewMode(value);\n }\n };\n\n filterHeightChange = value => {\n let infoboxHeight = '90%';\n if (value > 0) infoboxHeight = window.innerHeight - value - 56 - 30 + 'px';\n this.setState({\n contentStyle: {...this.state.contentStyle, top: value + 56},\n infoBoxStyle: {maxHeight: infoboxHeight},\n });\n };\n\n updateGroup = (groupID, group) => {\n this.props.updateGroup(groupID, group, this.props);\n };\n\n closeTip = () => {\n const project = {\n preferences: {\n showTips: false,\n },\n };\n this.props.hideProjectTip();\n this.props.updateProject(project, this.props.project.id);\n };\n\n handleSelection = selection => {\n this.props.updateFilterSelection(\n selection,\n this.props.project.groupIDs,\n this.props.project.leafIDs,\n this.props.project.rectoIDs,\n this.props.project.versoIDs\n );\n };\n\n handleExportToggle = (open, type, label, exportCols, exportTerms) => {\n this.setState(\n {export: {open, type, label, exportCols, exportTerms}},\n () => {\n if (this.state.export.open && type !== 'share')\n this.props.exportProject(this.props.project.id, type);\n }\n );\n this.props.togglePopUp(open);\n };\n\n showCopyToClipboardNotification = () => {\n this.props.showCopyToClipboardNotification();\n };\n\n numRootGroups = () => {\n let numRootGroups = 0;\n for (let [, [, group]] of Object.entries(\n this.props.project.Groups\n ).entries()) {\n if (group.nestLevel === 1) {\n numRootGroups++;\n }\n }\n return numRootGroups;\n };\n\n combineDiagram = () => {\n // Resize export canvas\n let finalCanvas = document.getElementById('exportCanvas');\n let canvasIDs = Array(this.numRootGroups())\n .fill()\n .map((v, i) => 'canvas' + i);\n let canvases = [];\n for (let id of canvasIDs) {\n canvases.push(document.getElementById(id));\n }\n let rows = [];\n let numCols = parseInt(this.state.export.exportCols);\n for (let i = 0; i < canvases.length; i += numCols) {\n rows.push(canvases.slice(i, i + numCols));\n }\n let exportWidth = 0;\n for (let i = 0; i < numCols; i++) {\n exportWidth += canvases[i].width;\n }\n let exportHeight = 0;\n for (let i = 0; i < rows.length; i++) {\n let row = rows[i];\n let maxRowHeight = 0;\n for (let j = 0; j < row.length; j++) {\n maxRowHeight = Math.max(maxRowHeight, row[j].height);\n }\n exportHeight += maxRowHeight;\n }\n finalCanvas.width = exportWidth;\n finalCanvas.height = exportHeight;\n\n // Combine canvases\n let finalContext = finalCanvas.getContext('2d');\n let globalY = 0;\n for (let i = 0; i < rows.length; i++) {\n let row = rows[i];\n let x = 0;\n let currentY = globalY;\n let currentLargestY = 0;\n for (let j = 0; j < row.length; j++) {\n let canvas = row[j];\n finalContext.drawImage(canvas, x, currentY);\n x += canvas.width;\n currentLargestY = Math.max(currentLargestY, canvas.height);\n }\n globalY += currentLargestY;\n }\n };\n\n handleDownloadCollationDiagram = () => {\n let canvas = document.getElementById('exportCanvas');\n canvas.toBlob(blob => {\n const filename = this.props.project.title.replace(/\\s/g, '_');\n fileDownload(blob, `${filename}.PNG`);\n });\n };\n\n toggleImageViewer = () => {\n this.setState({\n imageViewerEnabled: !this.state.imageViewerEnabled,\n leftSideBarOpen: !this.state.leftSideBarOpen,\n });\n };\n\n closeTermDialog = () => {\n this.setState({activeTerm: null, clickedFromDiagram: false}, () =>\n this.props.togglePopUp(false)\n );\n };\n openTermDialog = (term, clickedFromDiagram = false) => {\n this.setState({activeTerm: term, clickedFromDiagram}, () =>\n this.props.togglePopUp(true)\n );\n };\n\n getCommonTerms = (props = this.props) => {\n // Find the common terms of all currently selected objects\n const memberType = props.selectedObjects.type;\n const members = props.selectedObjects.members;\n let terms = [];\n if (members.length > 0) {\n terms = props.project[memberType + 's'][members[0]].terms;\n for (let id of members) {\n terms = this.intersect(\n terms,\n props.project[memberType + 's'][id].terms\n );\n }\n }\n return terms;\n };\n\n /**\n * Returns items in common\n */\n intersect = (list1, list2) => {\n if (list1.length >= list2.length)\n return list1.filter(id1 => {\n return list2.includes(id1);\n });\n else\n return list2.filter(id1 => {\n return list1.includes(id1);\n });\n };\n\n updateTerm = (termID, term) => {\n this.props.updateTerm(\n termID,\n term,\n this.props.project.id,\n this.props.collationManager.filters\n );\n };\n\n linkDialogTerm = (termID, objects) => {\n this.props.linkTerm(\n termID,\n objects,\n this.props.project.id,\n this.props.collationManager.filters\n );\n };\n\n linkAndUnlinkTerms = (termID, linkObjects, unlinkObjects) => {\n this.props.linkAndUnlinkTerms(\n termID,\n linkObjects,\n unlinkObjects,\n this.props.project.id,\n this.props.collationManager.filters\n );\n };\n\n unlinkDialogTerm = (termID, objects) => {\n this.props.unlinkTerm(\n termID,\n objects,\n this.props.project.id,\n this.props.collationManager.filters\n );\n };\n\n deleteTerm = termID => {\n this.closeTermDialog();\n this.props.deleteTerm(\n termID,\n this.props.project.id,\n this.props.collationManager.filters\n );\n };\n\n renderRadioButton = (value, label) => {\n return (\n \n );\n };\n\n setExport = (name, value) => {\n this.setState({export: {...this.state.export, [name]: value}});\n };\n\n render() {\n const containerStyle = {\n top: 85,\n right: '2%',\n height: 'inherit',\n maxHeight: '80%',\n width: '28%',\n };\n if (!this.state.leftSideBarOpen) {\n containerStyle['width'] = '30%';\n }\n\n const topbar = (\n \n \n \n \n \n \n \n );\n\n const singleEditTip =\n 'Hold the CTRL key (or Command key for Mac users) to select multiple groups/leaves/sides. Hold SHIFT key to select a range of groups/leaves/sides.';\n const batchEditTip =\n 'You are in batch edit mode. To leave this mode, click on any group/leaf/side without holding down any keys.';\n const tip = [\n this.props.selectedObjects.members.length > 1\n ? batchEditTip\n : singleEditTip,\n \"Generate folio/page numbers by selecting multiple leaves and clicking on the 'Generate folio/page numbers' button in the infobox on the right.\",\n 'Try exporting your collation in a multitude of different formats by selecting \"EXPORT\" in the sidebar.',\n 'Undo an action with CTRL+Z (or CMD+Z for Mac users), and redo an action with CTRL+Y (or CMD+Y for Mac users).',\n 'To add a subgroup (group inside a group), select a group and click the \"ADD\" button in the popup to the right of the diagram.',\n \"You can share your collation with others, even if they don't have an account. Click 'Share' and copy the link.\",\n 'You can easily import a set of images from a IIIF manifest. Select \"Images\" in the sidebar, paste a IIIF link in the \"Manifest URL\" box, and click \"ADD\".',\n 'If you have suggestions, please fill out the feedback form by clicking the \"FEEDBACK\" button at the bottom of the sidebar.'\n ];\n let tipsDiv;\n if (\n this.props.managerMode === 'collationManager' &&\n this.props.preferences.showTips === true\n ) {\n tipsDiv = (\n
\n
\n \n \n \n
\n
\n TIP: {tip[this.state.tipIndex]}\n
\n \n this.setState({\n tipIndex: (this.state.tipIndex + 1) % tip.length,\n })\n }\n tabIndex={this.props.popUpActive ? -1 : 0}\n style={{color: '#4ED6CB', background: 'none', border: 0}}\n >\n Next tip ❯\n \n
\n
\n
\n );\n }\n\n const selectionRadioGroup = (\n \n this.setState({selectAll: v}, () => {\n this.handleSelection(v + '_all');\n })\n }\n >\n {this.renderRadioButton('Groups', 'Select All Groups')}\n {this.renderRadioButton('Leafs', 'Select All Leaves')}\n {this.renderRadioButton('Rectos', 'Select All Rectos')}\n {this.renderRadioButton('Versos', 'Select All Versos')}\n \n );\n\n const exportDialog = (\n {\n this.combineDiagram();\n this.handleDownloadCollationDiagram();\n }}\n numRootGroups={this.numRootGroups()}\n setExport={this.setExport}\n exportCols={this.state.export.exportCols}\n exportTerms={this.state.export.exportTerms}\n />\n );\n\n let sidebarClasses = 'sidebar';\n if (!this.state.leftSideBarOpen) sidebarClasses += ' hidden';\n if (this.props.popUpActive) sidebarClasses += ' lowerZIndex';\n\n const sidebar = (\n
\n
\n {tipsDiv}\n {this.props.collationManager.viewMode !== 'VIEWING' ? (\n \n ) : (\n ''\n )}\n \n {selectionRadioGroup}\n \n this.setState({selectAll: ''}, this.handleSelection(''))\n }\n secondary\n fullWidth\n style={this.state.selectAll === '' ? {display: 'none'} : {}}\n tabIndex={this.props.popUpActive ? -1 : 0}\n labelStyle={\n this.state.windowWidth <= 768\n ? {fontSize: '0.75em', padding: 2}\n : {}\n }\n />\n \n \n
\n {\n this.handleExportToggle(\n true,\n 'share',\n 'Share this project',\n 1,\n true\n );\n }}\n tabIndex={this.props.popUpActive ? -1 : 0}\n />\n
\n \n \n

Export Collation Data

\n
\n this.handleExportToggle(true, 'json', 'JSON')}\n tabIndex={this.props.popUpActive ? -1 : 0}\n disabled={this.props.project.leafIDs.length === 0}\n />\n this.handleExportToggle(true, 'xml', 'XML')}\n tabIndex={this.props.popUpActive ? -1 : 0}\n disabled={this.props.project.leafIDs.length === 0}\n />\n
\n

Export Collation Diagram

\n\n
\n {\n this.handleExportToggle(true, 'svg', 'SVG');\n }}\n tabIndex={this.props.popUpActive ? -1 : 0}\n />\n
\n
\n {\n this.handleExportToggle(true, 'png', 'PNG', 1, true);\n }}\n disabled={\n this.props.collationManager.viewMode === 'TABULAR' ||\n this.props.project.leafIDs.length === 0\n }\n tabIndex={this.props.popUpActive ? -1 : 0}\n />\n
\n

Export Collation Formula

\n
\n {\n this.handleExportToggle(true, 'formula', 'Formula');\n }}\n tabIndex={this.props.popUpActive ? -1 : 0}\n />\n
\n

Export HTML

\n
\n {\n this.handleExportToggle(true, 'html', 'HTML');\n }}\n tabIndex={this.props.popUpActive ? -1 : 0}\n />\n
\n \n \n
\n \n \"University\n \n \n \"University\n \n
\n \n
\n );\n\n const infobox = (\n \n \n \n );\n\n let workspace =
;\n if (this.props.project.groupIDs.length > 0) {\n if (this.props.collationManager.viewMode === 'TABULAR') {\n workspace = (\n
\n
\n

{this.props.project.title}

\n \n
\n {infobox}\n {exportDialog}\n
\n );\n } else if (this.props.collationManager.viewMode === 'VISUAL') {\n workspace = (\n
\n
\n

{this.props.project.title}

\n this.openTermDialog(term, true)}\n tabIndex={this.props.popUpActive ? -1 : 0}\n />\n
\n {infobox}\n {exportDialog}\n
\n );\n } else {\n workspace = (\n
\n \n

{this.props.project.title}

\n \n
\n {infobox}\n {exportDialog}\n \n );\n }\n }\n if (this.props.project.groupIDs.length === 0 && !this.props.loading) {\n workspace = (\n
\n
\n

\n It looks like you have an empty project. Add a new Group to start\n collating.\n

\n
\n {infobox}\n
\n );\n }\n if (this.state.export.open && this.state.export.label === 'PNG') {\n workspace = (\n
\n
\n

{this.props.project.title}

\n this.openTermDialog(term, true)}\n tabIndex={this.props.popUpActive ? -1 : 0}\n showTerms={this.state.export.exportTerms}\n />\n
\n {infobox}\n {exportDialog}\n
\n );\n }\n return (\n
\n {topbar}\n {sidebar}\n \n {workspace}\n \n
\n );\n }\n}\n\nconst mapStateToProps = state => {\n return {\n user: state.user,\n project: state.active.project,\n preferences: state.active.project.preferences,\n managerMode: state.active.managerMode,\n filterPanelOpen: state.active.collationManager.filters.filterPanelOpen,\n selectedObjects: state.active.collationManager.selectedObjects,\n collationManager: state.active.collationManager,\n loading: state.global.loading,\n exportedData: state.active.exportedData,\n exportedImages: state.active.exportedImages,\n groupIDs: state.active.project.groupIDs,\n leafIDs: state.active.project.leafIDs,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n loadProject: (projectID, props) => {\n dispatch(loadProject(projectID));\n },\n\n changeViewMode: viewMode => {\n dispatch(changeViewMode(viewMode));\n },\n\n handleObjectPress: (selectedObjects, object, event) => {\n dispatch(handleObjectPress(selectedObjects, object, event));\n },\n\n handleObjectClick: (\n selectedObjects,\n object,\n event,\n Groups,\n Leafs,\n Rectos,\n Versos\n ) => {\n dispatch(\n handleObjectClick(selectedObjects, object, event, {\n Groups,\n Leafs,\n Rectos,\n Versos,\n })\n );\n },\n\n changeManagerMode: managerMode => {\n dispatch(changeManagerMode(managerMode));\n },\n\n toggleFilterPanel: value => {\n dispatch(toggleFilterPanel(value));\n },\n\n updateProject: (project, projectID) => {\n dispatch(updateProject(projectID, project));\n },\n\n hideProjectTip: () => {\n dispatch({type: 'HIDE_PROJECT_TIP'});\n },\n\n updateGroup: (groupID, group, props) => {\n dispatch(updateGroup(groupID, group));\n },\n\n updateTerm: (termID, term, projectID, filters) => {\n dispatch(updateTerm(termID, term)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n deleteTerm: (termID, projectID, filters) => {\n dispatch(deleteTerm(termID)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n linkTerm: (termID, object, projectID, filters) => {\n dispatch(linkTerm(termID, object)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n unlinkTerm: (termID, object, projectID, filters) => {\n dispatch(unlinkTerm(termID, object)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n },\n\n linkAndUnlinkTerms: (\n termID,\n linkObjects,\n unlinkObjects,\n projectID,\n filters\n ) => {\n if (linkObjects.length > 0 && unlinkObjects.length > 0) {\n dispatch(linkTerm(termID, linkObjects))\n .then(action => dispatch(unlinkTerm(termID, unlinkObjects)))\n .then(() => dispatch(reapplyFilterProject(projectID, filters)));\n } else if (linkObjects.length > 0) {\n dispatch(linkTerm(termID, linkObjects)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n } else if (unlinkObjects.length > 0) {\n dispatch(unlinkTerm(termID, unlinkObjects)).then(() =>\n dispatch(reapplyFilterProject(projectID, filters))\n );\n }\n },\n toggleVisualizationDrawing: data => {\n dispatch(toggleVisualizationDrawing(data));\n },\n\n updateFilterSelection: (\n selection,\n GroupIDs,\n LeafIDs,\n RectoIDs,\n VersoIDs\n ) => {\n dispatch(\n updateFilterSelection(selection, [], {\n GroupIDs,\n LeafIDs,\n RectoIDs,\n VersoIDs,\n })\n );\n },\n\n exportProject: (projectID, format) => {\n dispatch(exportProject(projectID, format));\n },\n\n showCopyToClipboardNotification: () => {\n dispatch({\n type: 'SHOW_NOTIFICATION',\n payload: 'Successfully copied to clipboard',\n });\n setTimeout(() => dispatch({type: 'HIDE_NOTIFICATION'}), 4000);\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CollationManager);\n","import React, { Component } from 'react';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport Checkbox from 'material-ui/Checkbox';\nimport SelectField from '../global/SelectField';\n\n/** Create New Term tab in the Term Manager */\nexport default class NewTermForm extends Component {\n constructor(props) {\n super(props);\n this.state = {\n //the state is managed from the component itself\n title: '', //this is why a class component was used\n taxonomy: '',\n description: '',\n uri: '',\n show: false,\n errors: {\n title: '',\n },\n };\n }\n\n initialState = {};\n\n //ensure title validates (is not a duplicate, too long etc)\n validateTitle = title => {\n for (let termID in this.props.Terms) {\n const term = this.props.Terms[termID];\n if (term.title === title) {\n this.setState({ errors: { title: 'This term title already exists.' } });\n return;\n }\n }\n if (title.length > 100) {\n this.setState({\n errors: { title: 'Title must be less than 100 characters.' },\n });\n } else if (title.length === 0) {\n this.setState({ errors: { title: 'Title must not be empty.' } });\n } else {\n this.setState({ errors: { title: '' } });\n }\n };\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n editing: { ...this.state.editing, [name]: true },\n });\n if (name === 'title') this.validateTitle(value.trim());\n if (name === 'taxonomy') {\n let editing = {\n title: this.state.title,\n taxonomy: value,\n description: this.state.description,\n show: this.state.show,\n };\n if (this.props.term)\n this.props.action.updateTerm(this.props.term.id, editing);\n }\n };\n\n create = () => {\n let term = {\n project_id: this.props.projectID,\n title: this.state.title,\n taxonomy: this.state.taxonomy,\n description: this.state.description,\n uri: this.state.uri,\n show: this.state.show,\n };\n this.props.action.addTerm(term);\n // Reset form\n this.setState({\n title: '',\n taxonomy: '',\n description: '',\n uri: '',\n show: false,\n errors: {\n title: '',\n },\n });\n };\n\n /**\n * Clear values in the input fields if we are creating a new term\n * Reset to original values if we are editing an existing term\n */\n reset = props => {\n this.setState({\n title: '',\n taxonomy: '',\n description: '',\n uri: '',\n errors: {\n title: '',\n taxonomy: '',\n description: '',\n uri: '',\n show: false,\n },\n });\n };\n\n renderTaxonomies = name => {\n return { value: name, text: name };\n };\n\n renderMenuItem = (item, type, index) => {\n let label = '';\n if (type === 'Side') {\n let sideName = item.charAt(0) === 'R' ? 'Recto' : 'Verso';\n label = `Leaf ${Math.ceil((index - 3) / 2)}: ${type} ${sideName}`;\n } else {\n const itemOrder =\n this.props[`${type.toLowerCase()}IDs`].indexOf(item.id) + 1;\n label = `${type} ${itemOrder}`;\n }\n return (\n
\n {label}\n
\n );\n };\n\n render() {\n let title = 'Create a new term';\n let createButtons = (\n
\n this.reset()}\n style={{ width: 120 }}\n />{' '}\n  \n this.create()}\n disabled={\n this.state.errors.title !== '' ||\n this.state.taxonomy === '' ||\n this.state.title === ''\n }\n />\n
\n );\n\n return (\n
\n

{title}

\n
\n
\n Title\n
\n
\n this.onChange('title', v)}\n fullWidth\n aria-invalid={this.state.errors.title.length > 0}\n />\n
\n
\n Taxonomy\n
\n
\n this.onChange('taxonomy', v)}\n data={this.props.Taxonomies.map(this.renderTaxonomies)}\n >\n
\n
\n Description\n
\n
\n this.onChange('description', v)}\n multiLine\n fullWidth\n />\n
\n
\n URI\n
\n
\n this.onChange('uri', v)}\n multiLine\n fullWidth\n />\n
\n
\n Show in diagram (leaves & sides only):\n
\n
\n this.onChange('show', !this.state.show)}\n />\n
\n {createButtons}\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport EditTermForm from './EditTermForm';\nimport NewTermForm from './NewTermForm';\nimport Add from 'material-ui/svg-icons/content/add';\nimport { btnMd, btnBase } from '../../styles/button';\n\n/** Create New Term tab in the Term Manager */\nexport default class ManageTerms extends Component {\n constructor(props) {\n super(props);\n this.state = {\n activeTerm: null,\n title: '',\n taxonomy: '',\n description: '',\n };\n }\n\n /**\n * Update state when user clicks on new term item\n */\n onItemChange = activeTerm => {\n this.setState({ activeTerm });\n };\n\n componentWillReceiveProps(nextProps) {\n if (this.state.activeTerm)\n this.setState({ activeTerm: nextProps.Terms[this.state.activeTerm.id] });\n }\n\n /**\n * Mapping function to render a term thumbnail\n */\n renderList = termID => {\n const term = this.props.Terms[termID];\n return (\n this.onItemChange(term)}\n tabIndex={this.props.tabIndex}\n key={termID}\n >\n
\n
\n {term.title.length > 80\n ? term.title.substring(0, 80) + '...'\n : term.title}\n
\n
{term.taxonomy}
\n
\n \n );\n };\n\n /**\n * Clear values in the input fields\n */\n reset = () => {\n this.setState({\n title: '',\n taxonomy: '',\n description: '',\n });\n };\n\n deleteTerm = termID => {\n this.props.action.deleteTerm(termID);\n this.setState({ activeTerm: null });\n };\n\n updateTerm = (termID, term) => {\n this.props.action.updateTerm(termID, term);\n };\n\n linkTerm = (termID, object) => {\n this.props.action.linkTerm(termID, object);\n };\n\n unlinkTerm = (termID, object) => {\n this.props.action.unlinkTerm(termID, object);\n };\n\n linkAndUnlinkTerms = (termID, linkObjects, unlinkObjects) => {\n this.props.action.linkAndUnlinkTerms(termID, linkObjects, unlinkObjects);\n };\n\n getLinkedGroups = () => {\n const groupsWithCurrentTerm = Object.keys(this.props.Groups).filter(\n groupID => {\n return this.props.Groups[groupID].terms.includes(\n this.state.activeTerm.id\n );\n }\n );\n return groupsWithCurrentTerm.map(value => {\n const label = `Group ${this.props.groupIDs.indexOf(value) + 1}`;\n return { label, value };\n });\n };\n\n getLinkedLeaves = () => {\n const leafsWithCurrentTerm = Object.keys(this.props.Leafs).filter(\n leafID => {\n return this.props.Leafs[leafID].terms.includes(\n this.state.activeTerm.id\n );\n }\n );\n return leafsWithCurrentTerm.map(value => {\n const label = `Leaf ${this.props.leafIDs.indexOf(value) + 1}`;\n return { label, value };\n });\n };\n\n getLinkedSides = () => {\n const rectosWithCurrentTerm = Object.keys(this.props.Rectos).filter(\n rectoID => {\n return this.props.Rectos[rectoID].terms.includes(\n this.state.activeTerm.id\n );\n }\n );\n const versosWithCurrentTerm = Object.keys(this.props.Versos).filter(\n versoID => {\n return this.props.Versos[versoID].terms.includes(\n this.state.activeTerm.id\n );\n }\n );\n const sidesWithCurrentTerm = [];\n for (let value of rectosWithCurrentTerm) {\n const leafOrder =\n this.props.leafIDs.indexOf(this.props.Rectos[value].parentID) + 1;\n const folioNumber =\n this.props.Rectos[value].folio_number &&\n this.props.Rectos[value].folio_number !== ''\n ? `(${this.props.Rectos[value].folio_number})`\n : '';\n const pageNumber =\n this.props.Rectos[value].page_number &&\n this.props.Rectos[value].page_number !== ''\n ? `(${this.props.Rectos[value].page_number})`\n : '';\n const label = `L${leafOrder} Recto ${folioNumber} ${pageNumber}`;\n sidesWithCurrentTerm.push({ label, value });\n }\n for (let value of versosWithCurrentTerm) {\n const leafOrder =\n this.props.leafIDs.indexOf(this.props.Versos[value].parentID) + 1;\n const folioNumber =\n this.props.Versos[value].folio_number &&\n this.props.Versos[value].folio_number !== ''\n ? `(${this.props.Versos[value].folio_number})`\n : '';\n const pageNumber =\n this.props.Versos[value].page_number &&\n this.props.Versos[value].page_number !== ''\n ? `(${this.props.Versos[value].page_number})`\n : '';\n const label = `L${leafOrder} Verso ${folioNumber} ${pageNumber}`;\n sidesWithCurrentTerm.push({ label, value });\n }\n return sidesWithCurrentTerm;\n };\n\n getRectosAndVersos = () => {\n const size = Object.keys(this.props.Rectos).length;\n let result = {};\n for (let i = 0; i < size; i++) {\n const rectoID = Object.keys(this.props.Rectos)[i];\n const versoID = Object.keys(this.props.Versos)[i];\n result[rectoID] = this.props.Rectos[rectoID];\n result[versoID] = this.props.Versos[versoID];\n }\n return result;\n };\n\n render() {\n let termForm;\n if (!this.state.activeTerm) {\n termForm = (\n \n );\n } else {\n termForm = (\n \n );\n }\n\n return (\n
\n
\n
\n this.onItemChange(null)}\n style={{ width: '90%' }}\n {...btnMd}\n label=\"Create New Term\"\n labelStyle={{ ...btnBase().labelStyle }}\n icon={}\n labelColor={'#ffffff'}\n backgroundColor={'#566476'}\n tabIndex={this.props.tabIndex}\n >\n {Object.keys(this.props.Terms).map(this.renderList)}\n
\n
\n
\n {termForm}\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport DeleteConfirmation from './DeleteConfirmation';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport TextField from 'material-ui/TextField';\nimport IconSubmit from 'material-ui/svg-icons/action/done';\nimport IconClear from 'material-ui/svg-icons/content/clear';\n\n/** Taxonomy page to add, edit and delete taxonomies */\nexport default class Taxonomy extends Component {\n constructor(props) {\n super(props);\n this.state = {\n newTaxonomy: '',\n Taxonomies: [...props.Taxonomies],\n editing: new Array(props.Taxonomies.length).fill(false),\n errorNewTaxonomy: '',\n errorTypes: new Array(props.Taxonomies.length).fill(''),\n lastSubmitted: -2,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (\n this.state.Taxonomies.length !== nextProps.Taxonomies.length ||\n this.props.Taxonomies !== nextProps.Taxonomies\n ) {\n this.setState({ Taxonomies: [...nextProps.Taxonomies] });\n this.resetEditing();\n }\n }\n\n resetEditing = () => {\n this.setState({\n editing: new Array(this.props.Taxonomies.length).fill(false),\n newTaxonomy: '',\n });\n };\n\n onNewTaxonomyChange = newTaxonomy => {\n this.setState({ newTaxonomy }, () => {\n if (!this.isValid(newTaxonomy.trim())) {\n let errorMessage = `Taxonomy with name ${newTaxonomy} already exists in this project`;\n if (newTaxonomy.length === 0) errorMessage = '';\n this.setState({ errorNewTaxonomy: errorMessage });\n } else {\n this.setState({ errorNewTaxonomy: '' });\n }\n });\n };\n\n onChange = (newTaxonomy, index) => {\n this.setTaxonomy(index, newTaxonomy);\n this.setEditing(index, true);\n if (!this.isValid(newTaxonomy)) {\n let errorMessage = `Taxonomy with name ${newTaxonomy} already exists in this project`;\n if (newTaxonomy === this.props.Taxonomies[index]) errorMessage = '';\n if (newTaxonomy.length === 0) errorMessage = `Taxonomy cannot be blank`;\n this.setError(index, errorMessage);\n } else {\n this.setError(index, '');\n }\n };\n\n onUpdate = (event, index) => {\n event.preventDefault();\n const newTaxonomy = this.state.Taxonomies[index];\n if (newTaxonomy !== this.props.Taxonomies[index]) {\n this.setState({ lastSubmitted: index });\n let taxonomy = {\n project_id: this.props.projectID,\n taxonomy: newTaxonomy,\n old_taxonomy: this.props.Taxonomies[index],\n };\n this.props.action.updateTaxonomy(taxonomy);\n }\n this.setEditing(index, false);\n };\n\n isValid = newTaxonomy => {\n return !this.props.Taxonomies.includes(newTaxonomy) && newTaxonomy.length !== 0;\n };\n\n onDelete = index => {\n let taxonomy = {\n project_id: this.props.projectID,\n taxonomy: this.state.Taxonomies[index],\n };\n let updatedEditing = [...this.state.editing];\n updatedEditing.splice(index, 1);\n this.setState({ editing: updatedEditing }, () => {\n this.props.action.deleteTaxonomy(taxonomy);\n });\n };\n\n onCreate = event => {\n event.preventDefault();\n let taxonomy = {\n project_id: this.props.projectID,\n taxonomy: this.state.newTaxonomy.trim(),\n };\n this.props.action.createTaxonomy(taxonomy);\n this.resetEditing();\n this.setState({ lastSubmitted: -1 });\n };\n\n onCancelUpdate = index => {\n this.setTaxonomy(index, this.props.Taxonomies[index]);\n this.setError(index, '');\n this.setEditing(index, false);\n };\n\n setTaxonomy = (index, value) => {\n let newTaxonomies = [...this.state.Taxonomies];\n newTaxonomies[index] = value;\n this.setState({ Taxonomies: newTaxonomies });\n };\n\n setEditing = (index, value) => {\n let newEditing = [...this.state.editing];\n newEditing[index] = value;\n this.setState({ editing: newEditing });\n };\n\n setError = (index, value) => {\n let newErrors = [...this.state.errorTypes];\n newErrors[index] = value;\n this.setState({ errorTypes: newErrors });\n };\n\n renderSubmitButtons = index => {\n if (this.state.editing[index]) {\n return (\n
\n }\n style={{ minWidth: '60px', marginLeft: '5px' }}\n name=\"submit\"\n type=\"submit\"\n disabled={!this.isValid(this.state.Taxonomies[index])}\n />\n }\n style={{ minWidth: '60px', marginLeft: '5px' }}\n onClick={e => this.onCancelUpdate(index)}\n />\n
\n );\n } else {\n return '';\n }\n };\n\n renderTaxonomy = (taxonomy, index) => {\n return (\n
\n
this.onUpdate(e, index)}>\n this.onChange(v, index)}\n errorText={this.state.errorTypes[index]}\n aria-invalid={\n this.state.errorTypes[index] !== undefined &&\n this.state.errorTypes[index].length > 0\n }\n style={{ width: '75%' }}\n tabIndex={this.props.tabIndex}\n />\n {taxonomy === 'Unknown' ? (\n ''\n ) : (\n \n )}\n {this.renderSubmitButtons(index)}\n \n
\n );\n };\n\n filterTaxonomy = (object, index) => {\n return object.key !== 'taxonomy_0';\n };\n\n render() {\n return (\n
\n

Add a new taxonomy

\n
this.onCreate(e)}>\n
\n
\n this.onNewTaxonomyChange(v)}\n errorText={this.state.errorNewTaxonomy}\n aria-invalid={this.state.errorNewTaxonomy.length > 0}\n style={{ width: 300 }}\n tabIndex={this.props.tabIndex}\n />\n
\n
\n \n
\n
\n
\n

Your taxonomies

\n
\n {this.props.Taxonomies\n .map(this.renderTaxonomy)\n .filter(this.filterTaxonomy)}\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport TopBar from './TopBar';\nimport ManageTerms from '../components/termsManager/ManageTerms';\nimport Taxonomy from '../components/termsManager/Taxonomy';\nimport { Tabs, Tab } from 'material-ui/Tabs';\n// import Panel from '../components/global/Panel';\nimport topbarStyle from '../styles/topbar';\nimport {\n changeManagerMode,\n changeTermsTab,\n} from '../actions/backend/interactionActions';\nimport {\n addTerm,\n updateTerm,\n deleteTerm,\n createTaxonomy,\n updateTaxonomy,\n deleteTaxonomy,\n linkTerm,\n unlinkTerm,\n} from '../actions/backend/termActions';\nimport { sendFeedback } from '../actions/backend/userActions';\nimport ManagersPanel from '../components/global/ManagersPanel';\n\nclass TermsManager extends Component {\n constructor(props) {\n super(props);\n this.state = {\n Terms: props.Terms,\n value: '',\n filterTypes: {\n title: true,\n taxonomy: true,\n description: true,\n // TODO: add URI?\n },\n windowWidth: window.innerWidth,\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.resizeHandler);\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.resizeHandler);\n }\n\n componentWillReceiveProps(nextProps) {\n this.setState({ Terms: nextProps.Terms }, () => this.applyFilter());\n }\n\n resizeHandler = () => {\n this.setState({ windowWidth: window.innerWidth });\n };\n\n applyFilter = () => {\n this.filterTerms(this.state.value, this.state.filterTypes);\n };\n\n onValueChange = (e, value) => {\n this.setState({ value }, () => this.applyFilter());\n };\n\n onTypeChange = (type, checked) => {\n this.setState(\n { filterTypes: { ...this.state.filterTypes, [type]: checked } },\n () => this.applyFilter()\n );\n };\n\n handleAddTerm = term => {\n const userID = this.props.user.id;\n const date = Date.now().toString();\n const IDHash = userID + date;\n term['id'] = IDHash.substr(IDHash.length - 24);\n this.props.addTerm(term);\n };\n\n filterTerms = (value, filterTypes) => {\n if (value === '') {\n this.setState({ Terms: this.props.Terms });\n } else {\n let filteredTerms = {};\n let isNoneSelected = true;\n for (let type of Object.keys(filterTypes)) {\n if (filterTypes[type]) {\n isNoneSelected = false;\n break;\n }\n }\n if (isNoneSelected)\n filterTypes = { title: true, taxonomy: true, description: true };\n for (let termID in this.props.Terms) {\n const term = this.props.Terms[termID];\n for (let type of Object.keys(filterTypes)) {\n if (\n filterTypes[type] &&\n term[type].toUpperCase().includes(value.toUpperCase())\n )\n if (filteredTerms[termID]) break;\n else filteredTerms[termID] = term;\n }\n }\n this.setState({ Terms: filteredTerms });\n }\n };\n\n toggleFilterDrawer = () => {\n this.setState({ filterOpen: !this.state.filterOpen });\n };\n\n updateTerm = (termID, term) => {\n this.props.updateTerm(termID, term, this.props);\n };\n\n linkTerm = (termID, object) => {\n this.props.linkTerm(termID, object, this.props);\n };\n\n unlinkTerm = (termID, object) => {\n this.props.unlinkTerm(termID, object, this.props);\n };\n\n linkAndUnlinkTerms = (termID, linkObjects, unlinkObjects) => {\n this.props.linkAndUnlinkTerms(\n termID,\n linkObjects,\n unlinkObjects,\n this.props\n );\n };\n\n render() {\n let content = '';\n\n if (this.props.activeTab === 'MANAGE') {\n content = (\n \n );\n } else if (this.props.activeTab === 'TYPES') {\n content = (\n \n this.props.deleteTaxonomy(taxonomies, this.props),\n }}\n togglePopUp={this.props.togglePopUp}\n tabIndex={this.props.popUpActive ? -1 : 0}\n />\n );\n }\n\n let sidebarClasses = 'sidebar';\n if (this.props.popUpActive) sidebarClasses += ' lowerZIndex';\n\n const sidebar = (\n
\n
\n \n
\n );\n\n return (\n
\n \n this.props.changeTermsTab(v)}\n >\n \n \n \n \n {sidebar}\n
{content}
\n
\n );\n }\n}\nconst mapStateToProps = state => {\n return {\n user: state.user,\n projectID: state.active.project.id,\n groupIDs: state.active.project.groupIDs,\n leafIDs: state.active.project.leafIDs,\n rectoIDs: state.active.project.rectoIDs,\n versoIDs: state.active.project.versoIDs,\n Groups: state.active.project.Groups,\n Leafs: state.active.project.Leafs,\n Rectos: state.active.project.Rectos,\n Versos: state.active.project.Versos,\n Terms: state.active.project.Terms,\n Taxonomies: state.active.project.Taxonomies,\n activeTab: state.active.termsManager.activeTab,\n termsManager: state.active.termsManager,\n managerMode: state.active.managerMode,\n };\n};\nconst mapDispatchToProps = dispatch => {\n return {\n changeManagerMode: managerMode => {\n dispatch(changeManagerMode(managerMode));\n },\n changeTermsTab: tabName => {\n dispatch(changeTermsTab(tabName));\n },\n addTerm: term => {\n dispatch(addTerm(term));\n },\n updateTerm: (termID, term, props) => {\n dispatch(updateTerm(termID, term));\n },\n deleteTerm: termID => {\n dispatch(deleteTerm(termID));\n },\n createTaxonomy: taxonomy => {\n dispatch(createTaxonomy(taxonomy));\n },\n updateTaxonomy: taxonomy => {\n dispatch(updateTaxonomy(taxonomy));\n },\n deleteTaxonomy: (taxonomy, props) => {\n dispatch(deleteTaxonomy(taxonomy));\n },\n linkTerm: (termID, object, props) => {\n dispatch(linkTerm(termID, object));\n },\n unlinkTerm: (termID, object, props) => {\n dispatch(unlinkTerm(termID, object));\n },\n linkAndUnlinkTerms: (termID, linkObjects, unlinkObjects, props) => {\n if (linkObjects.length > 0) {\n dispatch(linkTerm(termID, linkObjects));\n }\n if (unlinkObjects.length > 0) {\n dispatch(unlinkTerm(termID, unlinkObjects));\n }\n },\n sendFeedback: (title, message, userID) => {\n dispatch(sendFeedback(title, message, userID));\n },\n };\n};\nexport default connect(mapStateToProps, mapDispatchToProps)(TermsManager);\n","\n\n\nexport function createManifest(projectID, manifest) {\n return { \n types: ['SHOW_LOADING','CREATE_MANIFEST_SUCCESS','CREATE_MANIFEST_FAILED'],\n payload: {\n request : {\n url: `/projects/${projectID}/manifests`,\n method: 'post',\n data: manifest,\n successMessage: \"You have successfully created the manifest\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n }; \n}\n\n\nexport function updateManifest(projectID, manifest) {\n return { \n types: ['UPDATE_MANIFEST_FRONTEND','UPDATE_MANIFEST_SUCCESS_BACKEND','UPDATE_MANIFEST_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/projects/${projectID}/manifests`,\n method: 'put',\n data: manifest,\n successMessage: \"You have successfully updated the manifest\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n }; \n}\n\n\nexport function deleteManifest(projectID, manifest) {\n return { \n types: ['DELETE_MANIFEST_FRONTEND','DELETE_MANIFEST_SUCCESS_BACKEND','DELETE_MANIFEST_FAILED_BACKEND'],\n payload: {\n request : {\n url: `/projects/${projectID}/manifests`,\n method: 'delete',\n data: manifest,\n successMessage: \"You have successfully deleted the manifest\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n },\n isUndoable: true,\n }; \n}\n\nexport function cancelCreateManifest(){\n return {type: \"CANCEL_CREATE_MANIFEST\"}\n}\n\n\nexport function cloneProjectImagesMapping(projectID) {\n return { \n types: ['NO_LOADING','CLONE_PROJECT_MAPPING_SUCCESS','CLONE_PROJECT_MAPPING_FAILED'],\n payload: {\n request : {\n url: `/projects/${projectID}/cloneImageMapping`,\n method: 'get',\n successMessage: \"\" ,\n errorMessage: \"Ooops! Something went wrong\"\n }\n }\n };\n}","import React, {Component} from 'react';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport TextField from 'material-ui/TextField';\nimport {floatFieldLight} from '../../styles/textfield';\nimport UploadImages from './UploadImages';\nimport { btnBase } from '../../styles/button';\n\n/** Form to submit a new manifest */\nexport default class AddManifest extends Component {\n constructor(props) {\n super(props);\n this.state = {\n url: \"\",\n urlError: \"\",\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.createManifestError!==\"\"){\n if (this.state.urlError===\"\")\n this.setState({urlError: nextProps.createManifestError});\n } else {\n this.setState({url: \"\", urlError: \"\"});\n }\n }\n\n onChange = (type, value) => {\n this.setState({[type]: value}, ()=>{this.runValidation()})\n }\n\n onSubmit = (e) => {\n e.preventDefault();\n const manifest = {url: this.state.url}\n this.props.action.createManifest({manifest});\n }\n\n onCancel = (e) => {\n this.setState({url: \"\", urlError: \"\"})\n this.props.action.cancelCreateManifest();\n }\n\n runValidation = () => {\n // Check if manifest url already exists\n for (const manifestID in this.props.manifests){\n const manifest = this.props.manifests[manifestID];\n if (manifest.url===this.state.url){\n this.setState({urlError: `Manifest with url: ${manifest.url} already exists.`});\n return;\n }\n }\n // Check if url is a valid JSON\n fetch(this.state.url)\n .then(response => {\n const contentType = response.headers.get(\"content-type\");\n if(contentType && contentType.indexOf(\"json\") !== -1) {\n // No validation errors\n if (response.url!==this.state.url) {\n // Original URL was a redirect to a valid JSON url, so update our state \n this.setState({url: response.url, urlError: \"\"});\n }\n this.setState({urlError: \"\"});\n } else {\n this.setState({urlError: \"Invalid URL: the URL does not resolve to a JSON file.\"})\n }\n })\n .catch(()=> {\n this.setState({urlError: \"Invalid URL: the URL does not resolve to a JSON file.\"})\n })\n }\n\n isValid = () => {\n return (this.state.urlError===\"\" && this.state.url!==\"\")\n }\n\n render() {\n return (\n
\n

Add new images

\n
\n
\n

Upload images

\n \n
\n
\n

Import images from a IIIF manifest

\n
this.onSubmit(e)}>\n
\n
\n this.onChange(\"url\", v)}\n tabIndex={this.props.tabIndex}\n {...floatFieldLight}\n />\n
\n
\n
\n this.onCancel(e)}\n {...btnBase()}\n style={{...btnBase().style, marginRight: 5}}\n tabIndex={this.props.tabIndex}\n />\n this.onSubmit(e)}\n tabIndex={this.props.tabIndex}\n {...btnBase()}\n />\n
\n
\n
\n
\n
\n );\n }\n}\n","import React, {Component} from 'react';\nimport RemoveImageConfirmation from './RemoveImageConfirmation';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport TextField from 'material-ui/TextField';\nimport IconButton from 'material-ui/IconButton';\nimport IconDelete from 'material-ui/svg-icons/action/delete-forever';\nimport IconHide from 'material-ui/svg-icons/action/visibility-off';\nimport IconAdd from 'material-ui/svg-icons/content/add';\nimport VirtualList from 'react-tiny-virtual-list';\nimport Menu from 'material-ui/Menu';\nimport MenuItem from 'material-ui/MenuItem';\nimport Popover from 'material-ui/Popover';\nimport IconFilter from 'material-ui/svg-icons/content/filter-list';\n\n/** Dialog to edit manifest name */\nexport default class EditManifest extends Component {\n constructor(props) {\n super(props);\n this.state = {\n name: props.manifest? props.manifest.name:\"\",\n nameError: \"\",\n confirmationOpen: \"\",\n activeImg: \"\",\n filter:{value:\"this\", text:\"Viewing images in this project\"},\n filterOpen: false,\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.manifest) {\n this.setState({name: nextProps.manifest.name})\n }\n }\n\n toggleConfirmation = (value) => {\n this.setState({confirmationOpen:value});\n }\n\n onChange = (type, value) => {\n this.setState({[type]: value}, ()=>{this.runValidation()})\n }\n\n onSubmit = (e) => {\n e.preventDefault();\n const manifest = {id: this.props.manifest.id, name: this.state.name.trim()}\n this.setState({name: \"\"}, ()=>{\n this.props.action.updateManifest({manifest});\n this.props.handleClose();\n })\n }\n\n onCancel = (e) => {\n this.setState({name: \"\"})\n }\n\n runValidation = () => {\n for (const manifestID in this.props.manifests){\n const manifest = this.props.manifests[manifestID];\n if (manifestID!==this.props.manifest.id && manifest.name===this.state.name.trim()){\n this.setState({nameError: `Manifest with name: ${manifest.name} already exists.`});\n return;\n } else if (this.state.name.length>51) {\n this.setState({nameError: `Manifest name must be under 50 characters.`});\n return;\n }\n }\n // No validation errors\n this.setState({nameError: \"\"});\n }\n\n isValid = () => {\n return (this.state.nameError===\"\" && this.state.name!==\"\" && this.props.manifest.name!==this.state.name.trim())\n }\n\n handleFilterClick = (e) => {\n e.preventDefault(); // Prevent ghost click\n this.setState({\n filterOpen: true,\n anchorEl: e.currentTarget,\n });\n }\n\n handleFilterChoice = (value, text) => {\n this.setState({\n filter: {value, text},\n filterOpen: false,\n })\n }\n\n renderImageTile = (index, style, images) => {\n const img = images[index];\n let projectCountText = \"\";\n if (img.projectIDs) {\n const inCurrentProject = img.projectIDs.includes(this.props.projectID);\n if (img.projectIDs.length===1 && inCurrentProject) {\n projectCountText = \"In current project\";\n } else if (img.projectIDs.length===1) {\n projectCountText = \"In 1 project\";\n } else {\n if (inCurrentProject) {\n const plural = (img.projectIDs.length-1)>1?\"s\":\"\";\n projectCountText = \"In current project and \" + (img.projectIDs.length-1) + \" other project\" + plural;\n } else {\n projectCountText = \"In \" + img.projectIDs.length + \" projects\";\n }\n }\n }\n if (img) {\n return
\n
\n
\n {\"Thumbnail\n
\n
\n

{img.label}

\n {projectCountText}\n
\n
\n projectID===this.props.projectID)>=0?\"\":\"Link image to project\"}\n iconStyle={{color:\"8b8b8b\"}}\n style={(img.manifestID===this.props.manifest.id)||(img.projectIDs && img.projectIDs.findIndex((projectID)=>projectID===this.props.projectID)>=0)?{display:\"none\"}:{width:\"40px\",padding:0}}\n onClick={()=>this.props.action.linkImages([img.id])}\n >\n \n \n {this.setState({confirmationOpen:\"hide\", activeImg:img})}}\n >\n \n \n {\n this.setState({confirmationOpen:\"delete\", activeImg:img})\n }}\n style={{width:\"40px\",padding:0}}\n >\n \n \n
\n
\n
\n } else {\n return
\n }\n }\n\n render() {\n const editName =
this.onSubmit(e)}>\n
\n
Manifest name
\n
\n this.onChange(\"name\", v)}\n fullWidth\n autoFocus\n />\n
\n
\n
\n\n if (this.props.open) {\n const actions = [\n ,\n ,\n ];\n let images = this.props.manifest.images;\n if (this.state.filter.value===\"all\") {\n images = this.props.images;\n }\n\n return (\n
\n \n

{this.props.manifest.id.includes(\"DIY\")? \"Edit images\":\"Edit manifest\"}

\n
\n {this.props.manifest.id.includes(\"DIY\")?\n
\n
\n }\n />\n this.setState({filterOpen: false})}\n >\n \n this.handleFilterChoice(\"this\", \"Viewing images in this project\")} primaryText=\"View images in this project\" />\n this.handleFilterChoice(\"all\", \"Viewing all images\")} primaryText=\"View all images\" />\n \n \n
\n this.renderImageTile(index, style, images)}\n overscanCount={10}\n estimatedItemSize={400}\n />\n
\n :\n editName\n }\n
\n \n 0} \n toggleConfirmation={this.toggleConfirmation}\n deleteImages={this.props.action.deleteImages}\n unlinkImages={this.props.action.unlinkImages}\n imgs={this.state.activeImg?[{label:this.state.activeImg.label, id:this.state.activeImg.url.split(\"/\").pop().split(\"_\")[0]}]:[{id:\"\",label:\"\"}]}\n actionType={this.state.confirmationOpen}\n numToRemove={1}\n />\n
\n );\n } else {\n return
;\n }\n }\n}","import React, {Component} from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport RaisedButton from 'material-ui/RaisedButton';\n\n/** Confirmation dialog to delete manifest */\nexport default class DeleteManifest extends Component {\n render() {\n const actions = [\n ,\n {this.props.handleClose(); this.props.deleteManifest()}}\n backgroundColor=\"#b53c3c\"\n labelColor=\"#ffffff\" \n />,\n ];\n\n if (this.props.open) {\n return (\n
\n \n \n
\n );\n } else {\n return
;\n }\n }\n}","import React, {Component} from 'react';\nimport FlatButton from 'material-ui/FlatButton';\nimport {Card, CardActions} from 'material-ui/Card';\nimport AddManifest from './AddManifest';\nimport EditManifest from './EditManifest';\nimport DeleteManifest from './DeleteManifest';\nimport ImageViewer from \"../global/ImageViewer\";\nimport Dialog from 'material-ui/Dialog';\n\n/** Manage Images page */\nexport default class ManageManifests extends Component {\n constructor(props) {\n super(props);\n this.state = {\n editOpen: false,\n deleteOpen: false,\n activeManifestID: \"\",\n imageModalOpen: false,\n activeImage: {manifestID:\"\",}\n };\n }\n handleOpen = (name, manifestID) => {\n this.setState({[name]: true, activeManifestID:manifestID});\n this.props.togglePopUp(true);\n };\n\n handleClose = (name) => {\n this.setState({[name]: false});\n this.props.togglePopUp(false);\n };\n\n toggleImageModal = (imageModalOpen, activeImage) => { \n this.setState({imageModalOpen, activeImage});\n this.props.togglePopUp(imageModalOpen);\n }\n\n renderManifestCard = (manifestID) => {\n const manifest = this.props.manifests[manifestID]\n return (\n
\n \n
\n
\n

{manifest.name}

\n {manifest.url}\n
\n
\n {manifest.images.slice(0,4).map((img) => (\n \n ))}\n
\n
\n \n this.handleOpen(\"editOpen\", manifestID)} \n tabIndex={this.props.tabIndex}\n />\n this.handleOpen(\"deleteOpen\", manifestID)} \n tabIndex={this.props.tabIndex}\n disabled={manifest.id.includes(\"DIY\")}\n />\n \n
\n
\n
\n )\n }\n\n render() {\n return (\n
\n \n this.handleClose(\"editOpen\")} \n manifest={this.props.manifests[this.state.activeManifestID]}\n manifests={this.props.manifests}\n images={this.props.images}\n projectID={this.props.projectID}\n action={{\n updateManifest: this.props.action.updateManifest,\n linkImages: this.props.action.linkImages,\n unlinkImages: this.props.action.unlinkImages,\n deleteImages: this.props.action.deleteImages,\n }}\n />\n this.handleClose(\"deleteOpen\")}\n deleteManifest={()=>this.props.action.deleteManifest({manifest: {id: this.state.activeManifestID}})} \n />\n
\n

Image collections

\n {this.props.manifests? Object.keys(this.props.manifests).map(this.renderManifestCard) : \"\" }\n this.toggleImageModal(false)}\n contentStyle={{background: \"none\", boxShadow: \"inherit\"}}\n bodyStyle={{padding:0}}\n >\n {this.state.activeImage?\n :\"\"}\n \n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport IconButton from 'material-ui/IconButton';\nimport Add from 'material-ui/svg-icons/content/add-circle-outline';\nimport VirtualList from 'react-tiny-virtual-list';\n\n/** Panel for unmapped sides */\nexport default class SideBacklog extends Component {\n\n renderSideItem = (index, style) => {\n const sideID = this.props.sideIDs[index];\n const sideType = sideID.charAt(0)===\"R\"? \"recto\" : \"verso\";\n const side = sideType === \"recto\" ? this.props.Rectos[sideID] : this.props.Versos[sideID];\n const folioNumber = side.folio_number && side.folio_number!==\"\" ? \"(\"+side.folio_number+\")\" : \"\";\n const pageNumber = side.page_number && side.page_number!==\"\" ? \"(\"+side.page_number+\")\" : \"\";\n const leafOrder = this.props.leafIDs.indexOf(side.parentID)+1;\n let actionButtons = (\n
event.stopPropagation()}>\n this.props.moveItemsToMap([sideID], \"sideMapBoard\", \"sideBacklog\")} \n tabIndex={this.props.tabIndex}\n >\n \n \n
\n );\n let activeStyle = {};\n if (this.props.selectedObjects.members.includes(sideID))\n activeStyle = {backgroundColor: \"#4ED6CB\"}\n return (\n
this.props.handleObjectClick(this.props.id, sideID, event)}>\n
\n {\"Leaf \" + leafOrder + \" \" + side.memberType + \" \" + folioNumber + \" \" + pageNumber}\n
\n {actionButtons}\n
\n );\n }\n\n render() {\n if (this.props.id===\"sideMapBoard\") {\n return (\n
\n this.renderSideItem(index, style)}\n overscanCount={10}\n estimatedItemSize={400}\n />\n
\n );\n }\n\n // sideBacklog\n return (\n this.renderSideItem(index, style)}\n overscanCount={10}\n estimatedItemSize={400}\n />\n );\n\n }\n}\n","import React, { Component } from 'react';\nimport ThumbnailIcon from 'material-ui/svg-icons/editor/insert-photo';\nimport IconButton from 'material-ui/IconButton';\nimport Add from 'material-ui/svg-icons/content/add-circle-outline';\nimport VirtualList from 'react-tiny-virtual-list';\n\n/** Panel for unmapped images */\nexport default class ImageBacklog extends Component {\n\n renderImageItem = (index, style) => {\n const image = this.props.images[index];\n let actionButtons = (\n
\n {event.stopPropagation();this.props.moveItemsToMap([image], \"imageMapBoard\", \"imageBacklog\")}} \n tabIndex={this.props.tabIndex}\n >\n \n \n
\n );\n let activeStyle = {};\n if (this.props.selectedObjects.members.find(item => item.url===image.url && item.manifestID===image.manifestID))\n activeStyle = {backgroundColor: \"#4ED6CB\"}\n return (\n
this.props.handleObjectClick(this.props.id, image, event)} >\n
\n
{e.stopPropagation();this.props.toggleImageModal(true, image.url, image.manifestID.includes(\"DIY\"))}}>\n \n \n \n
\n
\n {image.label}\n
\n {this.props.activeManifest.name}\n
\n
\n {actionButtons}\n
\n );\n }\n\n render() {\n if (this.props.id===\"imageMapBoard\") {\n return (\n
\n this.renderImageItem(index, style)}\n overscanCount={10}\n estimatedItemSize={400}\n />\n
\n );\n }\n\n // imageBacklog\n return (\n this.renderImageItem(index, style)}\n overscanCount={10}\n estimatedItemSize={400}\n />\n );\n\n\n }\n}\n","import React, { Component } from 'react';\nimport ThumbnailIcon from 'material-ui/svg-icons/editor/insert-photo';\nimport IconButton from 'material-ui/IconButton';\nimport ArrowDown from 'material-ui/svg-icons/navigation/arrow-downward';\nimport ArrowUp from 'material-ui/svg-icons/navigation/arrow-upward';\nimport Remove from 'material-ui/svg-icons/content/remove-circle-outline';\nimport VirtualList from 'react-tiny-virtual-list';\n\n/** Panel with the mapped sides and images */\nexport default class MapBoard extends Component {\n\n renderSideItem = (index) => {\n const sideID = this.props.sideIDs[index];\n const sideType = sideID.charAt(0)===\"R\"? \"recto\" : \"verso\";\n const side = sideType === \"recto\" ? this.props.Rectos[sideID] : this.props.Versos[sideID];\n const folioNumber = side.folio_number && side.folio_number!==\"\" ? \"(\"+side.folio_number+\")\" : \"\";\n const pageNumber = side.page_number && side.page_number!==\"\" ? \"(\"+side.page_number+\")\" : \"\";\n const leafOrder = this.props.leafIDs.indexOf(side.parentID)+1;\n\n let actionButtons = (\n
event.stopPropagation()}>\n this.props.moveItemUpOrDown(sideID, \"sideMapBoard\", \"up\")} \n disabled={index===0}\n tabIndex={this.props.tabIndex}\n style={this.props.windowWidth<=768?{width:40,height:40}:{}}\n >\n \n \n this.props.moveItemUpOrDown(sideID, \"sideMapBoard\", \"down\")} \n disabled={index===this.props.sideIDs.length-1}\n tabIndex={this.props.tabIndex}\n style={this.props.windowWidth<=768?{width:40,height:40}:{}}\n >\n \n \n this.props.moveItemsToBacklog([sideID], \"sideMapBoard\", \"sideBacklog\")} \n tabIndex={this.props.tabIndex}\n >\n \n \n
\n );\n let activeStyle = {};\n if (this.props.selectedObjects.members.includes(sideID))\n activeStyle = {backgroundColor: \"#4ED6CB\"}\n return (\n
this.props.handleObjectClick(\"sideMapBoard\", sideID, event)}>\n
\n {\"Leaf \" + leafOrder + \" \" + side.memberType + \" \" + folioNumber + \" \" + pageNumber}\n\n
\n {actionButtons}\n
\n );\n }\n\n renderGhostSideItem = (index) => {\n return (
);\n }\n\n renderImageItem = (index) => {\n const image = this.props.images[index];\n let actionButtons = (\n
event.stopPropagation()}>\n this.props.moveItemUpOrDown(image, \"imageMapBoard\", \"up\")} \n disabled={index===0}\n tabIndex={this.props.tabIndex}\n >\n \n \n this.props.moveItemUpOrDown(image, \"imageMapBoard\", \"down\")} \n tabIndex={this.props.tabIndex}\n disabled={index===this.props.images.length-1}\n >\n \n \n this.props.moveItemsToBacklog([image], \"imageMapBoard\", \"imageBacklog\")} \n tabIndex={this.props.tabIndex}\n >\n \n \n
\n );\n let activeStyle = {};\n if (this.props.selectedObjects.members.find(item => item.url===image.url && item.manifestID===image.manifestID))\n activeStyle = {backgroundColor: \"#4ED6CB\"}\n let manifestName = this.props.manifests[image.manifestID].name;\n if (this.props.windowWidth<=768) { \n manifestName = manifestName.substring(0,8) + \"...\"; \n } else if (this.props.windowWidth<=1024) { \n manifestName = manifestName.substring(0,25) + \"...\"; \n }\n return (\n
this.props.handleObjectClick(\"imageMapBoard\", image, event)} >\n
\n
{e.stopPropagation();this.props.toggleImageModal(true, image.url, image.manifestID.includes(\"DIY\"))}}>\n \n \n \n
\n
\n {image.label}\n
\n {manifestName}\n
\n
\n {actionButtons}\n
\n );\n }\n\n\n renderGhostImageItem = (index) => {\n return (
);\n }\n\n\n renderItem = (index, style) => {\n return (\n
\n {this.props.sideIDs[index] ? \n this.renderSideItem(index)\n :\n this.renderGhostSideItem(index)\n }\n {this.props.images[index] ? \n this.renderImageItem(index)\n :\n this.renderGhostImageItem(index)\n }\n
\n );\n }\n\n\n render() {\n if (this.props.sideIDs.length===0 && this.props.images.length===0){\n return (\n
Move items from the \"backlog\" into this area
\n );\n }\n\n return (\n this.renderItem(index, style)}\n overscanCount={10}\n estimatedItemSize={100}\n />\n );\n\n\n }\n}\n","import React, {Component} from 'react';\nimport SideBacklog from './mapImages/SideBacklog';\nimport ImageBacklog from './mapImages/ImageBacklog';\nimport MapBoard from './mapImages/MapBoard';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport ImageViewer from \"../global/ImageViewer\";\nimport Dialog from 'material-ui/Dialog';\nimport SelectField from '../global/SelectField';\nimport { btnBase } from '../../styles/button';\n\n/** Map Images page */\nexport default class MapImages extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n imageMapBoard: [], // [{manifestID: \"\", label: \"\", url: \"\"}, ...]\n sideMapBoard: [], // [sideID, ...]\n imageBacklog: [], // [{manifestID: \"\", label: \"\", url: \"\"}, ...]\n sideBacklog: [], // [sideID, ...]\n activeManifest: this.props.manifests[Object.keys(this.props.manifests)[0]], // {id: \"\", url: \"\", images: []}\n initialMapping: {imageMapBoard: [], sideMapBoard: [], imageBacklog: {}, sideBacklog: []},\n selectedObjects: {type: \"\", members: [], lastSelected: null},\n imageModalOpen: false,\n activeImage: null // {url:\"\", isDIY: true/false}\n }\n }\n\n componentWillMount() {\n this.updateBoards(this.props);\n }\n\n componentWillReceiveProps(nextProps) {\n let members = [];\n if (nextProps.selectAll!==\"\")\n members = [...this.state[nextProps.selectAll]];\n const selectedObjects = {type: nextProps.selectAll, members, lastSelected: members[-1]};\n this.setState({ selectedObjects });\n if (nextProps.Rectos!==this.props.Rectos||nextProps.Versos!==this.props.Versos) this.updateBoards(nextProps);\n }\n\n updateBoards = (props) => {\n // Update initial map board with already existing mappings\n const { Rectos, rectoIDs, Versos, versoIDs } = props;\n let imageBacklog = [];\n for (let manifest of Object.entries(props.manifests)) {\n imageBacklog = imageBacklog.concat(manifest[1].images);\n if (manifest[0] === \"DIYImages\") {\n imageBacklog = imageBacklog.sort((a, b) => (a.label > b.label) ? 1 : -1);\n }\n }\n let sideBacklog = [...rectoIDs].map((rectoID, index) => [rectoID, versoIDs[index]]).reduce((a,b)=> a.concat(b), []);\n let imageMapBoard = [];\n let sideMapBoard = [];\n // Add sides to board or backlog depending if they're linked to images\n for (const sideID of sideBacklog) {\n const side = sideID.charAt(0)===\"R\" ? Rectos[sideID] : Versos[sideID];\n if (side.image.label){\n sideMapBoard.push(sideID);\n imageMapBoard.push(side.image);\n }\n }\n // Remove items from backlog which already exists in the intial map board\n imageBacklog = imageBacklog.filter(backlogImage => !imageMapBoard.find(mapImage => mapImage.url===backlogImage.url && mapImage.manifestID===backlogImage.manifestID));\n sideBacklog = sideBacklog.filter(sideID => !sideMapBoard.includes(sideID));\n this.setState({imageBacklog, sideBacklog, sideMapBoard, imageMapBoard, initialMapping:{imageBacklog, sideBacklog, sideMapBoard, imageMapBoard}});\n }\n\n handleManifestChange = activeManifestID => this.setState({activeManifest: this.props.manifests[activeManifestID]});\n\n toggleImageModal = (imageModalOpen, url, isDIY) => {this.props.togglePopUp(imageModalOpen); this.setState({imageModalOpen, activeImage: {url, isDIY}})};\n\n resetChanges = () => {\n const { imageBacklog, sideBacklog, sideMapBoard, imageMapBoard } = this.state.initialMapping;\n const selectedObjects = {type: \"\", members: [], lastSelected: null};\n const activeManifest = this.props.manifests[Object.keys(this.props.manifests)[0]];\n this.setState({ imageBacklog, sideBacklog, sideMapBoard, imageMapBoard, selectedObjects, activeManifest });\n }\n\n handleObjectClick = (type, object, event) => {\n let selectedObjects = {...this.state.selectedObjects, members: [...this.state.selectedObjects.members]};\n if (event.ctrlKey || event.metaKey || (event.modifiers!==undefined && event.modifiers.command)) {\n // Toggle this object without clearing active objects unless type is different\n if (selectedObjects.type !== type) {\n selectedObjects.members = [];\n selectedObjects.type = type;\n }\n let index;\n if (type.includes(\"image\"))\n index = selectedObjects.members.findIndex(member => member.url===object.url && member.manifestID===object.manifestID);\n else\n index = selectedObjects.members.indexOf(object);\n (index!==-1) ? selectedObjects.members.splice(index, 1) : selectedObjects.members.push(object);\n }\n if (event.button === 0 || event.modifiers!==undefined) {\n let notCtrl=event.ctrlKey !== undefined && !event.ctrlKey && !event.shiftKey;\n let notCmd=event.metaKey !== undefined && !event.metaKey && !event.shiftKey;\n let notCanvasCmd=event.modifiers !== undefined && !event.modifiers.command && !event.modifiers.shift;\n if ((notCtrl&¬Cmd)||notCanvasCmd) {\n // Clear all and toggle only this object\n if (selectedObjects.members.includes(object)) {\n selectedObjects.members = [];\n } \n else {\n selectedObjects.members = [object];\n }\n }\n if (event.shiftKey || (event.modifiers!==undefined && event.modifiers.shift)) {\n window.getSelection().removeAllRanges();\n // Object type changed, clear all active selected objects\n if (selectedObjects.type !== type) {\n selectedObjects.members = [object];\n } else {\n // Select all similar type objects within this object and last selected object\n let allMembers = [...this.state[type]];\n let indexOfCurrentElement, indexOfLastElement;\n if (type.includes(\"image\")){\n indexOfCurrentElement = allMembers.findIndex(member => member.url===object.url && member.manifestID===object.manifestID);\n indexOfLastElement = allMembers.findIndex(member => member.url===selectedObjects.lastSelected.url && member.manifestID===selectedObjects.lastSelected.manifestID);\n }\n else {\n indexOfCurrentElement = allMembers.indexOf(object);\n indexOfLastElement = allMembers.indexOf(selectedObjects.lastSelected);\n }\n let indexes = [indexOfLastElement, indexOfCurrentElement];\n indexes.sort((a, b) => {return a-b});\n const currentSelected = [...selectedObjects.members];\n selectedObjects.members = allMembers.slice(indexes[0], indexes[1]+1);\n for (let object of currentSelected){\n if (!selectedObjects.members.includes(object))\n selectedObjects.members.push(object);\n }\n }\n }\n }\n if (selectedObjects.members.length === 0) {\n selectedObjects.type = \"\";\n } else {\n selectedObjects.type = type;\n selectedObjects.lastSelected = object;\n }\n this.setState({ selectedObjects });\n }\n\n moveItemUpOrDown = (item, mapBoardType, position) => {\n let newMapBoard = [...this.state[mapBoardType]];\n let indexOfItem;\n if (mapBoardType===\"imageMapBoard\"){\n indexOfItem = newMapBoard.findIndex(image => image.url===item.url && image.manifestID===item.manifestID);\n } else {\n indexOfItem = newMapBoard.indexOf(item);\n }\n const indexOfSwappingItem = position===\"down\" ? indexOfItem+1 : indexOfItem-1;\n const swappedItem = newMapBoard[indexOfSwappingItem];\n newMapBoard[indexOfItem] = swappedItem;\n newMapBoard[indexOfSwappingItem] = item;\n this.setState({ [mapBoardType]: newMapBoard });\n }\n\n moveItemsToMap = (items=this.state.selectedObjects.members, mapBoardType, backlogBoardType) => {\n let newMapBoard = [...this.state[mapBoardType], ...items];\n let newBacklogBoard;\n if (mapBoardType===\"imageMapBoard\"){\n newBacklogBoard = [...this.state[backlogBoardType]].filter(image => !items.find(item => item.url===image.url && item.manifestID===image.manifestID));\n } else {\n newBacklogBoard = [...this.state[backlogBoardType]].filter(item => !items.includes(item));\n }\n let selectedObjects = {...this.state.selectedObjects, members: [...this.state.selectedObjects.members]};\n selectedObjects.type = mapBoardType;\n this.setState({ [mapBoardType]: newMapBoard, [backlogBoardType]: newBacklogBoard, selectedObjects });\n }\n\n moveItemsToBacklog = (items=this.state.selectedObjects.members, mapBoardType, backlogBoardType) => {\n let newBacklogBoard = [...this.state[backlogBoardType], ...items];\n let newMapBoard;\n if (mapBoardType===\"imageMapBoard\"){\n newMapBoard = [...this.state[mapBoardType]].filter(image => !items.find(item => item.url===image.url && item.manifestID===image.manifestID));\n newBacklogBoard.sort((a, b)=>this.state.initialMapping[backlogBoardType].findIndex(image => image.url===a.url && image.manifestID===a.manifestID) > this.state.initialMapping[backlogBoardType].findIndex(image => image.url===b.url && image.manifestID===b.manifestID) ? 1 : -1);\n // newBacklogBoard.sort((a, b)=>a.label>b.label ? 1 : -1);\n } else {\n newMapBoard = [...this.state[mapBoardType]].filter(item => !items.includes(item));\n newBacklogBoard.sort((a, b)=>this.state.initialMapping[backlogBoardType].indexOf(a) > this.state.initialMapping[backlogBoardType].indexOf(b) ? 1 : -1);\n }\n let selectedObjects = {...this.state.selectedObjects, members: [...this.state.selectedObjects.members]};\n selectedObjects.type = backlogBoardType;\n this.setState({ [mapBoardType]: newMapBoard, [backlogBoardType]: newBacklogBoard, selectedObjects });\n }\n\n submitIsDisabled = () => {\n // check for changes in sideMapBoard\n const sideMapBoard = this.state.sideMapBoard;\n const initialSideMapBoard = this.state.initialMapping.sideMapBoard;\n let noChangesInSideMapBoard = sideMapBoard.length===initialSideMapBoard.length && sideMapBoard.every((v,i) => v===initialSideMapBoard[i]);\n // check for changes in imageMapBoard\n const imageMapBoard = this.state.imageMapBoard;\n const initialImageMapBoard = this.state.initialMapping.imageMapBoard;\n let noChangesInImageMapBoard = imageMapBoard.length===initialImageMapBoard.length && imageMapBoard.every((v,i) => v.url===initialImageMapBoard[i].url && v.manifestID===initialImageMapBoard[i].manifestID);\n // compare both changes\n const noChanges = noChangesInSideMapBoard && noChangesInImageMapBoard;\n const unevenMatches = this.state.sideMapBoard.length!==this.state.imageMapBoard.length;\n return unevenMatches || noChanges;\n }\n\n automatchIsDisabled = () => {\n let findFolioNumber = function(image) {\n return this.folioNumber && image.label.includes(this.folioNumber.toLowerCase());\n }\n for (const sideID of this.state.sideBacklog) {\n const side = sideID.charAt(0)===\"R\" ? this.props.Rectos[sideID] : this.props.Versos[sideID];\n // Return immediately if a match is found\n if (this.state.imageBacklog.find(findFolioNumber, {folioNumber: side.folio_number})) return false;\n }\n return true;\n }\n\n automatch = () => {\n let findByFolioNumber = function(image) {\n let tokenizedLabel = image.label.split(\".\");\n let label = tokenizedLabel[tokenizedLabel.length-2];\n return label.endsWith(this.side.folio_number.toLowerCase())\n }\n let sideItemsToMap = [];\n let imageItemsToMap = [];\n for (const sideID of this.state.sideBacklog) {\n const side = sideID.charAt(0)===\"R\" ? this.props.Rectos[sideID] : this.props.Versos[sideID];\n const image = this.state.imageBacklog.find(findByFolioNumber, {side});\n if (image) {\n sideItemsToMap.push(sideID);\n imageItemsToMap.push(image);\n }\n }\n this.moveItemsToMap(sideItemsToMap, \"sideMapBoard\", \"sideBacklog\");\n this.moveItemsToMap(imageItemsToMap, \"imageMapBoard\", \"imageBacklog\");\n }\n \n submitMapping = () => {\n let newSideMappings = [];\n let unlinkedSideMappings = [];\n let sideIDsWithImage = this.state.sideMapBoard.map((sideID, i) => [sideID, this.state.imageMapBoard[i]]);\n for (let [sideID, image] of sideIDsWithImage){\n newSideMappings.push({ id: sideID, attributes: {image} });\n }\n for (let sideID of this.state.initialMapping.sideMapBoard) {\n if (this.state.sideMapBoard.indexOf(sideID)===-1)\n unlinkedSideMappings.push({ id: sideID, attributes: {image: {}}})\n } \n this.props.mapSidesToImages(newSideMappings.concat(unlinkedSideMappings));\n // Update initial mapping list\n this.setState({\n initialMapping: {imageMapBoard: this.state.imageMapBoard, sideMapBoard: this.state.sideMapBoard, imageBacklog: this.state.imageBacklog, sideBacklog: this.state.sideBacklog}\n })\n }\n\n renderMoveUpButton = (target) => {\n const mapboard = target + \"MapBoard\";\n const backlog = target + \"Backlog\";\n return (\n this.moveItemsToMap(undefined, mapboard, backlog)}\n disabled={this.state.selectedObjects.members.length===0 || this.state.selectedObjects.type!==backlog}\n {...btnBase()}\n style={{...btnBase().style, marginRight:\"0.2em\"}}\n tabIndex={this.props.tabIndex}\n />\n )\n }\n renderMoveDownButton = (target) => {\n const mapboard = target + \"MapBoard\";\n const backlog = target + \"Backlog\";\n return (\n this.moveItemsToBacklog(undefined, mapboard, backlog)}\n disabled={this.state.selectedObjects.members.length===0 || this.state.selectedObjects.type!==mapboard}\n tabIndex={this.props.tabIndex}\n {...btnBase()}\n />\n )\n }\n\n\n render() {\n if (Object.keys(this.props.manifests).length<1) {\n return (\n
\n

Getting started

\n

To start mapping images to the collation, please add images in the \"Manage Images\" tab.

\n
\n );\n }\n\n const mapBoard = (\n \n );\n\n const middlePanel = (\n
\n
\n {this.renderMoveUpButton(\"side\")}\n {this.renderMoveDownButton(\"side\")}\n
\n
\n \n
\n
\n {this.renderMoveUpButton(\"image\")}\n {this.renderMoveDownButton(\"image\")}\n
\n
\n );\n\n const sideBacklog = (\n
\n
\n
Sides backlog
\n
\n
\n \n
\n
\n );\n\n const imageBacklog = (\n
\n
\n
Image Backlog
\n
\n
\n this.handleManifestChange(manifestID)}\n tabIndex={this.props.tabIndex}\n data={Object.entries(this.props.manifests).map(([manifestID, manifest])=>{\n return {value: manifestID, text: manifest.name}}\n )}\n />\n
\n
\n
\n\n
\n backlogImage.manifestID===this.state.activeManifest.id)} \n activeManifest={this.state.activeManifest}\n manifests={this.props.manifests}\n toggleImageModal={this.toggleImageModal}\n handleObjectClick={this.handleObjectClick}\n selectedObjects={this.state.selectedObjects}\n moveItemsToMap={this.moveItemsToMap}\n tabIndex={this.props.tabIndex}\n windowWidth={this.props.windowWidth}\n />\n
\n
\n );\n\n const mainToolBar = (\n
\n
Mapping {this.state.sideMapBoard.length} sides to {this.state.imageMapBoard.length} images
\n
\n \n \n
\n
\n );\n\n const imageViewerModal = (\n this.toggleImageModal(false)}\n contentStyle={{background: \"none\", boxShadow: \"inherit\"}}\n bodyStyle={{padding:0}}\n >\n \n \n );\n\n return (\n
\n
\n
\n {mapBoard}\n
\n
\n {middlePanel}\n
\n {sideBacklog}\n {imageBacklog}\n
\n {mainToolBar}\n {imageViewerModal}\n
\n );\n }\n}\n\n","import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport TopBar from \"./TopBar\";\nimport {Tabs, Tab} from 'material-ui/Tabs';\nimport topbarStyle from \"../styles/topbar\";\nimport Panel from '../components/global/Panel';\nimport { \n changeManagerMode,\n changeImageTab, \n} from \"../actions/backend/interactionActions\";\nimport { \n createManifest,\n updateManifest,\n deleteManifest,\n cancelCreateManifest,\n} from \"../actions/backend/manifestActions\";\nimport {\n sendFeedback,\n} from \"../actions/backend/userActions\";\nimport {\n mapSidesToImages,\n uploadImages,\n linkImages,\n unlinkImages,\n deleteImages,\n} from \"../actions/backend/imageActions\";\nimport ManageManifests from '../components/imageManager/ManageManifests';\nimport MapImages from '../components/imageManager/MapImages';\nimport {RadioButton, RadioButtonGroup} from 'material-ui/RadioButton';\nimport FlatButton from 'material-ui/FlatButton';\nimport {radioBtnDark} from \"../styles/button\";\nimport ManagersPanel from '../components/global/ManagersPanel';\n\nclass ImageManager extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n selectAll: \"\",\n windowWidth: window.innerWidth,\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.resizeHandler);\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.resizeHandler);\n }\n\n resizeHandler = () => {\n this.setState({windowWidth:window.innerWidth});\n }\n\n createManifest = (manifest) => {\n this.props.createManifest(this.props.projectID, manifest)\n }\n\n updateManifest = (manifest) => {\n this.props.updateManifest(this.props.projectID, manifest)\n }\n\n deleteManifest = (manifest) => {\n this.props.deleteManifest(this.props.projectID, manifest)\n }\n\n linkImages = (imageIDs) => {\n this.props.linkImages([this.props.projectID], imageIDs, this.props.manifests[\"DIYImages\"], this.props.images);\n }\n\n unlinkImages = (imageIDs) => {\n this.props.unlinkImages([this.props.projectID], imageIDs, this.props.manifests[\"DIYImages\"]);\n }\n\n uploadImages = (images) => {\n this.props.uploadImages(images, this.props.projectID);\n }\n\n handleSelection = (selectAll) => {\n this.setState({ selectAll })\n }\n\n\n deleteImages = (imageIDs) => {\n this.props.deleteImages(imageIDs, this.props.manifests[\"DIYImages\"]);\n }\n\n renderRadioButton = (value, label) => {\n return (\n \n )\n }\n\n render() {\n let content = \"\";\n if (this.props.activeTab===\"MANAGE\") {\n content = (\n \n )\n } else {\n content = (\n \n )\n }\n\n let selectionRadioGroup = (\n this.setState({selectAll: v})}\n >\n {this.renderRadioButton(\"sideMapBoard\", \"Select All Mapped Sides\")}\n {this.renderRadioButton(\"imageMapBoard\", \"Select All Mapped Images\")}\n {this.renderRadioButton(\"sideBacklog\", \"Select All Backlog Sides\")}\n {this.renderRadioButton(\"imageBacklog\", \"Select All Backlog Images\")}\n \n );\n\n let sidebarClasses = \"sidebar\";\n if (this.props.popUpActive) sidebarClasses += \" lowerZIndex\";\n\n const sidebar = (\n
\n
\n \n {this.props.activeTab===\"MAP\" ? \n \n {selectionRadioGroup}\n this.setState({selectAll:\"\"})}\n secondary\n fullWidth\n style={this.state.selectAll===\"\"?{display:\"none\"}:{}}\n tabIndex={this.props.popUpActive?-1:0}\n />\n \n : null\n }\n
\n );\n\n return (\n
\n
\n \n this.props.changeImageTab(v)}\n >\n \n \n \n \n {sidebar}\n
\n {content}\n
\n
\n
\n );\n }\n}\n\nconst mapStateToProps = (state) => {\n return {\n projectID: state.active.project.id,\n manifests: state.active.project.manifests,\n Leafs: state.active.project.Leafs,\n Rectos: state.active.project.Rectos,\n Versos: state.active.project.Versos,\n leafIDs: state.active.project.leafIDs,\n rectoIDs: state.active.project.rectoIDs,\n versoIDs: state.active.project.versoIDs,\n activeTab: state.active.imageManager.activeTab,\n managerMode: state.active.managerMode,\n createManifestError: state.active.imageManager.manageSources.error,\n images: state.dashboard.images,\n };\n};\nconst mapDispatchToProps = (dispatch) => {\n return {\n changeManagerMode: (managerMode) => {\n dispatch(changeManagerMode(managerMode));\n },\n changeImageTab: (tabName) => {\n dispatch(changeImageTab(tabName));\n },\n sendFeedback: (title, message) => {\n dispatch(sendFeedback(title, message))\n },\n createManifest: (projectID, manifest) => {\n dispatch(createManifest(projectID, manifest))\n },\n updateManifest: (projectID, manifest) => {\n dispatch(updateManifest(projectID, manifest))\n },\n deleteManifest: (projectID, manifest) => {\n dispatch(deleteManifest(projectID, manifest))\n },\n cancelCreateManifest: () => {\n dispatch(cancelCreateManifest())\n },\n mapSidesToImages: (sideMappings) => {\n dispatch(mapSidesToImages(sideMappings))\n },\n linkImages: (projectIDs, imageIDs, manifest, allImages) => {\n dispatch(linkImages(projectIDs, imageIDs));\n },\n unlinkImages: (projectIDs, imageIDs, manifest) => {\n dispatch(unlinkImages(projectIDs, imageIDs));\n },\n deleteImages: (imageIDs, manifest) => {\n dispatch(deleteImages(imageIDs));\n },\n uploadImages: (images, projectID) => {\n dispatch(uploadImages(images, projectID));\n }\n };\n};\nexport default connect(mapStateToProps, mapDispatchToProps)(ImageManager);\n","import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport CollationManager from './CollationManager'\nimport TermsManager from './TermsManager';\nimport ImageManager from './ImageManager';\nimport LoadingScreen from \"../components/global/LoadingScreen\";\nimport Notification from \"../components/global/Notification\";\nimport ServerErrorScreen from \"../components/global/ServerErrorScreen\";\nimport NetworkErrorScreen from \"../components/global/NetworkErrorScreen\";\nimport Feedback from \"./Feedback\";\nimport { loadProject } from \"../actions/backend/projectActions\";\n\n/** Container for 'Manager (Collation or Terms or Image)', `LoadingScreen`, and `Notification`. */\nclass Project extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n popUpActive: false,\n };\n }\n\n componentWillMount() {\n const projectID = this.props.location.pathname.split(\"/\")[2];\n this.props.user.authenticated ? this.props.loadProject(projectID) : this.props.history.push('/');\n }\n\n componentDidUpdate() {\n if (!this.props.user.authenticated) this.props.history.push('/');\n }\n\n togglePopUp = (value) => {\n this.setState({popUpActive: value});\n }\n\n render() { \n const collationManager = ();\n const termsManager = ();\n const imageManager = ();\n let manager;\n switch (this.props.managerMode) {\n case \"collationManager\":\n manager = collationManager;\n break;\n case \"termsManager\":\n manager = termsManager;\n break;\n case \"imageManager\":\n manager = imageManager;\n break;\n default:\n // Must never reach here.\n manager = (
Oh No !! Something went wrong
);\n }\n return (\n
\n {manager}\n \n \n \n \n \n
\n )\n }\n}\n\nconst mapStateToProps = (state) => {\n return {\n user: state.user,\n managerMode: state.active.managerMode,\n loading: state.global.loading,\n notification: state.global.notification,\n projectID: state.active.project.id,\n };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n return {\n loadProject: (projectID) => {\n dispatch(loadProject(projectID))\n },\n };\n};\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Project);\n\n","import React, { Component } from 'react';\nimport { connect } from \"react-redux\";\n\nimport InfoBox from './InfoBox';\nimport ViewingMode from '../components/collationManager/ViewingMode';\nimport TermDialog from '../components/collationManager/dialog/TermDialog';\nimport {\n changeViewMode,\n handleObjectClick,\n} from \"../actions/backend/interactionActions\";\n\n\nclass CollationManagerViewOnly extends Component {\n constructor(props) {\n super(props);\n this.state = {\n windowWidth: window.innerWidth,\n contentStyle: {\n transition: 'top 450ms cubic-bezier(0.23, 1, 0.32, 1)',\n top: 40,\n },\n leftSideBarOpen: false,\n activeTerm: null\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.resizeHandler);\n this.props.changeViewMode('VIEWING')\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.resizeHandler);\n }\n\n resizeHandler = () => {\n this.setState({ windowWidth: window.innerWidth });\n }\n\n handleObjectClick = (object, event) => {\n event.stopPropagation();\n this.props.handleObjectClick(\n this.props.selectedObjects,\n object,\n event,\n this.props.project.groupIDs,\n this.props.project.leafIDs,\n this.props.project.rectoIDs,\n this.props.project.versoIDs,\n );\n }\n\n closeTermDialog = () => {\n this.setState({ activeTerm: null, clickedFromDiagram: false }, () => this.props.togglePopUp(false));\n }\n\n openTermDialog = (term, clickedFromDiagram = false) => {\n this.setState({ activeTerm: term, clickedFromDiagram }, () => this.props.togglePopUp(true));\n }\n\n getCommonTerms = (props = this.props) => {\n // Find the common terms of all currently selected objects\n const memberType = props.selectedObjects.type;\n const members = props.selectedObjects.members;\n let terms = [];\n if (members.length > 0) {\n terms = props.project[memberType + \"s\"][members[0]].terms;\n for (let id of members) {\n terms = this.intersect(terms, props.project[memberType + \"s\"][id].terms);\n }\n }\n return terms;\n }\n\n /**\n * Returns items in common\n */\n intersect = (list1, list2) => {\n if (list1.length >= list2.length)\n return list1.filter((id1) => { return list2.includes(id1) });\n else\n return list2.filter((id1) => { return list1.includes(id1) });\n }\n\n\n render() {\n const containerStyle = { top: 85, right: \"2%\", height: 'inherit', maxHeight: '80%', width: '28%' };\n if (!this.state.leftSideBarOpen) {\n containerStyle[\"width\"] = \"30%\";\n }\n\n const infobox = (\n \n { },\n unlinkTerm: () => { },\n updatePreferences: () => { }\n }}\n togglePopUp={this.props.togglePopUp}\n tabIndex={this.props.popUpActive ? -1 : 0}\n windowWidth={this.state.windowWidth}\n />\n
\n )\n\n let workspace =
;\n if (this.props.project.groupIDs.length > 0) {\n workspace = (\n
\n
\n

{this.props.project.title}

\n \n
\n {infobox}\n
\n );\n }\n if (this.props.project.groupIDs.length === 0 && !this.props.loading) {\n workspace = (\n
\n
\n

\n Project is either empty or does not exist\n

\n
\n
\n );\n }\n\n return (\n
\n {workspace}\n { },\n deleteTerm: () => { },\n linkTerm: () => { },\n unlinkTerm: () => { },\n linkAndUnlinkTerms: () => { },\n }}\n projectID={this.props.project.id}\n Taxonomies={this.props.project.Taxonomies}\n Terms={this.props.project.Terms}\n Groups={this.props.project.Groups}\n groupIDs={this.props.project.groupIDs}\n Leafs={this.props.project.Leafs}\n leafIDs={this.props.project.leafIDs}\n Rectos={this.props.project.Rectos}\n rectoIDs={this.props.project.rectoIDs}\n Versos={this.props.project.Versos}\n versoIDs={this.props.project.versoIDs}\n togglePopUp={this.props.togglePopUp}\n isReadOnly={true}\n />\n
\n );\n }\n}\n\n\nconst mapStateToProps = (state) => {\n return {\n user: state.user,\n project: state.active.project,\n managerMode: state.active.managerMode,\n filterPanelOpen: state.active.collationManager.filters.filterPanelOpen,\n selectedObjects: state.active.collationManager.selectedObjects,\n collationManager: state.active.collationManager,\n loading: state.global.loading,\n groupIDs: state.active.project.groupIDs,\n leafIDs: state.active.project.leafIDs,\n };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n return {\n changeViewMode: (viewMode) => {\n dispatch(changeViewMode(viewMode));\n },\n handleObjectClick: (selectedObjects, object, event, Groups, Leafs, Rectos, Versos) => {\n dispatch(handleObjectClick(selectedObjects, object, event, { Groups, Leafs, Rectos, Versos }));\n },\n };\n};\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CollationManagerViewOnly);\n","import React, {Component} from 'react';\nimport { connect } from \"react-redux\";\nimport CollationManager from './CollationManagerViewOnly'\nimport LoadingScreen from \"../components/global/LoadingScreen\";\nimport Notification from \"../components/global/Notification\";\nimport NetworkErrorScreen from \"../components/global/NetworkErrorScreen\";\nimport { loadProjectViewOnly } from \"../actions/backend/projectActions\";\n\n/** Container for 'Manager (Collation or Terms or Image)', `LoadingScreen`, and `Notification`. */\nclass Project extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n popUpActive: false,\n };\n }\n\n componentWillMount() {\n const projectID = this.props.location.pathname.split(\"/\")[2];\n this.props.loadProjectViewOnly(projectID);\n }\n\n togglePopUp = (value) => {\n this.setState({popUpActive: value});\n }\n\n render() { \n return (\n
\n \n \n \n \n
\n )\n }\n}\n\nconst mapStateToProps = (state) => {\n return {\n user: state.user,\n loading: state.global.loading,\n notification: state.global.notification,\n projectID: state.active.project.id,\n };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n return {\n loadProjectViewOnly: (projectID) => {\n dispatch(loadProjectViewOnly(projectID))\n },\n };\n};\n\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Project);\n\n","export const initialState = {\n authenticated: false,\n token: \"\",\n errors: {\n login: {errorMessage: \"\"},\n register: {email: \"\", password: \"\"},\n update: {password: \"\", current_password: \"\", email: \"\"},\n confirmation: \"\",\n }\n}\n\nexport default initialState;\n","export const initialState = {\n projects: [],\n images: [],\n importStatus: null\n};\n\nexport default initialState;\n","export const initialState = {\n project: {\n id: '',\n title: '',\n shelfmark: '',\n uri: '',\n notationStyle: {\n name: 'notationStyle',\n displayName: 'Notation Style',\n options: ['r-v', 'recto-verso', 'a-b'],\n isDropdown: true,\n },\n metadata: {\n date: '',\n },\n manifests: {\n DIYImages: {\n id: 'DIYImages',\n name: 'Uploaded Images',\n images: [],\n },\n },\n groupIDs: [],\n leafIDs: [],\n rectoIDs: [],\n versoIDs: [],\n Groups: {},\n Leafs: {},\n Rectos: {},\n Versos: {},\n Taxonomies: [],\n Terms: {},\n preferences: {\n showTips: true,\n },\n },\n\n managerMode: 'collationManager',\n collationManager: {\n selectedObjects: {\n type: '',\n members: [],\n lastSelected: '',\n },\n viewMode: 'VISUAL',\n defaultAttributes: {\n leaf: [\n {\n name: 'type',\n displayName: 'Type',\n options: [\n 'None',\n 'Original',\n 'Added',\n 'Missing',\n 'Hook',\n 'Endleaf',\n 'Replaced',\n ],\n isDropdown: true,\n },\n {\n name: 'material',\n displayName: 'Material',\n options: ['None', 'Parchment', 'Paper', 'Other'],\n isDropdown: true,\n },\n {\n name: 'conjoined_to',\n displayName: 'Conjoined To',\n isDropdown: true,\n },\n {\n name: 'attached_above',\n displayName: 'Attached Above',\n options: [\n 'None',\n 'Sewn',\n 'Pasted',\n 'Tipped',\n 'Drummed',\n 'Stitched',\n 'Other',\n ],\n isDropdown: true,\n },\n {\n name: 'attached_below',\n displayName: 'Attached Below',\n options: [\n 'None',\n 'Sewn',\n 'Pasted',\n 'Tipped',\n 'Drummed',\n 'Stitched',\n 'Other',\n ],\n isDropdown: true,\n },\n {\n name: 'stub',\n displayName: 'Stub',\n options: ['No', 'Yes'],\n isDropdown: true,\n },\n {\n name: 'folio_number',\n displayName: 'Folio Number',\n },\n ],\n group: [\n {\n name: 'type',\n displayName: 'Type',\n options: ['Quire', 'Booklet'],\n isDropdown: true,\n },\n {\n name: 'title',\n displayName: 'Title',\n },\n ],\n side: [\n {\n name: 'texture',\n displayName: 'Texture',\n options: ['None', 'Hair', 'Flesh', 'Felt', 'Wire'],\n isDropdown: true,\n },\n {\n name: 'script_direction',\n displayName: 'Script Direction',\n options: ['None', 'Left-to-Right', 'Right-To-Left', 'Top-To-Bottom'],\n isDropdown: true,\n },\n {\n name: 'page_number',\n displayName: 'Page Number',\n },\n {\n name: 'uri',\n displayName: 'URI',\n },\n ],\n term: [\n {\n name: 'title',\n displayName: 'Title',\n },\n {\n name: 'taxonomy',\n displayName: 'Taxonomy',\n isDropdown: true,\n },\n {\n name: 'description',\n displayName: 'Description',\n },\n {\n name: 'uri',\n displayName: 'URI',\n },\n ],\n },\n filters: {\n filterPanelOpen: false,\n Groups: [],\n Leafs: [],\n Sides: [],\n Terms: [],\n GroupsOfMatchingLeafs: [],\n LeafsOfMatchingSides: [],\n GroupsOfMatchingSides: [],\n GroupsOfMatchingTerms: [],\n LeafsOfMatchingTerms: [],\n SidesOfMatchingTerms: [],\n active: false,\n hideOthers: false,\n queries: [\n {\n type: null,\n attribute: '',\n attributeIndex: '',\n values: [],\n condition: '',\n conjunction: '',\n },\n ],\n selection: '',\n },\n flashItems: {\n leaves: [],\n groups: [],\n },\n visualizations: {\n tacketed: '',\n sewing: '',\n },\n },\n termsManager: {\n activeTab: 'MANAGE',\n },\n imageManager: {\n activeTab: 'MANAGE',\n manageSources: {\n error: '',\n },\n },\n exportedData: '',\n exportedImages: '',\n};\n\nexport default initialState;\n","export const initialState = {\n loading: false, \n loadingRequestCount: 0,\n notification: \"\",\n serverError: false,\n unauthorizedError: false,\n};\n\nexport default initialState;\n","export const initialState = {\n undo: [],\n redo: [],\n}\nexport default initialState;","export function getLeafMembers(memberIDs, state, leafIDs=[]) {\n for (let memberID of memberIDs){\n if (memberID.charAt(0)===\"G\"){\n getLeafMembers(state.project.Groups[memberID].memberIDs, state, leafIDs)\n } else {\n leafIDs.push(memberID)\n }\n }\n}","import { getLeafMembers } from './helperActions';\n\nexport function autoConjoinLeafs(\n action,\n state,\n leaves,\n oddMemberLeftOut = false\n) {\n // Remove the existing conjoined_to of each leaf if it is already conjoined_to another leaf\n for (let leafID of leaves) {\n const leafConjoinedToID = state.project.Leafs[leafID].conjoined_to;\n if (leafConjoinedToID) {\n state.project.Leafs[leafConjoinedToID].conjoined_to = null;\n }\n }\n // Remove the oddLeafID from leaves list\n if (leaves.length % 2 === 1) {\n let oddLeafID;\n if (oddMemberLeftOut) oddLeafID = leaves[oddMemberLeftOut - 1];\n else oddLeafID = leaves[Math.floor(leaves.length / 2)];\n const oddLeafIDIndex = leaves.indexOf(oddLeafID);\n leaves.splice(oddLeafIDIndex, 1);\n state.project.Leafs[oddLeafID].conjoined_to = null;\n }\n for (let i = 0; i < leaves.length; i++) {\n if (leaves.length / 2 === i) break;\n else {\n const leafOneID = leaves[i];\n const leafTwoID = leaves[leaves.length - i - 1];\n state.project.Leafs[leafOneID].conjoined_to = leafTwoID;\n state.project.Leafs[leafTwoID].conjoined_to = leafOneID;\n }\n }\n return state;\n}\n\nexport function createLeaves(action, state, fromGroupCreation = false) {\n const parentGroupID = action.payload.request.data.leaf.parentID;\n const parentGroup = state.project.Groups[parentGroupID];\n const noOfLeaves = action.payload.request.data.additional.noOfLeafs;\n const memberOrder = action.payload.request.data.additional.memberOrder;\n const globalOrder = action.payload.request.data.additional.order;\n const autoConjoin = action.payload.request.data.additional.conjoin;\n const oddMemberLeftOut =\n action.payload.request.data.additional.oddMemberLeftOut;\n const leafIDs = action.payload.request.data.additional.leafIDs;\n const sideIDs = action.payload.request.data.additional.sideIDs;\n let newlyAddedLeafIDs = [];\n let sideCount = 0;\n for (let count = 0; count < noOfLeaves; count++) {\n // Create new Leaf with give leafID\n state.project.Leafs['Leaf_' + leafIDs[count]] = {\n id: 'Leaf_' + leafIDs[count],\n material: action.payload.request.data.leaf.material\n ? action.payload.request.data.leaf.material\n : 'None',\n type: action.payload.request.data.leaf.type\n ? action.payload.request.data.leaf.type\n : 'None',\n folio_number: null,\n conjoined_to: null,\n attached_above: 'None',\n attached_below: 'None',\n stub: action.payload.request.data.leaf.stub\n ? action.payload.request.data.leaf.stub\n : 'No',\n nestLevel: parentGroup.nestLevel,\n parentID: parentGroupID,\n rectoID: 'Recto_' + sideIDs[sideCount],\n versoID: 'Verso_' + sideIDs[sideCount + 1],\n terms: [],\n memberType: 'Leaf',\n };\n newlyAddedLeafIDs.push('Leaf_' + leafIDs[count]);\n // Create new Recto with given rectoID\n state.project.Rectos['Recto_' + sideIDs[sideCount]] = {\n id: 'Recto_' + sideIDs[sideCount],\n parentID: 'Leaf_' + leafIDs[count],\n page_number: null,\n texture: 'Hair',\n image: {},\n script_direction: 'None',\n terms: [],\n memberType: 'Recto',\n };\n state.project.rectoIDs.push('Recto_' + sideIDs[sideCount]);\n // Create new Verso with given rectoID\n state.project.Versos['Verso_' + sideIDs[sideCount + 1]] = {\n id: 'Verso_' + sideIDs[sideCount + 1],\n parentID: 'Leaf_' + leafIDs[count],\n page_number: null,\n texture: 'Flesh',\n image: {},\n script_direction: 'None',\n terms: [],\n memberType: 'Verso',\n };\n state.project.versoIDs.push('Verso_' + sideIDs[sideCount + 1]);\n sideCount += 2;\n }\n if (!fromGroupCreation) {\n // Add newlyAddedLeafIDs to the parentGroup's memberIDs list\n state.project.Groups[parentGroupID].memberIDs.splice(\n memberOrder - 1,\n 0,\n ...newlyAddedLeafIDs\n );\n // Add newlyAddedLeafIDs to the active project's leafIDs list\n if (globalOrder)\n state.project.leafIDs.splice(globalOrder - 1, 0, ...newlyAddedLeafIDs);\n else {\n // Populate leafIDs recursively and replace the active project's leafIDs list\n let updatedLeafIDs = [];\n for (let groupID of state.project.groupIDs) {\n const group = state.project.Groups[groupID];\n if (group.nestLevel === 1)\n getLeafMembers(group.memberIDs, state, updatedLeafIDs);\n }\n state.project.leafIDs = updatedLeafIDs;\n }\n // AutoConjoin newlyAddedLeaves if necessary\n }\n if (autoConjoin)\n autoConjoinLeafs(action, state, newlyAddedLeafIDs, oddMemberLeftOut);\n // Generate the list of new Leaves to flash\n state.collationManager.flashItems.leaves = [...newlyAddedLeafIDs];\n return state;\n}\n\nexport function updateLeaf(action, state) {\n const updatedLeafID = action.payload.request.url.split('/').pop();\n const updatedLeaf = action.payload.request.data.leaf;\n // Do side effects if necessary\n if (action.payload.request.data.leaf.hasOwnProperty('conjoined_to')) {\n state = handleConjoin(\n state,\n updatedLeafID,\n action.payload.request.data.leaf.conjoined_to\n );\n } else if (\n action.payload.request.data.leaf.hasOwnProperty('attached_above')\n ) {\n state = handleAttachAbove(\n state,\n updatedLeafID,\n action.payload.request.data.leaf.attached_above\n );\n } else if (\n action.payload.request.data.leaf.hasOwnProperty('attached_below')\n ) {\n state = handleAttachBelow(\n state,\n updatedLeafID,\n action.payload.request.data.leaf.attached_below\n );\n } else if (\n action.payload.request.data.leaf.hasOwnProperty('material') &&\n action.payload.request.data.leaf.material === 'Paper'\n ) {\n state = handlePaperUpdate(state, updatedLeafID);\n }\n // Update the leaf with id updatedLeafID\n state.project.Leafs[updatedLeafID] = {\n ...state.project.Leafs[updatedLeafID],\n ...updatedLeaf,\n };\n return state;\n}\n\nfunction handleConjoin(state, leafID, conjoinedToID) {\n const leaf = state.project.Leafs[leafID];\n if (leaf.conjoined_to) {\n state.project.Leafs[leaf.conjoined_to].conjoined_to = null;\n }\n if (conjoinedToID) {\n const conjoinedToLeaf = state.project.Leafs[conjoinedToID];\n if (conjoinedToLeaf.conjoined_to) {\n state.project.Leafs[conjoinedToLeaf.conjoined_to].conjoined_to = null;\n }\n state.project.Leafs[conjoinedToID].conjoined_to = leafID;\n }\n return state;\n}\n\nfunction handleAttachAbove(state, leafID, attachType) {\n const aboveLeafID =\n state.project.leafIDs[state.project.leafIDs.indexOf(leafID) - 1];\n state.project.Leafs[aboveLeafID].attached_below = attachType;\n return state;\n}\n\nfunction handleAttachBelow(state, leafID, attachType) {\n const belowLeafID =\n state.project.leafIDs[state.project.leafIDs.indexOf(leafID) + 1];\n state.project.Leafs[belowLeafID].attached_above = attachType;\n return state;\n}\n\nfunction handlePaperUpdate(state, leafID) {\n const leaf = state.project.Leafs[leafID];\n state.project.Rectos[leaf.rectoID].texture = 'None';\n state.project.Versos[leaf.versoID].texture = 'None';\n return state;\n}\n\nexport function updateLeaves(action, state) {\n const updatedLeaves = action.payload.request.data.leafs;\n for (let updatedLeaf of updatedLeaves) {\n // Update the leaf of id updatedLeaf.id with attributes updatedLeaf.attributes\n state.project.Leafs[updatedLeaf.id] = {\n ...state.project.Leafs[updatedLeaf.id],\n ...updatedLeaf.attributes,\n };\n if (\n updatedLeaf.attributes.hasOwnProperty('material') &&\n updatedLeaf.attributes.material === 'Paper'\n ) {\n state = handlePaperUpdate(state, updatedLeaf.id);\n }\n }\n return state;\n}\n\nexport function deleteLeaf(deletedLeafID, state) {\n const deletedLeaf = state.project.Leafs[deletedLeafID];\n const deletedLeafParent = state.project.Groups[deletedLeaf.parentID];\n const deletedLeafMemberIndex = deletedLeafParent.memberIDs.indexOf(\n deletedLeafID\n );\n // Detach deletedLeaf's conjoined leaf if exists\n if (deletedLeaf.conjoined_to !== null)\n state.project.Leafs[deletedLeaf.conjoined_to].conjoined_to = null;\n // Detach deletedLeaf's attached_above leaf if exists\n if (deletedLeaf.attached_above !== 'None') {\n const attachedAboveLeafID =\n deletedLeafParent.memberIDs[deletedLeafMemberIndex - 1];\n if (attachedAboveLeafID) {\n // deletedLeaf could be the first leaf in Group\n state.project.Leafs[attachedAboveLeafID].attached_below = 'None';\n }\n }\n // Detach deletedLeaf's attached_below leaf if exists\n if (deletedLeaf.attached_below !== 'None') {\n const attachedBelowLeafID =\n deletedLeafParent.memberIDs[deletedLeafMemberIndex + 1];\n if (attachedBelowLeafID)\n // deletedLeaf could be the last leaf in Group\n state.project.Leafs[attachedBelowLeafID].attached_above = 'None';\n }\n // Remove deletedLeafID from leafIDs list\n let deletedLeafIDIndex = state.project.leafIDs.indexOf(deletedLeafID);\n state.project.leafIDs.splice(deletedLeafIDIndex, 1);\n // Remove deletedLeafID from deletedLeafParent's memberIDs list\n deletedLeafIDIndex = deletedLeafParent.memberIDs.indexOf(deletedLeafID);\n state.project.Groups[deletedLeaf.parentID].memberIDs.splice(\n deletedLeafIDIndex,\n 1\n );\n // Update deletedLeafParent's tacketed if deletedLeafID is present\n deletedLeafIDIndex = deletedLeafParent.tacketed.indexOf(deletedLeafID);\n if (deletedLeafIDIndex !== -1)\n state.project.Groups[deletedLeaf.parentID].tacketed.splice(\n deletedLeafIDIndex,\n 1\n );\n // Update deletedLeafParent's sewing if deletedLeafID is present\n deletedLeafIDIndex = deletedLeafParent.sewing.indexOf(deletedLeafID);\n if (deletedLeafIDIndex !== -1)\n state.project.Groups[deletedLeaf.parentID].sewing.splice(\n deletedLeafIDIndex,\n 1\n );\n // Unlink all Terms of deletedLeafID. Also unlink Terms in Recto and Verso of deletedLeafID\n for (let termID in state.project.Terms) {\n deletedLeafIDIndex = state.project.Terms[termID].objects.Leaf.indexOf(\n deletedLeafID\n );\n let rectoIDIndex = state.project.Terms[termID].objects.Recto.indexOf(\n deletedLeaf.rectoID\n );\n let versoIDIndex = state.project.Terms[termID].objects.Verso.indexOf(\n deletedLeaf.versoID\n );\n if (deletedLeafIDIndex !== -1)\n state.project.Terms[termID].objects.Leaf.splice(deletedLeafIDIndex, 1);\n if (rectoIDIndex !== -1)\n state.project.Terms[termID].objects.Recto.splice(rectoIDIndex, 1);\n if (versoIDIndex !== -1)\n state.project.Terms[termID].objects.Verso.splice(versoIDIndex, 1);\n }\n // Remove deletedLeaf's Recto and Verso IDs from Rectos, rectoIDs, Versos, versoIDs\n delete state.project.Rectos[deletedLeaf.rectoID];\n delete state.project.Versos[deletedLeaf.versoID];\n const rectoIDIndex = state.project.rectoIDs.indexOf(deletedLeaf.rectoID);\n state.project.rectoIDs.splice(rectoIDIndex, 1);\n const versoIDIndex = state.project.versoIDs.indexOf(deletedLeaf.versoID);\n state.project.versoIDs.splice(versoIDIndex, 1);\n // Reset selectedObjects to empty list\n state.collationManager.selectedObjects = {\n type: '',\n members: [],\n lastSelected: '',\n };\n // Remove the deletedLeafID from Leafs\n delete state.project.Leafs[deletedLeafID];\n return state;\n}\n\nexport function deleteLeaves(deletedLeafIDs, state) {\n for (let deletedLeafID of deletedLeafIDs) {\n deleteLeaf(deletedLeafID, state);\n }\n return state;\n}\n\nexport function generatePageNumbers(action, state) {\n let numberCount = action.payload.request.data.startNumber;\n let rectoIDs = action.payload.request.data.rectoIDs;\n let versoIDs = action.payload.request.data.versoIDs;\n for (const index in rectoIDs) {\n const recto = state.project.Rectos[rectoIDs[index]];\n const verso = state.project.Versos[versoIDs[index]];\n recto['page_number'] = numberCount;\n numberCount++;\n verso['page_number'] = numberCount;\n numberCount++;\n }\n return state;\n}\n\nexport function generateFolioNumbers(action, state) {\n let numberCount = action.payload.request.data.startNumber;\n let leafIDs = action.payload.request.data.leafIDs;\n for (const index in leafIDs) {\n const leaf = state.project.Leafs[leafIDs[index]];\n leaf['folio_number'] = `${numberCount}`;\n numberCount++;\n }\n return state;\n}\n","import { createLeaves, deleteLeaf } from './leafActions';\nimport { getLeafMembers } from './helperActions';\n\nexport function createGroups(action, state) {\n const parentGroupID = action.payload.request.data.additional.parentGroupID\n const parentGroup = parentGroupID ? state.project.Groups[parentGroupID] : null\n const noOfGroups = action.payload.request.data.additional.noOfGroups\n const noOfLeaves = action.payload.request.data.additional.noOfLeafs\n const memberOrder = action.payload.request.data.additional.memberOrder\n const globalOrder = action.payload.request.data.additional.order\n const autoConjoin = action.payload.request.data.additional.conjoin\n const oddMemberLeftOut = action.payload.request.data.additional.oddMemberLeftOut\n const groupIDs = action.payload.request.data.additional.groupIDs\n const leafIDs = action.payload.request.data.additional.leafIDs\n const sideIDs = action.payload.request.data.additional.sideIDs\n const title = action.payload.request.data.group.title\n const type = action.payload.request.data.group.type\n const tacketed = action.payload.request.data.group.tacketed\n const sewing = action.payload.request.data.group.sewing\n let newlyAddedGroupIDs = []\n for (let count = 0; count < noOfGroups; count++) {\n // Create new Group with give groupID\n state.project.Groups[\"Group_\" + groupIDs[count]] = {\n id: \"Group_\" + groupIDs[count],\n title: title? title : \"None\",\n type: type? type : \"Quire\",\n tacketed: tacketed? tacketed : [],\n sewing: sewing? sewing : [],\n nestLevel: parentGroup ? parentGroup.nestLevel+1 : 1,\n parentID: parentGroup ? parentGroup.id : null,\n terms: [],\n memberType: \"Group\",\n memberIDs: leafIDs.slice(count*noOfLeaves, count*noOfLeaves+noOfLeaves).map(leafID => \"Leaf_\"+leafID)\n }\n newlyAddedGroupIDs.push(\"Group_\" + groupIDs[count])\n }\n // Add newlyAddedGroupIDs to the parentGroup's memberIDs list if parentGroup exist\n if (parentGroup) state.project.Groups[parentGroupID].memberIDs.splice(memberOrder-1, 0, ...newlyAddedGroupIDs)\n // Add newlyAddedGroupIDs to the active project's groupIDs list\n state.project.groupIDs.splice(globalOrder-1, 0, ...newlyAddedGroupIDs)\n // Populate leafIDs recursively and replace the active project's leafIDs list\n let updatedLeafIDs = [];\n for (let groupID of state.project.groupIDs) {\n const group = state.project.Groups[groupID];\n if (group.nestLevel===1) getLeafMembers(group.memberIDs, state, updatedLeafIDs)\n }\n state.project.leafIDs = updatedLeafIDs;\n // Create new leaves for each new Group\n let groupCount = 0\n for (let groupID of newlyAddedGroupIDs){\n const action = {payload: {request: {data: {\n leaf: { parentID: groupID },\n additional: {\n noOfLeafs: noOfLeaves,\n conjoin: autoConjoin,\n oddMemberLeftOut: oddMemberLeftOut,\n leafIDs: leafIDs.slice(groupCount*noOfLeaves, groupCount*noOfLeaves+noOfLeaves),\n sideIDs: sideIDs.slice(groupCount*2*noOfLeaves, groupCount*2*noOfLeaves+2*noOfLeaves)\n }\n }}}}\n state = createLeaves(action, state, true)\n groupCount += 1\n }\n // Generate the list of new Groups and Leaves to flash\n state.collationManager.flashItems.leaves = leafIDs.map((leafID)=>\"Leaf_\"+leafID);\n state.collationManager.flashItems.groups = [...newlyAddedGroupIDs]\n return state\n}\n\nexport function updateGroup(action, state) {\n const updatedGroupID = action.payload.request.url.split(\"/\").pop();\n const updatedGroup = action.payload.request.data.group\n // Update the group with id updatedGroupID\n state.project.Groups[updatedGroupID] = { ...state.project.Groups[updatedGroupID], ...updatedGroup }\n return state\n}\n\nexport function updateGroups(action, state) {\n const updatedGroups = action.payload.request.data.groups\n for (let updatedGroup of updatedGroups) {\n // Update the group of id updatedGroup.id with attributes updatedGroup.attributes\n state.project.Groups[updatedGroup.id] = { ...state.project.Groups[updatedGroup.id], ...updatedGroup.attributes }\n }\n return state\n}\n\nexport function deleteGroup(deletedGroupID, state) {\n const deletedGroup = state.project.Groups[deletedGroupID]\n // Remove deletedGroupID from groupIDs list\n let deletedGroupIDIndex = state.project.groupIDs.indexOf(deletedGroupID)\n state.project.groupIDs.splice(deletedGroupIDIndex, 1)\n // Unlink all Terms of deletedGroupID\n for (let termID in state.project.Terms) {\n deletedGroupIDIndex = state.project.Terms[termID].objects.Group.indexOf(deletedGroupID)\n if (deletedGroupIDIndex !== -1)\n state.project.Terms[termID].objects.Group.splice(deletedGroupIDIndex, 1)\n }\n // Remove deletedGroupID from deletedGroupParent's memberIDs list if exists\n if (deletedGroup.parentID ) {\n const deletedGroupParent = state.project.Groups[deletedGroup.parentID]\n deletedGroupIDIndex = deletedGroupParent.memberIDs.indexOf(deletedGroupID)\n state.project.Groups[deletedGroup.parentID].memberIDs.splice(deletedGroupIDIndex, 1)\n }\n // Remove all Group members of deletedGroup\n for (let memberID of [...deletedGroup.memberIDs]){\n if (memberID.charAt(0)===\"G\")\n deleteGroup(memberID, state)\n else\n deleteLeaf(memberID, state)\n }\n // Reset selectedObjects to empty list\n state.collationManager.selectedObjects = { type: \"\", members: [], lastSelected: \"\" }\n // Remove the deletedGroupID from Groups\n delete state.project.Groups[deletedGroupID]\n return state\n}\n\nexport function deleteGroups(deletedGroupIDs, state) {\n for (let deletedGroupID of deletedGroupIDs) {\n if (state.project.Groups.hasOwnProperty(deletedGroupID))\n deleteGroup(deletedGroupID, state)\n }\n return state\n}","export function updateSide(action, state) {\n const updatedSideID = action.payload.request.url.split(\"/\").pop();\n const updatedSide = action.payload.request.data.side\n // Update the side with id updatedSideID\n if (updatedSideID.charAt(0)===\"R\")\n state.project.Rectos[updatedSideID] = { ...state.project.Rectos[updatedSideID], ...updatedSide }\n else\n state.project.Versos[updatedSideID] = { ...state.project.Versos[updatedSideID], ...updatedSide }\n return state\n}\n\nexport function updateSides(action, state) {\n const updatedSides = action.payload.request.data.sides\n for (let updatedSide of updatedSides) {\n // Update the side of id updatedSide.id with attributes updatedSide.attributes\n if (updatedSide.id.charAt(0) === \"R\")\n state.project.Rectos[updatedSide.id] = { ...state.project.Rectos[updatedSide.id], ...updatedSide.attributes }\n else\n state.project.Versos[updatedSide.id] = { ...state.project.Versos[updatedSide.id], ...updatedSide.attributes }\n }\n return state\n}\n\nexport function mapSides(action, active, dashboard) {\n // SPEICAL CASE FOR DIY IMAGE MAPPING\n const mappedSides = action.payload.request.data.sides\n for (let mappedSide of mappedSides){\n const mappedSideID = mappedSide.id\n const mappedSideImage = mappedSide.attributes.image\n const sideNameKey = mappedSideID.charAt(0) === \"R\" ? \"Rectos\" : \"Versos\"\n const currentSideImage = active.project[sideNameKey][mappedSideID].image\n let imageLinkedID = false\n // If an Image was linked, check if it is a DIY Image and link mappedSideID to the Image\n if (mappedSideImage.hasOwnProperty('manifestID') && mappedSideImage.manifestID==='DIYImages'){\n imageLinkedID = mappedSideImage.url.split(\"/\").pop().split(\"_\")[0]\n let imageLinkedIDIndex = dashboard.images.findIndex(image => image.id===imageLinkedID)\n if (imageLinkedIDIndex>=0) {\n let mappedSideIDIndex = dashboard.images[imageLinkedIDIndex].sideIDs.indexOf(mappedSideID)\n // Link mappedSideID to this image\n if (mappedSideIDIndex===-1)\n dashboard.images[imageLinkedIDIndex].sideIDs.push(mappedSideID) \n }\n }\n // Check if this mappedSideID is now already linked to another DIY Image and unlink this mappedSideID from that Image\n if (mappedSideImage.hasOwnProperty('manifestID') && currentSideImage.hasOwnProperty('manifestID') && currentSideImage.manifestID === 'DIYImages') {\n let imageUnlinkedID = currentSideImage.url.split(\"/\").pop().split(\"_\")[0]\n if (!imageLinkedID || imageLinkedID !== imageUnlinkedID) {\n let imageUnlinkedIDIndex = dashboard.images.findIndex(image => image.id === imageUnlinkedID)\n let mappedSideIDIndex = dashboard.images[imageUnlinkedIDIndex].sideIDs.indexOf(mappedSideID)\n if (mappedSideIDIndex !== -1)\n dashboard.images[imageUnlinkedIDIndex].sideIDs.splice(mappedSideIDIndex, 1)\n }\n }\n // If an Image was unlinked, check if it was a DIY Image and unlink mappedSideID from the Image\n if (!mappedSideImage.hasOwnProperty('manifestID') && currentSideImage.hasOwnProperty('manifestID') && currentSideImage.manifestID==='DIYImages'){\n let imageID = currentSideImage.url.split(\"/\").pop().split(\"_\")[0]\n let imageIndex = dashboard.images.findIndex(image => image.id === imageID)\n if (imageIndex>=0) {\n let mappedSideIDIndex = dashboard.images[imageIndex].sideIDs.indexOf(mappedSideID)\n if (mappedSideIDIndex !== -1)\n dashboard.images[imageIndex].sideIDs.splice(mappedSideIDIndex, 1)\n }\n }\n }\n updateSides(action, active) // this will handle updating the 'image' field of all mapped Sides\n return { dashboard, active }\n}\n\n\n\n\n","export function linkImages(action, dashboard, active) {\n if (active.project.id!==\"\")\n linkImagesFromProject(action, dashboard, active)\n linkImagesFromDashboard(action, dashboard)\n return {dashboard, active}\n}\n\nexport function unlinkImages(action, dashboard, active) {\n if (active.project.id !== \"\")\n unlinkImagesFromProject(action, dashboard, active)\n unlinkImagesFromDashboard(action, dashboard)\n return { dashboard, active }\n}\n\nexport function deleteImages(action, dashboard, active) {\n if (active.project.id !== \"\")\n unlinkImagesFromProject(action, dashboard, active)\n deleteImagesFromDashboard(action, dashboard)\n return { dashboard, active }\n}\n\nexport function linkImagesFromProject(action, dashboard, active) {\n const imageIDs = action.payload.request.data.imageIDs\n for (let imageID of imageIDs) {\n // Add image of imageID to the list of DIYImages in active project\n const imageIndex = dashboard.images.findIndex(image => image.id === imageID)\n const image = dashboard.images[imageIndex]\n active.project.manifests.DIYImages.images.push({\n label: image.label,\n url: image.url,\n manifestID: \"DIYImages\"\n })\n }\n}\n\nfunction findByLabel (DIYImage) {\n return DIYImage.label === this.label;\n}\n\nexport function unlinkImagesFromProject(action, dashboard, active) {\n const imageIDs = action.payload.request.data.imageIDs;\n for (let imageID of imageIDs) {\n // Remove image of imageID from the list of DIYImages in active project\n let imageIndex = dashboard.images.findIndex(image => image.id === imageID)\n const image = dashboard.images[imageIndex]\n imageIndex = active.project.manifests.DIYImages.images.findIndex(findByLabel, {label:image.label})\n active.project.manifests.DIYImages.images.splice(imageIndex, 1)\n // Unlink all sides of this project if it was mapped to this image\n for (let sideID of image.sideIDs) {\n if (active.project.Rectos.hasOwnProperty(sideID))\n active.project.Rectos[sideID].image = {}\n if (active.project.Versos.hasOwnProperty(sideID))\n active.project.Versos[sideID].image = {}\n }\n }\n}\n\nexport function linkImagesFromDashboard(action, dashboard) {\n const projectIDs = action.payload.request.data.projectIDs\n const imageIDs = action.payload.request.data.imageIDs\n for (let projectID of projectIDs){\n // Add projectID to the list of projectIDs for each image of imageIDs\n for (let imageID of imageIDs) {\n let imageIndex = dashboard.images.findIndex(image => image.id === imageID)\n let projectIDIndex = dashboard.images[imageIndex].projectIDs.indexOf(projectID)\n if (projectIDIndex === -1)\n dashboard.images[imageIndex].projectIDs.push(projectID)\n }\n }\n}\n\nexport function unlinkImagesFromDashboard(action, dashboard) {\n const projectIDs = action.payload.request.data.projectIDs\n const imageIDs = action.payload.request.data.imageIDs\n for (let projectID of projectIDs) {\n // Remove projectID from the list of projectIDs for each image of imageIDs\n for (let imageID of imageIDs) {\n let imageIndex = dashboard.images.findIndex(image => image.id === imageID)\n let projectIDIndex = dashboard.images[imageIndex].projectIDs.indexOf(projectID)\n if (projectIDIndex !== -1)\n dashboard.images[imageIndex].projectIDs.splice(projectIDIndex, 1)\n }\n }\n}\n\nexport function deleteImagesFromDashboard(action, dashboard) {\n const imageIDs = action.payload.request.data.imageIDs\n // Remove imageID from dashboard.images for each image of imageIDs\n for (let imageID of imageIDs) {\n let imageIndex = dashboard.images.findIndex(image => image.id === imageID)\n dashboard.images.splice(imageIndex, 1)\n }\n}","import { cloneDeep } from 'lodash';\n\nimport {\n updateProject,\n updatePreferences,\n deleteProject,\n} from '../../actions/frontend/before/projectActions';\n\nimport {\n createTaxonomy,\n updateTaxonomy,\n deleteTaxonomy,\n createTerm,\n updateTerm,\n linkTerm,\n unlinkTerm,\n deleteTerm,\n} from '../../actions/frontend/before/termActions';\n\nimport {\n createGroups,\n updateGroup,\n updateGroups,\n deleteGroup,\n deleteGroups,\n} from '../../actions/frontend/before/groupActions';\n\nimport {\n updateSide,\n updateSides,\n mapSides,\n} from '../../actions/frontend/before/sideActions';\n\nimport {\n autoConjoinLeafs,\n createLeaves,\n updateLeaf,\n updateLeaves,\n deleteLeaf,\n deleteLeaves,\n generatePageNumbers,\n generateFolioNumbers,\n} from '../../actions/frontend/before/leafActions';\n\nimport {\n linkImages,\n unlinkImages,\n deleteImages,\n} from '../../actions/frontend/before/imageActions';\n\nimport {\n updateManifest,\n deleteManifest,\n} from '../../actions/frontend/before/manifestActions';\n\nconst frontendBeforeActionsMiddleware = store => next => action => {\n if (action.type.includes('FRONTEND')) {\n if (\n action.payload.request.successMessage &&\n action.payload.request.successMessage !== '' &&\n !action.isUndo &&\n !action.isRedo\n ) {\n next({\n type: 'SHOW_NOTIFICATION',\n payload: action.payload.request.successMessage,\n });\n setTimeout(() => next({ type: 'HIDE_NOTIFICATION' }), 4000);\n }\n }\n switch (action.type) {\n // Project Actions\n case 'UPDATE_PROJECT_FRONTEND':\n action.payload.response = updateProject(\n action,\n cloneDeep(store.getState().dashboard)\n );\n break;\n case 'UPDATE_PREFERENCES_FRONTEND':\n action.payload.response = updatePreferences(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_PROJECT_FRONTEND':\n action.payload.response = deleteProject(\n action,\n cloneDeep(store.getState().dashboard)\n );\n break;\n // Taxonomy Actions\n case 'CREATE_TAXONOMY_FRONTEND':\n action.payload.response = createTaxonomy(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'UPDATE_TAXONOMY_FRONTEND':\n action.payload.response = updateTaxonomy(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_TAXONOMY_FRONTEND':\n action.payload.response = deleteTaxonomy(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n // Tern Actions\n case 'CREATE_TERM_FRONTEND':\n action.payload.response = createTerm(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'UPDATE_TERM_FRONTEND':\n action.payload.response = updateTerm(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'LINK_TERM_FRONTEND':\n action.payload.response = linkTerm(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'UNLINK_TERM_FRONTEND':\n action.payload.response = unlinkTerm(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_TERM_FRONTEND':\n action.payload.response = deleteTerm(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n // Group Actions\n case 'CREATE_GROUPS_FRONTEND':\n action.payload.response = createGroups(\n action,\n cloneDeep(store.getState().active)\n );\n setTimeout(() => next({ type: 'UNFLASH' }), 5000);\n break;\n case 'UPDATE_GROUP_FRONTEND':\n action.payload.response = updateGroup(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'UPDATE_GROUPS_FRONTEND':\n action.payload.response = updateGroups(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_GROUP_FRONTEND':\n const deletedGroupID = action.payload.request.url.split('/').pop();\n action.payload.response = deleteGroup(\n deletedGroupID,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_GROUPS_FRONTEND':\n const deletedGroupIDs = action.payload.request.data.groups;\n action.payload.response = deleteGroups(\n deletedGroupIDs,\n cloneDeep(store.getState().active)\n );\n break;\n // Leaf Actions\n case 'GENERATE_FOLIO_NUMBERS_FRONTEND':\n action.payload.response = generateFolioNumbers(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'GENERATE_PAGE_NUMBERS_FRONTEND':\n action.payload.response = generatePageNumbers(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'AUTOCONJOIN_LEAFS_FRONTEND':\n let leafIDsToAutoConjoin = action.payload.request.data.leafs;\n action.payload.response = autoConjoinLeafs(\n action,\n cloneDeep(store.getState().active),\n leafIDsToAutoConjoin\n );\n break;\n case 'CREATE_LEAVES_FRONTEND':\n action.payload.response = createLeaves(\n action,\n cloneDeep(store.getState().active)\n );\n setTimeout(() => next({ type: 'UNFLASH' }), 5000);\n break;\n case 'UPDATE_LEAF_FRONTEND':\n action.payload.response = updateLeaf(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'UPDATE_LEAVES_FRONTEND':\n action.payload.response = updateLeaves(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_LEAF_FRONTEND':\n const deletedLeafID = action.payload.request.url.split('/').pop();\n action.payload.response = deleteLeaf(\n deletedLeafID,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_LEAVES_FRONTEND':\n const deletedLeafIDs = action.payload.request.data.leafs;\n action.payload.response = deleteLeaves(\n deletedLeafIDs,\n cloneDeep(store.getState().active)\n );\n break;\n // Side Actions\n case 'UPDATE_SIDE_FRONTEND':\n action.payload.response = updateSide(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'UPDATE_SIDES_FRONTEND':\n action.payload.response = updateSides(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'MAP_SIDES_FRONTEND':\n action.payload.response = mapSides(\n action,\n cloneDeep(store.getState().active),\n cloneDeep(store.getState().dashboard)\n );\n break;\n // Image Actions\n case 'LINK_IMAGES_FRONTEND':\n action.payload.response = linkImages(\n action,\n cloneDeep(store.getState().dashboard),\n cloneDeep(store.getState().active)\n );\n break;\n case 'UNLINK_IMAGES_FRONTEND':\n action.payload.response = unlinkImages(\n action,\n cloneDeep(store.getState().dashboard),\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_IMAGES_FRONTEND':\n action.payload.response = deleteImages(\n action,\n cloneDeep(store.getState().dashboard),\n cloneDeep(store.getState().active)\n );\n break;\n // Manifest Actions\n case 'UPDATE_MANIFEST_FRONTEND':\n action.payload.response = updateManifest(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n case 'DELETE_MANIFEST_FRONTEND':\n action.payload.response = deleteManifest(\n action,\n cloneDeep(store.getState().active)\n );\n break;\n default:\n break;\n }\n next(action);\n};\n\nexport default frontendBeforeActionsMiddleware;\n","export function updateProject(action, state){\n const updatedProject = action.payload.request.data.project;\n const updatedProjectID = action.payload.request.url.split(\"/\").pop();\n const projectIndex = state.projects.findIndex(project => project.id === updatedProjectID)\n state.projects[projectIndex] = {...state.projects[projectIndex], ...updatedProject};\n return state\n}\n\nexport function updatePreferences(action, state) {\n const preferences = action.payload.request.data.project.preferences;\n state.project.preferences = {\n group:{...state.project.preferences.group, ...preferences.group},\n leaf:{...state.project.preferences.leaf, ...preferences.leaf},\n side:{...state.project.preferences.side,...preferences.side}\n };\n return state;\n}\n\nexport function deleteProject(action, state) {\n const deletedProjectID = action.payload.request.url.split(\"/\").pop();\n const deletedProjectIndex = state.projects.findIndex(project => project.id === deletedProjectID);\n state.projects.splice(deletedProjectIndex, 1)\n // Remove deletedProjectID from all images. If image has no projects linked, delete the image.\n for (let image of [...state.images]){\n const projectIDIndex = image.projectIDs.indexOf(deletedProjectID)\n const imageIndex = state.images.findIndex(DIYImage => DIYImage.id === image.id)\n if (projectIDIndex !== -1) {\n state.images[imageIndex].projectIDs.splice(projectIDIndex, 1)\n }\n // Remove the image if its not linked to any other projects\n if (projectIDIndex!==-1 && image.projectIDs.length===0 && action.payload.request.data.deleteUnlinkedImages) {\n state.images.splice(imageIndex, 1)\n }\n }\n return state\n}\n","export function createTaxonomy(action, state) {\n const newTaxonomy = action.payload.request.data.taxonomy.taxonomy;\n state.project.Taxonomies.push(newTaxonomy);\n return state;\n}\n\nexport function updateTaxonomy(action, state) {\n const updatedTaxonomy = action.payload.request.data.taxonomy.taxonomy;\n const oldTaxonomy = action.payload.request.data.taxonomy.old_taxonomy;\n // Rename the taxonomy of each Note that had oldTaxonomy\n for (let termID in state.project.Terms) {\n if (state.project.Terms[termID].taxonomy === oldTaxonomy)\n state.project.Terms[termID].taxonomy = updatedTaxonomy;\n }\n // Rename the taxonomy in the taxonomies array\n const oldTaxonomyIndex = state.project.Taxonomies.indexOf(oldTaxonomy);\n state.project.Taxonomies[oldTaxonomyIndex] = updatedTaxonomy;\n return state;\n}\n\nexport function deleteTaxonomy(action, state) {\n const deletedTaxonomy = action.payload.request.data.taxonomy.taxonomy;\n // Rename the taxonomy of each Note that had deleteTaxonomy to Unknown\n for (let termID in state.project.Terms) {\n if (state.project.Terms[termID].taxonomy === deletedTaxonomy)\n state.project.Terms[termID].taxonomy = 'Unknown';\n }\n // Delete the taxonomy from the taxonomies array\n const deletedTaxonomyIndex = state.project.Taxonomies.indexOf(deletedTaxonomy);\n state.project.Taxonomies.splice(deletedTaxonomyIndex, 1);\n return state;\n}\n\nexport function createTerm(action, state) {\n const newTerm = action.payload.request.data.term;\n // Add new term to Terms\n state.project.Terms[newTerm.id] = {\n id: newTerm.id,\n title: newTerm.title,\n taxonomy: newTerm.taxonomy,\n description: newTerm.description,\n uri: newTerm.uri,\n show: newTerm.show,\n objects: { Group: [], Leaf: [], Recto: [], Verso: [] },\n };\n return state;\n}\n\nexport function updateTerm(action, state) {\n const updatedTermID = action.payload.request.url.split('/').pop();\n const updatedTerm = action.payload.request.data.term;\n // Update the term with id updatedTermID\n state.project.Terms[updatedTermID] = {\n ...state.project.Terms[updatedTermID],\n ...updatedTerm,\n };\n return state;\n}\n\nexport function linkTerm(action, state) {\n const linkedTermID = action.payload.request.url.split('/').slice(-2)[0];\n const linkedObjects = action.payload.request.data.objects;\n // Update each object with linkedTermID\n for (let object of linkedObjects) {\n if (object.type === 'Side')\n object.type = object.id.charAt(0) === 'R' ? 'Recto' : 'Verso';\n state.project[`${object.type}s`][object.id].terms.push(linkedTermID);\n // Update the objects property of term with linkedTermID\n state.project.Terms[linkedTermID].objects[object.type].push(object.id);\n }\n return state;\n}\n\nexport function unlinkTerm(action, state) {\n const unlinkedTermID = action.payload.request.url.split('/').slice(-2)[0];\n const unlinkedObjects = action.payload.request.data.objects;\n // Update each object by removing unlinkedTermID\n for (let object of unlinkedObjects) {\n if (object.type === 'Side')\n object.type = object.id.charAt(0) === 'R' ? 'Recto' : 'Verso';\n const unlinkedTermIDIndex = state.project[`${object.type}s`][\n object.id\n ].terms.indexOf(unlinkedTermID);\n state.project[`${object.type}s`][object.id].terms.splice(\n unlinkedTermIDIndex,\n 1\n );\n // Update the objects property of term with unlinkedTermID\n const unlinkedObjectIDIndex = state.project.Terms[unlinkedTermID].objects[\n object.type\n ].indexOf(object.id);\n state.project.Terms[unlinkedTermID].objects[object.type].splice(\n unlinkedObjectIDIndex,\n 1\n );\n }\n return state;\n}\n\nexport function deleteTerm(action, state) {\n const deletedTermID = action.payload.request.url.split('/').pop();\n // Delete the reference on all Groups,Leaves,Sides that this deletedTerm had\n for (let groupID of state.project.Terms[deletedTermID].objects.Group) {\n const deletedTermIDIndex = state.project.Groups[groupID].terms.indexOf(\n deletedTermID\n );\n state.project.Groups[groupID].terms.splice(deletedTermIDIndex, 1);\n }\n for (let leafID of state.project.Terms[deletedTermID].objects.Leaf) {\n const deletedTermIDIndex = state.project.Leafs[leafID].terms.indexOf(\n deletedTermID\n );\n state.project.Leafs[leafID].terms.splice(deletedTermIDIndex, 1);\n }\n for (let rectoID of state.project.Terms[deletedTermID].objects.Recto) {\n const deletedTermIDIndex = state.project.Rectos[rectoID].terms.indexOf(\n deletedTermID\n );\n state.project.Rectos[rectoID].terms.splice(deletedTermIDIndex, 1);\n }\n for (let versoID of state.project.Terms[deletedTermID].objects.Verso) {\n const deletedTermIDIndex = state.project.Versos[versoID].terms.indexOf(\n deletedTermID\n );\n state.project.Versos[versoID].terms.splice(deletedTermIDIndex, 1);\n }\n // Delete the term with id deletedTermID in Terms\n delete state.project.Terms[deletedTermID];\n return state;\n}\n","export function updateManifest(action, state) {\n const updatedManifest = action.payload.request.data.manifest\n // Only manifest name is allowed to be updated\n state.project.manifests[updatedManifest.id].name = updatedManifest.name\n return state\n}\n\nexport function deleteManifest(action, state) {\n const deletedManifest = action.payload.request.data.manifest\n // Delete the manifest with id deletedManifest.id from the active project's manifests\n delete state.project.manifests[deletedManifest.id]\n // Update all sides that have an image mapped from deletedManifest\n for (let rectoID of [...Object.keys(state.project.Rectos)]){\n const rectoSide = state.project.Rectos[rectoID]\n if (rectoSide.image.hasOwnProperty('manifestID') && rectoSide.image.manifestID===deletedManifest.id)\n state.project.Rectos[rectoID].image = {}\n }\n for (let versoID of [...Object.keys(state.project.Versos)]) {\n const versoSide = state.project.Versos[versoID]\n if (versoSide.image.hasOwnProperty('manifestID') && versoSide.image.manifestID === deletedManifest.id)\n state.project.Versos[versoID].image = {}\n }\n return state\n}\n","import { cloneDeep } from 'lodash';\nimport {\n updateImagesAfterUpload,\n} from '../../actions/frontend/after/imageActions';\n\nconst frontendAfterActionsMiddleware = store => next => action => {\n switch (action.type) {\n // Image Actions\n case \"UPLOAD_IMAGES_SUCCESS_BACKEND\":\n action.payload.response = updateImagesAfterUpload(action, cloneDeep(store.getState().dashboard), cloneDeep(store.getState().active))\n break;\n default:\n break;\n }\n next(action);\n}\n\n\nexport default frontendAfterActionsMiddleware;","export function updateImagesAfterUpload(action, dashboard, active) {\n const newDIYImages = action.payload.images\n dashboard.images = [...dashboard.images, ...newDIYImages]\n if (active.project.id !== \"\"){\n // Update the active project's DIYManifest images list\n active.project.manifests.DIYImages.images = [\n ...active.project.manifests.DIYImages.images, \n ...newDIYImages.map(image => { \n return { label: image.label, url: image.url, manifestID: \"DIYImages\" } \n })\n ]\n }\n return {dashboard, active}\n}\n","import {\n updateLeaf,\n updateLeafs,\n addLeafs,\n deleteLeafs,\n} from '../backend/leafActions';\nimport { updateSides } from '../backend/sideActions';\nimport { linkTerm } from '../backend/termActions';\nimport { updateGroups } from '../backend/groupActions';\n\nexport function undoCreateLeaves(action, state) {\n const leafIDs = action.payload.request.data.additional.leafIDs.map(id => {\n return 'Leaf_' + id;\n });\n const deleteRequest = deleteLeafs({ leafs: leafIDs });\n return [deleteRequest];\n}\n\nexport function undoUpdateLeaf(action, state) {\n const historyActions = [];\n const leafID = action.payload.request.url.split('/').pop();\n const attribute = Object.keys(action.payload.request.data.leaf)[0];\n\n const leaf = {\n [attribute]: state.project.Leafs[leafID][attribute],\n };\n historyActions.push(updateLeaf(leafID, leaf));\n if (\n attribute === 'material' &&\n (action.payload.request.data.leaf.material === 'Paper' ||\n action.payload.request.data.leaf.material === 'Parchment')\n ) {\n historyActions.push(\n updateSides([\n {\n id: state.project.Leafs[leafID].rectoID,\n attributes: {\n texture:\n state.project.Rectos[state.project.Leafs[leafID].rectoID].texture,\n },\n },\n {\n id: state.project.Leafs[leafID].versoID,\n attributes: {\n texture:\n state.project.Versos[state.project.Leafs[leafID].versoID].texture,\n },\n },\n ])\n );\n }\n return historyActions;\n}\n\nexport function undoUpdateLeaves(action, state) {\n const requestData = action.payload.request.data.leafs;\n const leafs = [];\n const historyActions = [];\n\n for (const request of requestData) {\n const leaf = state.project.Leafs[request.id];\n const item = {\n id: request.id,\n attributes: {},\n };\n for (const attribute in request.attributes) {\n if (!request.attributes.hasOwnProperty(attribute)) continue;\n item.attributes[attribute] = leaf[attribute];\n if (\n attribute === 'material' &&\n (request.attributes[attribute] === 'Paper' ||\n request.attributes[attribute] === 'Parchment')\n ) {\n historyActions.push(\n updateSides([\n {\n id: state.project.Leafs[leaf.id].rectoID,\n attributes: {\n texture:\n state.project.Rectos[state.project.Leafs[leaf.id].rectoID]\n .texture,\n },\n },\n {\n id: state.project.Leafs[leaf.id].versoID,\n attributes: {\n texture:\n state.project.Versos[state.project.Leafs[leaf.id].versoID]\n .texture,\n },\n },\n ])\n );\n }\n }\n leafs.push(item);\n }\n historyActions.push(updateLeafs(leafs, state.project.id));\n return historyActions;\n}\n\nexport function undoDeleteLeaves(action, state) {\n const historyActions = helperUndoDeleteLeaves(\n action.payload.request.data.leafs,\n state\n );\n return historyActions;\n}\n\nexport function undoDeleteLeaf(action, state) {\n const leafID = action.payload.request.url.split('/').pop();\n const historyActions = helperUndoDeleteLeaves([leafID], state);\n return historyActions;\n}\n\n/**\n * Params\n * leafIDs list of leaf IDs that may not belong to the same parent nor are sequential\n * state active tree state\n * Returns [ [leafID, leafID,..], ... ]\n */\nfunction helperSeparateLeavesByGroup(leafIDs, state) {\n const leafNeighbours = [[leafIDs[0]]];\n for (let i = 1; i < leafIDs.length; i++) {\n const leafID = leafIDs[i];\n const latestGroup = leafNeighbours[leafNeighbours.length - 1];\n const latestLeafID = latestGroup[latestGroup.length - 1];\n if (\n state.project.Leafs[latestLeafID].parentID ===\n state.project.Leafs[leafID].parentID &&\n state.project.leafIDs.indexOf(leafID) -\n state.project.leafIDs.indexOf(latestLeafID) ===\n 1\n ) {\n // Neighbour of last leaf, so add to same group\n latestGroup.push(leafID);\n } else {\n // Make a new group\n leafNeighbours.push([leafID]);\n }\n }\n return leafNeighbours;\n}\n\nexport function helperUndoDeleteLeaves(leafIDs, state) {\n const historyActions = [];\n // Make create requests\n // There'll be multiple create requests if not all leaves are under the same parent or are sequential\n const groupedLeaves = helperSeparateLeavesByGroup(leafIDs, state);\n\n for (const leafIDs of groupedLeaves) {\n const parentID = state.project.Leafs[leafIDs[0]].parentID;\n const sideIDs = leafIDs\n .map(leafID => [\n state.project.Leafs[leafID].rectoID.split('_')[1],\n state.project.Leafs[leafID].versoID.split('_')[1],\n ])\n .reduce((a, b) => a.concat(b));\n\n const leaf = {\n project_id: state.project.id,\n parentID: parentID,\n nestLevel: state.project.Groups[parentID].nestLevel,\n };\n const additional = {\n conjoin: false,\n leafIDs: leafIDs.map(id => id.split('_')[1]),\n memberOrder:\n state.project.Groups[parentID].memberIDs.indexOf(leafIDs[0]) + 1,\n noOfLeafs: leafIDs.length,\n order: state.project.leafIDs.indexOf(leafIDs[0]) + 1,\n sideIDs: sideIDs,\n };\n const createRequest = addLeafs(leaf, additional);\n historyActions.push(createRequest);\n }\n\n // Update leaves attributes\n const leafs = [];\n for (const leafID of leafIDs) {\n const leaf = state.project.Leafs[leafID];\n let attributes = {};\n attributes['folio_number'] = leaf.folio_number;\n attributes['type'] = leaf.type;\n attributes['material'] = leaf.material;\n attributes['stub'] = leaf.stub;\n if (leaf.conjoined_to) {\n attributes['conjoined_to'] = leaf.conjoined_to;\n // Update the conjoin partner leaf too\n leafs.push({\n id: leaf.conjoined_to,\n attributes: { conjoined_to: leafID },\n });\n }\n if (leaf.attached_above !== 'None') {\n attributes['attached_above'] = leaf.attached_above;\n // Update the above leaf too\n const leafAboveID =\n state.project.leafIDs[state.project.leafIDs.indexOf(leafID) - 1];\n if (!leafIDs.includes(leafAboveID))\n leafs.push({\n id: leafAboveID,\n attributes: { attached_below: leaf.attached_above },\n });\n }\n if (leaf.attached_below !== 'None') {\n attributes['attached_below'] = leaf.attached_below;\n // Update the below leaf too\n const leafBelowID =\n state.project.leafIDs[state.project.leafIDs.indexOf(leafID) + 1];\n if (!leafIDs.includes(leafBelowID))\n leafs.push({\n id: leafBelowID,\n attributes: { attached_above: leaf.attached_below },\n });\n }\n leafs.push({\n id: leafID,\n attributes,\n });\n }\n const updateLeafsRequest = updateLeafs(leafs, state.project.id);\n historyActions.push(updateLeafsRequest);\n\n // Update side attributes\n const sides = [];\n for (const leafID of leafIDs) {\n const leaf = state.project.Leafs[leafID];\n const recto = state.project.Rectos[leaf.rectoID];\n const verso = state.project.Versos[leaf.versoID];\n sides.push({\n id: recto.id,\n attributes: {\n texture: recto.texture,\n folio_number: recto.folio_number ? recto.folio_number : '',\n script_direction: recto.script_direction,\n },\n });\n sides.push({\n id: verso.id,\n attributes: {\n texture: verso.texture,\n folio_number: verso.folio_number ? verso.folio_number : '',\n script_direction: verso.script_direction,\n },\n });\n }\n const sideRequest = updateSides(sides);\n historyActions.push(sideRequest);\n\n // Link terms\n for (const leafID of leafIDs) {\n const leaf = state.project.Leafs[leafID];\n const recto = state.project.Rectos[leaf.rectoID];\n const verso = state.project.Versos[leaf.versoID];\n\n if (leaf.terms.length > 0) {\n const objects = [{ id: leafID, type: 'Leaf' }];\n for (const termID of leaf.terms) {\n const termRequest = linkTerm(termID, objects);\n historyActions.push(termRequest);\n }\n }\n if (recto.terms.length > 0) {\n const objects = [{ id: recto.id, type: 'Side' }];\n for (const termID of recto.terms) {\n const termRequest = linkTerm(termID, objects);\n historyActions.push(termRequest);\n }\n }\n if (verso.terms.length > 0) {\n const objects = [{ id: verso.id, type: 'Side' }];\n for (const termID of verso.terms) {\n const termRequest = linkTerm(termID, objects);\n historyActions.push(termRequest);\n }\n }\n }\n // Update parent group if leaves were part of sewing/tacket\n const groupsRequest = [];\n for (const leafID of leafIDs) {\n const leaf = state.project.Leafs[leafID];\n const group = state.project.Groups[leaf.parentID];\n if (\n group.sewing.length > 0 &&\n (group.sewing[0] === leafID ||\n (group.sewing[1] && group.sewing[1] === leafID))\n ) {\n groupsRequest.push({\n id: group.id,\n attributes: {\n sewing: group.sewing,\n },\n });\n }\n if (\n group.tacketed.length > 0 &&\n (group.tacketed[0] === leafID ||\n (group.tacketed[1] && group.tacketed[1] === leafID))\n ) {\n groupsRequest.push({\n id: group.id,\n attributes: {\n tacketed: group.tacketed,\n },\n });\n }\n }\n if (groupsRequest.length > 0)\n historyActions.push(updateGroups(groupsRequest));\n return historyActions;\n}\n\nexport function undoAutoconjoin(action, state) {\n const leafIDs = action.payload.request.data.leafs;\n const leafs = [];\n for (const leafID of leafIDs) {\n leafs.push({\n id: leafID,\n attributes: { conjoined_to: state.project.Leafs[leafID].conjoined_to },\n });\n }\n const historyAction = updateLeafs(leafs, state.project.id);\n return [historyAction];\n}\n\nexport function undoFolioNumbers(action, state) {\n const leafIDs = action.payload.request.data.leafIDs;\n const leaves = [];\n for (const leafID of leafIDs) {\n const item = {\n id: leafID,\n attributes: {\n folio_number: state.project['Leafs'][leafID]['folio_number'],\n },\n };\n leaves.push(item);\n }\n const historyActions = updateLeafs(leaves, state.project.id);\n return [historyActions];\n}\n\nexport function undoPageNumbers(action, state) {\n const sideIDs = action.payload.request.data.rectoIDs.concat(\n action.payload.request.data.versoIDs\n );\n const sides = [];\n for (const sideID of sideIDs) {\n const sideType = sideID.split('_')[0] + 's';\n const item = {\n id: sideID,\n attributes: {\n page_number: state.project[sideType][sideID]['page_number'],\n },\n };\n sides.push(item);\n }\n const historyActions = updateSides(sides);\n return [historyActions];\n}\n","import {\n addGroups,\n updateGroup,\n updateGroups,\n deleteGroups,\n} from '../backend/groupActions';\n\nimport {\n helperUndoDeleteLeaves\n} from './leafHelper';\n\nimport {\n linkTerm,\n} from '../backend/termActions';\n\nexport function undoCreateGroups(action, state) {\n const groupIDs = action.payload.request.data.additional.groupIDs.map((id)=>{return (\"Group_\"+id)});\n const deleteRequest = deleteGroups({groups: groupIDs}, state.project.id);\n return [deleteRequest];\n}\n\nexport function undoUpdateGroups(action, state) {\n const requestData = action.payload.request.data.groups;\n let groups = [];\n for (const request of requestData) {\n const group = state.project.Groups[request.id];\n let item = {\n id: request.id,\n attributes: {},\n }\n for (let attribute in request.attributes) {\n if (!request.attributes.hasOwnProperty(attribute)) continue;\n item.attributes[attribute] = group[attribute];\n }\n groups.push(item)\n }\n const historyAction = updateGroups(groups);\n return [historyAction];\n}\n\nexport function undoUpdateGroup(action, state) {\n const groupID = action.payload.request.url.split(\"/\").pop();\n let attribute = Object.keys(action.payload.request.data.group)[0];\n\n let group = {\n [attribute]: state.project.Groups[groupID][attribute],\n }\n const historyAction = updateGroup(groupID, group);\n return [historyAction];\n}\n\nexport function undoDeleteGroup(action, state) {\n const groupID = action.payload.request.url.split(\"/\").pop();\n const historyActions = helperUndoDeleteGroup(groupID, state);\n return historyActions;\n}\n\nexport function undoDeleteGroups(action, state) {\n const groupIDs = action.payload.request.data.groups;\n let historyActions = [];\n for (const groupID of groupIDs) {\n const group = state.project.Groups[groupID];\n if (!(group.parentID && groupIDs.includes(group.parentID))) {\n historyActions = historyActions.concat(helperUndoDeleteGroup(groupID, state));\n }\n }\n return historyActions;\n}\n\nfunction helperUndoDeleteGroup(groupID, state) {\n const group = state.project.Groups[groupID];\n let historyActions = [];\n // Create emtpy group\n const groupInfo = {\n project_id: state.project.id,\n title: group.title,\n type: group.type,\n tacketed: group.tacketed,\n sewing: group.sewing,\n }\n const additional = {\n noOfGroups: 1,\n leafIDs: [],\n sideIDs: [],\n groupIDs: [groupID.split(\"_\")[1]],\n order: state.project.groupIDs.indexOf(groupID) + 1,\n }\n if (group.parentID) {\n additional[\"memberOrder\"] = state.project.Groups[group.parentID].memberIDs.indexOf(groupID) + 1;\n additional[\"parentGroupID\"] = group.parentID;\n } else {\n additional[\"memberOrder\"] = additional.order;\n }\n historyActions.push(addGroups(groupInfo, additional));\n\n // Populate members\n const groupedMembers = helperSeparateMembers(group.memberIDs);\n for (let members of groupedMembers) {\n if (members[0][0]===\"L\") {\n historyActions = historyActions.concat(helperUndoDeleteLeaves(members, state));\n } else {\n // Recurse!\n historyActions = historyActions.concat(helperUndoDeleteGroup(members[0], state));\n }\n }\n // Link terms to group\n if (group.terms.length>0) {\n const objects = [{ id: groupID, type: \"Group\" }];\n for (const termID of group.terms) {\n const termRequest = linkTerm(termID, objects);\n historyActions.push(termRequest);\n }\n }\n return historyActions;\n}\n\n/**\n * Separate members into groups of leaves and groups\n */\nfunction helperSeparateMembers(memberIDs) {\n let result = memberIDs.length>0? [[memberIDs[0]]] : [];\n for (let i=1; i next => action => {\n async function sequentialDispatch(requests) {\n if (requests[0].types[0].includes('DELETE')) {\n // Only dispatch the first request (a delete request)\n // since subsequent requests will be invalid due to the first request\n store.dispatch(requests[0]);\n } else {\n if (requests.length > 1) {\n // Add loading screen if there are multiple requests\n requests.splice(0, 0, {\n type: 'UPDATE_LOADING_COUNT',\n payload: requests.length,\n });\n requests.splice(0, 0, { type: 'SHOW_LOADING' });\n }\n for (const request of requests) {\n await store.dispatch(request);\n }\n }\n }\n let historyAction = '';\n const d = new Date();\n const id = d.getTime();\n switch (action.type) {\n case 'UNDO':\n let newUndoStack = cloneDeep(store.getState().history.undo);\n let undoActionList = newUndoStack.pop();\n action.payload = newUndoStack;\n if (undoActionList) {\n undoActionList = undoActionList.map(request => {\n request.isUndo = true;\n request.urID = id;\n return request;\n });\n sequentialDispatch(undoActionList);\n }\n break;\n case 'REDO':\n let newRedoStack = cloneDeep(store.getState().history.redo);\n let redoActionList = newRedoStack.pop();\n action.payload = newRedoStack;\n if (redoActionList) {\n redoActionList = redoActionList.map(request => {\n request.isRedo = true;\n request.urID = id;\n return request;\n });\n sequentialDispatch(redoActionList);\n }\n break;\n case 'UPDATE_LEAF_FRONTEND':\n historyAction = undoUpdateLeaf(action, store.getState().active);\n break;\n case 'UPDATE_LEAVES_FRONTEND':\n historyAction = undoUpdateLeaves(action, store.getState().active);\n break;\n case 'DELETE_LEAF_FRONTEND':\n historyAction = undoDeleteLeaf(action, store.getState().active);\n break;\n case 'DELETE_LEAVES_FRONTEND':\n historyAction = undoDeleteLeaves(action, store.getState().active);\n break;\n case 'CREATE_LEAVES_FRONTEND':\n historyAction = undoCreateLeaves(action, store.getState().active);\n break;\n case 'AUTOCONJOIN_LEAFS_FRONTEND':\n historyAction = undoAutoconjoin(action, store.getState().active);\n break;\n case 'GENERATE_FOLIO_NUMBERS_FRONTEND':\n historyAction = undoFolioNumbers(action, store.getState().active);\n break;\n case 'GENERATE_PAGE_NUMBERS_FRONTEND':\n historyAction = undoPageNumbers(action, store.getState().active);\n break;\n case 'UPDATE_GROUPS_FRONTEND':\n historyAction = undoUpdateGroups(action, store.getState().active);\n break;\n case 'UPDATE_GROUP_FRONTEND':\n historyAction = undoUpdateGroup(action, store.getState().active);\n break;\n case 'CREATE_GROUPS_FRONTEND':\n historyAction = undoCreateGroups(action, store.getState().active);\n break;\n case 'DELETE_GROUP_FRONTEND':\n historyAction = undoDeleteGroup(action, store.getState().active);\n break;\n case 'DELETE_GROUPS_FRONTEND':\n historyAction = undoDeleteGroups(action, store.getState().active);\n break;\n case 'UPDATE_SIDE_FRONTEND':\n historyAction = undoUpdateSide(action, store.getState().active);\n break;\n case 'UPDATE_SIDES_FRONTEND':\n historyAction = undoUpdateSides(action, store.getState().active);\n break;\n case 'MAP_SIDES_FRONTEND':\n historyAction = undoUpdateSides(action, store.getState().active);\n break;\n case 'LINK_IMAGES_FRONTEND':\n historyAction = undoLinkImages(action);\n break;\n case 'UNLINK_IMAGES_FRONTEND':\n historyAction = undoUnlinkImages(action);\n break;\n case 'UPDATE_MANIFEST_FRONTEND':\n historyAction = undoUpdateManifest(action, store.getState().active);\n break;\n case 'DELETE_MANIFEST_FRONTEND':\n historyAction = undoDeleteManifest(action, store.getState().active);\n break;\n case 'UPDATE_TAXONOMY_FRONTEND':\n historyAction = undoUpdateTaxonomy(action, store.getState().active);\n break;\n case 'CREATE_TAXONOMY_FRONTEND':\n historyAction = undoCreateTaxonomy(action, store.getState().active);\n break;\n case 'DELETE_TAXONOMY_FRONTEND':\n historyAction = undoDeleteTaxonomy(action, store.getState().active);\n break;\n case 'LINK_TERM_FRONTEND':\n historyAction = undoLinkTerm(action, store.getState().active);\n break;\n case 'UNLINK_TERM_FRONTEND':\n historyAction = undoUnlinkTerm(action, store.getState().active);\n break;\n case 'DELETE_TERM_FRONTEND':\n historyAction = undoDeleteTerm(action, store.getState().active);\n break;\n default:\n break;\n }\n if (action.isUndoable) {\n let updatedStack;\n if (action.isUndo) {\n // Grab redo stack and add new action\n updatedStack = cloneDeep(store.getState().history.redo);\n if (updatedStack.length > 0) {\n let lastRedoGroup = updatedStack[updatedStack.length - 1];\n if (action.urID && lastRedoGroup[0].urID === action.urID) {\n let updatedGroup = updatedStack.pop();\n updatedStack.push(updatedGroup.concat(historyAction));\n } else {\n historyAction = historyAction.map(request => {\n request.urID = action.urID;\n return request;\n });\n updatedStack.push(historyAction);\n }\n } else {\n historyAction = historyAction.map(request => {\n request.urID = action.urID;\n return request;\n });\n updatedStack.push(historyAction);\n }\n } else {\n // Action is normal or a redo\n // Grab undo stack and add new action\n updatedStack = cloneDeep(store.getState().history.undo);\n if (updatedStack.length > 0) {\n let lastUndoGroup = updatedStack[updatedStack.length - 1];\n if (action.urID && lastUndoGroup[0].urID === action.urID) {\n let updatedGroup = updatedStack.pop();\n updatedStack.push(updatedGroup.concat(historyAction));\n } else {\n historyAction = historyAction.map(request => {\n request.urID = action.urID;\n return request;\n });\n updatedStack.push(historyAction);\n }\n } else {\n historyAction = historyAction.map(request => {\n request.urID = action.urID;\n return request;\n });\n updatedStack.push(historyAction);\n }\n }\n // Cut stack to only have 10 history actions\n let cutCount = 0;\n if (updatedStack.length > 10) {\n cutCount = updatedStack.length - 10;\n }\n updatedStack.splice(0, cutCount);\n if (action.isUndo) {\n next({ type: 'PUSH_REDO', payload: updatedStack });\n } else {\n next({ type: 'PUSH_UNDO', payload: updatedStack });\n }\n }\n next(action);\n};\n\nexport default undoRedoMiddleware;\n","import { createStore, combineReducers, compose, applyMiddleware } from 'redux';\nimport { autoRehydrate } from 'redux-persist';\nimport user from '../reducers/userReducer';\nimport dashboard from '../reducers/dashboardReducer';\nimport active from '../reducers/editCollationReducer';\nimport global from '../reducers/globalReducer';\nimport history from '../reducers/historyReducer';\nimport axiosMiddleware from 'redux-axios-middleware';\nimport { client, clientOptions } from './axiosConfig';\nimport frontendBeforeActionsMiddleware from './middleware/frontendBeforeActionsMiddleware';\nimport frontendAfterActionsMiddleware from './middleware/frontendAfterActionsMiddleware';\nimport undoRedoMiddleware from './middleware/undoRedoMiddleware';\n\nlet storeEnhancers;\nif (process.env.NODE_ENV === 'development') {\n storeEnhancers = compose(\n applyMiddleware(\n axiosMiddleware(client, clientOptions),\n undoRedoMiddleware,\n frontendBeforeActionsMiddleware,\n frontendAfterActionsMiddleware\n ),\n autoRehydrate()\n );\n if (window.__REDUX_DEVTOOLS_EXTENSION__) {\n storeEnhancers = compose(\n storeEnhancers,\n window.__REDUX_DEVTOOLS_EXTENSION__({trace: true})\n );\n }\n} else {\n storeEnhancers = compose(\n applyMiddleware(\n axiosMiddleware(client, clientOptions),\n undoRedoMiddleware,\n frontendBeforeActionsMiddleware,\n frontendAfterActionsMiddleware\n ),\n autoRehydrate()\n );\n}\n\nconst store = createStore(\n combineReducers({\n user,\n dashboard,\n active,\n global,\n history,\n }),\n {},\n storeEnhancers\n);\n\nexport default store;\n","import {\n linkImages,\n unlinkImages,\n} from '../backend/imageActions';\n\nexport function undoLinkImages(action) {\n const projectIDs = action.payload.request.data.projectIDs;\n const imageIDs = action.payload.request.data.imageIDs;\n const historyAction = unlinkImages(projectIDs, imageIDs);\n return [historyAction];\n}\n\nexport function undoUnlinkImages(action) {\n const projectIDs = action.payload.request.data.projectIDs;\n const imageIDs = action.payload.request.data.imageIDs;\n const historyAction = linkImages(projectIDs, imageIDs);\n return [historyAction];\n}","import {\n createManifest,\n updateManifest,\n} from '../backend/manifestActions';\n\nimport {\n updateSides,\n} from '../backend/sideActions';\n\nexport function undoUpdateManifest(action, state) {\n const manifest = {\n id: action.payload.request.data.manifest.id,\n name: state.project.manifests[action.payload.request.data.manifest.id].name,\n }\n const historyAction = updateManifest(state.project.id, {manifest});\n return [historyAction];\n}\n\nexport function undoDeleteManifest(action, state) {\n const historyActions = [];\n const manifestID = action.payload.request.data.manifest.id;\n // Create manifest\n const manifest = {\n id: manifestID,\n url: state.project.manifests[manifestID].url,\n }\n const createAction = createManifest(state.project.id, {manifest});\n historyActions.push(createAction);\n\n // Relink sides linked to images in this manifest \n const sides = [];\n for (const rectoID of state.project.rectoIDs) {\n const recto = state.project.Rectos[rectoID];\n if (recto.image.manifestID && recto.image.manifestID === manifestID) {\n const item = {\n id: recto.id,\n attributes: {\n image: {...recto.image},\n }\n }\n sides.push(item);\n }\n }\n for (const versoID of state.project.versoIDs) {\n const verso = state.project.Versos[versoID];\n if (verso.image.manifestID && verso.image.manifestID === manifestID) {\n const item = {\n id: verso.id,\n attributes: {\n image: {...verso.image},\n }\n };\n sides.push(item);\n }\n }\n if (sides.length>0) {\n const mapAction = updateSides(sides);\n historyActions.push(mapAction);\n }\n return historyActions;\n}","import {\n deleteTaxonomy,\n updateTaxonomy,\n createTaxonomy,\n updateTerm,\n unlinkTerm,\n linkTerm,\n addTerm,\n} from '../backend/termActions';\n\nexport function undoUpdateTaxonomy(action, state) {\n const taxonomy = {\n project_id: state.project.id,\n old_taxonomy: action.payload.request.data.taxonomy.taxonomy,\n taxonomy: action.payload.request.data.taxonomy.old_taxonomy,\n }\n const historyAction = updateTaxonomy(taxonomy);\n return [historyAction];\n}\n\nexport function undoCreateTaxonomy(action, state) {\n const taxonomy = {\n project_id: state.project.id,\n taxonomy: action.payload.request.data.taxonomy.taxonomy,\n }\n const historyAction = deleteTaxonomy(taxonomy);\n return [historyAction];\n}\n\nexport function undoDeleteTaxonomy(action, state) {\n const historyActions = [];\n // Create term taxonomy\n const tax = action.payload.request.data.taxonomy.taxonomy;\n const taxonomy = {\n project_id: state.project.id,\n tax,\n }\n historyActions.push(createTaxonomy(taxonomy));\n // Update terms that had this taxonomy\n for (const key in state.project.Terms) {\n if (!state.project.Terms.hasOwnProperty(key)) continue;\n if (state.project.Terms[key].taxonomy === tax) {\n historyActions.push(updateTerm(key, {tax}));\n }\n }\n return historyActions;\n}\n\nexport function undoLinkTerm(action, state) {\n const urlSplit = action.payload.request.url.split(\"/\");\n const termID = urlSplit[urlSplit.length-2];\n const historyAction = unlinkTerm(termID, action.payload.request.data.objects);\n return [historyAction];\n}\n\nexport function undoUnlinkTerm(action, state) {\n const urlSplit = action.payload.request.url.split(\"/\");\n const termID = urlSplit[urlSplit.length-2];\n const historyAction = linkTerm(termID, action.payload.request.data.objects);\n return [historyAction];\n}\n\nexport function undoDeleteTerm(action, state) {\n const historyActions = [];\n const termID = action.payload.request.url.split(\"/\").pop();\n const term = state.project.Terms[termID];\n\n // Create term\n const termData = {\n project_id: state.project.id,\n id: termID,\n title: term.title,\n taxonomy: term.taxonomy,\n description: term.description,\n show: term.show,\n }\n historyActions.push(addTerm(termData));\n\n // Relink leaves, groups, sides\n const objects = [];\n for (const id of term.objects.Group) {\n objects.push({id, type:\"Group\"});\n }\n for (const id of term.objects.Leaf) {\n objects.push({id, type:\"Leaf\"});\n }\n for (const id of term.objects.Recto) {\n objects.push({id, type:\"Recto\"});\n }\n for (const id of term.objects.Verso) {\n objects.push({id, type:\"Verso\"});\n }\n historyActions.push(linkTerm(termID, objects));\n\n return historyActions;\n}","import { initialState } from './initialStates/user';\n\nexport default function userReducer(state=initialState, action) {\n try {\n if (action.error) action = {type: action.type, payload: action.error.response.data}\n } catch (e) {}\n let errorMessage = \"\";\n state.notification = \"\";\n switch(action.type) {\n case \"persist/REHYDRATE\":\n state = {...state, ...action.payload.user, errors: initialState.errors}\n delete state.registerSuccess\n break;\n case \"LOGIN_SUCCESS\":\n state = {\n ...state,\n id: action.payload.session.id,\n name: action.payload.session.name,\n email: action.payload.session.email,\n token: action.payload.session.jwt,\n authenticated: true,\n lastLoggedIn: action.payload.session.lastLoggedIn,\n preferences: action.payload.session.preferences,\n }\n break;\n case \"LOGIN_FAILED\":\n if (action.payload && action.payload.errors) errorMessage = action.payload.errors.session;\n if (action.error) errorMessage = [action.error.data];\n state = {\n ...state,\n errors: {\n ...state.errors,\n login: {\n errorMessage,\n },\n }\n }\n break;\n case \"REGISTER_SUCCESS\":\n state = {\n ...state,\n registerSuccess: true\n }\n break;\n case \"REGISTER_FAILED\":\n state = {\n ...state,\n errors: {\n ...state.errors,\n register: action.payload.errors\n }\n }\n break;\n case \"UPDATE_PROFILE_SUCCESS\":\n state = {\n ...state,\n errors: initialState.errors,\n ...action.payload\n }\n break;\n case \"UPDATE_PROFILE_FAILED\":\n state = {\n ...state,\n errors: {\n ...state.errors,\n update: {...state.errors.update, ...action.payload}\n }\n }\n break;\n case \"LOGOUT_SUCCESS\":\n case \"DELETE_PROFILE_SUCCESS\":\n state = initialState\n break;\n case \"CONFIRM_SUCCESS\":\n state = {\n ...state,\n notification: \"Successfully confirmed your account!\",\n }\n break; \n case \"REQUEST_RESET_SUCCESS\":\n case \"REQUEST_RESET_FAILED\":\n case \"RESET_SUCCESS\":\n case \"RESET_FAILED\":\n case \"LOGOUT_FAILED\":\n case \"DELETE_PROFILE_FAILED\":\n break;\n case \"CONFIRM_FAILED\":\n errorMessage = \"Error confirming your account!\";\n if (action.payload.errors.confirmation_token.length>0) {\n errorMessage = \"Confirmation token \" + action.payload.errors.confirmation_token[0];\n }\n state = {\n ...state,\n errors: {\n ...state.errors,\n confirmation: errorMessage,\n }\n }\n break;\n\n default:\n break;\n }\n return state;\n}\n","import { initialState } from './initialStates/projects';\n\nexport default function dashboardReducer(state = initialState, action) {\n try {\n if (action.error) {\n action = { type: action.type, payload: action.error.response.data };\n }\n } catch (e) {}\n\n switch (action.type) {\n case 'LOAD_PROJECT_SUCCESS':\n state = action.payload.dashboard;\n break;\n case 'LOAD_PROJECTS_SUCCESS':\n case 'CREATE_PROJECT_SUCCESS':\n case 'CLONE_PROJECT_SUCCESS':\n state = {\n projects: action.payload.projects,\n images: action.payload.images,\n }\n break;\n case 'CLONE_PROJECT_IMPORT_SUCCESS':\n case 'IMPORT_MANIFEST_SUCCESS':\n state = action.payload;\n break;\n case 'IMPORT_PROJECT_SUCCESS':\n state = {\n projects: action.payload.projects,\n images: action.payload.images,\n importStatus: 'SUCCESS',\n };\n break;\n case 'IMPORT_PROJECT_SUCCESS_CALLBACK':\n state = { ...state, importStatus: null };\n break;\n case 'LOGOUT_SUCCESS':\n case 'DELETE_PROFILE_SUCCESS':\n state = initialState;\n break;\n case 'IMPORT_PROJECT_FAILED':\n state = {\n ...state,\n importStatus: action.payload.error,\n };\n break;\n case 'CREATE_PROJECT_FAILED':\n case 'LOAD_PROJECTS_FAILED':\n case 'CLONE_PROJECT_IMPORT_FAILED':\n break;\n\n // FRONT-END ACTIONS\n case 'UPDATE_PROJECT_FRONTEND':\n case 'DELETE_PROJECT_FRONTEND':\n state = action.payload.response;\n break;\n case 'LINK_IMAGES_FRONTEND':\n case 'UNLINK_IMAGES_FRONTEND':\n case 'DELETE_IMAGES_FRONTEND':\n case 'MAP_SIDES_FRONTEND':\n state = action.payload.response.dashboard;\n break;\n case 'UPLOAD_IMAGES_SUCCESS_BACKEND':\n state = action.payload.response.dashboard;\n break;\n case 'DELETE_PROJECT_SUCCESS_BACKEND':\n state = action.payload;\n break;\n default:\n break;\n }\n return state;\n}\n","import { initialState } from './initialStates/active';\nimport { cloneDeep } from 'lodash';\n\nexport default function editCollationReducer(state = initialState, action) {\n try {\n if (action.error) {\n action = { type: action.type, payload: action.error.response.data };\n }\n } catch (e) {}\n\n if (\n !action.type.includes('FRONTEND') &&\n action.type !== 'UPLOAD_IMAGES_SUCCESS_BACKEND'\n )\n state = cloneDeep(state);\n switch (action.type) {\n // MODIFICATIONS\n case 'LOAD_PROJECT_SUCCESS':\n state.project = action.payload.active;\n break;\n case 'LOAD_PROJECT_VIEW_ONLY_SUCCESS':\n state.project = {\n ...action.payload.project,\n ...action.payload,\n Groups: action.payload.groups,\n Leafs: action.payload.leafs,\n Rectos: action.payload.rectos,\n Versos: action.payload.versos,\n Terms: action.payload.terms,\n };\n break;\n case 'CREATE_MANIFEST_SUCCESS':\n state.project = action.payload.active;\n state.imageManager.manageSources.error = '';\n break;\n case 'CREATE_MANIFEST_FAILED':\n state.imageManager.manageSources.error = action.payload.errors;\n break;\n case 'CANCEL_CREATE_MANIFEST_FRONTEND':\n state.imageManager.manageSources.error = '';\n break;\n case 'TOGGLE_VISUALIZATION_DRAWING':\n state.collationManager.visualizations[action.payload.type] =\n action.payload.value;\n break;\n case 'LOGOUT_SUCCESS':\n case 'DELETE_PROFILE_SUCCESS':\n case 'LOAD_PROJECTS_SUCCESS':\n state = initialState;\n break;\n case 'LOAD_PROJECT_FAILED':\n case 'UPLOAD_IMAGES_FAILED':\n case 'FILTER_PROJECT_FAILED':\n case 'EXPORT_FAILED':\n break;\n case 'HIDE_PROJECT_TIP':\n state.project.preferences.showTips = false;\n break;\n case 'CHANGE_VIEW_MODE':\n state.collationManager.viewMode = action.payload;\n break;\n case 'CHANGE_MANAGER_MODE':\n state.managerMode = action.payload;\n break;\n case 'CHANGE_TERMS_TAB':\n state.termsManager.activeTab = action.payload;\n break;\n case 'CHANGE_IMAGES_TAB':\n state.imageManager.activeTab = action.payload;\n break;\n case 'TOGGLE_FILTER_PANEL':\n state.collationManager.filters.filterPanelOpen = action.payload;\n break;\n case 'TOGGLE_SELECTED_OBJECTS':\n case 'UPDATE_CURRENT_SELECTED_OBJECTS':\n state.collationManager.selectedObjects = action.payload;\n break;\n case 'FILTER_PROJECT_SUCCESS':\n state.collationManager.filters = {\n ...state.collationManager.filters,\n ...action.payload,\n active: true,\n };\n state.project.preferences = {\n group: { ...action.payload.visibleAttributes.group },\n leaf: { ...action.payload.visibleAttributes.leaf },\n side: { ...action.payload.visibleAttributes.side },\n };\n delete state.collationManager.filters['visibleAttributes'];\n break;\n case 'RESET_FILTERS':\n state.collationManager.filters = {\n ...initialState.collationManager.filters,\n filterPanelOpen: true,\n queries: action.payload,\n };\n break;\n case 'TOGGLE_FILTER_DISPLAY':\n state.collationManager.filters.hideOthers = !state.collationManager\n .filters.hideOthers;\n break;\n case 'UPDATE_FILTER_QUERY':\n state.collationManager.filters.queries = action.payload;\n break;\n case 'UPDATE_FILTER_SELECTION':\n state.collationManager.filters.selection = action.payload.selection;\n state.collationManager.filters.hideOthers = false;\n state.collationManager.selectedObjects = action.payload.selectedObjects;\n break;\n case 'UNFLASH':\n state.collationManager.flashItems.groups = [];\n state.collationManager.flashItems.leaves = [];\n break;\n case 'EXPORT_SUCCESS':\n state.exportedData =\n // adding more options to this breaks json export\n action.payload.type === 'xml' ||\n action.payload.type === 'svg' ||\n action.payload.type === 'png' ||\n action.payload.type === 'formula'\n ? action.payload.data\n : JSON.stringify(action.payload.Export, null, 4);\n state.exportedImages = action.payload.Images.exportedImages;\n break;\n\n // FRONT-END ACTIONS\n case 'CREATE_TAXONOMY_FRONTEND':\n case 'UPDATE_TAXONOMY_FRONTEND':\n case 'DELETE_TAXONOMY_FRONTEND':\n case 'UPDATE_TERM_FRONTEND':\n case 'DELETE_TERM_FRONTEND':\n case 'LINK_TERM_FRONTEND':\n case 'UNLINK_TERM_FRONTEND':\n case 'AUTOCONJOIN_LEAFS_FRONTEND':\n case 'CREATE_GROUPS_FRONTEND':\n case 'UPDATE_GROUP_FRONTEND':\n case 'UPDATE_GROUPS_FRONTEND':\n case 'DELETE_GROUP_FRONTEND':\n case 'DELETE_GROUPS_FRONTEND':\n case 'CREATE_LEAVES_FRONTEND':\n case 'UPDATE_LEAF_FRONTEND':\n case 'UPDATE_LEAVES_FRONTEND':\n case 'DELETE_LEAF_FRONTEND':\n case 'DELETE_LEAVES_FRONTEND':\n case 'UPDATE_SIDE_FRONTEND':\n case 'UPDATE_SIDES_FRONTEND':\n case 'UPDATE_MANIFEST_FRONTEND':\n case 'DELETE_MANIFEST_FRONTEND':\n case 'CREATE_TERM_FRONTEND':\n case 'GENERATE_FOLIO_NUMBERS_FRONTEND':\n case 'GENERATE_PAGE_NUMBERS_FRONTEND':\n state = action.payload.response;\n break;\n case 'UPDATE_PREFERENCES_FRONTEND':\n const showTips =\n action.payload.response.project.preferences.showTips !== undefined\n ? action.payload.response.project.preferences.showTips\n : state.project.preferences.showTips;\n state.project.preferences = {\n showTips,\n group: {\n ...state.project.preferences.group,\n ...action.payload.response.project.preferences.group,\n },\n leaf: {\n ...state.project.preferences.leaf,\n ...action.payload.response.project.preferences.leaf,\n },\n side: {\n ...state.project.preferences.side,\n ...action.payload.response.project.preferences.side,\n },\n };\n break;\n case 'LINK_IMAGES_FRONTEND':\n case 'UNLINK_IMAGES_FRONTEND':\n case 'DELETE_IMAGES_FRONTEND':\n case 'MAP_SIDES_FRONTEND':\n case 'UPLOAD_IMAGES_SUCCESS_BACKEND':\n state = action.payload.response.active;\n break;\n default:\n break;\n }\n return state;\n}\n","import { initialState } from './initialStates/global';\n\nexport default function globalReducer(state=initialState, action) {\n if (action.error && action.error.status===0) {\n state = {...state, serverError: true}\n }\n switch(action.type) {\n case \"SHOW_LOADING\":\n state = {...state, loading: true}\n break;\n case \"HIDE_LOADING\":\n state = {...state, loading: false}\n break;\n case \"SHOW_NOTIFICATION\":\n state = {...state, notification: action.payload}\n break;\n case \"HIDE_NOTIFICATION\":\n state = {...state, notification: \"\"}\n break;\n case \"UPDATE_LOADING_COUNT\":\n state = {...state, loadingRequestCount: action.payload};\n break;\n case \"DELETE_PROFILE_SUCCESS\":\n case \"LOGOUT_SUCCESS\":\n state = initialState\n break;\n case \"BACKEND_SERVER_ERROR\":\n state = {...state, serverError: true}\n break;\n default:\n break;\n }\n return state;\n}\n\n","import { initialState } from './initialStates/history';\n\nexport default function historyReducer(state=initialState, action) {\n switch(action.type) {\n case \"UNDO\":\n case \"PUSH_UNDO\":\n state.undo = action.payload;\n break;\n case \"REDO\":\n case \"PUSH_REDO\": \n state.redo = action.payload;\n break;\n case \"CLEAR_ACTION_HISTORY\":\n state.undo = [];\n state.redo = [];\n break;\n default:\n break;\n }\n return state;\n}","import React from 'react';\nimport logoImg from '../../assets/vceditor_logo.png';\nimport CircularProgress from 'material-ui/CircularProgress';\n\n/** Stateless functional component for the app loading screen */\nconst AppLoadingScreen = props => {\n const logo = \"logo\";\n if (props.loading) {\n return (\n
\n
\n
{logo}
\n
\n \n
\n
\n
\n );\n } else {\n return
;\n }\n};\nexport default AppLoadingScreen;\n","import React, { Component } from 'react';\nimport RaisedButton from 'material-ui/RaisedButton';\n\n/** 404 page */\nexport default class PageNotFound extends Component {\n render() {\n return
\n
\n

404!

\n

Well, this isn't where you parked your car.

\n \n this.props.history.push(\"/dashboard\")}\n />\n
\n
\n }\n}","import React, { Component } from 'react';\nimport injectTapEventPlugin from 'react-tap-event-plugin';\nimport MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';\nimport getMuiTheme from 'material-ui/styles/getMuiTheme';\nimport light from '../styles/light';\nimport '../styles/App.css';\nimport Authentication from './Authentication';\nimport Dashboard from './Dashboard';\nimport Project from './Project';\nimport ProjectViewOnly from './ProjectViewOnly'\nimport { persistStore } from 'redux-persist'\nimport store from '../store/store';\nimport { Provider } from 'react-redux';\nimport AppLoadingScreen from '../components/global/AppLoadingScreen';\nimport localForage from 'localforage'\nimport PageNotFound from '../components/global/PageNotFound';\nimport {\n BrowserRouter as Router,\n Route,\n Switch\n} from 'react-router-dom'\nimport CacheBuster from '../components/global/CacheBuster';\n\ninjectTapEventPlugin();\n\n/** Main app */\nclass App extends Component {\n\n constructor() {\n super()\n this.state = { rehydrated: false }\n }\n\n componentWillMount() {\n persistStore(store, { storage: localForage, whitelist: ['user'] }, () => {\n setTimeout(() => {\n this.setState({ rehydrated: true })\n }, 500);\n })\n }\n\n render() {\n if (!this.state.rehydrated) {\n return (\n \n \n \n )\n }\n return (\n \n {({ loading, isLatestVersion, refreshCacheAndReload }) => {\n if (loading) return null;\n if (!loading && !isLatestVersion) {\n // You can decide how and when you want to force reload\n refreshCacheAndReload();\n }\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}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './containers/App';\nimport registerServiceWorker from './registerServiceWorker';\nimport './styles/index.css';\n\n\nReactDOM.render(\n ,\n document.getElementById('root')\n);\nregisterServiceWorker();\n\n","// In production, we register a service worker to serve assets from local cache.\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 the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\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 }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\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"],"sourceRoot":""}