{"version":3,"sources":["images/app-store.png","images/google-play.png","helpers/IndexedDB.js","helpers/Constants.js","helpers/TokenRefresher.js","helpers/Utils.js","controllers/UserController.js","controllers/NotificationsController.js","helpers/Colours.js","components/Common/DarkMenuItem.js","controllers/ShipController.js","controllers/UserGroupController.js","controllers/DocumentController.js","components/Common/Alert.js","domain/Documents/Documents.js","components/Common/LoadingOverlay.js","controllers/CompanyController.js","domain/PushNotifcation/SendPushNotification.js","controllers/FeedbackController.js","domain/Layout/Feedback.js","domain/Layout/NavMenu.js","stores/Actions/Notifications.js","domain/Layout/MOTD.js","controllers/VersionController.js","domain/Layout/CheckVersion.js","stores/Actions/Authentication.js","domain/Layout/CheckToken.js","domain/Layout/Layout.js","components/Common/PrivateRoute.js","components/Auth/AuthLayout.js","domain/Auth/Login.js","domain/Auth/Logout.js","controllers/FileController.js","components/Common/SpacedDivider.js","domain/User/FileManager.js","components/Common/SearchCard.js","helpers/UseOnScreen.js","controllers/AdminController.js","components/Common/ItemImage.js","helpers/UploadReader.js","domain/Users/UsersAddEdit.js","controllers/ComplianceController.js","controllers/UserComplianceTestLevelController.js","domain/Users/UsersAssessmentLevels.js","domain/Users/UserRestPeriod.js","domain/Users/MassRestPeriod.js","components/Common/Skeleton.js","domain/Users/UploadUsers.js","domain/Users/Users.js","stores/Actions/Users.js","domain/User/Profile.js","domain/User/PasswordChange.js","domain/User/EmailConfirm.js","domain/User/EmailChange.js","domain/User/EmailChangeConfirm.js","domain/User/PasswordForgot.js","domain/User/PasswordReset.js","domain/User/TwoFactorManager.js","domain/User/TwoFactorVerify.js","domain/Error/NotFound.js","domain/User/NotificationList.js","domain/Dashboard/DashboardGraph.js","domain/Dashboard/Dashboard.js","stores/Actions/Dashboard.js","components/Common/SearchCardMini.js","domain/Users/UsersGroupsAddEdit.js","domain/Users/UsersGroups.js","domain/Fleet/FleetAddEdit.js","stores/Actions/Fleet.js","domain/Fleet/Fleet.js","domain/Company/CompanyAddEdit.js","domain/Company/Company.js","controllers/QuestionController.js","domain/Compliance/ComplianceAddEditQuestion.js","domain/Compliance/ComplianceSelector.js","helpers/CustomIcon.js","domain/Compliance/ComplianceAddEditAssessment.js","domain/Compliance/ComplianceAssessmentCard.js","domain/Compliance/ComplianceQuestionCard.js","domain/Compliance/QuestionTagExport.js","domain/Compliance/Compliance.js","domain/Compliance/ComplianceCategoryAddEdit.js","domain/Compliance/ComplianceCategory.js","domain/Auth/Register.js","domain/Auth/NoAccess.js","domain/Compliance/QuestionsPlainText.js","domain/Dashboard/OverviewTableItem.js","domain/Dashboard/OverviewQuestions.js","domain/Dashboard/OverviewAssessments.js","domain/Dashboard/OverviewUserGroups.js","app/App.js","app/ServiceWorker.js","stores/Reducers/Authentication.js","stores/Reducers/Notifications.js","stores/Reducers/Dashboard.js","stores/Reducers/Fleet.js","stores/Reducers/Users.js","stores/Reducers/History.js","index.js","stores/Store.js","images/fathom-final.png","images/bridge.png","images/no-img.png"],"names":["module","exports","db","APIDomain","APIRoute","LoginRoute","SSOKey","APIPath","companyId","userId","userName","shipId","categoryId","itemId","id","questionId","assessmentId","complianceId","SIGNALRPath","Notifications","Role","CompanyRole","CompanyRoles","name","ShipRole","ShipRoles","ItemType","IndexedDB","init","add","remove","fetch","dbInitalised","dbName","hasIndexedDB","window","a","Promise","resolve","request","indexedDB","open","onerror","generateResponse","onsuccess","event","target","result","setupDatabase","onupgradeneeded","createObjectStore","keyPath","createIndex","unique","then","output","hasError","data","isNullOrUndefined","console","error","errorCode","content","tokenObj","transaction","objectStore","delete","get","isRefreshing","response","headers","jwtrequiresrefresh","dbTokenResponse","log","UserController","refreshToken","refreshResponse","token","expires","refreshTokenCache","cacheResponse","TokenRefresher","checkAndRefeshToken","obj","undefined","isNullOrEmpty","isEmpty","Object","keys","length","isNullOrWhitespace","string","trim","isStatusOK","status","checkPassword","passwordRequirements","password","outstandingRequirements","validChars","Array","from","currentChars","forEach","element","includes","push","requiredLength","requireDigit","test","requireLowercase","requireUppercase","requireNonAlphanumeric","flattenFormContent","rootValue","formData","value","index","key","currentValue","isArray","i","append","File","scoreToPercentage","score","maxScore","toFixed","percentile","updateQueryString","queryString","history","replaceState","newUrl","location","protocol","host","pathname","path","descendingComparator","b","orderBy","defaultValue","aComp","bComp","getUserHeaders","getToken","hasTokenExpired","registerMagicLink","createMagicLink","editMagicLink","resendMagicLink","removeMagicLink","login","loginWithPasswordReset","logout","finishExternalLogin","getPasswordRequirements","forgotPassword","resetPassword","changePassword","addDeviceToken","getMOTD","seenMOTD","requestEmailConfirmation","checkForEmailConfirmation","getUserInfo","getRanks","getAuthenticatorCode","addTwoFactor","removeTwoFactor","verifyTwoFactor","fetchCachedUserData","updateUserLeave","deleteUser","contentType","Authorization","catch","moment","utc","isSameOrBefore","userHeaders","refreshModel","Axios","post","reason","rememberMe","regModel","email","firstName","lastName","phoneNumber","profilePic","companyRole","userGroupsId","ships","restPeriodsEnabled","canGenerateNFCTags","rank","secondaryEmail","FormData","e","encodeURIComponent","twoFactorToken","loginModel","Token","clearCachedUserData","getMyInfo","infoResponse","userData","cacheUserData","newPassword","newConfirmationPassword","resetModel","clearResponse","exists","forgotModel","code","passwordConfirmation","currentPassword","newPasswordConfirmation","changeModel","secret","addModel","authToken","cacheUserInfo","onLeave","updateCompanyId","userInfo","shipRoles","role","page","NotificationsController","getUnreadCount","getTop","getAll","markAsRead","markAllAsRead","Colours","DarkMenuItem","withStyles","root","color","backgroundColor","MenuItem","imo","portOfRegistry","logo","deleteImage","shipRole","shipUserModel","ShipController","getShips","getShipLogo","addShip","updateShip","deleteShip","getShipUsers","addUserToShip","editUserToShip","removeUserFromShip","scored","userGroupModel","userGroupId","UserGroupController","getUserGroups","addUserGroup","editUserGroup","deleteUserGroup","title","description","parentCategoryId","categoryModel","catagoryId","documentationCategoryId","file","documentModel","DocumentController","getCompanyRootCategories","getCompanyCategoryChildren","getCompanyCategoryItem","getCompanyDocumentItems","createCategory","editCategory","deleteCategory","removeShip","removeUserGroup","addDocumentItem","editDocumentItem","deleteDocumentItem","attachDocumentItem","removeDocumentItem","Alert","props","text","message","getErrorFromObject","getTextFromProps","header","severity","object","errorMessage","AlertTitle","useStyles","makeStyles","theme","docWrapper","flexDirection","height","maxHeight","breakpoints","down","leftArea","flexGrow","overflowY","rightArea","width","padding","WebkitBoxShadow","MozBoxShadow","boxShadow","topPaneButton","marginTop","item","paddingLeft","paddingRight","minWidth","fill","transform","button","justifyContent","maxWidth","loading","display","alignItems","selectArea","paddingTop","paddingBottom","closeBtn","position","top","right","Documents","pickOnly","onClose","onSelect","React","useState","setShips","userGroups","setUserGroups","folders","setFolders","documentUrl","setDocumentUrl","selectedItem","setSelectedItem","showNewFile","setShowNewFile","showNewFolder","setShowNewFolder","showDeleteItem","setShowDeleteItem","itemName","setItemName","itemDesc","setItemDesc","itemFile","setItemFile","warning","setWarning","setLoading","saving","setSaving","useTheme","matches","useMediaQuery","classes","loadShips","useCallback","loadUserGroups","loadInnerFolderRecursively","folder","documentItems","folderCopy","childFolders","innerFolder","map","parentId","loadFolders","folderMap","loadDocumentUrl","document","getItemType","handleInput","files","values","newSelectedItem","filter","newItem","o","handleCloseAndClearFormDialogs","handleAddNewFolder","preventDefault","handleAddNestedFolder","parentFolderId","folderToAdd","srcArray","handleAddNewFile","handleAddNewDocumentItem","documentToAdd","isFolder","handleFindAndRemoveItem","buildItem","indent","selected","ListItem","onClick","className","style","ListItemIcon","buildItemIcon","ListItemText","primary","typeName","String","fileType","buildOptionsHeader","Grid","xs","Typography","variant","gutterBottom","src","alt","paragraph","buildNoPermissionsText","buildAutocompleteFromList","array","label","Autocomplete","multiple","options","getOptionLabel","getOptionSelected","onChange","_","handleSelect","placeholder","filterSelectedOptions","renderInput","params","TextField","InputLabelProps","shrink","renderTags","getTagProps","option","Chip","buildAddNewFolderButton","Button","paneButton","startIcon","fullWidth","buildDeleteItemButton","disabled","Delete","useEffect","Dialog","fullScreen","CircularProgress","List","buildFolderItemContent","depth","items","doc","isRoot","container","spacing","buildRootFolderPermissions","CloudUpload","buildFolderOptions","Check","url","buildSelectItemButton","buildDocumentOptions","IconButton","Cancel","onSubmit","DialogTitle","DialogContent","required","multiline","rows","FormControl","InputLabel","FilledInput","aria-describedby","type","DialogActions","handleDeleteSelectedItem","buildConfirmDeleteDialog","backdrop","zIndex","LoadingOverlay","Backdrop","userQuery","shipQuery","startDate","userIds","messageTitle","messageContent","shipIds","userGroupIds","scoreFrom","CompanyController","getCompanyUsers","getCompanyFiltererdUsers","getCurrentMagicLinks","getUserProfilePic","getMagicLinkProfilePic","editUser","getUsersRestPeriodDate","getUsersRestPeriodDocument","getMassRestPeriodDocument","sendCompanyPushNotif","getCompanies","addCompany","updateCompany","getCompanyLogo","switchCompany","SendPushNotification","memo","initialized","setInitialized","setTitle","setMessage","selectedShips","setSelectedShips","selectedUserGroups","setSelectedUserGroups","handelClose","shipResponse","userGroupResponse","Init","prevProps","currentProps","image","FeedbackController","createTicket","bottom","margin","objectFit","Feedback","setImage","blob","imageBlob","node","getElementById","html2canvas","allowTaint","canvas","toDataURL","generateImage","Paper","align","drawer","flexShrink","appBar","left","menuButton","drawerPaper","fontSize","minHeight","avatarButton","borderRadius","up","marginBottom","notifButton","notifWrapper","notif","notifViewAll","permanentTools","desktopButton","connect","state","LogIn","Authentication","dispatch","PushHistory","AddNotif","AddNotifs","MarkAsRead","MarkAllAsRead","ClearAllNotifs","isAuthenticated","mobileOpen","setMobileOpen","userMenuOpen","setUserMenuOpen","notifTrayOpen","setNotifTrayOpen","profileAnchorEl","setProfileAnchorEl","notifAnchorEl","setNotifAnchorEl","showBadge","setShowBadge","totalUnread","setTotalUnread","redirectUrl","setRedirectUrl","hubConnection","setHubConnection","showDocs","setShowDocs","showPushNotif","setShowPushNotif","showFeedbackScreen","setShowFeedbackScreen","getHiddenNavClass","handleDrawerToggle","handleUserMenuClose","handleNotifTrayClose","handleUserMenuToggle","currentTarget","handleNotifTrayToggle","handleSubmitFeedback","buildDrawerOptionLink","route","icon","component","Link","to","buildDrawerOptionFunc","func","buildNotifications","elevation","isLastIndex","created","local","format","Divider","buildNotification","totalResponse","notifsResponse","stop","accessTokenFactory","connection","signalR","withUrl","withAutomaticReconnect","build","on","start","err","cleanUpNotifications","unread","recalculateUnread","CssBaseline","AppBar","aria-label","edge","Tooltip","placement","aria-controls","aria-haspopup","Badge","badgeContent","Menu","anchorEl","keepMounted","Boolean","size","Avatar","charAt","toUpperCase","Business","PermDeviceInformation","Drawer","anchor","direction","paper","ModalProps","drawerOptions","buildDrawerOptionOnClick","buildDrawerOptions","children","hidden","setHidden","Card","CardHeader","CardContent","CardActions","currentVersion","VersionController","getVersion","CheckVersion","needsUpdate","setNeedsUpdate","refreshNoCache","navigator","serviceWorker","getRegistrations","registrations","unregister","alert","success","reload","checkVersion","setTimeout","num","isRequired","Auth","LogOut","showExpired","setShowExpired","useLocation","getTextFromError","isLoggingIn","checkToken","Layout","PrivateRoute","Component","roles","rest","render","some","r","centered","leftSide","backgroundImage","heroImage","backgroundSize","backgroundPosition","rightSide","AuthLayout","Container","formRoot","checkbox","textAlign","setUserName","setPassword","setRememberMe","twoFactorTokenRequired","setTwoFactorTokenRequired","setTwoFactorToken","passwordResetRequired","setPasswordResetRequired","passwordReset","setPasswordReset","passwordResetConfirmation","setPasswordResetConfirmation","setPasswordRequirements","passwordErrors","setPasswordErrors","submitting","setSubmitting","warningText","setWarningText","handleSubmit","checked","buildTwoFactorTextField","buildPasswordResetForm","helperText","Fragment","onBlur","checkPasswordIsValid","pwordReqResponse","BridgeImage","SentiniLogo","autoComplete","FormControlLabel","control","Checkbox","href","Logout","redirect","parse","search","gapi","load","auth2","client_id","isSignedIn","signOut","ClearNotifs","propTypes","PropTypes","FileController","getUsersFiles","uploadFile","SpacedDivider","media","setFile","imageUrls","setImageUrls","fetchUserImages","urls","handleFile","Input","FormHelperText","CardMedia","fitImage","actions","popover","textTransform","fontWeight","SearchCard","imagePromise","imageGetter","isInScreen","setIsInScreen","loadedImage","setLoadedImage","setAnchorEl","ref","useRef","isVisible","isIntersecting","setIntersecting","observer","useMemo","IntersectionObserver","entry","observe","current","disconnect","useOnScreen","saveImage","loadImage","handleClose","imageSrc","CardActionArea","NoImage","MoreVert","Popover","anchorOrigin","vertical","horizontal","transformOrigin","AdminController","banUser","unBanUser","ItemImage","readers","clearUploadUrls","getUploadUrls","readUploadUrls","callback","reader","FileReader","onload","readAsDataURL","phoneInput","UsersAddEdit","user","isMe","isUserAdmin","onDone","userCompanyRole","setEmail","setSecondaryEmail","forename","setForename","surname","setSurname","setPhoneNumber","group","setGroup","groupsSrc","setGroupsSrc","ranks","setRanks","setCompanyRole","shipsSrc","setShipsSrc","setRestPeriodsEnabled","setCanGenerateNFCTags","setRank","removeImage","setRemoveImage","updateState","forceUpdate","userExists","inviteExists","isHeadOfDepartment","ship","loadRanks","realCompanyRole","testPhoneNumber","parsePhoneNumber","formatInternational","addResponse","find","shipRoleId","editResponse","removeResponse","phoneTest","isValid","companyRoleId","sm","md","country","Select","labelId","v","handleSelectShipRole","inputProps","accept","getImage","assessmentIds","iconIndex","cronScheduling","end","allQuestions","questionCount","scoreRequirement","numPrevTestsToAccount","questions","complianceTestLevels","complianceModel","ComplianceController","getUserComplianceTests","getComplianceTests","getComplianceTestsById","getComplianceTest","getComplianceTestCategories","addComplianceTest","editComplianceTest","getCompanyComplianceResults","getShipComplianceResults","getUserComplianceResults","getComplianceResults","getQuestionOverview","getAssessmentOverview","getUserGroupsOverview","complianceTestIds","model","testLevelIds","UserComplianceTestLevelController","getUserComplianceTestLevels","editUserComplianceTestLevels","listItem","borderBottom","border","UsersAssessmentLevels","complianceTests","setComplianceTests","loadUserComplianceTests","assessments","loadComplianceTestLevels","newComplianceTests","userLevel","l","complianceTestId","level","testLevelId","userTestLevel","levelIndex","userTestLevelId","saveUserComplianceTestLevels","complianceIds","newArray","handleChangeUserTestLevel","UserRestPeriod","restPeriodDates","setRestPeriodDates","selectedDate","setSelectedDate","documentDate","setDocumentDate","setDocumentLink","loadRestPeriods","dates","link","generateDocument","Blob","base64","binaryString","atob","binaryLen","bytes","Uint8Array","ascii","charCodeAt","base64ToArrayBuffer","URL","createObjectURL","rel","download","MassRestPeriod","selectedShip","setSelectedShip","users","setUsers","selectedUsers","setSelectedUsers","monthSelect","setMonthSelect","yearSelect","setYearSelect","now","userResponse","loadUsers","toISOString","testDate","years","GenerateYears","animation","Skeleton","table","uploadArea","UploadUsers","onSave","groups","setGroups","warnings","setWarnings","handleCreateMagicLinks","failedUsers","failedUserWarnings","getUserData","validPhoneNumber","userKey","val","setUserData","arrUser","arrIndex","tsvData","lines","split","currentLine","j","tsvJson","htmlFor","onloadend","readAsText","userTable","TableContainer","Table","TableHead","TableRow","TableCell","TableBody","colSpan","errorDialog","wrapper","topArea","userInfoCards","flexWrap","marginRight","fieldWrapper","borderTopRightRadius","buttonWrapper","transition","borderLeft","cursor","palette","divider","UsersStore","Users","nameQuery","userGroupQuery","userGroup","nameSearch","setNameSearch","prevNameSearch","setPrevNameSearch","shipSearch","setShipSearch","prevShipSearch","setPrevShipSearch","showDisabled","setShowDisabled","showListView","setShowListView","showUploadTsv","setShowUploadTsv","deleteUserRef","setDeleteUserRef","removeLinkRef","setRemoveLinkRef","resendLinkRef","setResendLinkRef","enableUserRef","setEnableUserRef","addEditUserRef","setAddEditUserRef","assessmentUserRef","setAssessmentUserRef","restPeriodUserRef","setRestPeriodUserRef","showMassRestPeriodExport","setShowMassRestPeriodExport","popoverIndex","setPopoverIndex","orderRow","setOrderRow","orderDirection","setOrderDirection","userIsAdmin","userIsCaptain","loadUserProfilePic","imgResponse","authedUserResponse","invitedUserResponse","toLowerCase","s","sort","showList","localStorage","getItem","handleClosePopover","handelSortChange","newSort","generateQueryString","handleChangeOnLeaveStatus","handleFilterUsers","newUsers","handleToggleUserEnabled","userIsBanned","handleUnBanUser","handleBanUser","buildMenuItems","isInvite","getDefaultSortValue","Add","GetApp","lg","onKeyDown","marginLeft","Switch","setItem","stickyHeader","TableSortLabel","active","buildUserRow","u","buildUser","handleResendMagicLink","handleRemoveMagicLink","handleDeleteUser","appRoles","setAppRoles","companyRoles","setCompanyRoles","setShipRoles","hideEmailButton","setHideEmailButton","emailConfirmed","setEmailConfirmed","hasTwoFactorAuth","setHasTwoFactorAuth","joined","setJoined","emailConfirmationSent","setEmailConfirmationSent","requestNewEmailConfirmation","buildListItem","secondary","dense","ListItemAvatar","cachedInfoResponse","userInfoResponse","hasTwoFactor","rolesDisplay","allRoles","getRoleName","buildRolesDisplay","emailSent","buildEmailRequestLink","setCurrentPassword","setNewPassword","setNewPasswordConfirmation","completed","setCompleted","EmailConfirm","setSuccess","emailCode","newEmail","setNewEmail","showSuccess","setShowSuccess","requestEmailChange","buildTitle","confirmEmailChange","setEmailSent","setPasswordConfirmation","showWarning","setShowWarning","twoFactorAuthSetup","setTwoFactorAuthSetup","twoFactorAuthToken","setTwoFactorAuthToken","twoFactorAuthRecovery","setTwoFactorAuthRecovery","fetchUserData","authCode","secret64","subheader","lineBreak","authQrCode","bgColor","fgColor","qrCode","buildAuthQRCode","setCode","verifying","setVerifying","NotFound","notifications","setNotifications","setPage","moreToFind","setMoreToFind","fetchNotifications","square","chartLineStyle","chartLegendStyle","trendline","strokeDasharray","tooltip","borderTopColor","tooltipHideValue","background","borderColor","series","stroke","zoomLevels","range","interval","DashboardGraph","labels","legend","scatterGraph","zoomLevel","setZoomLevel","getDataValueFromDate","subtract","dateRange","setDateRange","cache","setCache","rendering","setRendering","cleanupTooltips","tooltips","getElementsByClassName","removeAttribute","handleOffsetDateRange","steps","getDateFromDataValue","handleZoom","step","desiredZoom","unix","getDateRangeLabels","out","date","isBefore","newCache","JSON","stringify","scatterGraphData","x","y","parseFloat","trend","calcY","showGrid","plugins","chartist","class","anchorToPoint","appendToBody","legendNames","scatter","showLine","showPoint","axisY","labelInterpolationFnc","low","high","axisX","FixedScaleAxis","ticks","ButtonGroup","ArrowLeft","ZoomIn","ZoomOut","ArrowRight","topRowCard","whiteSpace","overflow","textOverflow","borderTopLeftRadius","objectPosition","pointerEvents","flex","questionItem","attemptItem","skeleton","DashboardViewState","DashboardStore","Dashboard","setCompanyCompliance","setShipCompliance","setUserCompliance","setAssessmentCompliance","setShipUsers","clearStore","queryStringValue","shipName","assessmentName","companyCompliance","assessmentCompliance","shipCompliance","userCompliance","shipUsers","selectedAttempt","setSelectedAttempt","shipsLoading","setShipsLoading","complianceLoading","setComplianceLoading","userGroupsLoading","setUserGroupsLoading","usersLoading","setUsersLoading","lastQuery","setLastQuery","viewState","isUser","isAssessment","compliance","getCompliance","loadPeripheralUserGroupData","complianceData","userGroupsBest","userGroupsWorst","userGroupsCache","loadPeripheralShipData","shipAverages","prevShips","prevShip","el","logoPath","shipsCache","loadPeripheralUserData","userAverages","prevShipUsers","prevShipUser","usersCache","loadPeripheralData","loadAllCompliance","companyComplianceCache","loadShipCompliance","newShipCompliance","shipComplianceCache","loadUserCompliance","newUserCompliance","userComplianceCache","loadAssessmentCompliance","getAssessmentAttempt","formatGraphValues","graphValues","replaceNullsWithZeroes","reverse","userGroupeValues","missingValue","base","Math","round","getTitle","buildTopRowCard","leftOrSingleData","rightData","singleColumn","trendingUp","renderItem","ButtonBase","TrendingUp","TrendingDown","buildImageItem","isShip","avgCorrectAnswers","imgUrl","cacheComplete","questionsWorst","incorrectlyAnswered","totalAnswered","assessmentWorst","correctionPercentage","assessmentBest","c","questionsLabels","questionsSeries","questionsLegend","answersLabels","answersSeries","answersLegend","scoreLabels","scoreSeries","scoreLegend","assessmentGraphData","formatted","slice","scoresGraphData","meta","totalScore","taken","buildGraphs","mappedAttempts","buildAssessmentAttempts","getListTitle","buildListTitleLoadingSpinner","entries","compianceResults","hasResults","questionsAnswers","assessment","averageScore","lastAttempt","totalAttempts","buildAssessmentItem","correctAnswers","compianceTestId","attempts","attempt","question","userAnswer","correctAnswer","correct","skipped","Done","Close","toString","buildQuestionItem","selectedAnswers","answers","isCorrect","buildListItems","iconBtn","SearchCardMini","UsersGroupsAddEdit","onError","setName","setScored","userGroupExists","deleteRef","setDeleteRef","addEditRef","setAddEditRef","buildUserGroup","handleDeleteUserGroup","FleetAddEdit","setImo","setPortOfRegistry","shipExists","FleetStore","Fleet","buildShip","handleDeleteShip","CompanyAddEdit","company","setScoreFrom","inputValue","setInputValue","isEditing","libInstance","utils","MomentUtils","clearable","autoOk","showTodayButton","inputVariant","companies","setCompanies","loadCompanies","handleCompanySwitch","switchResponse","buildCompany","handleViewCompanyResults","frequency","serverity","questionAnswerImages","questionCatagoryIds","documentationItems","allowNFC","QuestionController","getCategories","addCategories","editCategories","removeCategories","addCategory","getQuestions","getAllQuestions","getQuestion","addQuestion","editQuestion","archiveQuestion","deleteQuestion","importFromExcel","slider","answerRow","addRemoveWrapper","chip","questionsContainer","imageAnswer","imageAnswerWrapper","defaultAnswer","imageUrl","ComplianceAddEditQuestion","categoriesArray","shipsArray","categoryOptions","setCategoryOptions","questionCategories","setQuestionCategories","selectedDocs","setSelectedDocs","setContent","questionNote","setQuestionNote","setSeverity","startSeverity","setStartSeverity","setFrequency","startFrequency","setStartFrequency","setAnswers","answerImages","setAnswerImages","setAllowNFC","showPickDocument","setShowPickDocument","showAddCategory","setShowAddCategory","categoryName","setCategoryName","selectPageId","setSelectPageId","pageNumber","setPageNumber","questionExists","loadQuestion","category","categoryIds","handleSave","documentId","pageNum","handleAddCategory","isNaN","parseInt","handleUpdatePageNum","handleAddAnswer","newAnswers","handleRemoveAnswer","pop","avatar","onDelete","d","localeCompare","groupBy","Slider","valueLabelDisplay","onChangeCommitted","min","max","scale","newTitle","newImageIndex","noEntry","imageIndex","handleChangeAnswerImage","Clear","Remove","borderTop","ComplianceSelector","leftTitle","leftSubtitle","leftChildren","rightTitle","rightSubtitle","rightChildren","onSelectAllLeft","onSelectAllRight","onMoveLeft","onMoveRight","emptyRightMessage","AllInclusive","getCustomIcon","iconType","Place","MenuBook","LocalHospital","Directions","selection","mandatoryCheckbox","recurrenceArea","testLevel","iconWrapper","levelContainer","ComplianceAddEditAssessment","usersArray","questionsArray","userGroupsArray","categories","errorText","setErrorText","setStep","questionFrequencies","setQuestionFrequencies","questionSelections","setQuestionSelections","userSelections","setUserSelections","userGroupSelections","setUserGroupSelections","shipSelections","setShipSelections","questionsToAsk","setQuestionsToAsk","questionSearch","setQuestionSearch","userSearch","setUserSearch","groupSearch","setGroupSearch","repeatSelect","setRepeatSelect","endSelect","setEndSelect","setStartDate","endDate","setEndDate","mandatory","setMandatory","setIconIndex","setCategoryId","loadAssessment","setLoadAssessment","setComplianceTestLevels","testLevelCrons","setTestLevelCrons","selectedQuestions","neverDate","assessmentExists","cacheFrequencies","loadCron","splitCron","minutes","hours","minute","hour","startTime","isSame","endTime","loadAssessmentLevelCrons","cron","repeatPatternDate","repeatPatternMonth","repeatPatternWeekDay","loadAssessmentData","assessmentCrons","baselineLevel","numQuestions","testLevelCron","baseCron","handleUpdateNewComplianceTestLevels","newTestLevels","filterQuestion","join","filterUser","filterUserGroup","filterShip","handleToggleCheckedQuestion","handleSelectQuestions","handleUpdateFrequency","handleToggleCheckedUser","handleSelectUsers","handleToggleCheckedUserGroup","groupId","handleSelectUserGroups","handleToggleCheckedShip","handleSelectShips","handleGenerateTestLevelCrons","handleAssessmentLevelCronInputs","assessmentLevelIndex","pattern","handleAddNewAssessmentLevel","newAssessmentLevel","handleChangeAssessmentLevelPosition","newIndex","newComplianceTestLevels","newTestLevelCrons","t","generatedCron","selectedUserIds","assessmentResponse","buildQuestionSelection","showFrequencySlider","defaultFrequency","isArchived","buildSimpleSelection","buildMonthlySelectItems","monthlyItems","totalSelectedShips","totalUnselectedShips","unselectedShips","buildPageOne","totalSelected","unselectedQuestions","selectedItems","unselectedItems","buildPageTwo","usersMsg","shipOnlyUsers","totalSelectedUsers","totalUnselectedUsers","unselectedUsers","totalSelectedUserGroups","totalUnselectedUserGroups","unselectedUserGroups","userGroupMsg","xl","buildPageThree","isError","labelPlacement","assessmentLevel","isBaseline","isInvalidQuestionCount","isInvalidScorePercent","handleDeleteAssessmentLevel","disableUnderline","buildAssessmentLevelRepeatPatten","buildComplianceTestLevelEditor","buildPageFour","categoryList","buildCategoryList","RadioGroup","row","Radio","DateTimePicker","openTo","InputProps","buildDialogContent","assessmentItem","ComplianceAssessmentCard","totalQuestions","userCount","shipCount","popoverId","cats","getUniqueCategories","today","workingDate","isAfter","currentDate","toDate","iterator","next","parser","parseExpression","getNextDueDate","ComplianceQuestionCard","QuestionTagExport","tagAmount","setTagAmount","selectedAssessments","setSelectedAssessments","generatedCSV","setGeneratedCSV","csvRows","assessmentNFCQuestions","k","answer","valueAsNumber","searchWrapper","categoryWrapper","shipSelectArea","QuestionsPane","questionCategory","questionShip","setArchiveQuestionRef","setAddEditQuestionRef","setShowExcelModal","setShowQuestionExport","handelDelete","onChangePage","sortedQuestions","totalPages","ceil","grower","Pagination","count","setQuestionCategory","questionPage","setQuestionPage","assessmentSearch","setAssessmentSearch","assessmentCategory","setAssessmentCategory","assessmentPage","setAssessmentPage","addEditQuestionRef","archiveQuestionRef","setArchvieQuestionRef","addEditAssessmentRef","setAddEditAssessmentRef","duplicateAssessmentRef","setDuplicateAssessmentRef","setQuestions","setAssessments","setCategories","excelFile","setExcelFile","selectedExcelShips","setSelectedExcelShips","showExcelModal","showQuestionExport","selectedShipId","sortedAssessments","linkedCatagories","linkedShips","totalAssessmentPages","loadQuestionCategories","loadQuestions","loadAssessments","testsResponse","detailResponse","assessmentDetail","loadCategories","handleArchiveQuestion","tryDeletion","idOveride","handleDuplicateAssessment","handleCloseExcelDialog","addedUserId","canEdit","handleEditAssessment","all","Box","newAssessment","handleImportExcel","CategorysAddEdit","categoryExists","setCategory","loadCategory","buildCategory","handleDeleteCategory","edited","storeLink","acceptsTerms","setAcceptsTerms","completeRegistration","setCompleteRegistration","AppStore","GooglePlay","NoAccess","loadAllQuestions","tableRow","mainCells","mainCellLength","childTitle","childContent","setOpen","Collapse","in","timeout","unmountOnExit","card","loadQuestionOverview","idDescendingComparator","Number","buildQuestionRow","correctlyAnswered","userGroupePerformance","Exposure","comparator","order","getComparator","buildRows","loadAssessmentOverview","totalMissed","userGroupStats","setUserGroupStats","loadUserGroupOverview","titleDescendingComparator","buildAssessmentRow","App","initTokenStore","warn","this","exact","Register","Login","UsersGroups","Company","Compliance","QuestionsPlainText","ComplianceCategory","OverviewQuestions","OverviewAssessments","OverviewUserGroups","NotificationList","FileManager","Profile","PasswordChange","EmailChange","EmailChangeConfirm","PasswordForgot","PasswordReset","TwoFactorManager","TwoFactorVerify","isLocalhost","hostname","match","registerValidSW","swUrl","config","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","AUTH_INITIAL_STATE","action","assign","NOTIFS_INITIAL_STATE","markedAsRead","assessmentComplianceCache","DASHBOARD_INITIAL_STATE","DASHBOARD_CLEAR_STATE","FLEET_INITIAL_STATE","USERS_INITIAL_STATE","createBrowserHistory","store","preloadedState","createStore","combineReducers","router","connectRouter","compose","applyMiddleware","routerMiddleware","configureStore","rootElement","createMuiTheme","typography","fontFamily","fontWeightLight","fontWeightRegular","fontWeightMedium","allVariants","body1","body2","main","contrastText","danger","MuiButton","disableElevation","ReactDOM","process","origin","addEventListener","indexOf","ready","checkValidServiceWorker","registerServiceWorker"],"mappings":"2FAAAA,EAAOC,QAAU,09F,kBCAjBD,EAAOC,QAAU,sxJ,u6CCSbC,E,oHCLSC,EAAY,iDAGZC,EAAWD,EAAY,QAEvBE,EAAa,kEAEbC,EAAS,uFAETC,EAEc,4BAFdA,EAGF,aAHEA,EAIa,8BAJbA,EAMD,cANCA,EASW,yBATXA,EAUQ,sBAVRA,EAWO,qBAXPA,EAYQ,sBAZRA,EAaM,oBAbNA,EAgBmB,gCAhBnBA,EAiBc,sBAjBdA,EAmBW,4BAnBXA,EAoBO,yBApBPA,EAqBU,4BArBVA,EAsBG,iBAtBHA,EAwBU,uBAxBVA,EAyBC,eAzBDA,EA0BE,gBA1BFA,EA2BM,oBA3BNA,EA4BC,gBA5BDA,EA6BI,kBA7BJA,EA8BU,wBA9BVA,EA+BQ,sBA/BRA,EAgCY,yBAhCZA,EAiCU,uBAjCVA,EAkCU,uBAlCVA,EAmCA,cAnCAA,EAoCE,aApCFA,EAqCU,uBArCVA,EAsCH,OAtCGA,EAyCU,SAAAC,GAAS,wBAAeA,EAAf,sBAzCnBD,EA0CmB,SAAAC,GAAS,wBAAeA,EAAf,8BA1C5BD,GA2CgB,SAAAC,GAAS,wBAAeA,EAAf,kCA3CzBD,GA4Ca,SAACC,EAAWC,GAAZ,wBAAkCD,EAAlC,6CAAgFC,IA5C7FF,GA6CmB,SAACC,EAAWE,GAAZ,wBAAoCF,EAApC,oDAAyFE,IA7C5GH,GA8CE,SAAAC,GAAS,wBAAeA,EAAf,sBA9CXD,GA+CmB,SAACC,EAAWC,GAAZ,wBAAkCD,EAAlC,8CAAiFC,IA/CpGF,GAgDsB,SAAAC,GAAS,wBAAeA,EAAf,mCAhD/BD,GAiDsB,SAAAC,GAAS,wBAAeA,EAAf,uCAjD/BD,GAkDgB,SAAAC,GAAS,wBAAeA,EAAf,8BAlDzBD,GAmDM,SAAAC,GAAS,wBAAeA,EAAf,0BAnDfD,GAoDI,SAAAC,GAAS,wBAAeA,EAAf,wBApDbD,GAqDO,SAAAC,GAAS,wBAAeA,EAAf,2BArDhBD,GAsDS,SAAAC,GAAS,wBAAeA,EAAf,4BAtDlBD,GAuDO,SAAAC,GAAS,wBAAeA,EAAf,2BAvDhBD,GA0DQ,SAAAC,GAAS,wBAAeA,EAAf,eA1DjBD,GA2DO,SAAAC,GAAS,wBAAeA,EAAf,mBA3DhBD,GA4DQ,SAAAC,GAAS,wBAAeA,EAAf,oBA5DjBD,GA6DU,SAAAC,GAAS,wBAAeA,EAAf,uBA7DnBD,GAgEE,SAAAC,GAAS,wBAAeA,EAAf,UAhEXD,GAiEE,SAACC,EAAWG,GAAZ,wBAAkCH,EAAlC,0BAA6DG,IAjE/DJ,GAkEC,SAAAC,GAAS,wBAAeA,EAAf,cAlEVD,GAmEI,SAAAC,GAAS,wBAAeA,EAAf,iBAnEbD,GAoEI,SAACC,EAAWG,GAAZ,wBAAkCH,EAAlC,wBAA2DG,IApE/DJ,GAqEO,SAACC,EAAWG,GAAZ,wBAAkCH,EAAlC,0BAA6DG,IArEpEJ,GAsES,SAAAC,GAAS,wBAAeA,EAAf,wBAtElBD,GAuEU,SAAAC,GAAS,wBAAeA,EAAf,0BAvEnBD,GAwEc,SAAAC,GAAS,wBAAeA,EAAf,6BAxEvBD,GA2EoB,SAAAC,GAAS,wBAAeA,EAAf,4CA3E7BD,GA4EsB,SAACC,EAAWI,GAAZ,wBAAsCJ,EAAtC,qDAA4FI,IA5ElHL,GA6EkB,SAACC,EAAWI,EAAYC,GAAxB,wBAA8CL,EAA9C,iDAAgGI,EAAhG,YAA8GC,IA7EhIN,GA8EQ,SAAAC,GAAS,wBAAeA,EAAf,kCA9EjBD,GA+EM,SAAAC,GAAS,wBAAeA,EAAf,gCA/EfD,GAgFQ,SAACC,EAAWI,GAAZ,wBAAsCJ,EAAtC,yCAAgFI,IAhFxFL,GAiFK,SAAAC,GAAS,wBAAeA,EAAf,2BAjFdD,GAkFQ,SAAAC,GAAS,wBAAeA,EAAf,8BAlFjBD,GAmFW,SAAAC,GAAS,wBAAeA,EAAf,gCAnFpBD,GAoFc,SAAAC,GAAS,wBAAeA,EAAf,mCApFvBD,GAqFmB,SAAAC,GAAS,wBAAeA,EAAf,4CArF5BD,GAsFU,SAAAC,GAAS,wBAAeA,EAAf,mCAtFnBD,GAuFW,SAAAC,GAAS,wBAAeA,EAAf,oCAvFpBD,GAwFa,SAACC,EAAWK,GAAZ,wBAAkCL,EAAlC,6CAAgFK,IAxF7FN,GAyFa,SAAAC,GAAS,wBAAeA,EAAf,sCAzFtBD,GA0Fa,SAAAC,GAAS,wBAAeA,EAAf,sCA1FtBD,GA6FgB,SAAAC,GAAS,wBAAeA,EAAf,mCA7FzBD,GA8FgB,SAAAC,GAAS,wBAAeA,EAAf,kCA9FzBD,GA+FiB,SAAAC,GAAS,wBAAeA,EAAf,mCA/F1BD,GAgGmB,SAACC,EAAWM,GAAZ,wBAA8BN,EAA9B,4CAA2EM,IAhG9FP,GAiGc,SAAAC,GAAS,wBAAeA,EAAf,kCAjGvBD,GAoGc,SAAAC,GAAS,wBAAeA,EAAf,kCApGvBD,GAqGU,SAAAC,GAAS,wBAAeA,EAAf,8BArGnBD,GAsGK,SAACC,EAAWO,GAAZ,wBAAsCP,EAAtC,iCAAwEO,IAtG7ER,GAyGK,SAAAC,GAAS,wBAAeA,EAAf,0BAzGdD,GA0GM,SAAAC,GAAS,wBAAeA,EAAf,2BA1GfD,GA2GS,SAACC,EAAWO,GAAZ,wBAAsCP,EAAtC,qCAA4EO,IA3GrFR,GA4GQ,SAACC,EAAWO,GAAZ,wBAAsCP,EAAtC,oCAA2EO,IA5GnFR,GA6GU,SAAAC,GAAS,wBAAeA,EAAf,8BA7GnBD,GAgHkB,SAACC,EAAWC,GAAZ,wBAAkCD,EAAlC,kDAAqFC,IAhHvGF,GAiHuB,SAAAC,GAAS,wBAAeA,EAAf,gDAjHhCD,GAkHa,SAAAC,GAAS,wBAAeA,EAAf,+CAlHtBD,GAmHsB,SAAAC,GAAS,wBAAeA,EAAf,uCAnH/BD,GAoHY,SAACC,EAAWQ,GAAZ,wBAAwCR,EAAxC,6CAAsFQ,IApHlGT,GAqHY,SAAAC,GAAS,wBAAeA,EAAf,sCArHrBD,GAsHa,SAAAC,GAAS,wBAAeA,EAAf,uCAtHtBD,GAuHwB,SAAAC,GAAS,wBAAeA,EAAf,iDAvHjCD,GAwHqB,SAACC,EAAWG,GAAZ,wBAAkCH,EAAlC,qDAAwFG,IAxH7GJ,GAyHqB,SAACC,EAAWC,GAAZ,wBAAkCD,EAAlC,sDAAyFC,IAzH9GF,GA0HU,SAACC,EAAWC,EAAQQ,GAApB,wBAAgDT,EAAhD,iDAAkGC,EAAlG,YAA4GQ,IA1HtHV,GA2HU,SAACC,GAAD,IAAYG,EAAZ,uDAAqB,KAAMF,EAA3B,uDAAoC,KAApC,wBACJD,EADI,4CACoD,OAAXG,EAAA,iBAA4BA,GAA5B,OAAgD,OAAXF,EAAkB,IAAM,IAAO,IAD7G,OAC6H,OAAXA,EAAA,iBAA4BA,GAAW,KA5HnKF,GA6HY,SAACC,GAAD,IAAYG,EAAZ,uDAAqB,KAArB,wBAAyCH,EAAzC,8CAAmG,OAAXG,EAAA,iBAA4BA,GAAW,KA7H3IJ,GA8Ha,SAACC,GAAD,IAAYG,EAAZ,uDAAqB,KAArB,wBAAyCH,EAAzC,+CAAoG,OAAXG,EAAA,iBAA4BA,GAAW,KA9H7IJ,GAiIe,+BAjIfA,GAkIO,uBAlIPA,GAmIO,uBAnIPA,GAoIW,4BApIXA,GAqIgB,8BArIhBA,GAwII,cAxIJA,GAyIO,qBAzIPA,GA4Ie,wBA5IfA,GA+II,UA/IJA,GAkJwB,8BAlJxBA,GAmJyB,+BAGzBW,GAAc,CACvBC,cAAehB,EAAY,0BAGlBiB,GACF,QAGEC,GACG,aADHA,GAEF,QAGEC,GAAe,CACxB,CAAEC,KAAM,cAAeT,GAAIO,IAC3B,CAAEE,KAAM,iBAAkBT,GAAIO,KAGrBG,GACA,UADAA,GAEG,aAFHA,GAGF,QAGEC,GAAY,CACrB,CAAEF,KAAM,UAAWT,GAAIU,IACvB,CAAED,KAAM,cAAeT,GAAIU,IAC3B,CAAED,KAAM,iBAAkBT,GAAIU,KAGrBE,GACD,SADCA,GAEH,ODjMGC,GAAY,CACrBC,K,4CACAC,I,+CACAC,O,6CACAC,M,8CAIAC,IAAe,EACbC,GAAS,sCAGTC,GAAe,iBAAM,cAAeC,Q,8CAE1C,sBAAAC,EAAA,+EACW,IAAIC,SAAQ,SAAAC,GACf,GAAKJ,GAAL,CAIA,IAAMK,EAAUC,UAAUC,KAAKR,GAVrB,GAWVM,EAAQG,QAAU,kBAAMJ,EAAQK,IAAiB,EAAM,iCACvDJ,EAAQK,UAAY,SAAAC,GAChB3C,EAAK2C,EAAMC,OAAOC,OAClBT,EAAQU,OAEZT,EAAQU,gBAAkB,SAAAJ,GACXA,EAAMC,OAAOC,OACJG,kBAAkB,YAAa,CAAEC,QAAS,SACrDC,YAAY,UAAW,UAAW,CAAEC,QAAQ,UAZrDf,EAAQK,IAAiB,EAAM,kCAcpCW,MAAK,SAAAC,GACJ,OAAOZ,GAAiBY,EAAOC,SAAUD,EAAOE,UAlBxD,4C,+BAsBeT,K,8EAAf,sBAAAZ,EAAA,+EACW,IAAIC,SAAQ,SAAAC,GACXoB,GAAkBxD,GAClBoC,EAAQK,IAAiB,EAAM,+CAGnCzC,EAAGwC,QAAU,SAAAG,GAAK,OAAIc,QAAQC,MAAM,mBAAqBf,EAAMC,OAAOe,YACtE7B,IAAe,EACfM,EAAQK,IAAiB,EAAO,WACjCW,MAAK,SAAAC,GACJ,OAAOZ,GAAiBY,EAAOC,SAAUD,EAAOE,UAVxD,4C,oEAcA,WAAmBlC,EAAMuC,GAAzB,SAAA1B,EAAA,+EACW,IAAIC,SAAQ,SAAAC,GACf,GAAKN,GAAL,CAIA,IAAM+B,EAAW,CAAExC,OAAMuC,WACnBvB,EAAUrC,EAAG8D,YAAY,YAAa,aAAaC,YAAY,aAAapC,IAAIkC,GACtFxB,EAAQK,UAAY,kBAAMN,EAAQK,IAAiB,EAAOoB,KAC1DxB,EAAQG,QAAU,kBAAMJ,EAAQK,IAAiB,EAAM,4BANnDL,EAAQK,IAAiB,EAAM,+DAOpCW,MAAK,SAAAC,GACJ,OAAOZ,GAAiBY,EAAOC,SAAUD,EAAOE,UAXxD,4C,oEAeA,WAAsBlC,GAAtB,SAAAa,EAAA,+EACW,IAAIC,SAAQ,SAAAC,GACf,GAAKN,GAAL,CAIA,IAAMO,EAAUrC,EAAG8D,YAAY,YAAa,aAAaC,YAAY,aAAaC,OAAO3C,GACzFgB,EAAQK,UAAY,kBAAMN,EAAQK,IAAiB,EAAOpB,KAC1DgB,EAAQG,QAAU,kBAAMJ,EAAQK,IAAiB,EAAM,+BALnDL,EAAQK,IAAiB,EAAM,iEAMpCW,MAAK,SAAAC,GACJ,OAAOZ,GAAiBY,EAAOC,SAAUD,EAAOE,UAVxD,4C,oEAcA,WAAqBlC,GAArB,SAAAa,EAAA,+EACW,IAAIC,SAAQ,SAAAC,GACf,GAAKN,GAAL,CAIA,IAAMO,EAAUrC,EAAG8D,YAAY,YAAa,aAAaC,YAAY,aAAaE,IAAI5C,GACtFgB,EAAQK,UAAY,SAAAC,GAAK,OAAIP,EAAQK,IAAiB,EAAOE,EAAMC,OAAOC,UAC1ER,EAAQG,QAAU,kBAAMJ,EAAQK,IAAiB,EAAM,8BALnDL,EAAQK,IAAiB,EAAM,gEAMpCW,MAAK,SAAAC,GACJ,OAAOZ,GAAiBY,EAAOC,SAAUD,EAAOE,UAVxD,4C,sBE7EA,IAIIW,IAAe,E,8CAEnB,WAAmCC,GAAnC,iCAAAjC,EAAA,0DACQgC,GADR,oDAIIA,IAAe,EAJnB,SAKmCC,QALnC,IAKmCA,OALnC,EAKmCA,EAAUC,QACpCZ,GADGa,EALZ,EAKYA,qBAC6D,SAAvBA,EANlD,iCAOsC5C,GAAUI,MAAM,gBAPtD,cAOcyC,EAPd,QAQ4BhB,WAChBG,QAAQc,IAAID,EAAgBf,MAC5BW,IAAe,GAV3B,UAYsCM,GAAeC,aAAf,UAA4BH,EAAgBf,YAA5C,aAA4B,EAAsBK,SAZxF,eAYcc,EAZd,QAa4BpB,WAChBG,QAAQC,MAAMgB,EAAgBnB,MAC9BW,IAAe,GAf3B,EAiBiDQ,EAAgBnB,KAAjDoB,EAjBhB,EAiBgBA,MAAOC,EAjBvB,EAiBuBA,QAASH,EAjBhC,EAiBgCA,aAjBhC,UAkBoCD,GAAeK,kBAAkBF,EAAOF,EAAcG,GAlB1F,SAkBcE,EAlBd,QAmB0BxB,WACdG,QAAQC,MAAMoB,EAAcvB,MAC5BW,IAAe,GArB3B,QAwBIA,IAAe,EAxBnB,6C,sBA2Bea,OAjCQ,CACnBC,oB,8CCHG,SAASxB,GAAkByB,GAC9B,OAAe,OAARA,QAAwBC,IAARD,EAGpB,SAASE,GAAcF,GAC1B,OAAe,OAARA,QAAwBC,IAARD,GAA6B,KAARA,EAGzC,SAASG,GAAQH,GACpB,OAAmC,IAA5BI,OAAOC,KAAKL,GAAKM,OAGrB,SAASC,GAAmBC,GAC/B,OAAOjC,GAAkBiC,IAAoC,IAAzBA,EAAOC,OAAOH,OAG/C,SAASI,KAAwB,IAAbC,EAAY,uDAAH,EAChC,OAAOA,GAAU,KAAOA,EAAS,IAG9B,SAASnD,KAA2D,IAA1Ca,EAAyC,wDAAvBC,EAAuB,uCAAjBY,EAAiB,uDAAN,KAIhE,OAHKX,GAAkBW,IACnBY,GAAeC,oBAAoBb,GAEhC,CAAEb,WAAUC,QAGhB,SAASsC,GAAcC,EAAsBC,GAChD,IAAMC,EAA0B,GAChC,GAAIxC,GAAkBsC,IAAyBtC,GAAkBuC,GAC7D,OAAOC,EAEX,IAAMC,EAAaC,MAAMC,KAAK,wEACxBC,EAAeF,MAAMC,KAAKJ,GA6BhC,OA5BAK,EAAaC,SAAQ,SAAAC,GACZL,EAAWM,SAASD,IACrBN,EAAwBQ,KAAK,+BAAiCF,EAAU,QAG5EF,EAAab,OAASO,EAAqBW,gBAC3CT,EAAwBQ,KAAK,6BAA+BV,EAAqBW,eAAiB,qBAE5D,IAAtCX,EAAqBY,eAChB,KAAKC,KAAKZ,IACXC,EAAwBQ,KAAK,sCAGS,IAA1CV,EAAqBc,mBAChB,QAAQD,KAAKZ,IACdC,EAAwBQ,KAAK,mDAGS,IAA1CV,EAAqBe,mBAChB,QAAQF,KAAKZ,IACdC,EAAwBQ,KAAK,mDAGe,IAAhDV,EAAqBgB,yBAChB,WAAWH,KAAKZ,IACjBC,EAAwBQ,KAAK,yDAG9BR,EAGJ,SAASe,GAAmBC,EAAWC,EAAUC,EAAOC,GAI3D,IAAK,IAAIC,KAAOF,EAAO,CACnB,IAAMG,EAAeH,EAAME,GAC3B,IAAI5D,GAAkB6D,GAGtB,GAAInB,MAAMoB,QAAQD,GACd,IAAK,IAAIE,EAAI,EAAGA,EAAIF,EAAa9B,OAAQgC,IACrCN,EAASO,OAAT,UAAmBR,EAAnB,YAAgCG,EAAhC,aAA0CC,EAA1C,aAAkDG,EAAlD,KAAwDF,EAAaE,SAIzEF,aAAwBI,KACxBR,EAASO,OAAT,UAAmBR,EAAnB,YAAgCG,EAAhC,aAA0CC,EAA1C,KAAkDD,GAGtDF,EAASO,OAAT,UAAmBR,EAAnB,YAAgCG,EAAhC,aAA0CC,EAA1C,KAAkDC,IAanD,SAASK,KAA4C,IAA1BC,EAAyB,uDAAjB,EAAGC,EAAc,uDAAH,EACpD,GAAIpE,GAAkBmE,GAClB,OAAO,KAEX,GAAiB,IAAbC,EACA,OAAQ,GAAGC,QAAQ,GAGvB,IAAMC,EAAaF,EAAW,IAC9B,OAAQD,EAAQG,GAAYD,QAAQ,GAGjC,SAASE,GAAkBC,GAC9B,GAAI/F,OAAOgG,QAAQC,aAAc,CAC7B,IAAIC,EAAM,UAAMlG,OAAOmG,SAASC,SAAtB,aAAmCpG,OAAOmG,SAASE,MAAnD,OAA0DrG,OAAOmG,SAASG,SAA1E,YAAsFP,GAChG/F,OAAOgG,QAAQC,aAAa,CAAEM,KAAML,GAAU,GAAIA,IAInD,SAASM,GAAqBvG,EAAGwG,EAAGC,GAA6B,IAAD,IAAnBC,EAAmB,uDAAJ,GACzDC,EAAK,UAAG3G,EAAEyG,UAAL,QAAiBC,EACtBE,EAAK,UAAGJ,EAAEC,UAAL,QAAiBC,EAC5B,OAAIE,EAAQD,GACA,EAERC,EAAQD,EACD,EAEJ,ECzHX,IAAMrE,GAAiB,CACnBuE,kBACAC,S,4CACAC,gB,4CACAxE,a,6CACAyE,kB,mDACAC,gB,mEACAC,c,mEACAC,gB,6CACAC,gB,6CACAC,M,iDACAC,uB,uDACAC,O,4CACAC,oB,4CACAC,wB,4CACAC,e,6CACAC,c,mDACAC,e,iDACAC,e,6CACAC,Q,4CACAC,S,4CACAC,yB,4CACAC,0B,+CACAC,Y,4CACAC,S,4CACAC,qB,4CACAC,a,+CACAC,gB,6CACAC,gB,6CACA5F,kB,iDACA6F,oB,4CACAC,gB,+CACAC,W,uDAGW7B,K,8EAAf,wCAAA7G,EAAA,6DAA8B2I,EAA9B,+BAA4C,KAA5C,SACiBpJ,GAAUI,MAAM,aACxBuB,MAAK,SAAAe,GACmC,IAAD,EAE7B,EAFP,OAAIX,GAAkBqH,GACX,CAAEzG,QAAS,CAAE0G,cAAe,qBAAY3G,EAASZ,YAArB,aAAY,EAAeK,WAEvD,CACHQ,QAAS,CACL,eAAgByG,EAChBC,cAAe,qBAAY3G,EAASZ,YAArB,aAAY,EAAeK,cAKzDmH,OAAM,WACH,OAAO,QAfnB,oF,oEAmBA,sBAAA7I,EAAA,sEACiBT,GAAUI,MAAM,aACxBuB,MAAK,SAAAe,GAAa,IAAD,EACd,iBAAOA,EAASZ,YAAhB,aAAO,EAAeK,WAEzBmH,OAAM,WACH,OAAO,QANnB,oF,oEAUA,sBAAA7I,EAAA,sEACiBT,GAAUI,MAAM,WACxBuB,MAAK,SAAAe,GACF,OAAO6G,IAAOC,IAAI9G,EAASZ,KAAKK,SAASsH,eAAeF,IAAOC,UAElEF,OAAM,WACH,OAAO,QANnB,oF,oEAUA,WAA4BtG,GAA5B,iBAAAvC,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,OAEUC,EAAe,CACjB3G,gBAHR,kBAKW4G,IAAMC,KAAKnL,EAAaE,EAAuB+K,EAAcD,GAC/D/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,OADtC,2CADH,uDAIFwH,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAV1C,4C,oEAcA,WAAiC/K,EAAUmE,EAAOoB,EAAUyF,GAA5D,eAAAtJ,EAAA,6DACUuJ,EAAW,CACbjL,WACAmE,QACAoB,WACAyF,cALR,kBAOWH,IAAMC,KAAKnL,EAAaE,EAA6BoL,GACvDrI,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,OADtC,2CADH,uDAIFwH,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAA+B/K,EAAUkL,EAAOC,EAAWC,EAAUC,EAAaC,EAAYC,EAAaC,EAAcC,EAAOC,EAAoBC,EAAoBC,GAAxK,+BAAAlK,EAAA,6DAA8KmK,EAA9K,kCAA+L,KAA/L,SAC8B7H,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,WAAYhH,GAC5ByG,EAASO,OAAO,iBAAkB6E,GAClCpF,EAASO,OAAO,QAASkE,GACzBzE,EAASO,OAAO,YAAamE,GAC7B1E,EAASO,OAAO,WAAYoE,GACR,OAAhBC,GACA5E,EAASO,OAAO,cAAeqE,GAEnC5E,EAASO,OAAO,aAAcsE,GAC9B7E,EAASO,OAAO,cAAeuE,GAC/B9E,EAASO,OAAO,eAAgBwE,GAChC/E,EAASO,OAAO,qBAAsB0E,GACtCjF,EAASO,OAAO,qBAAsB2E,GACtClF,EAASO,OAAO,OAAQ4E,GAExBH,EAAM5F,SAAQ,SAACkG,EAAGhF,GAAJ,OAAUR,GAAmB,QAASE,EAAUsF,EAAGhF,MAlBrE,kBAmBW8D,IAAMC,KAAKpL,EAAWG,EAA2B4G,EAAUkE,GAC7D/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAxB1C,6C,oEA4BA,WAA6B/K,EAAUkL,EAAOC,EAAWC,EAAUC,EAAaC,EAAYC,EAAaC,EAAcC,EAAOC,EAAoBC,EAAoBC,GAAtK,+BAAAlK,EAAA,6DAA4KmK,EAA5K,kCAA6L,KAA7L,SAC8B7H,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,WAAYhH,GAC5ByG,EAASO,OAAO,QAASkE,GACzBzE,EAASO,OAAO,iBAAkB6E,GAClCpF,EAASO,OAAO,YAAamE,GAC7B1E,EAASO,OAAO,WAAYoE,GACR,OAAhBC,GACA5E,EAASO,OAAO,cAAeqE,GAEnC5E,EAASO,OAAO,aAAcsE,GAC9B7E,EAASO,OAAO,cAAeuE,GAC/B9E,EAASO,OAAO,eAAgBwE,GAChC/E,EAASO,OAAO,qBAAsB0E,GACtCjF,EAASO,OAAO,qBAAsB2E,GACtClF,EAASO,OAAO,OAAQ4E,GAExBH,EAAM5F,SAAQ,SAACkG,EAAGhF,GAAJ,OAAUR,GAAmB,QAASE,EAAUsF,EAAGhF,MAlBrE,kBAmBW8D,IAAMC,KAAKpL,EAAWG,EAAyB4G,EAAUkE,GAC3D/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAxB1C,6C,oEA4BA,WAA+B/K,GAA/B,eAAA0B,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAX,oBAAoDmM,mBAAmBhM,IAAa2K,GAChG/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA+B/K,GAA/B,eAAA0B,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAX,oBAAoDmM,mBAAmBhM,IAAa2K,GAChG/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAqB/K,EAAUuF,EAAUyF,GAAzC,6BAAAtJ,EAAA,6DAAqDuK,EAArD,+BAAsE,KAC5DC,EAAa,CACflM,WACAuF,WACAyF,aACAiB,iBACAE,MAAOvM,GANf,kBAQWiL,IAAMC,KAAKnL,EAAaE,EAAeqM,GACzCtJ,KADE,uCACG,WAAMe,GAAN,iBAAAjC,EAAA,0DACEyD,GAAWxB,EAASyB,QADtB,iCAEQgH,KAFR,uBAG6BC,GAAU1I,EAASZ,KAAKoB,OAHrD,YAGQmI,EAHR,QAImBxJ,SAJnB,yCAKab,IAAiB,EAAM,4BALpC,cAOQsK,EAPR,2BAOwB5I,EAASZ,MAASuJ,EAAavJ,MAPvD,UAQeyJ,GAAcD,GAAU3J,MAAK,SAAA0B,GACtC,IAAMzB,EAASyB,EAAcxB,SAAWwB,EAAcvB,KAAOwJ,EAC7D,OAAOtK,GAAiBqC,EAAcxB,SAAUD,EAAQc,MAV9D,0EAaS1B,IAAiB,EAAM0B,EAASZ,OAbzC,4CADH,uDAiBFwH,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OA1B1C,4C,oEA8BA,WAAsC/K,EAAUuF,EAAUyF,EAAYiB,EAAgBQ,EAAaC,GAAnG,eAAAhL,EAAA,6DACUiL,EAAa,CACf3M,WACAuF,WACAyF,aACAiB,iBACAQ,cACAC,0BACAP,MAAOvM,GARf,kBAUWiL,IAAMC,KAAKnL,EAAaE,EAA8B8M,GACxD/J,KADE,uCACG,WAAMe,GAAN,eAAAjC,EAAA,0DACEyD,GAAWxB,EAASyB,QADtB,iCAE6BiH,GAAU1I,EAASZ,KAAKoB,OAFrD,YAEQmI,EAFR,QAGmBxJ,SAHnB,yCAIab,IAAiB,EAAM,4BAJpC,uBAMeuK,GAAc7I,EAASZ,MAAMH,MAAK,SAAA0B,GAC3C,IAAMzB,EAASyB,EAAcxB,SAAWwB,EAAcvB,KAAOY,EAASZ,KACtE,OAAOd,GAAiBqC,EAAcxB,SAAf,YAAC,eAA6BD,GAAWyJ,EAAavJ,MAAQY,MAR3F,yEAWS1B,IAAiB,EAAM0B,EAASZ,OAXzC,4CADH,uDAeFwH,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OA1B1C,4C,oEA8BA,8BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,gBAEgCyB,KAFhC,YAEUQ,EAFV,QAGsB9J,SAHtB,yCAIe8J,GAJf,gCAMW/B,IAAMC,KAAKnL,EAAaE,EAAgB,KAAM8K,GAChD/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO,KAAM0B,IADnC,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,oEAeA,4BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI9D,EAAaE,EAA+B8K,GACxD/H,MAAK,SAAAe,GACF,OAAKA,EAASZ,KAAK8J,OAEPlJ,EAASZ,KAGdd,IAAiB,EAAO0B,EAASZ,KAAMY,GAFnC1B,IAAiB,EAAM,gCAFvBA,IAAiB,EAAM,oDAMrCsI,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,sBAAArJ,EAAA,+EACWmJ,IAAMpH,IAAI9D,EAAaE,GACzB+C,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAN1C,4C,oEAUA,WAA8B/K,GAA9B,iBAAA0B,EAAA,6DACUoL,EAAc,CAAE9M,WAAUmM,MAAOvM,GAD3C,SAE8B2I,KAF9B,cAEUoC,EAFV,yBAGWE,IAAMC,KAAKnL,EAAaE,EAAyBiN,EAAanC,GAChE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO,KAAM0B,MAExC4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAR1C,4C,oEAYA,WAA6BhL,EAAQgN,EAAMxH,EAAUyH,GAArD,iBAAAtL,EAAA,6DACUiL,EAAa,CACf5M,SACAgN,OACAxH,WACAyH,wBALR,SAO8BzE,KAP9B,cAOUoC,EAPV,yBAQWE,IAAMC,KAAKnL,EAAaE,EAAwB8M,EAAYhC,GAC9D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO,KAAM0B,MAExC4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAb1C,4C,oEAiBA,WAA8BkC,EAAiBR,EAAaS,GAA5D,iBAAAxL,EAAA,6DACUyL,EAAc,CAChBF,kBACAR,cACAS,2BAJR,SAM8B3E,KAN9B,cAMUoC,EANV,yBAOWE,IAAMC,KAAKnL,EAAaE,EAAyBsN,EAAaxC,GAChE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO,KAAM0B,MAExC4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAA8B5G,GAA9B,eAAAzC,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,EAAqB,gBAAkBsE,EAAO,KAAMwG,GAC5E/H,MAAK,WAEF,OADAK,QAAQc,IAAI,0BACL,KAEVwG,OAAM,SAAAQ,GAEH,OADA9H,QAAQc,IAAI,8BAA+BgH,IACpC,MATnB,4C,oEAaA,4BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAkB8K,GACzC/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,4BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAmB8K,GAC1C/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,4BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMC,KAAKnL,EAAaE,EAAoC,KAAM8K,GACpE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAyChL,EAAQgN,GAAjD,eAAArL,EAAA,6DACUqB,EAAO,CAAEhD,SAAQgN,QAD3B,kBAEWlC,IAAMC,KAAKnL,EAAaE,EAA4BkD,GACtDH,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,4BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI9D,EAAaE,EAAuB8K,GAChD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,4BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI9D,EAAaE,EAA4B8K,GACrD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA4BqC,EAAQjJ,GAApC,iBAAAzC,EAAA,6DACU2L,EAAW,CAAED,SAAQjJ,SAD/B,SAE8BoE,KAF9B,cAEUoC,EAFV,yBAGWE,IAAMC,KAAKnL,EAAaE,EAAwBwN,EAAU1C,GAC5D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAR1C,4C,oEAYA,WAA+B5G,GAA/B,eAAAzC,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMC,KAAKnL,EAAaE,EAA2B,CAAEsE,SAASwG,GAChE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA+BkB,GAA/B,iBAAAvK,EAAA,6DACUqB,EAAO,CAAEkJ,kBADnB,SAE8B1D,KAF9B,cAEUoC,EAFV,yBAGWE,IAAMC,KAAKnL,EAAaE,EAA2BkD,EAAM4H,GAC3D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAR1C,4C,+BAaesB,G,iFAAf,WAAyBiB,GAAzB,SAAA5L,EAAA,+EACWmJ,IAAMpH,IAAI/D,EAAWG,EAAiB,CAAE+D,QAAS,CAAE0G,cAAe,UAAYgD,KAChF1K,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,sEACW6L,GAAc5J,EAASZ,MADlC,mFADH,uDAIFwH,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAN1C,4C,oEAUA,4BAAArJ,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAmB8K,GAC1C/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA+BhL,EAAQyN,GAAvC,iBAAA9L,EAAA,6DACUqB,EAAO,CAAEhD,SAAQyN,WAD3B,SAE8BjF,KAF9B,cAEUoC,EAFV,yBAGWE,IAAMC,KAAKnL,EAAaE,EAA2BkD,EAAM4H,GAC3D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAR1C,4C,oEAYA,WAA0BhL,GAA1B,eAAA2B,EAAA,sEAC8B6G,KAD9B,cACUoC,EADV,yBAEWE,IAAMrH,OAAN,UAAgB9D,EAAWG,EAA3B,YAA2CE,GAAU4K,GACvD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAiC5G,EAAOF,EAAcG,GAAtD,SAAA1C,EAAA,+EAEcT,GAAUG,OAAO,WAAWwB,MAAK,SAAAe,GACnC,GAAIA,EAASb,SACT,MAAMa,KAJtB,uBAOc1C,GAAUE,IAAI,UAAWiD,GAASxB,MAAK,SAAAe,GACzC,GAAIA,EAASb,SACT,MAAMa,KATtB,uBAYc1C,GAAUG,OAAO,aAAawB,MAAK,SAAAe,GACrC,GAAIA,EAASb,SACT,MAAMa,KAdtB,uBAiBc1C,GAAUE,IAAI,YAAagD,GAAOvB,MAAK,SAAAe,GACzC,GAAIA,EAASb,SACT,MAAMa,KAnBtB,wBAsBc1C,GAAUG,OAAO,gBAAgBwB,MAAK,SAAAe,GACxC,GAAIA,EAASb,SACT,MAAMa,KAxBtB,yBA2Bc1C,GAAUE,IAAI,eAAgB8C,GAAcrB,MAAK,SAAAe,GACnD,GAAIA,EAASb,SACT,MAAMa,KA7BtB,iCAgCe1B,IAAiB,EAAO,CAAEkC,QAAOC,aAhChD,2DAkCenC,IAAiB,EAAD,kCAAO,KAAGc,OAlCzC,2D,sBAsCO,SAAe0K,GAAtB,mC,8CAAO,WAA+B3N,GAA/B,SAAA4B,EAAA,+EAEOT,GAAUG,OAAO,aAAawB,MAAK,SAAAe,GACrC,GAAIA,EAASb,SACT,MAAMa,KAJf,uBAOO1C,GAAUE,IAAI,YAAarB,GAAW8C,MAAK,SAAAe,GAC7C,GAAIA,EAASb,SACT,MAAMa,KATf,gCAYQ1B,IAAiB,EAAOnC,IAZhC,yDAcQmC,IAAiB,EAAD,kCAAO,KAAGc,OAdlC,0D,+BAkBQwK,G,iFAAf,WAA6BG,GAA7B,mBAAAhM,EAAA,sEAEgB5B,EAAsC4N,EAAtC5N,UAAWyL,EAA2BmC,EAA3BnC,YAAaoC,EAAcD,EAAdC,UAFxC,SAGc1M,GAAUE,IAAI,YAAarB,GAAW8C,MAAK,SAAAe,GAC7C,GAAIA,EAASb,SACT,MAAMa,KALtB,uBAQc1C,GAAUE,IAAI,cAAeoK,GAAa3I,MAAK,SAAAe,GACjD,GAAIA,EAASb,SACT,MAAMa,KAVtB,uBAac1C,GAAUE,IAAI,YAAawM,GAAW/K,MAAK,SAAAe,GAC7C,GAAIA,EAASb,SACT,MAAMa,KAftB,gCAkBe1B,IAAiB,EAAOyL,IAlBvC,2DAoBezL,IAAiB,EAAD,kCAAO,KAAGc,OApBzC,2D,+BAwBeyJ,G,iFAAf,WAA6BD,GAA7B,yBAAA7K,EAAA,sEAEgB1B,EAAqDuM,EAArDvM,SAAU4N,EAA2CrB,EAA3CqB,KAAMzJ,EAAqCoI,EAArCpI,MAAOF,EAA8BsI,EAA9BtI,aAAcG,EAAgBmI,EAAhBnI,QAAShE,EAAOmM,EAAPnM,GAF9D,SAGca,GAAUE,IAAI,WAAYnB,GAAU4C,MAAK,SAAAe,GAC3C,GAAIA,EAASb,SACT,MAAMa,KALtB,uBAQc1C,GAAUE,IAAI,OAAQyM,GAAMhL,MAAK,SAAAe,GACnC,GAAIA,EAASb,SACT,MAAMa,KAVtB,uBAac1C,GAAUE,IAAI,UAAWiD,GAASxB,MAAK,SAAAe,GACzC,GAAIA,EAASb,SACT,MAAMa,KAftB,wBAkBc1C,GAAUE,IAAI,YAAagD,GAAOvB,MAAK,SAAAe,GACzC,GAAIA,EAASb,SACT,MAAMa,KApBtB,yBAuBc1C,GAAUE,IAAI,eAAgB8C,GAAcrB,MAAK,SAAAe,GACnD,GAAIA,EAASb,SACT,MAAMa,KAzBtB,yBA4Bc1C,GAAUE,IAAI,KAAMf,GAAIwC,MAAK,SAAAe,GAC/B,GAAIA,EAASb,SACT,MAAMa,KA9BtB,iCAiCe1B,IAAiB,EAAOsK,IAjCvC,2DAmCetK,IAAiB,EAAD,kCAAO,KAAGc,OAnCzC,2D,oEAuCA,4CAAArB,EAAA,+EAGcT,GAAUI,MAAM,YAAYuB,MAAK,SAAAe,GAAa,IAAD,EAC/C,GAAIA,EAASb,SACT,MAAMa,EAEV3D,EAAQ,UAAG2D,EAASZ,YAAZ,aAAG,EAAeK,WAPtC,uBAScnC,GAAUI,MAAM,QAAQuB,MAAK,SAAAe,GAAa,IAAD,EAC3C,GAAIA,EAASb,SACT,MAAMa,EAEViK,EAAI,UAAGjK,EAASZ,YAAZ,aAAG,EAAeK,WAblC,uBAecnC,GAAUI,MAAM,WAAWuB,MAAK,SAAAe,GAAa,IAAD,EAC9C,GAAIA,EAASb,SACT,MAAMa,EAEVS,EAAO,UAAGT,EAASZ,YAAZ,aAAG,EAAeK,WAnBrC,uBAqBcnC,GAAUI,MAAM,aAAauB,MAAK,SAAAe,GAAa,IAAD,EAChD,GAAIA,EAASb,SACT,MAAMa,EAEVQ,EAAK,UAAGR,EAASZ,YAAZ,aAAG,EAAeK,WAzBnC,wBA2BcnC,GAAUI,MAAM,gBAAgBuB,MAAK,SAAAe,GAAa,IAAD,EACnD,GAAIA,EAASb,SACT,MAAMa,EAEVM,EAAY,UAAGN,EAASZ,YAAZ,aAAG,EAAeK,WA/B1C,yBAiCcnC,GAAUI,MAAM,aAAauB,MAAK,SAAAe,GAAa,IAAD,EAChD,GAAIA,EAASb,SACT,MAAMa,EAEV7D,EAAS,UAAG6D,EAASZ,YAAZ,aAAG,EAAeK,WArCvC,yBAuCcnC,GAAUI,MAAM,eAAeuB,MAAK,SAAAe,GAAa,IAAD,EAClD,GAAIA,EAASb,SACT,MAAMa,EAEV4H,EAAW,UAAG5H,EAASZ,YAAZ,aAAG,EAAeK,WA3CzC,yBA6CcnC,GAAUI,MAAM,aAAauB,MAAK,SAAAe,GAAa,IAAD,EAChD,GAAIA,EAASb,SACT,MAAMa,EAEVgK,EAAS,UAAGhK,EAASZ,YAAZ,aAAG,EAAeK,WAjDvC,yBAmDcnC,GAAUI,MAAM,MAAMuB,MAAK,SAAAe,GAAa,IAAD,EACzC,GAAIA,EAASb,SACT,MAAMa,EAEVvD,EAAE,UAAGuD,EAASZ,YAAZ,aAAG,EAAeK,WAvDhC,iCAyDenB,IAAiB,EAAO,CAAEjC,WAAU4N,OAAMzJ,QAAOF,eAAcG,UAAStE,YAAWyL,cAAaoC,YAAWvN,QAzD1H,2DA2De6B,IAAiB,EAAD,kCAAO,KAAGc,OA3DzC,2D,+BA+DeqJ,K,8EAAf,sBAAA1K,EAAA,+EAEcT,GAAUG,OAAO,YAAYwB,MAAK,SAAAe,GACpC,GAAIA,EAASb,SACT,MAAMa,KAJtB,uBAOc1C,GAAUG,OAAO,QAAQwB,MAAK,SAAAe,GAChC,GAAIA,EAASb,SACT,MAAMa,KATtB,uBAYc1C,GAAUG,OAAO,WAAWwB,MAAK,SAAAe,GACnC,GAAIA,EAASb,SACT,MAAMa,KAdtB,uBAiBc1C,GAAUG,OAAO,gBAAgBwB,MAAK,SAAAe,GACxC,GAAIA,EAASb,SACT,MAAMa,KAnBtB,wBAsBc1C,GAAUG,OAAO,aAAawB,MAAK,SAAAe,GACrC,GAAIA,EAASb,SACT,MAAMa,KAxBtB,yBA2Bc1C,GAAUG,OAAO,aAAawB,MAAK,SAAAe,GACrC,GAAIA,EAASb,SACT,MAAMa,KA7BtB,yBAgCc1C,GAAUG,OAAO,eAAewB,MAAK,SAAAe,GACvC,GAAIA,EAASb,SACT,MAAMa,KAlCtB,yBAqCc1C,GAAUG,OAAO,aAAawB,MAAK,SAAAe,GACrC,GAAIA,EAASb,SACT,MAAMa,KAvCtB,yBA0Cc1C,GAAUG,OAAO,MAAMwB,MAAK,SAAAe,GAC9B,GAAIA,EAASb,SACT,MAAMa,KA5CtB,iCA+Ce1B,IAAiB,EAAO,OA/CvC,2DAiDeA,IAAiB,EAAD,kCAAO,KAAGc,OAjDzC,2D,sBAqDeiB,U,yUC3sBf,4BAAAtC,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAgC8K,GACvD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,4BAAArJ,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAwB8K,GAC/C/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,0CAAArJ,EAAA,6DAAsBmM,EAAtB,+BAA6B,EAA7B,SAC8B7J,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAX,gBAA6CgO,GAAQlD,GACjE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA0B3K,GAA1B,eAAAsB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAA6BO,EAAI,KAAMuK,GAC/D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,4BAAArJ,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAiC,KAAM8K,GAC/D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,sBAWe+C,OA/DiB,CAC5BC,e,4CACAC,O,4CACAC,O,4CACAC,W,6CACAC,c,sJCVSC,GACA,kBADAA,GAEI,gBAFJA,GAGE,oBAHFA,GAIC,UAJDA,GAKG,UALHA,GAMF,OANEA,GAOF,OAPEA,GAQJ,UARIA,GASA,UATAA,GAUF,UAVEA,GAWE,UAXFA,GAYC,qBAZDA,GAaD,sBAbCA,GAcF,sBAdEA,GAeC,U,kBCZDC,GAAeC,aAAW,CACnCC,KAAM,CACFC,MAAOJ,GACP,iBAAkB,CACdK,gBAAiBL,GACjBI,MAAOJ,GACP,UAAW,CACPK,gBAAiBL,GACjBI,MAAOJ,KAGf,UAAW,CACPK,gBAAiBL,GACjBI,MAAOJ,MAbSE,CAgBzBI,M,uDCFH,WAAwB5O,GAAxB,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAkBC,GAAY6K,GACrD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA2BjL,EAAWG,GAAtC,eAAAyB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAkBC,EAAWG,GAAS0K,GAC7D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAuBjL,EAAWe,EAAM8N,EAAKC,EAAgBC,GAA7D,iBAAAnN,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,OAAQnG,GACxB4F,EAASO,OAAO,MAAO2H,GACvBlI,EAASO,OAAO,iBAAkB4H,GAClCnI,EAASO,OAAO,OAAQ6H,GAN5B,kBAOWhE,IAAMC,KAAKpL,EAAWG,GAAiBC,GAAY2G,EAAUkE,GAC/D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAA0BjL,EAAWG,EAAQY,EAAM8N,EAAKC,EAAgBE,EAAaD,GAArF,iBAAAnN,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,OAAQnG,GACxB4F,EAASO,OAAO,MAAO2H,GACvBlI,EAASO,OAAO,iBAAkB4H,GAClCnI,EAASO,OAAO,OAAQ6H,GACxBpI,EAASO,OAAO,cAAe8H,GAC/BrI,EAASO,OAAO,KAAM/G,GAR1B,kBASW4K,IAAMC,KAAKpL,EAAWG,GAAoBC,GAAY2G,EAAUkE,GAClE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAd1C,6C,oEAkBA,WAA0BjL,EAAWG,GAArC,eAAAyB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAoBC,EAAWG,GAAS,KAAM0K,GACtE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA4BjL,EAAWG,GAAvC,eAAAyB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAuBC,EAAWG,GAAS0K,GAClE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA6BjL,EAAWG,EAAQ8O,EAAUhP,GAA1D,iBAAA2B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEUqE,EAAgB,CAClB/O,SACAF,SACAgP,YALR,kBAOWlE,IAAMC,KAAKpL,EAAWG,GAAyBC,GAAYkP,EAAerE,GAC5E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAA8BjL,EAAWG,EAAQ8O,EAAUhP,GAA3D,iBAAA2B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEUqE,EAAgB,CAClB/O,SACAF,SACAgP,YALR,kBAOWlE,IAAMC,KAAKpL,EAAWG,GAA0BC,GAAYkP,EAAerE,GAC7E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAAkCjL,EAAWG,EAAQF,GAArD,iBAAA2B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEUqE,EAAgB,CAClB/O,SACAF,UAJR,kBAMW8K,IAAMC,KAAKpL,EAAWG,GAA8BC,GAAYkP,EAAerE,GACjF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,sBAeekE,OAzIQ,CACnBC,S,6CACAC,Y,+CACAC,Q,qDACAC,W,yDACAC,W,+CACAC,a,+CACAC,c,mDACAC,e,mDACAC,mB,gGCFJ,WAA6B5P,GAA7B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAwBC,GAAY6K,GAC3D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA4BjL,EAAWe,EAAM8O,GAA7C,iBAAAjO,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEUiF,EAAiB,CAAE/O,OAAM8O,UAFnC,kBAGW9E,IAAMC,KAAKpL,EAAWG,GAAuBC,GAAY8P,EAAgBjF,GAC3E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAR1C,4C,oEAYA,WAA6BjL,EAAW+P,EAAahP,EAAM8O,GAA3D,iBAAAjO,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEUiF,EAAiB,CAAExP,GAAIyP,EAAahP,OAAM8O,UAFpD,kBAGW9E,IAAMC,KAAKpL,EAAWG,GAAwBC,GAAY8P,EAAgBjF,GAC5E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAR1C,4C,oEAYA,WAA+BjL,EAAW+P,GAA1C,eAAAnO,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAA0BC,GAAa+P,EAAa,KAAMlF,GAClF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,sBAWe+E,OArDa,CACxBC,c,6CACAC,a,iDACAC,c,mDACAC,gB,8FCeJ,WAAwCpQ,GAAxC,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAoCC,GAAY6K,GACvE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA0CjL,EAAWI,GAArD,eAAAwB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAsCC,EAAWI,GAAayK,GACrF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAsCjL,EAAWI,EAAYC,GAA7D,eAAAuB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAkCC,EAAWI,EAAYC,GAASwK,GACzF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAuCjL,GAAvC,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAmCC,GAAY6K,GACtE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA8BjL,EAAWqQ,EAAOC,EAAaC,GAA7D,iBAAA3O,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU2F,EAAgB,CAClBH,QACAC,cACAC,oBALR,kBAOWxF,IAAMC,KAAKpL,EAAWG,GAAwBC,GAAYwQ,EAAe3F,GAC3E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAA4BjL,EAAWI,EAAYiQ,EAAOC,EAAaC,GAAvE,iBAAA3O,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU2F,EAAgB,CAClBlQ,GAAIF,EACJiQ,QACAC,cACAC,oBANR,kBAQWxF,IAAMC,KAAKpL,EAAWG,GAAsBC,GAAYwQ,EAAe3F,GACzE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAb1C,4C,oEAiBA,WAA8BjL,EAAWI,GAAzC,eAAAwB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAwBC,EAAWI,GAAa,KAAMyK,GAC9E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAuBjL,EAAWI,EAAYD,GAA9C,iBAAAyB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU2F,EAAgB,CAClBC,WAAYrQ,EACZD,UAJR,kBAMW4K,IAAMC,KAAKpL,EAAWG,GAAqBC,GAAYwQ,EAAe3F,GACxE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,oEAeA,WAA0BjL,EAAWI,EAAYD,GAAjD,iBAAAyB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU2F,EAAgB,CAClBC,WAAYrQ,EACZD,UAJR,kBAMW4K,IAAMC,KAAKpL,EAAWG,GAAwBC,GAAYwQ,EAAe3F,GAC3E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,oEAeA,WAA4BjL,EAAWI,EAAY2P,GAAnD,iBAAAnO,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU2F,EAAgB,CAClBC,WAAYrQ,EACZ2P,eAJR,kBAMWhF,IAAMC,KAAKpL,EAAWG,GAA2BC,GAAYwQ,EAAe3F,GAC9E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,oEAeA,WAA+BjL,EAAWI,EAAY2P,GAAtD,iBAAAnO,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU2F,EAAgB,CAClBC,WAAYrQ,EACZ2P,eAJR,kBAMWhF,IAAMC,KAAKpL,EAAWG,GAA8BC,GAAYwQ,EAAe3F,GACjF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,oEAeA,WAA+BjL,EAAW0Q,EAAyBL,EAAOC,EAAaK,GAAvF,iBAAA/O,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,0BAA2BwJ,GAC3C/J,EAASO,OAAO,QAASmJ,GACzB1J,EAASO,OAAO,cAAeoJ,GAC/B3J,EAASO,OAAO,OAAQyJ,GAN5B,kBAOW5F,IAAMC,KAAKpL,EAAWG,GAA0BC,GAAY2G,EAAUkE,GACxE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAAgCjL,EAAWK,EAAQgQ,EAAOC,EAAaK,GAAvE,iBAAA/O,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,KAAM7G,GACtBsG,EAASO,OAAO,QAASmJ,GACzB1J,EAASO,OAAO,cAAeoJ,GAC/B3J,EAASO,OAAO,OAAQyJ,GAN5B,kBAOW5F,IAAMC,KAAKpL,EAAWG,GAA2BC,GAAY2G,EAAUkE,GACzE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAAkCjL,EAAWK,GAA7C,eAAAuB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAA6BC,EAAWK,GAAS,KAAMwK,GAC/E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAkCjL,EAAWI,EAAYC,GAAzD,iBAAAuB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU+F,EAAgB,CAClBH,WAAYrQ,EACZC,UAJR,kBAMW0K,IAAMC,KAAKpL,EAAWG,GAA6BC,GAAY4Q,EAAe/F,GAChF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,oEAeA,WAAkCjL,EAAWI,EAAYC,GAAzD,iBAAAuB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU+F,EAAgB,CAClBH,WAAYrQ,EACZC,UAJR,kBAMW0K,IAAMC,KAAKpL,EAAWG,GAA6BC,GAAY4Q,EAAe/F,GAChF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,sBAee4F,OAhPY,CACvBC,yB,6CACAC,2B,+CACAC,uB,iDACAC,wB,6CACAC,e,mDACAC,a,qDACAC,e,+CACA9B,Q,iDACA+B,W,iDACAnB,a,iDACAoB,gB,iDACAC,gB,qDACAC,iB,qDACAC,mB,+CACAC,mB,iDACAC,mB,4RChBG,SAASC,GAAMC,GAAQ,IAAD,EACnBC,EAeN,WACI,GAAI5O,GAAkB2O,EAAMC,MACxB,MAAO,oBAEP,GAA0B,kBAAfD,EAAMC,KACb,OAAOD,EAAMC,KACV,IAAK5O,GAAkB2O,EAAMC,KAAKjO,WAAaX,GAAkB2O,EAAMC,KAAKjO,SAASZ,SAAWC,GAAkB2O,EAAMC,KAAKC,SAChI,OAAOF,EAAMC,KAAKC,QACf,IAAK7O,GAAkB2O,EAAMC,KAAKjO,YAAcX,GAAkB2O,EAAMC,KAAKjO,SAASZ,MAAO,CAChG,IAAMA,EAAO4O,EAAMC,KAAKjO,SAASZ,KACjC,GAAoB,kBAATA,EACP,OAAOA,EACJ,GAAoB,kBAATA,EAAmB,CACjC,IAAI2C,MAAMoB,QAAQ/D,GAKd,OAAO+O,EAAmB/O,GAJ1B,GAAIA,EAAKgC,OAAS,EACd,OAAO+M,EAAmB/O,EAAK,MA9B1CgP,GACPC,EAASL,EAAMK,OACfC,EAAQ,UAAGN,EAAMM,gBAAT,QAAqB,UAEnC,SAASH,EAAmBI,GACxB,OAAKlP,GAAkBkP,EAAOL,UAAsC,kBAAnBK,EAAOL,QAE5C7O,GAAkBkP,EAAOhP,QAAkC,kBAAjBgP,EAAOhP,MAEjDF,GAAkBkP,EAAOC,eAAgD,kBAAxBD,EAAOC,aAG7D,oBAFID,EAAOC,aAFPD,EAAOhP,MAFPgP,EAAOL,QAkCtB,OAAQ7O,GAAkB2O,EAAMC,MAK5B,KAJA,kBAAC,KAAD,CAAUK,SAAUA,GAChB,kBAACG,GAAA,EAAD,KAAaJ,GACZJ,G,4CCTPS,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCC,WAAY,CACR,qBAAqB,cACjBC,cAAe,MACfC,OAAQ,QACRC,UAAW,QACVJ,EAAMK,YAAYC,KAAK,MAAQ,CAC5BJ,cAAe,SACfC,OAAQ,UAIpBI,SAAU,CACNC,SAAU,EACVtE,gBAAiBL,GACjB4E,UAAW,QAEfC,UAAU,cACNC,MAAO,IACPC,QAAS,GACT1E,gBAAiBL,GACjBgF,gBAAiB,oCACjBC,aAAc,oCACdC,UAAW,qCACVf,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,SAGfK,cAAe,CACXC,UAAW,GAEfC,KAAM,CACFC,YAAa,GACbC,aAAc,GACd,0BAA2B,CACvBC,SAAU,IAEd,QAAS,CACLC,KAAMzF,GACN0F,UAAW,cAEf,yBAA0B,CACtBtF,MAAOJ,IAEX,iBAAkB,CACdK,gBAAiBL,GACjB,yBAA0B,CACtBI,MAAOJ,IAEX,QAAS,CACLyF,KAAMzF,IAEV,UAAW,CACPK,gBAAiBL,MAI7B2F,OAAQ,CACJC,eAAgB,gBAChBC,SAAU,IACVvB,OAAQ,GACR,QAAS,CACLjE,gBAAiBL,GACjB,UAAW,CACPK,gBAAiBL,IAErB,iBAAkB,CACdK,gBAAiBL,MAI7B8F,QAAS,CACLC,QAAS,OACTH,eAAgB,SAChBI,WAAY,SACZ1B,OAAQ,OACRQ,MAAO,QAEXmB,WAAY,CACR,uBAAwB,CACpBC,WAAY,GACZC,cAAe,IAGvBC,SAAU,CACNC,SAAU,WACVC,IAAK,EACLC,MAAO,OAIR,SAASC,GAAUjD,GAAQ,IACtB5P,EAAiD4P,EAAjD5P,KAAM8S,EAA2ClD,EAA3CkD,SAAUC,EAAiCnD,EAAjCmD,QAASC,EAAwBpD,EAAxBoD,SAAUjV,EAAc6R,EAAd7R,UADd,EAEHkV,IAAMC,SAAS,IAFZ,oBAEtBxJ,EAFsB,KAEfyJ,EAFe,OAGOF,IAAMC,SAAS,IAHtB,oBAGtBE,EAHsB,KAGVC,EAHU,OAICJ,IAAMC,SAAS,IAJhB,oBAItBI,EAJsB,KAIbC,EAJa,OAKSN,IAAMC,SAAS,MALxB,oBAKtBM,EALsB,KAKTC,EALS,OAMWR,IAAMC,SAAS,MAN1B,oBAMtBQ,EANsB,KAMRC,EANQ,OAOSV,IAAMC,UAAS,GAPxB,oBAOtBU,EAPsB,KAOTC,EAPS,OAQaZ,IAAMC,UAAS,GAR5B,oBAQtBY,EARsB,KAQPC,EARO,OASed,IAAMC,UAAS,GAT9B,oBAStBc,EATsB,KASNC,EATM,OAUGhB,IAAMC,SAAS,IAVlB,oBAUtBgB,EAVsB,KAUZC,EAVY,OAWGlB,IAAMC,SAAS,IAXlB,oBAWtBkB,EAXsB,KAWZC,EAXY,OAYGpB,IAAMC,SAAS,IAZlB,oBAYtBoB,EAZsB,KAYZC,EAZY,QAaCtB,IAAMC,SAAS,MAbhB,sBAatBsB,GAbsB,MAabC,GAba,SAcCxB,IAAMC,UAAS,GAdhB,sBActBf,GAdsB,MAcbuC,GAda,SAeDzB,IAAMC,UAAS,GAfd,sBAetByB,GAfsB,MAedC,GAfc,MAgBvBpE,GAAQqE,eACRC,GAAUC,aAAcvE,GAAMK,YAAYC,KAAK,OAC/CkE,GAAU1E,KAEV2E,GAAYhC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACTuN,GAAeC,SAASpP,GADf,QAC1B6D,EAD0B,QAEnBb,SACT0T,GAAW7S,EAASZ,MAEpBmS,EAASvR,EAASZ,MALU,2CAOjC,CAACjD,IAEEoX,GAAiBlC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACdoO,GAAoBC,cAAcjQ,GADpB,QAC/B6D,EAD+B,QAExBb,SACT0T,GAAW7S,EAASZ,MAEpBqS,EAAczR,EAASZ,MALU,2CAOtC,CAACjD,IAEEqX,GAA6BnC,IAAMiC,YAAN,uCAC/B,WAAMG,GAAN,yBAAA1V,EAAA,6DACYtB,EAAsBgX,EAAtBhX,GAAIiX,EAAkBD,EAAlBC,cADhB,SAE2B1G,GAAmBE,2BAA2B/Q,EAAWM,GAFpF,YAEUuD,EAFV,QAGiBb,SAHjB,uBAIQ0T,GAAW7S,EAASZ,MAJ5B,kBAKe,IALf,QAOcuU,EAPd,eAOgCF,IACbG,aAAe5T,EAASZ,KAC1BgE,EAAI,EATrB,aASwBA,EAAIuQ,EAAWC,aAAaxS,QATpD,wBAUkByS,EAVlB,eAUqCF,EAAWC,aAAaxQ,IAV7D,UAW+CoQ,GAA2BK,GAX1E,QAWYF,EAAWC,aAAaxQ,GAXpC,eAS4DA,IAT5D,+BAaQuQ,EAAWD,cAAgBA,EAAcI,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAa2L,SAAUtX,OAb7E,kBAcekX,GAdf,4CAD+B,sDAkB/B,CAACxX,IAGC6X,GAAc3C,IAAMiC,YAAN,sBAAkB,gCAAAvV,EAAA,sEACXiP,GAAmBC,yBAAyB9Q,GADjC,YAC5B6D,EAD4B,QAErBb,SAFqB,gBAG9B0T,GAAW7S,EAASZ,MAHU,uBAKxB6U,EAAY,GACT7Q,EAAI,EANiB,YAMdA,EAAIpD,EAASZ,KAAKgC,QANJ,6BAO1B6S,EAP0B,UAOLT,GAA2BxT,EAASZ,KAAKgE,IAPpC,yBAOhBf,KAPgB,wBAMYe,IANZ,uBAS9BuO,EAAWsC,GATmB,4CAWnC,CAAC9X,EAAWqX,KAETU,GAAkB7C,IAAMiC,YAAN,uCACpB,WAAMa,GAAN,mBAAApW,EAAA,6DACYtB,EAAiB0X,EAAjB1X,GAAIsX,EAAaI,EAAbJ,SADhB,SAE2B/G,GAAmBG,uBAAuBhR,EAAW4X,EAAUtX,GAF1F,QAEUuD,EAFV,QAGiBb,SACT0T,GAAW7S,EAASZ,MAEpByS,EAAe7R,EAASZ,MANhC,2CADoB,sDAUpB,CAACjD,IAwBL,SAASiY,GAAYtE,GACjB,MAAO,kBAAmBA,EAAOzS,GAAkBA,GAGvD,SAASgX,GAAY7V,GAAQ,IAAD,IACOA,EAAMC,OAA7BvB,EADgB,EAChBA,KAAM6F,EADU,EACVA,MAAOuR,EADG,EACHA,MACrB,OAAQpX,GACJ,IAAK,WACDqV,EAAYxP,GACZ,MACJ,IAAK,WACD0P,EAAY1P,GACZ,MACJ,IAAK,WACD4P,EAAW,UAAC2B,EAAM,UAAP,QAAa,OAxHP,8CA+H7B,oDAAAvW,EAAA,sDAA4BwW,EAA5B,+BAAqC,GAAIrX,EAAzC,uBACQsX,EADR,eAC+B1C,GAD/B,IAAA/T,EAAA,iBAEaqF,GAFb,uBAAArF,EAAA,yDAGc+R,EAAOyE,EAAOnR,GACoD,KAApE,UAAC0O,EAAa5U,UAAd,QAAuB,IAAIuX,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOqT,EAAKrT,MAAI2E,OAJrE,iCAM6C,UAATlE,EAAmB8P,GAAmBvB,QAAUuB,GAAmBX,cAAclQ,EAAWqY,EAAgB/X,GAAIqT,EAAKrT,IANzJ,QAMkBuD,EANlB,QAOyBb,SACT0T,GAAW7S,EAASZ,OAEdsV,EADH,2BACkBF,GADlB,mBACoCtX,EADpC,iCACgDsX,EAAgBtX,UADhE,QACyE,IADzE,CAC8E4S,MACjF6B,EAAWD,EAAQoC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOqV,EAAarV,GAAKiY,EAAUtM,MAClEoM,EAAkBE,GAZlC,0CAEatR,EAAI,EAFjB,YAEoBA,EAAImR,EAAOnT,QAF/B,0CAEagC,GAFb,eAEuCA,IAFvC,2BAAArF,EAAA,iBAgBaqF,GAhBb,mBAAArF,EAAA,yDAiBc+R,EAAO0E,EAAgBtX,GAAMkG,GACiB,IAAhDmR,EAAOE,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOqT,EAAKrT,MAAI2E,OAlBjD,iCAoB6C,UAATlE,EAAmB8P,GAAmBQ,WAAaR,GAAmBS,iBAAiBtR,EAAWqY,EAAgB/X,GAAIqT,EAAKrT,IApB/J,QAoBkBuD,EApBlB,QAqByBb,SACT0T,GAAW7S,EAASZ,OAEdsV,EADH,2BACkBF,GADlB,mBACoCtX,EAAOsX,EAAgBtX,GAAMuX,QAAO,SAAAE,GAAC,OAAIA,EAAElY,KAAOqT,EAAKrT,QAC9FkV,EAAWD,EAAQoC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOqV,EAAarV,GAAKiY,EAAUtM,MAClEoM,EAAkBE,GA1BlC,0CAgBatR,EAAI,EAhBjB,aAgBoBA,EAAIoR,EAAgBtX,GAAMkE,QAhB9C,0CAgBagC,GAhBb,iBAgBsDA,IAhBtD,wBA8BI2O,EAAgByC,GA9BpB,6CA/H6B,sBAgK7B,SAASI,KACL3C,GAAe,GACfE,GAAiB,GACjBQ,EAAY,MACZJ,EAAY,IACZE,EAAY,IArKa,SAwKdoC,GAxKc,iFAwK7B,WAAkCrW,GAAlC,eAAAT,EAAA,6DACSsB,GAAkBb,EAAMsW,iBACzBtW,EAAMsW,iBAEV9B,IAAU,GAJd,SAM2BhG,GAAmBK,eAAelR,EAAWmW,EAAUE,EAAvD,OAAiEV,QAAjE,IAAiEA,OAAjE,EAAiEA,EAAcrV,IAN1G,QAMUuD,EANV,QAOiBb,SACT0T,GAAW7S,EAASZ,MACbC,GAAkByS,GACzBH,EAAW,GAAD,oBAAKD,GAAL,aAAC,eAAkB1R,EAASZ,MAA5B,IAAkCwU,aAAc,GAAIF,cAAe,QAE7E/B,EAAWoD,GAAqB,OAACjD,QAAD,IAACA,OAAD,EAACA,EAAcrV,GAAIuD,EAASZ,OAGhE4T,IAAU,GACV4B,KAhBJ,4CAxK6B,sBA2L7B,SAASG,GAAsBC,EAAgBC,GAC3C,IAD6E,IAArBC,EAAoB,uDAATxD,EAC1DtO,EAAI,EAAGA,EAAI8R,EAAS9T,OAAQgC,IAAK,CACtC,IAAMqQ,EAASyB,EAAS9R,GACxB,GAAIqQ,EAAOhX,KAAOuY,EAEd,OADAE,EAAS9R,GAAGwQ,aAAZ,uBAA+BH,EAAOG,cAAtC,4BAAyDqB,GAAzD,IAAsErB,aAAc,GAAIF,cAAe,OAChGwB,EAEPH,GAAsBC,EAAgBC,EAAaC,EAAS9R,GAAGwQ,cAGvE,OAAOsB,EArMkB,SAwMdC,GAxMc,iFAwM7B,WAAgC3W,GAAhC,eAAAT,EAAA,6DACSsB,GAAkBb,EAAMsW,iBACzBtW,EAAMsW,iBAEV9B,IAAU,GAJd,SAM2BhG,GAAmBU,gBAAgBvR,EAAnC,OAA8C2V,QAA9C,IAA8CA,OAA9C,EAA8CA,EAAcrV,GAAI6V,EAAUE,EAAUE,GAN/G,QAMU1S,EANV,QAOiBb,SACT0T,GAAW7S,EAASZ,MAEpBuS,EAAWyD,GAAwB,OAACtD,QAAD,IAACA,OAAD,EAACA,EAAcrV,GAAIuD,EAASZ,OAGnE4T,IAAU,GACV4B,KAdJ,4CAxM6B,sBAyN7B,SAASQ,GAAyBJ,EAAgBK,GAC9C,IADkF,IAArBH,EAAoB,uDAATxD,EAC/DtO,EAAI,EAAGA,EAAI8R,EAAS9T,OAAQgC,IAAK,CACtC,IACkC,EAD5BqQ,EAASyB,EAAS9R,GACxB,GAAIqQ,EAAOhX,KAAOuY,EAEd,OADAE,EAAS9R,GAAGsQ,cAAZ,iCAAiCD,EAAOC,qBAAxC,QAAyD,IAAzD,CAA8D2B,IACvDH,EAEPE,GAAyBJ,EAAgBK,EAAeH,EAAS9R,GAAGwQ,cAG5E,OAAOsB,EAnOkB,8CAsO7B,8BAAAnX,EAAA,6DACIiV,IAAU,GAEJsC,EAAWlB,GAAYtC,KAAkBzU,GAHnD,UAI4BiY,EAAWtI,GAAmBO,eAAiBP,GAAmBY,oBAAoBzR,EAAW2V,EAAarV,IAJ1I,QAIUuD,EAJV,QAKiBb,SACT0T,GAAW7S,EAASZ,OAEpBuS,EAAW4D,GAAwBzD,IACnCC,EAAgB,OAGpBM,GAAkB,GAClBW,IAAU,GAbd,4CAtO6B,sBAsP7B,SAASuC,GAAwBzF,GAE7B,IAFwD,IAArBoF,EAAoB,uDAATxD,EACxC4D,EAAWlB,GAAYtE,KAAUzS,GAC9B+F,EAAI,EAAGA,EAAI8R,EAAS9T,OAAQgC,IAAK,CAAC,IAAD,EACjCkS,IACDJ,EAAS9R,GAAGsQ,cAAgBwB,EAAS9R,GAAGsQ,cAAce,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOqT,EAAKrT,OAEpFyY,EAAS9R,GAAGwQ,aAAe2B,GAAwBzF,EAAD,UAAOoF,EAAS9R,GAAGwQ,oBAAnB,QAAmC,IAEzF,OAAO0B,EAAWJ,EAAST,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOqT,EAAKrT,MAAMyY,EA8B/D,SAASM,GAAU1F,GAAmB,IAAb2F,EAAY,uDAAH,EACtBhZ,EAAcqT,EAAdrT,GAAI+P,EAAUsD,EAAVtD,MACNkJ,EAAWjZ,KAAE,OAAKqV,QAAL,IAAKA,OAAL,EAAKA,EAAcrV,IACtC,OACI,kBAACkZ,GAAA,EAAD,CACIvF,QAAM,EACNnN,IAAKxG,EACLiZ,SAAUA,EACVE,QAAS,kBAAM7D,EAAgB2D,EAAW,KAAO5F,IACjD+F,UAAWzC,GAAQtD,KACnBgG,MAAO,CAAE/F,YAAwB,IAAX0F,EAAe,GAAK,GAAc,GAATA,IAE/C,kBAACM,GAAA,EAAD,KAAeC,GAAclG,IAC7B,kBAACmG,GAAA,EAAD,CAAcC,QAAS1J,KAKnC,SAASwJ,GAAclG,GAEnB,GADiBsE,GAAYtE,KAAUzS,GAEnC,OAAO,kBAAC,KAAD,MAEX,IAAM8Y,EAAWC,OAAOtG,EAAKuG,UAC7B,OAAQF,GACJ,IAAK,kBACD,OAAO,kBAAC,KAAD,MACX,QACI,OAAIA,EAAS/T,SAAS,SACX,kBAAC,KAAD,MAEJ,kBAAC,KAAD,OA8BnB,SAASkU,GAAmBxG,GACxB,IAAMqG,EAAWC,OAAOtG,EAAKuG,UACrB7J,EAAuBsD,EAAvBtD,MAAOC,EAAgBqD,EAAhBrD,YACf,OACI,oCACI,kBAAC8J,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GACpC,8CAEJ,kBAAChB,GAAA,EAAD,CAAUE,UAAWzC,GAAQtD,MACzB,kBAACiG,GAAA,EAAD,KAAeC,GAAclG,IAC7B,kBAACmG,GAAA,EAAD,CAAcC,QAAS1J,MAG7BxL,GAAcyL,IAAiBpL,GAAmBoL,GAkBhD,KAjBA,oCACI,kBAAC8J,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,SAChB,iDAGPP,EAAS/T,SAAS,WAAa/C,GAAkBuS,IAC9C,kBAAC2E,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,yBAAKI,IAAKhF,EAAaiF,IAAKrK,KAGpC,kBAAC+J,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,QAAQI,WAAS,GAChCrK,MAmC7B,SAASsK,KACL,OACI,oCACI,kBAACR,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,SAChB,mDAGR,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GAAxC,wGAuChB,SAASK,GAA0BC,EAAOlU,EAAOmU,EAAOha,GACpD,OACI,kBAACia,GAAA,EAAD,CACIC,UAAQ,EACRC,QAASJ,EACTK,eAAgB,SAAAlP,GAAC,OAAIA,EAAElL,MACvBqa,kBAAmB,SAAAnP,GAAC,OAAIrF,EAAM0R,QAAO,SAAA1W,GAAC,OAAIA,EAAEtB,KAAO2L,EAAE3L,MAAI2E,OAAS,GAClEyU,UAAWzC,GAAQ1C,WACnB8G,SAAU,SAACC,EAAGlD,GAAJ,OAhdO,2CAgdQmD,CAAanD,EAAQrX,IAC9C6F,MAAOA,EACP4U,YAAY,iBACZC,uBAAqB,EACrBC,YAAa,SAAAC,GAAM,OAAI,kBAACC,GAAA,EAAD,iBAAeD,EAAf,CAAuBpB,QAAQ,SAASQ,MAAOA,EAAOc,gBAAiB,CAAEC,QAAQ,OACxGC,WAAY,SAACnV,EAAOoV,GAAR,OAAwBpV,EAAM+Q,KAAI,SAACsE,EAAQpV,GAAT,OAAmB,kBAACqV,GAAA,EAAD,eAAMpV,IAAKD,EAAO6H,MAAM,UAAUqM,MAAOkB,EAAOlb,MAAUib,EAAY,CAAEnV,kBAKrJ,SAASsV,KACL,OACI,kBAACC,GAAA,EAAD,CAAQ1C,UAAS,UAAKzC,GAAQhD,OAAb,YAAuBgD,GAAQoF,YAAc9B,QAAQ,YAAY+B,UAAW,kBAAC,KAAD,MAAyB7C,QAAS,kBAAMzD,GAAiB,IAAOtH,MAAM,UAAU6N,WAAS,GAAtL,cAcR,SAASC,KAAyC,IAAnBC,EAAkB,wDAC7C,OACI,kBAACL,GAAA,EAAD,CAAQ1C,UAAS,UAAKzC,GAAQhD,OAAb,QAA2BsG,QAAQ,YAAY+B,UAAW,kBAACI,GAAA,EAAD,MAAYjD,QAAS,kBAAMvD,GAAkB,IAAOxH,MAAM,UAAU+N,SAAUA,EAAUF,WAAS,GAA5K,UAmGR,OA1fArH,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,0DACqB,IAAbmT,EADR,gCAEcmC,KAFd,uBAGcE,KAHd,uBAKUS,KALV,4CADkB,sBAQd5V,IACA0U,IAAW,GATI,WAAD,+BAUdvV,GAAO0B,MAAK,kBAAM6T,IAAW,SAElC,CAAC1U,EAAM8S,EAAU8C,GAAaX,GAAWE,KAE5ClC,IAAMyH,WAAU,WACZjH,EAAe,MACVxS,GAAkByS,IACnBoC,GAAgBpC,KAErB,CAACA,EAAcoC,KAwed,oCACI,kBAAC6E,GAAA,EAAD,CACI3a,KAAMA,EACN4a,WAAY9F,GACZ/B,QAAS,WACLA,IACAY,EAAgB,OAEpB8D,UAAWzC,GAAQvE,WACnByB,SAAS,KACToI,WAAS,GAET,yBAAK7C,UAAWzC,GAAQjE,UA1V5BoB,GAEI,yBAAKsF,UAAWzC,GAAQ7C,SACpB,kBAAC0I,GAAA,EAAD,CAAkBpO,MAAM,aAI7B,kBAACqO,GAAA,EAAD,KAAOxH,EAAQoC,KAAI,SAAA1L,GAAC,OAG/B,SAAS+Q,EAAuBrJ,GAAkB,IAAZsJ,EAAW,uDAAH,EACpCC,EAAQ,GAEd,GADAA,EAAMhX,KAAKmT,GAAU1F,EAAMsJ,IACvBhF,GAAYtE,KAAUzS,GAAiB,CACvC,IAAK,IAAI+F,EAAI,EAAGA,GAAI,UAAC0M,EAAK8D,oBAAN,QAAsB,IAAIxS,OAAQgC,IAAK,CAAC,IAAD,EACjDqQ,EAAS3D,EAAK8D,aAAaxQ,GACjCiW,EAAMhX,KAAK8W,EAAuB1F,EAAQ2F,EAAQ,IAEtD,IAAK,IAAIhW,EAAI,EAAGA,GAAI,UAAC0M,EAAK4D,qBAAN,QAAuB,IAAItS,OAAQgC,IAAK,CAAC,IAAD,EAClDkW,EAAMxJ,EAAK4D,cAActQ,GAC/BiW,EAAMhX,KAAKmT,GAAU8D,EAAKF,EAAQ,KAG1C,OAAOC,EAhBwBF,CAAuB/Q,QAoV9C,yBAAKyN,UAAWzC,GAAQ9D,WA7R5BjQ,GAAkByS,GAQlB,oCACI,kBAAC2E,GAAA,EAAD,CAAYC,QAAQ,QAAQI,WAAS,GACjC,sCAEJ,kBAACL,GAAA,EAAD,CAAYC,QAAQ,QAAQI,WAAS,IACnB,IAAb5F,EAAA,kTAOS,IAAbA,GAAqBoH,MAjBvBlE,GAAYtC,KAAkBzU,GA2DzC,SAA4BoW,GACxB,IAAM8F,EAAS7H,EAAQ+C,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOgX,EAAOhX,MAAI2E,OAAS,EACxDwS,EAAgCH,EAAhCG,aAAcF,EAAkBD,EAAlBC,cACtB,OACI,kBAAC6C,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpBnD,GAAmB7C,IACN,IAAbvC,EACG,oCACKqI,EAmCrB,WAAuC,IAAD,IAClC,OACI,oCACI,kBAAChD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,SAChB,mDAGR,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVQ,GAA0BlP,EAAD,iBAAQgK,QAAR,IAAQA,OAAR,EAAQA,EAAchK,aAAtB,QAA+B,GAAI,QAAS,UAE1E,kBAACyO,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVQ,GAA0BxF,EAAD,iBAAaM,QAAb,IAAaA,OAAb,EAAaA,EAAcN,kBAA3B,QAAyC,GAAI,cAAe,eAE1F,kBAAC+E,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,MAjDGkD,GAA+B3C,KACzC,kBAACR,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACV8B,MAEL,kBAAC/B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IA0F3B,kBAAC+B,GAAA,EAAD,CAAQ1C,UAAS,UAAKzC,GAAQhD,OAAb,YAAuBgD,GAAQoF,YAAc9B,QAAQ,YAAY+B,UAAW,kBAACkB,GAAA,EAAD,MAAiB/D,QAAS,kBAAM3D,GAAe,IAAOpH,MAAM,UAAU6N,WAAS,GAA5K,aAvFY,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVmC,GAAsB/E,EAAaxS,OAAS,GAAKsS,EAActS,OAAS,KAIjF,sCA/E2CwY,CAAmB9H,GAyH9E,SAA8BqC,GAC1B,OACI,kBAACoC,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpBnD,GAAmBnC,IACN,IAAbjD,GAAqB6F,KACtB,kBAACR,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,KACG,IAAbtF,EAAoByH,KAgDrC,SAA+BxE,GAC3B,OACK9U,GAAkB+R,IACf,kBAACmH,GAAA,EAAD,CACI1C,UAAWzC,GAAQhD,OACnBsG,QAAQ,YACR+B,UAAW,kBAACoB,GAAA,EAAD,MACXjE,QAAS,WACLxE,EAAS,2BAAK+C,GAAN,IAAgB2F,IAAKlI,KAC7BT,KAEJtG,MAAM,UACN6N,WAAS,GATb,UAnDmDqB,CAAsB5F,KA/HS6F,CAAqBlI,GA4RnG,kBAACmI,GAAA,EAAD,CACIpE,UAAWzC,GAAQvC,SACnB+E,QAAS,WACLzE,IACAY,EAAgB,QAGpB,kBAACmI,GAAA,EAAD,SA9FZ,kBAACnB,GAAA,EAAD,CAAQ3a,KAAM8T,GAAiBF,EAAa1B,SAAS,KAAKoI,WAAS,EAACvH,QAAS,kBAAMyD,OAC/E,0BAAMuF,SAAUnI,EAAcmD,GAAmBN,IAC7C,kBAACuF,GAAA,EAAD,KAAcpI,EAAc,eAAiB,kBAC7C,kBAACqI,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWhV,MAAOuP,EAAUoE,QAAQ,SAASQ,MAAOlF,EAAc,gBAAkB,kBAAmB9U,KAAK,WAAWsa,SAAUnD,GAAaiG,UAAQ,EAAC5B,WAAS,KAEpK,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWhV,MAAOyP,EAAUkE,QAAQ,SAASQ,MAAM,cAAcha,KAAK,WAAWsa,SAAUnD,GAAaiG,UAAQ,EAAC5B,WAAS,EAAC6B,WAAS,EAACC,KAAM,KAE9IxI,EACG,kBAACuE,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYzC,QAAM,GAAlB,0BACA,kBAAC0C,GAAA,EAAD,CAAale,GAAG,eAAeme,mBAAiB,gBAAgBC,KAAK,OAAO3d,KAAK,WAAWsa,SAAUnD,GAAaqE,WAAS,MAGpI,OAGZ,kBAACoC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAAU7F,GAAQ8H,KAAK,UAA/C,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMhB,OAAvC,aASpB,WAAqC,IAAD,EAChC,OACI,kBAACmE,GAAA,EAAD,CAAQ3a,KAAMgU,EAAgBjB,QAAS,kBAAMkB,GAAkB,KAC3D,kBAAC+H,GAAA,EAAD,oBACA,kBAACC,GAAA,EAAD,KACI,kBAAC5D,GAAA,EAAD,CAAYC,QAAQ,SAApB,mCACoC,4CAAI5E,QAAJ,IAAIA,OAAJ,EAAIA,EAActF,aAAlB,QAA2B,sBAD/D,MAIJ,kBAACsO,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAAU7F,GAAQ6C,QAAS,kBApjBtC,2CAojB4CmF,KAAzD,YAGA,kBAACxC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMvD,GAAkB,KAAzD,YAqDP2I,GA3CD,kBAACjC,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBuT,IAAUzB,QAAS,kBAAM0B,GAAW,QACjE,kBAACuH,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACI,kBAAC,GAAD,CAAOhM,OAAO,wBAAwBJ,KAAM2E,MAEhD,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM/C,GAAW,QAAlD,S,4CCtsBdnE,GAAYC,cAAW,iBAAO,CAChCsM,SAAU,CACNC,OAAQ,QAIT,SAASC,GAAenN,GAC3B,IAAMoF,EAAU1E,KAChB,OACI,kBAAC0M,GAAA,EAAD,CAAUhd,KAAM4P,EAAMuC,QAASsF,UAAWzC,EAAQ6H,UAC9C,kBAAChC,GAAA,EAAD,CAAkBpO,MAAM,a,8CCSpC,WAA+B1O,GAA/B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAA0BC,GAAY6K,GAC7D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAwCjL,EAAWkf,EAAWC,GAA9D,eAAAvd,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAmCC,GAA9C,qBAAyEkf,EAAzE,sBAAgGC,GAAatU,GACzH/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAoCjL,GAApC,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAgCC,GAAY6K,GACnE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAiCjL,EAAWC,GAA5C,eAAA2B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA6BC,EAAWC,GAAS4K,GACxE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAsCjL,EAAWE,GAAjD,eAAA0B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAmCC,EAAWE,GAAW2K,GAChF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WACIjL,EACAM,EACA8K,EACAC,EACAC,EACAC,EACAC,EACAwD,EACAvD,EACAC,EACAE,EACAC,EACAC,GAbJ,+BAAAlK,EAAA,6DAcImK,EAdJ,kCAcqB,KAdrB,SAgB8B7H,GAAeuE,eAAe,uBAhB5D,cAgBUoC,EAhBV,QAiBUlE,EAAW,IAAIqF,UACZ9E,OAAO,KAAM5G,GACtBqG,EAASO,OAAO,QAASkE,GACzBzE,EAASO,OAAO,iBAAkB6E,GAClCpF,EAASO,OAAO,YAAamE,GAC7B1E,EAASO,OAAO,WAAYoE,GACR,OAAhBC,GACA5E,EAASO,OAAO,cAAeqE,GAEnC5E,EAASO,OAAO,aAAcsE,GAC9B7E,EAASO,OAAO,cAAe8H,GAC/BrI,EAASO,OAAO,cAAeuE,GAC/B9E,EAASO,OAAO,eAAgBwE,GAChC/E,EAASO,OAAO,qBAAsB0E,GACtCjF,EAASO,OAAO,qBAAsB2E,GACtClF,EAASO,OAAO,OAAQ4E,GAhC5B,kBAkCWf,IAAMC,KAAKpL,EAAWG,GAAkBC,GAAY2G,EAAUkE,GAChE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAvC1C,6C,oEA2CA,WAAsCjL,EAAWC,GAAjD,eAAA2B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAmCC,EAAWC,GAAS4K,GAC9E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA0CjL,EAAWC,EAAQmf,GAA7D,eAAAxd,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAsCC,GAAY,CAAEC,SAAQmf,aAAavU,GACjG/H,MAAK,SAAAe,GACF,OAAO,2BAAK1B,IAAiB,EAAO0B,EAASZ,KAAMY,IAAnD,IAA8DA,gBAEjE4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAyCjL,EAAWqf,EAASlf,EAAQif,GAArE,eAAAxd,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAsCC,GAAY,CAAEqf,UAASlf,SAAQif,aAAavU,GAC1G/H,MAAK,SAAAe,GACF,OAAO,2BAAK1B,IAAiB,EAAO0B,EAASZ,KAAMY,IAAnD,IAA8DA,gBAEjE4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAoCjL,EAAWsf,EAAcC,EAAgBC,EAASC,GAAtF,eAAA7d,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAgCC,GAAY,CAAEsf,eAAcC,iBAAgBC,UAASC,gBAAgB5U,GAC7H/H,MAAK,SAAAe,GACF,OAAO,2BAAK1B,IAAiB,EAAO0B,EAASZ,KAAMY,IAAnD,IAA8DA,gBAEjE4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA4BjL,GAA5B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAsBC,GAAY6K,GACzD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA0BjL,EAAWe,EAAMgO,GAA3C,iBAAAnN,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,OAAQnG,GACZ,MAARgO,GACApI,EAASO,OAAO,OAAQ6H,GALhC,kBAOWhE,IAAMC,KAAKpL,EAAWG,GAAoBC,GAAY2G,EAAUkE,GAClE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAA6BjL,EAAWe,EAAMgO,EAAM2Q,GAApD,iBAAA9d,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,KAAMlH,GACtB2G,EAASO,OAAO,OAAQnG,GACZ,MAARgO,GACApI,EAASO,OAAO,OAAQ6H,GAEX,MAAb2Q,GACA/Y,EAASO,OAAO,YAAawY,GATrC,kBAWW3U,IAAMC,KAAKpL,EAAWG,GAAuBC,GAAY2G,EAAUkE,GACrE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAhB1C,4C,oEAoBA,WAA8BjL,GAA9B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAyBC,GAAY6K,GAC5D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA6BjL,GAA7B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAuBC,GAAY6K,GAC1D/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,sBAWe0U,OArOW,CACtBC,gB,6CACAC,yB,iDACAC,qB,6CACAC,kB,+CACAC,uB,+CACAC,S,qEACAC,uB,+CACAC,2B,iDACAC,0B,mDACAC,qB,qDACAC,a,6CACAC,W,iDACAC,c,mDACAC,e,6CACAC,c,8CCgJJ,IAIeC,GAJczL,IAAM0L,MA1JnC,SAAoC/O,GAAQ,IAChC5P,EAA6B4P,EAA7B5P,KAAMjC,EAAuB6R,EAAvB7R,UAAWgV,EAAYnD,EAAZmD,QADc,EAGDE,IAAMC,UAAS,GAHd,oBAGhC0L,EAHgC,KAGnBC,EAHmB,OAIb5L,IAAMC,SAAS,IAJF,oBAIhCxJ,EAJgC,KAIzByJ,EAJyB,OAKHF,IAAMC,SAAS,IALZ,oBAKhCE,EALgC,KAKpBC,EALoB,OAMbJ,IAAMC,SAAS,IANF,oBAMhC9E,EANgC,KAMzB0Q,EANyB,OAOT7L,IAAMC,SAAS,IAPN,oBAOhCpD,EAPgC,KAOvBiP,EAPuB,OAQG9L,IAAMC,SAAS,IARlB,oBAQhC8L,EARgC,KAQjBC,EARiB,OASahM,IAAMC,SAAS,IAT5B,oBAShCgM,EATgC,KASZC,EATY,OAUTlM,IAAMC,UAAS,GAVN,oBAUhCf,EAVgC,KAUvBuC,EAVuB,OAWTzB,IAAMC,SAAS,MAXN,oBAWhCsB,EAXgC,KAWvBC,EAXuB,iDA2DvC,4BAAA9U,EAAA,yDACI+U,GAAW,GACXD,EAAW,MACY,IAAnB3E,EAAQ9M,QAAiC,IAAjBoL,EAAMpL,OAHtC,uBAIQyR,EAAW,2CACXC,GAAW,GALnB,6BASiC,IAAzBsK,EAAchc,OATtB,wBAUQyR,EAAW,qCACXC,GAAW,GAXnB,4CAe2BgJ,GAAkBU,qBACrCrgB,EACAqQ,EACA0B,EACAkP,EAActJ,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MACzB6gB,EAAmBxJ,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,OApBtC,aAeUuD,EAfV,QAsBiBb,SAtBjB,wBAuBQ0T,EAAW,sCAAwC7S,EAASZ,MAC5D0T,GAAW,GAxBnB,2BA4BIA,GAAW,GACX0K,IA7BJ,6CA3DuC,sBA2FvC,SAASA,IACL3K,EAAW,MACXqK,EAAS,IACTC,EAAW,IACXE,EAAiB,IACjBE,EAAsB,IACtBzK,GAAW,GACX3B,IAGJ,SAAS6F,EAA0BC,EAAOlU,EAAOmU,EAAOha,GACpD,OACI,kBAACia,GAAA,EAAD,CACIC,UAAQ,EACRC,QAASJ,EACTK,eAAgB,SAAAlP,GAAC,OAAIA,EAAElL,MACvBqa,kBAAmB,SAAAnP,GAAC,OAAIrF,EAAM0R,QAAO,SAAA1W,GAAC,OAAIA,EAAEtB,KAAO2L,EAAE3L,MAAI2E,OAAS,GAElEoW,SAAU,SAACC,EAAGlD,GAAJ,OA/DtB,WAA0C,IAApBA,EAAmB,uDAAV,GAAIrX,EAAM,uCACrC,OAAQA,GACJ,IAAK,QACDmgB,EAAiB9I,GACjB,MACJ,IAAK,YACDgJ,EAAsBhJ,IAyDGmD,CAAanD,EAAQrX,IAC9C6F,MAAOA,EACP4U,YAAY,iBACZC,uBAAqB,EACrBC,YAAa,SAAAC,GAAM,OAAI,kBAACC,GAAA,EAAD,iBAAeD,EAAf,CAAuBpB,QAAQ,SAASQ,MAAOA,EAAOc,gBAAiB,CAAEC,QAAQ,OACxGC,WAAY,SAACnV,EAAOoV,GAAR,OAAwBpV,EAAM+Q,KAAI,SAACsE,EAAQpV,GAAT,OAAmB,kBAACqV,GAAA,EAAD,eAAMpV,IAAKD,EAAO6H,MAAM,UAAUqM,MAAOkB,EAAOlb,MAAUib,EAAY,CAAEnV,kBAKrJ,OA1GAqO,IAAMyH,WAAU,WAAM,4CAClB,8BAAA/a,EAAA,6DACI+U,GAAW,GADf,SAE+BxH,GAAeC,SAASpP,GAFvD,YAEUshB,EAFV,QAGqBte,SAHrB,uBAIQ0T,EAAW,0BAA4B4K,EAAare,MACpD0T,GAAW,GALnB,iCAQIvB,EAASkM,EAAare,MAR1B,UASoC+M,GAAoBC,cAAcjQ,GATtE,aASUuhB,EATV,QAU0Bve,SAV1B,wBAWQ0T,EAAW,gCAAkC6K,EAAkBte,MAC/D0T,GAAW,GAZnB,2BAeIrB,EAAciM,EAAkBte,MAChC6d,GAAe,GACfnK,GAAW,GAjBf,6CADkB,sBAqBd1U,IAAS4e,GArBM,WAAD,wBAsBdW,KAEL,CAACvf,EAAM4e,EAAa7gB,EAAW8gB,EAAgB1L,EAAUE,EAAeqB,IAE3EzB,IAAMyH,WAAU,WAEZvH,EAAS,IACTE,EAAc,IACdwL,GAAe,KAChB,CAAC9gB,EAAW8gB,EAAgB1L,EAAUE,IA4ErC,kBAACsH,GAAA,EAAD,CAAQ3a,KAAMA,EAAM+S,QAASA,GACzB,kBAACiJ,GAAA,EAAD,+BACA,kBAACC,GAAA,EAAD,KACI,kBAACc,GAAD,CAAgB5K,QAASA,IACzB,kBAACgG,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACE,OAAZ5D,EAAmB,kBAAC,GAAD,CAAOvE,OAAO,wBAAwBJ,KAAM2E,IAAc,MAElF,kBAAC2D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWb,MAAM,QAAQnU,MAAOyJ,EAAOkK,QAAQ,SAASgC,WAAS,EAAC4B,UAAQ,EAAC9C,SAAU,SAAApP,GAAC,OAAI8U,EAAS9U,EAAE3J,OAAOsE,WAEhH,kBAACwT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWb,MAAM,UAAUnU,MAAOmL,EAASwI,QAAQ,SAASgC,WAAS,EAAC6B,WAAS,EAACD,UAAQ,EAACE,KAAM,EAAGhD,SAAU,SAAApP,GAAC,OAAI+U,EAAW/U,EAAE3J,OAAOsE,WAEzI,kBAACwT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVQ,EAA0BlP,EAAOsV,EAAe,UAAW,UAEhE,kBAAC7G,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVQ,EAA0BxF,EAAY8L,EAAoB,cAAe,gBAItF,kBAACxC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS4H,GAAjC,SAGA,kBAACjF,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAlJG,4CAkJ3B,aAQoD,SAAkBgI,EAAWC,GAC7F,OAAOD,EAAUxf,OAASyf,EAAazf,MAAQwf,EAAUzhB,YAAc0hB,EAAa1hB,a,mEC5JxF,WAA4B+R,EAAS4P,GAArC,iBAAA/f,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,UAAW6K,GAC3BpL,EAASO,OAAO,SAAU,gCAC1BP,EAASO,OAAO,QAASya,EAAO,kBALpC,kBAMW5W,IAAMC,KAAKpL,EAAWG,GAAgC4G,EAAUkE,GAClE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAX1C,4C,sBAee2W,OAnBY,CACvBC,a,gDCEEtP,GAAYC,cAAW,SAAAC,GAAK,YAAK,CACnChE,MAAI,GACAkG,SAAU,QACVvB,MAAO,QACP0O,OAAQ,OACRjN,MAAO,OACPkK,OAAQ,GACR1K,QAAS,OACT1B,cAAe,SACfU,QAAS,IART,eASCZ,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,sBAVX,eAYCX,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,sBAbX,eAeA,iBAAkB,CACduB,SAAU,WACVE,MAAO,EACPD,IAAK,IAlBT,eAoBA,qBAAsB,CAClBmN,OAAQ,aArBZ,eAuBA,gBAAiB,CACblP,UAAW,OACXmP,UAAW,YAzBf,OA8BO,SAASC,GAAT,GAAsC,IAAlBhgB,EAAiB,EAAjBA,KAAM+S,EAAW,EAAXA,QAC/BiC,EAAU1E,KADgC,EAEtB2C,IAAMC,SAAS,MAFO,oBAEzCwM,EAFyC,KAElCO,EAFkC,OAGlBhN,IAAMC,SAAS,IAHG,oBAGzCpD,EAHyC,KAGhCiP,EAHgC,OAIlB9L,IAAMC,UAAS,GAJG,oBAIzCf,EAJyC,KAIhCuC,EAJgC,OAKlBzB,IAAMC,SAAS,MALG,oBAKzCsB,EALyC,KAKhCC,EALgC,iDAyBhD,4BAAA9U,EAAA,yDACkC,IAA1BmQ,EAAQ3M,OAAOH,OADvB,uBAEQyR,EAAW,0BAFnB,iCAMIC,GAAW,GACXD,EAAW,MAPf,SASmCnV,MAAMogB,GATzC,8BASiDQ,OATjD,cASUC,EATV,iBAU2BR,GAAmBC,aAAa9P,EAASqQ,GAVpE,mBAWiBpf,SAXjB,wBAYQ0T,EAAW,2BACXC,GAAW,GAbnB,2BAiBIA,GAAW,GACX3B,IAlBJ,6CAzBgD,sBA8ChD,OAvCAE,IAAMyH,WAAU,WAAM,4CAClB,8BAAA/a,EAAA,6DACQygB,EAAOrK,SAASsK,eAAe,QADvC,kBAG6BC,KAAYF,EAAM,CAAEG,YAAY,IAH7D,OAGcC,EAHd,OAIQP,EAASO,EAAOC,aAJxB,gDAMQvf,QAAQc,IAAR,MANR,0DADkB,sBAWbhC,EAEgB,OAAV0f,GAbQ,WAAD,wBAcdgB,GAFAT,EAAS,QAId,CAACjgB,EAAM0f,EAAOO,IAuBZjgB,GAAkB,OAAV0f,EAKT,kBAACiB,GAAA,EAAD,CAAOlJ,UAAWzC,EAAQxI,MACtB,kBAACuQ,GAAD,CAAgB5K,QAASA,IACzB,kBAAC0J,GAAA,EAAD,CAAYrE,QAASzE,EAAS0E,UAAU,eACpC,kBAACqE,GAAA,EAAD,OAEJ,kBAACzD,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,kBAGA,yBAAKC,IAAKkH,EAAOjH,IAAI,aAAahB,UAAU,eAC5C,kBAACkC,GAAA,EAAD,CAAWrB,QAAQ,WAAWQ,MAAM,UAAUsD,KAAM,EAAGD,WAAS,EAACxX,MAAOmL,EAASsJ,SAAU,SAAApP,GAAC,OAAI+U,EAAW/U,EAAE3J,OAAOsE,QAAQ8S,UAAU,kBAAkB6C,WAAS,IACjK,kBAACH,GAAA,EAAD,CAAQ7B,QAAQ,YAAYd,QA7DY,4CA6DxC,SACW,KAEX,kBAAC,GAAD,CAAOvH,OAAO,wBAAwBJ,KAAM2E,KAjBzC,KChDf,IAEMlE,GAAYC,cAAW,SAAAC,GAAK,YAAK,CACnChE,KAAM,CACF4F,QAAS,OACTxB,UAAW,SAEfiQ,OAAQ,CACJC,WAAY,GAEhBC,QAAM,GACFrO,SAAU,QACVsO,KAAM,EACNrQ,OAAQ,OACRQ,MAAO,GACPoB,WAAY,GACZC,cAAe,GACfZ,aAAc,iBACdlF,gBAAiBL,IARf,eASDmE,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAM,OACNR,OAAQ,GACRS,QAAS,SACTV,cAAe,MACfuB,eAAgB,kBAdlB,eAgBF,eAAgB,CACZG,QAAS,SAjBX,GAoBN6O,WAAW,cACP7O,QAAS,QACR5B,EAAMK,YAAYC,KAAK,MAAQ,CAC5BsB,QAAS,UAGjB8O,YAAY,cACR/P,MArCY,IAsCZ,yBAA0B,CACtBgQ,SAAU,KAEb3Q,EAAMK,YAAYC,KAAK,MAAQ,CAC5BW,UAAW,MAGnBpQ,QAAQ,cACJ2P,SAAU,EACVoQ,UAAW,QACXzP,YAAa,GACb,eAAgB,CACZA,YAAa,eACbY,WAAY,iBAEf/B,EAAMK,YAAYC,KAAK,MAAQ,CAC5Ba,YAAa,EACbY,WAAY,KAGpB8O,aAAa,cACTxP,SAAU,QACVyP,aAAc,GACdlQ,QAAS,EACTwB,MAAO,EACPD,IAAK,GACJnC,EAAMK,YAAY0Q,GAAG,MAAQ,CAC1BC,aAAc,IAGtBC,YAAa,GACbC,aAAc,CACV9Q,UAAW,IACXK,UAAW,QAEf0Q,MAAO,CACHjP,SAAU,WACVtB,QAAS,YACTD,MAAO,KAEXyQ,aAAc,CACVlP,SAAU,WACVC,IAAK,GACLC,MAAO,IAEXiP,eAAe,cACXzP,QAAS,OACT1B,cAAe,iBACfS,MAAO,QACNX,EAAMK,YAAYC,KAAK,MAAQ,CAC5BJ,cAAe,MACfC,OAAQ,OACRQ,MAAO,UAGf2Q,cAAc,gBACTtR,EAAMK,YAAYC,KAAK,MAAQ,CAC5BsB,QAAS,aAgYrB,IAce2P,iBAdS,SAAAC,GAAK,MAAK,CAC9BC,MAAOD,EAAME,eACbxjB,cAAesjB,EAAMtjB,kBAGE,SAAAyjB,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnCqhB,SAAU,SAAA3Q,GAAI,OAAIyQ,EC5gBE,SAAAzQ,GAAI,MAAK,CAC7B+K,KAAM,YACN/K,QD0gB2B2Q,CAAS3Q,KACpC4Q,UAAW,SAAArH,GAAK,OAAIkH,ECxgBC,SAAAlH,GAAK,MAAK,CAC/BwB,KAAM,aACNxB,SDsgB6BqH,CAAUrH,KACvCsH,WAAY,SAAAlkB,GAAE,OAAI8jB,ECpgBI,SAAA9jB,GAAE,MAAK,CAC7Boe,KAAM,eACNpe,MDkgB2BkkB,CAAWlkB,KACtCmkB,cAAe,kBAAML,EChgBW,CAChC1F,KAAM,sBDggBNgG,eAAgB,kBAAMN,EC7fK,CAC3B1F,KAAM,yBD+fKsF,EAtYf,SAAiBnS,GAAQ,IACbwS,EAA0GxS,EAA1GwS,YAAaC,EAA6FzS,EAA7FyS,SAAUC,EAAmF1S,EAAnF0S,UAAWC,EAAwE3S,EAAxE2S,WAAYC,EAA4D5S,EAA5D4S,cAAe9jB,EAA6CkR,EAA7ClR,cAAe0c,EAA8BxL,EAA9BwL,UAAWqH,EAAmB7S,EAAnB6S,eAD3E,EAEqC7S,EAAMqS,MAAvDhkB,EAFY,EAEZA,SAAUykB,EAFE,EAEFA,gBAAiB7W,EAFf,EAEeA,KAAMrC,EAFrB,EAEqBA,YACnCwL,EAAU1E,KACVE,EAAQqE,eAJM,EAKgB5B,IAAMC,UAAS,GAL/B,oBAKbyP,EALa,KAKDC,EALC,OAMoB3P,IAAMC,UAAS,GANnC,oBAMb2P,EANa,KAMCC,EAND,OAOsB7P,IAAMC,UAAS,GAPrC,oBAOb6P,EAPa,KAOEC,EAPF,OAQ0B/P,IAAMC,SAAS,MARzC,oBAQb+P,EARa,KAQIC,EARJ,OASsBjQ,IAAMC,SAAS,MATrC,oBASbiQ,EATa,KASEC,EATF,OAUcnQ,IAAMC,UAAS,GAV7B,oBAUbmQ,EAVa,KAUFC,EAVE,OAWkBrQ,IAAMC,SAAS,GAXjC,oBAWbqQ,EAXa,KAWAC,EAXA,OAYkBvQ,IAAMC,SAAS,MAZjC,oBAYbuQ,EAZa,KAYAC,EAZA,OAasBzQ,IAAMC,SAAS,MAbrC,oBAabyQ,GAba,KAaEC,GAbF,QAcY3Q,IAAMC,UAAS,GAd3B,sBAcb2Q,GAda,MAcHC,GAdG,SAesB7Q,IAAMC,UAAS,GAfrC,sBAeb6Q,GAfa,MAeEC,GAfF,SAgBgC/Q,IAAMC,UAAS,GAhB/C,sBAgBb+Q,GAhBa,MAgBOC,GAhBP,MAwFpB,SAASC,KACL,OAAKzB,EAGE,GAFI,aAKf,SAAS0B,KACLxB,GAAeD,GACf0B,KACAC,KAGJ,SAASC,GAAqBnkB,GAC1B0iB,GAAiBD,GACjBK,EAAmB9iB,EAAMokB,eACzBF,KAGJ,SAASD,KACLvB,GAAgB,GAChBI,EAAmB,MAGvB,SAASuB,GAAsBrkB,GACtB2iB,IA0BLhX,GAAwBK,gBACxBoW,IACAgB,EAAe,GA1BXF,GAAa,IAEjBN,GAAkBD,GAClBK,EAAiBhjB,EAAMokB,eACvBH,KAGJ,SAASC,KACLtB,GAAiB,GACjBI,EAAiB,MAQrB,SAASsB,KACL9B,GAAc,GACdsB,IAAsB,GAU1B,SAASS,GAAsB7lB,EAAM8lB,EAAOC,GAAmB,IAAbhgB,EAAY,uDAAN,KACpD,OACI,kBAAC0S,GAAA,EAAD,CAAUvF,QAAM,EAAC8S,UAAWC,KAAMC,GAAIJ,EAAO/f,IAAG,OAAEA,QAAF,IAAEA,IAAO/F,EAAM0Y,QAAS4M,IACpE,kBAACzM,GAAA,EAAD,KAAekN,GACf,kBAAChN,GAAA,EAAD,CAAcC,QAAShZ,KAKnC,SAASmmB,GAAsBnmB,EAAMomB,EAAML,GAAmB,IAAbhgB,EAAY,uDAAN,KACnD,OACI,kBAAC0S,GAAA,EAAD,CACIvF,QAAM,EACNnN,IAAG,OAAEA,QAAF,IAAEA,IAAO/F,EACZ0Y,QAAS,WACL0N,IACAd,OAGJ,kBAACzM,GAAA,EAAD,KAAekN,GACf,kBAAChN,GAAA,EAAD,CAAcC,QAAShZ,KA+EnC,SAASqmB,KACL,OAA6B,IAAzBzmB,EAAcsE,OAEV,kBAAC2d,GAAA,EAAD,CAAOyE,UAAW,EAAGvgB,IAAI,YAAY4S,UAAWzC,EAAQ2M,OACpD,kBAACtJ,GAAA,EAAD,CAAYC,QAAQ,QAAQ7L,MAAM,iBAAlC,qBAML,yBAAK5H,IAAI,UAAUnG,EAAcgX,KAAI,SAAC1L,EAAGhF,GAAJ,OAGhD,SAA2B2c,EAAO/c,GAC9B,IAAMygB,EAAczgB,IAAUlG,EAAcsE,OAAS,EAC7CoL,EAA4BuT,EAA5BvT,MAAO0B,EAAqB6R,EAArB7R,QAASwV,EAAY3D,EAAZ2D,QACxB,OACI,yBAAKzgB,IAAKD,GACN,kBAAC+b,GAAA,EAAD,CAAOyE,UAAW,EAAG3N,UAAWzC,EAAQ2M,OACpC,kBAACtJ,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GACnCnK,GAEL,kBAACiK,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GACnCzI,GAEL,kBAACuI,GAAA,EAAD,CAAYC,QAAQ,UAAU7L,MAAM,iBAC/BhE,IAAOC,IAAI4c,GAASC,QAAQC,OAAO,iBAG1CH,EAA4B,KAAd,kBAACI,GAAA,EAAD,OAnB8BC,CAAkB1b,EAAGhF,OAwB/E,OAhQAiO,IAAMyH,WAAU,WAAM,4CAClB,8BAAA/a,EAAA,sEACgCoM,GAAwBC,iBADxD,cACU2Z,EADV,QAEuB5kB,WACfyiB,EAAemC,EAAc3kB,MACzB2kB,EAAc3kB,KAAO,GACrBsiB,GAAa,IALzB,SAQiCvX,GAAwBE,SARzD,QAQU2Z,EARV,QASwB7kB,UAChBuhB,EAAUsD,EAAe5kB,MAVjC,4CADkB,sBAcd0hB,GAde,WAAD,wBAedvjB,KAEL,CAACmjB,EAAWI,IAGfzP,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,sEACUgkB,GAAckC,OADxB,OAEIjC,GAAiB,MACjBnB,IACAvhB,QAAQc,IAAI,qBAJhB,4CADkB,sBAQlB,GAAI0gB,GAAqC,OAAlBiB,GAAwB,CAC3C,IAAM1K,EAAU,CACZ6M,mBAAoB7jB,GAAewE,UAEjCsf,GAAa,IAAIC,MAA+BC,QAAQxnB,GAAYC,cAAeua,GAASiN,yBAAyBC,QAE3HJ,EAAWK,GAAG,aAAc7D,GAC5BwD,EAAWK,GAAG,gBAAiB5D,GAC/BuD,EAAWK,GAAG,kBAAmB/D,GACjC0D,EAAWM,QAAQ7d,OAAM,SAAA8d,GAAG,OAAIplB,QAAQC,MAAMmlB,MAC9C1C,GAAiBmC,QACTrD,GAAqC,OAAlBiB,IAnBZ,WAAD,wBAoBd4C,KAEL,CAAClE,EAAUE,EAAYC,EAAeC,EAAgBkB,GAAejB,IAGxEzP,IAAMyH,WAAU,WACPzZ,GAAkBwiB,KACnBrB,EAAYqB,GACZC,EAAe,SAEpB,CAACD,EAAarB,IAGjBnP,IAAMyH,WAAU,WAAM,4CAClB,8BAAA/a,EAAA,6DACQ6mB,EAAS,EADjB,SAEgCza,GAAwBC,iBAFxD,QAEU2Z,EAFV,QAGuB5kB,WACfylB,EAASb,EAAc3kB,MAE3BwiB,EAAegD,GANnB,4CADkB,sBASd9D,GATe,WAAD,wBAUd+D,KAEL,CAAC/nB,EAAegkB,IAgMf,yBAAKjL,UAAWzC,EAAQxI,MACpB,kBAACka,GAAA,EAAD,MACA,kBAAC,GAAD,CACI1mB,KAAMikB,GACNlR,QAAS,WACLmR,IAAsB,MAG9B,kBAACyC,GAAA,EAAD,CAAQjU,SAAS,QAAQjG,MAAM,UAAUgL,UAAS,UAAKzC,EAAQ+L,OAAb,YAAuBoD,OACrE,kBAACtI,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,cAAcC,KAAK,QAAQrP,QAAS4M,GAAoB3M,UAAWzC,EAAQiM,YAC9G,kBAAC,KAAD,OAEJ,yBAAKxJ,UAAWzC,EAAQ6M,gBAxEzB5jB,EACH,oCACI,kBAAC6oB,GAAA,EAAD,CAAS1Y,MAAM,gBAAgB2Y,UAAU,SACrC,kBAAClL,GAAA,EAAD,CAAYpE,UAAWzC,EAAQyM,YAAajK,QAASiN,GAAuBuC,gBAAc,cAAcC,gBAAc,OAAOxa,MAAM,WAC/H,kBAACya,GAAA,EAAD,CAAOC,aAAc9D,EAAYE,EAAc,KAAM9W,MAAM,aACvD,kBAAC,KAAD,SAIZ,kBAAC2a,GAAA,EAAD,CAAM/oB,GAAG,aAAagpB,SAAUlE,EAAemE,aAAW,EAACtnB,KAAMunB,QAAQxE,GAAgBhQ,QAASuR,GAAsB7M,UAAWzC,EAAQ0M,cACtI,CACG,kBAACf,GAAA,EAAD,CAAOyE,UAAW,EAAGvgB,IAAI,cAAc4S,UAAWzC,EAAQ2M,OACtD,kBAACtJ,GAAA,EAAD,CAAYC,QAAQ,MAApB,iBACA,kBAAC6B,GAAA,EAAD,CAAQ3C,QAAS,kBAvGrC8M,UACAZ,EAAe,mBAsG6C8D,KAAK,QAAQlP,QAAQ,WAAWb,UAAWzC,EAAQ4M,aAAcpH,SAAmC,IAAzB9b,EAAcsE,QAAjI,aAIJ,kBAACyiB,GAAA,EAAD,CAAS5gB,IAAI,kBACbsgB,QAIZ,KAxCGlnB,EACH,oCACI,kBAACkc,GAAA,EAAD,CAAQ1C,UAAWzC,EAAQqM,aAAc7J,QAAS+M,GAAsByC,gBAAc,cAAcC,gBAAc,QAC9G,kBAACQ,GAAA,EAAD,KAASxpB,EAASypB,OAAO,GAAGC,gBAEhC,kBAACP,GAAA,EAAD,CAAM/oB,GAAG,YAAYgpB,SAAUpE,EAAiBqE,aAAW,EAACtnB,KAAMunB,QAAQ1E,GAAe9P,QAASsR,IAC9F,kBAAC/X,GAAD,CAAckL,QAAS6M,GAAqBS,UAAWC,KAAMC,GAAG,kBAAkBngB,IAAI,kBAAtF,WAGA,kBAACyH,GAAD,CAAckL,QAAS6M,GAAqBS,UAAWC,KAAMC,GAAG,UAAUngB,IAAI,UAA9E,YAKR,MAgFI,kBAACiiB,GAAA,EAAD,CAAS1Y,MAAM,YAAY2Y,UAAU,SACjC,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,YAAYpP,QAAS,kBAAMkM,EAAe,MAAMjM,UAAWzC,EAAQ8M,eACtG,kBAAC,KAAD,QAGR,kBAACgF,GAAA,EAAD,CAAS1Y,MAAM,QAAQ2Y,UAAU,SAC7B,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,QAAQpP,QAAS,kBAAMkM,EAAe,WAAWjM,UAAWzC,EAAQ8M,eACvG,kBAAC,KAAD,QAGR,kBAACgF,GAAA,EAAD,CAAS1Y,MAAM,QAAQ2Y,UAAU,SAC7B,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,QAAQpP,QAAS,kBAAMkM,EAAe,WAAWjM,UAAWzC,EAAQ8M,eACvG,kBAAC,KAAD,QAGPjW,EAAK7H,SAASrF,IACX,oCACI,kBAACmoB,GAAA,EAAD,CAAS1Y,MAAM,YAAY2Y,UAAU,SACjC,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,YAAYpP,QAAS,kBAAMkM,EAAe,aAAajM,UAAWzC,EAAQ8M,eAC7G,kBAAC8F,GAAA,EAAD,QAGR,kBAACd,GAAA,EAAD,CAAS1Y,MAAM,wBAAwB2Y,UAAU,SAC7C,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,wBAAwBpP,QAAS,kBAAMkM,EAAe,gBAAgBjM,UAAWzC,EAAQ8M,eAC5H,kBAAC,KAAD,SAIZ,KACHjW,EAAK7H,SAASrF,KAAe6K,IAAgB5K,GAC1C,oCACK,IACD,kBAACkoB,GAAA,EAAD,CAAS1Y,MAAM,sBAAsB2Y,UAAU,SAC3C,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,sBAAsBpP,QAAS,kBAAMsM,IAAY,IAAOrM,UAAWzC,EAAQ8M,eAC9G,kBAAC,KAAD,QAGR,kBAACgF,GAAA,EAAD,CAAS1Y,MAAM,oBAAoB2Y,UAAU,SACzC,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,oBAAoBpP,QAAS,kBAAMwM,IAAiB,IAAOvM,UAAWzC,EAAQ8M,eACjH,kBAAC+F,GAAA,EAAD,SAIZ,KACHhc,EAAK7H,SAASrF,IACX,kBAACmoB,GAAA,EAAD,CAAS1Y,MAAM,kBAAkB2Y,UAAU,SACvC,kBAAClL,GAAA,EAAD,CAAYpP,MAAM,UAAUma,aAAW,kBAAkBpP,QAASkN,GAAsBjN,UAAWzC,EAAQ8M,eACvG,kBAAC9B,GAAA,EAAD,QAGR,MAER,yBAAKvI,UAAWzC,EAAQ6L,OAAQ+F,aAAW,mBACvC,kBAACkB,GAAA,EAAD,CACI1M,UAAWA,EACX9C,QAAQ,YACRyP,OAA4B,QAApBvX,EAAMwX,UAAsB,QAAU,OAC9ChoB,KAAM2iB,EACN5P,QAASqR,GACTpP,QAAS,CAAEiT,MAAOjT,EAAQkM,aAC1BgH,WAAY,CAAEZ,aAAa,IAhL3C,WACI,IAAMa,EAAgB,GAiBtB,OAhBIlqB,IACAkqB,EAAclkB,KAAK0gB,GAAsB,YAAa,IAAK,kBAAC,KAAD,QAC3DwD,EAAclkB,KAAK0gB,GAAsB,QAAS,SAAU,kBAAC,KAAD,QAC5DwD,EAAclkB,KAAK0gB,GAAsB,QAAS,SAAU,kBAAC,KAAD,QACxD9Y,EAAK7H,SAASrF,MACdwpB,EAAclkB,KAAK0gB,GAAsB,YAAa,WAAY,kBAACiD,GAAA,EAAD,QAClEO,EAAclkB,KAAK0gB,GAAsB,wBAAyB,cAAe,kBAAC,KAAD,UAEjF9Y,EAAK7H,SAASrF,KAAe6K,IAAgB5K,MAC7CupB,EAAclkB,KAAKghB,GAAsB,uBAAuB,kBAAMnB,IAAY,KAAO,kBAAC,KAAD,QACzFqE,EAAclkB,KAAKghB,GAAsB,qBAAqB,kBAAMjB,IAAiB,KAAO,kBAAC6D,GAAA,EAAD,SAE5Fhc,EAAK7H,SAASrF,KACdwpB,EAAclkB,KAxB1B,SAAkCnF,EAAMomB,EAAML,GAAmB,IAAbhgB,EAAY,uDAAN,KACtD,OACI,kBAAC0S,GAAA,EAAD,CAAUvF,QAAM,EAACnN,IAAG,OAAEA,QAAF,IAAEA,IAAO/F,EAAM0Y,QAAS0N,GACxC,kBAACvN,GAAA,EAAD,KAAekN,GACf,kBAAChN,GAAA,EAAD,CAAcC,QAAShZ,KAoBJspB,CAAyB,kBAAmB1D,GAAsB,kBAAC1E,GAAA,EAAD,SAGtF,kBAAClF,GAAA,EAAD,KAAOqN,GAgKDE,KAGT,0BAAM5Q,UAAS,UAAKzC,EAAQ3T,QAAb,YAAwB8iB,OAAwBvU,EAAM0Y,UArVnDrnB,GAAkB2O,EAAMqS,MAAMlkB,WAiW5C,KAVA,oCACI,kBAAC8U,GAAD,CAAW7S,KAAM6jB,GAAU9Q,QAAS,kBAAM+Q,IAAY,IAAQ/lB,UAAW6R,EAAMqS,MAAMlkB,YACrF,kBAAC,GAAD,CACIiC,KAAM+jB,GACNhR,QAAS,WACLiR,IAAiB,IAErBjmB,UAAW6R,EAAMqS,MAAMlkB,iB,wCErfzCuS,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnChE,KAAK,cACDkG,SAAU,QACVC,IAAK,GACLmK,OAAQ,GACRlK,MAAO,GACPzB,MAAO,KACNX,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,oBACPwB,IAAK,SAwCjB,IAIeoP,iBAJS,SAAAC,GAAK,MAAK,CAC9BC,MAAOD,EAAME,kBAGFH,EAvCf,SAAcnS,GAAQ,IAAD,EACWqD,IAAMC,UAAS,GAD1B,oBACVqV,EADU,KACFC,EADE,OAEavV,IAAMC,SAAS,IAF5B,oBAEVpD,EAFU,KAEDiP,EAFC,KAGX/J,EAAU1E,KAoBhB,OAlBA2C,IAAMC,UAAS,WACNtD,EAAMqS,MAAMS,iBAGjBzgB,GAAewF,UAAU5G,MAAK,SAAAe,GACtBA,EAASb,UAAYE,GAAkBW,EAASZ,OAAkC,IAAzBY,EAASZ,KAAKgC,SAG3E+b,EAAWnd,EAASZ,MACpBwnB,GAAU,SAEf,CAAC5Y,IAOI2Y,EASJ,KARA,kBAACE,GAAA,EAAD,CAAMhR,UAAWzC,EAAQxI,MACrB,kBAACkc,GAAA,EAAD,CAAYta,MAAM,uBAClB,kBAACqX,GAAA,EAAD,MACA,kBAACkD,GAAA,EAAD,KAAc7Y,GACd,kBAAC8Y,GAAA,EAAD,KACI,kBAACzO,GAAA,EAAD,CAAQ3C,QAXpB,WACIgR,GAAU,GACVvmB,GAAeyF,aASP,W,8CC3ChB,WAA0B5I,EAAM+pB,GAAhC,eAAAlpB,EAAA,6DACUqB,EAAO,CAAElC,OAAM+pB,kBADzB,kBAEW/f,IAAMC,KAAKpL,EAAWG,GAAqBkD,GAC7CH,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,sBAWe8f,OAfW,CACtBC,W,gDCCEzY,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnChE,KAAK,cACDkG,SAAU,QACVmN,OAAQ,GACR/C,OAAQ,GACRlK,MAAO,GACPzB,MAAO,KACNX,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,0BAKZ,SAAS6X,KAAgB,IAAD,EACW/V,IAAMC,UAAS,GAD1B,oBACpB+V,EADoB,KACPC,EADO,KAErBlU,EAAU1E,KAEV6Y,EAAiBlW,IAAMiC,aAAY,WACrCkU,UAAUC,cACLC,mBACAzoB,KAFL,uCAEU,WAAM0oB,GAAN,eAAA5pB,EAAA,sDACOqF,EAAI,EADX,YACcA,EAAIukB,EAAcvmB,QADhC,iCAEcumB,EAAcvkB,GAAGwkB,aAF/B,wCAGMC,MAAM,oFAHZ,mBAIa,GAJb,OACwCzkB,IADxC,iDAOK,GAPL,4CAFV,uDAWKnE,MAAK,SAAA6oB,GACEA,EACAhqB,OAAOmG,SAAS8jB,QAAO,GAEvBT,GAAe,QAG5B,IAEGU,EAAe3W,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACZmpB,GAAkBC,WrB7CtB,SAED,IqB0CiB,QAC7BnnB,EAD6B,QAEtBb,SACT8oB,YAAW,WACPD,MACD,MAEHV,EAAetnB,EAASZ,KAAK8oB,IrBjDf,IqBkDVloB,EAASZ,KAAK+oB,YACdZ,KAT2B,2CAYpC,CAACA,IAOJ,OAJAlW,IAAMC,UAAS,WACX0W,MACD,CAACA,IAEGX,EACH,kBAACR,GAAA,EAAD,CAAMrD,UAAW,EAAG3N,UAAWzC,EAAQxI,MACnC,kBAACkc,GAAA,EAAD,CAAYta,MAAM,yBAClB,kBAACqX,GAAA,EAAD,MACA,kBAACkD,GAAA,EAAD,6NAIA,kBAACC,GAAA,EAAD,KACI,kBAACzO,GAAA,EAAD,CAAQG,WAAS,EAAC7N,MAAM,YAAY6L,QAAQ,YAAYd,QAAS,kBAAM2R,MAAvE,gBAKR,KC7ED,IAAMlH,GAAQ,SAAAjhB,GAAI,MAAK,CAC1Byb,KAAM,YACNzb,SCqGJ,IASe+gB,iBATS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpC8H,OAAQ,kBAAM9H,EDvGW,CACzB1F,KAAM,aACNzb,KAAM,MCsGNohB,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAtGf,SAAoBnS,GAAQ,IAChBoa,EAA8Bpa,EAA9Boa,KAAMC,EAAwBra,EAAxBqa,OAAQ7H,EAAgBxS,EAAhBwS,YADC,EAEenP,IAAMC,UAAS,GAF9B,oBAEhBgX,EAFgB,KAEHC,EAFG,OAGelX,IAAMC,SAAS,MAH9B,oBAGhBuQ,EAHgB,KAGHC,EAHG,KAIjB7d,EAAWukB,eAEXra,EAAqBkD,IAAMiC,aAAY,SAAA/E,GACzC,OAAKlP,GAAkBkP,EAAOL,UAAsC,kBAAnBK,EAAOL,QAE5C7O,GAAkBkP,EAAOhP,QAAkC,kBAAjBgP,EAAOhP,MAEjDF,GAAkBkP,EAAOC,eAAgD,kBAAxBD,EAAOC,aAG7D,oBAFID,EAAOC,aAFPD,EAAOhP,MAFPgP,EAAOL,UAOnB,IAEGua,EAAmBpX,IAAMiC,aAC3B,SAAArF,GACI,GAAI5O,GAAkB4O,GAClB,MAAO,oBAEP,GAAoB,kBAATA,EACP,OAAOA,EACJ,IAAK5O,GAAkB4O,EAAKjO,WAAaX,GAAkB4O,EAAKjO,SAASZ,SAAWC,GAAkB4O,EAAKC,SAC9G,OAAOD,EAAKC,QACT,IAAK7O,GAAkB4O,EAAKjO,YAAcX,GAAkB4O,EAAKjO,SAASZ,MAAO,CACpF,IAAMA,EAAO6O,EAAKjO,SAASZ,KAC3B,GAAoB,kBAATA,EACP,OAAOA,EACJ,GAAoB,kBAATA,EAAmB,CACjC,IAAI2C,MAAMoB,QAAQ/D,GAKd,OAAO+O,EAAmB/O,GAJ1B,GAAIA,EAAKgC,OAAS,EACd,OAAO+M,EAAmB/O,EAAK,QASvD,CAAC+O,IAsCL,OAlCAkD,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,0DAC6B,IAArBqqB,EAAKM,cAAiD,IAAzBN,EAAKtH,gBAD1C,iEAI2BzgB,GAAe4F,cAJ1C,YAIUjG,EAJV,QAKiBb,SALjB,qBAMsBspB,EAAiBzoB,EAASZ,MAC9BgD,SAAS,iBAP3B,wBAQYkD,IARZ,4CAY0BjF,GAAeyE,kBAZzC,2CAcQQ,IAdR,gEADkB,sBAmBlB,SAASA,IACL+iB,IACAvG,EAAe,UACfyG,GAAe,IAtBA,WAAD,wBAwBlBI,KACD,CAAC1kB,EAAUokB,EAAQD,EAAMtG,EAAgByG,EAAgBE,IAG5DpX,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAGb,kBAACzH,GAAA,EAAD,CAAQ3a,KAAMkqB,EAAanX,QAAS,kBAAMoX,GAAe,KACrD,kBAACnO,GAAA,EAAD,wBACA,kBAACC,GAAA,EAAD,8DACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ3C,QAAS,kBAAM2S,GAAe,IAAQ1d,MAAM,WAApD,WCxFT,SAAS+d,GAAO5a,GACnB,OACI,kBAAC,GAAD,KACI,kBAAC,GAAD,MACA,kBAACoZ,GAAD,MACA,kBAAC,GAAD,MACCpZ,EAAM0Y,U,cCTNmC,GAAe,SAAC,GAAD,IAAcC,EAAd,EAAG5F,UAAsB6F,EAAzB,EAAyBA,MAAO9e,EAAhC,EAAgCA,KAAS+e,EAAzC,oDACxB,kBAAC,KAAD,iBACQA,EADR,CAEIC,OAAQ,SAAAjb,GAMJ,OAAI+a,GAASA,EAAMG,MAAK,SAAAC,GAAC,OAAIlf,EAAK7H,SAAS+mB,MAEhC,kBAACL,EAAc9a,GAInB,kBAAC,KAAD,CAAUoV,GAAI,CAAEhf,SAAU,Y,gFCdvCsK,GAAYC,cAAW,SAAAC,GAAK,YAAK,CACnChE,KAAK,cACD4F,QAAS,OACT1B,cAAe,MACf0Q,UAAW,OACX1U,gBAAiBL,IAChBmE,EAAMK,YAAYC,KAAK,MAAQ,CAC5BJ,cAAe,WAGvBsa,SAAU,CACN5Y,QAAS,OACTH,eAAgB,UAChBI,WAAY,UAEhB4Y,SAAS,cACLja,SAAU,EACVka,gBAAiB,SAAAtb,GAAK,oBAAWA,EAAMub,UAAjB,MACtBC,eAAgB,QAChBC,mBAAoB,UACnB7a,EAAMK,YAAYC,KAAK,MAAQ,CAC5BF,UAAW,MAGnB0a,WAAS,GACLta,SAAU,EACVkB,SAAU,MACVxF,gBAAiBL,IAHZ,eAIJmE,EAAMK,YAAYC,KAAK,MAAQ,CAC5ByB,WAAY,GACZC,cAAe,KANd,eAQJhC,EAAMK,YAAYC,KAAK,MAAQ,CAC5BoB,SAAU,SATT,OAcN,SAASqZ,GAAW3b,GAAQ,IACvB0Y,EAAa1Y,EAAb0Y,SACFtT,EAAU1E,GAAUV,GAE1B,OACI,yBAAK6H,UAAWzC,EAAQxI,MACpB,yBAAKiL,UAAWzC,EAAQiW,WACxB,kBAACO,GAAA,EAAD,CAAW/T,UAAS,UAAKzC,EAAQsW,UAAb,YAA0BtW,EAAQgW,WAAa1C,ICpC/E,IAAMhY,GAAYC,cAAW,iBAAO,CAChCkb,SAAU,CACNrZ,QAAS,OACT1B,cAAe,SACf2B,WAAY,UAEhBvF,KAAM,CACF0U,aAAc,GACdtP,SAAU,KAEdwZ,SAAU,CACNC,UAAW,cA6PnB,IASe5J,iBATS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnCihB,MAAO,SAAAjhB,GAAI,OAAImhB,EAASF,GAAMjhB,QAGnB+gB,EAlQf,SAAenS,GAAQ,IAAD,EACcqD,IAAMC,SAAS,IAD7B,oBACXjV,EADW,KACD2tB,EADC,OAEc3Y,IAAMC,SAAS,IAF7B,oBAEX1P,EAFW,KAEDqoB,EAFC,OAGkB5Y,IAAMC,UAAS,GAHjC,oBAGXjK,EAHW,KAGC6iB,EAHD,OAI0C7Y,IAAMC,UAAS,GAJzD,oBAIX6Y,EAJW,KAIaC,EAJb,OAK0B/Y,IAAMC,SAAS,IALzC,oBAKXhJ,EALW,KAKK+hB,EALL,OAMwChZ,IAAMC,UAAS,GANvD,oBAMXgZ,EANW,KAMYC,EANZ,OAOwBlZ,IAAMC,SAAS,IAPvC,oBAOXkZ,EAPW,KAOIC,EAPJ,OAQgDpZ,IAAMC,SAAS,MAR/D,oBAQXoZ,EARW,KAQgBC,EARhB,OASsCtZ,IAAMC,SAAS,MATrD,oBASX3P,EATW,KASWipB,EATX,OAU0BvZ,IAAMC,SAAS,IAVzC,oBAUXuZ,EAVW,KAUKC,EAVL,OAWkBzZ,IAAMC,UAAS,GAXjC,oBAWXyZ,EAXW,KAWCC,EAXD,OAYoB3Z,IAAMC,SAAS,MAZnC,oBAYXuQ,EAZW,KAYEC,EAZF,OAaoBzQ,IAAMC,SAAS,MAbnC,oBAaX2Z,GAbW,KAaEC,GAbF,KAcZ9X,GAAU1E,KAdE,SAqCHyc,GArCG,iFAqClB,WAA4B3sB,GAA5B,mCAAAT,EAAA,yDACIS,EAAMsW,iBACNkW,GAAc,GACdE,GAAe,OAEEZ,EALrB,gCAMgBjqB,GAAegF,uBAAuBhJ,EAAUuF,EAAUyF,EAAYiB,EAAgBkiB,EAAeE,GANrH,2DAOgBrqB,GAAe+E,MAAM/I,EAAUuF,EAAUyF,EAAYiB,GAPrE,6BAKUtI,EALV,MAQkBb,UAI4B,uBAAlC,UAAAa,EAASZ,YAAT,mBAAeY,gBAAf,eAAyBZ,MACzBgrB,GAA0B,GACe,2BAAlC,UAAApqB,EAASZ,YAAT,mBAAeY,gBAAf,eAAyBZ,MAChCmrB,GAAyB,GAEzBW,GAAelrB,EAASZ,MAE5B4rB,GAAc,KAXO,EAC6ChrB,EAASZ,KAAnE/C,EADY,EACZA,SAAU4N,EADE,EACFA,KAAM9N,EADJ,EACIA,UAAWyL,EADf,EACeA,YAAaoC,EAD5B,EAC4BA,UAChD5E,GAFoB,EACuC3I,GACjDJ,EAAU4N,EAAM9N,EAAWyL,EAAaoC,IAV1D,6CArCkB,sBA4DlB,SAASqK,GAAY7V,GAAQ,IAAD,EACSA,EAAMC,OAA/BvB,EADgB,EAChBA,KAAM6F,EADU,EACVA,MAAOqoB,EADG,EACHA,QACrB,OAAQluB,GACJ,IAAK,WACD8sB,EAAYjnB,GACZ,MACJ,IAAK,WACDknB,EAAYlnB,GACZ,MACJ,IAAK,iBACDsnB,EAAkBtnB,GAClB,MACJ,IAAK,cACD0nB,EAAiB1nB,GACjB,MACJ,IAAK,0BACD4nB,EAA6B5nB,GAC7B,MACJ,IAAK,aACDmnB,EAAckB,GACd,MACJ,QACI,QAIZ,SAAShmB,GAAM3I,EAAIJ,EAAU4N,EAAM9N,EAAWyL,EAAaoC,GAClDC,EAAK7H,SAASrF,KAAe6K,IAAgB5K,IAA2BgN,EAAU5H,SAASjF,KAAoB6M,EAAU5H,SAASjF,KAGnI6Q,EAAMqS,MAAM,CACR5jB,KACAJ,WACA4N,OACAye,aAAa,EACb5H,iBAAiB,EACjB3kB,YACAyL,cACAoC,cAEJ8X,EAAe,MAZfA,EAAe,6BAxFL,8CAwGlB,sBAAA/jB,EAAA,sDACI+sB,EAAkBppB,GAAcC,EAAsBC,IAD1D,4CAxGkB,sBAwHlB,SAASypB,KACL,OAAOlB,EACH,kBAAC5T,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,uBACHya,MAAM,iBACN2D,KAAK,iBACLnE,QAAQ,SACR4D,UAAQ,EACR7V,aAAc6D,EACdkP,SAAUnD,GACVnX,KAAK,iBACLwb,WAAS,KAGjB,KAGR,SAAS4S,KACL,OACI,oCACI,kBAAC/U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,oBACHya,MAAM,eACN2D,KAAK,WACLnE,QAAQ,SACR4D,UAAQ,EACRvX,MAAOynB,EACPhT,SAAUnD,GACVnX,KAAK,cACLwb,WAAS,EACT6S,WA3Cc,IAA1BV,EAAezpB,OACR,KAEJypB,EAAe/W,KAAI,SAAC1L,EAAGhF,GAAJ,OACtB,kBAAC,IAAMooB,SAAP,CAAgBvoB,IAAKG,GACjB,8BAAOgF,GACP,iCAsCQqjB,OAAQ,kBAzJV,2CAyJgBC,OAGtB,kBAACnV,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,gCACHya,MAAM,4BACN2D,KAAK,WACLnE,QAAQ,SACR4D,UAAQ,EACRvX,MAAO2nB,EACPlT,SAAUnD,GACVnX,KAAK,0BACLwb,WAAS,KAGhB2S,MAsEb,OA9NAha,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,sEACmCsC,GAAemF,0BADlD,QACUmmB,EADV,QAE0BxsB,SAGlB+rB,GAAe,yCAFfN,EAAwBe,EAAiBvsB,MAHjD,4CADkB,uBAAC,WAAD,wBASlB7B,KACD,IAGH8T,IAAMyH,WAAU,WACRzZ,GAAkBwiB,IAGtB7T,EAAMwS,YAAYqB,KACnB,CAACA,EAAa7T,IA6Mb,kBAAC2b,GAAD,CAAYJ,UAAWqC,MACnB,kBAAChC,GAAA,EAAD,CAAWtZ,SAAS,KAAKuF,UAAWzC,GAAQyW,UACxC,yBAAKjT,IAAKiV,KAAahV,IAAI,iBAAiBhB,UAAWzC,GAAQlI,OAtCnE,0BAAMiP,SAAUgR,IACZ,kBAAC5U,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpB6Q,EACG,oCACKgB,KACD,kBAAC/U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOlI,SAAS,OAAOL,KAAK,4DAlChD,oCACI,kBAACsI,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAW+T,aAAa,WAAWrvB,GAAG,iBAAiBya,MAAM,YAAY2D,KAAK,OAAOP,UAAQ,EAACvX,MAAO1G,EAAUmb,SAAUnD,GAAaqC,QAAQ,SAASxZ,KAAK,WAAWwb,WAAS,KAEpL,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACI+T,aAAa,mBACbrvB,GAAG,iBACHya,MAAM,WACN2D,KAAK,WACLnE,QAAQ,SACR4D,UAAQ,EACRvX,MAAOnB,EACP4V,SAAUnD,GACVnX,KAAK,WACLwb,WAAS,KAGhB2S,KACD,kBAAC9U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GAAIX,UAAWzC,GAAQ0W,UAClC,kBAACiC,GAAA,EAAD,CAAkBC,QAAS,kBAACC,GAAA,EAAD,CAAUb,QAAS/jB,EAAYmQ,SAAUnD,GAAanX,KAAK,aAAa2N,MAAM,cAAgBqM,MAAM,mBAoB/H,kBAACX,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAACmC,KAAK,SAASjC,SAAUmS,EAAYrU,QAAQ,YAAY7L,MAAM,WAAhF,UAIJ,kBAAC0L,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,gBAAgBJ,KAAMgd,MAExC,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYyM,UAAU,MAAMlE,MAAM,UAC9B,kBAACmE,GAAA,EAAD,CAAM+I,KAAK,mBAAX,sBAGR,kBAAC3V,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,QAAQsI,MAAM,UAAlC,a3BjQE,Y,uC4BM1B,SAASmN,GAAOne,GAAQ,IACZoe,EAAavoB,KAAYwoB,MAAMre,EAAM/J,SAASqoB,QAA9CF,SAeR,OAdA/rB,GAAeiF,SACfxH,OAAOyuB,KAAKC,KAAK,SAAS,WACtB,IAAMC,EAAQ3uB,OAAOyuB,KAAKE,MAAMlvB,KAAK,CACjCmvB,UAAW,6EAEXD,EAAME,WAAW7sB,OACjB2sB,EAAMG,aAGV5e,EAAMoa,KAAKtH,kBACX9S,EAAM6e,cACN7e,EAAMqa,UAEVra,EAAMwS,YAAN,kBAAsB4L,QAAtB,IAAsBA,IAAY,UAC3B,KAGX,IAUejM,iBAVS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnCipB,OAAQ,kBAAM9H,EN5BW,CACzB1F,KAAM,aACNzb,KAAM,MM2BNytB,YAAa,kBAAMtM,EVfQ,CAC3B1F,KAAM,yBUiBKsF,CAA6CgM,I,8CC3B5D,4BAAApuB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAwB8K,GAC/C/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA0B0F,GAA1B,iBAAA/O,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,OAAQyJ,GAH5B,kBAIW5F,IAAMC,KAAKpL,EAAWG,GAAqB4G,EAAUkE,GACvD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAT1C,4C,sBDkBA+kB,GAAOW,UAAY,CACf1E,KAAM2E,KAAUxe,OAChBiS,YAAauM,KAAUzJ,KACvB+E,OAAQ0E,KAAUzJ,MCRP0J,OA7BQ,CACnBC,c,4CACAC,W,4ECLSC,GAAgBxiB,aAAW,CACpCC,KAAM,CACF,WAAY,CACRiF,UAAW,IAEf,cAAe,CACX+P,aAAc,IAElB,WAAY,CACR/P,UAAW,IAEf,cAAe,CACX+P,aAAc,IAElB,WAAY,CACR/P,UAAW,IAEf,cAAe,CACX+P,aAAc,MAlBGjV,CAqB1BkZ,MCZGnV,GAAYC,cAAW,iBAAO,CAChCye,MAAO,CACHre,OAAQ,SAgHhB,IAOeoR,iBAPS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAEW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAnHf,SAAqBnS,GAAQ,IACjBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YADU,EAEMnP,IAAMC,UAAS,GAFrB,oBAEjBf,EAFiB,KAERuC,EAFQ,OAGAzB,IAAMC,SAAS,MAHf,oBAGjBxE,EAHiB,KAGXugB,EAHW,OAIUhc,IAAMC,SAAS,IAJzB,oBAIjBgc,EAJiB,KAINC,EAJM,OAKclc,IAAMC,SAAS,MAL7B,oBAKjB2Z,EALiB,KAKJC,EALI,OAMc7Z,IAAMC,SAAS,MAN7B,oBAMjBuQ,EANiB,KAMJC,EANI,KAOlB1O,EAAU1E,KAEV8e,EAAkBla,sBAAW,sBAAC,8BAAAvV,EAAA,6DAChCmtB,EAAe,MADiB,SAET8B,GAAeC,gBAFN,QAE1BjtB,EAF0B,QAGlBb,SAGV+rB,EAAelrB,EAASZ,MAFxBmuB,EAAY,UAACvtB,EAASZ,YAAV,aAAC,EAAequB,MAJA,2CAQjC,IAjBqB,SAuCTtC,EAvCS,8EAuCxB,WAA4B3sB,GAA5B,eAAAT,EAAA,6DACIS,EAAMsW,iBACNoW,EAAe,MACfpY,GAAW,GAHf,SAI2Bka,GAAeE,WAAWpgB,GAJrD,cAIU9M,EAJV,QAKiBb,UACT+rB,EAAelrB,EAASZ,MANhC,SAQUouB,IARV,OASI1a,GAAW,GATf,6CAvCwB,sBAoBxBzB,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,yDACSqqB,EAAKtH,gBADd,uBAEQgB,EAAe,UAFvB,0CAKU0L,IALV,OAMI1a,GAAW,GANf,4CADkB,uBAAC,WAAD,wBASlBvV,KACD,CAAC6qB,EAAMoF,EAAiB1L,IAG3BzQ,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACrB,EAAaqB,IAcjB,IAAM6L,EAAa,SAAAlvB,GACf,IAAMuE,EAAQvE,EAAMC,OAAO6V,MAAM,GACjC+Y,EAAQtqB,IAyCZ,OACI,kBAAC6mB,GAAA,EAAD,CAAWtZ,SAAS,MAChB,kBAAC6K,GAAD,CAAgB5K,QAASA,IAzBzB,0BAAM4J,SAAUgR,GACZ,kBAAC1U,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,eAGA,kBAAC,GAAD,CAAOtI,OAAO,wBAAwBJ,KAAMgd,IAC5C,kBAAC1U,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,GAClB,kBAACgC,GAAA,EAAD,oBACA,kBAACiT,GAAA,EAAD,CAAOlxB,GAAG,eAAeme,mBAAiB,gBAAgBC,KAAK,OAAO3d,KAAK,aAAasa,SAAUkW,EAAYpT,UAAQ,EAAC5B,WAAS,IAChI,kBAACkV,GAAA,EAAD,qCAGR,kBAACrX,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAAChC,QAAQ,YAAYmE,KAAK,UAA3C,aAcZ,kBAACsS,GAAD,CAAetX,UAAU,qBAEzB,kBAACU,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GA5CzBpa,GAAkBiuB,IAAmC,IAArBA,EAAUlsB,OACnC,KAEJksB,EAAUxZ,KAAI,SAACgK,EAAO9a,GAAR,OACjB,kBAACuT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,EAAGvT,IAAKD,GACnB,kBAAC6jB,GAAA,EAAD,KACI,kBAACgH,GAAA,EAAD,CAAWhY,UAAWzC,EAAQga,MAAOtP,MAAOA,c,sJCvEhE,IAAMpP,GAAYC,cAAW,iBAAO,CAChC/D,KAAM,CACF4U,UAAW,KAEf4N,MAAO,SAAApf,GAAK,MAAK,CACbe,OAAQ,IACRya,gBAAmC,IAAnBxb,EAAM8f,SAAoB,UAAY,QACtDhjB,gBAAiB,UAErBrL,QAAS,CACL+f,UAAW,KAEfuO,QAAS,CACLjf,cAAe,eAEnBkf,QAAS,CACL,sBAAuB,CACnBxd,QAAS,OACT1B,cAAe,UAEnB,oBAAqB,CACjBmf,cAAe,OACfhe,SAAU,KAEd,qBAAsB,CAClBI,eAAgB,aAChB6d,WAAY,UAKjB,SAASC,GAAWngB,GAAQ,IAAD,EACtB8P,EAAsF9P,EAAtF8P,MAAOsQ,EAA+EpgB,EAA/EogB,aAAcC,EAAiErgB,EAAjEqgB,YAAa7hB,EAAoDwB,EAApDxB,MAAOC,EAA6CuB,EAA7CvB,YAAaia,EAAgC1Y,EAAhC0Y,SAAU9Q,EAAsB5H,EAAtB4H,QAASkY,EAAa9f,EAAb8f,SADnD,EAGMzc,IAAMC,UAAS,GAHrB,oBAGvBgd,EAHuB,KAGXC,EAHW,OAIQld,IAAMC,SAAS,MAJvB,oBAIvBkd,EAJuB,KAIVC,EAJU,OAMEpd,IAAMC,SAAS,MANjB,oBAMvBmU,EANuB,KAMbiJ,EANa,KAQxBC,EAAMC,mBACNC,EC/CK,SAAqBF,GAAM,IAAD,EACKrd,oBAAS,GADd,oBAC9Bwd,EAD8B,KACdC,EADc,KAG/BC,EAAWC,mBAAQ,kBAAM,IAAIC,sBAAqB,gBAAEC,EAAF,4BAAaJ,EAAgBI,EAAML,qBAAkB,CAACH,IAO9G,OALA7V,qBAAU,WAEN,OADAkW,EAASI,QAAQT,EAAIU,SACd,kBAAML,EAASM,gBACvB,IAEIR,EDqCWS,CAAYZ,GAExBvb,EAAU1E,GAAU,CAAEof,UAAuB,IAAbA,KAAuBzuB,GAAkBye,KAAWze,GAAkBmvB,MAE5Gnd,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,sEACwBqwB,EADxB,OACUtQ,EADV,OAEI2Q,GAAgBpvB,GAAkBye,IAAUA,EAAM1c,OAAS,EAAI0c,EAAQ,MAF3E,4CADkB,sBAKbsQ,GACe,OAAhBI,GANe,WAAD,wBAOdgB,KAEL,CAACpB,EAAcI,IAElBnd,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,sEACwBswB,IADxB,OACUvQ,EADV,OAEI2Q,GAAgBpvB,GAAkBye,IAAUA,EAAM1c,OAAS,EAAI0c,EAAQ,MAF3E,4CADkB,sBAKbuQ,GAAgBQ,IAAaP,GACd,OAAhBE,IACAD,GAAc,GAPC,WAAD,wBAQdkB,MAEL,CAACZ,EAAWR,EAAaG,IAE5B,IAIMkB,EAAc,WAChBhB,EAAY,OAGVtwB,EAAOunB,QAAQF,GACfhpB,EAAK2B,EAAO,2BAAwB2C,EACpC4uB,EAAYtwB,GAAkBye,IAA2B,IAAjBA,EAAM1c,OAAuB,KAAR0c,EAEnE,OACI,oCACI,kBAAC+I,GAAA,EAAD,CAAMhR,UAAWzC,EAAQxI,KAAM4Y,UAAW,EAAGmL,IAAKA,GAC9C,kBAACiB,GAAA,EAAD,CAAgBha,QAASA,EAASgD,SAAUvZ,GAAkBuW,IAC1D,kBAACiY,GAAA,EAAD,CAAW/P,MAAK,iBAAE6R,QAAF,IAAEA,IAAYnB,SAAd,QAA6BqB,KAASrjB,MAAK,OAAEA,QAAF,IAAEA,IAAS,SAAUqJ,UAAWzC,EAAQga,QACnG,kBAACrG,GAAA,EAAD,CAAalR,UAAWzC,EAAQ3T,SAC5B,kBAACgX,GAAA,EAAD,CAAYC,QAAQ,KAAKC,cAAY,GAArC,OACKnK,QADL,IACKA,IAAS,UAEbC,IAGT,kBAACua,GAAA,EAAD,CAAanR,UAAWzC,EAAQ2a,SAC1B1uB,GAAkBqnB,GAIhB,KAHA,kBAACzM,GAAA,EAAD,CAAYW,mBAAkBne,EAAImZ,QA1BlC,SAAApX,GAChBkwB,EAAYlwB,EAAMokB,iBA0BE,kBAACkN,GAAA,EAAD,SAKhB,kBAACC,GAAA,EAAD,CACItzB,GAAIA,EACJ2B,KAAMA,EACNqnB,SAAUA,EACVtU,QAASue,EACT9Z,QAAS8Z,EACTM,aAAc,CACVC,SAAU,MACVC,WAAY,UAEhBC,gBAAiB,CACbF,SAAU,SACVC,WAAY,UAEhBra,UAAWzC,EAAQ4a,SAElBtH,I,8CElHjB,WAAuBjqB,GAAvB,eAAAsB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAmBO,EAAIuK,GAC9C/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAyB3K,GAAzB,eAAAsB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,EAAsBO,EAAIuK,GACjD/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,sBAWegpB,OA3BS,CACpBC,Q,6CACAC,U,wDCDE5hB,GAAYC,cAAW,iBAAO,CAChC/D,KAAM,CACF2E,MAAO,OACPR,OAAQ,IACRya,eAAgB,QAChBC,mBAAoB,SACpB3Y,SAAU,WACV,gBAAiB,CACbhG,gBAAiBL,GACjBqG,SAAU,WACVC,IAAK,EACLC,MAAO,QAKZ,SAASuf,GAAUviB,GAAQ,IACtB8P,EAA6B9P,EAA7B8P,MAAOlF,EAAsB5K,EAAtB4K,SAAUzH,EAAYnD,EAAZmD,QACnBiC,EAAU1E,KAEhB,OACI,kBAACmY,GAAA,EAAD,CAAMhR,UAAWzC,EAAQxI,KAAMkL,MAAO,CAAEwT,gBAAgB,OAAD,OAASxL,KAC5D,kBAAC7D,GAAA,EAAD,CAAYpE,UAAU,aAAahL,MAAM,YAAY+a,KAAK,QAAQhQ,QAASzE,EAASyH,SAAUA,GAC1F,kBAACsB,GAAA,EAAD,QC3BhB,IAAIsW,GAAU,GAEP,SAASC,KACZD,GAAU,GAGP,SAASE,KACZ,OAAOF,GAAQ1c,KAAI,SAAA1L,GACf,OAAOA,EAAE1J,UAQV,SAASiyB,GAAerc,EAAOsc,GAClC,IAAK,IAAIxtB,EAAI,EAAGA,EAAIkR,EAAMlT,OAAQgC,IAAK,CACnC,IAAM0J,EAAOwH,EAAMlR,GACnB,IAAI/D,GAAkByN,GAAtB,CAGA,IAAI+jB,EAAS,IAAIC,WACjBN,GAAQnuB,KAAKwuB,GACbA,EAAOE,OAAS,WACZH,KAEJC,EAAOG,cAAclkB,K,cCKvB4B,GAAYC,cAAW,iBAAO,CAChC+B,WAAY,CACR,uBAAwB,CACpBC,WAAY,GACZC,cAAe,IAGvBqgB,WAAY,OAGD,SAASC,GAAaljB,GAAQ,IACjCmjB,EAA+EnjB,EAA/EmjB,KAAMC,EAAyEpjB,EAAzEojB,KAAMC,EAAmErjB,EAAnEqjB,YAAajzB,EAAsD4P,EAAtD5P,KAAM+S,EAAgDnD,EAAhDmD,QAASmgB,EAAuCtjB,EAAvCsjB,OAAQn1B,EAA+B6R,EAA/B7R,UAAWo1B,EAAoBvjB,EAApBujB,gBAD3B,EAERlgB,IAAMC,SAAS,IAFP,oBAEjCjV,EAFiC,KAEvB2tB,EAFuB,OAGd3Y,IAAMC,SAAS,IAHD,oBAGjC/J,EAHiC,KAG1BiqB,EAH0B,OAIIngB,IAAMC,SAAS,IAJnB,oBAIjCpJ,EAJiC,KAIjBupB,EAJiB,OAKRpgB,IAAMC,SAAS,IALP,oBAKjCogB,EALiC,KAKvBC,EALuB,OAMVtgB,IAAMC,SAAS,IANL,oBAMjCsgB,EANiC,KAMxBC,EANwB,OAOFxgB,IAAMC,SAAS,IAPb,oBAOjC5J,EAPiC,KAOpBoqB,EAPoB,OAQdzgB,IAAMC,SAAS,IARD,oBAQjCygB,EARiC,KAQ1BC,EAR0B,OASN3gB,IAAMC,SAAS,IATT,oBASjC2gB,EATiC,KAStBC,EATsB,OAUd7gB,IAAMC,SAAS,IAVD,oBAUjC6gB,EAViC,KAU1BC,EAV0B,OAWF/gB,IAAMC,SAAS,IAXb,oBAWjC1J,EAXiC,KAWpByqB,EAXoB,OAYdhhB,IAAMC,SAAS,IAZD,qBAYjCxJ,GAZiC,MAY1ByJ,GAZ0B,SAaRF,IAAMC,SAAS,IAbP,sBAajCghB,GAbiC,MAavBC,GAbuB,SAcYlhB,IAAMC,UAAS,GAd3B,sBAcjCvJ,GAdiC,MAcbyqB,GAda,SAeYnhB,IAAMC,UAAS,GAf3B,sBAejCtJ,GAfiC,MAebyqB,GAfa,SAgBhBphB,IAAMC,UAAS,GAhBC,sBAgBjCrJ,GAhBiC,MAgB3ByqB,GAhB2B,SAiBdrhB,IAAMC,SAAS,IAjBD,sBAiBjCwM,GAjBiC,MAiB1BO,GAjB0B,SAkBFhN,IAAMC,UAAS,GAlBb,sBAkBjCqhB,GAlBiC,MAkBpBC,GAlBoB,SAmBVvhB,IAAMC,UAAS,GAnBL,sBAmBjCf,GAnBiC,MAmBxBuC,GAnBwB,SAoBZzB,IAAMC,UAAS,GApBH,sBAoBjCyB,GApBiC,MAoBzBC,GApByB,SAqBV3B,IAAMC,SAAS,MArBL,sBAqBjCsB,GArBiC,MAqBxBC,GArBwB,SAsBhBxB,IAAMC,WAArBuhB,GAtB+B,sBAuBlCzf,GAAU1E,KAEVokB,GAAczhB,IAAMiC,aAAY,WAClCuf,GAAY,MACb,IAEGE,GAAa,kBAAO1zB,GAAiB,OAAC8xB,QAAD,IAACA,OAAD,EAACA,EAAM10B,KAE5Cu2B,GAAe,kBAAO3zB,GAAiB,OAAC8xB,QAAD,IAACA,OAAD,EAACA,EAAM5pB,QAE9C0rB,GAAqBnrB,GAAMohB,MAAK,SAAAgK,GAAI,OAAIA,EAAK9nB,WAAajO,IAAoB+1B,EAAK9nB,WAAajO,MAEhGkW,GAAYhC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACTuN,GAAeC,SAASpP,GADf,QAC1B6D,EAD0B,QAEnBb,SACT0T,GAAW7S,EAASZ,MAEpBmzB,GAAYvyB,EAASZ,MALO,2CAOjC,CAACjD,IAEEoX,GAAiBlC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACdoO,GAAoBC,cAAcjQ,GADpB,QAC/B6D,EAD+B,QAExBb,SACT0T,GAAW7S,EAASZ,MAEpB8yB,EAAalyB,EAASZ,MALW,2CAOtC,CAACjD,IAEEg3B,GAAY9hB,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACTsC,GAAe6F,WADN,QAC1BlG,EAD0B,QAEnBb,SACT0T,GAAW7S,EAASZ,MAEpBgzB,EAASpyB,EAASZ,MALU,2CAOjC,CAACgzB,IA5DoC,8CAmGxC,WAA0B5zB,GAA1B,2BAAAT,EAAA,yDACIS,EAAMsW,iBACN9B,IAAU,GAEJogB,EAAkBxrB,IAAgB5K,GAAyB,GAAK4K,EAClD,KAAhBF,GAAuB2rB,KAL/B,uBAMQxgB,GAAW,6DACXG,IAAU,GAPlB,6BAWS+f,KAXT,oBAY0BC,KAZ1B,kCAaoB3yB,GAAe2E,gBACjB3I,EACAkL,EACAmqB,EACAE,EACgB,KAAhBlqB,EAAqB,KAAO4rB,aAAiB5rB,EAAa,MAAM6rB,sBAChEzV,GACAsV,EACArB,EACAjqB,GACAC,GACAC,GACS,KAATC,GAAc,KAAOA,GACrBC,GA1BlB,6DA4BoB7H,GAAe4E,cACjB5I,EACAkL,EACAmqB,EACAE,EACgB,KAAhBlqB,EAAqB,KAAO4rB,aAAiB5rB,EAAa,MAAM6rB,sBAChEzV,GACAsV,EACArB,EACAjqB,GACAC,GACAC,GACS,KAATC,GAAc,KAAOA,GACrBC,GAzClB,6BAYclI,EAZd,MA2CqBb,SACT0T,GAAW7S,EAASZ,MAEpBkyB,IA9CZ,yCAiD+BxV,GAAkBM,SACrCjgB,EACAg1B,EAAK10B,GACL8K,EACAmqB,EACAE,EACgB,KAAhBlqB,EAAqB,KAAO4rB,aAAiB5rB,EAAa,MAAM6rB,sBAChEzV,GACA6U,GACAS,EACArB,EACAhqB,GACAC,GACS,KAATC,GAAc,KAAOA,GACrBC,GA/DZ,aAiDclI,EAjDd,QAiEqBb,SAjErB,iBAkEY0T,GAAW7S,EAASZ,MAlEhC,4BAAArB,EAAA,iBAoEqBqF,GApErB,yBAAArF,EAAA,2DAqE6C+J,GAAM1E,GAA3B9G,EArExB,EAqEwBA,OAAQ8O,EArEhC,EAqEgCA,WAC2D,IAAvD+lB,EAAKrpB,MAAM2M,QAAO,SAAArM,GAAC,OAAIA,EAAE9L,SAAWA,KAAQ8E,QAtEhF,gCAwE8CkK,GAAeO,cAAc1P,EAAWG,EAAQ8O,EAAU+lB,EAAK10B,IAxE7G,YAwE0B+2B,EAxE1B,QAyEoCr0B,SAzEpC,uBA0EwB0T,GAAW2gB,EAAYp0B,MA1E/C,2CA8EqC,UAAA+xB,EAAKrpB,MAAM2rB,MAAK,SAAArrB,GAAC,OAAIA,EAAE9L,SAAWA,YAAlC,eAA2Co3B,cAAetoB,GA9E/F,kCAgF+CE,GAAeQ,eAAe3P,EAAWG,EAAQ8O,EAAU+lB,EAAK10B,IAhF/G,aAgF0Bk3B,EAhF1B,QAiFqCx0B,SAjFrC,wBAkFwB0T,GAAW8gB,EAAav0B,MAlFhD,yEAoEqBgE,EAAI,EApEzB,aAoE4BA,EAAI0E,GAAM1G,QApEtC,0CAoEqBgC,GApErB,8FAoE8CA,IApE9C,4BAAArF,EAAA,iBAuFqBqF,GAvFrB,iBAAArF,EAAA,yDAwFwBzB,EAAW60B,EAAKrpB,MAAM1E,GAAtB9G,SACgE,IAAlDwL,GAAM2M,QAAO,SAAArM,GAAC,OAAIA,EAAE9L,SAAWA,KAAQ8E,QAzF7E,gCA2FiDkK,GAAeS,mBAAmB5P,EAAWG,EAAQ60B,EAAK10B,IA3F3G,YA2F0Bm3B,EA3F1B,QA4FuCz0B,SA5FvC,uBA6FwB0T,GAAW+gB,EAAex0B,MA7FlD,wEAuFqBgE,EAAI,EAvFzB,aAuF4BA,EAAI+tB,EAAKrpB,MAAM1G,QAvF3C,0CAuFqBgC,GAvFrB,8FAuFmDA,IAvFnD,wBAkGYkuB,IAlGZ,QAsGIte,IAAU,GACV7B,IAvGJ,6CAnGwC,sBA6MxC,SAASkD,GAAY7V,GAAQ,IAAD,EACOA,EAAMC,OAA7BsE,EADgB,EAChBA,MAAO7F,EADS,EACTA,KAAMoX,EADG,EACHA,MACrB,OAAQpX,GACJ,IAAK,WACDy0B,EAAY5uB,GACZ,MACJ,IAAK,UACD8uB,EAAW9uB,GACX,MACJ,IAAK,cACD+uB,EAAe/uB,GACf,MACJ,IAAK,QACDyuB,EAASzuB,GACT,MACJ,IAAK,iBACD0uB,EAAkB1uB,GAClB,MACJ,IAAK,WACDinB,EAAYjnB,GACZ,MACJ,IAAK,cACDsvB,EAAetvB,GACf,MACJ,IAAK,YACDivB,EAASjvB,GACT,MACJ,IAAK,QACD2vB,GAAQ3vB,GACR,MACJ,IAAK,QACD0tB,KACKpxB,GAAkBiV,EAAM,IAKzB+J,GAAS,KAJTA,GAAS/J,EAAM,IACfse,IAAe,GACfjC,GAAe,CAACrc,EAAM,IAAKwe,MAkD3C,SAASO,KACL,IAAMQ,EAAYP,aAAiB5rB,EAAa,MAChD,YAAqB3G,IAAd8yB,GAA2BA,EAAUC,UAGhD,OAxOAziB,IAAMyH,WAAU,WAAO,IAAD,sEAClB,sBAAA/a,EAAA,sEACUsV,KADV,uBAEUE,KAFV,uBAGU4f,KAHV,4CADkB,sBAMlB1C,KACAkB,EAAW,iBAACR,QAAD,IAACA,OAAD,EAACA,EAAM3pB,iBAAP,QAAoB,IAC/BqqB,EAAU,iBAACV,QAAD,IAACA,OAAD,EAACA,EAAM1pB,gBAAP,QAAmB,IAC7BqqB,EAAc,iBAACX,QAAD,IAACA,OAAD,EAACA,EAAMzpB,mBAAP,QAAsB,IACpCsiB,EAAW,iBAACmH,QAAD,IAACA,OAAD,EAACA,EAAM90B,gBAAP,QAAmB,IAC9Bm1B,EAAQ,iBAACL,QAAD,IAACA,OAAD,EAACA,EAAM5pB,aAAP,QAAgB,IACxBkqB,EAAiB,iBAACN,QAAD,IAACA,OAAD,EAACA,EAAMjpB,sBAAP,QAAyB,IAC1C8pB,EAAQ,iBAACb,QAAD,IAACA,OAAD,EAACA,EAAMjlB,mBAAP,QAAsB,IAC9BmmB,EAAc,iBAAClB,QAAD,IAACA,OAAD,EAACA,EAAM4C,qBAAP,QAAwB/2B,IACtCuU,IAAS,iBAAC4f,QAAD,IAACA,OAAD,EAACA,EAAMrpB,aAAP,QAAgB,IAAIgM,KAAI,SAAA1L,GAAC,MAAK,CAAE9L,OAAQ8L,EAAE9L,OAAQ8O,SAAUhD,EAAEsrB,WAAYx2B,KAAMkL,EAAElL,UAC3Fs1B,GAAqB,iBAACrB,QAAD,IAACA,OAAD,EAACA,EAAMppB,0BAAP,UACrBsW,GAAQ,iBAAC8S,QAAD,IAACA,OAAD,EAACA,EAAMxB,gBAAP,QAAmB,IAC3B8C,GAAqB,iBAACtB,QAAD,IAACA,OAAD,EAACA,EAAMnpB,0BAAP,UACrB0qB,GAAO,iBAACvB,QAAD,IAACA,OAAD,EAACA,EAAMlpB,YAAP,QAAe,IAClB7J,IACA0U,IAAW,GArBG,0CAsBdvV,GAAO0B,MAAK,kBAAM6T,IAAW,SAElC,CAACqe,EAAM/yB,EAAMiV,GAAWE,GAAgB4f,KAiNvC,oCACI,kBAACpa,GAAA,EAAD,CAAQ3a,KAAMA,EAAMkS,SAAS,MACzB,0BAAM6J,SA1SsB,8CA2SxB,kBAACC,GAAA,EAAD,sBACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,SAChB,iDAGR,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,YAAYnU,MAAO1G,EAAUmb,SAAUnD,GAAanX,KAAK,WAAW0b,SAAUma,KAAczY,UAAQ,EAAC5B,WAAS,KAEpJ,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,gBAAgBnU,MAAOwE,EAAOiQ,SAAUnD,GAAanX,KAAK,QAAQod,UAAQ,EAAC5B,WAAS,KAEzHua,GACG,kBAAC1c,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,+BAA+BnU,MAAOmF,EAAgBsP,SAAUnD,GAAanX,KAAK,iBAAiBwb,WAAS,KAElJ,KACJ,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAACmkB,GAAI,EAAGzd,GAAI,IAClB,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,aAAanU,MAAO2uB,EAAUla,SAAUnD,GAAanX,KAAK,WAAWod,UAAQ,EAAC5B,WAAS,KAE7H,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAACmkB,GAAI,EAAGzd,GAAI,IAClB,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,YAAYnU,MAAO6uB,EAASpa,SAAUnD,GAAanX,KAAK,UAAUod,UAAQ,EAAC5B,WAAS,KAE1H,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACIrB,QAAQ,SACRQ,MAAM,eACNnU,MAAO2E,EACP8P,SAAUnD,GACVnX,KAAK,cACLwb,WAAS,EACTnZ,MAAuB,KAAhBmI,IAAuB2rB,KAC9B9H,WACoB,KAAhB7jB,EAAqB,oCAAuC2rB,KAA6CC,aAAiB5rB,EAAa,MAAMwsB,QAA7D,0BAI5F,kBAAC3d,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuV,GAAA,EAAD,CACIC,QAAS,kBAACC,GAAA,EAAD,CAAUb,QAASrjB,GAAoByP,SAAU,SAAApP,GAAC,OAAIoqB,GAAsBpqB,EAAE3J,OAAO2sB,UAAUvgB,MAAM,YAC9GqM,MAAM,0BAGd,kBAACX,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuV,GAAA,EAAD,CACIC,QAAS,kBAACC,GAAA,EAAD,CAAUb,QAASpjB,GAAoBwP,SAAU,SAAApP,GAAC,OAAIqqB,GAAsBrqB,EAAE3J,OAAO2sB,UAAUvgB,MAAM,YAC9GqM,MAAM,2BAGd,kBAACX,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,mBAAf,QACA,kBAAC03B,GAAA,EAAD,CAAQC,QAAQ,kBAAkBrxB,MAAOkF,GAAMuP,SAAUnD,GAAanX,KAAK,QAAQwZ,QAAQ,UACtFyb,EAAMre,KAAI,SAAA1L,GAAC,OACR,kBAACsC,GAAD,CAAczH,IAAKmF,EAAGrF,MAAOqF,GACxBA,UAMnBgpB,GACE,kBAAC7a,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,sBAAf,gBACA,kBAAC03B,GAAA,EAAD,CAAQC,QAAQ,qBAAqBrxB,MAAO6E,EAAa4P,SAAUnD,GAAanX,KAAK,cAAcwZ,QAAQ,UACtGzZ,GAAawX,QAAO,SAAArM,GAAC,QAAKmpB,IAAoBv0B,KAAqBq0B,IAAqBjpB,EAAE3L,KAAOO,MAAyB8W,KAAI,SAAA1L,GAAC,OAC5H,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAC7B2L,EAAElL,YAO1B0K,IAAgB5K,GACb,oCACI,kBAACuZ,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,oBAAf,cACA,kBAAC03B,GAAA,EAAD,CAAQC,QAAQ,mBAAmBrxB,MAAOgvB,EAAOva,SAAUnD,GAAanX,KAAK,YAAYwZ,QAAQ,UAC5Fub,EAAUne,KAAI,SAAA1L,GAAC,OACZ,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAC7B2L,EAAElL,YAMvB,kBAACqZ,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,KACf,kBAACD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,SAChB,qDAGR,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACW,GAAA,EAAD,CACIC,UAAQ,EACRC,QAASib,GAASxe,KAAI,SAAA1L,GAAC,MAAK,CAAE9L,OAAQ8L,EAAE3L,GAAI2O,SAAU,KAAMlO,KAAMkL,EAAElL,SACpEoa,eAAgB,SAAA4b,GAAI,OAAIA,EAAKh2B,MAC7Bqa,kBAAmB,SAACnP,EAAGisB,GAAJ,OAAUjsB,EAAE9L,SAAW+3B,EAAE/3B,QAC5CuZ,UAAWzC,GAAQ1C,WACnB3N,MAAO+E,GACP0P,SAAU,SAACC,EAAG4c,GAAJ,OAAU9iB,GAAS8iB,IAC7Bn3B,KAAK,QACL0b,SAAUrI,GACVqH,uBAAqB,EACrBC,YAAa,SAAAC,GAAM,OACf,kBAACC,GAAA,EAAD,iBACQD,EADR,CAEIpB,QAAQ,SACRQ,MAAK,eAA2B,IAAjBpP,GAAM1G,OAAe,GAAK,MACzCkZ,SAA2B,IAAjBxS,GAAM1G,OAChB4W,gBAAiB,CACbC,QAAQ,OAIpBC,WAAY,SAACnV,EAAOoV,GAAR,OACRpV,EAAM+Q,KAAI,SAACsE,EAAQpV,GAAT,OAAmB,kBAACqV,GAAA,EAAD,eAAMpV,IAAKD,EAAO6H,MAAM,UAAUqM,MAAOkB,EAAOlb,MAAUib,EAAY,CAAEnV,mBAvK9I8E,GAAMgM,KAAI,SAAC1L,EAAGhF,GAAO,IAChBlG,EAA2BkL,EAA3BlL,KAAMkO,EAAqBhD,EAArBgD,SAAU9O,EAAW8L,EAAX9L,OACxB,OACI,kBAACia,GAAA,EAAD,CAAMtT,IAAKG,EAAG0M,MAAI,EAAC0G,GAAI,IACnB,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAE,eAAU2G,EAAV,gBAA2BlG,EAAzC,SACA,kBAACi3B,GAAA,EAAD,CAAQC,QAAO,eAAUhxB,EAAV,eAA0BL,MAAK,OAAEqI,QAAF,IAAEA,IAAY,GAAIoM,SAAU,SAAApP,GAAC,OAX/F,SAA8B9L,EAAQ2N,GAClCsH,GAASzJ,GAAMgM,KAAI,SAAA1L,GAAC,OAAKA,EAAE9L,SAAWA,EAAb,2BAA2B8L,GAA3B,IAA8BgD,SAAUnB,IAAS7B,MAUqBksB,CAAqBh4B,EAAQ8L,EAAE3J,OAAOsE,QAAQ7F,KAAK,WAAWwZ,QAAQ,UAChJtZ,GAAUqX,QAAO,SAAArM,GAAC,QAAKmpB,IAAoBv0B,KAAqBq0B,IAAqBjpB,EAAE3L,KAAOU,MAAsB2W,KAAI,SAAA1L,GAAC,OACtH,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAC7B2L,EAAElL,gBAoKC,KACJ,kBAACqZ,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,OAGvB,kBAACD,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,SAChB,gDAGR,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYzC,QAAM,GAAlB,SACA,kBAAC0C,GAAA,EAAD,CACIle,GAAG,eACHme,mBAAiB,gBACjBC,KAAK,OACL3d,KAAK,QACLq3B,WAAY,CACRC,OAAQ,WAEZhd,SAAUnD,GACVqE,WAAS,MAIrB,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+Z,GAAD,CAAWzS,MA/W/C,WAAqB,IAAD,EAChB,iBAAO4S,KAAgB,UAAvB,QAAwC,KAAV5S,GAAe+R,KAAU/R,GA8WL2W,GAAYtjB,QA3WlE,WACIsf,KACApS,GAAS,IACTuU,IAAe,IAwW0Eha,SAAoB,KAAVkF,UAMvF,kBAAChD,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAAU7F,GAAQ8H,KAAK,UAA/C,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,aA9LZ,kBAAC4H,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBuT,IAAUzB,QAAS,kBAAM0B,GAAW,QACjE,kBAACuH,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACI,kBAAC,GAAD,CAAOhM,OAAO,wBAAwBJ,KAAM2E,MAEhD,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM/C,GAAW,QAAlD,S,8CChTpB,WAAsC1W,EAAWC,GAAjD,eAAA2B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAkCC,EAAWC,GAAS4K,GAC7E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAkCjL,GAAlC,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA6BC,GAAY6K,GAChE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAiCjL,EAAWQ,GAA5C,eAAAoB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA4BC,EAAWQ,GAAeqK,GAC7E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAsCjL,EAAWu4B,GAAjD,eAAA32B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAsCC,GAAYu4B,EAAe1tB,GACzF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA2CjL,GAA3C,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAuCC,GAAY6K,GAC1E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WACIjL,EACAqQ,EACAmoB,EACAp4B,EACAq4B,EACAnQ,EACAoQ,EACAC,EACAC,EACAC,EACAC,EACAC,EACAvZ,EACAH,EACAI,EACAuZ,GAhBJ,iBAAAp3B,EAAA,sEAkB8BsC,GAAeuE,iBAlB7C,cAkBUoC,EAlBV,OAmBUouB,EAAkB,CACpB5oB,QACAmoB,YACAp4B,aACAq4B,iBACAnQ,QACAoQ,MACAC,eACAC,gBACAC,mBACAC,wBACAC,YACAvZ,UACAH,UACAI,eACAuZ,wBAlCR,kBAoCWjuB,IAAMC,KAAKpL,EAAWG,GAA4BC,GAAYi5B,EAAiBpuB,GACjF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAzC1C,4C,oEA6CA,WACIjL,EACAM,EACA+P,EACAmoB,EACAp4B,EACAq4B,EACAnQ,EACAoQ,EACAC,EACAC,EACAC,EACAC,EACAC,EACAvZ,EACAH,EACAI,EACAuZ,GAjBJ,iBAAAp3B,EAAA,sEAmB8BsC,GAAeuE,iBAnB7C,cAmBUoC,EAnBV,OAoBUouB,EAAkB,CACpB34B,KACA+P,QACAmoB,YACAp4B,aACAq4B,iBACAnQ,QACAoQ,MACAC,eACAC,gBACAC,mBACAC,wBACAC,YACAvZ,UACAH,UACAI,eACAuZ,wBApCR,kBAsCWjuB,IAAMC,KAAKpL,EAAWG,GAA6BC,GAAYi5B,EAAiBpuB,GAClF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OA3C1C,4C,oEA+CA,WAA2CjL,GAA3C,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAwCC,GAAY6K,GAC3E/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAwCjL,EAAWG,GAAnD,eAAAyB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAqCC,EAAWG,GAAS0K,GAChF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAwCjL,EAAWC,GAAnD,eAAA2B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAqCC,EAAWC,GAAS4K,GAChF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAoCjL,EAAWC,EAAQQ,GAAvD,eAAAmB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA0BC,EAAWC,EAAQQ,GAAeoK,GACnF/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAmCjL,GAAnC,+BAAA4B,EAAA,6DAA8CzB,EAA9C,+BAAuD,KAAMF,EAA7D,+BAAsE,KAAtE,SAC8BiE,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA0BC,EAAWkD,GAAkB/C,GAAU,KAAOA,EAAQ+C,GAAkBjD,GAAU,KAAOA,GAAS4K,GACnJ/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAqCjL,GAArC,6BAAA4B,EAAA,6DAAgDzB,EAAhD,+BAAyD,KAAzD,SAC8B+D,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA4BC,EAAWkD,GAAkB/C,GAAU,KAAOA,GAAS0K,GAC1G/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAqCjL,GAArC,6BAAA4B,EAAA,6DAAgDzB,EAAhD,+BAAyD,KAAzD,SAC8B+D,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA6BC,EAAWkD,GAAkB/C,GAAU,KAAOA,GAAS0K,GAC3G/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,sBAWeiuB,OAjPc,CACzBC,uB,+CACAC,mB,6CACAC,uB,+CACAC,kB,+CACAC,4B,6CACAC,kB,2EACAC,mB,6EACAC,4B,6CACAC,yB,+CACAC,yB,+CACAC,qB,iDACAC,oB,6CACAC,sB,6CACAC,sB,4FCTJ,WAA2C/5B,EAAQg6B,GAAnD,iBAAAr4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEUqvB,EAAQ,CACVj6B,SACAg6B,qBAJR,kBAOWlvB,IAAMC,KAAKpL,EAAWG,GAAyCm6B,EAAOrvB,GACxE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,oEAgBA,WAA4ChL,EAAQk6B,EAAcF,GAAlE,iBAAAr4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEUqvB,EAAQ,CACVj6B,SACAk6B,eACAF,qBALR,kBAQWlvB,IAAMC,KAAKpL,EAAWG,GAA0Cm6B,EAAOrvB,GACzE/H,MAAK,SAAAe,GACF,OAAO1B,IAAiB,EAAO0B,EAASZ,KAAMY,MAEjD4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAb1C,4C,sBAiBemvB,OAtC2B,CACtCC,4B,+CACAC,6B,kDCCE/nB,GAAYC,cAAW,iBAAO,CAChC+B,WAAY,CACR,uBAAwB,CACpBC,WAAY,GACZC,cAAe,IAGvB8lB,SAAU,CACNC,aAAa,iBACbnmB,QAAS,OACTC,WAAY,SACZE,WAAY,EACZC,cAAe,EACf,kBAAmB,CACfrB,MAAO,OAEX,uBAAwB,CACpBe,SAAU,OAEd,gCAAiC,CAC7BsmB,OAAQ,aAKL,SAASC,GAAsB7oB,GAAQ,IAC1CmjB,EAAmCnjB,EAAnCmjB,KAAM/yB,EAA6B4P,EAA7B5P,KAAM+S,EAAuBnD,EAAvBmD,QAAShV,EAAc6R,EAAd7R,UADoB,EAEHkV,IAAMC,SAAS,IAFZ,oBAE1CwlB,EAF0C,KAEzBC,EAFyB,OAGnB1lB,IAAMC,SAAS,MAHI,oBAG1CsB,EAH0C,KAGjCC,EAHiC,OAInBxB,IAAMC,UAAS,GAJI,oBAI1Cf,EAJ0C,KAIjCuC,EAJiC,OAKrBzB,IAAMC,UAAS,GALM,oBAK1CyB,EAL0C,KAKlCC,EALkC,KAO3CI,EAAU1E,KAEhB2C,IAAMyH,WAAU,WAAM,4CAGlB,4BAAA/a,EAAA,sEAC8Bi5B,EAAwB76B,GADtD,UAES6E,GADCi2B,EADV,wCAGcC,EAAyBD,GAHvC,4CAHkB,sBACb9F,GADa,0CASlB5zB,GAAO0B,MAAK,kBAAM6T,GAAW,QAC9B,CAACqe,EAAM/yB,IAEV,IAAM44B,EAAuB,uCAAG,4BAAAj5B,EAAA,sEACLs3B,GAAqBC,uBAAuBn5B,EAA5C,OAAuDg1B,QAAvD,IAAuDA,OAAvD,EAAuDA,EAAM10B,IADxD,YACtBuD,EADsB,QAEfb,SAFe,gBAGxB0T,EAAW7S,EAASZ,MACpB0T,GAAW,GAJa,8BAMxBikB,EAAmB/2B,EAASZ,MANJ,kBAOjBY,EAASZ,MAPQ,iCASrB,IATqB,4CAAH,qDAYvB83B,EAAwB,uCAAG,WAAMD,GAAN,qBAAAl5B,EAAA,sEACNw4B,GAAkCC,4BACrDrF,EAAK10B,GACLw6B,EAAYnjB,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,OAHE,OAK7B,IAJMuD,EADuB,QAKhBb,SACT0T,EAAW7S,EAASZ,MACpB0T,GAAW,OACR,CAGH,IAFMqkB,EAAqB,GADxB,WAGM/zB,GACL,IAAMZ,EAAOy0B,EAAY7zB,GACnBg0B,EAAYp3B,EAASZ,KAAKq0B,MAAK,SAAA4D,GAAC,OAAIA,EAAEC,mBAAqB90B,EAAK/F,MAChE86B,EAAQ/0B,EAAK2yB,qBAAqB1B,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,MAAF,OAAS26B,QAAT,IAASA,OAAT,EAASA,EAAWI,gBACtEL,EAAmB90B,KAAnB,2BAA6BG,GAA7B,IAAmCi1B,cAAgBp4B,GAAkBk4B,GAA6B,KAAhD,OAA4BA,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAOG,WAAmBC,gBAAe,OAAEJ,QAAF,IAAEA,OAAF,EAAEA,EAAO96B,OAJ3H2G,EAAI,EAAGA,EAAI6zB,EAAY71B,OAAQgC,IAAM,EAArCA,GAMT2zB,EAAmBI,GAjBM,2CAAH,sDAqBxBS,EAA4B,uCAAG,gCAAA75B,EAAA,6DACjCiV,GAAU,GACJsjB,EAAeQ,EAAgBhjB,KAAI,SAAA1L,GAAC,OAAIA,EAAEuvB,mBAC1CE,EAAgBf,EAAgBhjB,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MAHhB,SAKV85B,GAAkCE,6BAA6BtF,EAAK10B,GAAI65B,EAAcuB,GAL5E,QAK3B73B,EAL2B,QAMpBb,SACT0T,EAAW7S,EAASZ,OAEpB4T,GAAU,GACV7B,KAEJ6B,GAAU,GAZuB,2CAAH,qDA4ClC,OACI,oCACI,kBAAC+F,GAAA,EAAD,CAAQ3a,KAAMA,EAAMkS,SAAS,MACzB,kBAAC8J,GAAA,EAAD,oCACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACTjG,EAeI,KAdAumB,EACKriB,QAAO,SAAArM,GAAC,OAAsC,IAAlCA,EAAE+sB,qBAAqB/zB,UACnC0S,KAAI,SAACtR,EAAMY,GAAO,IAAD,EACd,OACI,kBAACmT,GAAA,EAAD,CAAMtT,IAAKG,EAAG0M,MAAI,EAAC0G,GAAI,IACnB,yBAAKX,UAAWzC,EAAQsjB,UACpB,yBAAK7gB,UAAU,gBACX,kBAACY,GAAA,EAAD,CAAYC,QAAQ,SAASlU,EAAKgK,QAEtC,kBAACuL,GAAA,EAAD,CAAWrB,QAAQ,WAAWmE,KAAK,SAASrD,SAAU,SAAApP,GAAC,OA9CvE,SAACA,EAAGkvB,GAAsB,IAAD,EACjDv0B,EAAQqF,EAAE3J,OAAOsE,MAEvB,GAAK,WAAWP,KAAKO,GAArB,CAEA,IAAMy0B,EAAW,UAAGV,EAAgBrD,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAO66B,KAAkBnC,qBAAqB1B,MAAK,SAAArrB,GAAC,OAAIA,EAAEsvB,YAAc30B,YAAvG,aAAG,EAA4GtG,GAEhI,IAAI4C,GAAkBm4B,IAAyB,GAATz0B,EAAtC,CAEA,IAAM+0B,EAAQ,aAAOhB,EAAgBhjB,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,IAAM66B,EAAR,2BAAgClvB,GAAhC,IAAmCqvB,cAAe10B,EAAO40B,gBAAiBH,IAAgBpvB,MACzI2uB,EAAmBe,KAoCsFC,CAA0B3vB,EAAG5F,EAAK/F,KAAKsG,MAAK,UAAEP,EAAKi1B,qBAAP,QAAwB,YASrK,kBAAC3c,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASgiB,EAA8Bhf,SAAU7F,GAAUxC,EAASsK,KAAK,UAAjG,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,YA5CR,kBAAC4H,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBuT,GAAUzB,QAAS,kBAAM0B,EAAW,QACjE,kBAACuH,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACI,kBAAC,GAAD,CAAOhM,OAAO,wBAAwBJ,KAAM2E,KAEhD,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM/C,EAAW,QAAlD,SCjHL,SAASmlB,GAAehqB,GAAQ,IACnCmjB,EAAmCnjB,EAAnCmjB,KAAM/yB,EAA6B4P,EAA7B5P,KAAM+S,EAAuBnD,EAAvBmD,QAAShV,EAAc6R,EAAd7R,UADa,EAEIkV,IAAMC,SAAS,IAFnB,oBAEnC2mB,EAFmC,KAElBC,EAFkB,OAGF7mB,IAAMC,SAAS,IAHb,oBAGnC6mB,EAHmC,KAGrBC,EAHqB,OAIF/mB,IAAMC,SAAS,IAJb,oBAInC+mB,EAJmC,KAIrBC,EAJqB,OAKHjnB,IAAMC,SAAS,MALZ,oBAKnCM,EALmC,KAKtB2mB,EALsB,OAMZlnB,IAAMC,UAAS,GANH,oBAMnCf,EANmC,KAM1BuC,EAN0B,OAOZzB,IAAMC,SAAS,MAPH,oBAOnCsB,EAPmC,KAO1BC,EAP0B,KASpC2lB,EAAkBnnB,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACf+d,GAAkBO,uBAAuBlgB,EAAWg1B,EAAK10B,IAD1C,QAChCuD,EADgC,QAEzBb,SACT0T,EAAW7S,EAASZ,MAEpB84B,EAAmBl4B,EAASZ,KAAKq5B,OALC,2CAOvC,CAACt8B,EAAWg1B,IAGf9f,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,6DACIq6B,EAAgB,IADpB,SAEUI,IAFV,4CADkB,sBAMdp6B,IACA0U,GAAW,GAPI,WAAD,+BAQdvV,GAAO0B,MAAK,kBAAM6T,GAAW,SAElC,CAACqe,EAAM/yB,EAAMo6B,IAEhB,IA6CIE,EA7CEC,EAAmBtnB,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEAChB+d,GAAkBQ,2BAA2BngB,EAAWg1B,EAAK10B,GAAI07B,GADjD,QACjCn4B,EADiC,QAE1Bb,SACT0T,EAAW7S,EAASZ,OAEpBk5B,EAAgBH,GAChBI,EAAgBv4B,EAASZ,OANU,2CAQxC,CAACjD,EAAWg1B,EAAMgH,EAAcI,EAAiBD,IAsCpD,GAAmB,MAAf1mB,EAAqB,CACrB,IAAM0M,EAAO,IAAIsa,KAAK,CArC1B,SAA6BC,GAIzB,IAHA,IAAIC,EAAeh7B,OAAOi7B,KAAKF,GAC3BG,EAAYF,EAAa13B,OACzB63B,EAAQ,IAAIC,WAAWF,GAClB51B,EAAI,EAAGA,EAAI41B,EAAW51B,IAAK,CAChC,IAAI+1B,EAAQL,EAAaM,WAAWh2B,GACpC61B,EAAM71B,GAAK+1B,EAEf,OAAOF,EA6BgBI,CAAoBznB,IAAe,CAAEiJ,KAAM,sEAClE6d,EAAO56B,OAAOw7B,IAAIC,gBAAgBjb,GAEtC,OACI,oCACI,kBAACvF,GAAA,EAAD,CAAQ3a,KAAMA,EAAMkS,SAAS,KAAKoI,WAAS,GACvC,kBAAC0B,GAAA,EAAD,0BACA,kBAACC,GAAA,EAAD,KACI,kBAACc,GAAD,CAAgB5K,QAASA,IACzB,kBAACgG,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,qBAAf,0BACA,kBAAC03B,GAAA,EAAD,CAAQzd,QAAQ,SAAS0d,QAAQ,oBAAoBrxB,MAAOo1B,EAAc3gB,SAAU,SAAApP,GAAC,OAAIgwB,EAAgBhwB,EAAE3J,OAAOsE,QAAQuX,UAAQ,EAAC5B,WAAS,GACxI,kBAAChO,GAAD,CAAczH,IAAI,UAAUF,MAAM,IACF,IAA3Bk1B,EAAgB72B,OAAe,yBAA2B,wBAE9D62B,EAAgBnkB,KAAI,SAAA1L,GAAC,OAClB,kBAACsC,GAAD,CAAczH,IAAKmF,EAAGrF,MAAOqF,GACxBvB,IAAOuB,GAAGwb,OAAO,kBAMtC,kBAACrN,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS+iB,EAAkB/f,SAA2B,KAAjBuf,GAAuBA,IAAiBE,EAAc3f,WAAS,GAA5H,aAIa,OAAhB9G,EACG,kBAAC2E,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CACI1N,MAAM,UACNqhB,KAAMwM,EACNj6B,OAAO,SACP+6B,IAAI,sBACJC,SAAQ,UAAKtI,EAAK3pB,UAAV,YAAuB2pB,EAAK1pB,SAA5B,YAAwCZ,IAAOwxB,GAAczU,OAAO,WAApE,SACRlL,WAAS,GANb,YAQc7R,IAAOwxB,GAAczU,OAAO,aAG9C,OAGZ,kBAAC9I,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAzExC,WACI2iB,EAAgB,MAChBH,EAAgB,IAChBE,EAAgB,IAEhBnnB,MAoEY,WA/DR,kBAAC4H,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBuT,GAAUzB,QAAS,kBAAM0B,EAAW,QACjE,kBAACuH,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACI,kBAAC,GAAD,CAAOhM,OAAO,wBAAwBJ,KAAM2E,KAEhD,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM/C,EAAW,QAAlD,SCnEL,SAAS6mB,GAAe1rB,GAAQ,IACnC5P,EAA6B4P,EAA7B5P,KAAM+S,EAAuBnD,EAAvBmD,QAAShV,EAAc6R,EAAd7R,UADmB,EAEhBkV,IAAMC,SAAS,IAFC,oBAEnCxJ,EAFmC,KAE5ByJ,EAF4B,OAGFF,IAAMC,SAAS,IAHb,oBAGnCqoB,EAHmC,KAGrBC,EAHqB,OAIhBvoB,IAAMC,SAAS,IAJC,oBAInCuoB,EAJmC,KAI5BC,EAJ4B,OAKAzoB,IAAMC,SAAS,IALf,oBAKnCyoB,EALmC,KAKpBC,EALoB,OAMJ3oB,IAAMC,SAAS,MANX,oBAMnC2oB,EANmC,KAMtBC,EANsB,OAON7oB,IAAMC,SAAS,QAPT,oBAOnC6oB,EAPmC,KAOvBC,EAPuB,OAQF/oB,IAAMC,SAASzK,IAAOwzB,OARpB,oBAQnChC,EARmC,KAQrBC,EARqB,OASHjnB,IAAMC,SAAS,MATZ,oBASnCM,EATmC,KAStB2mB,EATsB,OAUZlnB,IAAMC,UAAS,GAVH,oBAUnCf,EAVmC,KAU1BuC,EAV0B,OAWZzB,IAAMC,SAAS,MAXH,oBAWnCsB,EAXmC,KAW1BC,EAX0B,KAc1CxB,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,sEAC+BuN,GAAeC,SAASpP,GADvD,YACUshB,EADV,QAEqBte,SAFrB,uBAGQ0T,EAAW4K,EAAare,MAHhC,0BAMImS,EAASkM,EAAare,MAN1B,4CADkB,sBAUlB0T,GAAW,GAVQ,WAAD,+BAWlBvV,GAAO0B,MAAK,kBAAM6T,GAAW,QAC9B,CAAC3W,EAAWoV,IAEfF,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,0DACQsB,GAAkBs6B,IAAkC,KAAjBA,EAD3C,uBAEQG,EAAS,IACTE,EAAiB,IAHzB,0CAM+B1uB,GAAeM,aAAazP,EAAWw9B,GANtE,YAMUW,EANV,QAOqBn7B,SAPrB,wBAQQ0T,EAAWynB,EAAal7B,MARhC,2BAWI06B,EAASQ,EAAal7B,MACtB46B,EAAiB,IAZrB,6CADkB,sBAgBlBlnB,GAAW,GAhBQ,WAAD,+BAiBlBynB,GAAYt7B,MAAK,kBAAM6T,GAAW,QACnC,CAAC3W,EAAW29B,EAAUH,IAEzB,IAkEIjB,EAlEEC,EAAmBtnB,IAAMiC,YAAN,sBAAkB,8BAAAvV,EAAA,0DACnCsB,GAAkBs6B,IAAkC,KAAjBA,EADA,uBAEnC9mB,EAAW,0CAFwB,6BAKV,IAAzBknB,EAAc34B,OALqB,uBAMnCyR,EAAW,qCANwB,iCASvCC,GAAW,GACLqlB,EAAetxB,IAAOC,IAAP,aAAiBmzB,EAAjB,YAAgCE,GAAc,cAV5B,UAYhBre,GAAkBS,0BAA0BpgB,EAAW49B,EAAeJ,EAAcxB,EAAaqC,eAZjF,SAYjCx6B,EAZiC,QAa1Bb,SACT0T,EAAW7S,EAASZ,OAEpBk5B,EAAgBH,GAChBI,EAAgBv4B,EAASZ,OAE7B0T,GAAW,GAnB4B,4CAoBxC,CAAC3W,EAAWw9B,EAAcI,EAAeE,EAAaE,EAAY5B,EAAiBD,IA+CtF,GAAmB,MAAf1mB,EAAqB,CACrB,IAAM0M,EAAO,IAAIsa,KAAK,CA9C1B,SAA6BC,GAIzB,IAHA,IAAIC,EAAeh7B,OAAOi7B,KAAKF,GAC3BG,EAAYF,EAAa13B,OACzB63B,EAAQ,IAAIC,WAAWF,GAClB51B,EAAI,EAAGA,EAAI41B,EAAW51B,IAAK,CAChC,IAAI+1B,EAAQL,EAAaM,WAAWh2B,GACpC61B,EAAM71B,GAAK+1B,EAEf,OAAOF,EAsCgBI,CAAoBznB,IAAe,CAAEiJ,KAAM,sEAClE6d,EAAO56B,OAAOw7B,IAAIC,gBAAgBjb,GAEtC,OACI,oCACI,kBAACvF,GAAA,EAAD,CAAQ3a,KAAMA,EAAMkS,SAAS,KAAKoI,WAAS,GACvC,kBAAC0B,GAAA,EAAD,0BACA,kBAACC,GAAA,EAAD,KACI,kBAACc,GAAD,CAAgB5K,QAASA,IACzB,kBAACgG,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,qBAAf,QACA,kBAAC03B,GAAA,EAAD,CAAQzd,QAAQ,SAAS0d,QAAQ,oBAAoBrxB,MAAO42B,EAAcniB,SAAU,SAAApP,GAAC,OAAIwxB,EAAgBxxB,EAAE3J,OAAOsE,QAAQuX,UAAQ,EAAC5B,WAAS,GACvI5Q,EAAMgM,KAAI,SAAA1L,GAAC,OACR,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAC7B2L,EAAElL,YAMvB,kBAACqZ,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,sBAAf,SACA,kBAAC03B,GAAA,EAAD,CAAQzd,QAAQ,SAAS0d,QAAQ,qBAAqBrxB,MAAOg3B,EAAeviB,SAAU,SAAApP,GAAC,OAAI4xB,EAAiB5xB,EAAE3J,OAAOsE,QAAQuX,UAAQ,EAAC5B,WAAS,EAACtB,UAAQ,GACnJyiB,EAAM/lB,KAAI,SAAA1L,GAAC,OACR,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAAlC,UAA0C2L,EAAEZ,UAA5C,YAAyDY,EAAEX,iBAK3E,kBAAC8O,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,uBAAf,SACA,kBAAC03B,GAAA,EAAD,CAAQzd,QAAQ,SAAS0d,QAAQ,sBAAsBrxB,MAAOk3B,EAAaziB,SAAU,SAAApP,GAAC,OAAI8xB,EAAe9xB,EAAE3J,OAAOsE,QAAQuX,UAAQ,EAAC5B,WAAS,GACxI,kBAAChO,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,MAGA,kBAAC2H,GAAD,CAAczH,IAAK,KAAMF,MAAO,MAAhC,SAMZ,kBAACwT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,UACpC,kBAACgE,GAAA,EAAD,CAAYje,GAAG,qBAAf,QACA,kBAAC03B,GAAA,EAAD,CAAQzd,QAAQ,SAAS0d,QAAQ,oBAAoBrxB,MAAOo3B,EAAY3iB,SAAU,SAAApP,GAAC,OAAIgyB,EAAchyB,EAAE3J,OAAOsE,QAAQuX,UAAQ,EAAC5B,WAAS,GA1FpK,WAGI,IAFA,IAAI+hB,EAAW5zB,IAAO,aAAc,cAC9B6zB,EAAQ,GACPD,EAAS1zB,eAAeF,IAAOwzB,QAClCK,EAAMr4B,KAAKo4B,EAAS7W,OAAO,SAC3B6W,EAAWA,EAASj9B,IAAI,EAAG,QAE/B,OAAOk9B,EAoFsBC,GAAgB7mB,KAAI,SAAA1L,GAAC,OAClB,kBAACsC,GAAD,CAAczH,IAAKmF,EAAGrF,MAAOqF,GACxBA,SAOrB,kBAACmO,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS+iB,EAAkB/f,SAA2B,KAAjB+gB,GAAgD,IAAzBI,EAAc34B,OAAcsX,WAAS,GAAzH,aAIa,OAAhB9G,EACG,kBAAC2E,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CACI1N,MAAM,UACNqhB,KAAMwM,EACNj6B,OAAO,SACP+6B,IAAI,sBACJC,SAAQ,UAAK3xB,EAAM2rB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOk9B,KAAcz8B,KAA5C,YAAoD2J,IAAOwxB,GAAczU,OAAO,WAAhF,SACRlL,WAAS,GANb,YAQc7R,IAAOwxB,GAAczU,OAAO,aAG9C,OAGZ,kBAAC9I,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAjJxC,WACI2iB,EAAgB,MAChBD,EAAgB,IAEhBnnB,MA6IY,WAxIR,kBAAC4H,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBuT,GAAUzB,QAAS,kBAAM0B,EAAW,QACjE,kBAACuH,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACI,kBAAC,GAAD,CAAOhM,OAAO,wBAAwBJ,KAAM2E,KAEhD,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM/C,EAAW,QAAlD,S,yBCvGdnE,I,OAAYC,cAAW,iBAAO,CAChC/D,KAAM,CACF2E,MAAO,OACPR,OAAQ,IACRyB,QAAS,OACTH,eAAgB,SAChBI,WAAY,SACZmqB,UAAW,gCACXlb,aAAc,EACdxB,OAAQ,QAIT,SAAS2c,KACZ,IAAMznB,EAAU1E,KAEhB,OAAO,yBAAKmH,UAAS,UAAKzC,EAAQxI,KAAb,eCazB,IAAM8D,GAAYC,cAAW,iBAAO,CAChCmsB,MAAO,CACH,OAAQ,CACJ5M,WAAY,QAEhB,kBAAmB,CACf,OAAQ,CACJyI,aAAc,UAI1BoE,WAAY,CACRvqB,QAAS,OACTC,WAAY,SACZJ,eAAgB,SAChBvB,cAAe,SACfU,QAAS,QAeJwrB,GAAc,SAAC,GAAwE,IAAtE58B,EAAqE,EAArEA,KAAM+S,EAA+D,EAA/DA,QAAS8pB,EAAsD,EAAtDA,OAAQ9+B,EAA8C,EAA9CA,UAAWo1B,EAAmC,EAAnCA,gBAAiBF,EAAkB,EAAlBA,YACvEje,EAAU1E,KAD+E,EAGvE4C,mBAAS,MAH8D,oBAGxFxE,EAHwF,KAGlFugB,EAHkF,OAIrE/b,mBAAS,IAJ4D,oBAIxFuoB,EAJwF,KAIjFC,EAJiF,OAKrEzoB,IAAMC,SAAS,IALsD,oBAKxFxJ,EALwF,KAKjFyJ,EALiF,OAMrEF,IAAMC,SAAS,IANsD,oBAMxF6gB,EANwF,KAMjFC,EANiF,OAOnE/gB,IAAMC,SAAS,IAPoD,oBAOxF4pB,EAPwF,KAOhFC,EAPgF,OAQ/D9pB,IAAMC,SAAS,IARgD,oBAQxF8pB,EARwF,KAQ9EC,EAR8E,OASjEhqB,IAAMC,UAAS,GATkD,oBASxFf,EATwF,KAS/EuC,EAT+E,OAUnEzB,IAAMC,UAAS,GAVoD,oBAUxFyB,EAVwF,KAUhFC,EAVgF,KAYzFK,EAAYhC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACTuN,GAAeC,SAASpP,GADf,QAC1B6D,EAD0B,QAEnBb,SACTk8B,EAAY,CAACr7B,EAASZ,OAEtBmS,EAASvR,EAASZ,MALU,2CAOjC,CAACjD,IAEEoX,EAAiBlC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACdoO,GAAoBC,cAAcjQ,GADpB,QAC/B6D,EAD+B,QAExBb,SACTk8B,EAAY,CAACr7B,EAASZ,OAEtB+7B,EAAUn7B,EAASZ,MALc,2CAOtC,CAACjD,IAEEg3B,EAAY9hB,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACTsC,GAAe6F,WADN,QAC1BlG,EAD0B,QAEnBb,SACTk8B,EAAY,CAACr7B,EAASZ,OAEtBgzB,EAASpyB,EAASZ,MALU,2CAOjC,CAACgzB,IAGJ/gB,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,sEACUsV,IADV,uBAEUE,IAFV,uBAGU4f,IAHV,4CADkB,sBAOlB9F,EAAQ,MACRgO,EAAY,IACZvB,EAAS,IAEL17B,IACA0U,GAAW,GAZI,WAAD,+BAadvV,GAAO0B,MAAK,kBAAM6T,GAAW,SAElC,CAAC1U,EAAMiV,EAAWE,EAAgB4f,IAErC,IAAMmI,EAAsB,uCAAG,WAAM98B,GAAN,qBAAAT,EAAA,sDAC3BS,EAAMsW,iBAEAymB,EAAc,GACdC,EAAqB,GAE3BxoB,GAAU,GANiB,IAAAjV,EAAA,iBAQlBqF,GARkB,mCAAArF,EAAA,yDASjB1B,EAAWo/B,EAAYr4B,EAAG,aAE1BsE,EAXiB,oBAWH+zB,EAAYr4B,EAAG,uBAXZ,aAWH,EAAgC7B,cAX7B,QAWuC,GACxDsyB,EAAYP,aAAiB5rB,EAAa,MAC1Cg0B,OAAiC36B,IAAd8yB,GAA2BA,EAAUC,UAE1C,KAAhBpsB,GAAuBg0B,EAfJ,uBAgBnBH,EAAYl5B,KAAKw3B,EAAMz2B,IACvBo4B,EAAmBn5B,KAAnB,UAA2BhG,EAA3B,iEAjBmB,4CAqBjBuL,EAAc6zB,EAAYr4B,EAAG,gBAC7BgwB,EAAkBqI,EAAYr4B,EAAG,kBAAoBpG,GAAyB,GAAK4K,EAEnFtL,EAASm/B,EAAYr4B,EAAG,WACxB8vB,EAAOprB,EAAM2rB,MAAK,SAAAP,GAAI,OAAIA,EAAKz2B,KAAOH,KAzBrB,UA2BA+D,GAAe2E,gBAClC3I,EACAo/B,EAAYr4B,EAAG,iBACfq4B,EAAYr4B,EAAG,cACfq4B,EAAYr4B,EAAG,aACC,KAAhBsE,EAAqB,KAAO4rB,aAAiB5rB,EAAa,MAAM6rB,sBAChE,KACAH,EACAqI,EAAYr4B,EAAG,cACf8vB,EACM,CACI,CACI52B,SACA8O,SAAUqwB,EAAYr4B,EAAG,aACzBlG,KAAMg2B,EAAKh2B,OAGnB,MACN,GACA,EACAu+B,EAAYr4B,EAAG,SA/CI,SA2BjBpD,EA3BiB,QAkDVb,WACTo8B,EAAYl5B,KAAKw3B,EAAMz2B,IACvBo4B,EAAmBn5B,KAAKrC,EAASZ,OApDd,2CAQlBgE,EAAI,EARc,YAQXA,EAAIy2B,EAAMz4B,QARC,0CAQlBgC,GARkB,4FAQOA,IARP,uBAwD3B4P,GAAU,GACV8mB,EAASyB,GACTF,EAAYG,GACZP,IAE2B,IAAvBM,EAAYn6B,QACZ+P,IA9DuB,4CAAH,sDA6EtBsqB,EAAc,WAA0B,IAAzBz4B,EAAwB,uDAAhB,EAAGC,EAAa,uDAAP,GAC5BkuB,EAAO0I,EAAM72B,GACb24B,EAAUz6B,OAAOC,KAAKgwB,GAAMsC,MAAK,SAAAmI,GAAG,OAAIA,EAAIx5B,SAASa,MAC3D,OAAK04B,EACExK,EAAKwK,GADS,MAInBE,EAAc,WAAsC,IAAD,EAApC74B,EAAoC,uDAA5B,EAAGC,EAAyB,uDAAnB,GAAIF,EAAe,uDAAP,GACxCouB,EAAO0I,EAAM72B,GACb24B,EAAO,UAAGz6B,OAAOC,KAAKgwB,GAAMsC,MAAK,SAAAmI,GAAG,OAAIA,EAAIx5B,SAASa,aAA9C,QAAuDA,EACpE62B,GAAS,SAAAD,GAAK,OAAIA,EAAM/lB,KAAI,SAACgoB,EAASC,GAAV,OAAwB/4B,IAAU+4B,EAAV,2BAA0BD,GAA1B,mBAAoCH,EAAU54B,IAAU+4B,SAGhHhjB,qBAAU,WACDhM,GACLgtB,ERpLD,SAAiBkC,GAKpB,IAJA,IAAMC,EAAQD,EAAQE,MAAM,MACtBx9B,EAAS,GACTuB,EAAUg8B,EAAM,GAAGC,MAAM,MAEtB94B,EAAI,EAAGA,EAAI64B,EAAM76B,OAAQgC,IAAK,CAInC,IAHA,IAAMtC,EAAM,GACNq7B,EAAcF,EAAM74B,GAAG84B,MAAM,MAE1BE,EAAI,EAAGA,EAAIn8B,EAAQmB,OAAQg7B,IAChCt7B,EAAIb,EAAQm8B,IAAMD,EAAYC,GAGlC19B,EAAO2D,KAAKvB,GAGhB,OAAOpC,EQoKM29B,CAAQvvB,MAClB,CAACA,IAEJ,IAAMiuB,EACF,yBAAKllB,UAAWzC,EAAQ2nB,YACpB,kBAACtkB,GAAA,EAAD,oCACA,2BAAO6lB,QAAQ,cACX,kBAAC/jB,GAAA,EAAD,CAAQ7B,QAAQ,WAAWwM,UAAU,OAAOpN,MAAO,CAAEjG,UAAW,IAAhE,cAGA,2BAAOpT,GAAG,aAAakqB,QAAM,EAAC6N,OAAO,SAAS3Z,KAAK,OAAOrD,SApC7C,SAAAhZ,GACrB,IAAMsO,EAAOtO,EAAMC,OAAO6V,MAAM,GAC1Buc,EAAS,IAAIC,WAEnBD,EAAO0L,UAAY,WACflP,EAAQwD,EAAOnyB,SAGnBmyB,EAAO2L,WAAW1vB,EAAM,cAiCtB2vB,EACe,IAAjB5C,EAAMz4B,OACF,qCAEA,kBAACs7B,GAAA,EAAD,CAAgBxZ,UAAW2D,KAAMnQ,QAAQ,YACrC,kBAACimB,GAAA,EAAD,CAAO9mB,UAAWzC,EAAQ0nB,OACtB,kBAAC8B,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,mBACA,kBAACA,GAAA,EAAD,uBACA,kBAACA,GAAA,EAAD,oBACA,kBAACA,GAAA,EAAD,mBACA,kBAACA,GAAA,EAAD,qBACA,kBAACA,GAAA,EAAD,cACA,kBAACA,GAAA,EAAD,sBACA,kBAACA,GAAA,EAAD,oBACA,kBAACA,GAAA,EAAD,cACA,kBAACA,GAAA,EAAD,qBAGR,kBAACC,GAAA,EAAD,KACKlD,EAAM/lB,KAAI,SAAC2D,EAAGzU,GAAJ,OACP,kBAAC65B,GAAA,EAAD,CAAU55B,IAAKD,GACX,kBAAC85B,GAAA,EAAD,KAAYrB,EAAYz4B,EAAO,cAC/B,kBAAC85B,GAAA,EAAD,KAAYrB,EAAYz4B,EAAO,kBAC/B,kBAAC85B,GAAA,EAAD,KAAYrB,EAAYz4B,EAAO,eAC/B,kBAAC85B,GAAA,EAAD,KAAYrB,EAAYz4B,EAAO,cAC/B,kBAAC85B,GAAA,EAAD,KAAYrB,EAAYz4B,EAAO,iBAC/B,kBAAC85B,GAAA,EAAD,KACI,kBAACriB,GAAA,EAAD,CAAamL,KAAK,QAAQlN,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,YACjD,kBAACyd,GAAA,EAAD,CAAQpxB,MAAO04B,EAAYz4B,EAAO,QAASwU,SAAU,SAAAhZ,GAAK,OAAIq9B,EAAY74B,EAAO,OAAQxE,EAAMC,OAAOsE,QAAQ2T,QAAQ,YACjHyb,EAAMre,KAAI,SAAA1L,GAAC,OACR,kBAACsC,GAAD,CAAczH,IAAKmF,EAAGrF,MAAOqF,GACxBA,SAMrB,kBAAC00B,GAAA,EAAD,KACI,kBAACriB,GAAA,EAAD,CAAamL,KAAK,QAAQlN,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,YACjD,kBAACyd,GAAA,EAAD,CAAQpxB,MAAO04B,EAAYz4B,EAAO,gBAAiBwU,SAAU,SAAAhZ,GAAK,OAAIq9B,EAAY74B,EAAO,eAAgBxE,EAAMC,OAAOsE,QAAQ2T,QAAQ,WAAWkP,KAAK,SACjJ3oB,GAAa6W,KAAI,SAAA1L,GAAC,OACf,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,GAAImc,WAAY2Y,IAAoBv0B,IAAqBq0B,GAAqBjpB,EAAE3L,KAAOO,KACpHoL,EAAElL,YAMtBu+B,EAAYz4B,EAAO,kBAAoBhG,GACpC,oCACI,kBAAC8/B,GAAA,EAAD,KACI,kBAACriB,GAAA,EAAD,CAAamL,KAAK,QAAQlN,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,YACjD,kBAACyd,GAAA,EAAD,CAAQpxB,MAAO04B,EAAYz4B,EAAO,cAAewU,SAAU,SAAAhZ,GAAK,OAAIq9B,EAAY74B,EAAO,aAAcxE,EAAMC,OAAOsE,QAAQ2T,QAAQ,YAC7HwkB,EAAOpnB,KAAI,SAAA1L,GAAC,OACT,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAC7B2L,EAAElL,YAMvB,kBAAC4/B,GAAA,EAAD,KACI,kBAACriB,GAAA,EAAD,CAAamL,KAAK,QAAQlN,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,YACjD,kBAACyd,GAAA,EAAD,CAAQpxB,MAAO04B,EAAYz4B,EAAO,WAAYwU,SAAU,SAAAhZ,GAAK,OAAIq9B,EAAY74B,EAAO,UAAWxE,EAAMC,OAAOsE,QAAQ2T,QAAQ,YACvH5O,EAAMgM,KAAI,SAAA1L,GAAC,OACR,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAC7B2L,EAAElL,YAMvB,kBAAC4/B,GAAA,EAAD,KACI,kBAACriB,GAAA,EAAD,CAAamL,KAAK,QAAQlN,WAAS,EAAC4B,UAAQ,EAAC5D,QAAQ,YACjD,kBAACyd,GAAA,EAAD,CAAQpxB,MAAO04B,EAAYz4B,EAAO,aAAcwU,SAAU,SAAAhZ,GAAK,OAAIq9B,EAAY74B,EAAO,YAAaxE,EAAMC,OAAOsE,QAAQ2T,QAAQ,YAC3HtZ,GAAU0W,KAAI,SAAA1L,GAAC,OACZ,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,GAAImc,WAAY2Y,IAAoBv0B,IAAqBq0B,GAAqBjpB,EAAE3L,KAAOU,KACpHiL,EAAElL,aAQ3B,kBAAC4/B,GAAA,EAAD,CAAW9d,MAAM,SAASge,QAAS,GAAnC,4BAW1BC,EACF,kBAAClkB,GAAA,EAAD,CAAQ3a,KAAMg9B,EAASh6B,OAAS,EAAG+P,QAAS,kBAAMkqB,EAAY,MAC1D,kBAACjhB,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACK+gB,EAAStnB,KAAI,SAAClB,EAASxP,GAAV,OACV,kBAAC,GAAD,CAAOH,IAAKG,EAAGiL,OAAO,wBAAwBJ,KAAM2E,OAF5D,KAMA,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMylB,EAAY,MAAnD,QAOZ,OACI,oCACI,kBAACtiB,GAAA,EAAD,CAAQ3a,KAAMA,EAAMkS,SAAS,OACzB,0BAAM6J,SAAUmhB,GACZ,kBAAClhB,GAAA,EAAD,qBACA,kBAACyJ,GAAA,EAAD,MACA,kBAACxJ,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAUqY,UAAU,IAAIuW,UAAQ,EAACvN,KAAK,sBAAxE,0BAIJ,kBAAC3V,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,OAAOV,MAAO,CAAEtF,QAAS,OAAQC,WAAY,SAAUJ,eAAgB,UACjF,kBAACoG,GAAA,EAAD,CAAYC,QAAQ,WAApB,gIAMXnG,EACG,qCAEA,oCACI,kBAACsT,GAAA,EAAD,MACA,kBAACxJ,GAAA,EAAD,KAAiC,IAAjBwf,EAAMz4B,OAAe25B,EAAa0B,IAG1D,kBAAC5Y,GAAA,EAAD,MACA,kBAAC/I,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMzE,KAAWyH,SAAU7F,GAA5D,kBAGA,kBAACwF,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+N,SAAU7F,GAA2B,IAAjB8mB,EAAMz4B,OAAcyZ,KAAK,UAAzF,mBAOXoiB,EAED,kBAAC9hB,GAAD,CAAgB5K,QAASwC,MC/U/BrE,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCsuB,QAAQ,cACJ1tB,QAAS,YACTR,UAAW,QACXwB,QAAS,OACT1B,cAAe,SACf,cAAe,CACXoP,OAAQ,IAGXtP,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,KAGjB2tB,QAAS,CACLvsB,cAAe,EACf,wBAAyB,CACrB7B,OAAQ,SAGhBquB,cAAe,CACX5sB,QAAS,OACT6sB,SAAU,OACVxtB,UAAW,GACX,kBAAmB,CACfytB,YAAa,EACb1d,aAAc,IAGtB2d,aAAc,CACV/sB,QAAS,OACTC,WAAY,SACZ1B,OAAQ,OAER,yBAA0B,CACtByuB,qBAAsB,IAG9BC,cAAe,CACXC,WAAY,wBACZ3uB,OAAQ,OACRQ,MAAO,GACPiB,QAAS,OACTC,WAAY,SACZJ,eAAgB,SAChBumB,OAAO,aAAD,OAAensB,IACrBksB,aAAa,aAAD,OAAelsB,IAC3BkzB,WAAY,OACZC,OAAQ,UACRJ,qBAAsB,EAEtB,UAAW,CACP1yB,gBAAiB,SAGzBgwB,MAAO,CACHlE,OAAO,aAAD,OAAehoB,EAAMivB,QAAQC,SACnCpe,aAAc,EACd,OAAQ,CACJwO,WAAY,QAEhB,OAAQ,CACJ,eAAgB,CACZ,OAAQ,CACJyI,aAAc,WAK9B3I,QAAS,CACL,sBAAuB,CACnBxd,QAAS,OACT1B,cAAe,UAEnB,oBAAqB,CACjBmf,cAAe,OACfhe,SAAU,KAEd,qBAAsB,CAClBI,eAAgB,aAChB6d,WAAY,UA+rBxB,IAUe/N,iBAVS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,eACZyd,WAAY3d,EAAM4d,UAGK,SAAAzd,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnC06B,SAAU,SAAAzgB,GAAK,OAAIkH,ECx0BC,SAAAlH,GAAK,MAAK,CAC9BwB,KAAM,YACNxB,SDs0B4BygB,CAASzgB,QAG1B8G,EApsBf,SAAenS,GAAQ,IACXoa,EAA4Cpa,EAA5Coa,KAAM5H,EAAsCxS,EAAtCwS,YAAaud,EAAyB/vB,EAAzB+vB,WAAYjE,EAAa9rB,EAAb8rB,SAC/BD,EAAUkE,EAAVlE,MAFU,EAIsDh2B,KAAYwoB,MAAMvuB,OAAOmG,SAASqoB,QAA5FhR,EAJI,EAIV4X,KAAuB+K,EAJb,EAIO/gC,KAA4BghC,EAJnC,EAIwBC,UAJxB,EAKkB9sB,IAAMC,SAAN,OAAe2sB,QAAf,IAAeA,IAAa,IAL9C,oBAKXG,EALW,KAKCC,EALD,OAM0BhtB,IAAMC,SAAN,OAAe2sB,QAAf,IAAeA,IAAa,IANtD,oBAMXK,EANW,KAMKC,EANL,OAOkBltB,IAAMC,SAAN,OAAegK,QAAf,IAAeA,IAAa,IAP9C,oBAOXkjB,EAPW,KAOCC,EAPD,OAQ0BptB,IAAMC,SAAN,OAAegK,QAAf,IAAeA,IAAa,IARtD,oBAQXojB,EARW,KAQKC,EARL,OASsBttB,IAAMC,UAAS,GATrC,oBASXstB,EATW,KASGC,EATH,OAUsBxtB,IAAMC,UAAS,GAVrC,oBAUXwtB,EAVW,KAUGC,EAVH,OAWwB1tB,IAAMC,UAAS,GAXvC,oBAWX0tB,EAXW,KAWIC,EAXJ,OAYwB5tB,IAAMC,SAAS,MAZvC,oBAYX4tB,EAZW,KAYIC,EAZJ,OAawB9tB,IAAMC,SAAS,MAbvC,oBAaX8tB,EAbW,KAaIC,EAbJ,OAcwBhuB,IAAMC,SAAS,MAdvC,oBAcXguB,EAdW,KAcIC,EAdJ,QAewBluB,IAAMC,SAAS,MAfvC,sBAeXkuB,GAfW,MAeIC,GAfJ,SAgB0BpuB,IAAMC,SAAS,MAhBzC,sBAgBXouB,GAhBW,MAgBKC,GAhBL,SAiBgCtuB,IAAMC,SAAS,MAjB/C,sBAiBXsuB,GAjBW,MAiBQC,GAjBR,SAkBgCxuB,IAAMC,SAAS,MAlB/C,sBAkBXwuB,GAlBW,MAkBQC,GAlBR,SAmBkB1uB,IAAMC,SAAS,IAnBjC,sBAmBXE,GAnBW,MAmBCC,GAnBD,SAoB8CJ,IAAMC,UAAS,GApB7D,sBAoBX0uB,GApBW,MAoBeC,GApBf,SAqBc5uB,IAAMC,SAAS,MArB7B,sBAqBXmU,GArBW,MAqBDiJ,GArBC,SAsBsBrd,IAAMC,SAAS,MAtBrC,sBAsBX4uB,GAtBW,MAsBGC,GAtBH,SAyBc9uB,IAAMC,SAAS,IAzB7B,sBAyBX8uB,GAzBW,MAyBDC,GAzBC,SA0B0BhvB,IAAMC,SAAS,QA1BzC,sBA0BXgvB,GA1BW,MA0BKC,GA1BL,SA4BoBlvB,IAAMC,SAAS,MA5BnC,sBA4BXuQ,GA5BW,MA4BEC,GA5BF,SA6BYzQ,IAAMC,SAAS,MA7B3B,sBA6BXsB,GA7BW,MA6BFC,GA7BE,SA8BYxB,IAAMC,UAAS,GA9B3B,sBA8BXf,GA9BW,MA8BFuC,GA9BE,SA+BUzB,IAAMC,UAAS,GA/BzB,sBA+BXyB,GA/BW,MA+BHC,GA/BG,MAgCZI,GAAU1E,KAEV8xB,GAAcpY,EAAKne,KAAK7H,SAASrF,IACjC0jC,GAAgBrY,EAAKpe,UAAU5H,SAASjF,KAAqBirB,EAAKxgB,cAAgB5K,GAElF0jC,GAAqBrvB,IAAMiC,YAAN,uCACvB,WAAM6d,GAAN,eAAApzB,EAAA,0DACqBsB,GAAkB8xB,EAAK10B,IAD5C,gCAEyCqf,GAAkBK,uBAAuBiM,EAAKjsB,UAAWg1B,EAAK90B,UAFvG,0DAEyHyf,GAAkBI,kBAAkBkM,EAAKjsB,UAAWg1B,EAAK10B,IAFlL,gCAEUkkC,EAFV,MAGoBxhC,SAHpB,0CAIe,MAJf,iCAMewhC,EAAYvhC,MAN3B,4CADuB,sDAUvB,CAACgpB,IAGCmS,GAAYlpB,IAAMiC,YAAN,sBAAkB,gCAAAvV,EAAA,6DAChC+U,IAAW,GADqB,SAECgJ,GAAkBE,yBAAyBoM,EAAKjsB,UAAhD,OAA2D8hC,QAA3D,IAA2DA,IAAa,GAAxE,OAA4E3iB,QAA5E,IAA4EA,IAAa,IAF1F,YAE1BslB,EAF0B,QAGTzhC,SAHS,gBAI5B0T,GAAW+tB,EAAmBxhC,MAJF,wCAMM0c,GAAkBG,qBAAqBmM,EAAKjsB,WANlD,SAMtB0kC,EANsB,QAOJ1hC,SACpB0T,GAAWguB,EAAoBzhC,QAEzBy6B,EADH,uBAEI+G,EAAmBxhC,KAAKqV,QAAO,SAAArM,GAAC,OAAsC,KAAlC,OAAC81B,QAAD,IAACA,IAAkB,IAAI98B,QAAgBgH,EAAE8D,cAAgBgyB,MAFjG,aAGI2C,EAAoBzhC,KAClBqV,QAAO,SAAArM,GAAC,OAAsC,KAAlC,OAAC81B,QAAD,IAACA,IAAkB,IAAI98B,QAAgBgH,EAAE8D,cAAgBgyB,KACrEzpB,QAAO,SAAArM,GAAC,OAAiC,KAA7B,OAAC61B,QAAD,IAACA,IAAa,IAAI78B,SAAiBgH,EAAE/L,SAAW+L,EAAEZ,UAAYY,EAAEX,UAAUq5B,cAAc1+B,SAAS67B,EAAU6C,kBACvHrsB,QAAO,SAAArM,GAAC,OAAiC,KAA7B,OAACkT,QAAD,IAACA,IAAa,IAAIla,QAAgBgH,EAAEN,MAAM2M,QAAO,SAAAssB,GAAC,OAAIA,EAAE7jC,KAAK4jC,cAAc1+B,SAASkZ,EAAUwlB,kBAAgB1/B,OAAS,QAEtI4/B,MAAK,SAACjjC,EAAGwG,GACX,OAAIxG,EAAE0J,SAAWlD,EAAEkD,UACP,EAER1J,EAAE0J,SAAWlD,EAAEkD,SACR,EAEJ,KAEXqyB,EAASD,IA1Be,QA6BhC/mB,IAAW,GA7BqB,4CA8BjC,CAACsV,EAAMsY,KAGVrvB,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,8BAAA3qB,EAAA,6DACUkjC,EAAWC,aAAaC,QAAQ,gBACtCpC,EAA6B,UAAbkC,GAAqC,KAAbA,IAAmB5hC,GAAkB4hC,IAFjF,SAG2B90B,GAAoBC,cAAcgc,EAAKjsB,WAHlE,cAGU6D,EAHV,QAIiBb,SACT0T,GAAW7S,EAASZ,MAEpBqS,GAAczR,EAASZ,MAP/B,SASUm7B,KATV,4CAPkB,sBAGbzZ,GAAoB4H,GACrB5G,GAAe,UAJD,mCAkBlBvkB,KACD,CAAC6qB,EAAMmS,KAGVlpB,IAAMyH,WAAU,WACPzZ,GAAkBwiB,KACnBrB,EAAYqB,MAEjB,CAACA,GAAarB,IAEjB,IAAM4gB,GAAqB,WACvB1S,GAAY,MACZyR,GAAgB,OAGdkB,GAAmBhwB,IAAMiC,aAC3B,SAAAguB,GACQA,IAAYlB,IAQhBC,GAAYiB,GACZf,GAAkB,SAPVA,GADmB,SAAnBD,GACkB,MAEA,UAO9B,CAACF,GAAUE,GAAgBC,GAAmBF,KAGlD,SAASkB,KACL,IAAIriC,EAAS,GAgBb,OAfIk/B,EAAW78B,OAAOH,OAAS,IAC3BlC,GAAM,eAAYk/B,IAElBI,EAAWj9B,OAAOH,OAAS,IACvBlC,EAAOkC,OAAS,IAChBlC,GAAU,KAEdA,GAAM,eAAYs/B,KAElB,OAACN,QAAD,IAACA,IAAkB,IAAI38B,OAAOH,OAAS,IACnClC,EAAOkC,OAAS,IAChBlC,GAAU,KAEdA,GAAM,oBAAiBg/B,IAEpBh/B,EArJO,SAwJHsiC,GAxJG,mFAwJlB,WAAyC/kC,EAAIoN,GAA7C,eAAA9L,EAAA,6DACIiV,IAAU,GADd,SAE2B3S,GAAemG,gBAAgB/J,EAAIoN,GAF9D,QAEU7J,EAFV,QAGiBb,SACT0T,GAAW7S,EAASZ,MAEpB06B,EAASD,EAAM/lB,KAAI,SAAAqd,GAAI,OAAKA,EAAK10B,KAAOA,EAAZ,2BAAsB00B,GAAtB,IAA4BtnB,YAAYsnB,MAExEne,IAAU,GARd,4CAxJkB,+BAmKHyuB,GAnKG,iFAmKlB,WAAiCjjC,GAAjC,mBAAAT,EAAA,yDACSsB,GAAkBb,IACnBA,EAAMsW,iBAGNwpB,IAAmBF,GAAcM,IAAmBF,EAL5D,wDASI1rB,IAAW,GACXyrB,EAAkBH,GAClBO,EAAkBH,GAElB56B,GAAkB29B,MAbtB,SAeqCzlB,GAAkBE,yBAAyBoM,EAAKjsB,UAAWiiC,EAAYI,GAf5G,YAeUoC,EAfV,QAgB2BzhC,SAhB3B,iBAiBQ0T,GAAW+tB,EAAmBxhC,MAjBtC,yCAmB0C0c,GAAkBG,qBAAqBmM,EAAKjsB,WAnBtF,SAmBc0kC,EAnBd,QAoBgC1hC,SACpB0T,GAAWguB,EAAoBzhC,QAEzBsiC,EADH,uBAEId,EAAmBxhC,MAFvB,aAGIyhC,EAAoBzhC,KAClBqV,QAAO,SAAArM,GAAC,OAA0B,IAAtBg2B,EAAWh9B,SAAiBgH,EAAE/L,SAAW+L,EAAEZ,UAAYY,EAAEX,UAAUq5B,cAAc1+B,SAASg8B,EAAW0C,kBACjHrsB,QAAO,SAAArM,GAAC,OAA0B,IAAtBo2B,EAAWp9B,QAAgBgH,EAAEN,MAAM2M,QAAO,SAAAssB,GAAC,OAAIA,EAAE7jC,KAAK4jC,cAAc1+B,SAASo8B,EAAWsC,kBAAgB1/B,OAAS,QAE7H4/B,MAAK,SAACjjC,EAAGwG,GACd,OAAIxG,EAAE0J,SAAWlD,EAAEkD,UACP,EAER1J,EAAE0J,SAAWlD,EAAEkD,SACR,EAEJ,KAEXqyB,EAAS4H,IAtCrB,QA0CI5uB,IAAW,GA1Cf,6CAnKkB,sBAgNlB,SAAS6uB,KACDtiC,GAAkBmgC,OAGOA,GAArBoC,aACQC,GAAkBC,IADLtC,GAAP/iC,IAEtBgjC,GAAiB,OAtNH,8CAyNlB,4BAAA1hC,EAAA,6DACI+U,IAAW,GACHzW,EAAaijC,EAAbjjC,SACRkjC,EAAiB,MAHrB,SAI2Bl/B,GAAe6E,gBAAgB7I,GAJ1D,cAKiB8C,UACT0T,GAAW,uDAEfC,IAAW,GARf,4CAzNkB,oEAoOlB,4BAAA/U,EAAA,6DACI+U,IAAW,GACHzW,EAAa+iC,EAAb/iC,SACRgjC,EAAiB,MAHrB,SAI2Bh/B,GAAe8E,gBAAgB9I,GAJ1D,cAKiB8C,SACT0T,GAAW,uDAEXinB,EAASD,EAAMplB,QAAO,SAAArM,GAAC,OAAIA,EAAE/L,WAAaA,MAE9CyW,IAAW,GAVf,4CApOkB,oEAiPlB,4BAAA/U,EAAA,yDACSmhC,EADT,wDAEIpsB,IAAW,GACXqsB,EAAiB,MACT1iC,EAAOyiC,EAAPziC,GAJZ,SAK2B4D,GAAeoG,WAAWhK,GALrD,cAMiB0C,SACT0T,GAAW,uDAEXinB,EAASD,EAAMplB,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOA,MAExCqW,IAAW,GAXf,6CAjPkB,+BA+PHgvB,GA/PG,iFA+PlB,WAA6B1lC,GAA7B,SAAA2B,EAAA,6DACI+U,IAAW,GADf,SAE2Bsd,GAAgBC,QAAQj0B,GAFnD,cAGiB+C,SACT0T,GAAW,wDAEXinB,EAASD,EAAM/lB,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOL,EAAT,2BAAuBgM,GAAvB,IAA0Bw5B,cAAc,IAASx5B,MAE9E0K,IAAW,GARf,4CA/PkB,+BA0QH+uB,GA1QG,iFA0QlB,WAA+BzlC,GAA/B,SAAA2B,EAAA,6DACI+U,IAAW,GADf,SAE2Bsd,GAAgBE,UAAUl0B,GAFrD,cAGiB+C,SACT0T,GAAW,uDAEXinB,EAASD,EAAM/lB,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOL,EAAT,2BAAuBgM,GAAvB,IAA0Bw5B,cAAc,IAAUx5B,MAE/E0K,IAAW,GARf,4CA1QkB,sBAqRlB,SAASuB,GAAY7V,GAAQ,IAAD,EACAA,EAAMC,OAAtBsE,EADgB,EAChBA,MACR,OAFwB,EACT7F,MAEX,IAAK,OACDmhC,EAAct7B,GACd,MACJ,IAAK,OACD07B,EAAc17B,IAmG1B,SAASg/B,GAAe5Q,GAAO,IACnB10B,EAA0B00B,EAA1B10B,GAAIJ,EAAsB80B,EAAtB90B,SAAUwN,EAAYsnB,EAAZtnB,QAChBunB,EAAOhJ,EAAK/rB,WAAaA,EACzB2lC,EAAW3iC,GAAkB5C,GACnC,OACI,qCACM20B,GAAQoP,GACN,oCACMwB,EAWE,oCACI,kBAACzpB,GAAA,EAAD,CAAQ3C,QAAS,kBAAMypB,EAAiBlO,KAAxC,UACA,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAM2pB,EAAiBpO,KAAxC,4BACA,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAM+pB,GAAkBxO,KAAzC,gBAbJ,oCACI,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAMupB,EAAiBhO,KAAxC,UACA,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAMiqB,GAAqB1O,KAA5C,0BACEsP,IAAkBrP,EAAkF,KAA3E,kBAAC7Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAM6pB,GAAiBtO,KAAxC,oBAC3B,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAMmqB,GAAqB5O,KAA5C,gBACA,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAMkM,GAAe,YAAD,OAAaqP,EAAK10B,GAAlB,qBAAiC00B,EAAK3pB,UAAY,IAAM2pB,EAAK1pB,aAAlG,WACEq3B,EAA8G,KAA/F,kBAACvmB,GAAA,EAAD,CAAQ3C,QAAS,kBAAM4rB,GAA0B/kC,GAAKoN,KAAtD,uBACjB,kBAAC0O,GAAA,EAAD,CAAQ3C,QAAS,kBAAM+pB,GAAkBxO,KAAzC,iBAWZ,oCACI,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAMmqB,GAAqB5O,KAA5C,gBACA,kBAAC5Y,GAAA,EAAD,CAAQ3C,QAAS,kBAAMkM,GAAe,YAAD,OAAaqP,EAAK10B,GAAlB,qBAAiC00B,EAAK3pB,UAAY,IAAM2pB,EAAK1pB,aAAlG,WACEq3B,EAA8G,KAA/F,kBAACvmB,GAAA,EAAD,CAAQ3C,QAAS,kBAAM4rB,GAA0B/kC,GAAKoN,KAAtD,yBA6JrC,SAASo4B,KACL,MAAiB,iBAAb7B,IAA4C,YAAbA,IACvB,EAGL,GAyFX,OACI,yBAAKvqB,UAAWzC,GAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASwC,KArXzB,kBAACwD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,GAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU4N,UAAW,kBAACypB,GAAA,EAAD,MAAStsB,QAAS,kBAAM+pB,GAAkB,MAAjG,aAIJ,kBAACppB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+N,UAAW4nB,GAAa/nB,UAAW,kBAACkB,GAAA,EAAD,MAAiB/D,QAAS,kBAAMqpB,GAAiB,KAAhI,iBAIJ,kBAAC1oB,GAAA,EAAD,CAAMzG,MAAI,EAACmkB,GAAG,OAAOD,GAAI,GACrB,kBAACzb,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+N,SAAU6nB,GAAehoB,UAAW,kBAACypB,GAAA,EAAD,MAAShf,UAAWC,KAAMC,GAAG,eAA7G,mBAIJ,kBAAC7M,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAG,QACV,kBAACzb,GAAA,EAAD,CACI7B,QAAQ,YACR7L,MAAM,UACN+K,QAAS,WACLqqB,IAA4B,IAEhCxnB,UAAW,kBAAC0pB,GAAA,EAAD,OANf,4BAWJ,kBAAC5rB,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,IAChC,yBAAKX,UAAWzC,GAAQmqB,cACpB,kBAACxlB,GAAA,EAAD,CACIb,MAAM,iBACNR,QAAQ,SACR3T,MAAOy7B,EACPhnB,SAAUnD,GACVguB,UAAW,SAAAj6B,GAAC,MAAe,UAAVA,EAAEnF,IAAkBw+B,GAAkBr5B,GAAK,MAC5DqjB,OAAQgW,GACRvkC,KAAK,OACLwb,WAAS,IAEb,yBAAK7C,UAAWzC,GAAQqqB,cAAe7nB,QAAS,kBAAM6rB,OAClD,kBAAC,KAAD,SAIZ,kBAAClrB,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,IAChC,yBAAKX,UAAWzC,GAAQmqB,cACpB,kBAACxlB,GAAA,EAAD,CACIb,MAAM,iBACNR,QAAQ,SACR3T,MAAOq7B,EACP5mB,SAAUnD,GACVguB,UAAW,SAAAj6B,GAAC,MAAe,UAAVA,EAAEnF,IAAkBw+B,GAAkBr5B,GAAK,MAC5DqjB,OAAQgW,GACRvkC,KAAK,OACLwb,WAAS,IAEb,yBAAK7C,UAAWzC,GAAQqqB,cAAe7nB,QAAS,kBAAM6rB,OAClD,kBAAC,KAAD,SAIXlxB,GACG,kBAACgG,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,IAAE,EAACnO,IAAE,EAACD,IAAE,EAACxd,IAAE,GAClB,kBAACyC,GAAA,EAAD,CAAkB2M,KAAM,GAAI9P,MAAO,CAAEjG,UAAW,GAAIyyB,WAAY,OAEpE,KACJ,kBAAC/rB,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,IACX,kBAACrW,GAAA,EAAD,CAAkBC,QAAS,kBAACuW,GAAA,EAAD,CAAQnX,QAASwT,EAAcpnB,SAAU,SAAApP,GAAC,OAAIy2B,EAAgBz2B,EAAE3J,OAAO2sB,UAAUvgB,MAAM,YAAcqM,MAAM,wBACtI,kBAAC6U,GAAA,EAAD,CACIC,QACI,kBAACuW,GAAA,EAAD,CACInX,QAAS0T,EACTtnB,SAAU,SAAApP,GACN22B,EAAgB32B,EAAE3J,OAAO2sB,SACzB8V,aAAasB,QAAQ,eAAgBp6B,EAAE3J,OAAO2sB,UAElDvgB,MAAM,YAGdqM,MAAM,oBAGd,kBAACX,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAM2E,OAmSnDksB,EAxFD,kBAACpC,GAAA,EAAD,CAAgB7mB,UAAWzC,GAAQ0nB,OAC/B,kBAAC6B,GAAA,EAAD,CAAO8F,cAAY,EAAC7c,KAAK,SA5G7B,kBAACgX,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,cAAbvC,GAA0Bha,UAAwB,cAAbga,GAA2BE,GAAiB,OAAQ1qB,QAAS,kBAAMyrB,GAAiB,eAAjJ,SAIJ,kBAACvE,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,aAAbvC,GAAyBha,UAAwB,aAAbga,GAA0BE,GAAiB,OAAQ1qB,QAAS,kBAAMyrB,GAAiB,cAA/I,aAIJ,kBAACvE,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,gBAAbvC,GAA4Bha,UAAwB,gBAAbga,GAA6BE,GAAiB,OAAQ1qB,QAAS,kBAAMyrB,GAAiB,iBAArJ,eAIJ,kBAACvE,GAAA,EAAD,cACA,kBAACA,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,OAAbvC,GAAmBha,UAAwB,OAAbga,GAAoBE,GAAiB,OAAQ1qB,QAAS,kBAAMyrB,GAAiB,QAAnI,mBAIJ,kBAACvE,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,iBAAbvC,GAA6Bha,UAAwB,iBAAbga,GAA8BE,GAAiB,OAAQ1qB,QAAS,kBAAMyrB,GAAiB,kBAAvJ,kBAIJ,kBAACvE,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,YAAbvC,GAAwBha,UAAwB,YAAbga,GAAyBE,GAAiB,OAAQ1qB,QAAS,kBAAMyrB,GAAiB,aAA7I,oBAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UAAjB,uBACA,kBAAC8d,GAAA,EAAD,QA4EA,kBAACC,GAAA,EAAD,KACKlD,EACIplB,QAAO,SAAArM,GAAC,QAAKw2B,IAAuBx2B,EAAEw5B,gBACtCZ,MAAK,SAACjjC,EAAGwG,GACN,MAA0B,SAAnB+7B,GAA4Bh8B,GAAqBvG,EAAGwG,EAAG67B,GAAU6B,OAA0B39B,GAAqBvG,EAAGwG,EAAG67B,GAAU6B,SAE1InuB,KAAI,SAACqd,EAAM/tB,GAAP,OA5E7B,SAAsB+tB,EAAMnuB,GAAQ,IAAD,IACvBvG,EAAiF00B,EAAjF10B,GAAI+K,EAA6E2pB,EAA7E3pB,UAAWC,EAAkE0pB,EAAlE1pB,SAAUpL,EAAwD80B,EAAxD90B,SAAUulC,EAA8CzQ,EAA9CyQ,aAAc95B,EAAgCqpB,EAAhCrpB,MAAOoE,EAAyBilB,EAAzBjlB,YAAarC,EAAYsnB,EAAZtnB,QACvEm4B,EAAW3iC,GAAkB5C,GAEnC,OACI,oCACI,kBAACogC,GAAA,EAAD,CAAU55B,IAAK5G,GACX,kBAACygC,GAAA,EAAD,eAAet1B,EAAf,YAA4BC,IAC5B,kBAACq1B,GAAA,EAAD,KAAYzgC,GACZ,kBAACygC,GAAA,EAAD,KACI,kBAACzkB,GAAA,EAAD,CAAM3B,QAAQ,WAAWQ,MAAK,oBAAE1F,GAAWiiB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOyP,YAAhC,aAAE,EAA4ChP,YAA9C,QAAsD,aAExF,kBAAC4/B,GAAA,EAAD,KACKh1B,EAAMgM,KAAI,SAAC1L,EAAGhF,GAAJ,OACP,kBAACiV,GAAA,EAAD,CAAMvC,MAAO,CAAEwnB,YAAa,GAAKr6B,IAAKG,EAAGsT,QAAQ,WAAWQ,MAAO9O,EAAElL,WAG7E,kBAAC4/B,GAAA,EAAD,KAAYkF,EAAW,MAAQ,MAC/B,kBAAClF,GAAA,EAAD,KAAYkF,EAAW,MAAQJ,EAAe,MAAQ,MACtD,kBAAC9E,GAAA,EAAD,KAAYkF,EAAW,MAAQn4B,EAAU,WAAa,kBACtD,kBAACizB,GAAA,EAAD,CAAW9d,MAAM,UACXgjB,EAAkK,KAAvJ,kBAACjW,GAAA,EAAD,CAAkBC,QAAS,kBAACuW,GAAA,EAAD,CAAQnX,QAASvhB,EAAS2N,SAAU,SAAApP,GAAC,OAAIo5B,GAA0B/kC,EAAI2L,EAAE3J,OAAO2sB,UAAUvgB,MAAM,YAAcqM,MAAM,MAEhK,kBAAC4lB,GAAA,EAAD,KACI,kBAAC7iB,GAAA,EAAD,CACIW,mBAAkBne,EAClBmZ,QAAS,SAAAxN,GACLsmB,GAAYtmB,EAAEwa,eACdud,GAAgBn9B,KAGpB,kBAAC8sB,GAAA,EAAD,SAIZ,kBAACC,GAAA,EAAD,CACItzB,GAAIA,EACJ2B,KAAM8hC,KAAiBl9B,EACvByiB,SAAUA,GACVtU,QAASiwB,GACTxrB,QAASwrB,GACTpR,aAAc,CACVC,SAAU,MACVC,WAAY,UAEhBC,gBAAiB,CACbF,SAAU,SACVC,WAAY,UAEhBra,UAAWzC,GAAQ4a,SAElB+T,GAAe5Q,KAyBUyR,CAAazR,EAAM/tB,SAjIrDnC,GAAQ44B,IAAUx6B,GAAkBw6B,GAC7B,kBAACgB,GAAD,MAIP,kBAACtkB,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpBogB,EAAMplB,QAAO,SAAArM,GAAC,QAAKw2B,IAAuBx2B,EAAEw5B,gBAAe9tB,KAAI,SAAC+uB,EAAGz/B,GAAJ,OA9C5E,SAAmB+tB,GAAO,IAAD,IACb10B,EAAiF00B,EAAjF10B,GAAI+K,EAA6E2pB,EAA7E3pB,UAAWC,EAAkE0pB,EAAlE1pB,SAAUpL,EAAwD80B,EAAxD90B,SAAUulC,EAA8CzQ,EAA9CyQ,aAAc95B,EAAgCqpB,EAAhCrpB,MAAOoE,EAAyBilB,EAAzBjlB,YAAarC,EAAYsnB,EAAZtnB,QACvEunB,EAAOhJ,EAAK/rB,WAAaA,EACzB2lC,EAAW3iC,GAAkB5C,GAEnC,OACI,kBAAC8Z,GAAA,EAAD,CAAMtT,IAAKxG,EAAIqT,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,IACzC,kBAAC2X,GAAD,CACI3hB,MAAK,UAAKhF,EAAL,YAAkBC,GACvBqmB,UAAU,EACVO,YAAW,sBAAE,sBAAAtwB,EAAA,+EAAY2iC,GAAmBvP,IAA/B,2CACb1kB,YACI,oCACI,kBAACgK,GAAA,EAAD,CAAYC,QAAQ,SAASra,GAAY+0B,EAAO,QAAU,KACzD4Q,EACG,kBAACvrB,GAAA,EAAD,CAAYC,QAAQ,SAChB,yDAGJ,kBAACD,GAAA,EAAD,CAAYX,MAAO,CAAEvG,MAAO,OAAQ1E,MAAOhB,EAAU,MAAQ,SAAW6M,QAAQ,SAC3E7M,EAAU,WAAa,kBAG/B+3B,EAAe,kBAACnrB,GAAA,EAAD,CAAYC,QAAQ,SAApB,iBAAyD,KACzE,yBAAKb,UAAWzC,GAAQgqB,eACpB,kBAAC/kB,GAAA,EAAD,CAAMpV,IAAI,aAAayT,QAAQ,WAAWQ,MAAK,oBAAE1F,GAAWiiB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOyP,YAAhC,aAAE,EAA4ChP,YAA9C,QAAsD,YACpG4K,EAAMgM,KAAI,SAAC1L,EAAGhF,GAAJ,OACP,kBAACiV,GAAA,EAAD,CAAMpV,IAAG,UAAKG,EAAL,YAAU/G,GAAYqa,QAAQ,WAAWQ,MAAO9O,EAAElL,aAM1E6kC,GAAe5Q,KAasD2R,CAAUD,OAoIxF,kBAAC9pB,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBmgC,IAAgBruB,QAAS,kBAAMsuB,GAAiB,QAC7E,kBAACrlB,GAAA,EAAD,4BACA,kBAACC,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM+rB,OAAvC,OAGA,kBAACppB,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM6pB,GAAiB,QAAxD,QA2BR,kBAAC1mB,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBigC,GAAgBnuB,QAAS,kBAAMouB,EAAiB,QAC7E,kBAACnlB,GAAA,EAAD,iCACA,kBAACC,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBA5nB/B,2CA4nBqCmtB,KAAvC,OAGA,kBAACxqB,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM2pB,EAAiB,QAAxD,QAUR,kBAACxmB,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkB+/B,GAAgBjuB,QAAS,kBAAMkuB,EAAiB,QAC7E,kBAACjlB,GAAA,EAAD,iCACA,kBAACC,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBA7oB/B,2CA6oBqCotB,KAAvC,OAGA,kBAACzqB,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMypB,EAAiB,QAAxD,QAzCR,kBAACtmB,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkB6/B,GAAgB/tB,QAAS,kBAAMguB,EAAiB,QAC7E,kBAAC/kB,GAAA,EAAD,gCACA,kBAACC,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBA3mB/B,2CA2mBqCqtB,KAAvC,OAGA,kBAAC1qB,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMupB,EAAiB,QAAxD,QAmDR,kBAACtI,GAAD,CACIz4B,MAAOiB,GAAkBugC,IACzBzuB,QAAS,kBAAM0uB,GAAqB,OACpCzO,MAAU,OAAJhJ,QAAI,IAAJA,OAAA,EAAAA,EAAM/rB,aAAN,OAAmBujC,SAAnB,IAAmBA,QAAnB,EAAmBA,GAAmBvjC,UAC5C80B,KAAMyO,GACNzjC,UAAWisB,EAAKjsB,UAChBo1B,gBAAiBnJ,EAAKxgB,cAE1B,kBAACspB,GAAD,CACI9yB,MAAOiB,GAAkBqgC,IACzBpO,OAAQ,kBAAMiJ,MACdppB,QAAS,kBAAMwuB,GAAkB,OACjCvO,MAAU,OAAJhJ,QAAI,IAAJA,OAAA,EAAAA,EAAM/rB,aAAN,OAAmBqjC,SAAnB,IAAmBA,QAAnB,EAAmBA,GAAgBrjC,UACzCg1B,YAAamP,GACbrP,KAAMuO,GACNvjC,UAAWisB,EAAKjsB,UAChBo1B,gBAAiBnJ,EAAKxgB,cAE1B,kBAACowB,GAAD,CAAgB55B,MAAOiB,GAAkBygC,IAAoB3uB,QAAS,kBAAM4uB,GAAqB,OAAO5O,KAAM2O,GAAmB3jC,UAAWisB,EAAKjsB,YACjJ,kBAACu9B,GAAD,CAAgBt7B,KAAM4hC,GAA0B7uB,QAAS,kBAAM8uB,GAA4B,OAAO9jC,UAAWisB,EAAKjsB,YAClH,kBAAC,GAAD,CAAaiC,KAAM4gC,EAAe7tB,QAAS,kBAAM8tB,GAAiB,IAAQhE,OAAQV,GAAWhJ,gBAAiBnJ,EAAKxgB,YAAazL,UAAWisB,EAAKjsB,UAAWk1B,YAAamP,S,8FE9pBpL,IAQergB,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAtJf,SAAiBnS,GAAQ,IAAD,EACYqD,IAAMC,SAAS,MAD3B,oBACbjV,EADa,KACH2tB,EADG,OAEM3Y,IAAMC,SAAS,MAFrB,oBAEb/J,EAFa,KAENiqB,EAFM,OAGYngB,IAAMC,SAAS,IAH3B,oBAGb4xB,EAHa,KAGHC,EAHG,OAIoB9xB,IAAMC,SAAS,IAJnC,oBAIb8xB,EAJa,KAICC,EAJD,OAKchyB,IAAMC,SAAS,IAL7B,oBAKbtH,EALa,KAKFs5B,EALE,OAMkBjyB,IAAMC,SAAS,MANjC,oBAMb2Z,EANa,KAMAC,EANA,OAO0B7Z,IAAMC,UAAS,GAPzC,oBAObiyB,EAPa,KAOIC,EAPJ,OAQwBnyB,IAAMC,UAAS,GARvC,oBAQbmyB,EARa,KAQGC,EARH,OAS4BryB,IAAMC,UAAS,GAT3C,oBASbqyB,EATa,KASKC,EATL,OAUQvyB,IAAMC,SAAS,IAVvB,oBAUbuyB,EAVa,KAULC,EAVK,OAWsCzyB,IAAMC,UAAS,GAXrD,oBAWbyyB,EAXa,KAWUC,EAXV,OAYU3yB,IAAMC,UAAS,GAZzB,oBAYbf,EAZa,KAYJuC,EAZI,cA6CLmxB,IA7CK,8EA6CpB,4BAAAlmC,EAAA,6DACIylC,GAAmB,GACnBtY,EAAe,MAFnB,SAG2B7qB,GAAe0F,2BAH1C,QAGU/F,EAHV,QAIkBb,UAIVukC,GAAkB,GAClBF,GAAmB,GACnBtY,EAAelrB,EAASZ,QALxBskC,GAAkB,GAClBM,GAAyB,IANjC,4CA7CoB,sBAoEpB,SAASE,GAAcjhB,EAAM/M,GAA4B,IAAnBiuB,EAAkB,uDAAN,KAC9C,OACI,kBAACxuB,GAAA,EAAD,CAAUyuB,OAAK,GACX,kBAACC,GAAA,EAAD,KACI,kBAACxe,GAAA,EAAD,KAAS5C,IAEb,kBAAChN,GAAA,EAAD,CAAcC,QAASA,EAASiuB,UAAWA,KA4BvD,OAvFA9yB,IAAMyH,WAAU,WAAM,4CAClB,gDAAA/a,EAAA,yDACSiQ,EAAMoa,KAAKtH,gBADpB,uBAEQ9S,EAAMwS,YAAY,UAF1B,0CAKqCngB,GAAekG,sBALpD,cAKU+9B,EALV,QAM4BnlC,WAAW,EACImlC,EAAmBllC,KAA9CwI,EADsB,EACtBA,YAAaoC,EADS,EACTA,UACrBq5B,EAAiBhkC,GAAkBuI,GAA+B,GAAhB,CAACA,IACnD07B,EAAat5B,IAEjB1K,QAAQc,IAAIkkC,GAXhB,UAYmCjkC,GAAe4F,cAZlD,SAYUs+B,EAZV,QAa0BplC,SASlB+rB,EAAeqZ,EAAiBnlC,OATH,EACqCmlC,EAAiBnlC,KAA3E/C,EADoB,EACpBA,SAAUkL,EADU,EACVA,MAAOk8B,EADG,EACHA,eAAgBI,EADb,EACaA,OAAQW,EADrB,EACqBA,aACjDxa,EAAY3tB,GACZm1B,EAASjqB,GACTm8B,EAAkBD,GAClBK,EAAUD,GACVD,EAAoBY,GACpBrB,EAAYn1B,EAAMoa,KAAKne,OAI3B6I,GAAW,GAxBf,6CADkB,uBAAC,WAAD,wBA2BlBvV,KACD,CAACyQ,IA4DA,kBAAC4b,GAAA,EAAD,CAAWtZ,SAAS,KAAKwF,MAAO,CAAEjG,UAAW,KACzC,kBAACsL,GAAD,CAAgB5K,QAASA,IAEzB,kBAACkG,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,WAIA,kBAACJ,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACqQ,GAAA,EAAD,KACI,kBAAC3N,GAAA,EAAD,KACKgrB,GAAc,kBAAC,KAAD,MAAgB,YAAa7nC,GAC3C6nC,GAAc,kBAAC,KAAD,MAAc38B,EAAOk8B,EAAiB,YAAc,iBAClES,GAAc,kBAAC,KAAD,MAAoB,cAAer9B,IAAOg9B,GAAQjgB,OAAO,iBACvEsgB,GAAc,kBAAC,KAAD,MAAc,QA7BrD,WAA8B,IAAD,EACrBO,EACEC,EAAQ,uBAAOxB,GAAP,aAAoBE,GAApB,aAAqCp5B,IASnD,OARK3K,GAAkBqlC,IAAaA,EAAStjC,OAAS,IAClDqjC,EAAeC,EAAS5wB,KAAI,SAAC7J,EAAM7G,GAAP,OACxB,0BAAMH,IAAKG,GAlCvB,SAAqB6G,GACjB,OAAQA,GACJ,IAAK,mBACD,MAAO,mBACX,QACI,OAAOA,GA8BF06B,CAAY16B,GACZ7G,EAAIshC,EAAStjC,OAAS,EAAI,KAAO,QAI9C,UAAOqjC,SAAP,QAAuB,WAkBmCG,OAIlD,kBAACruB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOvI,KAAMgd,KAEjB,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ2K,UAAWC,KAAMC,GAAG,kBAAkBvY,MAAM,UAAU6L,QAAQ,YAAYgC,WAAS,GAA3F,oBAIJ,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IAlD3B,WACI,IAAMquB,KAAepB,IAAmBF,IAAoBQ,GAC5D,OACI,kBAACxrB,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+K,QAASquB,EAA6BvrB,WAAS,EAACE,SAAUisB,GACjGA,EAAY,aAAe,8BA+CvBC,IAEL,kBAACvuB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ2K,UAAWC,KAAMC,GAAG,mBAAmBvY,MAAM,UAAU6L,QAAQ,YAAYgC,WAAS,GACtFirB,EAA2C,yBAAxB,6BChB7C,IAOexjB,iBAPS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAEW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EApIf,SAAwBnS,GAAQ,IAAD,EACmBqD,IAAMC,SAAS,IADlC,oBACpBhI,EADoB,KACHy7B,EADG,OAEW1zB,IAAMC,SAAS,IAF1B,oBAEpBxI,EAFoB,KAEPk8B,EAFO,OAGmC3zB,IAAMC,SAAS,IAHlD,oBAGpB/H,EAHoB,KAGK07B,EAHL,OAIS5zB,IAAMC,UAAS,GAJxB,oBAIpByZ,EAJoB,KAIRC,EAJQ,OAKW3Z,IAAMC,SAAS,MAL1B,oBAKpB2Z,EALoB,KAKPC,EALO,OAMO7Z,IAAMC,UAAS,GANtB,oBAMpB4zB,EANoB,KAMTC,EANS,iDAe3B,WAA4B3mC,GAA5B,eAAAT,EAAA,yDACIS,EAAMsW,iBACNkW,GAAc,GACdE,EAAe,MACXpiB,IAAgBS,EAJxB,uBAKQ2hB,EAAe,mCALvB,0CAQ2B7qB,GAAesF,eAAe2D,EAAiBR,EAAaS,GARvF,QAQUvJ,EARV,QASkBb,SAGV+rB,EAAelrB,EAASZ,MAFxB+lC,GAAa,GAIjBna,GAAc,GAdlB,6CAf2B,sBAgC3B,SAAS3W,EAAY7V,GACjB,IAAMtB,EAAOsB,EAAMC,OAAOvB,KACpB6F,EAAQvE,EAAMC,OAAOsE,MAE3B,OAAQ7F,GACJ,IAAK,kBACD6nC,EAAmBhiC,GACnB,MACJ,IAAK,cACDiiC,EAAejiC,GACf,MACJ,IAAK,0BACDkiC,EAA2BliC,GAC3B,MACJ,QACI,QA8DZ,OApGAsO,IAAMC,UAAS,WACNtD,EAAMoa,KAAKtH,iBACZ9S,EAAMwS,YAAY,YAEvB,CAACxS,IAiGA,kBAAC4b,GAAA,EAAD,CAAWtZ,SAAS,KAAKwF,MAAO,CAAEjG,UAAW,KACzC,0BAAMsK,SA/Ga,6CAgHf,kBAAC5D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,oBA9DXuuB,EA4CD,oCACI,kBAAC3uB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYuI,MAAM,UAAlB,uFAEJ,kBAACzI,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ2K,UAAWC,KAAMC,GAAG,kBAAkBvY,MAAM,UAAU6L,QAAQ,YAAYgC,WAAS,GAA3F,qBA/CJ,oCACI,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,yBACHya,MAAM,mBACN2D,KAAK,WACL9X,MAAOuG,EACPkO,SAAUnD,EACVnX,KAAK,kBACLwZ,QAAQ,SACRgC,WAAS,EACT4B,UAAQ,KAGhB,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWtb,GAAG,qBAAqBya,MAAM,eAAe2D,KAAK,WAAW9X,MAAO+F,EAAa0O,SAAUnD,EAAanX,KAAK,cAAcwZ,QAAQ,SAASgC,WAAS,EAAC4B,UAAQ,KAE7K,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,yBACHya,MAAM,uBACN2D,KAAK,WACL9X,MAAOwG,EACPiO,SAAUnD,EACVnX,KAAK,0BACLwZ,QAAQ,SACRgC,WAAS,EACT4B,UAAQ,KAGhB,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAMgd,KAEhD,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQK,SAAUmS,EAAYlgB,MAAM,UAAU6L,QAAQ,YAAYmE,KAAK,SAASnC,WAAS,GAAzF,2BCzFT,SAAS0sB,GAAap3B,GAAQ,IAAD,EACVqD,IAAMC,UAAS,GADL,oBACjCf,EADiC,KACxBuC,EADwB,OAEVzB,IAAMC,UAAS,GAFL,oBAEjCwW,EAFiC,KAExBud,EAFwB,KAGhC/Y,EAAWte,EAAM/J,SAAjBqoB,OAqBR,OAlBAjb,IAAMyH,WAAU,WAAM,4CAClB,kCAAA/a,EAAA,6DACUwW,EAAS1Q,KAAYwoB,MAAMC,GACzBlwB,EAAsBmY,EAAtBnY,OAAQkpC,EAAc/wB,EAAd+wB,UAFpB,SAG2BjlC,GAAe2F,0BAA0B5J,EAAQkpC,GAH5E,OAGUtlC,EAHV,OAIIqlC,GAAYrlC,EAASb,UACrB2T,GAAW,GALf,4CADkB,uBAAC,WAAD,wBAQlBvV,KACD,CAAC+uB,IAUA,kBAAC1C,GAAA,EAAD,CAAWtZ,SAAS,MAChB,kBAAC6K,GAAD,CAAgB5K,QAASA,IACzB,kBAACkG,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,sBATApG,EACO,KAEJ,kBAAC,GAAD,CAAOlC,OAAQyZ,EAAU,UAAY,wBAAyB7Z,KAAM6Z,EAAU,kBAAoB,0BAA2BxZ,SAAUwZ,EAAU,UAAY,WCwF5K,IAQe3H,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EApHR,SAAqBnS,GAAQ,IAAD,EACeqD,IAAMC,SAAS,IAD9B,oBACxBhI,EADwB,KACPy7B,EADO,OAEC1zB,IAAMC,SAAS,IAFhB,oBAExBi0B,EAFwB,KAEdC,EAFc,OAGOn0B,IAAMC,UAAS,GAHtB,oBAGxBm0B,EAHwB,KAGXC,EAHW,OAIKr0B,IAAMC,UAAS,GAJpB,oBAIxByZ,EAJwB,KAIZC,EAJY,OAKO3Z,IAAMC,SAAS,MALtB,oBAKxB2Z,EALwB,KAKXC,EALW,cAchBC,EAdgB,8EAc/B,WAA4B3sB,GAA5B,eAAAT,EAAA,6DACIS,EAAMsW,iBACNkW,GAAc,GAFlB,SAG2B3qB,GAAeslC,mBAAmBJ,EAAUj8B,GAHvE,QAGUtJ,EAHV,QAIiBb,SACT+rB,EAAelrB,EAASZ,MAExBsmC,GAAe,GAEnB1a,GAAc,GATlB,4CAd+B,sBA0B/B,SAAS3W,EAAY7V,GACjB,IAAMtB,EAAOsB,EAAMC,OAAOvB,KACpB6F,EAAQvE,EAAMC,OAAOsE,MAE3B,OAAQ7F,GACJ,IAAK,kBACD6nC,EAAmBhiC,GACnB,MACJ,IAAK,WACDyiC,EAAYziC,GACZ,MACJ,QACI,QAIZ,SAAS6iC,IACL,OACI,kBAACnvB,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAC/C8uB,EAAc,eAAiB,gBAwD5C,OA7FAp0B,IAAMyH,WAAU,WACP9K,EAAMoa,KAAKtH,iBACZ9S,EAAMwS,YAAY,YAEvB,CAACxS,IA0FA,kBAAC4b,GAAA,EAAD,CAAWtZ,SAAS,KAAKwF,MAAO,CAAEjG,UAAW,KACxC41B,EAzBD,oCACI,kBAAClvB,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVovB,KAEL,kBAACrvB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYuI,MAAM,UAAlB,6BAAsDumB,IAE1D,kBAAChvB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYuI,MAAM,SAAStI,QAAQ,SAAnC,kEAIJ,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ2K,UAAWC,KAAMC,GAAG,kBAAkB1K,WAAS,EAAC7N,MAAM,UAAU6L,QAAQ,aAAhF,sBAxCZ,0BAAMyD,SAAUgR,GACZ,kBAAC5U,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVovB,KAEL,kBAACrvB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWtb,GAAG,iBAAiBya,MAAM,YAAYnU,MAAOwiC,EAAU/tB,SAAUnD,EAAanX,KAAK,WAAWwZ,QAAQ,SAAS4D,UAAQ,EAAC5B,WAAS,KAEhJ,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWtb,GAAG,qBAAqBya,MAAM,WAAW2D,KAAK,WAAW9X,MAAOuG,EAAiBkO,SAAUnD,EAAanX,KAAK,kBAAkBwZ,QAAQ,SAAS4D,UAAQ,EAAC5B,WAAS,KAEjL,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAMgd,KAEhD,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAACE,SAAUmS,EAAYlgB,MAAM,UAAU6L,QAAQ,YAAYmE,KAAK,UAAjF,+BClBxB,IAQesF,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAvDR,SAA4BnS,GAAQ,IAAD,EACRqD,IAAMC,UAAS,GADP,oBAC/Bf,EAD+B,KACtBuC,EADsB,OAERzB,IAAMC,UAAS,GAFP,oBAE/BwW,EAF+B,KAEtBud,EAFsB,OAGNh0B,IAAMC,UAAS,GAHT,oBAG/Bi0B,EAH+B,KAGrBC,EAHqB,KAI9BhlB,EAAsBxS,EAAtBwS,YAAa4H,EAASpa,EAAToa,KACbkE,EAAWte,EAAM/J,SAAjBqoB,OA+BR,OA5BAjb,IAAMyH,WAAU,WAAM,4CAClB,8BAAA/a,EAAA,yDACSqqB,EAAKtH,gBADd,uBAEQN,EAAY,UAFpB,iCAKUjM,EAAS1Q,KAAYwoB,MAAMC,GALrC,SAM2BjsB,GAAewlC,mBAAmBtxB,EAAO+wB,WANpE,YAMUtlC,EANV,QAOiBb,SAPjB,iBAQQkmC,GAAW,GARnB,yCAUc/nC,GAAUG,OAAO,YAV/B,yBAWcH,GAAUE,IAAI,WAAYwC,EAASZ,KAAK/C,UAXtD,QAYQmpC,EAAYxlC,EAASZ,KAAK/C,UAC1BgpC,GAAW,GAbnB,QAeIvyB,GAAW,GAff,6CADkB,uBAAC,WAAD,wBAkBlBvV,KACD,CAACyQ,EAAOse,EAAQ9L,EAAa4H,IAU5B,kBAACwB,GAAA,EAAD,CAAWtZ,SAAS,MAChB,kBAAC6K,GAAD,CAAgB5K,QAASA,IACzB,kBAACkG,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,sBATApG,EACO,KAEJ,kBAAC,GAAD,CAAOlC,OAAQyZ,EAAUyd,EAAW,wBAAyBt3B,KAAM6Z,EAAU,sBAAwB,8BAA+BxZ,SAAUwZ,EAAU,UAAY,cChC7KpZ,GAAYC,cAAW,iBAAO,CAChCkb,SAAU,CACNrZ,QAAS,OACT1B,cAAe,SACf2B,WAAY,UAEhBvF,KAAM,CACF0U,aAAc,GACdtP,SAAU,SA0FlB,IAQe6P,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EA9Ff,SAAwBnS,GAAQ,IAAD,EACKqD,IAAMC,SAAS,IADpB,oBACpBjV,EADoB,KACV2tB,EADU,OAEW3Y,IAAMC,SAAS,MAF1B,oBAEpB2Z,EAFoB,KAEPC,EAFO,OAGO7Z,IAAMC,UAAS,GAHtB,oBAGpBuzB,EAHoB,KAGTiB,EAHS,OAISz0B,IAAMC,UAAS,GAJxB,oBAIpByZ,EAJoB,KAIRC,EAJQ,KAKrB5X,EAAU1E,KALW,SAcZyc,EAdY,8EAc3B,WAA4B3sB,GAA5B,eAAAT,EAAA,6DACIS,EAAMsW,iBACNoW,EAAe,MACfF,GAAc,GAHlB,SAI2B3qB,GAAeoF,eAAepJ,GAJzD,QAIU2D,EAJV,QAKiBb,SACT+rB,EAAelrB,EAASZ,MAExB0mC,GAAa,GAEjB9a,GAAc,GAVlB,4CAd2B,sBA2B3B,SAAS3W,EAAY7V,GACjB,IAAMuE,EAAQvE,EAAMC,OAAOsE,MAC3BinB,EAAYjnB,GA4ChB,OAjEAsO,IAAMyH,WAAU,WACR9K,EAAMoa,KAAKtH,iBACX9S,EAAMwS,YAAY,YAEvB,CAACxS,IA8DA,kBAAC2b,GAAD,CAAYJ,UAAWqC,MACnB,kBAAChC,GAAA,EAAD,CAAWtZ,SAAS,KAAKuF,UAAWzC,EAAQyW,UACxC,yBAAKjT,IAAKiV,KAAahV,IAAI,iBAAiBhB,UAAWzC,EAAQlI,OAC/D,kBAACuL,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,EAACb,MAAO,CAAEyJ,SAAU,KAAxE,mBAPAslB,EAhBJ,kBAACtuB,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG3D,MAAO,CAAEjG,UAAW,KAC5C,kBAAC0G,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,YAAYsI,MAAM,SAASlI,WAAS,GAAxD,4EAIJ,kBAACP,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ2K,UAAWC,KAAMC,GAAG,SAAS1M,QAAQ,YAAY7L,MAAM,UAAU6N,WAAS,GAAlF,mBA3BR,0BAAMyB,SAAUgR,GACZ,kBAAC5U,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAW7a,KAAK,WAAWga,MAAM,kBAAkBgH,OAAO,SAASxH,QAAQ,SAASc,SAAUnD,EAAatR,MAAO1G,EAAUwe,KAAK,OAAOnC,WAAS,EAAC4B,UAAQ,KAE9J,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAMgd,KAEhD,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQK,SAAUmS,EAAYlgB,MAAM,UAAU6L,QAAQ,YAAYmE,KAAK,SAASnC,WAAS,GAAzF,kBCyFxB,IAQeyH,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAvJf,SAAuBnS,GAAQ,IAAD,EACMqD,IAAMC,SAAS,IADrB,oBACnB1P,EADmB,KACTqoB,EADS,OAE8B5Y,IAAMC,SAAS,IAF7C,oBAEnBjI,EAFmB,KAEG08B,EAFH,OAGY10B,IAAMC,SAAS,IAH3B,oBAGnB2Z,EAHmB,KAGNC,EAHM,OAIY7Z,IAAMC,UAAS,GAJ3B,oBAInB00B,EAJmB,KAINC,EAJM,OAK8B50B,IAAMC,SAAS,MAL7C,oBAKnB3P,EALmB,KAKGipB,EALH,OAMkBvZ,IAAMC,SAAS,IANjC,oBAMnBuZ,EANmB,KAMHC,EANG,OAOYzZ,IAAMC,SAAS,MAP3B,oBAOnBuQ,EAPmB,KAONC,EAPM,OAQUzQ,IAAMC,UAAS,GARzB,oBAQnByZ,EARmB,KAQPC,EARO,KASpBzW,EAAS1Q,KAAYwoB,MAAMre,EAAM/J,SAASqoB,QATtB,4CAoC1B,WAA4B9tB,GAA5B,mBAAAT,EAAA,6DACIS,EAAMsW,iBACNkW,GAAc,GACdib,GAAe,GAEP7pC,EAAsBmY,EAAtBnY,OAAQkpC,EAAc/wB,EAAd+wB,UALpB,SAM2BjlC,GAAeqF,cAActJ,EAAQkpC,EAAW1jC,EAAUyH,GANrF,QAMUrJ,EANV,QAOiBb,UACT+rB,EAAelrB,EAASZ,MACxB4rB,GAAc,GACdib,GAAe,IAEfnkB,EAAe,UAZvB,4CApC0B,sBAoD1B,SAASzN,EAAY7V,GACjB,IAAMtB,EAAOsB,EAAMC,OAAOvB,KACpB6F,EAAQvE,EAAMC,OAAOsE,MAE3B,OAAQ7F,GACJ,IAAK,WACD+sB,EAAYlnB,GACZ,MACJ,IAAK,uBACDgjC,EAAwBhjC,IA7DV,4CAoE1B,sBAAAhF,EAAA,sDACI+sB,EAAkBppB,GAAcC,EAAsBC,IAD1D,4CApE0B,sBAoF1B,OAxEAyP,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,6DACQiQ,EAAMoa,KAAKtH,iBACX9S,EAAMwS,YAAY,KAF1B,SAImCngB,GAAemF,0BAJlD,QAIUmmB,EAJV,QAK0BxsB,UAGlB+rB,EAAe,yCACf+a,GAAe,IAHfrb,EAAwBe,EAAiBvsB,MANjD,4CADkB,uBAAC,WAAD,wBAalB7B,KACD,CAACyQ,IAGJqD,IAAMyH,WAAU,WACRzZ,GAAkBwiB,IAGtB7T,EAAMwS,YAAYqB,KACnB,CAACA,EAAa7T,IAmDb,kBAAC2b,GAAD,CAAYJ,UAAWqC,MACnB,kBAAChC,GAAA,EAAD,CAAWtZ,SAAS,MAChB,0BAAM6J,SAvFQ,4CAuFgBrE,MAAO,CAAEtF,QAAS,OAAQC,WAAY,SAAU3B,cAAe,WACzF,yBACIgH,MAAO,CACH8J,aAAc,GACdtP,SAAU,KAEdsG,IAAKiV,KACLhV,IAAI,mBAER,kBAACJ,GAAA,EAAD,CAAYuI,MAAM,SAAStI,QAAQ,KAAKC,cAAY,EAACb,MAAO,CAAEyJ,SAAU,KAAxE,kBAGA,kBAAChJ,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,iBACHya,MAAM,WACN2D,KAAK,WACL9X,MAAOnB,EACP4V,SAAUnD,EACVnX,KAAK,WACLuuB,OAAQ,kBA5GV,0CA4GgBC,IACdH,WApCM,IAA1BV,EAAezpB,OACR,KAEJypB,EAAe/W,KAAI,SAAC1L,EAAGhF,GAAJ,OACtB,kBAAC,IAAMooB,SAAP,CAAgBvoB,IAAKG,GACjB,8BAAOgF,GACP,iCA+BgBsO,QAAQ,SACRgC,WAAS,EACT4B,UAAQ,KAGhB,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,yBACHya,MAAM,mBACN2D,KAAK,WACL9X,MAAOsG,EACPmO,SAAUnD,EACVnX,KAAK,uBACLwZ,QAAQ,SACRgC,WAAS,EACT4B,UAAQ,KAGhB,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVwvB,EAAc,kBAAC,GAAD,CAAO33B,OAAO,wBAAwBJ,KAAMgd,IAAkB,MAEjF,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAACE,SAAUmS,EAAYrU,QAAQ,YAAY7L,MAAM,UAAUgQ,KAAK,UAAjF,kB,UC8E5B,IAQesF,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EA7Nf,SAA0BnS,GAAQ,IAAD,EACSqD,IAAMC,SAAS,MADxB,oBACtB2Z,EADsB,KACTC,EADS,OAEmB7Z,IAAMC,UAAS,GAFlC,oBAEtBqyB,EAFsB,KAEJC,EAFI,OAGuBvyB,IAAMC,SAAS,MAHtC,oBAGtB40B,EAHsB,KAGFC,EAHE,OAIuB90B,IAAMC,SAAS,IAJtC,oBAItB80B,EAJsB,KAIFC,EAJE,OAK6Bh1B,IAAMC,SAAS,MAL5C,oBAKtBg1B,EALsB,KAKCC,EALD,OAMCl1B,IAAMC,UAAS,GANhB,oBAMtBf,EANsB,KAMbuC,EANa,KAQvB0zB,EAAgBlzB,sBAAW,sBAAC,gCAAAvV,EAAA,6DAC9BmtB,EAAe,MADe,SAEP7qB,GAAe4F,cAFR,YAExBjG,EAFwB,QAGjBb,SAHiB,uBAI1B+rB,EAAelrB,EAASZ,MAJE,6BAOtBolC,EAAiBxkC,EAASZ,KAA1BolC,aAPsB,kCASHnkC,GAAe8F,uBATZ,aASpBsgC,EAToB,QAUbtnC,SAVa,wBAWtB+rB,EAAeub,EAASrnC,MAXF,2BAc1B+mC,EAAsBM,EAASrnC,MAdL,QAgB9BwkC,EAAoBY,GAhBU,4CAiB/B,IAzB0B,4CAuC7B,WAAyBhmC,GAAzB,eAAAT,EAAA,6DACIS,EAAMsW,iBACNoW,EAAe,MACfpY,GAAW,GAHf,SAI2BzS,GAAe+F,aAAa8/B,EAAmBQ,SAAUN,GAJpF,QAIUpmC,EAJV,QAKiBb,SACT+rB,EAAelrB,EAASZ,OAExBmnC,EAAyBvmC,EAASZ,MAClCinC,EAAsB,IACtBzC,GAAoB,IAExB9wB,GAAW,GAZf,4CAvC6B,kEAsD7B,WAA4BtU,GAA5B,eAAAT,EAAA,6DACIS,EAAMsW,iBACNhC,GAAW,GACXoY,EAAe,MAHnB,SAI2B7qB,GAAegG,gBAAgB+/B,GAJ1D,YAIUpmC,EAJV,QAKiBb,SALjB,iBAMQ+rB,EAAelrB,EAASZ,MANhC,+BAQQmnC,EAAyB,MACzBF,EAAsB,IACtBzC,GAAoB,GAV5B,UAWc4C,IAXd,QAaI1zB,GAAW,GAbf,6CAtD6B,sBAsE7B,SAASuB,EAAY7V,GACjB,IAAMtB,EAAOsB,EAAMC,OAAOvB,KACpB6F,EAAQvE,EAAMC,OAAOsE,MAE3B,OAAQ7F,GACJ,IAAK,qBACDmpC,EAAsBtjC,GACtB,MACJ,QACI,QAkHZ,OArKAsO,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,6DACSiQ,EAAMoa,KAAKtH,iBACZ9S,EAAMwS,YAAY,UAF1B,SAIUgmB,IAJV,OAKI1zB,GAAW,GALf,4CADkB,uBAAC,WAAD,wBAQlBvV,KACD,CAACyQ,EAAOw4B,IA6JP,kBAAC5c,GAAA,EAAD,CAAWtZ,SAAS,KAAKwF,MAAO,CAAEjG,UAAW,KACzC,kBAACsL,GAAD,CAAgB5K,QAASA,IAEzB,0BAAM4J,SAAUwpB,EArMK,yFAsMjB,kBAACltB,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,oBAGA,kBAACJ,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAMgd,KA9D5B,MAAzBqb,EACH,kBAAC/vB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACqQ,GAAA,EAAD,CAAMnQ,QAAQ,YACV,kBAACoQ,GAAA,EAAD,CACI6f,UACI,kBAAClwB,GAAA,EAAD,CAAYC,QAAQ,YAAYsI,MAAM,UAAtC,2BAKR,kBAAC6E,GAAA,EAAD,MACA,kBAACkD,GAAA,EAAD,CAAajR,MAAO,CAAEtG,QAAS,KAC3B,kBAACiH,GAAA,EAAD,CAAYuI,MAAM,SAASlJ,MAAO,CAAE8wB,UAAW,aAC1CN,IAGT,kBAACziB,GAAA,EAAD,MACA,kBAACkD,GAAA,EAAD,CAAajR,MAAO,CAAEtG,QAAS,KAC3B,kBAACiH,GAAA,EAAD,CAAYC,QAAQ,YAAYsI,MAAM,UAAtC,kFAMZ,KAyCS2kB,EApCT,oCACI,kBAACptB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,2BACHya,MAAM,uBACN2D,KAAK,OACL9X,MAAOqjC,EACP5uB,SAAUnD,EACVnX,KAAK,qBACLwZ,QAAQ,SACRgC,WAAS,EACT4B,UAAQ,KAGhB,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAAC7N,MAAM,UAAU6L,QAAQ,YAAYmE,KAAK,UAA3D,0BArER,oCAjCR,WACI,IAAIgsB,EAAa,KA2BjB,OA1BKlD,GAA0C,MAAtBuC,IACrBW,EACI,oCACI,kBAACtwB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GAAIV,MAAO,CAAEiU,UAAW,WACnC,kBAAC,UAAD,CAAQ+c,QAAQ,UAAUC,QAAQ,UAAUxP,MAAM,IAAIzhB,MAAO,CAAEvG,MAAO,KAAOxM,MAAOmjC,EAAmBc,UAE3G,kBAACzwB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACqQ,GAAA,EAAD,CAAMnQ,QAAQ,YACV,kBAACoQ,GAAA,EAAD,CACI6f,UACI,kBAAClwB,GAAA,EAAD,CAAYC,QAAQ,YAAYsI,MAAM,UAAtC,6CAKR,kBAAC6E,GAAA,EAAD,MACA,kBAACkD,GAAA,EAAD,CAAajR,MAAO,CAAEtG,QAAS,KAC3B,kBAACiH,GAAA,EAAD,CAAYuI,MAAM,SAASlJ,MAAO,CAAE8wB,UAAW,aAC1CV,EAAmBz8B,aAQzCo9B,EAMEI,GACD,kBAAC1wB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,2BACHya,MAAM,uBACN2D,KAAK,OACL9X,MAAOqjC,EACP5uB,SAAUnD,EACVnX,KAAK,qBACLwZ,QAAQ,SACRgC,WAAS,EACT4B,UAAQ,KAGhB,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAAC7N,MAAM,UAAU6L,QAAQ,YAAYmE,KAAK,UAA3D,6BCzEpB,IAOesF,iBAPS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAEW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAnEf,SAAyBnS,GAAQ,IAAD,EACJqD,IAAMC,SAAS,IADX,oBACrBlI,EADqB,KACf89B,EADe,OAEM71B,IAAMC,UAAS,GAFrB,oBAErB61B,EAFqB,KAEVC,EAFU,OAGU/1B,IAAMC,SAAS,MAHzB,oBAGrB2Z,EAHqB,KAGRC,EAHQ,OAIU7Z,IAAMC,SAAS,MAJzB,oBAIrBuQ,EAJqB,KAIRC,EAJQ,iDAc5B,4BAAA/jB,EAAA,6DACIqpC,GAAa,GACblc,EAAe,MAFnB,SAG2B7qB,GAAeiG,gBAAgB8C,GAH1D,QAGUpJ,EAHV,QAIiBb,UACT+rB,EAAelrB,EAASZ,MACxBgoC,GAAa,IAEbtlB,EAAe,KARvB,4CAd4B,sBA0B5B,OAnBAzQ,IAAMyH,WAAU,WACRzZ,GAAkBwiB,IAGtB7T,EAAMwS,YAAYqB,KACnB,CAACA,EAAa7T,IAeb,kBAAC4b,GAAA,EAAD,CAAWtZ,SAAS,KAAKwF,MAAO,CAAEjG,UAAW,KACzC,kBAAC0G,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,6BAIJ,kBAACJ,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACI7a,KAAK,OACLga,MAAM,iBACNM,SAAU,SAAApP,GACN8+B,EAAQ9+B,EAAE3J,OAAOsE,QAErBA,MAAOqG,EACPyR,KAAK,OACLnE,QAAQ,SACRgC,WAAS,KAGjB,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAMgd,KAEhD,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAAChC,QAAQ,YAAY7L,MAAM,UAAU+N,SAAUuuB,EAAWvxB,QAnD/D,4CAmDZ,gBCzDL,SAASyxB,KACpB,OACI,kBAACzd,GAAA,EAAD,CAAWtZ,SAAS,MAChB,kBAACmG,GAAA,EAAD,CAAYuI,MAAM,UAAlB,uBCIZ,IAAMtQ,GAAYC,cAAW,iBAAO,CAChC/D,KAAM,CACF+F,WAAY,OACZC,cAAe,QAEnBmP,MAAO,CACHvQ,QAAS,iBA6GjB,IAOe2Q,iBAPS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAEW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAhHf,SAA0BnS,GAAQ,IACtBwS,EAAgBxS,EAAhBwS,YACAM,EAAoB9S,EAAMoa,KAA1BtH,gBAFqB,EAGCzP,IAAMC,UAAS,GAHhB,oBAGtBf,EAHsB,KAGbuC,EAHa,OAIazB,IAAMC,SAAS,IAJ5B,oBAItBg2B,EAJsB,KAIPC,EAJO,OAKSl2B,IAAMC,SAAS,MALxB,oBAKtB2Z,EALsB,KAKTC,EALS,OAML7Z,IAAMC,SAAS,GANV,oBAMtBpH,EANsB,KAMhBs9B,EANgB,OAOOn2B,IAAMC,UAAS,GAPtB,oBAOtBm2B,EAPsB,KAOVC,EAPU,KAQvBt0B,EAAU1E,KAEVi5B,EAAqBr0B,sBAAW,sBAAC,4BAAAvV,EAAA,6DACnCmtB,EAAe,MACfpY,GAAW,GAFwB,SAGZ3I,GAAwBG,OAAOJ,GAHnB,QAG7BlK,EAH6B,QAIrBb,UAQV+rB,EAAelrB,EAASZ,MACxBsoC,GAAc,KARdH,EAAiB,GAAD,oBAAKD,GAAL,aAAuBtnC,EAASZ,QAC5CY,EAASZ,KAAKgC,OAAS,IACvBsmC,GAAc,GAEdF,EAAQt9B,EAAO,IAMvB4I,GAAW,GAfwB,2CAgBpC,CAACw0B,EAAep9B,IA4DnB,OAzDAmH,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,yDACS+iB,EADT,uBAEQN,EAAY,UAFpB,6BAKiC,IAAzB8mB,EAAclmC,OALtB,gCAMcumC,IANd,4CADkB,uBAAC,WAAD,wBAUlBpqC,KACD,CAACujB,EAAiBN,EAAamnB,EAAoBL,IA+ClD,kBAAC1d,GAAA,EAAD,CAAWtZ,SAAS,KAAKuF,UAAWzC,EAAQxI,MACxC,kBAACuQ,GAAD,CAAgB5K,QAASA,IAEzB,kBAACkG,GAAA,EAAD,CAAYC,QAAQ,KAAKsI,MAAM,SAASrI,cAAY,GAApD,iBAIA,kBAACJ,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GAnDA,IAAzB6tB,EAAclmC,OAEV,kBAACmV,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GAAIvT,IAAI,aACnB,kBAAC8b,GAAA,EAAD,CAAOrI,QAAQ,WAAWkxB,QAAM,EAAC/xB,UAAWzC,EAAQ2M,OAChD,kBAACtJ,GAAA,EAAD,CAAYC,QAAQ,QAAQ7L,MAAM,gBAAgBmU,MAAM,UAAxD,sBAOTsoB,EAAcxzB,KAAI,SAAC1L,EAAGhF,GAAJ,OAG7B,SAA2B2c,EAAO/c,GAAQ,IAC9BwJ,EAA4BuT,EAA5BvT,MAAO0B,EAAqB6R,EAArB7R,QAASwV,EAAY3D,EAAZ2D,QACxB,OACI,kBAACnN,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GAAIvT,IAAKD,GACpB,kBAAC+b,GAAA,EAAD,CAAOrI,QAAQ,WAAWkxB,QAAM,EAAC/xB,UAAWzC,EAAQ2M,OAChD,kBAACtJ,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GACnCnK,GAEL,kBAACiK,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GACnCzI,GAEL,kBAACuI,GAAA,EAAD,CAAYC,QAAQ,UAAU7L,MAAM,iBAC/BhE,IAAOC,IAAI4c,GAASC,QAAQC,OAAO,kBAfjBE,CAAkB1b,EAAGhF,MA0ChD,kBAACmT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAMgd,KAnBpD,kBAAC1U,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAAChC,QAAQ,YAAYkC,UAAW6uB,EAAY7xB,QAAS,kBAAM+xB,MAA5E,mB,kJCtFVj5B,GAAYC,cAAW,iBAAO,CAChCuuB,QAAS,CACL1d,UAAW,IACX1O,SAAU,WACV,cAAc,qFACV0O,UAAW,KACRqoB,GAAep9B,GAAiB,MAChCo9B,GAAep9B,GAAmB,MAClCo9B,GAAe,UAAW,MAC1BA,GAAe,UAAW,MAC1BA,GAAe,UAAW,MAC1BA,GAAe,UAAW,MAC1BA,GAAe,UAAW,MAEjC,mBAAoB,CAChBroB,UAAW,KAEf,eAAe,qFACX,cAAe,CACXzO,IAAK,IAEN+2B,GAAiBr9B,GAAiB,IAClCq9B,GAAiBr9B,GAAmB,IACpCq9B,GAAiB,UAAW,IAC5BA,GAAiB,UAAW,IAC5BA,GAAiB,UAAW,IAC5BA,GAAiB,UAAW,IAC5BA,GAAiB,UAAW,IAEnC,eAAgB,CACZ,kBAAmB,CACf5Z,WAAY,IACZpjB,gBAAiB,+BAI7Bi9B,UAAW,CACP,iBAAkB,CACd,SAAU,CACNC,gBAAiB,WAI7BC,QAAS,CACLl3B,IAAK,EACLqO,KAAM,EACNvU,MAAO,OACPC,gBAAiB,OACjB4U,aAAc,EACd/P,UAAW,wGACXuL,OAAQ,IACR,YAAa,CACTgtB,eAAgB,gBAGxBC,iBAAkB,CACd,4BAA6B,CACzB33B,QAAS,aAKfs3B,GAAmB,SAACj9B,EAAO7H,GAAR,qBACrB,wBAAyB,CACrBolC,WAAY,2BAFK,uBAIJplC,EAJI,aAIe,CAChColC,WAAYv9B,EACZw9B,YAAax9B,KAIfg9B,GAAiB,SAACh9B,EAAOy9B,GAAR,+CACDA,GAAW,CACzB,aAAc,CACVC,OAAQ19B,GAEZ,cAAe,CACX09B,OAAQ19B,MAKd29B,GAAa,CACf,CACIC,MAAO,EACPC,SAAU,EACVxrC,KAAM,WAEV,CACIurC,MAAO,EACPC,SAAU,EACVxrC,KAAM,WAEV,CACIurC,MAAO,GACPC,SAAU,EACVxrC,KAAM,YAEV,CACIurC,MAAO,GACPC,SAAU,EACVxrC,KAAM,YAEV,CACIurC,MAAO,GACPC,SAAU,EACVxrC,KAAM,WAIP,SAASyrC,GAAe36B,GAAQ,IAAD,IAC1BxB,EAAyDwB,EAAzDxB,MAAOo8B,EAAkD56B,EAAlD46B,OAAQN,EAA0Ct6B,EAA1Cs6B,OAAQO,EAAkC76B,EAAlC66B,OAAQC,EAA0B96B,EAA1B86B,aAAcv4B,EAAYvC,EAAZuC,QADnB,EAEAc,IAAMC,SAAS,GAFf,oBAE3By3B,EAF2B,KAEhBC,EAFgB,OAGA33B,IAAMC,SAAS,CAC7CujB,IAAKoU,EAAqBpiC,OAC1B4d,MAAOwkB,EAAqBpiC,MAASqiC,SAAS,OAAQV,GAAWO,GAAWN,UAL9C,oBAG3BU,EAH2B,KAGhBC,EAHgB,OAOR/3B,IAAMC,UAAS,GAPP,oBAO3B+3B,EAP2B,KAOpBC,EAPoB,OAQAj4B,IAAMC,UAAS,GARf,oBAQ3Bi4B,EAR2B,KAQhBC,EARgB,KAS5Bp2B,EAAU1E,KAEV+6B,EAAkBp4B,IAAMiC,aAAY,WAEtC,IADA,IAAMo2B,EAAW5rC,OAAOqW,SAASw1B,uBAAuB,oBAC/CvmC,EAAI,EAAGA,EAAIsmC,EAAStoC,OAAQgC,IACjCsmC,EAAStmC,GAAGwmC,gBAAgB,WAEjC,IAcH,SAASC,IAAkC,IAAZC,EAAW,uDAAH,EAC7BrlB,EAAQslB,EAAqBZ,EAAU1kB,OACvCoQ,EAAMkV,EAAqBZ,EAAUtU,KAC3CuU,EAAa,CACTvU,IAAKoU,EAAqBpU,EAAIr3B,IAAI,OAAQssC,IAC1CrlB,MAAOwkB,EAAqBxkB,EAAMjnB,IAAI,OAAQssC,MAItD,SAASE,IAAsB,IAAXC,EAAU,uDAAH,EACjBC,EAAcnB,EAAYkB,EAC5BC,GAAe1B,GAAWpnC,QAAU8oC,EAAc,IAGtDlB,EAAakB,GACbd,EAAa,CACTvU,IAAKsU,EAAUtU,IACfpQ,MAAOwkB,EAAqBc,EAAqBZ,EAAUtU,KAAKqU,SAAS,OAAQV,GAAW0B,GAAazB,WAIjH,SAASQ,EAAqBlmC,GAC1B,OAAsB,GAAfA,EAAMonC,OAAc,GAAK,GAGpC,SAASJ,EAAqBhnC,GAC1B,OAAO8D,IAAOsjC,KAAKpnC,EAAQ,GAAK,GAAK,IAGzC,SAASqnC,IAIL,IAHA,IAAMC,EAAM,GACNC,EAAOP,EAAqBZ,EAAU1kB,OACtCoQ,EAAMkV,EAAqBZ,EAAUtU,KACpCyV,EAAKC,SAAS1V,IACjBwV,EAAIhoC,KAAmB,GAAdioC,EAAKH,OAAc,GAAK,IACjCG,EAAK9sC,IAAI,OAAQgrC,GAAWO,GAAWL,UAE3C,OAAO2B,EAjDXh5B,IAAMyH,WAAU,WACZ,IAAM0xB,EAAWC,KAAKC,UAAU,CAAEl+B,QAAOo8B,SAAQN,SAAQO,WAQzD,OAPIQ,IAAUmB,IACVlB,EAASkB,GACThB,GAAa,GACbvhB,YAAW,WACPuhB,GAAa,KACd,KAEAC,IACR,CAACj9B,EAAOo8B,EAAQN,EAAQO,EAAQQ,EAAOI,IA0C1C,IAAMkB,EAAmB7B,GAAY,oBAAGR,EAAO,UAAV,aAAG,EAAWlpC,KAAKqV,QAAO,SAAArM,GAAC,OAAIA,EAAEwiC,EAAIzB,EAAU1kB,OAASrc,EAAEwiC,EAAIzB,EAAUtU,OAAK/gB,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAawiC,EAAGxiC,EAAEwiC,EAAGC,EAAW,OAARziC,EAAEyiC,EAAaC,WAAW1iC,EAAEyiC,GAAK,iBAA3I,QAA4J,GAE3LE,EAAQhD,KAAU4C,EAAkB,IAAK,KAEzCvrC,EAAO,CACTwpC,OAAQE,EAAesB,IAAuBxB,EAC9CN,OAAQQ,EACF,CACI,CAAE5rC,KAAM,UAAWkC,KAAMurC,GACzB,CAAEztC,KAAM,QAASkC,KAAMgrC,IAAqBt2B,KAAI,SAAA1L,GAAC,MAAK,CAAEwiC,EAAGxiC,EAAGyiC,EAAGE,EAAMC,MAAM5iC,SAEjFkgC,GAGJjxB,EAAU,CACZ4zB,UAAU,EACVC,QAAS,CACLC,KAASD,QAAQjD,QAAQ,CACrBmD,MAAM,GAAD,OAAKh4B,EAAQ60B,SAAb,OAAuBa,EAAY,WAAO11B,EAAQ+0B,kBAAqB,IAC5EkD,eAAe,EACfC,cAAc,IAElBH,KAASD,QAAQrC,OAAO,CACpB0C,YAAa1C,KAGrBP,OAAQQ,EACF,CACI0C,QAAS,CACLC,UAAU,GAEdV,MAAO,CACHW,WAAW,IAGnB,GACNC,MAAM,aACFC,sBAAuB,SAAU7oC,GAC7B,OAAOA,EAAQ,IAAM,EAAIA,EAAQ,OAEjC+lC,EACE,CACI+C,IAAK,EACLC,KAAM,KAEV,IAEVC,MAAOjD,EACD,CACIjuB,KAAMiuB,EAAeqC,KAASa,eAAiB,KAC/CC,MAAOnD,EAAesB,IAAuB,KAC7CwB,sBAAuB9C,EACjB,SAAU/lC,GACN,OAAOgnC,EAAqBhnC,GAAO6gB,OAAO,eAE9C,KACNioB,IAAK/C,EAAeK,EAAU1kB,MAAQ,KACtCqnB,KAAMhD,EAAeK,EAAUtU,IAAM,MAEzC,IAKV,OACI,kBAAChO,GAAA,EAAD,CAAMhR,UAAS,UAAKzC,EAAQ8pB,SAAb,OAAuB4L,EAAY,WAAO11B,EAAQ20B,WAAc,KAC1EwB,GACG,oCACI,kBAACziB,GAAA,EAAD,CAAYta,MAAOA,IACnB,kBAAC,KAAD,CAAepN,KAAMA,EAAMiY,QAASA,EAASwD,KAPhD,SAQItK,EAAU,kBAAC0I,GAAA,EAAD,CAAkB2M,KAAM,GAAI/P,UAAU,aAAgB,MAGxEizB,GACG,kBAAC9hB,GAAA,EAAD,CAAalR,MAAO,CAAEzF,eAAgB,kBAClC,kBAACoG,GAAA,EAAD,CAAYC,QAAQ,QAAQZ,MAAO,CAAE/F,YAAa,KAC9C,sCAAYy4B,GAAWO,GAAW7rC,OAEtC,kBAACgvC,GAAA,EAAD,CAAax1B,QAAQ,YACjB,kBAAC6B,GAAA,EAAD,CAAQ3C,QAAS,kBAAMi0B,GAAuB,KAC1C,kBAACsC,GAAA,EAAD,OAEJ,kBAAC5zB,GAAA,EAAD,CAAQ3C,QAAS,kBAAMo0B,GAAY,IAAIpxB,SAAUmwB,GAAa,GAC1D,kBAACqD,GAAA,EAAD,OAEJ,kBAAC7zB,GAAA,EAAD,CAAQ3C,QAAS,kBAAMo0B,EAAW,IAAIpxB,SAAUmwB,GAAaP,GAAWpnC,OAAS,GAC7E,kBAACirC,GAAA,EAAD,OAEJ,kBAAC9zB,GAAA,EAAD,CAAQ3C,QAAS,kBAAMi0B,EAAsB,KACzC,kBAACyC,GAAA,EAAD,U,4CCvQtB59B,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCsuB,QAAQ,cACJ1tB,QAAS,YAET,cAAe,CACXsB,SAAU,WACVC,IAAK,GACLC,MAAO,KAGVpC,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,KAGjBgK,UAAU,cACNlJ,SAAU,uBACT1B,EAAMK,YAAYC,KAAK,MAAQ,CAC5BoB,SAAU,uBAGlBi8B,WAAY,CACRh9B,MAAO,OACPiB,QAAS,QACTuZ,UAAW,QACXjf,gBAAiBL,GACjBiV,aAAc,EACd5O,SAAU,WACV,yBAA0B,CACtBH,WAAY,GACZC,cAAe,IAEnB,iBAAkB,CACdJ,QAAS,OACTX,UAAW,IAEf,gBAAiB,CACbN,MAAO,OACPC,QAAS,aAEb,0BAA2B,CACvBA,QAAS,YACTD,MAAO,OAEX,eAAgB,CACZouB,WAAW,aAAD,OAAelzB,KAE7B,UAAW,CACPmV,aAAc,EACd,sBAAuB,CACnB4sB,WAAY,SACZC,SAAU,SACVC,aAAc,aAGtB,gBAAiB,CACbl8B,QAAS,QACT8xB,WAAY,OACZnyB,UAAW,eAGnBumB,SAAU,CACNlmB,QAAS,OACTH,eAAgB,gBAChBI,WAAY,SACZ+O,UAAW,GACXke,WAAY,gBACZ5sB,SAAU,WACV6lB,aAAa,aAAD,OAAelsB,IAC3BkiC,oBAAqB,EACrBnP,qBAAsB,EACtBhuB,QAAS,WACTouB,OAAQ,UACR,UAAW,CACP9yB,gBAAiBL,GACjBgF,gBAAiB,oCACjBC,aAAc,oCACdC,UAAW,qCAEf,cAAe,CACXJ,MAAO,GACPR,OAAQ,GACRoP,UAAW,QACXyuB,eAAgB,SAChBltB,aAAc,EACd5O,SAAU,YAEd,UAAW,CACP+7B,cAAe,QAEnB,qBAAsB,CAClBvK,WAAY,IAEhB,cAAe,CACXwK,KAAM,EACNt9B,QAAS,EACT,UAAW,CACPs9B,KAAM,KAIlBC,aAAc,CACVnW,OAAO,aAAD,OAAensB,IACrBqG,SAAU,WACV,UAAW,CACPA,SAAU,WACVC,IAAK,EACLC,MAAO,EACPlG,gBAAiBL,GACjBiV,aAAc,GACd3Q,OAAQ,GACR,SAAU,CACNmB,KAAMzF,KAGd,UAAW,CACP49B,YAAa59B,GACb,UAAW,CACPK,gBAAiBL,MAI7BuiC,YAAa,CACTpP,OAAQ,UACRpuB,QAAS,GACTkuB,WAAY,gBACZ,WAAY,CACR5yB,gBAAiBL,GACjB,wBAAyB,CACrBI,MAAOJ,GAAgB,gBAG/B,UAAW,CACPK,gBAAiBL,GACjB,wBAAyB,CACrBI,MAAOJ,GAAgB,iBAInC4D,OAAQ,CACJwB,UAAW,IAEfo9B,SAAU,CACN19B,MAAO,OACPR,OAAQ,IACRyB,QAAS,OACTH,eAAgB,SAChBI,WAAY,SACZmqB,UAAW,gCACXlb,aAAc,EACdxB,OAAQ,OAIVgvB,GACG,EADHA,GAEI,EAFJA,GAGI,EAHJA,GAIU,EAozBhB,IAiBe/sB,iBAjBS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,eACZ6sB,eAAgB/sB,EAAMgtB,cAGC,SAAA7sB,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnCiuC,qBAAsB,SAAAh0B,GAAK,OAAIkH,EC5+BC,SAAAlH,GAAK,MAAK,CAC1CwB,KAAM,yBACNxB,SD0+BwCg0B,CAAqBh0B,KAC7Di0B,kBAAmB,SAAAj0B,GAAK,OAAIkH,ECx+BC,SAAAlH,GAAK,MAAK,CACvCwB,KAAM,sBACNxB,SDs+BqCi0B,CAAkBj0B,KACvDk0B,kBAAmB,SAAAl0B,GAAK,OAAIkH,ECp+BC,SAAAlH,GAAK,MAAK,CACvCwB,KAAM,sBACNxB,SDk+BqCk0B,CAAkBl0B,KACvDm0B,wBAAyB,SAAAn0B,GAAK,OAAIkH,ECh+BC,SAAAlH,GAAK,MAAK,CAC7CwB,KAAM,4BACNxB,SD89B2Cm0B,CAAwBn0B,KACnEo0B,aAAc,SAAAp0B,GAAK,OAAIkH,ECv9BC,SAAAlH,GAAK,MAAK,CAClCwB,KAAM,iBACNxB,SDq9BgCo0B,CAAap0B,KAC7C5H,cAAe,SAAA4H,GAAK,OAAIkH,ECn9BC,SAAAlH,GAAK,MAAK,CACnCwB,KAAM,kBACNxB,SDi9BiC5H,CAAc4H,KAC/C9H,SAAU,SAAA8H,GAAK,OAAIkH,EC99BC,SAAAlH,GAAK,MAAK,CAC9BwB,KAAM,YACNxB,SD49B4B9H,CAAS8H,KACrCq0B,WAAY,kBAAMntB,ECh9BW,CAC7B1F,KAAM,yBDk9BKsF,EAl0Bf,SAAmBnS,GACf,IAAM2/B,EAAmB3/B,EAAM/J,SAASqoB,OADlB,EAEuDzoB,KAAYwoB,MAAMshB,GAAvFrxC,EAFc,EAEdA,OAAQsxC,EAFM,EAENA,SAAUxxC,EAFJ,EAEIA,OAAQC,EAFZ,EAEYA,SAAUM,EAFtB,EAEsBA,aAAckxC,EAFpC,EAEoCA,eAClDzlB,EAAkKpa,EAAlKoa,KAAM5H,EAA4JxS,EAA5JwS,YAAa2sB,EAA+In/B,EAA/Im/B,eAAgBE,EAA+Hr/B,EAA/Hq/B,qBAAsBC,EAAyGt/B,EAAzGs/B,kBAAmBE,EAAsFx/B,EAAtFw/B,wBAAyBD,EAA6Dv/B,EAA7Du/B,kBAAmBE,EAA0Cz/B,EAA1Cy/B,aAAch8B,EAA4BzD,EAA5ByD,cAAeF,EAAavD,EAAbuD,SACrJu8B,EAA0GX,EAA1GW,kBAAmBC,EAAuFZ,EAAvFY,qBAAsBC,EAAiEb,EAAjEa,eAAgBC,EAAiDd,EAAjDc,eAAgBC,EAAiCf,EAAjCe,UAAW18B,EAAsB27B,EAAtB37B,WAAY1J,EAAUqlC,EAAVrlC,MAJlF,EAMgBuJ,IAAMC,SAAS,MAN/B,oBAMfuQ,EANe,KAMFC,EANE,OAOwBzQ,IAAMC,SAAS,MAPvC,oBAOf68B,EAPe,KAOEC,EAPF,OAQQ/8B,IAAMC,SAAS,MARvB,oBAQfsB,EARe,KAQNC,EARM,OASkBxB,IAAMC,UAAS,GATjC,oBASf+8B,EATe,KASDC,EATC,OAU4Bj9B,IAAMC,UAAS,GAV3C,oBAUfi9B,EAVe,KAUIC,EAVJ,OAW4Bn9B,IAAMC,UAAS,GAX3C,oBAWfm9B,EAXe,KAWIC,GAXJ,QAYkBr9B,IAAMC,UAAS,GAZjC,sBAYfq9B,GAZe,MAYDC,GAZC,SAaYv9B,IAAMC,UAAS,GAb3B,sBAafu9B,GAbe,MAaJC,GAbI,MAehB17B,GAAU1E,KAEVqgC,GACD1vC,GAAkB1C,IAAkB0C,GAAkBwuC,IAAoBxuC,GAAkBjD,IAAYiD,GAAkBhD,GAEpHgD,GAAkBjD,IAAYiD,GAAkBhD,GAEhDgD,GAAkB/C,IAAY+C,GAAkBuuC,GAEjDV,GADAA,GAFAA,GAFAA,GAOJ8B,GAASD,KAAc7B,GACvB+B,GAAeF,KAAc7B,GAiB7BgC,GAfgB,WAAO,IAAD,MACxB,OAAQH,IACJ,KAAK7B,GACD,OAAOY,EACX,KAAKZ,GACD,iBAAOc,EAAe1xC,UAAtB,QAAiC,GACrC,KAAK4wC,GACD,iBAAOe,EAAe7xC,UAAtB,QAAiC,GACrC,KAAK8wC,GACD,iBAAOa,EAAqBpxC,UAA5B,QAA6C,GACjD,QACI,MAAO,IAIAwyC,GAEbC,GAA8B/9B,IAAMiC,YAAN,uCAAkB,WAAOnX,EAAWkzC,GAAlB,eAAAtxC,EAAA,yDACb,MAAjCsxC,EAAeC,gBAA4D,MAAlCD,EAAeE,gBADV,uBAE9Cb,IAAqB,GAFyB,SAGvBviC,GAAoBC,cAAcjQ,GAHX,QAGxC6D,EAHwC,QAIjCb,SACT0T,EAAW7S,EAASZ,OAEpBqS,EAAczR,EAASZ,MACvBsvC,IAAqB,GACrB5wC,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuDovB,gBAAiBxvC,EAASZ,OAAQ,KAT/C,2CAAlB,wDAYjC,IAEGqwC,GAAyBp+B,IAAMiC,YAAN,uCAC3B,WAAOnX,EAAWkzC,GAAlB,SAAAtxC,EAAA,yDACuC,MAA/BsxC,EAAeK,aADvB,yCAAA3xC,EAAA,wCAAAA,EAAA,6DAEQuwC,GAAgB,GAFxB,SAG+BhjC,GAAeC,SAASpP,GAHvD,YAGc6D,EAHd,QAIqBb,SAJrB,gBAKY0T,EAAW7S,EAASZ,MALhC,uBAOkBuwC,EAAY7nC,EAElB9H,EAASZ,KAAOY,EAASZ,KAAK0U,KAAI,SAAA1L,GAC9B,IAAMwnC,EAAWD,EAAUlc,MAAK,SAAAoc,GAAE,OAAIA,EAAGpzC,KAAO2L,EAAE3L,MAElD,GAAImzC,EAAU,CAAC,IACHE,EAAaF,EAAbE,SACR,GAAI5uC,OAAOC,KAAKyuC,GAAUxtC,SAAS,YAC/B,OAAO,2BAAKgG,GAAZ,IAAe0nC,aAGvB,OAAO1nC,KAGXmJ,EAASvR,EAASZ,MAClBkvC,GAAgB,GAtB5B,IAAAvwC,EAAA,iBAwBqBqF,GAxBrB,eAAArF,EAAA,yDAyBiC4xC,EAAUlc,MAAK,SAAAoc,GAAE,OAAIA,EAAGpzC,KAAOuD,EAASZ,KAAKgE,GAAG3G,MAzBjF,gCA2B8C6O,GAAeE,YAAYrP,EAAW6D,EAASZ,KAAKgE,GAAG3G,IA3BrG,YA2B0BkkC,EA3B1B,QA4BoCxhC,SA5BpC,4DA+BoBa,EAASZ,KAAKgE,GAAG0sC,SAAWnP,EAAYvhC,KA/B5D,0CAwBqBgE,EAAI,EAxBzB,aAwB4BA,EAAIpD,EAASZ,KAAKgC,QAxB9C,0CAwBqBgC,GAxBrB,8FAwBsDA,IAxBtD,wBAmCYmO,EAASvR,EAASZ,MAClBtB,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuD2vB,WAAY/vC,EAASZ,OAAQ,IApChG,gGAD2B,wDAyC3B,CAAC0I,IAGCkoC,GAAyB3+B,IAAMiC,YAAN,uCAC3B,WAAOnX,EAAWkzC,GAAlB,eAAAtxC,EAAA,yDACuC,MAA/BsxC,EAAeY,aADvB,yCAAAlyC,EAAA,0CAAAA,EAAA,6DAEQ6wC,IAAgB,GAFxB,SAG+B9yB,GAAkBC,gBAAgB5f,GAHjE,YAGc6D,EAHd,QAIqBb,SAJrB,gBAKY0T,EAAW7S,EAASZ,MALhC,uBAOkB8wC,EAAgBhC,EAEtBluC,EAASZ,KAAOY,EAASZ,KAAK0U,KAAI,SAAA1L,GAC9B,IAAM+nC,EAAeD,EAAczc,MAAK,SAAAoc,GAAE,OAAIA,EAAGpzC,KAAO2L,EAAE3L,MAE1D,GAAI0zC,EAAc,CAAC,IACPxgB,EAAawgB,EAAbxgB,SACR,GAAIzuB,OAAOC,KAAKgvC,GAAc/tC,SAAS,YACnC,OAAO,2BAAKgG,GAAZ,IAAeunB,aAIvB,OAAOvnB,KAGXqlC,EAAaztC,EAASZ,MACtBwvC,IAAgB,GAvB5B,IAAA7wC,EAAA,iBAyBqBqF,GAzBrB,eAAArF,EAAA,yDA0BqCmyC,EAAczc,MAAK,SAAAoc,GAAE,OAAIA,EAAGpzC,KAAOuD,EAASZ,KAAKgE,GAAG3G,MA1BzF,gCA6B8Cqf,GAAkBI,kBAAkB/f,EAAW6D,EAASZ,KAAKgE,GAAG3G,IA7B9G,YA6B0BkkC,EA7B1B,QA8BoCxhC,SA9BpC,gEAiCoBa,EAASZ,KAAKgE,GAAGusB,SAAWgR,EAAYvhC,KAjC5D,0CAyBqBgE,EAAI,EAzBzB,aAyB4BA,EAAIpD,EAASZ,KAAKgC,QAzB9C,0CAyBqBgC,GAzBrB,qGAyBsDA,IAzBtD,wBAqCYqqC,EAAaztC,EAASZ,MACtBtB,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuDgwB,WAAYpwC,EAASZ,OAAQ,IAtChG,kLAD2B,wDA2C3B,CAAC8uC,IAGCmC,GAAqBh/B,IAAMiC,YAAN,uCACvB,WAAOnX,EAAWkzC,GAAlB,SAAAtxC,EAAA,sDACIqxC,GAA4BjzC,EAAWkzC,GACvCW,GAAuB7zC,EAAWkzC,GAClCI,GAAuBtzC,EAAWkzC,IAC7BhwC,GAAkBgwC,EAAejuC,SAAWiuC,EAAejuC,OAAS,GACrEgtC,EAAmBiB,EAAe,GAAG5yC,IAL7C,2CADuB,wDASvB,CAACqL,EAAOomC,EAAWkB,GAA6BY,GAAwBP,KAGtEa,GAAoBj/B,IAAMiC,YAAN,uCACtB,WAAMnX,GAAN,eAAA4B,EAAA,6DACIywC,GAAqB,GADzB,SAG2BnZ,GAAqBQ,4BAA4B15B,GAH5E,YAGU6D,EAHV,QAIiBb,SAJjB,gBAKQ0T,EAAW7S,EAASZ,MAL5B,8BAOQiuC,EAAqBrtC,EAASZ,MAC9BovC,GAAqB,GACrB1wC,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuDmwB,uBAAwBvwC,EAASZ,OAAQ,IATxG,UAUcixC,GAAmBl0C,EAAW6D,EAASZ,MAVrD,QAYIovC,GAAqB,GAZzB,4CADsB,sDAetB,CAAC6B,KAGCG,GAAqBn/B,IAAMiC,YAAN,uCACvB,WAAMnX,GAAN,iBAAA4B,EAAA,6DACIywC,GAAqB,GADzB,SAE2BnZ,GAAqBS,yBAAyB35B,EAAWG,GAFpF,YAEU0D,EAFV,QAGiBb,SAHjB,gBAIQ0T,EAAW7S,EAASZ,MAJ5B,8BAMcqxC,EANd,2BAMuCzC,GANvC,mBAMwD1xC,EAAS0D,EAASZ,OAClEkuC,EAAkBmD,GAClBjC,GAAqB,GACrB1wC,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuDswB,oBAAqBD,IAAqB,IATzG,UAUcJ,GAAmBl0C,EAAW6D,EAASZ,MAVrD,QAYIovC,GAAqB,GAZzB,4CADuB,sDAevB,CAAClyC,EAAQ+zC,KAGPM,GAAqBt/B,IAAMiC,YAAN,uCACvB,WAAMnX,GAAN,iBAAA4B,EAAA,6DACIywC,GAAqB,GADzB,SAE2BnZ,GAAqBU,yBAAyB55B,EAAWC,GAFpF,YAEU4D,EAFV,QAGiBb,SAHjB,gBAIQ0T,EAAW7S,EAASZ,MAJ5B,8BAMcwxC,EANd,2BAMuC3C,GANvC,mBAMwD7xC,EAAS4D,EAASZ,OAClEmuC,EAAkBqD,GAClBpC,GAAqB,GACrB1wC,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuDywB,oBAAqBD,IAAqB,IATzG,UAUcP,GAAmBl0C,EAAW6D,EAASZ,MAVrD,QAYIovC,GAAqB,GAZzB,4CADuB,sDAevB,CAACpyC,EAAQi0C,KAGPS,GAA2Bz/B,IAAMiC,YAAN,uCAC7B,WAAMnX,GAAN,iBAAA4B,EAAA,6DACIywC,GAAqB,GADzB,SAE2BnZ,GAAqBW,qBAAqB75B,EAAWC,EAAQO,GAFxF,YAEUqD,EAFV,QAGiBb,SAHjB,gBAIQ0T,EAAW7S,EAASZ,MAJ5B,8BAMcwxC,EANd,2BAMuC7C,GANvC,mBAM8DpxC,EAAeqD,EAASZ,OAC9EouC,EAAwBoD,GACxBpC,GAAqB,GACrB1wC,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuDwwB,sBAAqB,IATpF,UAUcP,GAAmBl0C,EAAW6D,EAASZ,MAVrD,QAYIovC,GAAqB,GAZzB,4CAD6B,sDAe7B,CAACpyC,EAAQO,EAAc0zC,KAkD3B,SAASU,KACL,IACI,OAAO7B,GAAWzb,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAO0xC,KACvC,SACE,OAAO,MAIf,SAAS6C,GAAkBC,GAOvB,IAPqE,IAAjCC,EAAgC,wDAC9Dt6B,EAAM1V,OAAOqT,OAAO08B,GACrBE,UACA18B,QAAO,SAAArM,GAAC,OAAIvB,IAAOC,IAAIsB,EAAEkiC,MAAMvjC,eAAeF,IAAOC,MAAMtJ,IAAI,EAAG,WAEjEgU,EAAa,GAEVpO,EAAI,EAAGA,EAAIwT,EAAIxV,OAAQgC,IAC5B,IAAK,IAAIg5B,EAAI,EAAGA,EAAIxlB,EAAIxT,GAAGguC,iBAAiBhwC,OAAQg7B,IAAK,CAAC,IAC9Cn5B,EAAQ2T,EAAIxT,GAAGguC,iBAAiBhV,GAAhCn5B,IACHuO,EAAWpP,SAASa,IACrBuO,EAAWnP,KAAKY,GAK5B,IAAMouC,EAAeH,EAAyB,EAAI,KAE5ChyC,EAAS,CAAEoyC,KAAM16B,EAAI9C,KAAI,SAAA1L,GAAC,OAAM/I,GAAkB+I,EAAErF,OAA+BsuC,EAAtBE,KAAKC,MAAMppC,EAAErF,WAEhF,GAAIisC,GACA,OAAO9vC,EAGX,IAxBoE,eAwB3DkE,GACLlE,EAAOsS,EAAWpO,IAAMwT,EAAI9C,KAAI,SAAA1L,GAAM,IAAD,IAC3BrF,EAAK,oBAAGqF,EAAEgpC,iBAAiB3d,MAAK,SAAAoP,GAAC,OAAIA,EAAE5/B,MAAQuO,EAAWpO,aAArD,aAAG,EAAuDL,aAA1D,QAAmE,KAC9E,OAAQ1D,GAAkB0D,GAA6BsuC,EAApBE,KAAKC,MAAMzuC,OAH7CK,EAAI,EAAGA,EAAIoO,EAAWpQ,OAAQgC,IAAM,EAApCA,GAOT,OAAOlE,EAGX,SAASuyC,KACL,OAAQ1C,IACJ,KAAK7B,GACD,MAAO,WACX,KAAKA,GACD,OAAOU,EACX,KAAKV,GACD,OAAO7wC,EACX,KAAK6wC,GACD,OAAO7wC,EAAW,MAAQwxC,EAC9B,QACI,OAAO,MA6DnB,SAAS6D,GAAgBllC,GAAkG,IAA3FmlC,EAA0F,uDAAvE,GAAIC,EAAmE,uDAAvD,GAAIh8B,EAAmD,uCAA1Ci8B,EAA0C,wDAApBC,EAAoB,wDAChHC,EAAa,SAACjiC,EAAM9M,GAAW,IAAD,EAChC,OACI,yBAAK6S,UAAU,OAAO5S,IAAKD,GACvB,kBAACkiB,GAAA,EAAD,CAAS1Y,MAAK,iBAAEsD,QAAF,IAAEA,OAAF,EAAEA,EAAM5S,YAAR,QAAgB,IAC1B,kBAACuZ,GAAA,EAAD,CAAYC,QAAQ,KAAKwM,UAAU,OAC9BpT,EAAK5S,OAGd,kBAACuZ,GAAA,EAAD,CAAYC,QAAQ,UAAUwM,UAAU,OACnCpT,EAAK1Q,QAMtB,OACI,kBAACmX,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,GAAID,GAAI,GAAIxd,GAAI,IAClC,kBAACqQ,GAAA,EAAD,CAAMhR,UAAWzC,GAAQm5B,WAAYrpB,UAAW8uB,KAAYp5B,SAAUvZ,GAAkBuW,GAAUA,QAASA,GACvG,kBAACmR,GAAA,EAAD,KACI,kBAACtQ,GAAA,EAAD,CAAYC,QAAQ,UAAUwM,UAAU,MAAMlE,MAAM,UAC/CxS,EAAMuZ,eAEX,kBAACtP,GAAA,EAAD,CAAYC,QAAQ,UAAUwM,UAAU,MAAMlE,MAAM,UAApD,kCAGCuvB,EAAoB,kBAACt1B,GAAA,EAAD,CAAkB2M,KAAM,GAAI/P,UAAU,aAAgB,KAC3E,yBAAKA,UAAU,eACX,yBAAKA,UAAS,UAAKg8B,EAAe,aAAe,aAC5CA,GAAgBC,EAAa,kBAACG,GAAA,EAAD,CAAYp8B,UAAU,eAAkB,kBAACq8B,GAAA,EAAD,CAAcr8B,UAAU,eAC7F87B,EAAiBR,UAAUr9B,IAAIi+B,IAEnCF,EAAe,KACZ,yBAAKh8B,UAAU,aACX,kBAACo8B,GAAA,EAAD,CAAYp8B,UAAU,eACrB+7B,EAAUT,UAAUr9B,IAAIi+B,QAsOzD,SAASI,GAAeriC,EAAM9M,EAAOovC,GAAS,IAClCl1C,EAAwC4S,EAAxC5S,KAAMm1C,EAAkCviC,EAAlCuiC,kBAAmB51C,EAAeqT,EAAfrT,GAAI61C,EAAWxiC,EAAXwiC,OAE/Bz3B,EAAOu3B,EAAS,OAAS,OAE/B,OACI,kBAAC77B,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,GAAID,GAAI,GAAIxd,GAAI,GAAIvT,IAAKD,GAC3C,yBAAK6S,UAAWzC,GAAQsjB,SAAU9gB,QAH7B,kBAAMkM,EAAe,KAAD,OAAMjH,EAAN,cAAgBpe,EAAhB,YAAsBoe,EAAtB,gBAAkC3d,MAIvD,yBAAK0Z,IAAMvX,GAAkBizC,IAAsB,KAAXA,EAAyBziB,KAATyiB,EAAkBz7B,IAAK3Z,EAAM2Y,UAAU,aAC/F,yBAAKA,UAAU,mBACX,uCACA,6BACA,2BAAI3Y,IAER,yBAAK2Y,UAAU,YACX,gEACA,6BACA,4BAAyB,IAApBw8B,GAAyB3uC,QAAQ,GAAtC,QA8GpB,OAxiBA2N,IAAMyH,WAAU,WACZ,GAAI+1B,IAAalB,EAAjB,CAEAmB,GAAanB,GAHK,IAKV7sB,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YACpB5H,GAAoB4H,GACrB5G,EAAe,UAPD,0CA6BlBvkB,GAAO0B,MAAK,WACR2vC,IAAgB,GAChBF,IAAqB,GACrBJ,GAAgB,GAChBE,GAAqB,GACrB1wC,OAAOgG,QAAQC,aAAf,2BAAiCjG,OAAOgG,QAAQsc,OAAhD,IAAuDmyB,eAAe,IAAQ,OAlChE,4CAUlB,4BAAAx0C,EAAA,sDACY5B,EAAcisB,EAAdjsB,UADZ,KAEY4yC,GAFZ,cAGa7B,GAHb,SAMaA,GANb,SASaA,GATb,UAYaA,GAZb,mCAIkBoD,GAAkBn0C,GAJpC,0DAOkBq0C,GAAmBr0C,GAPrC,4DAUkBw0C,GAAmBx0C,GAVrC,6DAakB20C,GAAyB30C,GAb3C,yFAVkB,yBAoCnB,CAACisB,EAAMymB,GAAWE,GAAWuB,GAAmBE,GAAoBG,GAAoBG,KAG3Fz/B,IAAMyH,WAAU,WACPzZ,GAAkBwiB,KACnBrB,EAAYqB,GACZC,EAAe,SAEpB,CAACD,EAAarB,IA6fb,yBAAK3K,UAAWzC,GAAQ8pB,SACpB,kBAAC3mB,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,GAAQoG,WAC3C,kBAACjD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IAnchB,kBAACC,GAAA,EAAD,CAAYC,QAAQ,MAApB,eAAsC+6B,OAscrC,kBAACl7B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAM2E,KAE9Cq8B,GAIE,KAHA,kBAAC14B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IArcvB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpBi4B,GACG,qDACCzwC,GAAQiuC,IAKH,GAJAA,GAAWsD,eAAe1+B,KAAI,SAAA1L,GAAC,MAAK,CAChClL,KAAMkL,EAAEoE,MACRpN,KAAK,GAAD,OAAKgJ,EAAEqqC,oBAAP,mCAAqDrqC,EAAEsqC,cAAvD,oBAAoG,IAApBtqC,EAAEsqC,cAAsB,IAAM,QAG5H,IACA,kBACI5wB,EAAe,sBAAD,OACaziB,GAAkB/C,GAAuE,GAA1F,iBAAuCA,GAAvC,OAAiD+C,GAAkBjD,GAAgB,GAAN,MADzF,OAC4GiD,GAAkBjD,GAA+B,GAAlD,iBAAuCA,QAEpK,GAEHs1C,GACG,kDACCzwC,GAAQiuC,IAKH,GAJAA,GAAWyD,gBAAgB7+B,KAAI,SAAA1L,GAAC,MAAK,CACjClL,KAAMkL,EAAEoE,MACRpN,KAAK,GAAD,OAAKmE,GAAkB6E,EAAEwqC,qBAAsB,GAA/C,0BAAmExqC,EAAEsqC,cAArE,sBAAoH,IAApBtqC,EAAEsqC,cAAsB,IAAM,QAG3IzxC,GAAQiuC,IAKH,GAJAA,GAAW2D,eAAe/+B,KAAI,SAAA1L,GAAC,MAAK,CAChClL,KAAMkL,EAAEoE,MACRpN,KAAK,GAAD,OAAKmE,GAAkB6E,EAAEwqC,qBAAsB,GAA/C,0BAAmExqC,EAAEsqC,cAArE,sBAAoH,IAApBtqC,EAAEsqC,cAAsB,IAAM,QAG5I1D,GAAS,KAAO,kBAAMltB,EAAe,wBAAD,OAA0BziB,GAAkB/C,GAA+B,GAAlD,iBAAuCA,OAEtG0yC,GAcI,KAbA0C,GACI,sDACCzwC,GAAQiuC,IAKH,GAJAA,GAAWI,eAAex7B,KAAI,SAAA1L,GAAC,cAAK,CAChClL,KAAI,oBAAEsU,EAAWiiB,MAAK,SAAAqf,GAAC,OAAIA,EAAEr2C,KAAO2L,EAAEoE,gBAAlC,aAAE,EAAwCtP,YAA1C,QAAkDkL,EAAEoE,MACxDpN,KAAK,GAAD,OAAKmE,GAAkB6E,EAAEwqC,qBAAsB,GAA/C,6BAAsExqC,EAAEsqC,cAAxE,sBAAuH,IAApBtqC,EAAEsqC,cAAsB,IAAM,QAG/I,IACA,kBAAM5wB,EAAe,uBAAD,OAAyBziB,GAAkB/C,GAA+B,GAAlD,iBAAuCA,QACnF,GACA,KA6ZV,kBAACia,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IAzW3B,WACI,GAAInX,GAAkB6vC,IAClB,OAAO,KAGX,IAAI6D,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAgB,GAChBC,EAAgB,GAChBC,EAAgB,GAChBC,EAAc,GACdC,EAAc,GACdC,EAAc,GAElB,OAAQxE,IACJ,KAAK7B,GACL,KAAKA,GACL,KAAKA,GACD,IAAK7tC,GAAkB6vC,GAAWsE,qBAAsB,CACpD,IAAMC,EAAYzC,GAAkB9B,GAAWsE,qBAAqB,GACpER,EAAkB9xC,OAAOqT,OAAOk/B,GAChCV,EAAkB7xC,OAAOqT,OAAO26B,GAAWsE,qBACtCrC,UACA18B,QAAO,SAAArM,GAAC,OAAIvB,IAAOC,IAAIsB,EAAEkiC,MAAMvjC,eAAeF,IAAOC,UACrDgN,KAAI,SAAA1L,GAAC,OAAIvB,IAAOC,IAAIsB,EAAEkiC,MAAM3mB,QAAQC,OAAO,cAChDqvB,EAAe,CACXxB,MADW,oBAERvwC,OAAOC,KAAKsyC,GACV3/B,KAAI,SAAA1L,GAAC,mCAAIoJ,EAAWiiB,MAAK,SAAAoP,GAAC,OAAIA,EAAEpmC,KAAO2L,YAAlC,aAAI,EAAkClL,YAAtC,QAA8C,aACnDw2C,MAAM,KAGnB,IAAKr0C,GAAkB6vC,GAAWyE,iBAAkB,CAChD,IAAMF,EAAYzC,GAAkB9B,GAAWyE,iBAC/CR,EAAgBjyC,OAAOqT,OAAOk/B,GAC9BP,EAAgBhyC,OAAOqT,OAAO26B,GAAWyE,iBACpCxC,UACA18B,QAAO,SAAArM,GAAC,OAAIvB,IAAOC,IAAIsB,EAAEkiC,MAAMvjC,eAAeF,IAAOC,UACrDgN,KAAI,SAAA1L,GAAC,OAAIvB,IAAOC,IAAIsB,EAAEkiC,MAAM3mB,QAAQC,OAAO,cAChDwvB,EAAa,CACT3B,MADS,oBAENvwC,OAAOC,KAAKsyC,GACV3/B,KAAI,SAAA1L,GAAC,mCAAIoJ,EAAWiiB,MAAK,SAAAoP,GAAC,OAAIA,EAAEpmC,KAAO2L,YAAlC,aAAI,EAAkClL,YAAtC,QAA8C,aACnDw2C,MAAM,KAGnB,MACJ,KAAKxG,GACI7tC,GAAkB6vC,GAAW9tC,UAC9BkyC,EAAc,CACV,CACIp2C,KAAM,WACNkC,KAAM8vC,GACDp7B,KAAI,SAAA1L,GAAC,MAAK,CACPwrC,KAAMrwC,GAAkB6E,EAAEyrC,WAAY,GACtCjJ,EAAwC,GAArC/jC,IAAOC,IAAIsB,EAAE0rC,OAAOnwB,QAAQwmB,OAAc,GAAK,GAClDU,EAAGtnC,GAAkB6E,EAAEyrC,WAAY,OAEtC1C,YAGbkC,EAAc,GACdE,EAAc,CAAC9B,OAO3B,OACI,kBAACl7B,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACnBw1B,GAsBE,kBAAC14B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACmyB,GAAD,CAAgBn8B,MAAO,6BAA8Bo8B,OAAQyK,EAAa/K,OAAQgL,EAAazK,OAAQ0K,EAAazK,cAAc,KAtBtI,oCACI,kBAACvyB,GAAA,EAAD,CAAMzG,MAAI,EAACmkB,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IAC1B,kBAACmyB,GAAD,CACIn8B,MAAO,4CACPo8B,OAAQmK,EACRzK,OAAQ0K,EACRnK,OAAQoK,EACR1iC,QAASg+B,GAAqBE,KAGtC,kBAACl4B,GAAA,EAAD,CAAMzG,MAAI,EAACmkB,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IAC1B,kBAACmyB,GAAD,CACIn8B,MAAO,6DACPo8B,OAAQsK,EACR5K,OAAQ6K,EACRtK,OAAQuK,EACR7iC,QAASg+B,GAAqBE,OAiRzCsF,IAEJ9E,GACG,kBAAC14B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IAnD/B,WACI,GAAInX,GAAkB6vC,GAAW9tC,QAC7B,OAAO,KAEX,IAAM4yC,EAAiB9E,GAAWp7B,KAAI,SAAA1L,GAAC,MAAK,CACxCkiC,KAAMliC,EAAE0rC,MACRtwC,MAAM,GAAD,OAAKD,GAAkB6E,EAAEyrC,WAAY,GAArC,KACLp3C,GAAI2L,EAAE3L,OAEV,OACI,kBAAC8Z,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ/E,QAA5C,wBAIH2lC,EAAelgC,KAAI,SAAC1L,EAAGhF,GAAO,IACnBknC,EAAoBliC,EAApBkiC,KAAM9mC,EAAc4E,EAAd5E,MAAO/G,EAAO2L,EAAP3L,GACrB,OACI,kBAAC8Z,GAAA,EAAD,CAAMzG,MAAI,EAACmkB,GAAI,EAAGD,GAAI,EAAGxd,GAAI,GAAIvT,IAAKG,GAClC,kBAACyjB,GAAA,EAAD,CAAMhR,UAAS,UAAKzC,GAAQ45B,aAAb,OAA2BmB,IAAoB1xC,EAAK,UAAY,IAAMmZ,QAAS,kBAAMw4B,EAAmB3xC,KACnH,kBAACga,GAAA,EAAD,KACI,2BAAI5P,IAAOC,IAAIwjC,GAAM3mB,QAAQC,OAAO,wBAExC,kBAACnN,GAAA,EAAD,eAAoBjT,SA4B3BywC,IAEL,KACJ,kBAAC19B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IA3PnB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GAAIV,MAAO,CAAEtF,QAAS,OAAQC,WAAY,WACrD,kBAACgG,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ/E,QAjBnC,WACjB,OAAQ0gC,IACJ,KAAK7B,GACD,MAAO,QACX,KAAKA,GACD,MAAO,eACX,KAAKA,GACD,MAAO,aACX,KAAKA,GACD,OAAO7tC,GAAkB0xC,MAA0B,kBAAoBlqC,IAAOC,IAAIiqC,KAAuB+C,OAAOnwB,QAAQC,OAAO,sBACnI,QACI,MAAO,iBAOFswB,IASrB,WACI,OAAQnF,IACJ,KAAK7B,GACD,OAAOmB,EAAe,kBAACp1B,GAAA,EAAD,CAAkB2M,KAAM,GAAI9P,MAAO,CAAEjG,UAAW,GAAIyyB,WAAY,MAAW,KACrG,KAAK4K,GACD,OAAOyB,GAAe,kBAAC11B,GAAA,EAAD,CAAkB2M,KAAM,GAAI9P,MAAO,CAAEjG,UAAW,GAAIyyB,WAAY,MAAW,KACrG,KAAK4K,GAEL,KAAKA,GACD,OAAOqB,EAAoB,kBAACt1B,GAAA,EAAD,CAAkB2M,KAAM,GAAI9P,MAAO,CAAEjG,UAAW,GAAIyyB,WAAY,MAAW,KAC1G,QACI,OAAO,MAlBF6R,IAsBjB,WACI,GAAIlzC,GAAQiuC,IACR,OAAO,kBAACrU,GAAD,MAGX,OAAQkU,IACJ,KAAK7B,GACD,OAAKgC,GAAWQ,cAAiB5nC,EAG7BA,EAAM1G,OAAS,EACRF,OAAOkzC,QAAQlF,GAAWQ,cAC5B1O,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUA,EAAE,GAAKxG,EAAE,MACxB0W,QAAO,SAAArM,GAAC,OAAIN,EAAM2rB,MAAK,SAAAsN,GAAC,OAAIA,EAAEtkC,KAAO2L,EAAE,SACvC0L,KAAI,SAAC1L,EAAGhF,GACL,IAAM8vB,EAAOprB,EAAM2rB,MAAK,SAAAsN,GAAC,OAAIA,EAAEtkC,KAAO2L,EAAE,MAExC,OAAO+pC,GADU,CAAEj1C,KAAMg2B,EAAKh2B,KAAMo1C,OAAQpf,EAAK4c,SAAUrzC,GAAI2L,EAAE,GAAIiqC,kBAAmBjqC,EAAE,IAC1DhF,GAAG,MAGpC,kBAACy3B,GAAD,MAZA,GAcf,KAAKqS,GACD,OAAK7tC,GAAkB6vC,GAAWe,gBAAkB5wC,GAAkB6uC,IAAcA,EAAU9sC,OAAS,EAC5FF,OAAOkzC,QAAQlF,GAAWe,cAC5Bx7B,QAAO,SAAArM,GAAC,OAAK/I,GAAkB6uC,EAAUza,MAAK,SAAAoP,GAAC,OAAIA,EAAExmC,WAAa+L,EAAE,UACpE44B,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUA,EAAE,GAAKxG,EAAE,MACxB+V,KAAI,SAAC1L,EAAGhF,GACL,IAAM+tB,EAAO+c,EAAUza,MAAK,SAAAoP,GAAC,OAAIA,EAAExmC,WAAa+L,EAAE,MAElD,OAAO+pC,GADU,CAAEj1C,KAAK,GAAD,cAAKi0B,QAAL,IAAKA,OAAL,EAAKA,EAAM3pB,UAAX,mBAAwB2pB,QAAxB,IAAwBA,OAAxB,EAAwBA,EAAM1pB,UAAY6qC,OAAQnhB,EAAKxB,SAAUlzB,GAAI00B,EAAK10B,GAAI41C,kBAAmBjqC,EAAE,IAC1FhF,GAAG,MAGpC,kBAACy3B,GAAD,MAEf,KAAKqS,GACD,OAAK7tC,GAAkB6vC,GAAWmF,kBAgBvB,kBAACxZ,GAAD,MAfA35B,OAAOkzC,QAAQlF,GAAWmF,kBAAkBvgC,KAAI,SAAC1L,EAAGhF,GACvD,IAAM8rC,EAAa9mC,EAAE,GACfksC,EAAapF,EAAWqF,iBAAmB,EAUjD,OAkDpB,SAA6BC,EAAYxxC,GAAQ,IACrC9F,EAAuDs3C,EAAvDt3C,KAAMu3C,EAAiDD,EAAjDC,aAAcC,EAAmCF,EAAnCE,YAAaC,EAAsBH,EAAtBG,cAAel4C,EAAO+3C,EAAP/3C,GAExD,OACI,kBAAC8Z,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,GAAID,GAAI,GAAIxd,GAAI,GAAIvT,IAAKD,GAC3C,yBAAK6S,UAAWzC,GAAQsjB,SAAU9gB,QAAS,kBAAMkM,EAAe,YAAD,OAAa1lB,EAAb,qBAAgCC,EAAhC,yBAAyDI,EAAzD,2BAA8ES,MACzI,yBAAK2Y,UAAU,kBACX,uCACA,6BACA,2BAAI3Y,IAER,yBAAK2Y,UAAU,YACX,gDACA,6BACA,4BAAoB,IAAf4+B,GAAoB/wC,QAAQ,GAAjC,MAEJ,yBAAKmS,UAAU,YACX,+CACA,6BACA,2BAAI6+B,EAAc7tC,IAAOC,IAAI4tC,GAAa/wB,QAAQC,OAAO,cAAgB,QAE7E,yBAAK/N,UAAU,YACX,iDACA,6BACA,2BAAI8+B,MA1EGC,CATU,CACb13C,KAAMgyC,EAAW1iC,MACjB+nC,iBAAkBrF,EAAWqF,iBAC7BM,eAAgB3F,EAAW2F,eAC3BJ,aAAcvF,EAAWuF,aACzBh4C,GAAIyyC,EAAW4F,gBACfJ,YAAaJ,EAAapF,EAAWwF,YAAc,KACnDC,cAAeL,EAAapF,EAAW6F,SAAW,GAEjB3xC,MAKjD,KAAK8pC,GACD,GAAK7tC,GAAiB,OAAC6vC,SAAD,IAACA,QAAD,EAACA,GAAY9tC,SAAY/B,GAAkB8uC,GAa7D,OAAO,kBAACtT,GAAD,MAbyE,IAAD,EACzEma,EAAUjE,KAChB,OAAO,iBAACiE,QAAD,IAACA,OAAD,EAACA,EAAS9f,iBAAV,QAAuB,IAAIphB,KAAI,SAAA1L,GAAC,2BAyEvD,SAA2B6sC,GAAW,IAC1Bx4C,EAA2Dw4C,EAA3Dx4C,GAAI+P,EAAuDyoC,EAAvDzoC,MAAO0oC,EAAgDD,EAAhDC,WAAYC,EAAoCF,EAApCE,cAAeC,EAAqBH,EAArBG,QAASC,EAAYJ,EAAZI,QAEvD,OACI,kBAAC9+B,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,GAAIvT,IAAKxG,GACzC,kBAACoqB,GAAA,EAAD,CAAMhR,UAAS,UAAKzC,GAAQ25B,cAAb,OAA4BqI,EAAU,SAAW,KAC5D,yBAAKv/B,UAAU,QAASu/B,EAAsB,kBAACE,GAAA,EAAD,MAAZ,kBAACC,GAAA,EAAD,OAClC,kBAACzuB,GAAA,EAAD,CAAYta,MAAO,IAAM/P,EAAG+4C,aAC5B,kBAAC3xB,GAAA,EAAD,MACA,kBAACkD,GAAA,EAAD,KACI,kBAACtQ,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GACnCnK,GAEL,6BACA,kBAACiK,GAAA,EAAD,CAAYX,MAAO,CAAEjL,MAAOwqC,EAAU,MAAQ,SAAW3+B,QAAQ,SAC3D2+B,EAKE,KAJA,oCACI,2CACA,8BAGPH,GAEHE,EASE,KARA,oCACI,6BACA,kBAAC3+B,GAAA,EAAD,CAAYC,QAAQ,SAChB,8CACA,6BACCy+B,OArGbM,CAAkB,CACdh5C,GAAI2L,EAAE3L,GACN+P,MAAOpE,EAAEoE,MACT0oC,WAAU,oBAAE9sC,EAAEstC,gBAAgB,UAApB,aAAE,EAAsBlpC,aAAxB,QAAiC,mBAC3C2oC,cAAa,oBAAE/sC,EAAEutC,eAAJ,iBAAE,EAAWliB,MAAK,SAAA11B,GAAC,OAAIA,EAAE63C,oBAAzB,aAAE,EAAmCppC,aAArC,QAA8C,0BAC3D4oC,QAAO,oBAAEhtC,EAAEutC,eAAJ,iBAAE,EAAWliB,MAAK,SAAA11B,GAAC,aAAIA,EAAEtB,MAAF,UAAS2L,EAAEstC,gBAAgB,UAA3B,aAAS,EAAsBj5C,cAAtD,aAAE,EAAyDm5C,iBAA3D,SACPP,QAAsC,IAA7BjtC,EAAEstC,gBAAgBt0C,YAM3C,QACI,MAAO,IA3FNy0C,UEpuBXnnC,GAAYC,cAAW,iBAAO,CAChC/D,KAAM,CACFmE,OAAQ,IAEZtP,QAAS,CACLqR,SAAU,WACV/B,OAAQ,OACRS,QAAS,eACT,wBAAyB,CACrBA,QAAS,GACTD,MAAO,oBACPk9B,SAAU,SACVD,WAAY,SACZE,aAAc,WACd57B,SAAU,aAGlBkd,QAAS,CACL,sBAAuB,CACnBxd,QAAS,OACT1B,cAAe,UAEnB,oBAAqB,CACjBmf,cAAe,OACfhe,SAAU,KAEd,qBAAsB,CAClBI,eAAgB,aAChB6d,WAAY,MAGpB4nB,QAAS,CACLhlC,SAAU,WACVE,MAAO,EACPD,IAAK,OAIN,SAASglC,GAAe/nC,GAAQ,IAC3BxB,EAAoBwB,EAApBxB,MAAOka,EAAa1Y,EAAb0Y,SADmB,EAEFrV,IAAMC,SAAS,MAFb,oBAE3BmU,EAF2B,KAEjBiJ,EAFiB,KAG5Btb,EAAU1E,KAMVghB,EAAc,WAChBhB,EAAY,OAGVtwB,EAAOunB,QAAQF,GACfhpB,EAAK2B,EAAO,2BAAwB2C,EAE1C,OACI,oCACI,kBAAC8lB,GAAA,EAAD,CAAMhR,UAAWzC,EAAQxI,KAAM4Y,UAAW,GACtC,kBAACuD,GAAA,EAAD,CAAalR,UAAWzC,EAAQ3T,SAC5B,kBAACgX,GAAA,EAAD,CAAYC,QAAQ,MAApB,OAA0BlK,QAA1B,IAA0BA,IAAS,UACnC,kBAACyN,GAAA,EAAD,CAAYW,mBAAkBne,EAAIoZ,UAAWzC,EAAQ0iC,QAASlgC,QAhB1D,SAAApX,GAChBkwB,EAAYlwB,EAAMokB,iBAgBF,kBAACkN,GAAA,EAAD,SAIZ,kBAACC,GAAA,EAAD,CACItzB,GAAIA,EACJ2B,KAAMA,EACNqnB,SAAUA,EACVtU,QAASue,EACT9Z,QAAS8Z,EACTM,aAAc,CACVC,SAAU,SACVC,WAAY,UAEhBC,gBAAiB,CACbF,SAAU,MACVC,WAAY,UAEhBra,UAAWzC,EAAQ4a,SAElBtH,IC/EF,SAASsvB,GAAmBhoC,GAAQ,IACvCmwB,EAAyDnwB,EAAzDmwB,UAAW//B,EAA8C4P,EAA9C5P,KAAM+S,EAAwCnD,EAAxCmD,QAAS8kC,EAA+BjoC,EAA/BioC,QAAS3kB,EAAsBtjB,EAAtBsjB,OAAQn1B,EAAc6R,EAAd7R,UADL,EAEtBkV,IAAMC,SAAS,IAFO,oBAEvCpU,EAFuC,KAEjCg5C,EAFiC,OAGlB7kC,IAAMC,UAAS,GAHG,oBAGvCtF,EAHuC,KAG/BmqC,EAH+B,KAKxCC,EAAkB,kBAAO/2C,GAAiB,OAAC8+B,QAAD,IAACA,OAAD,EAACA,EAAW1hC,KALd,4CAa9C,WAA0B+B,GAA1B,eAAAT,EAAA,yDACIS,EAAMsW,iBACNmhC,EAAQ,OACSG,IAHrB,gCAG+CjqC,GAAoBG,cAAcnQ,EAAWgiC,EAAU1hC,GAAIS,EAAM8O,GAHhH,2DAGgIG,GAAoBE,aAAalQ,EAAWe,EAAM8O,GAHlL,6BAGUhM,EAHV,MAIiBb,SACT82C,EAAQj2C,EAASZ,MAEjBkyB,EAAOtxB,EAASZ,MAEpB+R,IATJ,6CAb8C,sBAyB9C,SAASkD,EAAY7V,GAAQ,IAAD,EACSA,EAAMC,OAA/BvB,EADgB,EAChBA,KAAM6F,EADU,EACVA,MAAOqoB,EADG,EACHA,QAErB,OAAQluB,GACJ,IAAK,OACDg5C,EAAQnzC,GACR,MACJ,IAAK,SACDozC,EAAU/qB,IAOtB,OAhCA/Z,IAAMyH,WAAU,WAAO,IAAD,IAClBo9B,EAAO,iBAAC/X,QAAD,IAACA,OAAD,EAACA,EAAWjhC,YAAZ,QAAoB,IAC3Bi5C,EAAS,iBAAChY,QAAD,IAACA,OAAD,EAACA,EAAWnyB,cAAZ,YACV,CAACmyB,IA8BA,kBAACplB,GAAA,EAAD,CAAQ3a,KAAMA,GACV,0BAAM+b,SA1CgC,6CA2ClC,kBAACC,GAAA,EAAD,4BACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,OAAOnU,MAAO7F,EAAMsa,SAAUnD,EAAanX,KAAK,OAAOod,UAAQ,EAAC5B,WAAS,KAE/G,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuV,GAAA,EAAD,CAAkBC,QAAS,kBAACC,GAAA,EAAD,CAAUb,QAASpf,EAAQwL,SAAUnD,EAAanX,KAAK,WAAaga,MAAM,uBAIjH,kBAAC4D,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAUgQ,KAAK,UAA7B,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,aCnDpB,IAAMzC,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCsuB,QAAQ,cACJ1tB,QAAS,aACRZ,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,KAGjB2tB,QAAS,CACLvsB,cAAe,EACf,wBAAyB,CACrB7B,OAAQ,aAiKpB,IAQeoR,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EApKf,SAAqBnS,GAAQ,IACjBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YADU,EAEYnP,IAAMC,SAAS,IAF3B,oBAEjBE,EAFiB,KAELC,EAFK,OAGYJ,IAAMC,SAAS,IAH3B,oBAGjB8sB,EAHiB,KAGLC,EAHK,OAIUhtB,IAAMC,SAAS,MAJzB,oBAIjB+kC,EAJiB,KAINC,EAJM,OAKYjlC,IAAMC,SAAS,MAL3B,oBAKjBilC,EALiB,KAKLC,EALK,OAMcnlC,IAAMC,SAAS,MAN7B,oBAMjBuQ,EANiB,KAMJC,EANI,OAOMzQ,IAAMC,SAAS,MAPrB,oBAOjBsB,EAPiB,KAORC,EAPQ,OAQMxB,IAAMC,UAAS,GARrB,oBAQjBf,EARiB,KAQRuC,EARQ,KASlBM,EAAU1E,KAEV6E,EAAiBlC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,6DACrC+U,GAAW,GAD0B,SAEd3G,GAAoBC,cAAcgc,EAAKjsB,WAFzB,QAE/B6D,EAF+B,QAGxBb,SACT0T,EAAW7S,EAASZ,MAEpBqS,EAAczR,EAASZ,MAE3B0T,GAAW,GAR0B,2CAStC,CAACsV,IApBoB,4CAqDxB,8BAAArqB,EAAA,6DACI+U,GAAW,GACXD,EAAW,MACHpW,EAAO45C,EAAP55C,GAHZ,SAI2B0P,GAAoBI,gBAAgB6b,EAAKjsB,UAAWM,GAJ/E,QAIUuD,EAJV,QAKiBb,SACT0T,EAAW7S,EAASZ,MAEpBqS,EAAcD,EAAWiD,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOA,MAElD65C,EAAa,MACbxjC,GAAW,GAXf,4CArDwB,sBAmExB,SAASuB,EAAY7V,GAAQ,IAAD,EACAA,EAAMC,OAAtBsE,EADgB,EAChBA,MACR,OAFwB,EACT7F,MAEX,IAAK,OACDmhC,EAAct7B,IAyB1B,SAAS0zC,EAAetY,GAAY,IACxB1hC,EAAa0hC,EAAb1hC,GAAIS,EAASihC,EAATjhC,KACZ,OACI,kBAACqZ,GAAA,EAAD,CAAMtT,IAAKxG,EAAIqT,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,IACzC,kBAACu/B,GAAD,CAAgBvpC,MAAOtP,GACnB,kBAACqb,GAAA,EAAD,CAAQ3C,QAAS,kBAAM0gC,EAAanY,KAApC,UACA,kBAAC5lB,GAAA,EAAD,CAAQ3C,QAAS,kBAAM4gC,EAAcrY,KAArC,QACA,kBAAC5lB,GAAA,EAAD,CAAQ3C,QAAS,kBAAMkM,EAAe,oBAAsBqc,EAAU1hC,MAAtE,gBAmChB,OAnHA4U,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUwV,IADV,4CAPkB,sBAGbuN,GAAoB4H,GACrB5G,EAAe,UAJD,mCAUlBvkB,KACD,CAAC6qB,EAAM7U,IAGVlC,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAkGb,yBAAK3K,UAAWzC,EAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASA,IA5DzB,kBAACgG,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,EAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU4N,UAAW,kBAACypB,GAAA,EAAD,MAAStsB,QAAS,kBAAM4gC,EAAc,MAA7F,cAIJ,kBAACjgC,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IACjC,kBAACuB,GAAA,EAAD,CAAWb,MAAM,iBAAiBR,QAAQ,SAAS3T,MAAOq7B,EAAY5mB,SAAUnD,EAAanX,KAAK,OAAOwb,WAAS,KAEtH,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAM2E,MAoBpDvT,GAAkBmS,GACX,KAIP,kBAAC+E,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpBjI,EAAWiD,QAAO,SAAArM,GAAC,OAAIA,EAAElL,KAAKkF,SAASg8B,MAAatqB,IAAI2iC,IAO7D,kBAAC19B,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBg3C,GAAYllC,QAAS,kBAAMmlC,EAAa,QACrE,kBAACl8B,GAAA,EAAD,0BACA,kBAACC,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBA/HzB,0CA+H+B8gC,KAAvC,OAGA,kBAACn+B,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0gC,EAAa,QAApD,QAcR,kBAACN,GAAD,CACI53C,MAAOiB,GAAkBk3C,GACzBplC,QAAS,kBAAMqlC,EAAc,OAC7BP,QAASpjC,EACTye,OAzGZ,SAAgC6M,GAAY,IAChC1hC,EAAO0hC,EAAP1hC,GACFyM,GAAU7J,GAAkBmS,EAAWiD,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOA,KAAI,IAElEgV,EADAvI,EACcsI,EAAWsC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOA,EAAK0hC,EAAY/1B,KAE/C,GAAD,oBAAKoJ,GAAL,CAAiB2sB,MAoG1BA,UAAWoY,EACXp6C,UAAWisB,EAAKjsB,gBCzKzB,SAASw6C,GAAa3oC,GAAQ,IACzBklB,EAAoDllB,EAApDklB,KAAM90B,EAA8C4P,EAA9C5P,KAAM+S,EAAwCnD,EAAxCmD,QAAS8kC,EAA+BjoC,EAA/BioC,QAAS3kB,EAAsBtjB,EAAtBsjB,OAAQn1B,EAAc6R,EAAd7R,UADd,EAERkV,IAAMC,SAAS,IAFP,oBAEzBpU,EAFyB,KAEnBg5C,EAFmB,OAGV7kC,IAAMC,SAAS,IAHL,oBAGzBtG,EAHyB,KAGpB4rC,EAHoB,OAIYvlC,IAAMC,SAAS,IAJ3B,oBAIzBrG,EAJyB,KAIT4rC,EAJS,OAKNxlC,IAAMC,SAAS,IALT,oBAKzBwM,EALyB,KAKlBO,EALkB,OAMMhN,IAAMC,UAAS,GANrB,oBAMzBqhB,EANyB,KAMZC,EANY,OAORvhB,IAAMC,WAArBuhB,EAPuB,qBAS1BC,EAAczhB,IAAMiC,aAAY,WAClCuf,EAAY,MACb,IAEGikB,EAAa,kBAAOz3C,GAAiB,OAAC6zB,QAAD,IAACA,OAAD,EAACA,EAAMz2B,KAblB,4CA2BhC,WAA0B+B,GAA1B,eAAAT,EAAA,yDACIS,EAAMsW,iBACNmhC,EAAQ,MACUa,IAHtB,gCAIgBxrC,GAAeG,QAAQtP,EAAWe,EAAM8N,EAAKC,EAAgB6S,GAJ7E,2DAKgBxS,GAAeI,WAAWvP,EAAW+2B,EAAKz2B,GAAIS,EAAM8N,EAAKC,EAAgB0nB,EAAa7U,GALtG,6BAGU9d,EAHV,MAMiBb,SACT82C,EAAQj2C,EAASZ,MAEjBkyB,EAAOtxB,EAASZ,MAEpB+R,IAXJ,6CA3BgC,sBAyChC,SAASkD,EAAY7V,GAAQ,IAAD,EACOA,EAAMC,OAA7BsE,EADgB,EAChBA,MAAO7F,EADS,EACTA,KAAMoX,EADG,EACHA,MACrB,OAAQpX,GACJ,IAAK,OACDg5C,EAAQnzC,GACR,MACJ,IAAK,MACD6zC,EAAO7zC,GACP,MACJ,IAAK,iBACD8zC,EAAkB9zC,GAClB,MACJ,IAAK,QACD0tB,KACKpxB,GAAkBiV,EAAM,IAKzB+J,EAAS,KAJTA,EAAS/J,EAAM,IACfse,GAAe,GACfjC,GAAe,CAACrc,EAAM,IAAKwe,KAgB3C,OA1DAzhB,IAAMyH,WAAU,WAAO,IAAD,QAClBo9B,EAAO,iBAAChjB,QAAD,IAACA,OAAD,EAACA,EAAMh2B,YAAP,QAAe,IACtB05C,EAAM,iBAAC1jB,QAAD,IAACA,OAAD,EAACA,EAAMloB,WAAP,QAAc,IACpB6rC,EAAiB,iBAAC3jB,QAAD,IAACA,OAAD,EAACA,EAAMjoB,sBAAP,QAAyB,IAC1CoT,EAAQ,iBAAC6U,QAAD,IAACA,OAAD,EAACA,EAAM4c,gBAAP,QAAmB,MAC5B,CAAC5c,IAsDA,kBAACna,GAAA,EAAD,CAAQ3a,KAAMA,GACV,0BAAM+b,SA5EkB,6CA6EpB,kBAACC,GAAA,EAAD,sBACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,OAAOnU,MAAO7F,EAAMsa,SAAUnD,EAAanX,KAAK,OAAOod,UAAQ,EAAC5B,WAAS,KAE/G,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,MAAMnU,MAAOiI,EAAKwM,SAAUnD,EAAanX,KAAK,MAAMod,UAAQ,EAAC5B,WAAS,KAE5G,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,mBAAmBnU,MAAOkI,EAAgBuM,SAAUnD,EAAanX,KAAK,iBAAiBod,UAAQ,EAAC5B,WAAS,KAE/I,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYzC,QAAM,GAAlB,SACA,kBAAC0C,GAAA,EAAD,CACIle,GAAG,eACHme,mBAAiB,gBACjBC,KAAK,OACL3d,KAAK,QACLsa,SAAUnD,EACVkgB,WAAY,CACRC,OAAQ,WAEZ9b,WAAS,QAM7B,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAAC+Z,GAAD,CAAWzS,MAvFnC,WAAqB,IAAD,EAChB,iBAAO4S,KAAgB,UAAvB,QAAwC,KAAV5S,EAAe+R,KAAU/R,EAsFjB2W,GAAYtjB,QA1CtD,WACIsf,KACApS,EAAS,IACTuU,GAAe,IAuC8Dha,SAAoB,KAAVkF,OAI/E,kBAAChD,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAUgQ,KAAK,UAA7B,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,aC/Hb,ICkBDzC,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCsuB,QAAQ,cACJ1tB,QAAS,YAET,cAAe,CACX0O,OAAQ,IAGXtP,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,KAGjB2tB,QAAS,CACLvsB,cAAe,EACf,wBAAyB,CACrB7B,OAAQ,aA0NpB,IAUeoR,iBAVS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,eACZy2B,WAAY32B,EAAM42B,UAGK,SAAAz2B,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnCmS,SAAU,SAAA8H,GAAK,OAAIkH,EDlQC,SAAAlH,GAAK,MAAK,CAC9BwB,KAAM,YACNxB,SCgQ4B9H,CAAS8H,QAG1B8G,EA/Nf,SAAenS,GAAQ,IACXoa,EAA4Cpa,EAA5Coa,KAAM5H,EAAsCxS,EAAtCwS,YAAau2B,EAAyB/oC,EAAzB+oC,WAAYxlC,EAAavD,EAAbuD,SAC/BzJ,EAAUivC,EAAVjvC,MAEMm2B,EAAcp6B,KAAYwoB,MAAMvuB,OAAOmG,SAASqoB,QAAtDpvB,KAJU,EAKkBmU,IAAMC,SAAN,OAAe2sB,QAAf,IAAeA,IAAa,IAL9C,oBAKXG,EALW,KAKCC,EALD,OAMgBhtB,IAAMC,SAAS,MAN/B,oBAMX+kC,EANW,KAMAC,EANA,OAOkBjlC,IAAMC,SAAS,MAPjC,oBAOXilC,EAPW,KAOCC,EAPD,OAQoBnlC,IAAMC,SAAS,MARnC,oBAQXuQ,EARW,KAQEC,EARF,OASYzQ,IAAMC,SAAS,MAT3B,oBASXsB,EATW,KASFC,EATE,OAUYxB,IAAMC,UAAS,GAV3B,oBAUXf,EAVW,KAUFuC,EAVE,KAWZM,EAAU1E,KAEV+xB,EAAgBrY,EAAKpe,UAAU5H,SAASjF,KAAqBirB,EAAKxgB,cAAgB5K,GAElFqW,EAAYhC,IAAMiC,YAAN,sBAAkB,kCAAAvV,EAAA,6DAChC+U,GAAW,GADqB,SAETxH,GAAeC,SAAS6c,EAAKjsB,WAFpB,YAE1B6D,EAF0B,QAGnBb,SAHmB,gBAI5B0T,EAAW7S,EAASZ,MAJQ,uBAMtBuwC,EAAY7nC,EAElB9H,EAASZ,KAAOY,EAASZ,KAAK0U,KAAI,SAAA1L,GAC9B,IAAMwnC,EAAWD,EAAUlc,MAAK,SAAAoc,GAAE,OAAIA,EAAGpzC,KAAO2L,EAAE3L,MAElD,GAAImzC,EAAU,CAAC,IACHE,EAAaF,EAAbE,SACR,GAAI5uC,OAAOC,KAAKyuC,GAAUxtC,SAAS,YAC/B,OAAO,2BAAKgG,GAAZ,IAAe0nC,aAGvB,OAAO1nC,KAGXmJ,EAASvR,EAASZ,MAETgE,EAAI,EAtBe,aAsBZA,EAAIpD,EAASZ,KAAKgC,QAtBN,kCAuBEkK,GAAeE,YAAY4c,EAAKjsB,UAAW6D,EAASZ,KAAKgE,GAAG3G,IAvB9D,aAuBlBkkC,EAvBkB,QAwBRxhC,SAxBQ,wDA2BxBa,EAASZ,KAAKgE,GAAG0sC,SAAWnP,EAAYvhC,KA3BhB,QAsBcgE,IAtBd,wBA6B5BmO,EAASvR,EAASZ,MA7BU,QA+BhC0T,GAAW,GA/BqB,4CAgCjC,CAACsV,IA/Cc,4CA8ElB,WAAgC8K,GAAhC,mBAAAn1B,EAAA,6DACYtB,EAAOy2B,EAAPz2B,GADZ,SAE8B6O,GAAeE,YAAY4c,EAAKjsB,UAAWM,GAFzE,QAEUkkC,EAFV,QAGqBxhC,WACb+zB,EAAK4c,SAAWnP,EAAYvhC,MAG1B8J,EAASpB,EAAMohB,MAAK,SAAA9gB,GAAC,OAAIA,EAAE3L,KAAOA,KAEpC8U,EADArI,EACSpB,EAAMgM,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOA,EAAKy2B,EAAO9qB,KAErC,GAAD,oBAAKN,GAAL,CAAYorB,KAX5B,4CA9EkB,kEA6FlB,8BAAAn1B,EAAA,6DACI+U,GAAW,GACXD,EAAW,MACHpW,EAAO45C,EAAP55C,GAHZ,SAI2B6O,GAAeK,WAAWyc,EAAKjsB,UAAWM,GAJrE,QAIUuD,EAJV,QAKiBb,SACT0T,EAAW7S,EAASZ,MAEpBmS,EAASzJ,EAAM2M,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOA,MAExC65C,EAAa,MACbxjC,GAAW,GAXf,4CA7FkB,sBA2GlB,SAASuB,EAAY7V,GAAQ,IAAD,EACAA,EAAMC,OAAtBsE,EADgB,EAChBA,MACR,OAFwB,EACT7F,MAEX,IAAK,OACDmhC,EAAct7B,GACda,GA1CZ,SAA6B1G,GACzB,IAAIgC,EAAS,GAIb,OAHIhC,EAAKqE,OAAOH,OAAS,IACrBlC,GAAM,eAAYhC,IAEfgC,EAqCmBqiC,CAAoBx+B,KA8BlD,SAASk0C,EAAU/jB,GAAO,IACdz2B,EAAgCy2B,EAAhCz2B,GAAIS,EAA4Bg2B,EAA5Bh2B,KAAMwmB,EAAsBwP,EAAtBxP,QAASosB,EAAa5c,EAAb4c,SAC3B,OACI,kBAACv5B,GAAA,EAAD,CAAMtT,IAAKxG,EAAIqT,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,IACzC,kBAAC2X,GAAD,CACI3hB,MAAOtP,EACP4wB,UAAkB,OAARgiB,QAAQ,IAARA,OAAA,EAAAA,EAAU1uC,QAAS,EAC7B0c,MAAOgyB,EACPrjC,YACI,oCACI,kBAACgK,GAAA,EAAD,CAAYC,QAAQ,SAApB,WAAqC7P,IAAOC,IAAI4c,GAASC,QAAQC,OAAO,iBAI9E6c,EAA6E,KAA7D,kBAACloB,GAAA,EAAD,CAAQ3C,QAAS,kBAAM0gC,EAAapjB,KAApC,UAChBuN,EAA4E,KAA5D,kBAACloB,GAAA,EAAD,CAAQ3C,QAAS,kBAAM4gC,EAActjB,KAArC,QAClB,kBAAC3a,GAAA,EAAD,CAAQ3C,QAAS,kBAAMkM,EAAe,YAAD,OAAaoR,EAAKz2B,GAAlB,qBAAiCy2B,EAAKh2B,SAA3E,aAmChB,OA/IAmU,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUsV,IADV,4CAPkB,sBAGbyN,GAAoB4H,GACrB5G,EAAe,UAJD,mCAUlBvkB,KACD,CAAC6qB,EAAM/U,IAGVhC,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IA8Hb,yBAAK3K,UAAWzC,EAAQ8pB,SAzEpB,kBAAC3mB,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,EAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU4N,UAAW,kBAACypB,GAAA,EAAD,MAAStsB,QAAS,kBAAM4gC,EAAc,KAAK59B,SAAU6nB,GAA5G,aAIJ,kBAAClqB,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IACjC,kBAACuB,GAAA,EAAD,CAAWb,MAAM,iBAAiBR,QAAQ,SAAS3T,MAAOq7B,EAAY5mB,SAAUnD,EAAanX,KAAK,OAAOwb,WAAS,KAErHnI,EACG,kBAACgG,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,IAAE,EAACnO,IAAE,EAACD,IAAE,EAACxd,IAAE,GAClB,kBAACyC,GAAA,EAAD,CAAkB2M,KAAM,GAAI9P,MAAO,CAAEjG,UAAW,GAAIyyB,WAAY,OAEpE,KACJ,kBAAC/rB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAM2E,MA6BpD3R,GAAQ6G,IAAUzI,GAAkByI,GAC7B,kBAAC+yB,GAAD,MAIP,kBAACtkB,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpB3R,EAAM2M,QAAO,SAAArM,GAAC,OAAIA,EAAElL,KAAK4jC,cAAc1+B,SAASg8B,EAAW0C,kBAAgBhtB,IAAImjC,IAOpF,kBAACl+B,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBg3C,GAAYllC,QAAS,kBAAMmlC,EAAa,QACrE,kBAACl8B,GAAA,EAAD,oBACA,kBAACC,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAtL/B,0CAsLqCshC,KAAvC,OAGA,kBAAC3+B,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0gC,EAAa,QAApD,QAaR,kBAACK,GAAD,CACIv4C,MAAOiB,GAAkBk3C,GACzBplC,QAAS,WACLqlC,EAAc,MACd/lB,MAEJwlB,QAASpjC,EACTye,OA7MM,4CA8MN4B,KAAMqjB,EACNp6C,UAAWisB,EAAKjsB,gB,6BCxOzB,SAASg7C,GAAenpC,GAAQ,IAC3BopC,EAAuDppC,EAAvDopC,QAASh5C,EAA8C4P,EAA9C5P,KAAM+S,EAAwCnD,EAAxCmD,QAAS8kC,EAA+BjoC,EAA/BioC,QAAS3kB,EAAsBtjB,EAAtBsjB,OAAQn1B,EAAc6R,EAAd7R,UADf,EAEAkV,IAAMC,SAAS,MAFf,oBAE3BuK,EAF2B,KAEhBw7B,EAFgB,OAGEhmC,IAAMC,SAAS,MAHjB,oBAG3BgmC,EAH2B,KAGfC,EAHe,OAKVlmC,IAAMC,SAAS,IALL,oBAK3BpU,EAL2B,KAKrBg5C,EALqB,OAMR7kC,IAAMC,SAAS,IANP,oBAM3BwM,EAN2B,KAMpBO,EANoB,OAOVhN,IAAMC,WAArBuhB,EAPyB,qBAQ5B2kB,EAAkD,IAAtCt2C,OAAOC,KAAP,OAAYi2C,QAAZ,IAAYA,IAAW,IAAIh2C,OAEvC0xB,EAAczhB,IAAMiC,aAAY,WAClCuf,EAAY,MACb,IAZ+B,4CAyBlC,WAA0Br0B,GAA1B,eAAAT,EAAA,yDACIS,EAAMsW,iBACNmhC,EAAQ,OACS52C,GAAiB,OAAC+3C,QAAD,IAACA,OAAD,EAACA,EAAS36C,IAHhD,gCAIgBqf,GAAkBY,WAAWvgB,EAAWe,EAAM4gB,GAJ9D,2DAKgBhC,GAAkBa,cAAcy6B,EAAQ36C,GAAIS,EAAM4gB,EAAOjX,IAAOgV,GAAW2e,eAL3F,6BAGUx6B,EAHV,MAMiBb,SACT82C,EAAQj2C,EAASZ,MAEjBkyB,EAAOtxB,EAASZ,MAEpB+R,IAXJ,6CAzBkC,sBAuClC,SAASkD,EAAY7V,GAAQ,IAAD,EACOA,EAAMC,OAA7BsE,EADgB,EAChBA,MAAO7F,EADS,EACTA,KAAMoX,EADG,EACHA,MACrB,OAAQpX,GACJ,IAAK,OACDg5C,EAAQnzC,GACR,MACJ,IAAK,QACD0tB,KACKpxB,GAAkBiV,EAAM,IAIzB+J,EAAS,KAHTA,EAAS/J,EAAM,IACfqc,GAAe,CAACrc,EAAM,IAAKwe,IAI/B,MACJ,IAAK,YACDukB,EAAat0C,IAxCzBsO,IAAMyH,WAAU,WAAO,IAAD,IAClBo9B,EAAO,iBAACkB,QAAD,IAACA,OAAD,EAACA,EAASl6C,YAAV,QAAkB,IACzBmhB,EAAQ,iBAAC+4B,QAAD,IAACA,OAAD,EAACA,EAAStH,gBAAV,QAAsB,IAC9BuH,EAAY,OAACD,QAAD,IAACA,OAAD,EAACA,EAASv7B,aACvB,CAACu7B,IAqDJ,OACI,kBAACr+B,GAAA,EAAD,CAAQ3a,KAAMA,GACV,0BAAM+b,SA1EoB,6CA2EtB,kBAACC,GAAA,EAAD,yBACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,OAAOnU,MAAO7F,EAAMsa,SAAUnD,EAAanX,KAAK,OAAOod,UAAQ,EAAC5B,WAAS,KAE/G,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYzC,QAAM,GAAlB,SACA,kBAAC0C,GAAA,EAAD,CACIle,GAAG,eACHme,mBAAiB,gBACjBC,KAAK,OACL3d,KAAK,QACLsa,SAAUnD,EACVkgB,WAAY,CACRC,OAAQ,WAEZ9b,WAAS,MAIpB8+B,EACG,kBAACjhC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,KAAD,CAAyBihC,YAAa5wC,IAAQ6wC,MAAOC,MACjD,kBAAC,KAAD,CACIC,WAAS,EACTC,QAAQ,EACRC,iBAAiB,EACjB/0C,MAAO8Y,EACP+H,OAAO,aACP0zB,WAAYA,EACZ9/B,SA/CvB,SAAC8yB,EAAMvnC,GACxBs0C,EAAa/M,GACbiN,EAAcx0C,IA8C0Bg1C,aAAa,SACb7gC,MAAM,aACNwB,WAAS,MAIrB,OAGZ,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAAC+Z,GAAD,CAAWzS,MAnGnC,WAAqB,IAAD,EAChB,iBAAO4S,KAAgB,UAAvB,QAAwC,KAAV5S,EAAe+R,KAAU/R,EAkGjB2W,GAAYtjB,QArDtD,WACIsf,KACApS,EAAS,KAmDoEzF,SAAoB,KAAVkF,OAI/E,kBAAChD,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAUgQ,KAAK,UAA7B,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,aC3HpB,IAAMzC,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCsuB,QAAQ,cACJ1tB,QAAS,aACRZ,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,KAGjB2tB,QAAS,CACLvsB,cAAe,EACf,wBAAyB,CACrB7B,OAAQ,aA8MpB,IAUeoR,iBAVS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnCihB,MAAO,SAAAjhB,GAAI,OAAImhB,EAASF,GAAMjhB,KAC9BsuC,WAAY,kBAAMntB,ER9MW,CAC7B1F,KAAM,yBQgNKsF,EAnNf,SAAiBnS,GAAQ,IACboa,EAAyCpa,EAAzCoa,KAAM5H,EAAmCxS,EAAnCwS,YAAaH,EAAsBrS,EAAtBqS,MAAOqtB,EAAe1/B,EAAf0/B,WACpBzP,EAAcp6B,KAAYwoB,MAAMvuB,OAAOmG,SAASqoB,QAAtDpvB,KAFY,EAGcmU,IAAMC,SAAS,IAH7B,oBAGb0mC,EAHa,KAGFC,EAHE,OAIgB5mC,IAAMC,SAAN,OAAe2sB,QAAf,IAAeA,IAAa,IAJ5C,oBAIbG,EAJa,KAIDC,EAJC,OAMgBhtB,IAAMC,SAAS,MAN/B,oBAMbilC,EANa,KAMDC,EANC,OAOkBnlC,IAAMC,SAAS,MAPjC,oBAObuQ,EAPa,KAOAC,EAPA,OAQUzQ,IAAMC,SAAS,MARzB,oBAQbsB,EARa,KAQJC,EARI,OASUxB,IAAMC,UAAS,GATzB,oBASbf,EATa,KASJuC,EATI,KAUdM,EAAU1E,KAEVwpC,EAAgB7mC,IAAMiC,YAAN,sBAAkB,gCAAAvV,EAAA,6DACpC+U,GAAW,GADyB,SAEbgJ,GAAkBW,aAAa2L,EAAKjsB,WAFvB,YAE9B6D,EAF8B,QAGvBb,SAHuB,gBAIhC0T,EAAW7S,EAASZ,MAJY,uBAMvBgE,EAAI,EANmB,YAMhBA,EAAIpD,EAASZ,KAAKgC,QANF,kCAOF0a,GAAkBc,eAAe5c,EAASZ,KAAKgE,GAAG3G,IAPhD,aAOtBkkC,EAPsB,QAQZxhC,SARY,wDAW5Ba,EAASZ,KAAKgE,GAAG0sC,SAAWnP,EAAYvhC,KAXZ,QAMUgE,IANV,uBAahC60C,EAAaj4C,EAASZ,MAbU,QAepC0T,GAAW,GAfyB,4CAgBrC,CAACsV,IA5BgB,4CA2DpB,WAAmCgvB,GAAnC,mBAAAr5C,EAAA,6DACYtB,EAAO26C,EAAP36C,GADZ,SAE8Bqf,GAAkBc,eAAengB,GAF/D,QAEUkkC,EAFV,QAGqBxhC,WACbi4C,EAAQtH,SAAWnP,EAAYvhC,MAG7B8J,EAAS8uC,EAAU9uB,MAAK,SAAA9gB,GAAC,OAAIA,EAAE3L,KAAOA,KAExCw7C,EADA/uC,EACa8uC,EAAUlkC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOA,EAAK26C,EAAUhvC,KAE5C,GAAD,oBAAK4vC,GAAL,CAAgBZ,KAXpC,4CA3DoB,+BA0ELe,EA1EK,8EA0EpB,WAAmCf,GAAnC,iBAAAr5C,EAAA,6DACI+U,GAAW,GACHrW,EAAO26C,EAAP36C,GAFZ,SAGiCqf,GAAkBe,cAAcpgB,GAHjE,YAGU27C,EAHV,QAIuBj5C,SAJvB,uBAKQ0T,EAAWulC,EAAeh5C,MAC1B0T,GAAW,GANnB,2CAUUhJ,GAAgBrN,GAV1B,QAYIixC,IAEArtB,EAAM,2BAAK+H,GAAN,IAAYjsB,UAAWM,KAdhC,6CA1EoB,kEA2FpB,WAAwC26C,GAAxC,SAAAr5C,EAAA,sEACUo6C,EAAoBf,GAD9B,OAEIt1B,EAAe,KAFnB,4CA3FoB,sBA8GpB,SAASzN,EAAY7V,GAAQ,IAAD,EACAA,EAAMC,OAAtBsE,EADgB,EAChBA,MACR,OAFwB,EACT7F,MAEX,IAAK,OACDmhC,EAAct7B,GACda,GAhEZ,SAA6B1G,GACzB,IAAIgC,EAAS,GAIb,OAHIhC,EAAKqE,OAAOH,OAAS,IACrBlC,GAAM,eAAYhC,IAEfgC,EA2DmBqiC,CAAoBx+B,KAyBlD,SAASs1C,EAAajB,GAAU,IACpB36C,EAAuB26C,EAAvB36C,GAAIS,EAAmBk6C,EAAnBl6C,KAAM4yC,EAAasH,EAAbtH,SAClB,OACI,kBAACv5B,GAAA,EAAD,CAAMtT,IAAKxG,EAAIqT,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,IACzC,kBAAC2X,GAAD,CAAY3hB,MAAOtP,EAAM4wB,UAAkB,OAARgiB,QAAQ,IAARA,OAAA,EAAAA,EAAU1uC,QAAS,EAAG0c,MAAOgyB,GAC5D,kBAACv3B,GAAA,EAAD,CAAQ3C,QAAS,kBAAM4gC,EAAcY,KAArC,QACA,kBAAC7+B,GAAA,EAAD,CAAQ3C,QAAS,kBAlJb,2CAkJmB0iC,CAAyBlB,KAAhD,WACA,kBAAC7+B,GAAA,EAAD,CAAQ3C,QAAS,kBAAMuiC,EAAoBf,KAA3C,oBAiChB,OArJA/lC,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUm6C,IADV,4CAPkB,sBAGbp3B,GAAoB4H,GACrB5G,EAAe,UAJD,mCAUlBvkB,KACD,CAAC6qB,EAAM8vB,IAGV7mC,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAoIb,yBAAK3K,UAAWzC,EAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASA,IA1DzB,kBAACgG,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,EAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU4N,UAAW,kBAACypB,GAAA,EAAD,MAAStsB,QAAS,kBAAM4gC,EAAc,MAA7F,gBAIJ,kBAACjgC,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IACjC,kBAACuB,GAAA,EAAD,CAAWb,MAAM,iBAAiBR,QAAQ,SAAS3T,MAAOq7B,EAAY5mB,SAAUnD,EAAanX,KAAK,OAAOwb,WAAS,KAEtH,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAM2E,MAoBpDvT,GAAkB24C,GACX,KAIP,kBAACzhC,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpBu+B,EAAUvjC,QAAO,SAAArM,GAAC,OAAIA,EAAElL,KAAK4jC,cAAc1+B,SAASg8B,EAAW0C,kBAAgBhtB,IAAIukC,IA0BxF,kBAAClB,GAAD,CACI/4C,MAAOiB,GAAkBk3C,GACzBplC,QAAS,WACLqlC,EAAc,MACd/lB,MAEJwlB,QAASpjC,EACTye,OAjMQ,4CAkMR8lB,QAASb,EACTp6C,UAAWisB,EAAKjsB,gB,8CC/MhC,WAA6BA,GAA7B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAgCC,GAAY6K,GACnE/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA6BjL,EAAWe,GAAxC,eAAAa,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAgCC,GAAY,CAAEe,QAAQ8J,GAC9E/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA8BjL,EAAWM,EAAIS,GAA7C,eAAAa,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAiCC,GAAY,CAAEM,KAAIS,QAAQ8J,GACnF/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAAgCjL,EAAWM,GAA3C,eAAAsB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAmCC,EAAWM,GAAK,KAAMuK,GACjF/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA2BjL,EAAWe,GAAtC,iBAAAa,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,OAEU2F,EAAgB,CAAEzP,QAF5B,kBAGWgK,IAAMC,KAAKpL,EAAWG,GAA8BC,GAAYwQ,EAAe3F,GACjF/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAR1C,4C,oEAYA,WAA4BjL,GAA5B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA8BC,GAAY6K,GACjE/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA+BjL,GAA/B,eAAA4B,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAA0BC,GAAY6K,GAC7D/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA2BjL,EAAWO,GAAtC,eAAAqB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMpH,IAAI/D,EAAWG,GAAqBC,EAAWO,GAAasK,GACpE/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA2BjL,EAAWqQ,EAAOC,EAAaoO,EAAM09B,EAAWC,EAAW7C,EAAS8C,EAAsBC,EAAqBC,EAAoBh9B,EAASi9B,GAAvK,iBAAA76C,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,QAASmJ,GACzB1J,EAASO,OAAO,cAAeoJ,GAC/B3J,EAASO,OAAO,OAAQwX,GACxB/X,EAASO,OAAO,YAAak1C,GAC7Bz1C,EAASO,OAAO,WAAYm1C,GAC5B11C,EAASO,OAAO,WAAYu1C,GAC5BH,EAAqBv2C,SAAQ,SAACkG,EAAGpF,GAC7BF,EAASO,OAAT,uBAAwC+E,EAAGpF,MAE/C01C,EAAoBx2C,SAAQ,SAACkG,EAAGpF,GAC5BF,EAASO,OAAT,8BAAuCL,EAAvC,KAAiDoF,MAErDutC,EAAQzzC,SAAQ,SAACkG,EAAGpF,GAChBJ,GAAmB,UAAWE,EAAUsF,EAAGpF,MAE/C21C,EAAmBz2C,SAAQ,SAACkG,EAAGpF,GAC3BJ,GAAmB,qBAAsBE,EAAUsF,EAAGpF,MAE1D2Y,EAAQzZ,SAAQ,SAACkG,EAAGpF,GAChBF,EAASO,OAAT,kBAA2BL,EAA3B,KAAqCoF,MAtB7C,kBAwBWlB,IAAMC,KAAKpL,EAAWG,GAAqBC,GAAY2G,EAAUkE,GACnE/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OA7B1C,6C,oEAiCA,WAA4B3K,EAAIN,EAAWqQ,EAAOC,EAAa8rC,EAAWC,EAAW7C,EAAS8C,EAAsBC,EAAqBC,EAAoBh9B,EAASi9B,GAAtK,iBAAA76C,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,KAAM5G,GACtBqG,EAASO,OAAO,QAASmJ,GACzB1J,EAASO,OAAO,cAAeoJ,GAC/B3J,EAASO,OAAO,YAAak1C,GAC7Bz1C,EAASO,OAAO,WAAYm1C,GAC5B11C,EAASO,OAAO,WAAYu1C,GAC5BH,EAAqBv2C,SAAQ,SAACkG,EAAGpF,GAC7BF,EAASO,OAAT,uBAAwC+E,EAAGpF,MAE/C01C,EAAoBx2C,SAAQ,SAACkG,EAAGpF,GAC5BF,EAASO,OAAT,8BAAuCL,EAAvC,KAAiDoF,MAErDutC,EAAQzzC,SAAQ,SAACkG,EAAGpF,GAChBJ,GAAmB,UAAWE,EAAUsF,EAAGpF,MAE/C21C,EAAmBz2C,SAAQ,SAACkG,EAAGpF,GAC3BJ,GAAmB,qBAAsBE,EAAUsF,EAAGpF,MAE1D2Y,EAAQzZ,SAAQ,SAACkG,EAAGpF,GAChBF,EAASO,OAAT,kBAA2BL,EAA3B,KAAqCoF,MAtB7C,kBAwBWlB,IAAMC,KAAKpL,EAAWG,GAAsBC,GAAY2G,EAAUkE,GACpE/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OA7B1C,6C,oEAiCA,WAA+BjL,EAAWO,GAA1C,eAAAqB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAyBC,EAAWO,GAAa,KAAMsK,GAC/E/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA8BjL,EAAWO,GAAzC,eAAAqB,EAAA,sEAC8BsC,GAAeuE,iBAD7C,cACUoC,EADV,yBAEWE,IAAMC,KAAKpL,EAAWG,GAAwBC,EAAWO,GAAa,KAAMsK,GAC9E/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAP1C,4C,oEAWA,WAA+BjL,EAAW2Q,EAAM6O,GAAhD,iBAAA5d,EAAA,sEAC8BsC,GAAeuE,eAAe,uBAD5D,cACUoC,EADV,QAEUlE,EAAW,IAAIqF,UACZ9E,OAAO,OAAQyJ,GACxB6O,EAAQzZ,SAAQ,SAACkG,EAAGpF,GAChBF,EAASO,OAAT,kBAA2BL,EAA3B,KAAqCoF,MAL7C,kBAOWlB,IAAMC,KAAKpL,EAAWG,GAA0BC,GAAY2G,EAAUkE,GACxE/H,KADE,uCACG,WAAMe,GAAN,SAAAjC,EAAA,+EACKO,IAAiB,EAAO0B,EAASZ,KAAMY,IAD5C,2CADH,uDAIF4G,OAAM,SAAAQ,GACH,OAAO9I,IAAiB,EAAM8I,OAZ1C,4C,sBAgBeyxC,OAjNY,CACvBC,c,6CACAC,c,+CACAC,e,iDACAC,iB,+CACAC,Y,+CACAC,a,6CACAC,gB,6CACAC,Y,+CACAC,Y,mEACAC,a,mEACAC,gB,+CACAC,e,+CACAC,gB,0FCcEhrC,GAAYC,cAAW,iBAAO,CAChCgrC,OAAQ,CACJhpC,WAAY,IAEhBipC,UAAW,CACPppC,QAAS,OACTH,eAAgB,SAChBI,WAAY,SACZ,YAAa,CACTrB,SAAU,GAEd,oBAAqB,CACjBtE,gBAAiBL,GACjBI,MAAOJ,GACP63B,WAAY,GACZ,WAAY,CACRx3B,gBAAiBL,IAErB,UAAW,CACPK,gBAAiBL,GACjB,WAAY,CACRK,gBAAiBL,OAKjCovC,iBAAkB,CACdrpC,QAAS,OACTH,eAAgB,YAEpBK,WAAY,CACR,uBAAwB,CACpBC,WAAY,GACZC,cAAe,IAGvBkpC,KAAM,CACFxc,YAAa,EACb1d,aAAc,GAElBrP,QAAS,CACLvB,UAAW,OACXD,OAAQ,IACRyB,QAAS,OACTH,eAAgB,SAChBI,WAAY,UAEhBspC,mBAAoB,CAChBjpC,SAAU,YAEdkpC,YAAa,CACTxwB,eAAgB,QAChBC,mBAAoB,UAExBwwB,mBAAoB,CAChB1qC,MAAO,YAIT2qC,GAAgB,SAAAtE,GAAS,MAAK,CAChCppC,MAAO,GACPC,YAAa,GACb0tC,SAAU,GACVvE,cAGG,SAASwE,GAA0BpsC,GAAQ,IACtCinC,EAA4EjnC,EAA5EinC,SAAU72C,EAAkE4P,EAAlE5P,KAAM+S,EAA4DnD,EAA5DmD,QAASmgB,EAAmDtjB,EAAnDsjB,OAAQn1B,EAA2C6R,EAA3C7R,UAAWk+C,EAAgCrsC,EAAhCqsC,gBAAiBC,EAAetsC,EAAfssC,WADxB,EAECjpC,IAAMC,SAAS,IAFhB,oBAEtCipC,EAFsC,KAErBC,EAFqB,OAGOnpC,IAAMC,SAAS,IAHtB,oBAGtCmpC,EAHsC,KAGlBC,EAHkB,OAIHrpC,IAAMC,SAAS,IAJZ,oBAItC8L,EAJsC,KAIvBC,EAJuB,OAKLhM,IAAMC,SAAS,IALV,oBAKtCqpC,EALsC,KAKxBC,EALwB,OAMfvpC,IAAMC,SAAS,IANA,oBAMtC7R,EANsC,KAM7Bo7C,EAN6B,OAOLxpC,IAAMC,SAAS,IAPV,oBAOtCwpC,EAPsC,KAOxBC,EAPwB,OAQb1pC,IAAMC,SAAS,IARF,oBAQtChD,EARsC,KAQ5B0sC,EAR4B,OASH3pC,IAAMC,SAAS,IATZ,oBAStC2pC,EATsC,KASvBC,EATuB,OAUX7pC,IAAMC,SAAS,KAVJ,oBAUtCinC,EAVsC,KAU3B4C,EAV2B,OAWD9pC,IAAMC,SAAS,KAXd,oBAWtC8pC,EAXsC,KAWtBC,EAXsB,OAYfhqC,IAAMC,SAAS,CAAC4oC,IAAc,GAAQA,IAAc,KAZrC,oBAYtCvE,GAZsC,KAY7B2F,GAZ6B,QAaLjqC,IAAMC,SAAS,IAbV,sBAatCiqC,GAbsC,MAaxBC,GAbwB,SAcbnqC,IAAMC,UAAS,GAdF,sBActCsnC,GAdsC,MAc5B6C,GAd4B,SAeGpqC,IAAMC,UAAS,GAflB,sBAetCoqC,GAfsC,MAepBC,GAfoB,SAgBCtqC,IAAMC,UAAS,GAhBhB,sBAgBtCsqC,GAhBsC,MAgBrBC,GAhBqB,SAiBLxqC,IAAMC,SAAS,IAjBV,sBAiBtCwqC,GAjBsC,MAiBxBC,GAjBwB,SAkBL1qC,IAAMC,SAAS,MAlBV,sBAkBtC0qC,GAlBsC,MAkBxBC,GAlBwB,SAmBT5qC,IAAMC,SAAS,GAnBN,sBAmBtC4qC,GAnBsC,MAmB1BC,GAnB0B,SAoBf9qC,IAAMC,SAAS,MApBA,sBAoBtCsB,GApBsC,MAoB7BC,GApB6B,SAqBjBxB,IAAMC,UAAS,GArBE,sBAqBtCyB,GArBsC,MAqB9BC,GArB8B,SAsBf3B,IAAMC,UAAS,GAtBA,sBAsBtCf,GAtBsC,MAsB7BuC,GAtB6B,MAuBvCM,GAAU1E,KAEV0tC,GAAiB,kBAAO/8C,GAAiB,OAAC41C,QAAD,IAACA,OAAD,EAACA,EAAUx4C,KAEpD4/C,GAAehrC,IAAMiC,YAAN,sBAAkB,kDAAAvV,EAAA,yDACd,QAAT,OAARk3C,QAAQ,IAARA,OAAA,EAAAA,EAAUx4C,UAAgCsE,KAAT,OAARk0C,QAAQ,IAARA,OAAA,EAAAA,EAAUx4C,IADJ,gCAERo8C,GAAmBQ,YAAYl9C,EAAW84C,EAASx4C,IAF3C,QAEzBuD,EAFyB,QAGlBb,SACT0T,GAAW7S,EAASZ,OAChB,EACoGY,EAASZ,KAAzGoN,EADL,EACKA,MAAO+rC,EADZ,EACYA,UAAWC,EADvB,EACuBA,UAAW7C,EADlC,EACkCA,QAAS2G,EAD3C,EAC2CA,SAAU5oC,EADrD,EACqDA,cAAe5L,EADpE,EACoEA,MAAO8wC,EAD3E,EAC2EA,SAAUnsC,EADrF,EACqFA,YAClF8vC,EAAcD,EAASxoC,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MACxCo+C,EAAWruC,GACXouC,EAAgBlnC,GAChBgnC,EAAsBL,EAAgB5lC,QAAO,SAAArM,GAAC,OAAIm0C,EAAYn6C,SAASgG,EAAE3L,QACzE4gB,EAAiBvV,EAAMgM,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,OAClC+9C,EAAmBH,GACnBU,EAAgBtuC,GAChBuuC,EAAYxC,GACZ0C,EAAiB1C,GACjB2C,EAAa5C,GACb8C,EAAkB9C,GAClB+C,GAAW3F,GACX8F,GAAY7C,IAnBe,uBAsB/BiC,EAAW,IACXD,EAAgB,IAChBF,EAAsB,IACtBr9B,EAAiB,IACjB29B,EAAY,IACZE,EAAiB,IACjBC,EAAa,KACbE,EAAkB,KAClBb,EAAmBH,GACnBiB,GAAW,CAACpB,IAAc,GAAQA,IAAc,KAChDuB,IAAY,GAhCmB,QAkCnCD,GAAgB,IAlCmB,4CAmCpC,CAACnB,EAAiBpF,EAAU94C,IA9Dc,SAoF9BqgD,GApF8B,iFAoF7C,WAA0Bh+C,GAA1B,eAAAT,EAAA,yDACIS,EAAMsW,iBACN9B,IAAU,IAEOopC,KAJrB,gCAKgBvD,GAAmBU,aACrBtE,EAASx4C,GACTN,EACAsD,EACAq7C,EACAvC,EACAjqC,EACAqnC,GACA4F,GACAd,EAAmB3mC,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MAC9Bk+C,EAAa7mC,KAAI,SAAA1L,GAAC,MAAK,CAAEq0C,WAAYr0C,EAAE3L,GAAIigD,QAASt0C,EAAEs0C,YACtDt/B,EACAw7B,IAjBd,2DAmBgBC,GAAmBS,YACrBn9C,EACAsD,EACAq7C,EACA,EACAvC,EACAjqC,EACAqnC,GACA4F,GACAd,EAAmB3mC,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MAC9Bk+C,EAAa7mC,KAAI,SAAA1L,GAAC,MAAK,CAAEq0C,WAAYr0C,EAAE3L,GAAIigD,QAASt0C,EAAEs0C,YACtDt/B,EACAw7B,IA/Bd,6BAIU54C,EAJV,MAiCiBb,SACT0T,GAAW7S,EAASZ,MAEpBkyB,EAAOtxB,EAASZ,MAGpB4T,IAAU,GACV7B,IAxCJ,6CApF6C,+BA+H9BwrC,GA/H8B,iFA+H7C,WAAiCn+C,GAAjC,eAAAT,EAAA,6DACIS,EAAMsW,iBACN9B,IAAU,GAFd,SAI2B6lC,GAAmBK,YAAY/8C,EAAW2/C,IAJrE,QAIU97C,EAJV,QAKiBb,SACT0T,GAAW7S,EAASZ,MAEpBo7C,EAAmB,GAAD,oBAAKD,GAAL,CAAsBv6C,EAASZ,QAGrDy8C,IAAmB,GACnB7oC,IAAU,GAZd,4CA/H6C,sBA8I7C,SAASqB,GAAY7V,GAAQ,IAAD,EACAA,EAAMC,OAAtBsE,EADgB,EAChBA,MACR,OAFwB,EACT7F,MAEX,IAAK,UACD29C,EAAW93C,GACX,MACJ,IAAK,eACDg4C,EAAgBh4C,GAChB,MACJ,IAAK,eACDg5C,GAAgBh5C,GAChB,MACJ,IAAK,aACD,GAAqB,IAAjBA,EAAM3B,SAAiBw7C,MAAMC,SAAS95C,KAAW85C,SAAS95C,GAAS,GACnE,MAEJo5C,GAA+B,IAAjBp5C,EAAM3B,OAAe,GAAKy7C,SAAS95C,KAkB7D,SAAS+5C,GAAoBt+C,GACzBA,EAAMsW,iBACN8lC,EAAgBD,EAAa7mC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOu/C,GAAT,2BAA6B5zC,GAA7B,IAAgCs0C,QAASR,KAAe9zC,MAC/F6zC,GAAgB,MAChBE,GAAc,GAGlB,SAASY,KACL,IAAMC,EAAU,uBAAOrH,IAAP,CAAgBuE,IAAc,KAC9CoB,GAAW0B,GAGf,SAASC,KACL,GAAuB,IAAnBtH,GAAQv0C,OAAZ,CAGA,IAAM47C,EAAU,aAAOrH,IACvBqH,EAAWE,MACX5B,GAAW0B,IA4Qf,OA7YA3rC,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,0DACQK,EADR,gCAEci+C,KAFd,4CADkB,sBAMlBvpC,IAAW,GANQ,WAAD,+BAOlBvV,GAAO0B,MAAK,kBAAM6T,IAAW,QAC9B,CAAC1U,EAAMi+C,KAGVhrC,IAAMyH,WAAU,WACRzZ,GAAkB28C,IAClBG,GAAc,GAEdA,GAAcxB,EAAalnB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOu/C,MAAcU,WAEjE,CAACV,GAAcrB,IA6Xd,oCACI,kBAAC5hC,GAAA,EAAD,CAAQ3a,KAAMA,EAAMkS,SAAS,KAAKoI,WAAS,GACtCnI,GACG,yBAAKsF,UAAWzC,GAAQ7C,SACpB,kBAAC0I,GAAA,EAAD,CAAkBpO,MAAM,aAvLpC,0BAAMsP,SAAUqiC,IACZ,kBAACpiC,GAAA,EAAD,0BACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYje,GAAG,2BAAf,cACA,kBAAC03B,GAAA,EAAD,CACIC,QAAQ,0BACRrxB,MAAO03C,EACPjjC,SAAU,SAAApP,GAnIlD,IAA8BrF,KAmI8CqF,EAAE3J,OAAOsE,OAlIvEX,SAAS,IACfs4C,EAAsB,IACf33C,EAAMX,SAAS,QACtBy5C,IAAmB,GACnBE,GAAgB,KAEhBrB,EAAsB33C,IA6HU7F,KAAK,aACLwZ,QAAQ,SACRU,UAAQ,EACRsB,WAAS,GAER6hC,EAAgBzmC,KAAI,SAAA1L,GAAC,OAClB,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,GAC3BA,EAAElL,SAGX,kBAACwN,GAAD,CAAczH,IAAI,MAAMF,MAAM,OAC1B,wCAEJ,kBAAC2H,GAAD,CAAczH,IAAI,OAAOF,MAAM,IAC3B,iDAKhB,kBAACwT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAAChC,QAAQ,WAAWd,QAAS,kBAAM+lC,IAAoB,IAAOljC,UAAW,kBAACypB,GAAA,EAAD,OAA1F,oBAIJ,kBAAC3rB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACVmkC,EAAa7mC,KAAI,SAAC1L,EAAGhF,GAClB,OACI,kBAACiV,GAAA,EAAD,CACIpV,IAAKG,EACLyS,UAAWzC,GAAQ0mC,KACnBjvC,MAAM,UACNsyC,OAAQ/0C,EAAEiO,SAASjU,SAAS,SAAW,kBAACyjB,GAAA,EAAD,CAAQjP,IAAKxO,EAAE0R,MAAU,KAChE5C,MAAK,UAAK9O,EAAEoE,MAAP,YAAgBpE,EAAEiO,SAAS6lB,MAAM,KAAK9zB,EAAEiO,SAAS6lB,MAAM,KAAK96B,OAAS,IAArE,OAA0EgH,EAAEiO,SAASjU,SAAS,OAApB,gBAAsCgG,EAAEs0C,QAAxC,KAAqD,IACpIU,SAAU,kBAAMxC,EAAgBD,EAAalmC,QAAO,SAAA4oC,GAAC,OAAIA,EAAE5gD,KAAO2L,EAAE3L,cAKpF,kBAAC8Z,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACW,GAAA,EAAD,CACIC,UAAQ,EACRrU,MAAOqa,EACP5F,SAAU,SAACC,EAAG4c,GAAJ,OAAUhX,EAAiBgX,IACrCxe,UAAWzC,GAAQ1C,WACnB2G,QAASijC,EAAWtZ,MAAK,SAACjjC,EAAGwG,GAAJ,OAAWA,EAAErH,KAAK,GAAG6oB,cAAcu3B,cAAcv/C,EAAEb,KAAK,GAAG6oB,kBAAgBjS,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MAC/G8gD,QAAS,SAAAztC,GAAI,OAAIwqC,EAAW7mB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOqT,KAAM5S,KAAK,GAAG6oB,eAC7DzO,eAAgB,SAAAxH,GAAI,OAAIwqC,EAAW7mB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOqT,KAAM5S,MAC5D2a,YAAa,SAAAC,GAAM,OAAI,kBAACC,GAAA,EAAD,iBAAeD,EAAf,CAAuBZ,MAAM,eAAeR,QAAQ,SAASsB,gBAAiB,CAAEC,QAAQ,OAC/GC,WAAY,SAACnV,EAAOoV,GAAR,OACRpV,EAAM+Q,KAAI,SAACsE,EAAQpV,GACf,IAAM9F,EAAOo9C,EAAW7mB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAO2b,KAAQlb,KACnD,OAAO,kBAACmb,GAAA,EAAD,eAAMpV,IAAKD,EAAO6H,MAAM,UAAUqM,MAAOha,GAAUib,EAAY,CAAEnV,mBAKxF,kBAACuT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,WAAWM,SAAUnD,GAAatR,MAAOtD,EAASvC,KAAK,UAAUod,UAAQ,EAAC5B,WAAS,EAAC6B,WAAS,EAACC,KAAM,KAE1I,kBAACjE,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,gBAAgBM,SAAUnD,GAAatR,MAAO+3C,EAAc59C,KAAK,eAAewb,WAAS,EAAC6B,WAAS,EAACC,KAAM,KAEhJ,kBAACjE,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,GAClB,kBAACgC,GAAA,EAAD,CAAYzC,QAAM,GAAlB,YACA,kBAACulC,GAAA,EAAD,CACI3nC,UAAWzC,GAAQumC,OACnBl1C,aAAcw2C,EACdwC,kBAAkB,OAClBC,kBAAmB,SAACjmC,EAAG4c,GAAJ,OAAU2mB,EAAY3mB,IACzCn3B,KAAK,WACL+sC,KAAM,EACN0T,IAAK,EACLC,IAAK,QAIjB,kBAACrnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,GAClB,kBAACgC,GAAA,EAAD,CAAYzC,QAAM,GAAlB,qBACA,kBAACulC,GAAA,EAAD,CACI3nC,UAAWzC,GAAQumC,OACnBl1C,aAAc22C,EACdyC,MAAO,SAAAjT,GAAC,OAAS,IAAJA,GAAUlnC,QAAQ,IAC/B+5C,kBAAkB,OAClBC,kBAAmB,SAACjmC,EAAG4c,GAAJ,OAAU8mB,EAAa9mB,IAC1Cn3B,KAAK,YACL+sC,KAAM,EACN0T,IAAK,EACLC,IAAK,QAIjB,kBAACrnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,KACf,kBAACD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,GAClB,kBAACqT,GAAA,EAAD,CAAkBC,QAAS,kBAACC,GAAA,EAAD,CAAUb,QAASwtB,GAAUphC,SAAU,SAAApP,GAAC,OAAIqzC,GAAYrzC,EAAE3J,OAAO2sB,UAAUvgB,MAAM,YAAcqM,MAAM,kBAKhJ,kBAACX,GAAA,EAAD,CAAMzG,MAAI,EAACkkB,GAAI,EAAGxd,GAAI,IAClB,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,GAAQ2mC,oBAC1CpE,GAAQ7hC,KAAI,SAAC1L,EAAGhF,GAAJ,OACT,kBAACmT,GAAA,EAAD,CAAMtT,IAAKG,EAAG0M,MAAI,EAAC0G,GAAI,GAAIX,UAAWzC,GAAQwmC,WAC1C,yBAAK/jC,UAAWzC,GAAQ6mC,oBACpB,kBAACliC,GAAA,EAAD,CACIrB,QAAQ,SACRQ,MAAK,iBAAY9T,EAAI,GACrByS,UAAW,SACX2B,SAAU,SAAApP,GAAC,OA9MtBpF,EA8MkDI,EA9M3C06C,EA8M8C11C,EAAE3J,OAAOsE,WA7M3Fu4C,GAAW3F,GAAQ7hC,KAAI,SAAC1L,EAAGhF,GAAJ,mBAAC,eAAegF,GAAhB,IAAmBoE,MAAOpJ,IAAMJ,EAAQ86C,EAAW11C,EAAEoE,YADhF,IAAiCxJ,EAAO86C,GA+MI/6C,MAAOqF,EAAEoE,MACTkM,WAAS,IAEb,6BACCrZ,GAAkB+I,EAAE+xC,WAA0C,IAA7B/xC,EAAE+xC,SAAS54C,OAAOH,OAChD,kBAACqZ,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYzC,QAAM,GAAlB,iBAA8B7U,EAAI,EAAlC,WACA,kBAACuX,GAAA,EAAD,CACIE,KAAK,OACL3d,KAAK,QACLq3B,WAAY,CACRC,OAAQ,WAEZhd,SAAU,SAAAhZ,GAAK,OAxNnE,SAAiCwE,EAAOxE,GAAQ,IACpC8V,EAAU9V,EAAMC,OAAhB6V,MACFypC,EAAgBxC,GAAan6C,OAC7B48C,EAAUh7C,GAAS+6C,EACrBzpC,EAAMlT,OAAS,IACX48C,GACAxC,GAAgB,GAAD,oBAAKD,IAAL,CAAmBjnC,EAAM,MACxCgnC,GAAW3F,GAAQ7hC,KAAI,SAAC1L,EAAGhF,GAAJ,OAAWA,IAAMJ,EAAN,2BAAmBoF,GAAnB,IAAsB61C,WAAYF,IAAkB31C,QAEtFozC,GAAgBD,GAAaznC,KAAI,SAAC1L,EAAGhF,GAAJ,OAAWA,IAAMJ,EAAQsR,EAAM,GAAKlM,MACrEkzC,GAAW3F,GAAQ7hC,KAAI,SAAC1L,EAAGhF,GAAJ,OAAWA,IAAMJ,EAAN,2BAAmBoF,GAAnB,IAAsB61C,WAAYF,IAAkB31C,QA8M3B81C,CAAwB96C,EAAG5E,IAC9Cka,WAAS,KAIjB,yBAAK7C,UAAWzC,GAAQ4mC,YAAalkC,MAAO,CAAEwT,gBAAgB,OAAD,OAASlhB,EAAE+xC,SAAX,OACzD,kBAAClgC,GAAA,EAAD,CAAYrE,QAAS,kBA/MpC5S,EA+MkEI,OA9M/Fk4C,GAAW3F,GAAQ7hC,KAAI,SAAC1L,EAAGhF,GAAJ,OAAWA,IAAMJ,EAAN,2BAAmBoF,GAAnB,IAAsB+xC,SAAU,OAAS/xC,MAD/E,IAAiCpF,IAgNmB,kBAAC6V,GAAA,EAAD,SAKhB,kBAACoB,GAAA,EAAD,CAAY2L,KAAK,QAAQ/P,UAAS,wBAAmBzN,EAAEwtC,UAAY,UAAY,IAAMhgC,QAAS,kBA5O/F5S,EA4O+HI,OA3O9Jk4C,GAAW3F,GAAQ7hC,KAAI,SAAC1L,EAAGhF,GAAJ,mBAAC,eAAegF,GAAhB,IAAmBwtC,UAAWxyC,IAAMJ,QAD/D,IAAmCA,GA4OmI4V,SAAUwjC,MACvIh0C,EAAEwtC,UAAY,kBAACN,GAAA,EAAD,MAAW,kBAAC6I,GAAA,EAAD,WAItC,kBAAC5nC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GAAIX,UAAWzC,GAAQymC,kBAClC,kBAAC5/B,GAAA,EAAD,CAAYrE,QAASmnC,GAAiBnkC,SAAUwjC,MAC5C,kBAACla,GAAA,EAAD,OAEJ,kBAACjoB,GAAA,EAAD,CAAYrE,QAASqnC,GAAoBrkC,SAAU+8B,GAAQv0C,QAAU,GAAKg7C,MACtE,kBAACgC,GAAA,EAAD,YAOxB,kBAACtjC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAAU7F,GAAQ8H,KAAK,UAA/C,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,aA/MR,kBAAC4H,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkB28C,IAAe7qC,QAAS,kBAAM8qC,GAAgB,QAC3E,0BAAM9hC,SAAU2iC,IACZ,kBAAC1iC,GAAA,EAAD,2BACA,kBAACC,GAAA,EAAD,KACI,kBAACtC,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,cAAc2D,KAAK,SAASrD,SAAUnD,GAAatR,MAAOm5C,GAAYh/C,KAAK,aAAaod,UAAQ,EAAC5B,WAAS,KAEhJ,kBAACoC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAUgQ,KAAK,SAASjC,SAAU7F,IAAhD,WAGA,kBAACwF,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMqmC,GAAgB,QAAvD,aA/BZ,kBAACljC,GAAA,EAAD,CAAQ3a,KAAMw9C,GAAiBzqC,QAAS,kBAAM0qC,IAAmB,KAC7D,0BAAM1hC,SAAUwiC,IACZ,kBAACviC,GAAA,EAAD,yBACA,kBAACC,GAAA,EAAD,KACI,kBAACtC,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,gBAAgBM,SAAUnD,GAAatR,MAAO+4C,GAAc5+C,KAAK,eAAeod,UAAQ,EAAC5B,WAAS,KAExI,kBAACoC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAUgQ,KAAK,SAASjC,SAAU7F,IAAhD,gBAGA,kBAACwF,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMimC,IAAmB,KAA1D,aAgCZ,kBAAC9iC,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBuT,IAAUzB,QAAS,kBAAM0B,GAAW,QACjE,kBAACuH,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACI,kBAAC,GAAD,CAAOhM,OAAO,wBAAwBJ,KAAM2E,MAEhD,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM/C,GAAW,QAAlD,QA4MR,kBAAC5B,GAAD,CACIC,UAAU,EACV9S,KAAMs9C,GACNv/C,UAAWA,EACXgV,QAAS,kBAAMwqC,IAAoB,IACnCvqC,SAAU,SAAA+C,GACNymC,EAAgB,GAAD,oBAAKD,GAAL,CAAmBxmC,KAC9BA,EAASkC,SAASjU,SAAS,QAC3B65C,GAAgB9nC,EAAS1X,Q,4CClkB3CiS,GAAYC,cAAW,iBAAO,CAChC/D,KAAM,CACF,cAAe,CACX4F,QAAS,OACTzB,OAAQ,SAEZ,SAAU,CACN+B,SAAU,WACVvB,MAAO,OACPC,QAAS,EACTuB,IAAK,EACLqO,KAAM,EACNlE,OAAQ,EACRpQ,gBAAiBL,GACjBgF,gBAAiB,oCACjBC,aAAc,oCACdC,UAAW,oCACX,0BAA2B,CACvB4P,SAAU,KAGlB,UAAW,CACPhQ,MAAO,MACPR,OAAQ,OACRM,UAAW,SACXyB,SAAU,WACVH,WAAY,IACZ,eAAgB,CACZgtB,WAAW,aAAD,OAAelzB,MAGjC,WAAY,CACR4E,UAAW,OACXN,OAAQ,OACRS,QAAS,GAEb,aAAc,CACV6uC,UAAU,aAAD,OAAe5zC,IACxBsf,UAAW,UAEf,gBAAiB,CACbvZ,QAAS,OACTH,eAAgB,WAChBI,WAAY,UAEhB,mBAAoB,CAChBjB,QAAS,GACTua,UAAW,eAKhB,SAASu0B,GAAmBtwC,GAAQ,IAC/BuwC,EAAmKvwC,EAAnKuwC,UAAWC,EAAwJxwC,EAAxJwwC,aAAcC,EAA0IzwC,EAA1IywC,aAAcC,EAA4H1wC,EAA5H0wC,WAAYC,EAAgH3wC,EAAhH2wC,cAAeC,EAAiG5wC,EAAjG4wC,cAAeC,EAAkF7wC,EAAlF6wC,gBAAiBC,EAAiE9wC,EAAjE8wC,iBAAkBC,EAA+C/wC,EAA/C+wC,WAAYC,EAAmChxC,EAAnCgxC,YAAaC,EAAsBjxC,EAAtBixC,kBAC/I7rC,EAAU1E,KAEhB,OACI,kBAACmY,GAAA,EAAD,CAAMhR,UAAWzC,EAAQxI,KAAM4Y,UAAW,GACtC,yBAAK3N,UAAU,YACX,yBAAKA,UAAU,QACX,yBAAKA,UAAU,OACX,kBAACY,GAAA,EAAD,CAAYC,QAAQ,SAASwM,UAAU,OAClCq7B,GAEL,kBAAC9nC,GAAA,EAAD,CAAYC,QAAQ,UAAUwM,UAAU,MAAMvM,cAAY,GACrD6nC,GAEL,yBAAK3oC,UAAU,cACX,kBAACqpC,GAAA,EAAD,MACA,kBAACjzB,GAAA,EAAD,CAAUzU,SAAUqnC,MAG5B,yBAAKhpC,UAAU,SAAS4oC,IAG5B,yBAAK5oC,UAAU,QACX,yBAAKA,UAAU,OACX,kBAACY,GAAA,EAAD,CAAYC,QAAQ,SAASwM,UAAU,OAClCw7B,GAEL,kBAACjoC,GAAA,EAAD,CAAYC,QAAQ,UAAUwM,UAAU,MAAMvM,cAAY,GACrDgoC,GAEL,yBAAK9oC,UAAU,cACX,kBAACqpC,GAAA,EAAD,MACA,kBAACjzB,GAAA,EAAD,CAAUzU,SAAUsnC,MAG5B,yBAAKjpC,UAAU,UAAsB,OAAb+oC,QAAa,IAAbA,OAAA,EAAAA,EAAex9C,QAAS,EAAIw9C,EAAgB,kBAACnoC,GAAA,EAAD,CAAYZ,UAAU,iBAAiBopC,MAGnH,yBAAKppC,UAAU,WACX,kBAACoE,GAAA,EAAD,CAAYpP,MAAM,UAAU+K,QAASmpC,GACjC,kBAAC5S,GAAA,EAAD,OAEJ,kBAAClyB,GAAA,EAAD,CAAYpP,MAAM,UAAU+K,QAASopC,GACjC,kBAAC1S,GAAA,EAAD,S,sDCjGL,SAAS6S,GAAcC,GAClC,OAAQA,GACJ,KAAK,EACD,OAAO,kBAACC,GAAA,EAAD,MACX,KAAK,EACD,OAAO,kBAACC,GAAA,EAAD,MACX,KAAK,EACD,OAAO,kBAACC,GAAA,EAAD,MACX,KAAK,EACD,OAAO,kBAACC,GAAA,EAAD,MACX,KAAK,EACD,OAAO,kBAAC,KAAD,MACX,QACI,OAAO,kBAACH,GAAA,EAAD,O,wFCuBb3wC,GAAYC,cAAW,iBAAO,CAChC4B,QAAS,CACLvB,UAAW,OACXD,OAAQ,IACRyB,QAAS,OACTH,eAAgB,SAChBI,WAAY,UAEhBjE,MAAO,CACH3B,MAAOJ,IAEXg1C,UAAW,CACPjwC,QAAS,EACTK,UAAW,EACXiB,SAAU,WACV,aAAc,CACVhG,gBAAiBL,IAErB,cAAe,CACXqG,SAAU,WACVC,IAAK,EACLC,MAAO,GAEX,YAAa,CACTL,WAAY,IAEhB,iBAAkB,CACdX,aAAc,KAGtB0vC,kBAAmB,CACfpd,WAAY,GAEhBqd,eAAgB,CACZnwC,QAAS,GACTkQ,aAAc,EACdH,SAAU,GACV2O,WAAY,IACZrjB,MAAOJ,GACP,kBAAmB,CACf6yB,YAAa,IAEjB,oBAAqB,CACjBzyB,MAAOJ,GACPmsB,OAAQ,YACRyR,YAAa59B,GACbiV,aAAc,EACd3Q,OAAQ,GACRS,QAAS,EACT0O,OAAQ,mBACRqB,SAAU,IAEd,oBAAqB,CACjBqX,OAAQ,YACRyR,YAAa59B,GACbiV,aAAc,EACdlQ,QAAS,EACT0O,OAAQ,mBACRnP,OAAQ,GACR,UAAW,CACPkB,SAAU,IACV8Z,UAAW,SACXlf,MAAOJ,GACP8U,SAAU,GACVxQ,OAAQ,OACRS,QAAS,EACTouB,OAAQ,YAGhB,kBAAmB,CACf/yB,MAAOJ,GACPmsB,OAAQ,YACRyR,YAAa59B,GACbiV,aAAc,EACdlQ,QAAS,EACTK,UAAW,OACX+P,aAAc,OACd0d,YAAa,MACbvuB,OAAQ,OACRQ,MAAO,OACPU,SAAU,IACV,qBAAsB,CAClBc,IAAK,EACLD,SAAU,aAGlB,iBAAkB,CACdN,QAAS,QAEb,uBAAwB,CACpBX,UAAW,IAEf,uBAAwB,CACpB,sCAAsC,GAAtC,OAA0CpF,GAA1C,iBAGRm1C,UAAW,CACPpvC,QAAS,QAEbqvC,YAAa,CACTrvC,QAAS,OACT1B,cAAe,SACf2B,WAAY,WACZ6sB,YAAa,GACbztB,UAAW,EACXN,MAAO,OACP,qBAAsB,CAClBquB,OAAQ,YAGhBkiB,eAAgB,CACZ,kBAAmB,CACftvC,QAAS,OACTC,WAAY,eAKjB,SAASsvC,GAA4B/xC,GAAQ,IACxCwmC,EAAsHxmC,EAAtHwmC,WAAYp2C,EAA0G4P,EAA1G5P,KAAM+S,EAAoGnD,EAApGmD,QAASmgB,EAA2FtjB,EAA3FsjB,OAAQn1B,EAAmF6R,EAAnF7R,UAAW6jD,EAAwEhyC,EAAxEgyC,WAAYC,EAA4DjyC,EAA5DiyC,eAAgBC,EAA4ClyC,EAA5CkyC,gBAAiB5F,EAA2BtsC,EAA3BssC,WAAY6F,EAAenyC,EAAfmyC,WADhE,EAEjB9uC,IAAMC,SAAS,MAFE,oBAExCsB,EAFwC,KAE/BC,EAF+B,OAGnBxB,IAAMC,UAAS,GAHI,oBAGxCyB,EAHwC,KAGhCC,EAHgC,OAIjB3B,IAAMC,UAAS,GAJE,oBAIxCf,EAJwC,KAI/BuC,EAJ+B,OAKbzB,IAAMC,SAAS,IALF,oBAKxC8uC,EALwC,KAK7BC,EAL6B,OAOvBhvC,IAAMC,SAAS,GAPQ,oBAOxC24B,EAPwC,KAOlCqW,EAPkC,OAQOjvC,IAAMC,SAAS,IARtB,oBAQxCivC,EARwC,KAQnBC,EARmB,OASKnvC,IAAMC,SAAS,IATpB,oBASxCmvC,EATwC,KASpBC,EAToB,OAUHrvC,IAAMC,SAAS,IAVZ,oBAUxCqvC,EAVwC,KAUxBC,EAVwB,OAWOvvC,IAAMC,SAAS,IAXtB,oBAWxCuvC,EAXwC,KAWnBC,EAXmB,OAYHzvC,IAAMC,SAAS,IAZZ,qBAYxCyvC,GAZwC,MAYxBC,GAZwB,SAaH3vC,IAAMC,SAAS,IAbZ,sBAaxC2vC,GAbwC,MAaxBC,GAbwB,SAcH7vC,IAAMC,SAAS,IAdZ,sBAcxC6vC,GAdwC,MAcxBC,GAdwB,SAeX/vC,IAAMC,SAAS,IAfJ,sBAexC+vC,GAfwC,MAe5BC,GAf4B,SAgBTjwC,IAAMC,SAAS,IAhBN,sBAgBxCiwC,GAhBwC,MAgB3BC,GAhB2B,SAiBXnwC,IAAMC,SAAS,IAjBJ,sBAiBxCktB,GAjBwC,MAiB5BC,GAjB4B,SAmBPptB,IAAMC,SAAS,UAnBR,sBAmBxCmwC,GAnBwC,MAmB1BC,GAnB0B,SAoBbrwC,IAAMC,SAAS,MApBF,sBAoBxCqwC,GApBwC,MAoB7BC,GApB6B,SAqBbvwC,IAAMC,SAASzK,OArBF,sBAqBxC0U,GArBwC,MAqB7BsmC,GArB6B,SAsBjBxwC,IAAMC,SAASzK,OAtBE,sBAsBxCi7C,GAtBwC,MAsB/BC,GAtB+B,SAuBb1wC,IAAMC,UAAS,GAvBF,sBAuBxC0wC,GAvBwC,MAuB7BC,GAvB6B,SAwBvB5wC,IAAMC,SAAS,IAxBQ,sBAwBxCpU,GAxBwC,MAwBlCg5C,GAxBkC,SAyBb7kC,IAAMC,SAAS,GAzBF,sBAyBxCqjB,GAzBwC,MAyB7ButB,GAzB6B,SA0BX7wC,IAAMC,SAAS,MA1BJ,sBA0BxC/U,GA1BwC,MA0B5B4lD,GA1B4B,SA2BH9wC,IAAMC,UAAS,GA3BZ,sBA2BxC8wC,GA3BwC,MA2BxBC,GA3BwB,SA4BShxC,IAAMC,SAAS,IA5BxB,sBA4BxC6jB,GA5BwC,MA4BlBmtB,GA5BkB,SA6BHjxC,IAAMC,SAAS,IA7BZ,sBA6BxCixC,GA7BwC,MA6BxBC,GA7BwB,MA+BzCC,GAAoBxzB,mBAAQ,kBAAMwxB,EAAmBhsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,cAAW,CAAC+qC,IAC/EiC,GAAY77C,IAAOC,IAAI,cACvB8H,GAAQqE,eACRC,GAAUC,aAAcvE,GAAMK,YAAYC,KAAK,OAC/CkE,GAAU1E,KAEVi0C,GAAmB,kBAAOtjD,GAAiB,OAACm1C,QAAD,IAACA,OAAD,EAACA,EAAY/3C,KAExDmmD,GAAmBvxC,IAAMiC,aAC3B,SAAC22B,EAAMwW,GACU,IAATxW,GAA6C,IAA/BsW,EAAoBn/C,OAClCo/C,EAAuBC,EAAmB3sC,KAAI,SAAA1L,GAAC,OAAIA,EAAEmwC,cACrC,IAATtO,GAAcsW,EAAoBn/C,OAAS,GAClDo/C,EAAuB,MAG/B,CAACD,IAGCsC,GAAWxxC,IAAMiC,aACnB,SAAAkhC,GACI,IAAMsO,EAAYtO,EAAW5f,eAAesH,MAAM,KAClD,GAAyB,IAArB4mB,EAAU1hD,OAAd,CAIA,GAAI0hD,EAAU,GAAG1gD,SAAS,KAAM,CAC5B,IAAM2gD,EAAUD,EAAU,GAAG5mB,MAAM,KAC7B8mB,EAAQF,EAAU,GAAG5mB,MAAM,KACjC3gB,GAAU0nC,OAAOF,EAAQ,IACzBxnC,GAAU0nC,OAAOF,EAAQ,IACzBxnC,GAAU2nC,KAAKF,EAAM,IACrBznC,GAAU2nC,KAAKF,EAAM,IACrBnB,GAAatmC,SAEbA,GAAU0nC,OAAOH,EAAU,IAC3BvnC,GAAU2nC,KAAKJ,EAAU,IACzBjB,GAAatmC,IAEbunC,EAAU,GAAG1gD,SAAS,MAAQ0gD,EAAU,GAAG1gD,SAAS,MAAQ0gD,EAAU,GAAG1gD,SAAS,MAAQyE,IAAOC,IAAI0tC,EAAW2O,WAAWC,OAAOv8C,IAAOC,IAAI0tC,EAAW6O,SAAU,SAClK3B,GAAgB,SAGfriD,GAAkBm1C,IAAgBsN,GAAQsB,OAAOV,GAAW,QAG7Dd,GAAa,SAFbA,GAAa,WArBb/uC,EAAW,yEA0BnB,CAAC0I,GAAWumC,GAASY,KAGzB,SAASY,GAAyB/rB,GAC9B,IAAMurB,EAAYvrB,EAAM3C,eAAesH,MAAM,KACzCqnB,EAAO,CACP7rB,WAAYH,EAAMG,YAGtB,GAAyB,IAArBorB,EAAU1hD,OAiBd,OAZAmiD,EAAI,2BAAQA,GAAR,IAAcC,kBAAmBV,EAAU,GAAG5mB,MAAM,OACxDqnB,EAAI,2BAAQA,GAAR,IAAcE,mBAAoBX,EAAU,GAAG5mB,MAAM,OACzDqnB,EAAI,2BAAQA,GAAR,IAAcG,qBAAsBZ,EAAU,GAAG5mB,MAAM,OAOvDqnB,EALCT,EAAU,GAAG1gD,SAAS,KAEf0gD,EAAU,GAAG1gD,SAAS,KAG1B,2BAAQmhD,GAAR,IAAc9B,aAAc,WAF5B,2BAAQ8B,GAAR,IAAc9B,aAAc,YAF5B,2BAAQ8B,GAAR,IAAc9B,aAAc,WAThC5uC,EAAW,uEAmBnB,IAAM8wC,GAAqBtyC,IAAMiC,aAAY,WACzC,GAAuB,QAAT,OAAVkhC,QAAU,IAAVA,OAAA,EAAAA,EAAY/3C,UAAkCsE,KAAT,OAAVyzC,QAAU,IAAVA,OAAA,EAAAA,EAAY/3C,IACvCikD,EAAsBT,GACtBW,EAAkBZ,GAClBc,EAAuBZ,GACvBc,GAAkB1G,GAClB4G,GAAkB,IAClBW,GAAah7C,OACbk7C,GAAWW,IACXxM,GAAQ,IACRgM,GAAa,OACV,CAAC,IAAD,MACGnB,EAAiBzG,EAAWxmC,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAasN,SAAU8+B,EAAW1sC,MAAM2M,QAAO,SAAA1W,GAAC,OAAIA,EAAEtB,KAAO2L,EAAE3L,MAAI2E,OAAS,OAC7GwiD,EAAkB,GAClBC,EAAgB,CAClBnsB,WAAY,EACZosB,aAActP,EAAWzf,cACzBE,sBAAqB,UAAEuf,EAAWvf,6BAAb,QAAsC,EAC3DD,iBAAgB,UAAEwf,EAAWxf,wBAAb,QAAiC,GAE/C+uB,EAAgB,CAClBrsB,WAAY,EACZ+pB,aAAc,SACdiC,qBAAsB,CAAC78C,IAAOC,MAAM8c,OAAO,MAC3C4/B,kBAAmB,CAAC38C,IAAOC,MAAM8c,OAAO,MACxC6/B,mBAAoB,CAAC58C,IAAOC,MAAM8c,OAAO,OA4B7C,GAzBA88B,EACIT,EAAensC,KAAI,SAAA1L,GAAC,kCACbA,GADa,IAGhBsN,SAAU8+B,EAAWtf,UAAUzgB,QAAO,SAAA1W,GAAC,OAAIA,EAAEtB,KAAO2L,EAAE3L,MAAI2E,OAAS,IAAMgH,EAAEN,MAAMohB,MAAK,SAAAnrB,GAAC,OAAIgjD,EAAejtC,KAAI,SAAAitB,GAAC,OAAIA,EAAEtkC,MAAI2F,SAASrE,EAAEtB,QAA2B,IAAnB2L,EAAEN,MAAM1G,cAG5Jw/C,EACIZ,EAAWlsC,KAAI,SAAA1L,GAAC,kCACTA,GADS,IAGZsN,SAAU8+B,EAAW3a,MAAMplB,QAAO,SAAA1W,GAAC,OAAIA,EAAEtB,KAAO2L,EAAE3L,MAAI2E,OAAS,GAAKgH,EAAEN,MAAMohB,MAAK,SAAAnrB,GAAC,OAAIgjD,EAAejtC,KAAI,SAAAitB,GAAC,OAAIA,EAAEtkC,MAAI2F,SAASrE,EAAEzB,iBAIvIwkD,EAAuBZ,EAAgBpsC,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAasN,SAAU8+B,EAAWhjC,WAAWiD,QAAO,SAAA1W,GAAC,OAAIA,EAAEtB,KAAO2L,EAAE3L,MAAI2E,OAAS,QAC7H4/C,GAAkBD,GAClBG,GAAkB1M,EAAWzf,cAAcygB,YAC3CqM,GAAah7C,IAAOC,IAAI0tC,EAAW/vB,OAAOd,SAC1Co+B,GAAWl7C,IAAOC,IAAI0tC,EAAW3f,KAAKlR,SACtCuyB,GAAQ1B,EAAWhoC,OACnB01C,GAAa1N,EAAW7f,WACxB2tB,GAAwB,CAACuB,GAAF,8BAAoBrP,EAAWrf,4BAA/B,aAAoB,EAAiC1gB,QAAO,SAAArM,GAAC,OAAqB,IAAjBA,EAAEsvB,iBAC1FuqB,IAAc5iD,GAAkBm1C,EAAW5f,iBAEtCv1B,GAAkBm1C,EAAW5f,gBAQ9BgvB,EAAgBvhD,KAAK0hD,QALrB,GAFAlB,GAASrO,GAELn1C,GAAkBm1C,EAAWrf,qBAAqB,IAAK,CACvD,IAAM6uB,EAAW,CAAEtsB,WAAY,EAAG9C,eAAgB4f,EAAW5f,gBAC7DgvB,EAAgBvhD,KAAKihD,GAAyBU,IAMtD,IAAK,IAAI5gD,EAAI,EAAGA,GAAC,OAAGoxC,QAAH,IAAGA,OAAH,EAAGA,EAAYrf,qBAAqB/zB,QAAQgC,IAAK,CAC9D,IAAMm0B,EAAK,OAAGid,QAAH,IAAGA,OAAH,EAAGA,EAAYrf,qBAAqB/xB,GAC1C/D,GAAkBk4B,EAAM3C,gBAGzBgvB,EAAgBvhD,KAAhB,2BAA0B0hD,GAA1B,IAAyCrsB,WAAYH,EAAMG,cAF3DksB,EAAgBvhD,KAAKihD,GAAyB/rB,IAKtDirB,GAAkBoB,MAEvB,CAACpP,EAAYyL,EAAgBD,EAAYE,EAAiB5F,EAAYoI,GAAWG,GAAUS,GAA0Bf,GAAgBC,KAoCxI,SAASnuC,GAAY7V,GAAQ,IAAD,EACAA,EAAMC,OAAtBvB,EADgB,EAChBA,KAAM6F,EADU,EACVA,MAGd,OADAs9C,EAAa,IACLnjD,GACJ,IAAK,eACD,GAAI6F,EAAQ0/C,GAAkBrhD,QAAU2B,EAAQ,EAE5C,YADAs9C,EAAa,mCAAD,OAAoCoC,GAAkBrhD,OAAtD,MAGhB8/C,GAAkBn+C,GAClB,MACJ,IAAK,iBACDq+C,GAAkBr+C,GAClB,MACJ,IAAK,aACDu+C,GAAcv+C,GACd,MACJ,IAAK,cACDy+C,GAAez+C,GACf,MACJ,IAAK,aACD07B,GAAc17B,GACd,MACJ,IAAK,eACD2+C,GAAgB3+C,GAChB,MACJ,IAAK,YACD6+C,GAAa7+C,GACb,MACJ,IAAK,OACDmzC,GAAQnzC,GACR,MACJ,IAAK,YACDm/C,GAAan/C,GACb,MACJ,IAAK,WACDo/C,GAAcp/C,IAO1B,SAASkhD,GAAoC77C,EAAGsvB,GAAa,IAAD,EAChCtvB,EAAE3J,OAAlBvB,EADgD,EAChDA,KAAM6F,EAD0C,EAC1CA,MAGd,OAFAs9C,EAAa,IAELnjD,GACJ,IAAK,eACD,GAAI6F,EAAQ0/C,GAAkBrhD,QAAU2B,EAAQ,EAE5C,YADAs9C,EAAa,mCAAD,OAAoCoC,GAAkBrhD,OAAtD,MAGhB,MACJ,IAAK,mBACD,GAAI2B,EAAQ,GAAKA,EAAQ,IAErB,YADAs9C,EAAa,iCAQzB,IAAM6D,EAAgB/uB,GAAqBrhB,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAeA,EAAjB,2BAAmCtvB,GAAnC,mBAAuClL,EAAO6F,IAAUqF,KAC7Gk6C,GAAwB4B,GAG5B,SAASC,GAAelP,GACpB,OAAQ,IAAMA,EAASx4C,GAAG+4C,WAAaP,EAASzoC,MAAQyoC,EAASqH,SAASxoC,KAAI,SAAA1L,GAAC,OAAIA,EAAElL,QAAMknD,KAAK,KAAKtjB,cAAc1+B,SAAS++C,GAAergB,eAG/I,SAASujB,GAAWlzB,GAChB,OAAQA,EAAK3pB,UAAY2pB,EAAK1pB,UAAUq5B,cAAc1+B,SAASi/C,GAAWvgB,eAG9E,SAASwjB,GAAgBnmB,GACrB,OAAOA,EAAUjhC,KAAK4jC,cAAc1+B,SAASm/C,GAAYzgB,eAG7D,SAASyjB,GAAWrxB,GAChB,OAAOA,EAAKh2B,KAAK4jC,cAAc1+B,SAASo8B,GAAWsC,eAGvD,SAAS0jB,GAA4B9nD,EAAY0uB,GAC7Cs1B,EAAsBD,EAAmB3sC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOC,GAAcynD,GAAe/7C,GAAtC,2BAAgDA,GAAhD,IAAmDgjB,YAAYhjB,MAWtH,SAASq8C,GAAsB/uC,GAC3BgrC,EAAsBD,EAAmB3sC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,WAAaA,GAAYtN,EAAEgjB,SAAW+4B,GAAe/7C,GAAvD,2BAAiEA,GAAjE,IAAoEsN,WAAU0V,SAAS,IAAUhjB,MAGxJ,SAASs8C,GAAsBhoD,EAAY67C,GACvCmI,EAAsBD,EAAmB3sC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOC,EAAT,2BAA2B0L,GAA3B,IAA8BmwC,cAAcnwC,MAGnG,SAASu8C,GAAwBvoD,EAAQgvB,GACrCw1B,EAAkBD,EAAe7sC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOL,GAAUioD,GAAWj8C,GAA9B,2BAAwCA,GAAxC,IAA2CgjB,YAAYhjB,MAWtG,SAASw8C,GAAkBlvC,GACvBkrC,EAAkBD,EAAe7sC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,WAAaA,GAAYtN,EAAEgjB,SAAWi5B,GAAWj8C,GAAnD,2BAA6DA,GAA7D,IAAgEsN,WAAU0V,SAAS,IAAUhjB,MAG5I,SAASy8C,GAA6BC,EAAS15B,GAC3C01B,EAAuBD,EAAoB/sC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOqoD,GAAWR,GAAgBl8C,GAApC,2BAA8CA,GAA9C,IAAiDgjB,YAAYhjB,MAWtH,SAAS28C,GAAuBrvC,GAC5BorC,EAAuBD,EAAoB/sC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,WAAaA,GAAYtN,EAAEgjB,SAAWk5B,GAAgBl8C,GAAxD,2BAAkEA,GAAlE,IAAqEsN,WAAU0V,SAAS,IAAUhjB,MAG3J,SAAS48C,GAAwB1oD,EAAQ8uB,GACrC41B,GAAkBD,GAAejtC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOH,GAAUioD,GAAWn8C,GAA9B,2BAAwCA,GAAxC,IAA2CgjB,YAAYhjB,MAWtG,SAAS68C,GAAkBvvC,GACvBsrC,GAAkBD,GAAejtC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,WAAaA,GAAYtN,EAAEgjB,SAAWm5B,GAAWn8C,GAAnD,2BAA6DA,GAA7D,IAAgEsN,WAAU0V,SAAS,IAAUhjB,MAG5I,SAAS88C,GAA6BnB,GAClC,IAAIR,EAAOhoC,GAAUqI,OAAO,KAAO,IAAMrI,GAAUqI,OAAO,KAClD69B,EAA8EsC,EAA9EtC,aAAciC,EAAgEK,EAAhEL,qBAAsBF,EAA0CO,EAA1CP,kBAAmBC,EAAuBM,EAAvBN,mBAE/D,OAAQhC,GACJ,IAAK,SACD,OAAoC,IAAhCiC,EAAqBtiD,OAEd,KAEXmiD,GAAQ,SAA2C,IAAhCG,EAAqBtiD,OAAe,IAAMsiD,EAAqBU,KAAK,MAE3F,IAAK,UACD,OAAiC,IAA7BZ,EAAkBpiD,OAEX,KAEXmiD,GAAQ,KAAoC,KAA7BC,EAAkBpiD,OAAgB,IAAMoiD,EAAkBY,KAAK,MAAQ,OAAyC,IAAhCV,EAAqBtiD,OAAe,IAAMsiD,EAAqBU,KAAK,MAEvK,IAAK,SACD,OAAiC,IAA7BZ,EAAkBpiD,QAA8C,IAA9BqiD,EAAmBriD,OAE9C,KAEXmiD,GACI,KAC8B,KAA7BC,EAAkBpiD,OAAgB,IAAMoiD,EAAkBY,KAAK,MAChE,KAC+B,KAA9BX,EAAmBriD,OAAgB,IAAMqiD,EAAmBW,KAAK,MAClE,KACiC,IAAhCV,EAAqBtiD,OAAe,IAAMsiD,EAAqBU,KAAK,MAE7E,QAGI,OADAvxC,EAAW,wBAA0B4uC,GAC9B,MAInB,SAAS0D,GAAgC3mD,EAAO4mD,GAAuB,IAAD,EAC1C5mD,EAAMC,OAAtBvB,EAD0D,EAC1DA,KAAM6F,EADoD,EACpDA,MACd,OAAQ7F,GACJ,IAAK,eACDslD,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDq5C,aAAc1+C,IAAUqF,MACnH,MACJ,IAAK,uBACD,GAAIrF,EAAMX,SAAS,KAAM,CACrB,IAAMijD,EAAU9C,GAAe9uB,MAAK,SAAArrB,GAAC,OAAIA,EAAEsvB,aAAe0tB,KAAsB1B,qBAChF,GAAuB,IAAnB2B,EAAQjkD,QAAgBikD,EAAQjjD,SAAS,KAAM,CAC/C,IAAMiyB,EAAItxB,EAAM0R,QAAO,SAAA1R,GACnB,MAAiB,MAAVA,KAEXy/C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDs7C,qBAAsBrvB,IAAMjsB,MACvH,MAEJo6C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDs7C,qBAAsB,CAAC,OAASt7C,MAC3H,MAEJo6C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDs7C,qBAAsB3gD,IAAUqF,MAC3H,MACJ,IAAK,oBACD,GAAIrF,EAAMX,SAAS,KAAM,CACrB,IAAMijD,EAAU9C,GAAe9uB,MAAK,SAAArrB,GAAC,OAAIA,EAAEsvB,aAAe0tB,KAAsB5B,kBAChF,GAAuB,IAAnB6B,EAAQjkD,QAAgBikD,EAAQjjD,SAAS,KAAM,CAC/C,IAAMiyB,EAAItxB,EAAM0R,QAAO,SAAA1R,GACnB,MAAiB,MAAVA,KAEXy/C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDo7C,kBAAmBnvB,IAAMjsB,MACpH,MAEJo6C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDo7C,kBAAmB,CAAC,OAASp7C,MACxH,MAEJo6C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDo7C,kBAAmBzgD,IAAUqF,MACxH,MACJ,IAAK,qBACD,GAAIrF,EAAMX,SAAS,KAAM,CACrB,IAAMijD,EAAU9C,GAAe9uB,MAAK,SAAArrB,GAAC,OAAIA,EAAEsvB,aAAe0tB,KAAsB3B,mBAChF,GAAuB,IAAnB4B,EAAQjkD,QAAgBikD,EAAQjjD,SAAS,KAAM,CAC/C,IAAMiyB,EAAItxB,EAAM0R,QAAO,SAAA1R,GACnB,MAAiB,MAAVA,KAEXy/C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDq7C,mBAAoBpvB,IAAMjsB,MACrH,MAEJo6C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDq7C,mBAAoB,CAAC,OAASr7C,MACzH,MAEJo6C,GAAkBD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe0tB,EAAjB,2BAA6Ch9C,GAA7C,IAAgDq7C,mBAAoB1gD,IAAUqF,OAOrI,SAASk9C,KACL,IAAMC,EAAqB,CAAE7tB,WAAYvC,GAAqB/zB,OAAQ0iD,aAAc,EAAG7uB,sBAAuB,EAAGD,iBAAkB,EAAGJ,eAAgB,MAChJmvB,EAAgB,CAClBrsB,WAAYvC,GAAqB/zB,OACjCqgD,aAAc,SACdiC,qBAAsB,CAAC78C,IAAOC,MAAM8c,OAAO,MAC3C4/B,kBAAmB,CAAC38C,IAAOC,MAAM8c,OAAO,MACxC6/B,mBAAoB,CAAC58C,IAAOC,MAAM8c,OAAO,OAG7C0+B,GAAwB,GAAD,oBAAKntB,IAAL,CAA2BowB,KAClD/C,GAAkB,GAAD,oBAAKD,IAAL,CAAqBwB,KAG1C,SAASyB,GAAoCxiD,EAAOojB,GAChD,IAAMq/B,EAAWziD,EAAQojB,EACnBs/B,EAA0BvwB,GAAqBrhB,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe10B,EAAjB,2BAA8BoF,GAA9B,IAAiCsvB,WAAY+tB,IAAar9C,EAAEsvB,aAAe+tB,EAAjB,2BAAiCr9C,GAAjC,IAAoCsvB,WAAY10B,IAAUoF,KAC7Ku9C,EAAoBpD,GAAezuC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,aAAe10B,EAAjB,2BAA8BoF,GAA9B,IAAiCsvB,WAAY+tB,IAAar9C,EAAEsvB,aAAe+tB,EAAjB,2BAAiCr9C,GAAjC,IAAoCsvB,WAAY10B,IAAUoF,KACvKk6C,GAAwBoD,GACxBlD,GAAkBmD,GAteyB,SAgfhCnJ,GAhfgC,iFAgf/C,WAA0Bh+C,GAA1B,uDAAAT,EAAA,yDACIS,EAAMsW,iBACN9B,GAAU,GAENuwC,EAAO,KAELvuB,EANV,oBAM6BG,GAAqB,UANlD,aAM6B,EAAyBH,wBANtD,QAM0E,KAChEC,EAPV,oBAOkCE,GAAqB,UAPvD,aAOkC,EAAyBF,6BAP3D,QAOoF,KAC1EgsB,EARV,oBAQ2B9rB,GAAqB,UARhD,aAQ2B,EAAyB2uB,oBARpD,QAQoE,KAE1D4B,EAA0BvwB,GAAqBrhB,KAAI,SAAA1L,GACrD,IAAM27C,EAAgBxB,GAAe9uB,MAAK,SAAAmyB,GAAC,OAAIA,EAAEluB,aAAetvB,EAAEsvB,cAC5DmuB,EAAgB7D,GAAYkD,GAA6BnB,GAAiB,KAMhF,OAJqB,IAAjB37C,EAAEsvB,aACF6rB,EAAOsC,GAGJ,2BAAKz9C,GAAZ,IAAewsB,eAAgBixB,OAG7BzoC,EAAgB2jC,GAAetsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAAU5B,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MAClEgmD,EAAoBhC,EAAmBhsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAAU5B,KAAI,SAAA1L,GAAC,MAAK,CAAE3L,GAAI2L,EAAE3L,GAAI87C,UAAWnwC,EAAEmwC,cAClGxe,EAAgB4mB,EAAelsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAAUjB,QAAO,SAAArM,GAAC,OAAIA,EAAEN,MAAMohB,MAAK,SAAA6X,GAAC,OAAI3jB,EAAchb,SAAS2+B,EAAEzkC,cAC9GwpD,EAAkB/rB,EAAcjmB,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MAC3C6gB,EAAqBujC,EAAoBpsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAAU5B,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,OAEjEkmD,KA3BrB,kCA4BgBttB,GAAqBO,mBACvBz5B,EACAq4C,EAAW/3C,GACXS,GACAy3B,GACAp4B,GACAylD,GAAYuB,EAAO,KACnBhoC,GACAymC,GAAYF,GAAUY,IACtB,EACAzB,EACAjsB,EACAC,EACAwtB,EACArlC,EACA0oC,EACAxoC,EACAooC,GA7Cd,6DA+CgBrwB,GAAqBM,kBACvBx5B,EACAe,GACAy3B,GACAp4B,GACAylD,GAAYuB,EAAO,KACnBhoC,GACAymC,GAAYF,GAAUY,IACtB,EACAzB,EACAjsB,EACAC,EACAwtB,EACArlC,EACA0oC,EACAxoC,EACAooC,GA/Dd,iCA2BU1lD,EA3BV,MAiEiBb,SAjEjB,iBAkEQ0T,EAAW7S,EAASZ,MAlE5B,yCAoEyCi2B,GAAqBI,kBAAkBt5B,EAAW6D,EAASZ,KAAK3C,IApEzG,SAoEcspD,EApEd,QAqE+B5mD,SACnB0T,EAAWkzC,EAAmB3mD,OAC1B,EACqB2mD,EAAmB3mD,KAApCy6B,EADL,EACKA,MAAO/xB,EADZ,EACYA,MACf9H,EAASZ,KAAT,2BAAqBY,EAASZ,MAA9B,IAAoCy6B,QAAO/xB,UAC3CwpB,EAAOtxB,EAASZ,MAChB+R,KA3EZ,QA+EI6B,GAAU,GA/Ed,6CAhf+C,sBAmmB/C,SAASgzC,GAAuB/Q,EAAUjyC,GAAqC,IAA9BijD,EAA6B,wDAC1E,GAAmC,IAA/B1F,EAAoBn/C,OACpB,OAAO,KAEX,IAAM8kD,EAAmB3F,EAAoBv9C,GACrCvG,EAA6Cw4C,EAA7Cx4C,GAAI+P,EAAyCyoC,EAAzCzoC,MAAO25C,EAAkClR,EAAlCkR,WAAY7J,EAAsBrH,EAAtBqH,SAAUlxB,EAAY6pB,EAAZ7pB,QACzC,OACI,kBAACvE,GAAA,EAAD,CAAM5jB,IAAKxG,EAAImrC,QAAM,EAACpkB,UAAW,EAAG3N,UAAS,UAAKzC,GAAQqsC,WAAb,OAAyB0G,EAAa,YAAc,KAC7F,kBAAC1vC,GAAA,EAAD,KACI,+BAAKha,GACJ0pD,EAAa,eAAiB,IAEnC,kBAAC1vC,GAAA,EAAD,CAAYC,QAAQ,UAAUwM,UAAU,MAAMvM,cAAY,GACrD2lC,EAASxoC,KAAI,SAAA1L,GAAC,OAAIA,EAAElL,KAAK6oB,iBAAeq+B,KAAK,OAElD,kBAAC3tC,GAAA,EAAD,CAAYC,QAAQ,QAAQC,aAAcsvC,GACrCz5C,GAEJy5C,EACG,kBAACxrC,GAAA,EAAD,CAAa/B,WAAS,EAACwF,OAAO,SAC1B,kBAACxD,GAAA,EAAD,CAAYzC,QAAM,GAAlB,oBACA,kBAACulC,GAAA,EAAD,CACI3nC,UAAU,SACVpR,aAAcyhD,EACdrI,MAAO,SAAAjT,GAAC,OAAS,IAAJA,GAAUlnC,QAAQ,IAC/B+5C,kBAAkB,OAClBC,kBAAmB,SAACjmC,EAAG4c,GAAJ,OAAUqwB,GAAsBjoD,EAAI43B,IACvDn3B,KAAK,YACL+sC,KAAM,EACN0T,IAAK,EACLC,IAAK,OAGb,KACJ,kBAAC3xB,GAAA,EAAD,CAAUpW,UAAU,WAAWuV,QAASA,EAAS5T,SAAU,kBAAMgtC,GAA4B/nD,GAAK2uB,OAK9G,SAASg7B,GAAqBt2C,EAAM0H,GAAW,IACnC/a,EAAsBqT,EAAtBrT,GAAIS,EAAkB4S,EAAlB5S,KAAMkuB,EAAYtb,EAAZsb,QAClB,OACI,kBAACvE,GAAA,EAAD,CAAM5jB,IAAKxG,EAAImrC,QAAM,EAACpkB,UAAW,EAAG3N,UAAWzC,GAAQqsC,WACnD,kBAAChpC,GAAA,EAAD,CAAYZ,UAAU,eAAe3Y,GACrC,kBAAC+uB,GAAA,EAAD,CAAUb,QAASA,EAAS5T,SAAU,SAACC,EAAG4c,GAAJ,OAAU7c,EAAS/a,EAAI43B,IAAIxe,UAAU,cAiIvF,SAASwwC,KAML,IALA,IAAMC,EAAe,CACjB,kBAACv7C,GAAA,EAAD,CAAU9H,IAAK,gBAAiBF,MAAM,KAAtC,cAIKK,EAAI,EAAGA,EAAI,GAAIA,IACpBkjD,EAAajkD,KACT,kBAAC0I,GAAA,EAAD,CAAU9H,IAAK,QAAUG,EAAGL,MAAOK,EAAEoyC,YAChCpyC,EAAEoyC,aAIf,OAAO8Q,EAieX,OApkCAj1C,IAAMyH,WAAU,WAAM,4CAClB,sBAAA/a,EAAA,sDACIqjD,GAAkB,IAClBE,GAAc,IACdE,GAAe,IACf/iB,GAAc,IACd6jB,GAAwB,IACxBE,GAAkB,IAClBlC,EAAQ,GACJliD,GACAikD,IAAkB,GAT1B,4CADkB,sBAalBvvC,GAAW,GAbQ,WAAD,+BAclBvV,GAAO0B,MAAK,kBAAM6T,GAAW,QAC9B,CAAC1U,IAGJiT,IAAMyH,WAAU,WACS,IAAD,EAAhBspC,KACAuB,KACAtB,IAAkB,GAClBF,GAAa,UAAC3N,EAAWj4C,kBAAZ,QAA0B4jD,EAAW,GAAG1jD,OAE1D,CAAC2lD,GAAgBuB,KAGpBtyC,IAAMyH,WAAU,WACR1a,GACAwkD,GAAiB3Y,EAAMwW,KAE5B,CAACxW,EAAM7rC,EAAMqiD,EAAoBmC,KAsiChC,oCACI,kBAAC7pC,GAAA,EAAD,CAAQ3a,KAAMA,EAAM4a,WAAY9F,GAAS5C,SAAmB,IAAT25B,GAAoBA,EAAO,EAAd,KAAyB,KAAMvxB,WAAS,GACpG,kBAAC0B,GAAA,EAAD,4BACC7J,EACG,yBAAKsF,UAAWzC,GAAQ7C,SACpB,kBAAC0I,GAAA,EAAD,CAAkBpO,MAAM,aAlrB5C,WACI,OAAQo/B,GACJ,KAAK,EACD,OAoPZ,WAEI,IAAMsc,EAAqBxF,GAAetsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAAUtU,OAC5DolD,EAAuBzF,GAAetsC,QAAO,SAAArM,GAAC,OAAKA,EAAEsN,YAAUtU,OAC/Dgc,EAAgB2jC,GAAetsC,OAAO8vC,IAAY9vC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAChE+wC,EAAkB1F,GAAetsC,OAAO8vC,IAAY9vC,QAAO,SAAArM,GAAC,OAAKA,EAAEsN,YAEzE,OACI,oCACI,kBAAC2E,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,qCAEJ,kBAACiK,GAAA,EAAD,CAAYC,QAAQ,SAApB,4EAEJ,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,SAASM,SAAUnD,GAAatR,MAAOy7B,GAAYthC,KAAK,aAAaghB,OAAO,QAAQxF,WAAS,IAC/H,kBAAC4lC,GAAD,CACIC,UAAU,YACVC,aAAY,kBAAaiI,EAAgBrlD,OAA7B,mBAA8ColD,GAC1D/H,aAAcgI,EAAgB3yC,KAAI,SAAA1L,GAAC,OAAIg+C,GAAqBh+C,EAAG48C,OAC/DtG,WAAW,yBACXC,cAAa,kBAAavhC,EAAchc,OAA3B,mBAA4CmlD,GACzD3H,cAAexhC,EAActJ,KAAI,SAAA1L,GAAC,OAAIg+C,GAAqBh+C,EAAG48C,OAC9DnG,gBAAiB,SAACpnC,EAAGmkB,GAAJ,OA3fNxQ,EA2fgDwQ,OA1fnFolB,GAAkBD,GAAejtC,KAAI,SAAA1L,GAAC,OAAMA,EAAEsN,UAAY6uC,GAAWn8C,GAA1B,2BAAoCA,GAApC,IAAuCgjB,YAAYhjB,MADlG,IAAuCgjB,GA4fX0zB,iBAAkB,SAACrnC,EAAGmkB,GAAJ,OAxfTxQ,EAwfiDwQ,OAvflFolB,GAAkBD,GAAejtC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,UAAY6uC,GAAWn8C,GAAzB,2BAAmCA,GAAnC,IAAsCgjB,YAAYhjB,MADjG,IAAqCgjB,GAyfT2zB,WAAY,kBAAMkG,IAAkB,IACpCjG,YAAa,kBAAMiG,IAAkB,IACrChG,kBAAkB,0EAKlC,kBAACnkC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,UAGA,kBAACoH,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0qC,EAAQ,KAA/C,UA3RGoG,GACX,KAAK,EACD,OAiSZ,WACI,IAAMC,EAAgBlE,GAAkBrhD,OAClCwlD,EAAsBnG,EAAmBhsC,QAC3C,SAAArM,GAAC,OACIA,EAAEsN,WACiB,IAAnBtN,EAAEN,MAAM1G,QACLgH,EAAEN,MAAMohB,MAAK,SAAA9gB,GAAC,OACV24C,GACKtsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YACd5B,KAAI,SAAAitB,GAAC,OAAIA,EAAEtkC,MACX2F,SAASgG,EAAE3L,WAG1BoqD,EAAgBpE,GACjBzhB,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUs4C,SAAS9+C,EAAEtB,IAAMogD,SAASt4C,EAAE9H,OAC3CukC,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUxG,EAAEooD,YAAc5hD,EAAE4hD,cACjC1xC,OAAO0vC,IACN2C,EAAkBF,EACnB5lB,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUs4C,SAAS9+C,EAAEtB,IAAMogD,SAASt4C,EAAE9H,OAC3CukC,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUxG,EAAEooD,YAAc5hD,EAAE4hD,cACjC1xC,OAAO0vC,IAOZ,OACI,0BAAMhqC,SAPO,SAAA/R,GACbA,EAAE0M,iBACoB,IAAlB6xC,GACArG,EAAQ,KAKR,kBAACjmC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,yCAEJ,kBAACiK,GAAA,EAAD,CAAYC,QAAQ,SAApB,uQAKJ,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,iCAAiCM,SAAUnD,GAAatR,MAAOo+C,GAAgBjkD,KAAK,iBAAiBwb,WAAS,IAChJ,kBAAC4lC,GAAD,CACIC,UAAU,gBACVC,aAAY,kBAAasI,EAAgB1lD,OAA7B,mBAA8CwlD,EAAoBxlD,QAC9Eq9C,aAAcqI,EAAgBhzC,KAAI,SAAC1L,EAAGhF,GAAJ,OAAU4iD,GAAuB59C,EAAGhF,MACtEs7C,WAAW,yBACXC,cAAa,kBAAakI,EAAczlD,OAA3B,mBAA4CulD,GACzD/H,cAAeiI,EAAc/yC,KAAI,SAAC1L,EAAGhF,GAAJ,OAAU4iD,GAAuB59C,EAAGhF,GAAG,MACxEy7C,gBAAiB,SAACpnC,EAAGmkB,GAAJ,OArnBFxQ,EAqnBgDwQ,OApnBvF8kB,EAAsBD,EAAmB3sC,KAAI,SAAA1L,GAAC,OAAMA,EAAEsN,UAAYyuC,GAAe/7C,GAA9B,2BAAwCA,GAAxC,IAA2CgjB,YAAYhjB,MAD9G,IAA2CgjB,GAsnBf0zB,iBAAkB,SAACrnC,EAAGmkB,GAAJ,OAlnBLxQ,EAknBiDwQ,OAjnBtF8kB,EAAsBD,EAAmB3sC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,UAAYyuC,GAAe/7C,GAA7B,2BAAuCA,GAAvC,IAA0CgjB,YAAYhjB,MAD7G,IAAyCgjB,GAmnBb2zB,WAAY,kBAAM0F,IAAsB,IACxCzF,YAAa,kBAAMyF,IAAsB,IACzCxF,kBAAkB,6EAKlC,kBAACnkC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0qC,EAAQ,KAA/C,QAGA,kBAAC/nC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAA4B,IAAlB+tC,EAAqB9rC,KAAK,UAA5D,UA/VGksC,GACX,KAAK,EACD,OAqWZ,WAEI,IAqBIC,EArBEC,EAAgBtG,EAAelsC,QAAO,SAAArM,GAAC,OACzCA,EAAEN,MAAMohB,MAAK,SAAA9gB,GAAC,OACV24C,GACKtsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YACd5B,KAAI,SAAAitB,GAAC,OAAIA,EAAEtkC,MACX2F,SAASgG,EAAE9L,cAGlB4qD,EAAqBD,EAAcxyC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAAUtU,OAC3D+lD,EAAuBF,EAAcxyC,QAAO,SAAArM,GAAC,OAAKA,EAAEsN,YAAUtU,OAC9D24B,EAAgBktB,EAAcxyC,OAAO4vC,IAAY5vC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAC/D0xC,EAAkBH,EAAcxyC,OAAO4vC,IAAY5vC,QAAO,SAAArM,GAAC,OAAKA,EAAEsN,YAGlE2xC,EAA0BxG,EAAoBpsC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAAUtU,OACtEkmD,EAA4BzG,EAAoBpsC,QAAO,SAAArM,GAAC,OAAKA,EAAEsN,YAAUtU,OACzEkc,EAAqBujC,EAAoBpsC,OAAO6vC,IAAiB7vC,QAAO,SAAArM,GAAC,OAAIA,EAAEsN,YAC/E6xC,EAAuB1G,EAAoBpsC,OAAO6vC,IAAiB7vC,QAAO,SAAArM,GAAC,OAAKA,EAAEsN,YAGpF8xC,EAAe,6CAEfP,EAAc7lD,OAAS,IAEnBomD,EAD8B,IAA9BlqC,EAAmBlc,OACJ,+EAAiFkc,EAAmBxJ,KAAI,SAAA1L,GAAC,OAAIA,EAAElL,QAAMknD,KAAK,MAAQ,IAElI,qEAEU,IAAzBrqB,EAAc34B,SACd4lD,EAAW,kCAAoCjtB,EAAcjmB,KAAI,SAAA1L,GAAC,OAAIA,EAAEZ,UAAY,IAAMY,EAAEX,YAAU28C,KAAK,MAAQ,2DAI3H,OACI,oCACI,kBAAC/pC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,qDAEJ,kBAACiK,GAAA,EAAD,CAAYC,QAAQ,SAApB,qRAKJ,kBAACH,GAAA,EAAD,CAAMzG,MAAI,EAAC23C,GAAI,EAAGrlB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IACxC,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,qCAEJ,kBAACuL,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,SAASM,SAAUnD,GAAatR,MAAOs+C,GAAYnkD,KAAK,aAAaghB,OAAO,QAAQxF,WAAS,IAC/H,kBAAC4lC,GAAD,CACIC,UAAU,YACVC,aAAY,kBAAa4I,EAAgBhmD,OAA7B,mBAA8C+lD,GAC1D1I,aAAc2I,EAAgBtzC,KAAI,SAAA1L,GAAC,OAAIg+C,GAAqB,2BAAKh+C,GAAN,IAASlL,KAAMkL,EAAEZ,UAAY,IAAMY,EAAEX,WAAYk9C,OAC5GjG,WAAW,yBACXC,cAAa,kBAAa5kB,EAAc34B,OAA3B,mBAA4C8lD,GACzDtI,cAAe7kB,EAAcjmB,KAAI,SAAA1L,GAAC,OAAIg+C,GAAqB,2BAAKh+C,GAAN,IAASlL,KAAMkL,EAAEZ,UAAY,IAAMY,EAAEX,WAAYk9C,OAC3G9F,gBAAiB,SAACpnC,EAAGmkB,GAAJ,OAlrBNxQ,EAkrBgDwQ,OAjrBnFglB,EAAkBD,EAAe7sC,KAAI,SAAA1L,GAAC,OAAMA,EAAEsN,UAAY2uC,GAAWj8C,GAA1B,2BAAoCA,GAApC,IAAuCgjB,YAAYhjB,MADlG,IAAuCgjB,GAmrBX0zB,iBAAkB,SAACrnC,EAAGmkB,GAAJ,OA/qBTxQ,EA+qBiDwQ,OA9qBlFglB,EAAkBD,EAAe7sC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,UAAY2uC,GAAWj8C,GAAzB,2BAAmCA,GAAnC,IAAsCgjB,YAAYhjB,MADjG,IAAqCgjB,GAgrBT2zB,WAAY,kBAAM6F,IAAkB,IACpC5F,YAAa,kBAAM4F,IAAkB,IACrC3F,kBAAkB,qDAG1B,kBAAC1oC,GAAA,EAAD,CAAMzG,MAAI,EAAC23C,GAAI,EAAGrlB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IACxC,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,2CAEJ,kBAACuL,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,SAASM,SAAUnD,GAAatR,MAAOw+C,GAAarkD,KAAK,cAAcghB,OAAO,QAAQxF,WAAS,IACjI,kBAAC4lC,GAAD,CACIC,UAAU,aACVC,aAAY,kBAAa+I,EAAqBnmD,OAAlC,mBAAmDkmD,GAC/D7I,aAAc8I,EAAqBzzC,KAAI,SAAA1L,GAAC,OAAIg+C,GAAqBh+C,EAAGy8C,OACpEnG,WAAW,yBACXC,cAAa,kBAAarhC,EAAmBlc,OAAhC,mBAAiDimD,GAC9DzI,cAAethC,EAAmBxJ,KAAI,SAAA1L,GAAC,OAAIg+C,GAAqBh+C,EAAGy8C,OACnEhG,gBAAiB,SAACpnC,EAAGmkB,GAAJ,OArrBDxQ,EAqrBgDwQ,OAprBxFklB,EAAuBD,EAAoB/sC,KAAI,SAAA1L,GAAC,OAAMA,EAAEsN,UAAY4uC,GAAgBl8C,GAA/B,2BAAyCA,GAAzC,IAA4CgjB,YAAYhjB,MADjH,IAA4CgjB,GAsrBhB0zB,iBAAkB,SAACrnC,EAAGmkB,GAAJ,OAlrBJxQ,EAkrBiDwQ,OAjrBvFklB,EAAuBD,EAAoB/sC,KAAI,SAAA1L,GAAC,OAAKA,EAAEsN,UAAY4uC,GAAgBl8C,GAA9B,2BAAwCA,GAAxC,IAA2CgjB,YAAYhjB,MADhH,IAA0CgjB,GAmrBd2zB,WAAY,kBAAMgG,IAAuB,IACzC/F,YAAa,kBAAM+F,IAAuB,IAC1C9F,kBAAkB,yEAG1B,kBAAC1oC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,KACI,2BAAI+wC,KAGXR,EACG,kBAACzwC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,KACI,2BAAIuwC,KAGZ,OAGZ,kBAAClsC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0qC,EAAQ,KAA/C,QAGA,kBAAC/nC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0qC,EAAQ,KAA/C,UA7cGoH,GACX,KAAK,EACD,OAmdZ,WACI,IAAMC,EAAUxyB,GAAqBjM,MAAK,SAAAqO,GAAK,OAAS,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOusB,cAAerB,GAAkBrhD,SAAe,OAALm2B,QAAK,IAALA,OAAA,EAAAA,EAAOusB,cAAe,IAAU,OAALvsB,QAAK,IAALA,OAAA,EAAAA,EAAOvC,kBAAmB,MAAY,OAALuC,QAAK,IAALA,OAAA,EAAAA,EAAOvC,kBAAmB,KAC3L,OACI,oCACI,kBAAC3a,GAAA,EAAD,KACI,kBAAC5D,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,sDAEJ,kBAACiK,GAAA,EAAD,CAAYC,QAAQ,QAAQZ,MAAO,CAAE8J,aAAc,KAAnD,mCAGA,kBAACrJ,GAAA,EAAD,CAAMiD,WAAS,EAAC1D,MAAO,CAAE8J,aAAc,GAAI9U,gBAAiB,SACxD,kBAACyL,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GAAIV,MAAO,CAAE8J,aAAc,KACtC,kBAACnJ,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,wCAEJ,kBAACuf,GAAA,EAAD,CACIlW,UAAWzC,GAAQssC,kBACnB1zB,QAAS,kBAACC,GAAA,EAAD,CAAUphB,MAAM,UAAUugB,QAAS42B,GAAWxqC,SAAU,SAACC,EAAG4c,GAAJ,OAAU4tB,GAAa5tB,MACxFnd,MAAM,mFACN0wC,eAAe,UAEnB,kBAACnxC,GAAA,EAAD,CAAYC,QAAQ,UAAUwM,UAAU,OAAxC,6IAIJ,kBAAC3M,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACf,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAAC1J,MAAI,EAAC0G,GAAI,IACrB,kBAACD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAIwrC,GAAY,EAAI,GAC3B,kBAACvrC,GAAA,EAAD,CAAYZ,UAAWzC,GAAQ5G,OAA/B,kBAEJ,kBAAC+J,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAIwrC,GAAY,EAAI,GAC3B,kBAACvrC,GAAA,EAAD,CAAYZ,UAAWzC,GAAQ5G,OAA/B,yBAEJ,kBAAC+J,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAIwrC,GAAY,EAAI,GAC3B,kBAACvrC,GAAA,EAAD,CAAYZ,UAAWzC,GAAQ5G,OAA/B,YAEHw1C,GACG,kBAACzrC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GACX,kBAACC,GAAA,EAAD,CAAYZ,UAAWzC,GAAQ5G,OAA/B,cAEJ,OAGZ,kBAAC+J,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,GAAQ0sC,gBAC1C3qB,GAAqB6L,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUxG,EAAE25B,WAAanzB,EAAEmzB,cAAY5jB,KAAI,SAAA1L,GAAC,OAuB3F,SAAwCy/C,EAAiB7F,GAAY,IAAD,EAC1D8F,EAA6C,KAAjB,OAAfD,QAAe,IAAfA,OAAA,EAAAA,EAAiBnwB,YAC9BqwB,GAAwC,OAAfF,QAAe,IAAfA,OAAA,EAAAA,EAAiB/D,cAAerB,GAAkBrhD,QAA4C,KAAnB,OAAfymD,QAAe,IAAfA,OAAA,EAAAA,EAAiB/D,cACtGkE,GAAuC,OAAfH,QAAe,IAAfA,OAAA,EAAAA,EAAiB7yB,kBAAmB,MAAsB,OAAf6yB,QAAe,IAAfA,OAAA,EAAAA,EAAiB7yB,kBAAmB,EAE7G,OACI,kBAACze,GAAA,EAAD,CAAMiD,WAAS,EAAC1J,MAAI,EAAC0G,GAAI,GAAIvT,IAAK4kD,EAAgBnwB,YAC9C,kBAACnhB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GACTsxC,EAIE,KAHA,kBAAC7tC,GAAA,EAAD,CAAYrE,QAAS,kBAlpBzC,SAAqC5S,GACjC,IAAM0iD,EAA0BvwB,GAAqB1gB,QAAO,SAAArM,GAAC,OAAIA,EAAEsvB,aAAe10B,KAAO8Q,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,WAAa10B,EAAf,2BAA4BoF,GAA5B,IAA+BsvB,WAAYtvB,EAAEsvB,WAAa,IAAMtvB,KAC7Ju9C,EAAoBpD,GAAe9tC,QAAO,SAAArM,GAAC,OAAIA,EAAEsvB,aAAe10B,KAAO8Q,KAAI,SAAA1L,GAAC,OAAKA,EAAEsvB,WAAa10B,EAAf,2BAA4BoF,GAA5B,IAA+BsvB,WAAYtvB,EAAEsvB,WAAa,IAAMtvB,KACvJk6C,GAAwBoD,GACxBlD,GAAkBmD,GA8oByBsC,CAA2B,OAACJ,QAAD,IAACA,OAAD,EAACA,EAAiBnwB,cACpE,kBAAC,KAAD,OAGR,yBAAK7hB,UAAWzC,GAAQysC,aAClBiI,EAAwI,KAA3H,kBAAC,KAAD,CAAiBlyC,QAAS,kBAAM4vC,GAAmC,OAACqC,QAAD,IAACA,OAAD,EAACA,EAAiBnwB,YAAa,MAChHvC,GAAqB/zB,OAAS,KAA9B,OAAoCymD,QAApC,IAAoCA,OAApC,EAAoCA,EAAiBnwB,YAClD,kBAAC,KAAD,CAAmB9hB,QAAS,kBAAM4vC,GAAmC,OAACqC,QAAD,IAACA,OAAD,EAACA,EAAiBnwB,WAAY,MACnG,OAGZ,kBAACnhB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,oCAAUq7C,EAAgBnwB,cAGlC,kBAACnhB,GAAA,EAAD,CAAMiD,WAAS,EAAC1J,MAAI,EAAC0G,GAAI,GAAIiD,QAAS,GAClC,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAIwrC,EAAY,EAAI,GAC3B,kBAACjqC,GAAA,EAAD,CACIrB,QAAQ,WACRc,SAAU,SAAApP,GACN67C,GAAoC77C,EAAD,OAAIy/C,QAAJ,IAAIA,OAAJ,EAAIA,EAAiBnwB,YACpDowB,GACAzzC,GAAYjM,IAGpBrF,MAAK,OAAE8kD,QAAF,IAAEA,OAAF,EAAEA,EAAiB/D,aACxB5mD,KAAK,eACL2d,KAAK,SACLP,UAAQ,EACR5B,WAAS,EACTkN,KAAK,QACLrmB,MAAOwoD,KAGf,kBAACxxC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAIwrC,EAAY,EAAI,GAC3B,kBAACjqC,GAAA,EAAD,CACIrB,QAAQ,WACRc,SAAU,SAAApP,GAAC,OAAI67C,GAAoC77C,EAAD,OAAIy/C,QAAJ,IAAIA,OAAJ,EAAIA,EAAiBnwB,aACvE30B,MAAK,OAAE8kD,QAAF,IAAEA,OAAF,EAAEA,EAAiB5yB,sBACxB/3B,KAAK,wBACL2d,KAAK,SACLP,UAAQ,EACR5B,WAAS,EACTkN,KAAK,WAGb,kBAACrP,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAIwrC,EAAY,EAAI,GAC3B,kBAACjqC,GAAA,EAAD,CACIrB,QAAQ,WACRc,SAAU,SAAApP,GAAC,OAAI67C,GAAoC77C,EAAD,OAAIy/C,QAAJ,IAAIA,OAAJ,EAAIA,EAAiBnwB,aACvE30B,MAAK,OAAE8kD,QAAF,IAAEA,OAAF,EAAEA,EAAiB7yB,iBACxB93B,KAAK,mBACL2d,KAAK,SACLP,UAAQ,EACR5B,WAAS,EACTkN,KAAK,QACLrmB,MAAOyoD,KAGdhG,EACG,kBAACzrC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,GACX,6BACI,0BAAMX,UAAU,gBAAgB,YAChC,kBAACse,GAAA,EAAD,CACIj3B,KAAK,eACLsa,SAAU,SAAApP,GAAC,OAAI+8C,GAAgC/8C,EAAD,OAAIy/C,QAAJ,IAAIA,OAAJ,EAAIA,EAAiBnwB,aACnE30B,MAAK,OAAEw/C,SAAF,IAAEA,IAAF,UAAEA,GAAgB9uB,MAAK,SAAArrB,GAAC,OAAIA,EAAEsvB,cAAF,OAAiBmwB,QAAjB,IAAiBA,OAAjB,EAAiBA,EAAiBnwB,sBAA9D,aAAE,EAAyE+pB,aAChF5rC,UAAU,iBACVqyC,kBAAgB,GAEhB,kBAACn9C,GAAA,EAAD,CAAUhI,MAAM,UAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,WAAhB,WACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,UAAhB,WAEJ,0BAAM8S,UAAU,gBAAgB,UAljB5D,SAA0CuvC,GACtC,IAAMrB,EAAgBxB,GAAe9uB,MAAK,SAAArrB,GAAC,OAAIA,EAAEsvB,aAAe0tB,KAEhE,cAAQrB,QAAR,IAAQA,OAAR,EAAQA,EAAetC,cACnB,IAAK,SACD,OACI,kBAACttB,GAAA,EAAD,CACIj3B,KAAK,uBACLsa,SAAU,SAAApP,GAAC,OAAI+8C,GAAgC/8C,EAAGg9C,IAClDriD,MAAOghD,EAAcL,qBACrB/rC,YAAY,kBACZP,UAAQ,EACRnU,IAAI,6BACJilD,kBAAgB,EAChBryC,UAAU,kBAEV,kBAAC9K,GAAA,EAAD,CAAUhI,MAAM,KAAhB,kBACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,WACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,aACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,WAGZ,IAAK,UACD,MAAO,CACH,kBAACoxB,GAAA,EAAD,CACIj3B,KAAK,uBACLsa,SAAU,SAAApP,GAAC,OAAI+8C,GAAgC/8C,EAAGg9C,IAClDriD,MAAOghD,EAAcL,qBACrB/rC,YAAY,kBACZP,UAAQ,EACRnU,IAAI,6BACJilD,kBAAgB,EAChBryC,UAAU,kBAEV,kBAAC9K,GAAA,EAAD,CAAUhI,MAAM,KAAhB,kBACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,WACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,aACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,WAEJ,kBAACoxB,GAAA,EAAD,CACIj3B,KAAK,oBACLsa,SAAU,SAAApP,GAAC,OAAI+8C,GAAgC/8C,EAAGg9C,IAClDriD,MAAOghD,EAAcP,kBACrB7rC,YAAY,mBACZP,UAAQ,EACRnU,IAAI,0BACJilD,kBAAgB,EAChBryC,UAAU,kBAETwwC,OAGb,IAAK,SACD,MAAO,CACH,kBAAClyB,GAAA,EAAD,CACIj3B,KAAK,uBACLsa,SAAU,SAAApP,GAAC,OAAI+8C,GAAgC/8C,EAAGg9C,IAClDriD,MAAOghD,EAAcL,qBACrB/rC,YAAY,kBACZP,UAAQ,EACRnU,IAAI,6BACJilD,kBAAgB,EAChBryC,UAAU,kBAEV,kBAAC9K,GAAA,EAAD,CAAUhI,MAAM,KAAhB,kBACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,WACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,aACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,WAEJ,kBAACoxB,GAAA,EAAD,CACIj3B,KAAK,oBACLsa,SAAU,SAAApP,GAAC,OAAI+8C,GAAgC/8C,EAAGg9C,IAClDriD,MAAOghD,EAAcP,kBACrB7rC,YAAY,mBACZP,UAAQ,EACRnU,IAAI,0BACJilD,kBAAgB,EAChBryC,UAAU,kBAETwwC,MAEL,kBAAClyB,GAAA,EAAD,CACIj3B,KAAK,qBACLsa,SAAU,SAAApP,GAAC,OAAI+8C,GAAgC/8C,EAAGg9C,IAClDriD,MAAOghD,EAAcN,mBACrB9rC,YAAY,SACZP,UAAQ,EACRnU,IAAI,2BACJilD,kBAAgB,EAChBryC,UAAU,kBAEV,kBAAC9K,GAAA,EAAD,CAAUhI,MAAM,KAAhB,eACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,WACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,SACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,SACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,OACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,QACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,QACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,UACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,KAAhB,aACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,MAAhB,WACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,MAAhB,YACA,kBAACgI,GAAA,EAAD,CAAUhI,MAAM,MAAhB,cAGZ,IAAK,QACL,QACI,OAAO,MA2bUolD,CAAgC,OAACN,QAAD,IAACA,OAAD,EAACA,EAAiBnwB,cAG3D,OA/G2E0wB,CAA+BhgD,EAAG45C,QAEjH,6BACI,kBAACvrC,GAAA,EAAD,CAAYC,QAAQ,UAAUZ,MAAO,CAAEjL,MAAO,QACzCu1C,IAGT,kBAACnmC,GAAA,EAAD,CAAYrE,QAAS0vC,IACjB,kBAAC,KAAD,QAGR,kBAACxqC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0qC,EAAQ,KAA/C,QAGA,kBAAC/nC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAAUvX,GAAmB4/C,KAAmB0G,EAAS/xC,QAAS,kBAAM0qC,EAAQ,KAAxG,UA/gBG+H,GACX,KAAK,EACD,OAqnBJ,0BAAMluC,SAAUqiC,IACZ,kBAACniC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,+CAEJ,kBAACuL,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,OAAOM,SAAUnD,GAAatR,MAAO7F,GAAMA,KAAK,OAAOghB,OAAO,QAAQxF,WAAS,EAAC4B,UAAQ,KAE9H,kBAAC/D,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,oCAEJ,kBAAC2nB,GAAA,EAAD,CAAQj3B,KAAK,YAAYsa,SAAUnD,GAAatR,MAAO4xB,GAAW1xB,IAAI,YAAYilD,kBAAgB,EAACryC,UAAU,kBACzG,kBAAC9K,GAAA,EAAD,CAAUhI,MAAM,KAAKo8C,GAAc,IACnC,kBAACp0C,GAAA,EAAD,CAAUhI,MAAM,KAAKo8C,GAAc,IACnC,kBAACp0C,GAAA,EAAD,CAAUhI,MAAM,KAAKo8C,GAAc,IACnC,kBAACp0C,GAAA,EAAD,CAAUhI,MAAM,KAAKo8C,GAAc,IACnC,kBAACp0C,GAAA,EAAD,CAAUhI,MAAM,KAAKo8C,GAAc,MAG3C,kBAAC5oC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKb,UAAWzC,GAAQ5G,OACxC,wCAEJ,kBAAC2nB,GAAA,EAAD,CAAQj3B,KAAK,WAAWsa,SAAUnD,GAAatR,MAAOxG,GAAY0G,IAAI,WAAWilD,kBAAgB,EAACryC,UAAU,kBA3cpI,WAEI,IADA,IAAMyyC,EAAe,GACZllD,EAAI,EAAGA,EAAI+8C,EAAW/+C,OAAQgC,IAAK,CACxC,IAAMk5C,EAAW6D,EAAW/8C,GAC5BklD,EAAajmD,KACT,kBAAC0I,GAAA,EAAD,CAAU9H,IAAKq5C,EAAS7/C,GAAIsG,MAAOu5C,EAAS7/C,IACvC6/C,EAASp/C,OAItB,OAAOorD,EAkckBC,KA7brB,yBAAK1yC,UAAWzC,GAAQusC,gBACpB,6BACsB,UAAjB8B,GACG,6BACI,sCACA,kBAAC+G,GAAA,EAAD,CAAYtrD,KAAK,YAAY6F,MAAO4+C,GAAWnqC,SAAUnD,GAAao0C,KAAG,GACrE,kBAAC18B,GAAA,EAAD,CAAkBhpB,MAAM,QAAQipB,QAAS,kBAAC08B,GAAA,EAAD,CAAO79C,MAAM,YAAcqM,MAAM,QAAQ0wC,eAAe,QACjG,kBAAC77B,GAAA,EAAD,CAAkBhpB,MAAM,KAAKipB,QAAS,kBAAC08B,GAAA,EAAD,CAAO79C,MAAM,YAAcqM,MAAM,KAAK0wC,eAAe,UAGnG,MAER,kBAAC,KAAD,CAAyBlQ,MAAOC,MAC5B,6BACI,yBAAK9hC,UAAU,qBAAf,cACA,kBAAC8yC,GAAA,EAAD,CAAgB5lD,MAAOwY,GAAW/D,SAAUqqC,GAAc+G,OAAO,OAAO/yC,UAAU,iBAAiBgzC,WAAY,CAAEX,kBAAkB,MAEvI,6BACI,yBAAKryC,UAAU,qBAAf,YACA,kBAAC8yC,GAAA,EAAD,CAAgB5lD,MAAO++C,GAAStqC,SAAUuqC,GAAY6G,OAAO,OAAO/yC,UAAU,iBAAiBgzC,WAAY,CAAEX,kBAAkB,UAgbvI,kBAACptC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0qC,EAAQ,KAA/C,QAGA,kBAAC/nC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAAU7F,EAAQ8H,KAAK,UAA/C,qBAxpBR,QACI,OAAO,MAwqBHiuC,IAnsBR,kBAAC/vC,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBuT,GAAUzB,QAAS,kBAAM0B,EAAW,QACjE,kBAACuH,GAAA,EAAD,cACA,kBAACC,GAAA,EAAD,KACI,kBAAC,GAAD,CAAOhM,OAAO,wBAAwBJ,KAAM2E,KAEhD,kBAACkI,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM/C,EAAW,QAAlD,S,yBChuBdnE,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCm6C,eAAgB,CACZj4C,SAAU,WACVtB,QAAS,kBACT1E,gBAAiBL,GACjB,gBAAgB,cACZ2E,SAAU,GACTR,EAAMK,YAAYC,KAAK,MAAQ,CAC5BouB,YAAa,KAGrB,aAAc,CACVxsB,SAAU,WACVE,MAAO,EACPD,IAAK,GAET,gBAAgB,cACZP,QAAS,QACT,kBAAmB,CACf0N,OAAQ,IAEXtP,EAAMK,YAAYC,KAAK,MAAQ,CAC5BsB,QAAS,SAGjB,YAAa,CACTA,QAAS,OACT6sB,SAAU,QAEd,WAAY,CACRxtB,UAAW,EACXytB,YAAa,KAGrBtP,QAAS,CACL,sBAAuB,CACnBxd,QAAS,OACT1B,cAAe,UAEnB,oBAAqB,CACjBmf,cAAe,OACfhe,SAAU,KAEd,qBAAsB,CAClBI,eAAgB,aAChB6d,WAAY,UAKjB,SAAS86B,GAAyBh7C,GAAQ,IACrCxB,EAAwFwB,EAAxFxB,MAAO2zC,EAAiFnyC,EAAjFmyC,WAAY8I,EAAqEj7C,EAArEi7C,eAAgBC,EAAqDl7C,EAArDk7C,UAAWC,EAA0Cn7C,EAA1Cm7C,UAAWziC,EAA+B1Y,EAA/B0Y,SAAU68B,EAAqBv1C,EAArBu1C,KAAM9+B,EAAezW,EAAfyW,MAAOoQ,EAAQ7mB,EAAR6mB,IAD5C,EAEZxjB,IAAMC,SAAS,MAFH,oBAErCmU,EAFqC,KAE3BiJ,EAF2B,KAGtCtb,EAAU1E,GAAUV,GAMpB0hB,EAAc,WAChBhB,EAAY,OAuChB,IAAMtwB,EAAOunB,QAAQF,GACf2jC,EAAYhrD,EAAO,2BAAwB2C,EAEjD,OACI,oCACI,kBAAC8lB,GAAA,EAAD,CAAMnQ,QAAQ,YACV,kBAACqQ,GAAA,EAAD,CAAalR,UAAWzC,EAAQ21C,gBAC5B,yBAAKlzC,UAAU,cACX,kBAACY,GAAA,EAAD,CAAYC,QAAQ,MAAMlK,GAC1B,kBAACiK,GAAA,EAAD,CAAYC,QAAQ,QAAQC,cAAY,GAAxC,QACUsyC,EADV,YACmCA,EAAiB,EAAI,IAAM,GAD9D,oBAIJ,yBAAKpzC,UAAU,cAjD/B,WACI,IAAMwzC,EAAO,GAMb,OALAlJ,EAAWj+C,SAAQ,SAAAkG,GACVihD,EAAKjnD,SAASgG,IACfihD,EAAKhnD,KAAK+F,MAGXihD,EA2CUC,GAAsBx1C,KAAI,SAAA1L,GAAC,OACxB,kBAACiQ,GAAA,EAAD,CAAMpV,IAAKmF,EAAGsO,QAAQ,WAAWQ,MAAO9O,QAGhD,yBAAKyN,UAAU,UACX,yBAAKA,UAAU,SACX,kBAACY,GAAA,EAAD,KACI,6CAEJ,kBAACA,GAAA,EAAD,KAAayyC,IAEjB,yBAAKrzC,UAAU,SACX,kBAACY,GAAA,EAAD,KACI,8CAEJ,kBAACA,GAAA,EAAD,KAAa0yC,IAEjB,yBAAKtzC,UAAU,SACX,kBAACY,GAAA,EAAD,KACI,wCAEJ,kBAACA,GAAA,EAAD,KA7DxB,WACI,GAAIpX,GAAkBkkD,GAClB,MAAO,QAEX,IAAMhoC,EAAY1U,IAAOC,IAAI2d,GACvBq9B,EAAUj7C,IAAOC,IAAI+tB,GACrB00B,EAAQ1iD,MAASC,MACjB0iD,EAAcD,EAAMhf,SAASuX,GAAYyH,EAAME,QAAQluC,GAAaguC,EAAQhuC,EAAa,KAC/F,GAAIlc,GAAkBmqD,GAClB,MAAO,QAEX,IAAMnyC,EAAU,CACZqyC,YAAaF,EAAYG,SACzB7H,QAASA,EAAQ6H,SACjBC,UAAU,GAEd,IACI,IACMC,EADWC,KAAOC,gBAAgBxG,EAAMlsC,GACxBwyC,OAEtB,OADahjD,IAAOgjD,EAAK9mD,MAAMyyC,YAAY5xB,OAAO,cAEpD,SACE,MAAO,SAuCsBomC,MAGrB,kBAAC/vC,GAAA,EAAD,CAAYpE,UAAU,UAAU+P,KAAK,QAAQhQ,QAlFzC,SAAApX,GAChBkwB,EAAYlwB,EAAMokB,iBAkFF,kBAACkN,GAAA,EAAD,SAIZ,kBAACC,GAAA,EAAD,CACItzB,GAAI2sD,EACJhrD,KAAMA,EACNqnB,SAAUA,EACVtU,QAASue,EACT9Z,QAAS8Z,EACTM,aAAc,CACVC,SAAU,SACVC,WAAY,UAEhBC,gBAAiB,CACbF,SAAU,MACVC,WAAY,UAEhBra,UAAWzC,EAAQ4a,SAElBtH,IChKjB,IAAMhY,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCm+B,aAAc,SAAA/+B,GAAK,MAAK,CACpB8C,SAAU,WACVN,QAAS,OACThB,QAAS,kBACT1E,gBAAiBkD,EAAMm4C,WAAa17C,GAAmBA,GACvD,cAAc,cACV2E,SAAU,GACTR,EAAMK,YAAYC,KAAK,MAAQ,CAC5BouB,YAAa,KAGrB,gBAAgB,cACZ/tB,MAAO,IACPwa,UAAW,QACXuT,YAAa,GACb,kBAAmB,CACfpf,OAAQ,IAEXtP,EAAMK,YAAYC,KAAK,MAAQ,CAC5BsB,QAAS,SAGjB,aAAc,CACVM,SAAU,WACVE,MAAO,EACPD,IAAK,GAET,cAAe,CACXlG,MAAOJ,MAGfujB,QAAS,CACL,sBAAuB,CACnBxd,QAAS,OACT1B,cAAe,UAEnB,oBAAqB,CACjBmf,cAAe,OACfhe,SAAU,KAEd,qBAAsB,CAClBI,eAAgB,aAChB6d,WAAY,UAKjB,SAAS+7B,GAAuBj8C,GAAQ,IACnCvR,EAAgDuR,EAAhDvR,GAAI+P,EAA4CwB,EAA5CxB,MAAO2zC,EAAqCnyC,EAArCmyC,WAAYgG,EAAyBn4C,EAAzBm4C,WAAYz/B,EAAa1Y,EAAb0Y,SADD,EAEVrV,IAAMC,SAAS,MAFL,oBAEnCmU,EAFmC,KAEzBiJ,EAFyB,KAGpCtb,EAAU1E,GAAUV,GAMpB0hB,EAAc,WAChBhB,EAAY,OAGVtwB,EAAOunB,QAAQF,GACf2jC,EAAYhrD,EAAO,2BAAwB2C,EAEjD,OACI,oCACI,kBAAC8lB,GAAA,EAAD,CAAMnQ,QAAQ,YACV,kBAACqQ,GAAA,EAAD,CAAalR,UAAWzC,EAAQ25B,cAC5B,yBAAKl3B,UAAU,YACVswC,EACG,kBAAC1vC,GAAA,EAAD,CAAYC,QAAQ,UAAUb,UAAU,YACpC,wCAEJ,KACJ,kBAACY,GAAA,EAAD,CAAYC,QAAQ,KAAKC,cAAY,GAArC,IACMla,GAEN,kBAACga,GAAA,EAAD,CAAYC,QAAQ,SAASlK,IAEjC,yBAAKqJ,UAAU,cACVsqC,EAAWrsC,KAAI,SAAA1L,GAAC,OACb,kBAACiQ,GAAA,EAAD,CAAMpV,IAAKmF,EAAE3L,GAAIia,QAAQ,WAAWQ,MAAO9O,EAAElL,WAGnDmC,GAAkBqnB,GAIhB,KAHA,kBAACzM,GAAA,EAAD,CAAYpE,UAAU,UAAU+P,KAAK,QAAQhQ,QAhC7C,SAAApX,GAChBkwB,EAAYlwB,EAAMokB,iBAgCE,kBAACkN,GAAA,EAAD,SAKhB,kBAACC,GAAA,EAAD,CACItzB,GAAI2sD,EACJhrD,KAAMA,EACNqnB,SAAUA,EACVtU,QAASue,EACT9Z,QAAS8Z,EACTM,aAAc,CACVC,SAAU,SACVC,WAAY,UAEhBC,gBAAiB,CACbF,SAAU,MACVC,WAAY,UAEhBra,UAAWzC,EAAQ4a,SAElBtH,I,cCzBjB,IAIewjC,GAJW74C,IAAM0L,MAlFhC,SAA2B/O,GAAQ,IACvBipB,EAA0CjpB,EAA1CipB,YAAa/B,EAA6BlnB,EAA7BknB,UAAW/jB,EAAkBnD,EAAlBmD,QAAS/S,EAAS4P,EAAT5P,KADX,EAEIiT,IAAMC,SAAS,GAFnB,oBAEvB64C,EAFuB,KAEZC,EAFY,OAGwB/4C,IAAMC,SAAS,IAHvC,oBAGvB+4C,EAHuB,KAGFC,EAHE,OAIUj5C,IAAMC,SAAS,MAJzB,oBAIvBi5C,EAJuB,KAITC,EAJS,iDAQ9B,gCAAAzsD,EAAA,sDAEI,IADM0sD,EAAU,CAAC,kDADrB,WAEarnD,GAGL,IAFA,IACMsnD,EADaL,EAAoBjnD,GACG8xB,UAAUzgB,QAAO,SAAArM,GAAC,OAAIA,EAAEwwC,YAJ1E,WAKiB+R,GAEL,IADA,IAAM1V,EAAW/f,EAAUzB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOiuD,EAAuBC,GAAGluD,MAC/D2/B,EAAI,EAAGA,EAAI6Y,EAASU,QAAQv0C,OAAQg7B,IAAK,CAC9C,IAAMwuB,EAAS3V,EAASU,QAAQvZ,GAChCquB,EAAQpoD,KAAR,sDAA4DuoD,EAAOnuD,GAAnE,YAAyEmuD,EAAOnuD,GAAhF,YAAsF0tD,EAAtF,YAAmGlV,EAASx4C,OAJ3GkuD,EAAI,EAAGA,EAAID,EAAuBtpD,OAAQupD,IAAM,EAAhDA,IAHJvnD,EAAI,EAAGA,EAAIinD,EAAoBjpD,OAAQgC,IAAM,EAA7CA,GAWTonD,EAAgBC,EAAQrG,KAAK,OAbjC,4CAR8B,sBAwB9B,OACI,kBAACrrC,GAAA,EAAD,CAAQ3a,KAAMA,GACV,kBAACgc,GAAA,EAAD,sCACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACIb,MAAM,qBACNnU,MAAOonD,EACP3yC,SAAU,SAAAhZ,GACN4rD,EAAa7Y,KAAKqM,IAAI,EAAGp/C,EAAMC,OAAOosD,gBACtCL,EAAgB,OAEpB9xC,WAAS,EACThC,QAAQ,SACRmE,KAAK,YAGb,kBAACtE,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACW,GAAA,EAAD,CACIC,UAAQ,EACRsB,WAAS,EACTrB,QAAS4f,EAAYxiB,QAAO,SAAArM,GAAC,OAAIA,EAAE8sB,UAAUhM,MAAK,SAAAC,GAAC,OAAIA,EAAEyvB,eACzDthC,eAAgB,SAAAlP,GAAC,OAAIA,EAAEoE,OACvB+K,kBAAmB,SAAAnP,GAAC,OAAIiiD,EAAoBnhC,MAAK,SAAAC,GAAC,OAAIA,IAAM/gB,EAAE3L,OAE9D+a,SAAU,SAACC,EAAGlD,GACV+1C,EAAuB/1C,GACvBi2C,EAAgB,OAEpBznD,MAAOsnD,EACP1yC,YAAY,iBACZC,uBAAqB,EACrBC,YAAa,SAAAC,GAAM,OAAI,kBAACC,GAAA,EAAD,iBAAeD,EAAf,CAAuBpB,QAAQ,SAASQ,MAAM,oBAAoBc,gBAAiB,CAAEC,QAAQ,OACpHC,WAAY,SAACnV,EAAOoV,GAAR,OAAwBpV,EAAM+Q,KAAI,SAACsE,EAAQpV,GAAT,OAAmB,kBAACqV,GAAA,EAAD,eAAMpV,IAAKD,EAAO6H,MAAM,UAAUqM,MAAOkB,EAAO5L,OAAW2L,EAAY,CAAEnV,mBAGlJ,kBAACuT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACTnX,GAAkBkrD,GAIhB,KAHA,kBAAChyC,GAAA,EAAD,CAAQ2T,KAAM,iCAAmCq+B,EAAc9wB,SAAQ,oBAAe5yB,MAAS+c,OAAO,oBAA/B,QAA0DlL,WAAS,GAA1I,eAOhB,kBAACoC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAvEN,4CAuElB,YAGA,kBAAC2C,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,eAQwC,SAAkByM,EAAWC,GACjF,OAAOD,EAAUxf,OAASyf,EAAazf,QChDrCsQ,GAAYC,cAAW,SAAAC,GAAK,cAAK,CACnCsuB,SAAO,GACH1tB,QAAS,YACTgB,QAAS,QAFN,eAGF5B,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,KAJV,eAMFZ,EAAMK,YAAYC,KAAK,MAAQ,CAC5BJ,cAAe,WAPhB,GAUPquB,QAAS,CACLvsB,cAAe,EACf4O,UAAW,GACX,wBAAyB,CACrBzQ,OAAQ,SAGhBI,SAAU,CACNc,SAAU,OAEdX,UAAU,cACNW,SAAU,MACVqyB,WAAY,IACX1zB,EAAMK,YAAYC,KAAK,MAAQ,CAC5BozB,WAAY,EACZzyB,UAAW,KAGnBi7C,eAAa,GACT17C,SAAU,GADD,eAERR,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,uBAHF,eAKRX,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,SANF,GASbw7C,gBAAgB,cACZz6C,SAAU,IACVf,MAAO,IACPH,SAAU,GACTR,EAAMK,YAAYC,KAAK,MAAQ,CAC5BoB,SAAU,QACVf,MAAO,SAGfy7C,eAAgB,CACZx7C,QAAS,iBAsIjB,IAAMy7C,GAAgB55C,IAAM0L,MAhI5B,SAA6B/O,GAAQ,IAE7BknB,EAgBAlnB,EAhBAknB,UACAg2B,EAeAl9C,EAfAk9C,iBACA/J,EAcAnzC,EAdAmzC,eACA1G,EAaAzsC,EAbAysC,mBACA0Q,EAYAn9C,EAZAm9C,aACA/iC,EAWApa,EAXAoa,KACAxV,EAUA5E,EAVA4E,QACAw4C,EASAp9C,EATAo9C,sBACAC,EAQAr9C,EARAq9C,sBACAC,EAOAt9C,EAPAs9C,kBACAC,EAMAv9C,EANAu9C,sBACAzpC,EAKA9T,EALA8T,eACAzN,EAIArG,EAJAqG,YACAm3C,EAGAx9C,EAHAw9C,aACAthD,EAEA8D,EAFA9D,KACAuhD,EACAz9C,EADAy9C,aAEEr4C,EAAU1E,KAEVg9C,EAAkBx2B,EACnBzgB,QACG,SAAArM,GAAC,OACIA,EAAEoE,MAAQ,IAAMpE,EAAE3L,IAAIqkC,cAAc1+B,SAAS++C,EAAergB,iBAC5Dz/B,GAAmB6pD,IAAqB9iD,EAAEk0C,SAASpzB,MAAK,SAAA4pB,GAAC,OAAIA,EAAE51C,KAAKkF,SAAS8oD,SAC7E7pD,GAAmB8pD,IAAiB/iD,EAAEN,MAAMohB,MAAK,SAAA4pB,GAAC,OAAIA,EAAEr2C,KAAO0uD,SAEvEnqB,MAAK,SAACjjC,EAAGwG,GAAJ,OAAWxG,EAAEooD,YAAc5hD,EAAE4hD,aAAe,EAAItJ,SAAS9+C,EAAEtB,IAAMogD,SAASt4C,EAAE9H,IAAMsB,EAAEooD,YAAc5hD,EAAE4hD,cAExGwF,EAAapa,KAAKqa,KAAKF,EAAgBtqD,OAhC5B,IAiHjB,OACI,kBAACmV,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKC,cAAY,GAArC,cAhFJ,kBAACJ,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,EAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+N,SAAUwP,EAAKxgB,cAAgB5K,GAAmByb,UAAW,kBAACypB,GAAA,EAAD,MAAStsB,QAAS,kBAAMy1C,EAAsB,MAAvJ,iBAIJ,kBAAC90C,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,OAAOX,UAAWzC,EAAQy4C,QACpC,kBAACtzC,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+K,QAAS,kBAAM01C,GAAkB,KAA7E,wBAIJ,kBAAC/0C,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,OAAOX,UAAWzC,EAAQy4C,QACpC,kBAACtzC,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+K,QAAS,kBAAMkM,EAAe,yBAA1E,oBAIJ,kBAACvL,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,OAAOX,UAAWzC,EAAQy4C,QACpC,kBAACtzC,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+K,QAAS,kBAAM21C,GAAsB,KAAjF,qBAIJ,kBAACh1C,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,OAAOX,UAAWzC,EAAQy4C,QACpC,kBAACtzC,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU+K,QAAS,kBAAMkM,EAAe,6BAA1E,0BAKR,kBAACvL,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,EAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAAC+F,UAAWzC,EAAQ03C,cAAet0C,GAAG,QAC5C,kBAACuB,GAAA,EAAD,CAAWb,MAAM,qBAAqBR,QAAQ,SAAS3T,MAAOo+C,EAAgB3pC,SAAUnD,EAAanX,KAAK,iBAAiBwb,WAAS,KAExI,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,EAAGX,UAAWzC,EAAQ23C,iBACjC,kBAACtwC,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYje,GAAG,2BAAf,YACA,kBAAC03B,GAAA,EAAD,CAAQC,QAAQ,0BAA0BrxB,MAAOmoD,EAAkB1zC,SAAUnD,EAAanX,KAAK,mBAAmBwZ,QAAQ,SAASgC,WAAS,GACvI+hC,EAAmB3mC,KAAI,SAAA1L,GAAC,OACrB,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAElL,MAC7BkL,EAAElL,SAGX,kBAACwN,GAAD,CAAczH,IAAI,OAAOF,MAAM,IAC3B,iDAKhB,kBAACwT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAM2E,QAoC3D84C,EAAgBj3C,QAAO,SAACgD,EAAGrU,GAAJ,OAAUA,EAzHzB,IAyH8B8G,EAAO,IAAqB9G,GAzH1D,GAyH+D8G,KAAqB4J,KA5BrG,SAA2BmhC,GAAW,IAC1Bx4C,EAAoCw4C,EAApCx4C,GAAI+P,EAAgCyoC,EAAhCzoC,MAAO8vC,EAAyBrH,EAAzBqH,SAAU6J,EAAelR,EAAfkR,WAC7B,OACI,kBAAC5vC,GAAA,EAAD,CAAMzG,MAAI,EAAC7M,IAAKxG,EAAI+Z,GAAI,IACpB,kBAACyzC,GAAD,CAAwB9J,WAAY7D,EAAU7/C,GAAIA,EAAI+P,MAAOA,EAAO25C,WAAYA,GAC3E/9B,EAAKxgB,cAAgB5K,IAAqBorB,EAAKne,KAAK7H,SAASrF,IACzDopD,EAMG,kBAAC5tC,GAAA,EAAD,CAAQ3C,QAAS,kBAAM41C,EAAa/uD,KAApC,UALA,oCACI,kBAAC8b,GAAA,EAAD,CAAQ3C,QAAS,kBAAMw1C,EAAsBnW,KAA7C,WACA,kBAAC18B,GAAA,EAAD,CAAQ3C,QAAS,kBAAMy1C,EAAsBpW,KAA7C,SAKR,UAeZ,kBAAC1+B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACs1C,GAAA,EAAD,CAAYC,MAAOJ,EAAYzhD,KAAMA,EAAO,EAAGsN,SAAU,SAACC,EAAGrU,GAAJ,OAAUqoD,EAAaroD,EAAI,OAExF,kBAACmT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,SAK2B,SAAkBoH,EAAWC,GAC/E,OACID,EAAUsX,YAAcrX,EAAaqX,WACrCtX,EAAUstC,mBAAqBrtC,EAAaqtC,kBAC5CttC,EAAUujC,iBAAmBtjC,EAAasjC,gBAC1CvjC,EAAU68B,qBAAuB58B,EAAa48B,oBAC9C78B,EAAUutC,eAAiBttC,EAAastC,cACxCvtC,EAAU9V,QAAU+V,EAAa/V,OACjC8V,EAAUwK,OAASvK,EAAauK,MAChCxK,EAAUhL,UAAYiL,EAAajL,SACnCgL,EAAU1T,OAAS2T,EAAa3T,QAykBxC,IAQeiW,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EA1jBf,SAAoBnS,GAAQ,IAChBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YADS,EAEiBnP,IAAMC,SAAS,MAFhC,oBAEhBqoB,EAFgB,KAEFC,EAFE,OAGqBvoB,IAAMC,SAAS,IAHpC,oBAGhB6vC,EAHgB,KAGAC,EAHA,OAIyB/vC,IAAMC,SAAS,IAJxC,oBAIhB45C,EAJgB,KAIEc,EAJF,OAKiB36C,IAAMC,SAAS,GALhC,oBAKhB26C,EALgB,KAKFC,EALE,OAMyB76C,IAAMC,SAAS,IANxC,oBAMhB66C,EANgB,KAMEC,EANF,OAO6B/6C,IAAMC,SAAS,IAP5C,oBAOhB+6C,EAPgB,KAOIC,EAPJ,OAQqBj7C,IAAMC,SAAS,GARpC,oBAQhBi7C,EARgB,KAQAC,EARA,OAS6Bn7C,IAAMC,SAAS,MAT5C,oBAShBm7C,EATgB,KASIpB,EATJ,OAU6Bh6C,IAAMC,SAAS,MAV5C,oBAUhBo7C,EAVgB,KAUIC,EAVJ,OAWiCt7C,IAAMC,SAAS,MAXhD,oBAWhBs7C,EAXgB,KAWMC,EAXN,OAYqCx7C,IAAMC,SAAS,MAZpD,oBAYhBw7C,EAZgB,KAYQC,EAZR,OAa6B17C,IAAMC,SAAS,IAb5C,oBAahBmpC,EAbgB,KAaIC,GAbJ,QAcWrpC,IAAMC,SAAS,IAd1B,sBAchB4jB,GAdgB,MAcL83B,GAdK,SAee37C,IAAMC,SAAS,IAf9B,sBAehB2lB,GAfgB,MAeHg2B,GAfG,SAgBa57C,IAAMC,SAAS,IAhB5B,sBAgBhB6uC,GAhBgB,MAgBJ+M,GAhBI,SAiBG77C,IAAMC,SAAS,IAjBlB,sBAiBhBuoB,GAjBgB,MAiBTC,GAjBS,SAkBazoB,IAAMC,SAAS,IAlB5B,sBAkBhBE,GAlBgB,MAkBJC,GAlBI,SAmBGJ,IAAMC,SAAS,IAnBlB,sBAmBhBxJ,GAnBgB,MAmBTyJ,GAnBS,SAoBWF,IAAMC,SAAS,IApB1B,sBAoBhB67C,GApBgB,MAoBLC,GApBK,SAqB6B/7C,IAAMC,SAAS,IArB5C,sBAqBhB+7C,GArBgB,MAqBIC,GArBJ,SAsBqBj8C,IAAMC,UAAS,GAtBpC,sBAsBhBi8C,GAtBgB,MAsBAjC,GAtBA,SAuB6Bj6C,IAAMC,UAAS,GAvB5C,sBAuBhBk8C,GAvBgB,MAuBIjC,GAvBJ,SAwBel6C,IAAMC,SAAS,MAxB9B,sBAwBhBuQ,GAxBgB,MAwBHC,GAxBG,SAyBOzQ,IAAMC,SAAS,MAzBtB,sBAyBhBsB,GAzBgB,MAyBPC,GAzBO,SA0BOxB,IAAMC,UAAS,GA1BtB,sBA0BhBf,GA1BgB,MA0BPuC,GA1BO,SA2BCzB,IAAMC,WAArBuhB,GA3Bc,sBA4BjBzf,GAAU1E,KAEV++C,GAAkC,kBAAjB9zB,EAAmC,GAAKA,EAEzD+zB,GAAoBz2B,GACrBxiB,QACG,SAAArM,GAAC,OACGA,EAAEoE,MAAMs0B,cAAc1+B,SAAS+pD,EAAiBrrB,iBAC/Cz/B,GAAmBgrD,IAAuBjkD,EAAEulD,iBAAiBl5C,QAAO,SAAAq+B,GAAC,OAAIA,EAAE1wC,SAASiqD,MAAqBjrD,OAAS,KAClHC,GAAmBosD,KAAmBrlD,EAAEwlD,YAAY1kC,MAAK,SAAAC,GAAC,OAAIA,EAAE/mB,SAASqrD,WAEjFzsB,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUxG,EAAEooD,YAAc5hD,EAAE4hD,cAEhC0H,GAAuBtc,KAAKqa,KAAK8B,GAAkBtsD,OA5MxC,IA8MX0xB,GAAczhB,IAAMiC,aAAY,WAClCuf,GAAY,MACb,IAEGi7B,GAAyBz8C,IAAMiC,YAAN,uCAAkB,WAAMnX,GAAN,eAAA4B,EAAA,sEACtB86C,GAAmBC,cAAc38C,GADX,QACvC6D,EADuC,QAEhCb,SACT0T,GAAW7S,EAASZ,MAEpBs7C,GAAsB16C,EAASZ,MALU,2CAAlB,sDAO5B,IAEG2uD,GAAgB18C,IAAMiC,YAAN,uCAAkB,WAAMnX,GAAN,eAAA4B,EAAA,sEACb86C,GAAmBM,aAAah9C,GADnB,QAC9B6D,EAD8B,QAEvBb,SACT0T,GAAW7S,EAASZ,MAEpB4tD,GAAahtD,EAASZ,MALU,2CAAlB,sDAOnB,IAEGm7B,GAAYlpB,IAAMiC,YAAN,uCAAkB,WAAMnX,GAAN,eAAA4B,EAAA,sEACT+d,GAAkBC,gBAAgB5f,GADzB,QAC1B6D,EAD0B,QAEnBb,SACT0T,GAAW7S,EAASZ,MAEpB06B,GAAS95B,EAASZ,MALU,2CAAlB,sDAOf,IAEGmU,GAAiBlC,IAAMiC,YAAN,uCAAkB,WAAMnX,GAAN,eAAA4B,EAAA,sEACdoO,GAAoBC,cAAcjQ,GADpB,QAC/B6D,EAD+B,QAExBb,SACT0T,GAAW7S,EAASZ,MAEpBqS,GAAczR,EAASZ,MALU,2CAAlB,sDAOpB,IAEGiU,GAAYhC,IAAMiC,YAAN,uCAAkB,WAAMnX,GAAN,eAAA4B,EAAA,sEACTuN,GAAeC,SAASpP,GADf,QAC1B6D,EAD0B,QAEnBb,SACT0T,GAAW7S,EAASZ,MAEpBmS,GAASvR,EAASZ,KAAKqV,QAAO,SAAArM,GAAC,OAAIA,EAAEjM,YAAcA,MALvB,2CAAlB,sDAOf,IAEG6xD,GAAkB38C,IAAMiC,YAAN,uCAAkB,WAAMnX,GAAN,qBAAA4B,EAAA,sEACVs3B,GAAqBE,mBAAmBp5B,GAD9B,YAChC8xD,EADgC,QAEpB9uD,SAFoB,gBAGlC0T,GAAWo7C,EAAc7uD,MAHS,uCAKLi2B,GAAqBG,uBAC9Cr5B,EACA8xD,EAAc7uD,KAAK0U,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,OAPA,OASlC,IAJMyxD,EAL4B,QASf/uD,SACf0T,GAAWq7C,EAAe9uD,UACvB,CACH,IADI,EAAD,SACMgE,GACL,IAAM+qD,EAAmBD,EAAe9uD,KAAKq0B,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,IAAMwxD,EAAc7uD,KAAKgE,GAAG3G,MACrFwxD,EAAc7uD,KAAKgE,GAAnB,2BAA6B6qD,EAAc7uD,KAAKgE,IAAO+qD,IAFlD/qD,EAAI,EAAGA,EAAI6qD,EAAc7uD,KAAKgC,OAAQgC,IAAM,EAA5CA,GAIT6pD,GAAegB,EAAc7uD,MAhBC,4CAAlB,sDAmBrB,IAEGgvD,GAAiB/8C,IAAMiC,YAAN,uCAAkB,WAAMnX,GAAN,eAAA4B,EAAA,sEACds3B,GAAqBK,4BAA4Bv5B,GADnC,QAC/B6D,EAD+B,QAExBb,SACT0T,GAAW7S,EAASZ,MAEpB8tD,GAAcltD,EAASZ,MALU,2CAAlB,sDAOpB,IA+BH,SAASiV,GAAY7V,GAAQ,IAAD,EACOA,EAAMC,OAA7BvB,EADgB,EAChBA,KAAM6F,EADU,EACVA,MAAOuR,EADG,EACHA,MACrB,OAAQpX,GACJ,IAAK,iBACDkkD,EAAkBr+C,GAClBmpD,EAAgB,GAChB,MACJ,IAAK,mBACDF,EAAoBjpD,GACpBmpD,EAAgB,GAChB,MACJ,IAAK,mBACDE,EAAoBrpD,GACpBypD,EAAkB,GAClB,MACJ,IAAK,qBACDF,EAAsBvpD,GACtBypD,EAAkB,GAClB,MACJ,IAAK,YACD/7B,KACKpxB,GAAkBiV,EAAM,IAIzB84C,GAAa,KAHbA,GAAa94C,EAAM,IACnBqc,GAAe,CAACrc,EAAM,IAAKwe,MA9KpB,8CAwLvB,WAAiCmiB,GAAjC,SAAAl3C,EAAA,sEACU+vD,GAAuB1lC,EAAKjsB,WADtC,OAEQ+4B,GAAUzgB,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOw4C,EAASx4C,MAAI2E,OAAS,EACrD4rD,GAAa93B,GAAUphB,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOw4C,EAASx4C,GAAKw4C,EAAW7sC,MAEnE4kD,GAAa,GAAD,oBAAK93B,IAAL,CAAgB+f,KALpC,4CAxLuB,+BAiMRoZ,KAjMQ,8EAiMvB,4CAAAtwD,EAAA,6DAAqCuwD,EAArC,gCACIx7C,IAAW,GACHrW,EAAOiwD,EAAPjwD,GAFZ,SAG2Bo8C,GAAmBW,gBAAgBpxB,EAAKjsB,UAAWM,GAH9E,WAGUuD,EAHV,QAIiBb,SACT0T,GAAW7S,EAASZ,MAEpB4tD,GAAa93B,GAAUphB,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOA,EAAT,2BAAmB2L,GAAnB,IAAsB+9C,YAAY,IAAS/9C,OAE5EkmD,EATR,kCAUqB9C,KAVrB,iDAaImB,EAAsB,MACtB75C,IAAW,GAdf,6CAjMuB,+BAkNR04C,GAlNQ,iFAkNvB,WAA4B+C,GAA5B,iBAAAxwD,EAAA,6DACI+U,IAAW,GACPrW,EAAK8xD,EACJlvD,GAAkBqtD,KACnBjwD,EAAKiwD,EAAmBjwD,IAJhC,SAM2Bo8C,GAAmBY,eAAerxB,EAAKjsB,UAAWM,GAN7E,QAMUuD,EANV,QAOiBb,SACT0T,GAAW7S,EAASZ,OAEpB4tD,GAAa93B,GAAUzgB,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOA,MAC5CkwD,EAAsB,OAE1B75C,IAAW,GAbf,4CAlNuB,+BA0OR07C,KA1OQ,8EA0OvB,0DAAAzwD,EAAA,6DACI+U,IAAW,GACHrW,EAAOqwD,EAAPrwD,GACRswD,EAA0B,MAH9B,SAKqC13B,GAAqBI,kBAAkBrN,EAAKjsB,UAAWM,GAL5F,YAKUspD,EALV,QAM2B5mD,SAN3B,wBAOQ0T,GAAWkzC,EAAmB3mD,MAC9B0T,IAAW,GARnB,oCAY2IizC,EAAmB3mD,KAAlJoN,EAZZ,EAYYA,MAAOooB,EAZnB,EAYmBA,eAAgBnQ,EAZnC,EAYmCA,MAAOoQ,EAZ1C,EAY0CA,IAAKC,EAZ/C,EAY+CA,aAAcC,EAZ7D,EAY6DA,cAAeG,EAZ5E,EAY4EA,UAAWptB,EAZvF,EAYuFA,MAAO+xB,EAZ9F,EAY8FA,MAAOroB,EAZrG,EAYqGA,WAAYjV,EAZjH,EAYiHA,WAAYo4B,EAZ7H,EAY6HA,UAZ7H,UAa8BU,GAAqBM,kBAC3CvN,EAAKjsB,UACLqQ,EACAmoB,EACAp4B,EACAq4B,EACAnQ,EACAoQ,EACAC,EACAC,EACAG,EAAUphB,KAAI,SAAA1L,GAAC,MAAK,CAAE3L,GAAI2L,EAAE3L,GAAI87C,UAAWnwC,EAAEmwC,cAC7CzwC,EAAMgM,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MACjBo9B,EAAM/lB,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MACjB+U,EAAWsC,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,OA1B9B,SAaU+2B,EAbV,QA4BoBr0B,SACZ0T,GAAW2gB,EAAYp0B,MAEvB6tD,GAAe,GAAD,oBAAKh2B,IAAL,CAAkB8uB,EAAmB3mD,QAGvD0T,IAAW,GAlCf,6CA1OuB,oEA+QvB,WAAoCrW,GAApC,eAAAsB,EAAA,6DACI+U,IAAW,GADf,SAEqCuiB,GAAqBI,kBAAkBrN,EAAKjsB,UAAWM,GAF5F,QAEUspD,EAFV,QAG2B5mD,SACnB0T,GAAWkzC,EAAmB3mD,MAE9BytD,EAAwB9G,EAAmB3mD,MAE/C0T,IAAW,GARf,4CA/QuB,oEA0RvB,8BAAA/U,EAAA,6DACI+U,IAAW,GACXw4C,IAAkB,GAFtB,SAG2BzS,GAAmBa,gBAAgBtxB,EAAKjsB,UAAWgxD,GAAWE,IAHzF,YAGUrtD,EAHV,QAIiBb,SAJjB,gBAKQ0T,GAAW7S,EAASZ,MAL5B,8BAOgBjD,EAAcisB,EAAdjsB,UAPhB,UASc4xD,GAAc5xD,GAT5B,yBAUc2xD,GAAuB3xD,GAVrC,QAYIsyD,KACA37C,IAAW,GAbf,6CA1RuB,sBA0SvB,SAAS27C,KACLh+B,KACA28B,GAAa,IACb9B,IAAkB,GAClBgC,GAAsB,IAsD1B,SAAS1Y,GAAoBJ,GAAa,IAC9B/3C,EAAsG+3C,EAAtG/3C,GAAI+P,EAAkGgoC,EAAlGhoC,MAAOmhD,EAA2FnZ,EAA3FmZ,iBAAkB54B,EAAyEyf,EAAzEzf,cAAe25B,EAA0Dla,EAA1Dka,YAAa70B,EAA6C2a,EAA7C3a,MAAO/xB,EAAsC0sC,EAAtC1sC,MAAO8sB,EAA+B4f,EAA/B5f,eAAgBnQ,EAAe+vB,EAAf/vB,MAAOoQ,EAAQ2f,EAAR3f,IAChG85B,EAAUvmC,EAAKne,KAAK7H,SAASrF,KAAgBqrB,EAAKpe,UAAU5H,SAASjF,KAAqBuxD,IAAgBtmC,EAAK3rB,IAAO2rB,EAAKxgB,cAAgB5K,GACjJ,OACI,kBAACuZ,GAAA,EAAD,CAAMzG,MAAI,EAAC7M,IAAKxG,EAAIw3B,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IACnC,kBAACwyC,GAAD,CACIvsD,GAAIA,EACJ+P,MAAOA,EACP2zC,WAAYwN,EACZ1E,eAAgBl0B,EAChBm0B,UAAWrvB,EAAMz4B,OACjB+nD,UAAWrhD,EAAM1G,OACjBmiD,KAAM3uB,EACNnQ,MAAOA,EACPoQ,IAAKA,GAEL,kBAACtc,GAAA,EAAD,CAAQ3C,QAAS,kBAAMm3C,EAA0BvY,KAAjD,aACCma,EAAU,kBAACp2C,GAAA,EAAD,CAAQ3C,QAAS,kBArXrB,4CAqX2Bg5C,CAAqBnyD,KAA5C,QAAiE,OAoG5F,OA9VA4U,IAAMyH,WAAU,WAAM,4CAClB,gCAAA/a,EAAA,yDACY5B,EAA4CisB,EAA5CjsB,UAAW2kB,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAC/B5H,GAAoB4H,EAF7B,uBAGQ5G,GAAe,UAHvB,0CAMU9jB,QAAQ6wD,IAAI,CACdf,GAAuB3xD,GACvB4xD,GAAc5xD,GACdo+B,GAAUp+B,GACVoX,GAAepX,GACfkX,GAAUlX,GACV6xD,GAAgB7xD,GAChBiyD,GAAejyD,KAbvB,4CADkB,sBAiBlB2W,IAAW,GAjBQ,WAAD,+BAkBlBvV,GAAO0B,MAAK,kBAAM6T,IAAW,QAC9B,CAACsV,EAAM0lC,GAAwBC,GAAexzB,GAAWhnB,GAAgBF,GAAW26C,KAGvF38C,IAAMyH,WAAU,WACPzZ,GAAkBwiB,KACnBrB,EAAYqB,MAEjB,CAACA,GAAarB,IAqUb,6BACI,kBAACrF,GAAD,CAAgB5K,QAASA,KAEzB,kBAACu+C,GAAA,EAAD,CAAKj5C,UAAWzC,GAAQ43C,gBACpB,kBAACvwC,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYje,GAAG,uBAAf,iBACA,kBAAC03B,GAAA,EAAD,CAAQC,QAAQ,sBAAsBrxB,MAAO42B,EAAcniB,SAAU,SAAAhZ,GAAK,OAAIo7B,EAAgBp7B,EAAMC,OAAOsE,QAAQ7F,KAAK,eAAewZ,QAAQ,SAASgC,WAAS,GAC5J5Q,GAAMgM,KAAI,SAAA1L,GAAC,OACR,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAE3L,IAC7B2L,EAAElL,SAGX,kBAACwN,GAAD,CAAczH,IAAI,YAAYF,MAAM,iBAApC,cAIc,OAAjB42B,EAAwB,kBAAC/L,GAAA,EAAD,CAAgBruB,OAAO,GAAvB,4DAAyG,OAI1I,kBAACskB,GAAA,EAAD,MAEkB,OAAjB8V,EACG,yBAAK9jB,UAAWzC,GAAQ8pB,SACpB,yBAAKrnB,UAAWzC,GAAQjE,UACpB,kBAAC87C,GAAD,CACI7iC,KAAMA,EACN/T,YAAaA,GACbomC,mBAAoBA,EACpByQ,iBAAkBA,EAClB/J,eAAgBA,EAChBgK,aAAcsC,GACd3lD,MAAOA,GACPotB,UAAWA,GACXm2B,sBAAuBA,EACvBD,sBAAuBuB,EACvB7qC,eAAgBA,GAChBwpC,kBAAmBA,GACnBC,sBAAuBA,GACvBC,aAAcA,GACdthD,KAAM+hD,EACNR,aAAcS,EACdt5C,QAASA,MAGjB,yBAAKiD,UAAWzC,GAAQ9D,WApNhC,kBAACiH,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,KAAKC,cAAY,GAArC,gBAgBR,kBAACJ,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACD,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,GAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAG,OAAOnO,GAAI,GAAID,GAAI,GAAIxd,GAAI,IACrC,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU4N,UAAW,kBAACypB,GAAA,EAAD,MAAStsB,QAAS,kBAAMi3C,EAAwB,MAAvG,mBAIJ,kBAACt2C,GAAA,EAAD,CAAMzG,MAAI,EAAC+F,UAAWzC,GAAQ03C,eAC1B,kBAAC/yC,GAAA,EAAD,CAAWb,MAAM,uBAAuBR,QAAQ,SAAS3T,MAAOopD,EAAkB30C,SAAUnD,GAAanX,KAAK,mBAAmBwb,WAAS,KAE9I,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,EAAGX,UAAWzC,GAAQ23C,iBACjC,kBAACtwC,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYje,GAAG,2BAAf,YACA,kBAAC03B,GAAA,EAAD,CAAQC,QAAQ,0BAA0BrxB,MAAOspD,EAAoB70C,SAAUnD,GAAanX,KAAK,qBAAqBwZ,QAAQ,SAASgC,WAAS,GAC3I+hC,EAAmB3mC,KAAI,SAAA1L,GAAC,OACrB,kBAACsC,GAAD,CAAczH,IAAKmF,EAAE3L,GAAIsG,MAAOqF,EAAElL,MAC7BkL,EAAElL,SAGX,kBAACwN,GAAD,CAAczH,IAAI,OAAOF,MAAM,IAC3B,iDAKhB,kBAACwT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,OApClBk3C,GAAkBj5C,QAAO,SAACgD,EAAGrU,GAAJ,OAAUA,EA7d/B,IA6doCmpD,EAAiB,IAAqBnpD,GA7d1E,GA6d+EmpD,KAA+Bz4C,IAAI8gC,IACvH,kBAACr+B,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACs1C,GAAA,EAAD,CAAYC,MAAO8B,GAAsB3jD,KAAMqiD,EAAiB,EAAG/0C,SAAU,SAACC,EAAGrU,GAAJ,OAAUopD,EAAkBppD,EAAI,OAEjH,kBAACmT,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,QA2Mf,KAEJ,kBAAC4jC,GAAD,CACIj+C,UAAWisB,EAAKjsB,UAChBiC,MAAOiB,GAAkBotD,GACzBt7C,QAAS,kBAAMk6C,EAAsB,OACrC/5B,OA/gBW,6CAghBX+oB,gBAAiBI,EACjBxF,SAAUwX,EACVnS,WAAYxyC,KAGhB,kBAACi4C,GAAD,CACI5jD,UAAWisB,EAAKjsB,UAChBiC,MAAOiB,GAAkButD,GACzBz7C,QAAS,kBAAM07C,EAAwB,OACvCv7B,OAvTZ,SAAiCy9B,GACzB93B,GAAYxiB,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOsyD,EAActyD,MAAI2E,OAAS,EAC5D6rD,GAAeh2B,GAAYnjB,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOsyD,EAActyD,GAAKsyD,EAAgB3mD,MAEjF6kD,GAAe,GAAD,oBAAKh2B,IAAL,CAAkB83B,MAoT5Bva,WAAYoY,EACZvS,gBAAiBI,EACjB0F,WAAYA,GACZF,eAAgB/qB,GAAUphB,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAagjB,SAAS,EAAO1V,UAAU,OACtEsqC,WAAYnmB,GAAM/lB,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAagjB,SAAS,EAAO1V,UAAU,OAC9DwqC,gBAAiB1uC,GAAWsC,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAagjB,SAAS,EAAO1V,UAAU,OACxE4kC,WAAYxyC,GAAMgM,KAAI,SAAA1L,GAAC,kCAAUA,GAAV,IAAagjB,SAAS,EAAO1V,UAAU,SAnKlE,kBAACqD,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBqtD,GAAqBv7C,QAAS,kBAAMw7C,EAAsB,QACvF,kBAACvyC,GAAA,EAAD,wBAAuBsyC,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAoBjwD,IAC3C,kBAAC4d,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASy4C,IAAjC,OAGA,kBAAC91C,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMy4C,IAAsB,KAA7D,yBAGA,kBAAC91C,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM+2C,EAAsB,QAA7D,QAUR,kBAAC5zC,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBytD,GAAyB37C,QAAS,kBAAM47C,EAA0B,QAC/F,kBAAC3yC,GAAA,EAAD,yBAAwB0yC,QAAxB,IAAwBA,OAAxB,EAAwBA,EAAwBtgD,OAChD,kBAAC6N,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS44C,IAAjC,OAGA,kBAACj2C,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAMm3C,EAA0B,QAAjE,QAUR,kBAACh0C,GAAA,EAAD,CAAQ3a,KAAMmvD,GAAgBp8C,QAAS,kBAAMs9C,OACzC,kBAACr0C,GAAA,EAAD,4BACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ2T,KAAK,wBAAwBztB,OAAO,SAAS+6B,IAAI,sBAAsB9gB,WAAS,GAAxF,qBAIJ,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACiE,GAAA,EAAD,CAAa/B,WAAS,EAAChC,QAAQ,UAC3B,kBAACgE,GAAA,EAAD,CAAYzC,QAAM,GAAlB,iBACA,kBAAC0C,GAAA,EAAD,CACIE,KAAK,OACL3d,KAAK,YACLsa,SAAUnD,GACVkgB,WAAY,CACRC,OAAQ,QAEZ9b,WAAS,MAIrB,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACW,GAAA,EAAD,CACIC,UAAQ,EACRrU,MAAOsqD,GACP71C,SAAU,SAACC,EAAG4c,GAAJ,OAAUi5B,GAAsBj5B,IAC1Cxe,UAAWzC,GAAQ1C,WACnB2G,QAASvP,GAAMk5B,MAAK,SAACjjC,EAAGwG,GAAJ,OAAWA,EAAErH,KAAK,GAAG6oB,cAAcu3B,cAAcv/C,EAAEb,KAAK,GAAG6oB,kBAAgBjS,KAAI,SAAA1L,GAAC,OAAIA,EAAE3L,MAC1G8gD,QAAS,SAAAztC,GAAI,OAAIhI,GAAM2rB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOqT,KAAM5S,KAAK,GAAG6oB,eACxDzO,eAAgB,SAAAxH,GAAI,OAAIhI,GAAM2rB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOqT,KAAM5S,MACvD2a,YAAa,SAAAC,GAAM,OAAI,kBAACC,GAAA,EAAD,iBAAeD,EAAf,CAAuBZ,MAAM,eAAeR,QAAQ,SAASsB,gBAAiB,CAAEC,QAAQ,OAC/GC,WAAY,SAACnV,EAAOoV,GAAR,OACRpV,EAAM+Q,KAAI,SAACsE,EAAQpV,GACf,IAAM9F,EAAO4K,GAAM2rB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAO2b,KAAQlb,KAC9C,OAAO,kBAACmb,GAAA,EAAD,eAAMpV,IAAKD,EAAO6H,MAAM,UAAUqM,MAAOha,GAAUib,EAAY,CAAEnV,qBAOhG,kBAAC8X,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM64C,OAAvC,UAGA,kBAACl2C,GAAA,EAAD,CAAQ1N,MAAM,UAAU+N,SAAUvZ,GAAkB8tD,IAAYv3C,QAAS,kBAjdlE,2CAidwEo5C,KAA/E,UAqFR,kBAAC,GAAD,CACI79C,QAAS,WACLo6C,IAAsB,IAE1BntD,KAAMovD,GACNt4B,UAAWA,GACX+B,YAAaA,SCvyBd,SAASg4B,GAAiBjhD,GAAQ,IACrCsuC,EAAwDtuC,EAAxDsuC,SAAUl+C,EAA8C4P,EAA9C5P,KAAM+S,EAAwCnD,EAAxCmD,QAAS8kC,EAA+BjoC,EAA/BioC,QAAS3kB,EAAsBtjB,EAAtBsjB,OAAQn1B,EAAc6R,EAAd7R,UADN,EAEpBkV,IAAMC,SAAS,IAFK,oBAErCpU,EAFqC,KAE/Bg5C,EAF+B,KAItCgZ,EAAiB,kBAAO7vD,GAAiB,OAACi9C,QAAD,IAACA,OAAD,EAACA,EAAU7/C,KAJd,4CAW5C,WAA0B+B,GAA1B,eAAAT,EAAA,yDACIS,EAAMsW,iBACNmhC,EAAQ,OACSiZ,IAHrB,gCAG8CrW,GAAmBG,eAAe78C,EAAWmgD,EAAS7/C,GAAIS,GAHxG,2DAGsH27C,GAAmBE,cAAc58C,EAAWe,GAHlK,6BAGU8C,EAHV,MAIiBb,SACT82C,EAAQj2C,EAASZ,MAEjBkyB,EAAOtxB,EAASZ,MAEpB+R,IATJ,6CAX4C,sBAkC5C,OA3BAE,IAAMyH,WAAU,WAAO,IAAD,EAClBo9B,EAAO,iBAACoG,QAAD,IAACA,OAAD,EAACA,EAAUp/C,YAAX,QAAmB,MAC3B,CAACo/C,IA0BA,kBAACvjC,GAAA,EAAD,CAAQ3a,KAAMA,GACV,0BAAM+b,SApC8B,6CAqChC,kBAACC,GAAA,EAAD,0BACA,kBAACC,GAAA,EAAD,KACI,kBAAC9D,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWrB,QAAQ,SAASQ,MAAM,OAAOnU,MAAO7F,EAAMsa,SAlB9E,SAAqBhZ,GAAQ,IAAD,EACAA,EAAMC,OAAtBsE,EADgB,EAChBA,MACR,OAFwB,EACT7F,MAEX,IAAK,OACDg5C,EAAQnzC,KAciF7F,KAAK,OAAOod,UAAQ,EAAC5B,WAAS,OAIvH,kBAACoC,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAUgQ,KAAK,UAA7B,QAGA,kBAACtC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAASzE,GAAjC,aC1CpB,IAAMzC,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCsuB,QAAQ,cACJ1tB,QAAS,aACRZ,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,KAGjB2tB,QAAS,CACLvsB,cAAe,EACf,wBAAyB,CACrB7B,OAAQ,aAiKpB,IAQeoR,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EApKf,SAA4BnS,GAAQ,IACxBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YADiB,EAECnP,IAAMC,SAAS,IAFhB,oBAExBgrC,EAFwB,KAEd6S,EAFc,OAGK99C,IAAMC,SAAS,IAHpB,oBAGxB8sB,EAHwB,KAGZC,EAHY,OAIGhtB,IAAMC,SAAS,MAJlB,oBAIxB+kC,EAJwB,KAIbC,EAJa,OAKKjlC,IAAMC,SAAS,MALpB,oBAKxBilC,EALwB,KAKZC,EALY,OAMOnlC,IAAMC,SAAS,MANtB,oBAMxBuQ,EANwB,KAMXC,EANW,OAODzQ,IAAMC,SAAS,MAPd,oBAOxBsB,EAPwB,KAOfC,EAPe,OAQDxB,IAAMC,UAAS,GARd,oBAQxBf,EARwB,KAQfuC,EARe,KASzBM,EAAU1E,KAEV0gD,EAAe/9C,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,6DACnC+U,GAAW,GADwB,SAEZ+lC,GAAmBC,cAAc1wB,EAAKjsB,WAF1B,QAE7B6D,EAF6B,QAGtBb,SACT0T,EAAW7S,EAASZ,MAEpB+vD,EAAYnvD,EAASZ,MAEzB0T,GAAW,GARwB,2CASpC,CAACsV,IApB2B,4CAqD/B,8BAAArqB,EAAA,6DACI+U,GAAW,GACXD,EAAW,MACHpW,EAAO45C,EAAP55C,GAHZ,SAI2Bo8C,GAAmBI,iBAAiB7wB,EAAKjsB,UAAWM,GAJ/E,QAIUuD,EAJV,QAKiBb,SACT0T,EAAW7S,EAASZ,MAEpB+vD,EAAY7S,EAAS7nC,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOA,MAE9C65C,EAAa,MACbxjC,GAAW,GAXf,4CArD+B,sBAmE/B,SAASuB,EAAY7V,GAAQ,IAAD,EACAA,EAAMC,OAAtBsE,EADgB,EAChBA,MACR,OAFwB,EACT7F,MAEX,IAAK,OACDmhC,EAAct7B,IAyB1B,SAASssD,EAAc/S,GAAW,IACtB7/C,EAAa6/C,EAAb7/C,GAAIS,EAASo/C,EAATp/C,KACZ,OACI,kBAACqZ,GAAA,EAAD,CAAMtT,IAAKxG,EAAIqT,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,EAAGxd,GAAI,IACzC,kBAACu/B,GAAD,CAAgBvpC,MAAOtP,GACnB,kBAACqb,GAAA,EAAD,CAAQ3C,QAAS,kBAAM4gC,EAAc8F,KAArC,QACA,kBAAC/jC,GAAA,EAAD,CAAQ3C,QAAS,kBAAMkM,EAAe,iBAAtC,WACA,kBAACvJ,GAAA,EAAD,CAAQ3C,QAAS,kBAAM0gC,EAAagG,KAApC,YAmChB,OAnHAjrC,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUqxD,IADV,4CAPkB,sBAGbtuC,GAAoB4H,GACrB5G,EAAe,UAJD,mCAUlBvkB,KACD,CAAC6qB,EAAMgnC,IAGV/9C,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAkGb,yBAAK3K,UAAWzC,EAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASA,IA5DzB,kBAACgG,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,EAAG5D,UAAWzC,EAAQ+pB,SAC3C,kBAAC5mB,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAG,QACV,kBAAC+B,GAAA,EAAD,CAAQ7B,QAAQ,YAAY7L,MAAM,UAAU4N,UAAW,kBAACypB,GAAA,EAAD,MAAStsB,QAAS,kBAAM4gC,EAAc,MAA7F,iBAIJ,kBAACjgC,GAAA,EAAD,CAAMzG,MAAI,EAACsyB,GAAI,EAAGnO,GAAI,EAAGD,GAAI,GAAIxd,GAAI,IACjC,kBAACuB,GAAA,EAAD,CAAWb,MAAM,iBAAiBR,QAAQ,SAAS3T,MAAOq7B,EAAY5mB,SAAUnD,EAAanX,KAAK,OAAOwb,WAAS,KAEtH,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAM2E,MAoBpDvT,GAAkBi9C,GACX,KAIP,kBAAC/lC,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACpB6iC,EAAS7nC,QAAO,SAAArM,GAAC,OAAIA,EAAElL,KAAKkF,SAASg8B,MAAatqB,IAAIu7C,IAO3D,kBAACt2C,GAAA,EAAD,CAAQ3a,MAAOiB,GAAkBg3C,GAAYllC,QAAS,kBAAMmlC,EAAa,QACrE,kBAACl8B,GAAA,EAAD,wBACA,kBAACC,GAAA,EAAD,sDACA,kBAACS,GAAA,EAAD,KACI,kBAACvC,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBA/HlB,0CA+HwB05C,KAAvC,OAGA,kBAAC/2C,GAAA,EAAD,CAAQ1N,MAAM,UAAU+K,QAAS,kBAAM0gC,EAAa,QAApD,QAcR,kBAAC,GAAD,CACIl4C,MAAOiB,GAAkBk3C,GACzBplC,QAAS,kBAAMqlC,EAAc,OAC7BP,QAASpjC,EACTye,OAzGZ,SAA8Bi+B,GAAS,IAC3B9yD,EAAO8yD,EAAP9yD,GACFyM,GAAU7J,GAAkBi9C,EAAS7nC,QAAO,SAAArM,GAAC,OAAIA,EAAE3L,KAAOA,KAAI,IAEhE0yD,EADAjmD,EACYozC,EAASxoC,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAOA,EAAK8yD,EAASnnD,KAE1C,GAAD,oBAAKk0C,GAAL,CAAeiT,MAoGtBjT,SAAU/F,EACVp6C,UAAWisB,EAAKjsB,gB,0CCjK1BuS,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCib,SAAU,CACNrZ,QAAS,OACT1B,cAAe,SACf2B,WAAY,UAEhBvF,KAAM,CACF0U,aAAc,GACdtP,SAAU,KAEdk/C,UAAU,cACNh/C,QAAS,eACTjB,MAAO,MACP,QAAS,CACLE,gBAAiB,kCACjBE,UAAW,kCACX+P,aAAc,GACdpP,SAAU,IACV4N,OAAQ,IAEXtP,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,aA8MnB,IASe4Q,iBATS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,KACnCihB,MAAO,SAAAjhB,GAAI,OAAImhB,EAASF,GAAMjhB,QAGnB+gB,EAlNf,SAAkBnS,GAAQ,IAAD,EACOnK,KAAYwoB,MAAMre,EAAM/J,SAASqoB,QAArDjwB,EADa,EACbA,SAAUmE,EADG,EACHA,MADG,EAEW6Q,IAAMC,SAAS,IAF1B,oBAEd1P,EAFc,KAEJqoB,EAFI,OAGmC5Y,IAAMC,SAAS,IAHlD,oBAGdjI,EAHc,KAGQ08B,EAHR,OAImB10B,IAAMC,UAAS,GAJlC,oBAIdm+C,EAJc,KAIAC,EAJA,OAKmCr+C,IAAMC,SAAS,MALlD,oBAKd3P,EALc,KAKQipB,EALR,OAMuBvZ,IAAMC,SAAS,IANtC,oBAMduZ,EANc,KAMEC,EANF,OAOezZ,IAAMC,UAAS,GAP9B,oBAOdyZ,EAPc,KAOFC,EAPE,OAQiB3Z,IAAMC,SAAS,MARhC,oBAQd2Z,EARc,KAQDC,EARC,OASmC7Z,IAAMC,UAAS,GATlD,oBASdq+C,EATc,KASQC,EATR,KAUfx8C,EAAU1E,KAVK,SAyBNyc,EAzBM,8EAyBrB,WAA4B3sB,GAA5B,eAAAT,EAAA,yDACIS,EAAMsW,iBACNkW,GAAc,GACdE,EAAe,MAEVukC,EALT,uBAMQvkC,EAAe,uFACfF,GAAc,GAPtB,6BAWQppB,IAAayH,EAXrB,wBAYQ6hB,EAAe,0CACfF,GAAc,GAbtB,4CAiB2B3qB,GAAe0E,kBAAkB1I,EAAUmE,EAAOoB,GAAU,GAjBvF,SAiBU5B,EAjBV,QAkBkBb,UAGV+rB,EAAelrB,EAASZ,MACxB4rB,GAAc,IAHd4kC,GAAwB,GAnBhC,6CAzBqB,sBAmDrB,SAASv7C,EAAY7V,GAAQ,IAAD,EACSA,EAAMC,OAA/BvB,EADgB,EAChBA,KAAM6F,EADU,EACVA,MAAOqoB,EADG,EACHA,QACrB,OAAQluB,GACJ,IAAK,WACD+sB,EAAYlnB,GACZ,MACJ,IAAK,uBACDgjC,EAAwBhjC,GACxB,MACJ,IAAK,eACD2sD,EAAgBtkC,GAChB,MACJ,QACI,QAhES,4CAoErB,sBAAArtB,EAAA,sDACI+sB,EAAkBppB,GAAcC,EAAsBC,IAD1D,4CApEqB,sBA8LrB,OAjLAyP,IAAMyH,WAAU,WAAM,4CAClB,4BAAA/a,EAAA,sEACmCsC,GAAemF,0BADlD,QACUmmB,EADV,QAE0BxsB,SAGlB+rB,EAAe,yCAFfN,EAAwBe,EAAiBvsB,MAHjD,4CADkB,uBAAC,WAAD,wBASlB7B,KACD,IAwKC,kBAACosB,GAAD,CAAYJ,UAAWqC,MACnB,kBAAChC,GAAA,EAAD,CAAWtZ,SAAS,KAAKuF,UAAWzC,EAAQyW,UACxC,yBAAKjT,IAAKiV,KAAahV,IAAI,iBAAiBhB,UAAWzC,EAAQlI,OA5GnEykD,EACO,KAGP,0BAAMx1C,SAAUgR,GACZ,kBAAC5U,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CAAWtb,GAAG,iBAAiBya,MAAM,YAAYoD,UAAQ,EAACvX,MAAO1G,EAAUuc,UAAQ,EAAC1b,KAAK,WAAWwZ,QAAQ,SAASgC,WAAS,KAElI,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,iBACHya,MAAM,WACN2D,KAAK,WACLiR,aAAa,eACbxR,UAAQ,EACRvX,MAAOnB,EACP4V,SAAUnD,EACVnX,KAAK,WACLuuB,OAAQ,kBAxGX,0CAwGiBC,IACdH,WAhCU,IAA1BV,EAAezpB,OACR,KAEJypB,EAAe/W,KAAI,SAAC1L,EAAGhF,GAAJ,OACtB,kBAAC,IAAMooB,SAAP,CAAgBvoB,IAAKG,GACjB,8BAAOgF,GACP,iCA2BYsO,QAAQ,SACRgC,WAAS,KAGjB,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuB,GAAA,EAAD,CACItb,GAAG,iBACHya,MAAM,mBACN2D,KAAK,WACLiR,aAAa,eACbxR,UAAQ,EACRvX,MAAOsG,EACPmO,SAAUnD,EACVnX,KAAK,uBACLwZ,QAAQ,SACRgC,WAAS,KAGjB,kBAACnC,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACuV,GAAA,EAAD,CACIC,QAAS,kBAACC,GAAA,EAAD,CAAUb,QAASqkC,EAAcj4C,SAAUnD,EAAanX,KAAK,eAAe2N,MAAM,YAC3FqM,MACI,6DACiC,IAC7B,uBAAGgV,KAAK,QAAQztB,OAAO,UAAvB,oBAEK,IAJT,MAKQ,IACJ,uBAAGytB,KAAK,WAAWztB,OAAO,UAA1B,sBAOhB,kBAAC8X,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAACmC,KAAK,SAASjC,SAAUmS,EAAYrU,QAAQ,YAAY7L,MAAM,WAAhF,aAIJ,kBAAC0L,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC,GAAD,CAAOnI,OAAO,wBAAwBJ,KAAMgd,OAQvD0kC,EAID,kBAACp5C,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYE,cAAY,EAACD,QAAQ,KAAKsI,MAAM,UAA5C,yBAGA,kBAACvI,GAAA,EAAD,CAAYE,cAAY,EAACqI,MAAM,UAA/B,2IAIJ,kBAACzI,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,QAAQsI,MAAM,UAAlC,iCAIJ,kBAACzI,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYyM,UAAU,IAAIgJ,KAAK,6DAA6DlN,MAAM,SAASnJ,UAAWzC,EAAQo8C,WAC1H,yBAAK34C,IAAI,YAAYD,IAAKi5C,QAE9B,kBAACp5C,GAAA,EAAD,CAAYyM,UAAU,IAAIgJ,KAAK,sEAAsElN,MAAM,SAASnJ,UAAWzC,EAAQo8C,WACnI,yBAAK34C,IAAI,cAAcD,IAAKk5C,SAGpC,kBAACv5C,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQG,WAAS,EAAChC,QAAQ,YAAYwM,UAAWC,KAAMC,GAAG,SAASvY,MAAM,WAAzE,iBA1BD,UC9Lb6D,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnC1D,KAAM,CACF0U,aAAc,GACdtP,SAAU,QAEdk/C,UAAU,cACNh/C,QAAS,eACTjB,MAAO,MACP,QAAS,CACLE,gBAAiB,kCACjBE,UAAW,kCACX+P,aAAc,GACdpP,SAAU,IACV4N,OAAQ,IAEXtP,EAAMK,YAAYC,KAAK,MAAQ,CAC5BK,MAAO,aAKJ,SAASwgD,KACpB,IAAM38C,EAAU1E,KAEhB,OACI,kBAACib,GAAD,CAAYJ,UAAWqC,MACnB,kBAAChC,GAAA,EAAD,CAAWtZ,SAAS,MAChB,yBAAKsG,IAAKiV,KAAahV,IAAI,iBAAiBhB,UAAWzC,EAAQlI,OAC/D,kBAACqL,GAAA,EAAD,CAAMiD,WAAS,EAACC,QAAS,GACrB,kBAAClD,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYE,cAAY,EAACqI,MAAM,UAA/B,uFAIJ,kBAACzI,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYC,QAAQ,QAAQsI,MAAM,UAAlC,+CAIJ,kBAACzI,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAACC,GAAA,EAAD,CAAYyM,UAAU,IAAIgJ,KAAK,6DAA6DlN,MAAM,SAASnJ,UAAWzC,EAAQo8C,WAC1H,yBAAK34C,IAAI,YAAYD,IAAKi5C,QAE9B,kBAACp5C,GAAA,EAAD,CAAYyM,UAAU,IAAIgJ,KAAK,sEAAsElN,MAAM,SAASnJ,UAAWzC,EAAQo8C,WACnI,yBAAK34C,IAAI,cAAcD,IAAKk5C,SAGpC,kBAACv5C,GAAA,EAAD,CAAMzG,MAAI,EAAC0G,GAAI,IACX,kBAAC+B,GAAA,EAAD,CAAQ2K,UAAWC,KAAMC,GAAG,SAAS1M,QAAQ,YAAY7L,MAAM,UAAU6N,WAAS,GAAlF,qBC/CxB,IAAMhK,GAAYC,cAAW,SAAAC,GAAK,MAAK,CACnCsuB,QAAQ,cACJ1tB,QAAS,aACRZ,EAAMK,YAAYC,KAAK,MAAQ,CAC5BM,QAAS,SAsErB,IAQe2Q,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAzEf,SAA4BnS,GAAQ,IACxBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YADiB,EAEGnP,IAAMC,SAAS,IAFlB,oBAExB4jB,EAFwB,KAEb83B,EAFa,OAGO37C,IAAMC,SAAS,MAHtB,oBAGxBuQ,EAHwB,KAGXC,EAHW,OAIDzQ,IAAMC,SAAS,MAJd,oBAIxBsB,EAJwB,KAIfC,EAJe,OAKDxB,IAAMC,UAAS,GALd,oBAKxBf,EALwB,KAKfuC,EALe,KAMzBM,EAAU1E,KAEVshD,EAAmB3+C,IAAMiC,YAAN,sBAAkB,8BAAAvV,EAAA,6DACvC+U,GAAW,GAD4B,SAEhB+lC,GAAmBO,gBAAgBhxB,EAAKjsB,WAFxB,QAEjC6D,EAFiC,QAG1Bb,SACT0T,EAAW7S,EAASZ,QAEd81B,EADH,aACmBl1B,EAASZ,OACrB4hC,MAAK,SAACjjC,EAAGwG,GAAJ,OAAUxG,EAAEtB,GAAK8H,EAAE9H,MAClCuwD,EAAa93B,IAEjBpiB,GAAW,GAV4B,2CAWxC,CAACsV,IAqCJ,OAlCA/W,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUiyD,IADV,4CAPkB,sBAGblvC,GAAoB4H,GACrB5G,EAAe,UAJD,mCAUlBvkB,KACD,CAAC6qB,EAAM4nC,IAGV3+C,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAiBb,yBAAK3K,UAAWzC,EAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASA,IACzB,kBAAC,GAAD,CAAOtC,KAAM2E,IACb,4BAAKsiB,EAAUphB,KAlBvB,SAA2BmhC,GAAW,IAC1Bx4C,EAAuBw4C,EAAvBx4C,GAAI+P,EAAmByoC,EAAnBzoC,MAAOmpC,EAAYV,EAAZU,QACnB,OACI,wBAAI1yC,IAAKxG,EAAIoZ,UAAWzC,EAAQtD,MAC5B,+BAAKrT,GADT,MACoB+P,EAChB,4BACKmpC,EAAQ7hC,KAAI,SAAA1L,GAAC,OACV,wBAAInF,IAAKmF,EAAE3L,IAAK2L,EAAEoE,oB,UC3DpCkC,GAAYC,cAAW,iBAAO,CAChCshD,SAAU,CACN,QAAS,CACLt5B,aAAc,QAElB,SAAU,CACN7rB,gBAAiBL,SAoC7B,IAQe0V,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EAvCf,YAAqF,IAAxD+vC,EAAuD,EAAvDA,UAAWC,EAA4C,EAA5CA,eAAgBC,EAA4B,EAA5BA,WAAYC,EAAgB,EAAhBA,aAAgB,EACxDh/C,IAAMC,UAAS,GADyC,oBACzElT,EADyE,KACnEkyD,EADmE,KAE1El9C,EAAU1E,KAEhB,OACI,kBAAC,IAAM8c,SAAP,KACI,kBAACqR,GAAA,EAAD,CAAUhnB,UAAS,UAAKzC,EAAQ68C,SAAb,YAAyB7xD,EAAO,QAAU,KACzD,kBAAC0+B,GAAA,EAAD,CAAWjnB,UAAU,YACjB,kBAACoE,GAAA,EAAD,CAAY+K,aAAW,aAAaY,KAAK,QAAQhQ,QAAS,kBAAM06C,GAASlyD,IAAOwa,SAAUvZ,GAAkBgxD,IAAyC,IAAxBA,EAAajvD,QACpIhD,EAAiB,kBAACggD,GAAA,EAAD,MAAV,kBAAClc,GAAA,EAAD,QAGhBguB,GAEL,kBAACrzB,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,CAAWhnB,MAAO,CAAEtG,QAAS,GAAKwtB,QAASmzB,EAAiB,GACxD,kBAACI,GAAA,EAAD,CAAUC,GAAIpyD,EAAMqyD,QAAS,EAAGC,eAAa,GACzC,kBAAC7sC,GAAA,EAAD,MACA,kBAACirC,GAAA,EAAD,CAAKh5C,MAAO,CAAEtG,QAAS,KACnB,kBAACiH,GAAA,EAAD,CAAYC,QAAQ,YAAYC,cAAY,EAACuM,UAAU,OACnD,2BAAIktC,IAEPC,U,UC5BvB3hD,GAAYC,cAAW,iBAAO,CAChCuuB,QAAS,CACLluB,UAAW,SAEf8rB,MAAO,CACH9rB,UAAW,QACX,OAAQ,CACJkf,WAAY,QAEhB,cAAe,CACXle,aAAc,IAGtB2gD,KAAM,CACF,uBAAwB,CACpB,gBAAiB,CACb,QAAS,CACL/5B,OAAQ,eAmO5B,IAQezW,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EApOf,SAA2BnS,GAAQ,IACvBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YADgB,EAEH3c,KAAYwoB,MAAMre,EAAM/J,SAASqoB,QAApDhwB,EAFsB,EAEtBA,OAAQF,EAFc,EAEdA,OAFc,EAGIiV,IAAMC,SAAS,IAHnB,oBAGvB4jB,EAHuB,KAGZ83B,EAHY,OAIM37C,IAAMC,SAAS,IAJrB,oBAIvBE,EAJuB,KAIXC,EAJW,OAKQJ,IAAMC,SAAS,MALvB,oBAKvBuQ,EALuB,KAKVC,EALU,OAMAzQ,IAAMC,SAAS,MANf,oBAMvBsB,EANuB,KAMdC,EANc,OAOAxB,IAAMC,UAAS,GAPf,oBAOvBf,EAPuB,KAOduC,EAPc,OASEzB,IAAMC,SAAS,iBATjB,oBASvB8uB,EATuB,KASbC,EATa,OAUchvB,IAAMC,SAAS,QAV7B,oBAUvBgvB,EAVuB,KAUPC,EAVO,KAYxBntB,EAAU1E,KAEVkiD,EAAuBv/C,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACpBs3B,GAAqBY,oBAAoB7N,EAAKjsB,UAAWG,EAAQF,GAD7C,QACrC4D,EADqC,QAE9Bb,SACT0T,EAAW7S,EAASZ,MAEpB4tD,EAAahtD,EAASZ,MALiB,2CAO5C,CAACgpB,EAAM9rB,EAAQF,IAEZmX,EAAiBlC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACdoO,GAAoBC,cAAcgc,EAAKjsB,WADzB,QAC/B6D,EAD+B,QAExBb,SACT0T,EAAW7S,EAASZ,MAEpBqS,EAAczR,EAASZ,MALU,2CAOtC,CAACgpB,IAGJ/W,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUC,QAAQ6wD,IAAI,CAAC+B,IAAwBr9C,MAD/C,4CAPkB,sBAGbuN,GAAoB4H,GACrB5G,EAAe,UAMnBhP,GAAW,GAVO,0CAWlBvV,GAAO0B,MAAK,kBAAM6T,GAAW,QAC9B,CAACsV,EAAMwoC,EAAsBr9C,IAGhClC,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAEjB,IAAM6gB,EAAmBhwB,IAAMiC,aAC3B,SAAAguB,GACQA,IAAYlB,GAQhBC,EAAYiB,GACZf,EAAkB,SAPVA,EADmB,SAAnBD,EACkB,MAEA,UAO9B,CAACF,EAAUE,EAAgBC,EAAmBF,IAYlD,SAASwwB,EAAuB9yD,EAAGwG,GAC/B,IAAMG,EAAQosD,OAAO/yD,EAAEtB,IACjBkI,EAAQmsD,OAAOvsD,EAAE9H,IACvB,OAAIkI,EAAQD,GACA,EAERC,EAAQD,EACD,EAEJ,EAyDX,SAASqsD,EAAiB9b,GAAW,IACzBx4C,EAAkHw4C,EAAlHx4C,GAAI+P,EAA8GyoC,EAA9GzoC,MAAOkmC,EAAuGuC,EAAvGvC,cAAese,EAAwF/b,EAAxF+b,kBAAmBve,EAAqEwC,EAArExC,oBAAqBG,EAAgDqC,EAAhDrC,qBAAsBqe,EAA0Bhc,EAA1Bgc,sBAChG,OACI,kBAAC,GAAD,CACIhuD,IAAKxG,EACLyzD,UACI,oCACI,kBAACpzB,GAAA,EAAD,SAAargC,GACb,kBAACqgC,GAAA,EAAD,KAAYtwB,GACZ,kBAACswB,GAAA,EAAD,CAAW9d,MAAM,UAAU0zB,GAC3B,kBAAC5V,GAAA,EAAD,CAAW9d,MAAM,UAAUgyC,GAC3B,kBAACl0B,GAAA,EAAD,CAAW9d,MAAM,UAAUyzB,GAC3B,kBAAC3V,GAAA,EAAD,CAAW9d,MAAM,SAASzb,GAAkBqvC,EAAsB,GAAlE,MAGRud,eAAgB,EAChBC,WAAW,cACXC,aACI,kBAACxpC,GAAA,EAAD,CAAMnQ,QAAQ,WAAWb,UAAWzC,EAAQu9C,MACxC,kBAACh0B,GAAA,EAAD,CAAO/W,KAAK,QAAQZ,aAAW,aAC3B,kBAAC4X,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,cACA,kBAACA,GAAA,EAAD,CAAW9d,MAAM,UAAjB,kBACA,kBAAC8d,GAAA,EAAD,CAAW9d,MAAM,UAAjB,mBACA,kBAAC8d,GAAA,EAAD,CAAW9d,MAAM,UAAjB,qBACA,kBAAC8d,GAAA,EAAD,CAAW9d,MAAM,SAAjB,wBAGR,kBAAC+d,GAAA,EAAD,KACKk0B,EAAsBn9C,KAAI,SAACqqB,EAAW/6B,GAAZ,eACvB,kBAACy5B,GAAA,EAAD,CAAU55B,IAAKG,GACX,kBAAC05B,GAAA,EAAD,yBAAYtrB,EAAWiiB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAO0hC,EAAU3xB,gBAApD,aAAY,EAAgDtP,YAA5D,QAAoE,WACpE,kBAAC4/B,GAAA,EAAD,CAAW9d,MAAM,UAAUmf,EAAUuU,eACrC,kBAAC5V,GAAA,EAAD,CAAW9d,MAAM,UAAUmf,EAAU6yB,mBACrC,kBAACl0B,GAAA,EAAD,CAAW9d,MAAM,UAAUmf,EAAUsU,qBACrC,kBAAC3V,GAAA,EAAD,CAAW9d,MAAM,SAASzb,GAAkB46B,EAAUyU,qBAAsB,GAA5E,cAuBpC,OACI,yBAAK/8B,UAAWzC,EAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASA,IACzB,kBAAC,GAAD,CAAOtC,KAAM2E,IACb,kBAACmM,GAAA,EAAD,CAAO6oB,QAAM,GACT,kBAAClL,GAAA,EAAD,CAAgB7mB,UAAWzC,EAAQ0nB,OAC/B,kBAAC6B,GAAA,EAAD,CAAO8F,cAAY,EAAC7c,KAAK,SArHjC,kBAACgX,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,CAAWjnB,UAAU,YACjB,kBAACq7C,GAAA,EAAD,CAAUp7C,MAAO,CAAEjG,UAAW,MAElC,kBAACitB,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,OAAbvC,EAAmBha,UAAwB,OAAbga,EAAoBE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,QAAnI,oBAIJ,kBAACvE,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,UAAbvC,EAAsBha,UAAwB,UAAbga,EAAuBE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,WAAzI,UAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CAAgBC,OAAqB,kBAAbvC,EAA8Bha,UAAwB,kBAAbga,EAA+BE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,mBAAzJ,mBAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,sBAAbvC,EACRha,UAAwB,sBAAbga,EAAmCE,EAAiB,OAC/D1qB,QAAS,kBAAMyrB,EAAiB,uBAHpC,oBAQJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,wBAAbvC,EACRha,UAAwB,wBAAbga,EAAqCE,EAAiB,OACjE1qB,QAAS,kBAAMyrB,EAAiB,yBAHpC,sBAQJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,SACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,yBAAbvC,EACRha,UAAwB,yBAAbga,EAAsCE,EAAiB,OAClE1qB,QAAS,kBAAMyrB,EAAiB,0BAHpC,yBAgFA,kBAACtE,GAAA,EAAD,KApBpB,WAAsB,IAAD,EACXo0B,EA3HV,SAAuBC,EAAO5sD,GAC1B,OAAQA,GACJ,IAAK,KACD,MAAiB,SAAV4sD,EAAmB,SAACrzD,EAAGwG,GAAJ,OAAUssD,EAAuB9yD,EAAGwG,IAAK,SAACxG,EAAGwG,GAAJ,OAAWssD,EAAuB9yD,EAAGwG,IAC5G,QACI,MAAiB,SAAV6sD,EAAmB,SAACrzD,EAAGwG,GAAJ,OAAUD,GAAqBvG,EAAGwG,EAAGC,IAAW,SAACzG,EAAGwG,GAAJ,OAAWD,GAAqBvG,EAAGwG,EAAGC,KAsHrG6sD,CAAc/wB,EAAgBF,GAEjD,wBACIlL,QADJ,IACIA,OADJ,EACIA,EACM8L,MAAK,SAACjjC,EAAGwG,GACP,OAAO4sD,EAAWpzD,EAAGwG,EAAG67B,MAE3BtsB,IAAIi9C,UALb,QAKkC,qCAYNO,WC/O9B5iD,GAAYC,cAAW,iBAAO,CAChCuuB,QAAS,CACLluB,UAAW,SAEf8rB,MAAO,CACH9rB,UAAW,QACX,OAAQ,CACJkf,WAAY,aAwJxB,IAQe/N,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EA3Jf,SAA6BnS,GAAQ,IAAD,EACxBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YACNlkB,EAAWuH,KAAYwoB,MAAMre,EAAM/J,SAASqoB,QAA5ChwB,OAFwB,EAGM+U,IAAMC,SAAS,IAHrB,oBAGzB2lB,EAHyB,KAGZg2B,EAHY,OAIM57C,IAAMC,SAAS,MAJrB,oBAIzBuQ,EAJyB,KAIZC,EAJY,OAKFzQ,IAAMC,SAAS,MALb,oBAKzBsB,EALyB,KAKhBC,EALgB,OAMFxB,IAAMC,UAAS,GANb,oBAMzBf,EANyB,KAMhBuC,EANgB,OAQAzB,IAAMC,SAAS,iBARf,oBAQzB8uB,EARyB,KAQfC,EARe,OASYhvB,IAAMC,SAAS,QAT3B,oBASzBgvB,EATyB,KASTC,EATS,KAW1BntB,EAAU1E,KAEV6iD,EAAyBlgD,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACtBs3B,GAAqBa,sBAAsB9N,EAAKjsB,UAAWG,GADrC,QACvC0D,EADuC,QAEhCb,SACT0T,EAAW7S,EAASZ,MAEpB6tD,EAAejtD,EAASZ,MALiB,2CAO9C,CAACgpB,EAAM9rB,IAGV+U,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUwzD,IADV,4CAPkB,sBAGbzwC,GAAoB4H,GACrB5G,EAAe,UAMnBhP,GAAW,GAVO,0CAWlBvV,GAAO0B,MAAK,kBAAM6T,GAAW,QAC9B,CAACsV,EAAMmpC,IAGVlgD,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAEjB,IAAM6gB,EAAmBhwB,IAAMiC,aAC3B,SAAAguB,GACQA,IAAYlB,GAQhBC,EAAYiB,GACZf,EAAkB,SAPVA,EADmB,SAAnBD,EACkB,MAEA,UAO9B,CAACF,EAAUE,EAAgBC,EAAmBF,IAoElD,OACI,yBAAKxqB,UAAWzC,EAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASA,IACzB,kBAAC,GAAD,CAAOtC,KAAM2E,IACb,kBAACmM,GAAA,EAAD,CAAO6oB,QAAM,GACT,kBAAClL,GAAA,EAAD,CAAgB7mB,UAAWzC,EAAQ0nB,OAC/B,kBAAC6B,GAAA,EAAD,CAAO8F,cAAY,EAAC7c,KAAK,SArEjC,kBAACgX,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,UAAbvC,EAAsBha,UAAwB,UAAbga,EAAuBE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,WAAzI,eAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CAAgBC,OAAqB,kBAAbvC,EAA8Bha,UAAwB,kBAAbga,EAA+BE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,mBAAzJ,6BAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,sBAAbvC,EACRha,UAAwB,sBAAbga,EAAmCE,EAAiB,OAC/D1qB,QAAS,kBAAMyrB,EAAiB,uBAHpC,oBAQJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,wBAAbvC,EACRha,UAAwB,wBAAbga,EAAqCE,EAAiB,OACjE1qB,QAAS,kBAAMyrB,EAAiB,yBAHpC,sBAQJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CAAgBC,OAAqB,gBAAbvC,EAA4Bha,UAAwB,gBAAbga,EAA6BE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,iBAArJ,uBAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,SACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,yBAAbvC,EACRha,UAAwB,yBAAbga,EAAsCE,EAAiB,OAClE1qB,QAAS,kBAAMyrB,EAAiB,0BAHpC,iBAmCA,kBAACtE,GAAA,EAAD,sBACK9F,QADL,IACKA,OADL,EACKA,EACK+J,MAAK,SAACjjC,EAAGwG,GACP,MAA0B,SAAnB+7B,EAA4Bh8B,GAAqBvG,EAAGwG,EAAG67B,IAAa97B,GAAqBvG,EAAGwG,EAAG67B,MAEzGtsB,KA3B7B,SAA4BmhC,GAAW,IAC3Bx4C,EAAwGw4C,EAAxGx4C,GAAI+P,EAAoGyoC,EAApGzoC,MAAOkmC,EAA6FuC,EAA7FvC,cAAese,EAA8E/b,EAA9E+b,kBAAmBve,EAA2DwC,EAA3DxC,oBAAqBG,EAAsCqC,EAAtCrC,qBAAsB4e,EAAgBvc,EAAhBuc,YAChG,OACI,kBAAC30B,GAAA,EAAD,CAAU55B,IAAKxG,GACX,kBAACqgC,GAAA,EAAD,KAAYtwB,GACZ,kBAACswB,GAAA,EAAD,CAAW9d,MAAM,UAAU0zB,GAC3B,kBAAC5V,GAAA,EAAD,CAAW9d,MAAM,UAAUgyC,GAC3B,kBAACl0B,GAAA,EAAD,CAAW9d,MAAM,UAAUyzB,GAC3B,kBAAC3V,GAAA,EAAD,CAAW9d,MAAM,UAAUwyC,GAC3B,kBAAC10B,GAAA,EAAD,CAAW9d,MAAM,SAASzb,GAAkBqvC,EAAsB,GAAlE,gBAaQ,QAKoC,6CCrJtDlkC,GAAYC,cAAW,iBAAO,CAChCuuB,QAAS,CACLluB,UAAW,SAEf8rB,MAAO,CACH9rB,UAAW,QACX,OAAQ,CACJkf,WAAY,aA2LxB,IAQe/N,iBARS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCC,YAAa,SAAAphB,GAAI,OAAImhB,EAASle,aAAKjD,QAGxB+gB,EA9Lf,SAA4BnS,GAAQ,IACxBoa,EAAsBpa,EAAtBoa,KAAM5H,EAAgBxS,EAAhBwS,YACNlkB,EAAWuH,KAAYwoB,MAAMre,EAAM/J,SAASqoB,QAA5ChwB,OAFuB,EAGa+U,IAAMC,SAAS,IAH5B,oBAGxBmgD,EAHwB,KAGRC,EAHQ,OAIKrgD,IAAMC,SAAS,IAJpB,oBAIxBE,EAJwB,KAIZC,EAJY,OAKOJ,IAAMC,SAAS,MALtB,oBAKxBuQ,EALwB,KAKXC,EALW,OAMDzQ,IAAMC,SAAS,MANd,oBAMxBsB,EANwB,KAMfC,EANe,OAODxB,IAAMC,UAAS,GAPd,oBAOxBf,EAPwB,KAOfuC,EAPe,OASCzB,IAAMC,SAAS,iBAThB,oBASxB8uB,EATwB,KASdC,EATc,OAUahvB,IAAMC,SAAS,QAV5B,oBAUxBgvB,EAVwB,KAURC,EAVQ,KAWzBntB,EAAU1E,KAEVijD,EAAwBtgD,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACrBs3B,GAAqBc,sBAAsB/N,EAAKjsB,UAAWG,GADtC,QACtC0D,EADsC,QAE/Bb,SACT0T,EAAW7S,EAASZ,MAEpBsyD,EAAkB1xD,EAASZ,MALa,2CAO7C,CAACgpB,EAAM9rB,IAEJiX,EAAiBlC,IAAMiC,YAAN,sBAAkB,4BAAAvV,EAAA,sEACdoO,GAAoBC,cAAcgc,EAAKjsB,WADzB,QAC/B6D,EAD+B,QAExBb,SACT0T,EAAW7S,EAASZ,MAEpBqS,EAAczR,EAASZ,MALU,2CAOtC,CAACgpB,IAGJ/W,IAAMyH,WAAU,WAAM,IAEVgI,EAAiCsH,EAAjCtH,gBAAiB4H,EAAgBN,EAAhBM,YAFP,4CAOlB,sBAAA3qB,EAAA,sEACUC,QAAQ6wD,IAAI,CAAC8C,IAAyBp+C,MADhD,4CAPkB,sBAGbuN,GAAoB4H,GACrB5G,EAAe,UAMnBhP,GAAW,GAVO,0CAWlBvV,GAAO0B,MAAK,kBAAM6T,GAAW,QAC9B,CAACsV,EAAMupC,EAAuBp+C,IAGjClC,IAAMyH,WAAU,WACPzZ,GAAkBwiB,IACnBrB,EAAYqB,KAEjB,CAACA,EAAarB,IAEjB,IAAM6gB,EAAmBhwB,IAAMiC,aAC3B,SAAAguB,GACQA,IAAYlB,GAQhBC,EAAYiB,GACZf,EAAkB,SAPVA,EADmB,SAAnBD,EACkB,MAEA,UAO9B,CAACF,EAAUE,EAAgBC,EAAmBF,IAYlD,SAASuxB,EAA0B7zD,EAAGwG,GAAI,IAAD,QAC/BG,EAAK,oBAAG8M,EAAWiiB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAOsB,EAAEyO,gBAAnC,aAAG,EAAwCtP,YAA3C,QAAmD,UACxDyH,EAAK,oBAAG6M,EAAWiiB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAO8H,EAAEiI,gBAAnC,aAAG,EAAwCtP,YAA3C,QAAmD,UAC9D,OAAIyH,EAAQD,GACA,EAERC,EAAQD,EACD,EAEJ,EAsDX,SAASmtD,EAAmB5c,GAAW,IAAD,IAC1Bx4C,EAAwGw4C,EAAxGx4C,GAAI+P,EAAoGyoC,EAApGzoC,MAAOkmC,EAA6FuC,EAA7FvC,cAAese,EAA8E/b,EAA9E+b,kBAAmBve,EAA2DwC,EAA3DxC,oBAAqBG,EAAsCqC,EAAtCrC,qBAAsB4e,EAAgBvc,EAAhBuc,YAChG,OACI,kBAAC30B,GAAA,EAAD,CAAU55B,IAAKxG,GACX,kBAACqgC,GAAA,EAAD,yBAAYtrB,EAAWiiB,MAAK,SAAArrB,GAAC,OAAIA,EAAE3L,KAAO+P,YAA1C,aAAY,EAAsCtP,YAAlD,QAA0D,WAC1D,kBAAC4/B,GAAA,EAAD,CAAW9d,MAAM,UAAU0zB,GAC3B,kBAAC5V,GAAA,EAAD,CAAW9d,MAAM,UAAUgyC,GAC3B,kBAACl0B,GAAA,EAAD,CAAW9d,MAAM,UAAUyzB,GAC3B,kBAAC3V,GAAA,EAAD,CAAW9d,MAAM,UAAUwyC,GAC3B,kBAAC10B,GAAA,EAAD,CAAW9d,MAAM,SAASzb,GAAkBqvC,EAAsB,GAAlE,MAgBZ,OACI,yBAAK/8B,UAAWzC,EAAQ8pB,SACpB,kBAAC/hB,GAAD,CAAgB5K,QAASA,IACzB,kBAAC,GAAD,CAAOtC,KAAM2E,IACb,kBAACmM,GAAA,EAAD,CAAO6oB,QAAM,GACT,kBAAClL,GAAA,EAAD,CAAgB7mB,UAAWzC,EAAQ0nB,OAC/B,kBAAC6B,GAAA,EAAD,CAAO8F,cAAY,EAAC7c,KAAK,SAhFjC,kBAACgX,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAACC,GAAA,EAAD,KACI,kBAAC4F,GAAA,EAAD,CAAgBC,OAAqB,UAAbvC,EAAsBha,UAAwB,UAAbga,EAAuBE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,WAAzI,UAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CAAgBC,OAAqB,kBAAbvC,EAA8Bha,UAAwB,kBAAbga,EAA+BE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,mBAAzJ,6BAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,sBAAbvC,EACRha,UAAwB,sBAAbga,EAAmCE,EAAiB,OAC/D1qB,QAAS,kBAAMyrB,EAAiB,uBAHpC,oBAQJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,wBAAbvC,EACRha,UAAwB,wBAAbga,EAAqCE,EAAiB,OACjE1qB,QAAS,kBAAMyrB,EAAiB,yBAHpC,sBAQJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,UACb,kBAAC0jB,GAAA,EAAD,CAAgBC,OAAqB,gBAAbvC,EAA4Bha,UAAwB,gBAAbga,EAA6BE,EAAiB,OAAQ1qB,QAAS,kBAAMyrB,EAAiB,iBAArJ,uBAIJ,kBAACvE,GAAA,EAAD,CAAW9d,MAAM,SACb,kBAAC0jB,GAAA,EAAD,CACIC,OAAqB,yBAAbvC,EACRha,UAAwB,yBAAbga,EAAsCE,EAAiB,OAClE1qB,QAAS,kBAAMyrB,EAAiB,0BAHpC,iBA8CA,kBAACtE,GAAA,EAAD,KAnBpB,WAAsB,IAAD,EACXo0B,EAvFV,SAAuBC,EAAO5sD,GAC1B,OAAQA,GACJ,IAAK,QACD,MAAiB,SAAV4sD,EAAmB,SAACrzD,EAAGwG,GAAJ,OAAUqtD,EAA0B7zD,EAAGwG,IAAK,SAACxG,EAAGwG,GAAJ,OAAWqtD,EAA0B7zD,EAAGwG,IAClH,QACI,MAAiB,SAAV6sD,EAAmB,SAACrzD,EAAGwG,GAAJ,OAAUD,GAAqBvG,EAAGwG,EAAGC,IAAW,SAACzG,EAAGwG,GAAJ,OAAWD,GAAqBvG,EAAGwG,EAAGC,KAkFrG6sD,CAAc/wB,EAAgBF,GACjD,wBACIqxB,QADJ,IACIA,OADJ,EACIA,EACMzwB,MAAK,SAACjjC,EAAGwG,GACP,OAAO4sD,EAAWpzD,EAAGwG,EAAG67B,MAE3BtsB,IAAI+9C,UALb,QAKoC,qCAYRP,WC7J9BQ,G,kDACF,WAAY9jD,GAAQ,IAAD,8BACf,cAAMA,IAIV+jD,eALmB,uCAKF,WAAM/jD,GAAN,+BAAAjQ,EAAA,sEAEMT,GAAUC,OAFhB,YAEPA,EAFO,QAGJ4B,SAHI,uBAITG,QAAQ0yD,KAAKz0D,EAAK6B,MAJT,0CAQHiB,GAAeyE,kBARZ,0CASTkJ,EAAMqa,SATG,4CAaUhoB,GAAekG,sBAbzB,aAaPqC,EAbO,QAcAzJ,SAdA,wBAeTG,QAAQ0yD,KAAKppD,EAASxJ,MACtB4O,EAAMqa,SAhBG,6BAoBqDzf,EAASxJ,KAAnE/C,EApBK,EAoBLA,SAAU4N,EApBL,EAoBKA,KAAM9N,EApBX,EAoBWA,UAAWyL,EApBtB,EAoBsBA,YAAaoC,EApBnC,EAoBmCA,UAAWvN,EApB9C,EAoB8CA,GACtD4C,GAAkBhD,GAYnB2R,EAAMqa,SAXNra,EAAMqS,MAAM,CACRhkB,WACA4N,OACAye,aAAa,EACb5H,iBAAiB,EACjB3kB,YACAyL,cACAoC,YACAvN,OA9BK,4CALE,sDAEf,EAAKs1D,eAAe/jD,GAFL,E,qDA2Cf,OAAIikD,KAAKjkD,MAAMoa,KAAKM,YACT,8BAGP,kBAACE,GAAD,KACI,kBAAC,KAAD,KACI,kBAAC,KAAD,CAAOspC,OAAK,EAAC7tD,KAAK,IAAI6e,UAAWkqB,KACjC,kBAAC,KAAD,CAAO/oC,KAAK,qBAAqB6e,UAAWivC,KAC5C,kBAAC,KAAD,CAAO9tD,KAAK,SAAS6e,UAAWkvC,KAChC,kBAAC,KAAD,CAAO/tD,KAAK,UAAU6e,UAAWiJ,KACjC,kBAAC,KAAD,CAAO9nB,KAAK,YAAY6e,UAAW6sC,KACnC,kBAAC,KAAD,CAAO1rD,KAAK,SAAS6e,UAAW8a,KAChC,kBAAC,KAAD,CAAO35B,KAAK,cAAc6e,UAAWmvC,KACrC,kBAAC,KAAD,CAAOhuD,KAAK,SAAS6e,UAAW8zB,KAChC,kBAAC,KAAD,CAAO3yC,KAAK,WAAW6e,UAAWovC,KAClC,kBAAC,GAAD,CAAcjuD,KAAK,cAAc6e,UAAWqvC,GAAYtoD,KAAMlN,GAAYgsB,MAAOkpC,KAAKjkD,MAAMoa,KAAKne,OACjG,kBAAC,GAAD,CAAc5F,KAAK,0BAA0B6e,UAAWsvC,GAAoBvoD,KAAMlN,GAAYgsB,MAAOkpC,KAAKjkD,MAAMoa,KAAKne,OACrH,kBAAC,GAAD,CAAc5F,KAAK,sBAAsB6e,UAAWuvC,GAAoBxoD,KAAMlN,GAAYgsB,MAAOkpC,KAAKjkD,MAAMoa,KAAKne,OACjH,kBAAC,KAAD,CAAO5F,KAAK,qBAAqB6e,UAAWwvC,KAC5C,kBAAC,KAAD,CAAOruD,KAAK,uBAAuB6e,UAAWyvC,KAC9C,kBAAC,KAAD,CAAOtuD,KAAK,sBAAsB6e,UAAW0vC,KAC7C,kBAAC,KAAD,CAAOvuD,KAAK,iBAAiB6e,UAAW2vC,KACxC,kBAAC,KAAD,CAAOxuD,KAAK,kBAAkB6e,UAAW4vC,KACzC,kBAAC,KAAD,CAAOzuD,KAAK,kBAAkB6e,UAAW6vC,KACzC,kBAAC,KAAD,CAAO1uD,KAAK,kBAAkB6e,UAAW8vC,KACzC,kBAAC,KAAD,CAAO3uD,KAAK,qBAAqB6e,UAAWkiB,KAC5C,kBAAC,KAAD,CAAO/gC,KAAK,eAAe6e,UAAW+vC,KACtC,kBAAC,KAAD,CAAO5uD,KAAK,2BAA2B6e,UAAWgwC,KAClD,kBAAC,KAAD,CAAO7uD,KAAK,kBAAkB6e,UAAWiwC,KACzC,kBAAC,KAAD,CAAO9uD,KAAK,iBAAiB6e,UAAWkwC,KACxC,kBAAC,KAAD,CAAO/uD,KAAK,mBAAmB6e,UAAWmwC,KAC1C,kBAAC,KAAD,CAAOhvD,KAAK,mBAAmB6e,UAAWowC,KAC1C,kBAAC,KAAD,CAAOjvD,KAAK,GAAG6e,UAAWmkB,W,GA5E5Bve,aA4FH3I,iBATS,SAAAC,GAAK,MAAK,CAC9BgI,KAAMhI,EAAME,mBAGW,SAAAC,GAAQ,MAAK,CACpCF,MAAO,SAAAjhB,GAAI,OAAImhB,EAASF,GAAMjhB,KAC9BipB,OAAQ,kBAAM9H,EjE7HW,CACzB1F,KAAM,aACNzb,KAAM,SiE8HK+gB,CAA6C2xC,I,oBCzHtDyB,GAAc5tC,QACa,cAA7B7nB,OAAOmG,SAASuvD,UAEiB,UAA7B11D,OAAOmG,SAASuvD,UAEhB11D,OAAOmG,SAASuvD,SAASC,MAAM,2DAkCvC,SAASC,GAAgBC,EAAOC,GAC5BpsC,UAAUC,cACLosC,SAASF,GACT10D,MAAK,SAAA60D,GACFA,EAAaC,cAAgB,WACzB,IAAMC,EAAmBF,EAAaG,WACd,MAApBD,IAGJA,EAAiBE,cAAgB,WACE,cAA3BF,EAAiB5zC,QACboH,UAAUC,cAAc0sC,YAIxB70D,QAAQc,IAAI,iHAGRwzD,GAAUA,EAAOQ,UACjBR,EAAOQ,SAASN,KAMpBx0D,QAAQc,IAAI,sCAGRwzD,GAAUA,EAAOS,WACjBT,EAAOS,UAAUP,WAOxCltD,OAAM,SAAArH,GACHD,QAAQC,MAAM,4CAA6CA,M,qECxFjE+0D,GAAqB,CACvB73D,GAAI,KACJqkB,iBAAiB,EACjBzkB,SAAU,GACV4N,KAAM,GACNye,aAAa,EACbvsB,UAAW,KACXyL,YAAa,KACboC,UAAW,IAuBAsW,GApBQ,WAAyC,IAAxCF,EAAuC,uDAA/Bk0C,GAAoBC,EAAW,uCAC3D,OAAQA,EAAO15C,MACX,IAAK,YACD,OAAO3Z,OAAOszD,OAAO,GAAIp0C,EAAOm0C,EAAOn1D,MAC3C,IAAK,aACD,OAAO8B,OAAOszD,OAAO,GAAIp0C,EAAO,CAC5B3jB,GAAI,KACJqkB,iBAAiB,EACjBzkB,SAAU,GACV4N,KAAM,GACNye,aAAa,EACbvsB,UAAW,KACXyL,YAAa,KACboC,UAAW,KAEnB,QACI,OAAOoW,IC3Bbq0C,GAAuB,GAqBd33D,GAnBO,WAA2C,IAA1CsjB,EAAyC,uDAAjCq0C,GAAsBF,EAAW,uCAC5D,OAAQA,EAAO15C,MACX,IAAK,YACD,MAAM,CAAE05C,EAAOzkD,MAAf,oBAAwBsQ,IAC5B,IAAK,aACD,MAAM,GAAN,oBAAWm0C,EAAOl7C,OAAlB,aAA4B+G,IAChC,IAAK,eACD,OAAOA,EAAMtM,KAAI,SAAA1L,GAAC,OAAKA,EAAE3L,KAAO83D,EAAO93D,GAAhB,aAAuBi4D,cAAc,GAAStsD,GAAMA,KAC/E,IAAK,mBACD,OAAOgY,EAAMtM,KAAI,SAAA1L,GACb,OAAO,aAAEssD,cAAc,GAAStsD,MAExC,IAAK,mBACD,OAAOqsD,GACX,QACI,OAAOr0C,I,yBCjB8HtiB,c,mBAAA,GAAQgG,e,cAAR,GAAiBsc,a,UAAS,GAAnKovB,G,GAAAA,gBAAiBO,G,GAAAA,WAAYK,G,GAAAA,WAAYG,G,GAAAA,uBAAwBokB,G,GAAAA,0BAA2BjkB,G,GAAAA,oBAAqBG,G,GAAAA,oBAEnH+jB,GAA0B,CAC5B9mB,kBAAiB,OAAEyC,SAAF,IAAEA,MAA0B,GAC7CxC,qBAAoB,OAAE4mB,SAAF,IAAEA,MAA6B,GACnD3mB,eAAc,OAAE0C,SAAF,IAAEA,MAAuB,GACvCzC,eAAc,OAAE4C,SAAF,IAAEA,MAAuB,GACvC/oC,MAAK,OAAEioC,SAAF,IAAEA,MAAc,GACrB7B,UAAS,OAAEkC,SAAF,IAAEA,MAAc,GACzB5+B,WAAU,OAAEg+B,SAAF,IAAEA,MAAmB,IAG7BqlB,GAAwB,CAC1B/mB,kBAAmB,GACnBC,qBAAsB,GACtBC,eAAgB,GAChBC,eAAgB,GAChBnmC,MAAO,GACPomC,UAAW,GACX18B,WAAY,IA4BD47B,GAzBG,WAA8C,IAA7ChtB,EAA4C,uDAApCw0C,GAAyBL,EAAW,uCAC3D,OAAQA,EAAO15C,MACX,IAAK,yBACD,OAAO,2BAAKuF,GAAZ,IAAmB0tB,kBAAmBymB,EAAOl7C,QACjD,IAAK,sBACD,OAAO,2BAAK+G,GAAZ,IAAmB4tB,eAAe,2BAAM5tB,EAAM4tB,gBAAmBumB,EAAOl7C,SAC5E,IAAK,sBACD,OAAO,2BAAK+G,GAAZ,IAAmB6tB,eAAe,2BAAM7tB,EAAM6tB,gBAAmBsmB,EAAOl7C,SAC5E,IAAK,4BACD,OAAO,2BAAK+G,GAAZ,IAAmB2tB,qBAAqB,2BAAM3tB,EAAM2tB,sBAAyBwmB,EAAOl7C,SACxF,IAAK,YACD,OAAO,2BAAK+G,GAAZ,IAAmBtY,MAAOysD,EAAOl7C,QACrC,IAAK,iBACD,OAAO,2BAAK+G,GAAZ,IAAmB8tB,UAAWqmB,EAAOl7C,QACzC,IAAK,kBACD,OAAO,2BAAK+G,GAAZ,IAAmB5O,WAAY+iD,EAAOl7C,QAC1C,IAAK,mBACD,OAAOw7C,GACX,IAAK,aACD,OAAOD,GACX,QACI,OAAOx0C,IC3CX2vB,I,sBAAejyC,c,mBAAA,GAAQgG,e,cAAR,GAAiBsc,a,UAAS,IAAzC2vB,WAEF+kB,GAAsB,CACxBhtD,MAAK,OAAEioC,SAAF,IAAEA,MAAc,IAcViH,GAXD,WAA0C,IAAzC52B,EAAwC,uDAAhC00C,GAAqBP,EAAW,uCACnD,OAAQA,EAAO15C,MACX,IAAK,YACD,OAAO,2BAAKuF,GAAZ,IAAmBtY,MAAOysD,EAAOl7C,QACrC,IAAK,aACD,OAAOy7C,GACX,QACI,OAAO10C,ICbXgwB,I,sBAAetyC,c,mBAAA,GAAQgG,e,cAAR,GAAiBsc,a,UAAS,IAAzCgwB,WAEF2kB,GAAsB,CACxBl7B,MAAK,OAAEuW,SAAF,IAAEA,MAAc,IAcVpS,GAXD,WAA0C,IAAzC5d,EAAwC,uDAAhC20C,GAAqBR,EAAW,uCACnD,OAAQA,EAAO15C,MACX,IAAK,YACD,OAAO,2BAAKuF,GAAZ,IAAmByZ,MAAO06B,EAAOl7C,QACrC,IAAK,aACD,OAAO07C,GACX,QACI,OAAO30C,ICRNtc,GAAUkxD,e,wBCOjBC,GDLS,SAAwBC,GACnC,IEAWpxD,EFMX,OANcqxD,cEAHrxD,EFCSA,GEApBsxD,aAAgB,CACZC,OAAQC,aAAcxxD,GACtBwc,kBACAxjB,iBACAswC,aACA4J,SACAhZ,YFLAk3B,EACAK,aAAQC,aAAgBC,aAAiB3xD,OCCnC4xD,GACRC,GAAcxhD,SAASsK,eAAe,QACtC7P,GAAQgnD,aAAe,CACzBC,WAAY,CACRC,WAAY,gDACZv2C,SAAU,GACVw2C,gBAAiB,IACjBC,kBAAmB,IACnBC,iBAAkB,IAClBC,YAAa,CACTrrD,MAAOJ,IAEX0rD,MAAO,CACHtrD,MAAOJ,IAEX2rD,MAAO,CACHvrD,MAAOJ,KAGfozB,QAAS,CACL3nB,QAAS,CACLmgD,KAAM5rD,IAEV05B,UAAW,CACPkyB,KAAM5rD,GACN6rD,aAAc7rD,KAGtBhJ,OAAQ,CACJ80D,OAAQ,OAEZvoD,MAAO,CACHwoD,UAAW,CACPC,kBAAkB,MAK9BC,KAASztC,OACL,kBAAC,KAAD,CAAkBra,MAAOA,IACrB,kBAACkW,GAAA,EAAD,MACA,kBAAC,KAAD,CAAUmwC,MAAOA,IACb,kBAAC,KAAD,CAAiBnxD,QAASA,IACtB,kBAAC,GAAD,SAIZ6xD,IPvCW,SAAkB/B,GAC7B,GAA6C,kBAAmBpsC,UAAW,CAGvE,GADkB,IAAI8R,IAAIq9B,GAAwB74D,OAAOmG,SAASioB,MACpD0qC,SAAW94D,OAAOmG,SAAS2yD,OAIrC,OAGJ94D,OAAO+4D,iBAAiB,QAAQ,WAC5B,IAAMlD,EAAK,UAAMgD,GAAN,sBAEPpD,KA0DhB,SAAiCI,EAAOC,GAEpCl2D,MAAMi2D,GACD10D,MAAK,SAAAe,GAEF,IAAM0G,EAAc1G,EAASC,QAAQH,IAAI,gBACjB,MAApBE,EAASyB,QAAkC,MAAfiF,IAA8D,IAAvCA,EAAYowD,QAAQ,cAEvEtvC,UAAUC,cAAcsvC,MAAM93D,MAAK,SAAA60D,GAC/BA,EAAalsC,aAAa3oB,MAAK,WAC3BnB,OAAOmG,SAAS8jB,eAKxB2rC,GAAgBC,EAAOC,MAG9BhtD,OAAM,WACHtH,QAAQc,IAAI,oEA3ER42D,CAAwBrD,EAAOC,GAI/BpsC,UAAUC,cAAcsvC,MAAM93D,MAAK,WAC/BK,QAAQc,IAAI,iHAIhBszD,GAAgBC,EAAOC,OOiBvCqD,I,mBE9DAt7D,EAAOC,QAAU,IAA0B,0C,mBCA3CD,EAAOC,QAAU,IAA0B,oC,iBCA3CD,EAAOC,QAAU,29I","file":"static/js/main.9693f70e.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","import { isNullOrUndefined, generateResponse } from './Utils';\r\n\r\nexport const IndexedDB = {\r\n init,\r\n add,\r\n remove,\r\n fetch,\r\n};\r\n\r\nvar db;\r\nvar dbInitalised = false;\r\nconst dbName = 'SentiniMarine-AdminPortal-IndexedDB';\r\nconst dbVersion = 1;\r\n\r\nconst hasIndexedDB = () => 'indexedDB' in window;\r\n\r\nasync function init() {\r\n return new Promise(resolve => {\r\n if (!hasIndexedDB) {\r\n resolve(generateResponse(true, 'IndexedDB is not supported'));\r\n return;\r\n }\r\n const request = indexedDB.open(dbName, dbVersion);\r\n request.onerror = () => resolve(generateResponse(true, 'IndexedDB is not supported!'));\r\n request.onsuccess = event => {\r\n db = event.target.result;\r\n resolve(setupDatabase());\r\n };\r\n request.onupgradeneeded = event => {\r\n const db = event.target.result;\r\n const objStore = db.createObjectStore('tokenData', { keyPath: 'name' });\r\n objStore.createIndex('content', 'content', { unique: false });\r\n };\r\n }).then(output => {\r\n return generateResponse(output.hasError, output.data);\r\n });\r\n}\r\n\r\nasync function setupDatabase() {\r\n return new Promise(resolve => {\r\n if (isNullOrUndefined(db)) {\r\n resolve(generateResponse(true, 'Cannot setup database when none is found!'));\r\n return;\r\n }\r\n db.onerror = event => console.error('Database error: ' + event.target.errorCode);\r\n dbInitalised = true;\r\n resolve(generateResponse(false, null));\r\n }).then(output => {\r\n return generateResponse(output.hasError, output.data);\r\n });\r\n}\r\n\r\nasync function add(name, content) {\r\n return new Promise(resolve => {\r\n if (!dbInitalised) {\r\n resolve(generateResponse(true, 'Cannot save tokens before the database has initialised!'));\r\n return;\r\n }\r\n const tokenObj = { name, content };\r\n const request = db.transaction('tokenData', 'readwrite').objectStore('tokenData').add(tokenObj);\r\n request.onsuccess = () => resolve(generateResponse(false, tokenObj));\r\n request.onerror = () => resolve(generateResponse(true, 'Token add failed!'));\r\n }).then(output => {\r\n return generateResponse(output.hasError, output.data);\r\n });\r\n}\r\n\r\nasync function remove(name) {\r\n return new Promise(resolve => {\r\n if (!dbInitalised) {\r\n resolve(generateResponse(true, 'Cannot remove tokens before the database has initialised!'));\r\n return;\r\n }\r\n const request = db.transaction('tokenData', 'readwrite').objectStore('tokenData').delete(name);\r\n request.onsuccess = () => resolve(generateResponse(false, name));\r\n request.onerror = () => resolve(generateResponse(true, 'Token delete failed!'));\r\n }).then(output => {\r\n return generateResponse(output.hasError, output.data);\r\n });\r\n}\r\n\r\nasync function fetch(name) {\r\n return new Promise(resolve => {\r\n if (!dbInitalised) {\r\n resolve(generateResponse(true, 'Cannot fetch tokens before the database has initialised!'));\r\n return;\r\n }\r\n const request = db.transaction('tokenData', 'readwrite').objectStore('tokenData').get(name);\r\n request.onsuccess = event => resolve(generateResponse(false, event.target.result));\r\n request.onerror = () => resolve(generateResponse(true, 'Token fetch failed!'));\r\n }).then(output => {\r\n return generateResponse(output.hasError, output.data);\r\n });\r\n}\r\n","export const versionName = 'WebApp';\r\n\r\nexport const versionNum = 80;\r\n\r\nexport const APIDomain = 'https://sentinimarinecbt-api.azurewebsites.net';\r\n//export const APIDomain = 'http://192.168.1.122';\r\n\r\nexport const APIRoute = APIDomain + '/api/';\r\n\r\nexport const LoginRoute = 'https://sentinimarineaccountsservice-api.azurewebsites.net/api/';\r\n\r\nexport const SSOKey = 'PtRaDxf4T7i65jorHBHyqLSybQCTs6Q93YgehKkSfm8maFdoSoQfyCcSBy5M3FbrMDTzPe6zEYLQEetzCySi';\r\n\r\nexport const APIPath = {\r\n // Users\r\n PASSWORD_REQUIREMENTS: 'User/PasswordRequirements',\r\n LOGIN: 'User/LogIn',\r\n LOGIN_PASSWORD_RESET: 'User/LogInWithPasswordReset',\r\n LOGIN_GOOGLE: 'User/LoginWithGoogle',\r\n LOGOUT: 'User/LogOut',\r\n REGISTER: 'User/Register',\r\n REGISTER_GOOGLE: 'User/RegisterWithGoogle',\r\n EMAIL_CONFIRMATION: 'User/EmailConfirmation',\r\n FORGOT_PASSWORD: 'User/ForgotPassword',\r\n RESET_PASSWORD: 'User/ResetPassword',\r\n CHANGE_PASSWORD: 'User/ChangePassword',\r\n GET_USER_INFO: 'User/GetUsersInfo',\r\n REQUEST_EMAIL_CHANGE: 'User/RequestChangeEmail',\r\n CONFIRM_EMAIL_CHANGE: 'User/ConfirmChangeEmail',\r\n REQUEST_EMAIL_CONFIRMATION: 'User/RequestEmailConfirmation',\r\n FINISH_EXTERNAL_LOGIN: 'User/CheckLocalUser',\r\n FINISH_EXTERNAL_SIGNUP: 'User/CreateLocalUser',\r\n TWO_FACTOR_GET_KEY: 'User/GetAuthenticatorCode',\r\n TWO_FACTOR_ADD: 'User/AddAuthentication',\r\n TWO_FACTOR_REMOVE: 'User/RemoveAuthentication',\r\n ADD_DEVICE: 'User/AddDevice',\r\n UPDATE_USER_ALTERNATE_LOGINS: 'User/UpdateUsersAlternateLogins',\r\n VERIFY_TWO_FACTOR: 'User/VerifyTwoFactor',\r\n GET_MOTD: 'User/GetMOTD',\r\n SEEN_MOTD: 'User/SeenMOTD',\r\n REFRESH_TOKEN: 'User/RefreshToken',\r\n BAN_USER: 'User/BanUser/',\r\n UN_BAN_USER: 'User/UnBanUser/',\r\n CREATE_MAGIC_LINK: 'User/CreateMagicLinks',\r\n EDIT_MAGIC_LINK: 'User/EditMagicLinks',\r\n REGISTER_MAGIC_LINK: 'User/RegisterMagicLink',\r\n RESEND_MAGIC_LINK: 'User/ResendMagicLink',\r\n REMOVE_MAGIC_LINK: 'User/RemoveMagicLink',\r\n MY_INFO: 'User/MyInfo',\r\n GET_RANKS: 'User/Ranks',\r\n UPDATE_USER_LEAVE: 'User/UpdateUserLeave',\r\n USER: 'User',\r\n\r\n // Company\r\n GET_COMPANY_USERS: companyId => `Company/${companyId}/Company/GetUsers`,\r\n GET_FILTERED_COMPANY_USERS: companyId => `Company/${companyId}/Company/GetFilteredUsers`,\r\n GET_CURRENT_MAGIC_LINKS: companyId => `Company/${companyId}/Company/GetCurrentMagicLinks`,\r\n GET_USER_PROFILE_PIC: (companyId, userId) => `Company/${companyId}/Company/GetUserProfilePic?userId=${userId}`,\r\n GET_MAGIC_LINK_PROFILE_PIC: (companyId, userName) => `Company/${companyId}/Company/GetMagicLinkProfilePic?userName=${userName}`,\r\n EDIT_USER: companyId => `Company/${companyId}/Company/EditUser`,\r\n GET_USER_REST_PERIOD_DATES: (companyId, userId) => `Company/${companyId}/Company/GetRestPeriodDates?userId=${userId}`,\r\n GET_USER_REST_PERIOD_DOCUMENT: companyId => `Company/${companyId}/Company/GetRestPeriodDocument`,\r\n GET_MASS_REST_PERIOD_DOCUMENT: companyId => `Company/${companyId}/Company/GetMassRestPeriodDocument`,\r\n SEND_COMPANY_PUSH_NOTIF: companyId => `Company/${companyId}/Company/SendNotification`,\r\n GET_COMPANIES: companyId => `Company/${companyId}/Company/GetCompanies`,\r\n ADD_COMPANY: companyId => `Company/${companyId}/Company/AddCompany`,\r\n UPDATE_COMPANY: companyId => `Company/${companyId}/Company/UpdateCompany`,\r\n GET_COMPANY_LOGO: companyId => `Company/${companyId}/Company/GetCompanyLogo`,\r\n SWITCH_COMPANY: companyId => `Company/${companyId}/Company/SwitchCompany`,\r\n\r\n // User Group\r\n GET_USER_GROUPS: companyId => `Company/${companyId}/UserGroup`,\r\n ADD_USER_GROUP: companyId => `Company/${companyId}/UserGroup/Add`,\r\n EDIT_USER_GROUP: companyId => `Company/${companyId}/UserGroup/Edit`,\r\n DELETE_USER_GROUP: companyId => `Company/${companyId}/UserGroup/Delete/`,\r\n\r\n // Ship\r\n GET_SHIPS: companyId => `Company/${companyId}/Ship`,\r\n SHIP_LOGO: (companyId, shipId) => `Company/${companyId}/Ship/ShipLogo/${shipId}`,\r\n ADD_SHIP: companyId => `Company/${companyId}/Ship/Add`,\r\n UPDATE_SHIP: companyId => `Company/${companyId}/Ship/Update`,\r\n DELETE_SHIP: (companyId, shipId) => `Company/${companyId}/Ship/Delete/${shipId}`,\r\n GET_SHIP_USERS: (companyId, shipId) => `Company/${companyId}/Ship/GetUsers/${shipId}`,\r\n ADD_USER_TO_SHIP: companyId => `Company/${companyId}/Ship/AddUserToShip`,\r\n EDIT_USER_TO_SHIP: companyId => `Company/${companyId}/Ship/EditdUserToShip`,\r\n REMOVE_USER_FROM_SHIP: companyId => `Company/${companyId}/Ship/RemoveUserFromShip`,\r\n\r\n // Documentation\r\n GET_COMPANY_ROOT_CATEGORIES: companyId => `Company/${companyId}/Documentation/GetCompanyRootCategories`,\r\n GET_COMPANY_CATEGORY_CHILDREN: (companyId, categoryId) => `Company/${companyId}/Documentation/GetCompanyCategoryChildren/${categoryId}`,\r\n GET_COMPANY_CATEGORY_ITEM: (companyId, categoryId, itemId) => `Company/${companyId}/Documentation/GetCompanyCategoryItem/${categoryId}/${itemId}`,\r\n CREATE_CATEGORY: companyId => `Company/${companyId}/Documentation/CreateCategory`,\r\n EDIT_CATEGORY: companyId => `Company/${companyId}/Documentation/EditCategory`,\r\n DELETE_CATEGORY: (companyId, categoryId) => `Company/${companyId}/Documentation/DeleteCategory/${categoryId}`,\r\n DOC_ADD_SHIP: companyId => `Company/${companyId}/Documentation/AddShip`,\r\n DOC_REMOVE_SHIP: companyId => `Company/${companyId}/Documentation/RemoveShip`,\r\n DOC_ADD_USER_GROUP: companyId => `Company/${companyId}/Documentation/AddUserGroup`,\r\n DOC_REMOVE_USER_GROUP: companyId => `Company/${companyId}/Documentation/RemoveUserGroup`,\r\n GET_COMPANY_DOCUMENT_ITEMS: companyId => `Company/${companyId}/Documentation/GetCompanysDocumentItems`,\r\n ADD_DOCUMENT_ITEM: companyId => `Company/${companyId}/Documentation/AddDocumentItem`,\r\n EDIT_DOCUMENT_ITEM: companyId => `Company/${companyId}/Documentation/EditDocumentItem`,\r\n DELETE_DOCUMENT_ITEM: (companyId, itemId) => `Company/${companyId}/Documentation/DeleteDocumentItem/${itemId}`,\r\n ATTACH_DOCUMENT_ITEM: companyId => `Company/${companyId}/Documentation/AttachDocumentItem`,\r\n REMOVE_DOCUMENT_ITEM: companyId => `Company/${companyId}/Documentation/RemoveDocumentItem`,\r\n\r\n // Question\r\n GET_QUESTION_CATEGORIES: companyId => `Company/${companyId}/Question/GetQuestionCategorys`,\r\n ADD_QUESTION_CATEGORIES: companyId => `Company/${companyId}/Question/AddQuestionCategory`,\r\n EDIT_QUESTION_CATEGORIES: companyId => `Company/${companyId}/Question/EditQuestionCategory`,\r\n REMOVE_QUESTION_CATEGORIES: (companyId, id) => `Company/${companyId}/Question/RemoveQuestionCategory/${id}`,\r\n ADD_QUESTION_CATEGORY: companyId => `Company/${companyId}/Question/AddQuestionCategory`,\r\n EDIT_QUESTION_CATEGORY: companyId => `Company/${companyId}/Question/EditQuestionCategory`,\r\n REMOVE_QUESTION_CATEGORY: (companyId, categoryId) => `Company/${companyId}/Question/RemoveQuestionCategory/${categoryId}`,\r\n GET_COMPANY_QUESTIONS: companyId => `Company/${companyId}/Question/GetCompanyQuestions`,\r\n GET_ALL_QUESTIONS: companyId => `Company/${companyId}/Question/GetAllQuestions`,\r\n GET_QUESTION: (companyId, questionId) => `Company/${companyId}/Question/GetQuestion/${questionId}`,\r\n GET_COMPLIANCE_QUESTIONS_BY_CATEGORY: (companyId, complianceId, categoryId) => `Company/${companyId}/Question/GetQuestionsInCategoryForCompiance/${complianceId}/${categoryId}`,\r\n GET_COMPLIANCE_QUESTION: (companyId, complianceId, questionId) => `Company/${companyId}/Question/GetQuestionForCompiance/${complianceId}/${questionId}`,\r\n ADD_QUESTION: companyId => `Company/${companyId}/Question/AddQuestion`,\r\n EDIT_QUESTION: companyId => `Company/${companyId}/Question/EditQuestion`,\r\n ARCHIVE_QUESTION: (companyId, questionId) => `Company/${companyId}/Question/ArchiveQuestion/${questionId}`,\r\n DELETE_QUESTION: (companyId, questionId) => `Company/${companyId}/Question/DeleteQuestion/${questionId}`,\r\n IMPORT_FROM_EXCEL: companyId => `Company/${companyId}/Question/ImportFromExcel`,\r\n\r\n // Compliance Test\r\n GET_USER_COMPLIANCE_TESTS: (companyId, userId) => `Company/${companyId}/ComplianceTest/GetUserComplianceTests/${userId}`,\r\n GET_COMPLIANCE_TEST_CATEGORIES: companyId => `Company/${companyId}/ComplianceTest/GetComplianceTestCategories`,\r\n GET_COMPLIANCE_TESTS: companyId => `Company/${companyId}/ComplianceTest/GetCompanysComplianceTests`,\r\n GET_COMPLIANCE_TESTS_SPECIFIC: companyId => `Company/${companyId}/ComplianceTest/GetComplianceTests`,\r\n GET_COMPLIANCE_TEST: (companyId, assessmentId) => `Company/${companyId}/ComplianceTest/GetComplianceTest/${assessmentId}`,\r\n ADD_COMPLIANCE_TEST: companyId => `Company/${companyId}/ComplianceTest/AddComplianceTest`,\r\n EDIT_COMPLIANCE_TEST: companyId => `Company/${companyId}/ComplianceTest/EditComplianceTest`,\r\n COMPANY_COMPLIANCE_TEST_RESULTS: companyId => `Company/${companyId}/ComplianceTest/CompanyComplianceTestResults`,\r\n SHIP_COMPLIANCE_TEST_RESULTS: (companyId, shipId) => `Company/${companyId}/ComplianceTest/ShipComplianceTestResults/${shipId}`,\r\n USER_COMPLIANCE_TEST_RESULTS: (companyId, userId) => `Company/${companyId}/ComplianceTest/UsersComplianceTestResults/${userId}`,\r\n USER_TEST_RESULTS: (companyId, userId, complianceId) => `Company/${companyId}/ComplianceTest/UsersComplianceResult/${userId}/${complianceId}`,\r\n QUESTION_OVERVIEW: (companyId, shipId = null, userId = null) =>\r\n `Company/${companyId}/ComplianceTest/QuestionOverview?${shipId !== null ? `shipId=${shipId}${userId !== null ? '&' : ''}` : ''}${userId !== null ? `userId=${userId}` : ''}`,\r\n ASSESSMENT_OVERVIEW: (companyId, shipId = null) => `Company/${companyId}/ComplianceTest/AssessmentOverview?${shipId !== null ? `shipId=${shipId}` : ''}`,\r\n USER_GROUPS_OVERVIEW: (companyId, shipId = null) => `Company/${companyId}/ComplianceTest/UserGroupesOverview?${shipId !== null ? `shipId=${shipId}` : ''}`,\r\n\r\n // Notifications\r\n GET_UNREAD_NOTIF_COUNT: 'Notifications/GetUnreadCount',\r\n GET_TOP_NOTIFS: 'Notifications/GetTop',\r\n GET_ALL_NOTIFS: 'Notifications/GetAll',\r\n MARK_NOTIF_AS_READ: 'Notifications/MarkAsRead/',\r\n MARK_ALL_NOTIFS_AS_READ: 'Notifications/MarkAllAsRead',\r\n\r\n // File\r\n FILE_UPlOAD: 'File/Upload',\r\n FILE_GET_USERS: 'File/GetUsersFiles',\r\n\r\n // Feedback\r\n FEEDBACK_CREATE_TICKET: 'Feedback/CreateTicket',\r\n\r\n // Version\r\n GET_VERSION: 'Version',\r\n\r\n // Compliance test levels\r\n GET_USER_COMPLIANCE_TEST_LEVELS: 'UserComplianceTestLevel/Get',\r\n EDIT_USER_COMPLIANCE_TEST_LEVELS: 'UserComplianceTestLevel/Edit',\r\n};\r\n\r\nexport const SIGNALRPath = {\r\n Notifications: APIDomain + '/webhooks/notification',\r\n};\r\n\r\nexport const Role = {\r\n Admin: 'Admin',\r\n};\r\n\r\nexport const CompanyRole = {\r\n CrewMember: 'CrewMember',\r\n Owner: 'Owner',\r\n};\r\n\r\nexport const CompanyRoles = [\r\n { name: 'Crew Member', id: CompanyRole.CrewMember },\r\n { name: 'Superintendent', id: CompanyRole.Owner },\r\n];\r\n\r\nexport const ShipRole = {\r\n Captain: 'Captain',\r\n CrewMember: 'CrewMember',\r\n Owner: 'Owner',\r\n};\r\n\r\nexport const ShipRoles = [\r\n { name: 'Captain', id: ShipRole.Captain },\r\n { name: 'Crew Member', id: ShipRole.CrewMember },\r\n { name: 'Superintendent', id: ShipRole.Owner },\r\n];\r\n\r\nexport const ItemType = {\r\n Folder: 'Folder',\r\n File: 'File',\r\n};\r\n","import UserController from '../controllers/UserController';\r\nimport { IndexedDB } from './IndexedDB';\r\nimport { isNullOrUndefined } from './Utils';\r\n\r\nconst TokenRefresher = {\r\n checkAndRefeshToken,\r\n};\r\n\r\nvar isRefreshing = false;\r\n\r\nasync function checkAndRefeshToken(response) {\r\n if (isRefreshing) {\r\n return;\r\n }\r\n isRefreshing = true;\r\n const { jwtrequiresrefresh } = response?.headers;\r\n if (!isNullOrUndefined(jwtrequiresrefresh) && jwtrequiresrefresh === 'true') {\r\n const dbTokenResponse = await IndexedDB.fetch('refreshToken');\r\n if (dbTokenResponse.hasError) {\r\n console.log(dbTokenResponse.data);\r\n isRefreshing = false;\r\n }\r\n const refreshResponse = await UserController.refreshToken(dbTokenResponse.data?.content);\r\n if (refreshResponse.hasError) {\r\n console.error(refreshResponse.data);\r\n isRefreshing = false;\r\n }\r\n const { token, expires, refreshToken } = refreshResponse.data;\r\n const cacheResponse = await UserController.refreshTokenCache(token, refreshToken, expires);\r\n if (cacheResponse.hasError) {\r\n console.error(cacheResponse.data);\r\n isRefreshing = false;\r\n }\r\n }\r\n isRefreshing = false;\r\n}\r\n\r\nexport default TokenRefresher;\r\n","import TokenRefresher from './TokenRefresher';\r\n\r\nexport function isNullOrUndefined(obj) {\r\n return obj === null || obj === undefined;\r\n}\r\n\r\nexport function isNullOrEmpty(obj) {\r\n return obj === null || obj === undefined || obj === '';\r\n}\r\n\r\nexport function isEmpty(obj) {\r\n return Object.keys(obj).length === 0;\r\n}\r\n\r\nexport function isNullOrWhitespace(string) {\r\n return isNullOrUndefined(string) || string.trim().length === 0;\r\n}\r\n\r\nexport function isStatusOK(status = 0) {\r\n return status >= 200 && status < 300;\r\n}\r\n\r\nexport function generateResponse(hasError = false, data, response = null) {\r\n if (!isNullOrUndefined(response)) {\r\n TokenRefresher.checkAndRefeshToken(response);\r\n }\r\n return { hasError, data };\r\n}\r\n\r\nexport function checkPassword(passwordRequirements, password) {\r\n const outstandingRequirements = [];\r\n if (isNullOrUndefined(passwordRequirements) || isNullOrUndefined(password)) {\r\n return outstandingRequirements;\r\n }\r\n const validChars = Array.from('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@$?_-');\r\n const currentChars = Array.from(password);\r\n currentChars.forEach(element => {\r\n if (!validChars.includes(element)) {\r\n outstandingRequirements.push(\"Invalid character detected '\" + element + \"'\");\r\n }\r\n });\r\n if (currentChars.length < passwordRequirements.requiredLength) {\r\n outstandingRequirements.push('Password must be at least ' + passwordRequirements.requiredLength + ' characters long');\r\n }\r\n if (passwordRequirements.requireDigit === true) {\r\n if (!/\\d/.test(password)) {\r\n outstandingRequirements.push('Password must contain one number');\r\n }\r\n }\r\n if (passwordRequirements.requireLowercase === true) {\r\n if (!/[a-z]/.test(password)) {\r\n outstandingRequirements.push('Password must contain one lowercase character');\r\n }\r\n }\r\n if (passwordRequirements.requireUppercase === true) {\r\n if (!/[A-Z]/.test(password)) {\r\n outstandingRequirements.push('Password must contain one uppercase character');\r\n }\r\n }\r\n if (passwordRequirements.requireNonAlphanumeric === true) {\r\n if (!/[!@$?_-]/.test(password)) {\r\n outstandingRequirements.push('Password must contain one special character (!@$?_-)');\r\n }\r\n }\r\n return outstandingRequirements;\r\n}\r\n\r\nexport function flattenFormContent(rootValue, formData, value, index) {\r\n // NOTES\r\n // - only goes one layer deep at this time, will need expanding if required in future\r\n // - will not work with nested files\r\n for (var key in value) {\r\n const currentValue = value[key];\r\n if (isNullOrUndefined(currentValue)) {\r\n continue;\r\n }\r\n if (Array.isArray(currentValue)) {\r\n for (let i = 0; i < currentValue.length; i++) {\r\n formData.append(`${rootValue}[${index}][${key}][${i}]`, currentValue[i]);\r\n }\r\n continue;\r\n }\r\n if (currentValue instanceof File) {\r\n formData.append(`${rootValue}[${index}][${key}]`, index);\r\n continue;\r\n }\r\n formData.append(`${rootValue}[${index}][${key}]`, currentValue);\r\n }\r\n}\r\n\r\nexport function stringToHex(str) {\r\n var arr1 = [];\r\n for (var n = 0, l = str.length; n < l; n++) {\r\n var hex = Number(str.charCodeAt(n)).toString(16);\r\n arr1.push(hex);\r\n }\r\n return arr1.join('');\r\n}\r\n\r\nexport function scoreToPercentage(score = 0, maxScore = 0) {\r\n if (isNullOrUndefined(score)) {\r\n return null;\r\n }\r\n if (maxScore === 0) {\r\n return (0).toFixed(2);\r\n }\r\n\r\n const percentile = maxScore / 100;\r\n return (score / percentile).toFixed(2);\r\n}\r\n\r\nexport function updateQueryString(queryString) {\r\n if (window.history.replaceState) {\r\n var newUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${queryString}`;\r\n window.history.replaceState({ path: newUrl }, '', newUrl);\r\n }\r\n}\r\n\r\nexport function descendingComparator(a, b, orderBy, defaultValue = '') {\r\n const aComp = a[orderBy] ?? defaultValue;\r\n const bComp = b[orderBy] ?? defaultValue;\r\n if (bComp < aComp) {\r\n return -1;\r\n }\r\n if (bComp > aComp) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n","import Axios from 'axios';\r\nimport moment from 'moment';\r\nimport { APIRoute, APIPath, LoginRoute, SSOKey } from '../helpers/Constants';\r\nimport { flattenFormContent, generateResponse, isNullOrUndefined, isStatusOK } from '../helpers/Utils';\r\nimport { IndexedDB } from '../helpers/IndexedDB';\r\n\r\nconst UserController = {\r\n getUserHeaders,\r\n getToken,\r\n hasTokenExpired,\r\n refreshToken,\r\n registerMagicLink,\r\n createMagicLink,\r\n editMagicLink,\r\n resendMagicLink,\r\n removeMagicLink,\r\n login,\r\n loginWithPasswordReset,\r\n logout,\r\n finishExternalLogin,\r\n getPasswordRequirements,\r\n forgotPassword,\r\n resetPassword,\r\n changePassword,\r\n addDeviceToken,\r\n getMOTD,\r\n seenMOTD,\r\n requestEmailConfirmation,\r\n checkForEmailConfirmation,\r\n getUserInfo,\r\n getRanks,\r\n getAuthenticatorCode,\r\n addTwoFactor,\r\n removeTwoFactor,\r\n verifyTwoFactor,\r\n refreshTokenCache,\r\n fetchCachedUserData,\r\n updateUserLeave,\r\n deleteUser,\r\n};\r\n\r\nasync function getUserHeaders(contentType = null) {\r\n return await IndexedDB.fetch('authToken')\r\n .then(response => {\r\n if (isNullOrUndefined(contentType)) {\r\n return { headers: { Authorization: 'Bearer ' + response.data?.content } };\r\n } else {\r\n return {\r\n headers: {\r\n 'Content-Type': contentType,\r\n Authorization: 'Bearer ' + response.data?.content,\r\n },\r\n };\r\n }\r\n })\r\n .catch(() => {\r\n return null;\r\n });\r\n}\r\n\r\nasync function getToken() {\r\n return await IndexedDB.fetch('authToken')\r\n .then(response => {\r\n return response.data?.content;\r\n })\r\n .catch(() => {\r\n return null;\r\n });\r\n}\r\n\r\nasync function hasTokenExpired() {\r\n return await IndexedDB.fetch('expires')\r\n .then(response => {\r\n return moment.utc(response.data.content).isSameOrBefore(moment.utc());\r\n })\r\n .catch(() => {\r\n return null;\r\n });\r\n}\r\n\r\nasync function refreshToken(refreshToken) {\r\n const userHeaders = await getUserHeaders();\r\n const refreshModel = {\r\n refreshToken,\r\n };\r\n return Axios.post(LoginRoute + APIPath.REFRESH_TOKEN, refreshModel, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function registerMagicLink(userName, token, password, rememberMe) {\r\n const regModel = {\r\n userName,\r\n token,\r\n password,\r\n rememberMe,\r\n };\r\n return Axios.post(LoginRoute + APIPath.REGISTER_MAGIC_LINK, regModel)\r\n .then(async response => {\r\n return generateResponse(false, response.data);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function createMagicLink(userName, email, firstName, lastName, phoneNumber, profilePic, companyRole, userGroupsId, ships, restPeriodsEnabled, canGenerateNFCTags, rank, secondaryEmail = null) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('userName', userName);\r\n formData.append('secondaryEmail', secondaryEmail);\r\n formData.append('email', email);\r\n formData.append('firstName', firstName);\r\n formData.append('lastName', lastName);\r\n if (phoneNumber !== null) {\r\n formData.append('phoneNumber', phoneNumber);\r\n }\r\n formData.append('profilePic', profilePic);\r\n formData.append('companyRole', companyRole);\r\n formData.append('userGroupsId', userGroupsId);\r\n formData.append('restPeriodsEnabled', restPeriodsEnabled);\r\n formData.append('canGenerateNFCTags', canGenerateNFCTags);\r\n formData.append('rank', rank);\r\n\r\n ships.forEach((e, i) => flattenFormContent('ships', formData, e, i));\r\n return Axios.post(APIRoute + APIPath.CREATE_MAGIC_LINK, formData, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editMagicLink(userName, email, firstName, lastName, phoneNumber, profilePic, companyRole, userGroupsId, ships, restPeriodsEnabled, canGenerateNFCTags, rank, secondaryEmail = null) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('userName', userName);\r\n formData.append('email', email);\r\n formData.append('secondaryEmail', secondaryEmail);\r\n formData.append('firstName', firstName);\r\n formData.append('lastName', lastName);\r\n if (phoneNumber !== null) {\r\n formData.append('phoneNumber', phoneNumber);\r\n }\r\n formData.append('profilePic', profilePic);\r\n formData.append('companyRole', companyRole);\r\n formData.append('userGroupsId', userGroupsId);\r\n formData.append('restPeriodsEnabled', restPeriodsEnabled);\r\n formData.append('canGenerateNFCTags', canGenerateNFCTags);\r\n formData.append('rank', rank);\r\n\r\n ships.forEach((e, i) => flattenFormContent('ships', formData, e, i));\r\n return Axios.post(APIRoute + APIPath.EDIT_MAGIC_LINK, formData, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function resendMagicLink(userName) {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.RESEND_MAGIC_LINK + `?userName=${encodeURIComponent(userName)}`, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function removeMagicLink(userName) {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.REMOVE_MAGIC_LINK + `?userName=${encodeURIComponent(userName)}`, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function login(userName, password, rememberMe, twoFactorToken = null) {\r\n const loginModel = {\r\n userName,\r\n password,\r\n rememberMe,\r\n twoFactorToken,\r\n Token: SSOKey,\r\n };\r\n return Axios.post(LoginRoute + APIPath.LOGIN, loginModel)\r\n .then(async response => {\r\n if (isStatusOK(response.status)) {\r\n await clearCachedUserData();\r\n const infoResponse = await getMyInfo(response.data.token);\r\n if (infoResponse.hasError) {\r\n return generateResponse(true, 'failed to get user info');\r\n }\r\n const userData = { ...response.data, ...infoResponse.data };\r\n return await cacheUserData(userData).then(cacheResponse => {\r\n const output = cacheResponse.hasError ? cacheResponse.data : userData;\r\n return generateResponse(cacheResponse.hasError, output, response);\r\n });\r\n } else {\r\n return generateResponse(true, response.data);\r\n }\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function loginWithPasswordReset(userName, password, rememberMe, twoFactorToken, newPassword, newConfirmationPassword) {\r\n const resetModel = {\r\n userName,\r\n password,\r\n rememberMe,\r\n twoFactorToken,\r\n newPassword,\r\n newConfirmationPassword,\r\n Token: SSOKey,\r\n };\r\n return Axios.post(LoginRoute + APIPath.LOGIN_PASSWORD_RESET, resetModel)\r\n .then(async response => {\r\n if (isStatusOK(response.status)) {\r\n const infoResponse = await getMyInfo(response.data.token);\r\n if (infoResponse.hasError) {\r\n return generateResponse(true, 'failed to get user info');\r\n }\r\n return await cacheUserData(response.data).then(cacheResponse => {\r\n const output = cacheResponse.hasError ? cacheResponse.data : response.data;\r\n return generateResponse(cacheResponse.hasError, { ...output, ...infoResponse.data }, response);\r\n });\r\n } else {\r\n return generateResponse(true, response.data);\r\n }\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function logout() {\r\n const userHeaders = await getUserHeaders();\r\n const clearResponse = await clearCachedUserData();\r\n if (clearResponse.hasError) {\r\n return clearResponse;\r\n }\r\n return Axios.post(LoginRoute + APIPath.LOGOUT, null, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, null, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function finishExternalLogin() {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(LoginRoute + APIPath.FINISH_EXTERNAL_LOGIN, userHeaders)\r\n .then(response => {\r\n if (!response.data.exists) {\r\n return generateResponse(true, 'Unable to find account, please register first');\r\n } else if (!response.data) {\r\n return generateResponse(true, 'Failed to connect to service');\r\n }\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getPasswordRequirements() {\r\n return Axios.get(LoginRoute + APIPath.PASSWORD_REQUIREMENTS)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function forgotPassword(userName) {\r\n const forgotModel = { userName, Token: SSOKey };\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.FORGOT_PASSWORD, forgotModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, null, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function resetPassword(userId, code, password, passwordConfirmation) {\r\n const resetModel = {\r\n userId,\r\n code,\r\n password,\r\n passwordConfirmation,\r\n };\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.RESET_PASSWORD, resetModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, null, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function changePassword(currentPassword, newPassword, newPasswordConfirmation) {\r\n const changeModel = {\r\n currentPassword,\r\n newPassword,\r\n newPasswordConfirmation,\r\n };\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.CHANGE_PASSWORD, changeModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, null, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addDeviceToken(token) {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.ADD_DEVICE + '?deviceToken=' + token, null, userHeaders)\r\n .then(() => {\r\n console.log('Device token updated.');\r\n return true;\r\n })\r\n .catch(reason => {\r\n console.log('Device token update failed!', reason);\r\n return false;\r\n });\r\n}\r\n\r\nasync function getMOTD() {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_MOTD, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function seenMOTD() {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.SEEN_MOTD, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function requestEmailConfirmation() {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.REQUEST_EMAIL_CONFIRMATION, null, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function checkForEmailConfirmation(userId, code) {\r\n const data = { userId, code };\r\n return Axios.post(LoginRoute + APIPath.EMAIL_CONFIRMATION, data)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getUserInfo() {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(LoginRoute + APIPath.GET_USER_INFO, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getAuthenticatorCode() {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(LoginRoute + APIPath.TWO_FACTOR_GET_KEY, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addTwoFactor(secret, token) {\r\n const addModel = { secret, token };\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.TWO_FACTOR_ADD, addModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function removeTwoFactor(token) {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.TWO_FACTOR_REMOVE, { token }, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function verifyTwoFactor(twoFactorToken) {\r\n const data = { twoFactorToken };\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.VERIFY_TWO_FACTOR, data, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\n//Only used by login functions\r\nasync function getMyInfo(authToken) {\r\n return Axios.get(APIRoute + APIPath.MY_INFO, { headers: { Authorization: 'Bearer ' + authToken } })\r\n .then(async response => {\r\n return await cacheUserInfo(response.data);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getRanks() {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_RANKS, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function updateUserLeave(userId, onLeave) {\r\n const data = { userId, onLeave };\r\n const userHeaders = await getUserHeaders();\r\n return Axios.post(LoginRoute + APIPath.UPDATE_USER_LEAVE, data, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function deleteUser(userId) {\r\n const userHeaders = await getUserHeaders();\r\n return Axios.delete(`${APIRoute + APIPath.USER}/${userId}`, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function refreshTokenCache(token, refreshToken, expires) {\r\n try {\r\n await IndexedDB.remove('expires').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('expires', expires).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('authToken').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('authToken', token).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('refreshToken').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('refreshToken', refreshToken).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n return generateResponse(false, { token, expires });\r\n } catch (e) {\r\n return generateResponse(true, e?.data);\r\n }\r\n}\r\n\r\nexport async function updateCompanyId(companyId) {\r\n try {\r\n await IndexedDB.remove('companyId').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('companyId', companyId).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n return generateResponse(false, companyId);\r\n } catch (e) {\r\n return generateResponse(true, e?.data);\r\n }\r\n}\r\n\r\nasync function cacheUserInfo(userInfo) {\r\n try {\r\n const { companyId, companyRole, shipRoles } = userInfo;\r\n await IndexedDB.add('companyId', companyId).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('companyRole', companyRole).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('shipRoles', shipRoles).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n return generateResponse(false, userInfo);\r\n } catch (e) {\r\n return generateResponse(true, e?.data);\r\n }\r\n}\r\n\r\nasync function cacheUserData(userData) {\r\n try {\r\n const { userName, role, token, refreshToken, expires, id } = userData;\r\n await IndexedDB.add('userName', userName).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('role', role).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('expires', expires).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('authToken', token).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('refreshToken', refreshToken).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.add('id', id).then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n return generateResponse(false, userData);\r\n } catch (e) {\r\n return generateResponse(true, e?.data);\r\n }\r\n}\r\n\r\nasync function fetchCachedUserData() {\r\n try {\r\n let userName, role, token, refreshToken, expires, companyId, companyRole, shipRoles, id;\r\n await IndexedDB.fetch('userName').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n userName = response.data?.content;\r\n });\r\n await IndexedDB.fetch('role').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n role = response.data?.content;\r\n });\r\n await IndexedDB.fetch('expires').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n expires = response.data?.content;\r\n });\r\n await IndexedDB.fetch('authToken').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n token = response.data?.content;\r\n });\r\n await IndexedDB.fetch('refreshToken').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n refreshToken = response.data?.content;\r\n });\r\n await IndexedDB.fetch('companyId').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n companyId = response.data?.content;\r\n });\r\n await IndexedDB.fetch('companyRole').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n companyRole = response.data?.content;\r\n });\r\n await IndexedDB.fetch('shipRoles').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n shipRoles = response.data?.content;\r\n });\r\n await IndexedDB.fetch('id').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n id = response.data?.content;\r\n });\r\n return generateResponse(false, { userName, role, token, refreshToken, expires, companyId, companyRole, shipRoles, id });\r\n } catch (e) {\r\n return generateResponse(true, e?.data);\r\n }\r\n}\r\n\r\nasync function clearCachedUserData() {\r\n try {\r\n await IndexedDB.remove('userName').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('role').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('expires').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('refreshToken').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('authToken').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('companyId').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('companyRole').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('shipRoles').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n await IndexedDB.remove('id').then(response => {\r\n if (response.hasError) {\r\n throw response;\r\n }\r\n });\r\n return generateResponse(false, null);\r\n } catch (e) {\r\n return generateResponse(true, e?.data);\r\n }\r\n}\r\n\r\nexport default UserController;\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst NotificationsController = {\r\n getUnreadCount,\r\n getTop,\r\n getAll,\r\n markAsRead,\r\n markAllAsRead,\r\n};\r\n\r\nasync function getUnreadCount() {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_UNREAD_NOTIF_COUNT, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getTop() {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_TOP_NOTIFS, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getAll(page = 0) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_ALL_NOTIFS + `?page=${page}`, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function markAsRead(id) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.MARK_NOTIF_AS_READ + id, null, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function markAllAsRead() {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.MARK_ALL_NOTIFS_AS_READ, null, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default NotificationsController;\r\n","export const Colours = {\r\n primary: 'rgb(3, 84, 120)',\r\n primaryDark: 'rgb(17,43,66)',\r\n secondary: 'rgb(70, 228, 209)',\r\n offWhite: '#FEFEFE',\r\n offerWhite: '#FBFBFB',\r\n white: '#FFF',\r\n black: '#000',\r\n red: '#E23737',\r\n darkRed: '#bc2e2e',\r\n green: '#74CC6A',\r\n darkGreen: '#599F52',\r\n bodyText: 'rgba(0, 0, 0, 0.6)',\r\n border: 'rgba(0, 0, 0, 0.42)',\r\n field: 'rgba(0, 0, 0, 0.09)',\r\n archived: '#f1f1f1',\r\n};\r\n","import { Colours } from '../../helpers/Colours';\r\nimport { MenuItem, withStyles } from '@material-ui/core';\r\n\r\nexport const DarkMenuItem = withStyles({\r\n root: {\r\n color: Colours.black,\r\n '&.Mui-selected': {\r\n backgroundColor: Colours.secondary,\r\n color: Colours.white,\r\n '&:hover': {\r\n backgroundColor: Colours.black,\r\n color: Colours.white,\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: Colours.black,\r\n color: Colours.white,\r\n },\r\n },\r\n})(MenuItem);\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst ShipController = {\r\n getShips,\r\n getShipLogo,\r\n addShip,\r\n updateShip,\r\n deleteShip,\r\n getShipUsers,\r\n addUserToShip,\r\n editUserToShip,\r\n removeUserFromShip,\r\n};\r\n\r\nasync function getShips(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_SHIPS(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getShipLogo(companyId, shipId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.SHIP_LOGO(companyId, shipId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addShip(companyId, name, imo, portOfRegistry, logo) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('name', name);\r\n formData.append('imo', imo);\r\n formData.append('portOfRegistry', portOfRegistry);\r\n formData.append('logo', logo);\r\n return Axios.post(APIRoute + APIPath.ADD_SHIP(companyId), formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function updateShip(companyId, shipId, name, imo, portOfRegistry, deleteImage, logo) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const formData = new FormData();\r\n formData.append('name', name);\r\n formData.append('imo', imo);\r\n formData.append('portOfRegistry', portOfRegistry);\r\n formData.append('logo', logo);\r\n formData.append('deleteImage', deleteImage);\r\n formData.append('id', shipId);\r\n return Axios.post(APIRoute + APIPath.UPDATE_SHIP(companyId), formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function deleteShip(companyId, shipId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.DELETE_SHIP(companyId, shipId), null, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getShipUsers(companyId, shipId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_SHIP_USERS(companyId, shipId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addUserToShip(companyId, shipId, shipRole, userId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const shipUserModel = {\r\n shipId,\r\n userId,\r\n shipRole,\r\n };\r\n return Axios.post(APIRoute + APIPath.ADD_USER_TO_SHIP(companyId), shipUserModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editUserToShip(companyId, shipId, shipRole, userId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const shipUserModel = {\r\n shipId,\r\n userId,\r\n shipRole,\r\n };\r\n return Axios.post(APIRoute + APIPath.EDIT_USER_TO_SHIP(companyId), shipUserModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function removeUserFromShip(companyId, shipId, userId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const shipUserModel = {\r\n shipId,\r\n userId,\r\n };\r\n return Axios.post(APIRoute + APIPath.REMOVE_USER_FROM_SHIP(companyId), shipUserModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default ShipController;\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst UserGroupController = {\r\n getUserGroups,\r\n addUserGroup,\r\n editUserGroup,\r\n deleteUserGroup,\r\n};\r\n\r\nasync function getUserGroups(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_USER_GROUPS(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addUserGroup(companyId, name, scored) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const userGroupModel = { name, scored };\r\n return Axios.post(APIRoute + APIPath.ADD_USER_GROUP(companyId), userGroupModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editUserGroup(companyId, userGroupId, name, scored) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const userGroupModel = { id: userGroupId, name, scored };\r\n return Axios.post(APIRoute + APIPath.EDIT_USER_GROUP(companyId), userGroupModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function deleteUserGroup(companyId, userGroupId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.DELETE_USER_GROUP(companyId) + userGroupId, null, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default UserGroupController;\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst DocumentController = {\r\n getCompanyRootCategories,\r\n getCompanyCategoryChildren,\r\n getCompanyCategoryItem,\r\n getCompanyDocumentItems,\r\n createCategory,\r\n editCategory,\r\n deleteCategory,\r\n addShip,\r\n removeShip,\r\n addUserGroup,\r\n removeUserGroup,\r\n addDocumentItem,\r\n editDocumentItem,\r\n deleteDocumentItem,\r\n attachDocumentItem,\r\n removeDocumentItem,\r\n};\r\n\r\nasync function getCompanyRootCategories(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANY_ROOT_CATEGORIES(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCompanyCategoryChildren(companyId, categoryId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANY_CATEGORY_CHILDREN(companyId, categoryId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCompanyCategoryItem(companyId, categoryId, itemId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANY_CATEGORY_ITEM(companyId, categoryId, itemId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCompanyDocumentItems(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANY_DOCUMENT_ITEMS(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function createCategory(companyId, title, description, parentCategoryId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const categoryModel = {\r\n title,\r\n description,\r\n parentCategoryId,\r\n };\r\n return Axios.post(APIRoute + APIPath.CREATE_CATEGORY(companyId), categoryModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editCategory(companyId, categoryId, title, description, parentCategoryId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const categoryModel = {\r\n id: categoryId,\r\n title,\r\n description,\r\n parentCategoryId,\r\n };\r\n return Axios.post(APIRoute + APIPath.EDIT_CATEGORY(companyId), categoryModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function deleteCategory(companyId, categoryId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.DELETE_CATEGORY(companyId, categoryId), null, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addShip(companyId, categoryId, shipId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const categoryModel = {\r\n catagoryId: categoryId,\r\n shipId,\r\n };\r\n return Axios.post(APIRoute + APIPath.DOC_ADD_SHIP(companyId), categoryModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function removeShip(companyId, categoryId, shipId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const categoryModel = {\r\n catagoryId: categoryId,\r\n shipId,\r\n };\r\n return Axios.post(APIRoute + APIPath.DOC_REMOVE_SHIP(companyId), categoryModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addUserGroup(companyId, categoryId, userGroupId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const categoryModel = {\r\n catagoryId: categoryId,\r\n userGroupId,\r\n };\r\n return Axios.post(APIRoute + APIPath.DOC_ADD_USER_GROUP(companyId), categoryModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function removeUserGroup(companyId, categoryId, userGroupId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const categoryModel = {\r\n catagoryId: categoryId,\r\n userGroupId,\r\n };\r\n return Axios.post(APIRoute + APIPath.DOC_REMOVE_USER_GROUP(companyId), categoryModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addDocumentItem(companyId, documentationCategoryId, title, description, file) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('documentationCategoryId', documentationCategoryId);\r\n formData.append('title', title);\r\n formData.append('description', description);\r\n formData.append('file', file);\r\n return Axios.post(APIRoute + APIPath.ADD_DOCUMENT_ITEM(companyId), formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editDocumentItem(companyId, itemId, title, description, file) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('id', itemId);\r\n formData.append('title', title);\r\n formData.append('description', description);\r\n formData.append('file', file);\r\n return Axios.post(APIRoute + APIPath.EDIT_DOCUMENT_ITEM(companyId), formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function deleteDocumentItem(companyId, itemId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.DELETE_DOCUMENT_ITEM(companyId, itemId), null, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function attachDocumentItem(companyId, categoryId, itemId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const documentModel = {\r\n catagoryId: categoryId,\r\n itemId,\r\n };\r\n return Axios.post(APIRoute + APIPath.ATTACH_DOCUMENT_ITEM(companyId), documentModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function removeDocumentItem(companyId, categoryId, itemId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const documentModel = {\r\n catagoryId: categoryId,\r\n itemId,\r\n };\r\n return Axios.post(APIRoute + APIPath.REMOVE_DOCUMENT_ITEM(companyId), documentModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default DocumentController;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Alert as MuiAlert, AlertTitle } from '@material-ui/lab';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\n\r\nexport function Alert(props) {\r\n const text = getTextFromProps();\r\n const header = props.header;\r\n const severity = props.severity ?? 'warning';\r\n\r\n function getErrorFromObject(object) {\r\n if (!isNullOrUndefined(object.message) && typeof object.message === 'string') {\r\n return object.message;\r\n } else if (!isNullOrUndefined(object.error) && typeof object.error === 'string') {\r\n return object.error;\r\n } else if (!isNullOrUndefined(object.errorMessage) && typeof object.errorMessage === 'string') {\r\n return object.errorMessage;\r\n }\r\n return 'An error occurred';\r\n }\r\n\r\n function getTextFromProps() {\r\n if (isNullOrUndefined(props.text)) {\r\n return 'An error occurred';\r\n } else {\r\n if (typeof props.text === 'string') {\r\n return props.text;\r\n } else if ((isNullOrUndefined(props.text.response) || isNullOrUndefined(props.text.response.data)) && !isNullOrUndefined(props.text.message)) {\r\n return props.text.message;\r\n } else if (!isNullOrUndefined(props.text.response) && !isNullOrUndefined(props.text.response.data)) {\r\n const data = props.text.response.data;\r\n if (typeof data === 'string') {\r\n return data;\r\n } else if (typeof data === 'object') {\r\n if (Array.isArray(data)) {\r\n if (data.length > 0) {\r\n return getErrorFromObject(data[0]);\r\n }\r\n } else {\r\n return getErrorFromObject(data);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !isNullOrUndefined(props.text) ? (\r\n \r\n {header}\r\n {text}\r\n \r\n ) : null;\r\n}\r\n\r\nAlert.propTypes = {\r\n header: PropTypes.string,\r\n text: PropTypes.any,\r\n severity: PropTypes.string,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport DocumentController from '../../controllers/DocumentController';\r\nimport CreateNewFolderIcon from '@material-ui/icons/CreateNewFolder';\r\nimport PictureAsPdfIcon from '@material-ui/icons/PictureAsPdf';\r\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\r\nimport FolderIcon from '@material-ui/icons/Folder';\r\nimport ImageIcon from '@material-ui/icons/Image';\r\nimport {\r\n makeStyles,\r\n Dialog,\r\n Typography,\r\n Button,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n DialogActions,\r\n Grid,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n List,\r\n FormControl,\r\n InputLabel,\r\n FilledInput,\r\n CircularProgress,\r\n Chip,\r\n IconButton,\r\n useMediaQuery,\r\n useTheme,\r\n} from '@material-ui/core';\r\nimport { Autocomplete } from '@material-ui/lab';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport { isNullOrEmpty, isNullOrUndefined, isNullOrWhitespace } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { ItemType } from '../../helpers/Constants';\r\nimport { Delete, CloudUpload, Cancel, Check } from '@material-ui/icons';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n docWrapper: {\r\n '& .MuiDialog-paper': {\r\n flexDirection: 'row',\r\n height: '800px',\r\n maxHeight: '100%',\r\n [theme.breakpoints.down('sm')]: {\r\n flexDirection: 'column',\r\n height: '100%',\r\n },\r\n },\r\n },\r\n leftArea: {\r\n flexGrow: 1,\r\n backgroundColor: Colours.offerWhite,\r\n overflowY: 'auto',\r\n },\r\n rightArea: {\r\n width: 400,\r\n padding: 16,\r\n backgroundColor: Colours.white,\r\n WebkitBoxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n MozBoxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n boxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n [theme.breakpoints.down('sm')]: {\r\n width: '100%',\r\n },\r\n },\r\n topPaneButton: {\r\n marginTop: 8,\r\n },\r\n item: {\r\n paddingLeft: 30,\r\n paddingRight: 30,\r\n '& .MuiListItemIcon-root': {\r\n minWidth: 40,\r\n },\r\n '& svg': {\r\n fill: Colours.black,\r\n transform: 'scale(1.5)',\r\n },\r\n '& .MuiTypography-body1': {\r\n color: Colours.primary,\r\n },\r\n '&.Mui-selected': {\r\n backgroundColor: Colours.primary,\r\n '& .MuiTypography-body1': {\r\n color: Colours.white,\r\n },\r\n '& svg': {\r\n fill: Colours.white,\r\n },\r\n '&:hover': {\r\n backgroundColor: Colours.primaryDark,\r\n },\r\n },\r\n },\r\n button: {\r\n justifyContent: 'space-between',\r\n maxWidth: 200,\r\n height: 44,\r\n '&.red': {\r\n backgroundColor: Colours.red,\r\n '&:hover': {\r\n backgroundColor: Colours.darkRed,\r\n },\r\n '&.Mui-disabled': {\r\n backgroundColor: Colours.bodyText,\r\n },\r\n },\r\n },\r\n loading: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '100%',\r\n width: '100%',\r\n },\r\n selectArea: {\r\n '& .MuiInputBase-root': {\r\n paddingTop: 23,\r\n paddingBottom: 4,\r\n },\r\n },\r\n closeBtn: {\r\n position: 'absolute',\r\n top: 2,\r\n right: 2,\r\n },\r\n}));\r\n\r\nexport function Documents(props) {\r\n const { open, pickOnly, onClose, onSelect, companyId } = props;\r\n const [ships, setShips] = React.useState([]);\r\n const [userGroups, setUserGroups] = React.useState([]);\r\n const [folders, setFolders] = React.useState([]);\r\n const [documentUrl, setDocumentUrl] = React.useState(null);\r\n const [selectedItem, setSelectedItem] = React.useState(null);\r\n const [showNewFile, setShowNewFile] = React.useState(false);\r\n const [showNewFolder, setShowNewFolder] = React.useState(false);\r\n const [showDeleteItem, setShowDeleteItem] = React.useState(false);\r\n const [itemName, setItemName] = React.useState('');\r\n const [itemDesc, setItemDesc] = React.useState('');\r\n const [itemFile, setItemFile] = React.useState('');\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const [saving, setSaving] = React.useState(false);\r\n const theme = useTheme();\r\n const matches = useMediaQuery(theme.breakpoints.down('xs'));\r\n const classes = useStyles();\r\n\r\n const loadShips = React.useCallback(async () => {\r\n const response = await ShipController.getShips(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setShips(response.data);\r\n }\r\n }, [companyId]);\r\n\r\n const loadUserGroups = React.useCallback(async () => {\r\n const response = await UserGroupController.getUserGroups(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(response.data);\r\n }\r\n }, [companyId]);\r\n\r\n const loadInnerFolderRecursively = React.useCallback(\r\n async folder => {\r\n const { id, documentItems } = folder;\r\n const response = await DocumentController.getCompanyCategoryChildren(companyId, id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n return [];\r\n } else {\r\n const folderCopy = { ...folder };\r\n folderCopy.childFolders = response.data;\r\n for (let i = 0; i < folderCopy.childFolders.length; i++) {\r\n const innerFolder = { ...folderCopy.childFolders[i] };\r\n folderCopy.childFolders[i] = await loadInnerFolderRecursively(innerFolder);\r\n }\r\n folderCopy.documentItems = documentItems.map(e => ({ ...e, parentId: id }));\r\n return folderCopy;\r\n }\r\n },\r\n [companyId]\r\n );\r\n\r\n const loadFolders = React.useCallback(async () => {\r\n const response = await DocumentController.getCompanyRootCategories(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const folderMap = [];\r\n for (let i = 0; i < response.data.length; i++) {\r\n folderMap.push(await loadInnerFolderRecursively(response.data[i]));\r\n }\r\n setFolders(folderMap);\r\n }\r\n }, [companyId, loadInnerFolderRecursively]);\r\n\r\n const loadDocumentUrl = React.useCallback(\r\n async document => {\r\n const { id, parentId } = document;\r\n const response = await DocumentController.getCompanyCategoryItem(companyId, parentId, id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setDocumentUrl(response.data);\r\n }\r\n },\r\n [companyId]\r\n );\r\n\r\n React.useEffect(() => {\r\n async function init() {\r\n if (pickOnly !== true) {\r\n await loadShips();\r\n await loadUserGroups();\r\n }\r\n await loadFolders();\r\n }\r\n if (open) {\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }\r\n }, [open, pickOnly, loadFolders, loadShips, loadUserGroups]);\r\n\r\n React.useEffect(() => {\r\n setDocumentUrl(null);\r\n if (!isNullOrUndefined(selectedItem)) {\r\n loadDocumentUrl(selectedItem);\r\n }\r\n }, [selectedItem, loadDocumentUrl]);\r\n\r\n function getItemType(item) {\r\n return 'documentItems' in item ? ItemType.Folder : ItemType.File;\r\n }\r\n\r\n function handleInput(event) {\r\n const { name, value, files } = event.target;\r\n switch (name) {\r\n case 'itemName':\r\n setItemName(value);\r\n break;\r\n case 'itemDesc':\r\n setItemDesc(value);\r\n break;\r\n case 'itemFile':\r\n setItemFile(files[0] ?? null);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function handleSelect(values = [], name) {\r\n let newSelectedItem = { ...selectedItem };\r\n for (let i = 0; i < values.length; i++) {\r\n const item = values[i];\r\n if ((selectedItem[name] ?? []).filter(e => e.id === item.id).length === 0) {\r\n // needs adding\r\n const response = await (name === 'ships' ? DocumentController.addShip : DocumentController.addUserGroup)(companyId, newSelectedItem.id, item.id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const newItem = { ...newSelectedItem, [name]: [...(newSelectedItem[name] ?? []), item] };\r\n setFolders(folders.map(e => (e.id === selectedItem.id ? newItem : e)));\r\n newSelectedItem = newItem;\r\n }\r\n }\r\n }\r\n for (let i = 0; i < newSelectedItem[name].length; i++) {\r\n const item = newSelectedItem[name][i];\r\n if (values.filter(e => e.id === item.id).length === 0) {\r\n // needs removing\r\n const response = await (name === 'ships' ? DocumentController.removeShip : DocumentController.removeUserGroup)(companyId, newSelectedItem.id, item.id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const newItem = { ...newSelectedItem, [name]: newSelectedItem[name].filter(o => o.id !== item.id) };\r\n setFolders(folders.map(e => (e.id === selectedItem.id ? newItem : e)));\r\n newSelectedItem = newItem;\r\n }\r\n }\r\n }\r\n setSelectedItem(newSelectedItem);\r\n }\r\n\r\n function handleCloseAndClearFormDialogs() {\r\n setShowNewFile(false);\r\n setShowNewFolder(false);\r\n setItemFile(null);\r\n setItemName('');\r\n setItemDesc('');\r\n }\r\n\r\n async function handleAddNewFolder(event) {\r\n if (!isNullOrUndefined(event.preventDefault)) {\r\n event.preventDefault();\r\n }\r\n setSaving(true);\r\n\r\n const response = await DocumentController.createCategory(companyId, itemName, itemDesc, selectedItem?.id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else if (isNullOrUndefined(selectedItem)) {\r\n setFolders([...folders, { ...response.data, childFolders: [], documentItems: [] }]);\r\n } else {\r\n setFolders(handleAddNestedFolder(selectedItem?.id, response.data));\r\n }\r\n\r\n setSaving(false);\r\n handleCloseAndClearFormDialogs();\r\n }\r\n\r\n function handleAddNestedFolder(parentFolderId, folderToAdd, srcArray = folders) {\r\n for (let i = 0; i < srcArray.length; i++) {\r\n const folder = srcArray[i];\r\n if (folder.id === parentFolderId) {\r\n srcArray[i].childFolders = [...folder.childFolders, { ...folderToAdd, childFolders: [], documentItems: [] }];\r\n return srcArray;\r\n } else {\r\n handleAddNestedFolder(parentFolderId, folderToAdd, srcArray[i].childFolders);\r\n }\r\n }\r\n return srcArray;\r\n }\r\n\r\n async function handleAddNewFile(event) {\r\n if (!isNullOrUndefined(event.preventDefault)) {\r\n event.preventDefault();\r\n }\r\n setSaving(true);\r\n\r\n const response = await DocumentController.addDocumentItem(companyId, selectedItem?.id, itemName, itemDesc, itemFile);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setFolders(handleAddNewDocumentItem(selectedItem?.id, response.data));\r\n }\r\n\r\n setSaving(false);\r\n handleCloseAndClearFormDialogs();\r\n }\r\n\r\n function handleAddNewDocumentItem(parentFolderId, documentToAdd, srcArray = folders) {\r\n for (let i = 0; i < srcArray.length; i++) {\r\n const folder = srcArray[i];\r\n if (folder.id === parentFolderId) {\r\n srcArray[i].documentItems = [...(folder.documentItems ?? []), documentToAdd];\r\n return srcArray;\r\n } else {\r\n handleAddNewDocumentItem(parentFolderId, documentToAdd, srcArray[i].childFolders);\r\n }\r\n }\r\n return srcArray;\r\n }\r\n\r\n async function handleDeleteSelectedItem() {\r\n setSaving(true);\r\n\r\n const isFolder = getItemType(selectedItem) === ItemType.Folder;\r\n const response = await (isFolder ? DocumentController.deleteCategory : DocumentController.deleteDocumentItem)(companyId, selectedItem.id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setFolders(handleFindAndRemoveItem(selectedItem));\r\n setSelectedItem(null);\r\n }\r\n\r\n setShowDeleteItem(false);\r\n setSaving(false);\r\n }\r\n\r\n function handleFindAndRemoveItem(item, srcArray = folders) {\r\n const isFolder = getItemType(item) === ItemType.Folder;\r\n for (let i = 0; i < srcArray.length; i++) {\r\n if (!isFolder) {\r\n srcArray[i].documentItems = srcArray[i].documentItems.filter(e => e.id !== item.id);\r\n }\r\n srcArray[i].childFolders = handleFindAndRemoveItem(item, srcArray[i].childFolders ?? []);\r\n }\r\n return isFolder ? srcArray.filter(e => e.id !== item.id) : srcArray;\r\n }\r\n\r\n function buildLeftPane() {\r\n if (loading) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n return {folders.map(e => buildFolderItemContent(e))};\r\n }\r\n\r\n function buildFolderItemContent(item, depth = 0) {\r\n const items = [];\r\n items.push(buildItem(item, depth));\r\n if (getItemType(item) === ItemType.Folder) {\r\n for (let i = 0; i < (item.childFolders ?? []).length; i++) {\r\n const folder = item.childFolders[i];\r\n items.push(buildFolderItemContent(folder, depth + 1));\r\n }\r\n for (let i = 0; i < (item.documentItems ?? []).length; i++) {\r\n const doc = item.documentItems[i];\r\n items.push(buildItem(doc, depth + 1));\r\n }\r\n }\r\n return items;\r\n }\r\n\r\n function buildItem(item, indent = 0) {\r\n const { id, title } = item;\r\n const selected = id === selectedItem?.id;\r\n return (\r\n setSelectedItem(selected ? null : item)}\r\n className={classes.item}\r\n style={{ paddingLeft: indent === 0 ? 30 : 30 + indent * 40 }}\r\n >\r\n {buildItemIcon(item)}\r\n \r\n \r\n );\r\n }\r\n\r\n function buildItemIcon(item) {\r\n const isFolder = getItemType(item) === ItemType.Folder;\r\n if (isFolder) {\r\n return ;\r\n }\r\n const typeName = String(item.fileType);\r\n switch (typeName) {\r\n case 'application/pdf':\r\n return ;\r\n default:\r\n if (typeName.includes('image')) {\r\n return ;\r\n }\r\n return ;\r\n }\r\n }\r\n\r\n function buildRightPane() {\r\n if (isNullOrUndefined(selectedItem)) {\r\n return buildHowToContent();\r\n }\r\n return getItemType(selectedItem) === ItemType.Folder ? buildFolderOptions(selectedItem) : buildDocumentOptions(selectedItem);\r\n }\r\n\r\n function buildHowToContent() {\r\n return (\r\n <>\r\n \r\n How To\r\n \r\n \r\n {pickOnly !== true\r\n ? `To get started either create a new folder or select \r\n an existing folder. Files can only be added below the \r\n root level.`\r\n : `Select a document from inside one of the folders on the \r\n left and press 'Select' to confirm your choice.`}\r\n \r\n {pickOnly !== true && buildAddNewFolderButton()}\r\n \r\n );\r\n }\r\n\r\n function buildOptionsHeader(item) {\r\n const typeName = String(item.fileType);\r\n const { title, description } = item;\r\n return (\r\n <>\r\n \r\n \r\n Options for...\r\n \r\n \r\n {buildItemIcon(item)}\r\n \r\n \r\n \r\n {!isNullOrEmpty(description) && !isNullOrWhitespace(description) ? (\r\n <>\r\n \r\n \r\n File Description\r\n \r\n \r\n {typeName.includes('image') && !isNullOrUndefined(documentUrl) && (\r\n \r\n {title}\r\n \r\n )}\r\n \r\n \r\n {description}\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n }\r\n\r\n function buildFolderOptions(folder) {\r\n const isRoot = folders.filter(e => e.id === folder.id).length > 0;\r\n const { childFolders, documentItems } = folder;\r\n return (\r\n \r\n {buildOptionsHeader(folder)}\r\n {pickOnly !== true ? (\r\n <>\r\n {isRoot ? buildRootFolderPermissions() : buildNoPermissionsText()}\r\n \r\n {buildAddNewFolderButton()}\r\n \r\n \r\n {buildAddNewDocumentButton()}\r\n \r\n \r\n {buildDeleteItemButton(childFolders.length > 0 || documentItems.length > 0)}\r\n \r\n \r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n }\r\n\r\n function buildNoPermissionsText() {\r\n return (\r\n <>\r\n \r\n \r\n Access Permissions\r\n \r\n \r\n \r\n \r\n Cannot specify access permissions below top level. Please assign permissions from the root folder.\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildRootFolderPermissions() {\r\n return (\r\n <>\r\n \r\n \r\n Access Permissions\r\n \r\n \r\n \r\n {buildAutocompleteFromList(ships, selectedItem?.ships ?? [], 'Ships', 'ships')}\r\n \r\n \r\n {buildAutocompleteFromList(userGroups, selectedItem?.userGroups ?? [], 'User Groups', 'userGroups')}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildDocumentOptions(document) {\r\n return (\r\n \r\n {buildOptionsHeader(document)}\r\n {pickOnly !== true && buildNoPermissionsText()}\r\n \r\n {pickOnly !== true ? buildDeleteItemButton() : buildSelectItemButton(document)}\r\n \r\n \r\n );\r\n }\r\n\r\n function buildAutocompleteFromList(array, value, label, name) {\r\n return (\r\n e.name}\r\n getOptionSelected={e => value.filter(a => a.id === e.id).length > 0}\r\n className={classes.selectArea}\r\n onChange={(_, values) => handleSelect(values, name)}\r\n value={value}\r\n placeholder=\"Search by Name\"\r\n filterSelectedOptions\r\n renderInput={params => }\r\n renderTags={(value, getTagProps) => value.map((option, index) => )}\r\n />\r\n );\r\n }\r\n\r\n function buildAddNewFolderButton() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n function buildAddNewDocumentButton() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n function buildDeleteItemButton(disabled = false) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n function buildSelectItemButton(document) {\r\n return (\r\n !isNullOrUndefined(onSelect) && (\r\n }\r\n onClick={() => {\r\n onSelect({ ...document, url: documentUrl });\r\n onClose();\r\n }}\r\n color=\"primary\"\r\n fullWidth\r\n >\r\n Select\r\n \r\n )\r\n );\r\n }\r\n\r\n function buildAddNewItemDialog() {\r\n return (\r\n handleCloseAndClearFormDialogs()}>\r\n
\r\n {showNewFile ? 'Add New File' : 'Add New Folder'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {showNewFile ? (\r\n \r\n \r\n Select File (optional)\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildConfirmDeleteDialog() {\r\n return (\r\n setShowDeleteItem(false)}>\r\n Delete Item\r\n \r\n \r\n Are you sure you want to delete {selectedItem?.title ?? ' the selected item'}?\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildErrorDialog() {\r\n return (\r\n setWarning(null)}>\r\n Error\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n onClose();\r\n setSelectedItem(null);\r\n }}\r\n className={classes.docWrapper}\r\n maxWidth=\"lg\"\r\n fullWidth\r\n >\r\n
{buildLeftPane()}
\r\n
\r\n {buildRightPane()}\r\n {\r\n onClose();\r\n setSelectedItem(null);\r\n }}\r\n >\r\n \r\n \r\n
\r\n \r\n\r\n {buildAddNewItemDialog()}\r\n {buildConfirmDeleteDialog()}\r\n {buildErrorDialog()}\r\n \r\n );\r\n}\r\n\r\nDocuments.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onSelect: PropTypes.func,\r\n pickOnly: PropTypes.bool,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { CircularProgress, Backdrop, makeStyles } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n backdrop: {\r\n zIndex: 10,\r\n },\r\n}));\r\n\r\nexport function LoadingOverlay(props) {\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nLoadingOverlay.propTypes = {\r\n loading: PropTypes.bool.isRequired,\r\n};\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst CompanyController = {\r\n getCompanyUsers,\r\n getCompanyFiltererdUsers,\r\n getCurrentMagicLinks,\r\n getUserProfilePic,\r\n getMagicLinkProfilePic,\r\n editUser,\r\n getUsersRestPeriodDate,\r\n getUsersRestPeriodDocument,\r\n getMassRestPeriodDocument,\r\n sendCompanyPushNotif,\r\n getCompanies,\r\n addCompany,\r\n updateCompany,\r\n getCompanyLogo,\r\n switchCompany,\r\n};\r\n\r\nasync function getCompanyUsers(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANY_USERS(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCompanyFiltererdUsers(companyId, userQuery, shipQuery) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_FILTERED_COMPANY_USERS(companyId) + `?userQuery=${userQuery}&shipQuery=${shipQuery}`, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCurrentMagicLinks(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_CURRENT_MAGIC_LINKS(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getUserProfilePic(companyId, userId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_USER_PROFILE_PIC(companyId, userId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getMagicLinkProfilePic(companyId, userName) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_MAGIC_LINK_PROFILE_PIC(companyId, userName), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editUser(\r\n companyId,\r\n id,\r\n email,\r\n firstName,\r\n lastName,\r\n phoneNumber,\r\n profilePic,\r\n deleteImage,\r\n companyRole,\r\n userGroupsId,\r\n restPeriodsEnabled,\r\n canGenerateNFCTags,\r\n rank,\r\n secondaryEmail = null\r\n) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('id', id);\r\n formData.append('email', email);\r\n formData.append('secondaryEmail', secondaryEmail);\r\n formData.append('firstName', firstName);\r\n formData.append('lastName', lastName);\r\n if (phoneNumber !== null) {\r\n formData.append('phoneNumber', phoneNumber);\r\n }\r\n formData.append('profilePic', profilePic);\r\n formData.append('deleteImage', deleteImage);\r\n formData.append('companyRole', companyRole);\r\n formData.append('userGroupsId', userGroupsId);\r\n formData.append('restPeriodsEnabled', restPeriodsEnabled);\r\n formData.append('canGenerateNFCTags', canGenerateNFCTags);\r\n formData.append('rank', rank);\r\n\r\n return Axios.post(APIRoute + APIPath.EDIT_USER(companyId), formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getUsersRestPeriodDate(companyId, userId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_USER_REST_PERIOD_DATES(companyId, userId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getUsersRestPeriodDocument(companyId, userId, startDate) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.GET_USER_REST_PERIOD_DOCUMENT(companyId), { userId, startDate }, userHeaders)\r\n .then(response => {\r\n return { ...generateResponse(false, response.data, response), response };\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getMassRestPeriodDocument(companyId, userIds, shipId, startDate) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.GET_MASS_REST_PERIOD_DOCUMENT(companyId), { userIds, shipId, startDate }, userHeaders)\r\n .then(response => {\r\n return { ...generateResponse(false, response.data, response), response };\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function sendCompanyPushNotif(companyId, messageTitle, messageContent, shipIds, userGroupIds) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.SEND_COMPANY_PUSH_NOTIF(companyId), { messageTitle, messageContent, shipIds, userGroupIds }, userHeaders)\r\n .then(response => {\r\n return { ...generateResponse(false, response.data, response), response };\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCompanies(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANIES(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addCompany(companyId, name, logo) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('name', name);\r\n if (logo != null) {\r\n formData.append('logo', logo);\r\n }\r\n return Axios.post(APIRoute + APIPath.ADD_COMPANY(companyId), formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function updateCompany(companyId, name, logo, scoreFrom) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('id', companyId);\r\n formData.append('name', name);\r\n if (logo != null) {\r\n formData.append('logo', logo);\r\n }\r\n if (scoreFrom != null) {\r\n formData.append('scoreFrom', scoreFrom);\r\n }\r\n return Axios.post(APIRoute + APIPath.UPDATE_COMPANY(companyId), formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCompanyLogo(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANY_LOGO(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function switchCompany(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.SWITCH_COMPANY(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default CompanyController;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Grid, TextField } from '@material-ui/core';\r\nimport { Autocomplete } from '@material-ui/lab';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport CompanyController from '../../controllers/CompanyController';\r\n\r\nfunction SendPushNotificationRender(props) {\r\n const { open, companyId, onClose } = props;\r\n\r\n const [initialized, setInitialized] = React.useState(false);\r\n const [ships, setShips] = React.useState([]);\r\n const [userGroups, setUserGroups] = React.useState([]);\r\n const [title, setTitle] = React.useState('');\r\n const [message, setMessage] = React.useState('');\r\n const [selectedShips, setSelectedShips] = React.useState([]);\r\n const [selectedUserGroups, setSelectedUserGroups] = React.useState([]);\r\n const [loading, setLoading] = React.useState(false);\r\n const [warning, setWarning] = React.useState(null);\r\n\r\n React.useEffect(() => {\r\n async function Init() {\r\n setLoading(true);\r\n const shipResponse = await ShipController.getShips(companyId);\r\n if (shipResponse.hasError) {\r\n setWarning('Failed to load ships - ' + shipResponse.data);\r\n setLoading(false);\r\n return;\r\n }\r\n setShips(shipResponse.data);\r\n const userGroupResponse = await UserGroupController.getUserGroups(companyId);\r\n if (userGroupResponse.hasError) {\r\n setWarning('Failed to load user groups - ' + userGroupResponse.data);\r\n setLoading(false);\r\n return;\r\n }\r\n setUserGroups(userGroupResponse.data);\r\n setInitialized(true);\r\n setLoading(false);\r\n }\r\n\r\n if (open && !initialized) {\r\n Init();\r\n }\r\n }, [open, initialized, companyId, setInitialized, setShips, setUserGroups, setLoading]);\r\n\r\n React.useEffect(() => {\r\n // on company Id change, Clear all cached Data\r\n setShips([]);\r\n setUserGroups([]);\r\n setInitialized(false);\r\n }, [companyId, setInitialized, setShips, setUserGroups]);\r\n\r\n function handleSelect(values = [], name) {\r\n switch (name) {\r\n case 'Ships':\r\n setSelectedShips(values);\r\n break;\r\n case 'UserGroup':\r\n setSelectedUserGroups(values);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function handelSend() {\r\n setLoading(true);\r\n setWarning(null);\r\n if (message.length === 0 || title.length === 0) {\r\n setWarning('The title and message must not be empty');\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n if (selectedShips.length === 0) {\r\n setWarning('You must select at least one ship');\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n const response = await CompanyController.sendCompanyPushNotif(\r\n companyId,\r\n title,\r\n message,\r\n selectedShips.map(e => e.id),\r\n selectedUserGroups.map(e => e.id)\r\n );\r\n if (response.hasError) {\r\n setWarning('Failed to send Push Notification - ' + response.data);\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n setLoading(false);\r\n handelClose();\r\n }\r\n\r\n function handelClose() {\r\n setWarning(null);\r\n setTitle('');\r\n setMessage('');\r\n setSelectedShips([]);\r\n setSelectedUserGroups([]);\r\n setLoading(false);\r\n onClose();\r\n }\r\n\r\n function buildAutocompleteFromList(array, value, label, name) {\r\n return (\r\n e.name}\r\n getOptionSelected={e => value.filter(a => a.id === e.id).length > 0}\r\n /*className={classes.selectArea}*/\r\n onChange={(_, values) => handleSelect(values, name)}\r\n value={value}\r\n placeholder=\"Search by Name\"\r\n filterSelectedOptions\r\n renderInput={params => }\r\n renderTags={(value, getTagProps) => value.map((option, index) => )}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n \r\n Send Push Notification\r\n \r\n \r\n \r\n \r\n {warning !== null ? : null}\r\n \r\n \r\n setTitle(e.target.value)} />\r\n \r\n \r\n setMessage(e.target.value)} />\r\n \r\n \r\n {buildAutocompleteFromList(ships, selectedShips, 'Ships *', 'Ships')}\r\n \r\n \r\n {buildAutocompleteFromList(userGroups, selectedUserGroups, 'User Groups', 'UserGroup')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst SendPushNotification = React.memo(SendPushNotificationRender, function areEqual(prevProps, currentProps) {\r\n return prevProps.open === currentProps.open && prevProps.companyId === currentProps.companyId;\r\n});\r\n\r\nexport default SendPushNotification;\r\n\r\nSendPushNotificationRender.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n};\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst FeedbackController = {\r\n createTicket,\r\n};\r\n\r\nasync function createTicket(message, image) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('Message', message);\r\n formData.append('Source', 'Yacht Knowledge Admin Portal');\r\n formData.append('Image', image, 'screenshot.png');\r\n return Axios.post(APIRoute + APIPath.FEEDBACK_CREATE_TICKET, formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default FeedbackController;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { IconButton, makeStyles, Paper, TextField, Typography, Button } from '@material-ui/core';\r\nimport html2canvas from 'html2canvas';\r\nimport { Cancel } from '@material-ui/icons';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport FeedbackController from '../../controllers/FeedbackController';\r\nimport { Alert } from '../../components/Common/Alert';\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position: 'fixed',\r\n width: '600px',\r\n bottom: '10px',\r\n right: '10px',\r\n zIndex: 20,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: 20,\r\n [theme.breakpoints.down('sm')]: {\r\n width: 'calc(100% - 80px)',\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n width: 'calc(100% - 20px)',\r\n },\r\n '& .closeButton': {\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n },\r\n '& .feedbackMessage': {\r\n margin: '20px 0px',\r\n },\r\n '& .screenshot': {\r\n maxHeight: '50vh',\r\n objectFit: 'contain',\r\n },\r\n },\r\n}));\r\n\r\nexport default function Feedback({ open, onClose }) {\r\n const classes = useStyles();\r\n const [image, setImage] = React.useState(null);\r\n const [message, setMessage] = React.useState('');\r\n const [loading, setLoading] = React.useState(false);\r\n const [warning, setWarning] = React.useState(null);\r\n\r\n React.useEffect(() => {\r\n async function generateImage() {\r\n var node = document.getElementById('root');\r\n try {\r\n const canvas = await html2canvas(node, { allowTaint: false });\r\n setImage(canvas.toDataURL());\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n\r\n if (!open) {\r\n setImage(null);\r\n } else if (image === null) {\r\n generateImage();\r\n }\r\n }, [open, image, setImage]);\r\n\r\n async function submitFeedback() {\r\n if (message.trim().length === 0) {\r\n setWarning('Please enter a message');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setWarning(null);\r\n //Convert image to blob\r\n const imageBlob = await (await fetch(image)).blob();\r\n const response = await FeedbackController.createTicket(message, imageBlob);\r\n if (response.hasError) {\r\n setWarning('Failed to submit ticket');\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n setLoading(false);\r\n onClose();\r\n }\r\n\r\n if (!open || image === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n SubmitFeedback\r\n \r\n \"Screenshot\"\r\n setMessage(e.target.value)} className=\"feedbackMessage\" fullWidth />\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nFeedback.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport * as signalR from '@microsoft/signalr';\r\nimport { Link } from 'react-router-dom';\r\nimport { CompanyRole, Role, SIGNALRPath } from '../../helpers/Constants';\r\nimport { push } from 'connected-react-router';\r\nimport PropTypes from 'prop-types';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport Drawer from '@material-ui/core/Drawer';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { connect } from 'react-redux';\r\nimport NotificationsIcon from '@material-ui/icons/Notifications';\r\nimport { Badge, Divider, Paper, Tooltip, ListItemIcon } from '@material-ui/core';\r\nimport NotificationsController from '../../controllers/NotificationsController';\r\nimport moment from 'moment';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport UserController from '../../controllers/UserController';\r\nimport { AddNotif, AddNotifs, MarkAsRead, MarkAllAsRead, ClearAll } from '../../stores/Actions/Notifications';\r\nimport DashboardIcon from '@material-ui/icons/Dashboard';\r\nimport DirectionsBoatIcon from '@material-ui/icons/DirectionsBoat';\r\nimport GroupIcon from '@material-ui/icons/Group';\r\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\r\nimport HelpOutlineIcon from '@material-ui/icons/HelpOutline';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport { DarkMenuItem } from '../../components/Common/DarkMenuItem';\r\nimport { Documents } from '../Documents/Documents';\r\nimport { Feedback, PermDeviceInformation, Business } from '@material-ui/icons';\r\nimport SendPushNotification from '../PushNotifcation/SendPushNotification';\r\nimport FeedbackDialog from './Feedback';\r\nconst drawerWidth = 260;\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n maxHeight: '100vh',\r\n },\r\n drawer: {\r\n flexShrink: 0,\r\n },\r\n appBar: {\r\n position: 'fixed',\r\n left: 0,\r\n height: '100%',\r\n width: 50,\r\n paddingTop: 16,\r\n paddingBottom: 16,\r\n paddingRight: '0px !important',\r\n backgroundColor: Colours.white,\r\n [theme.breakpoints.down('xs')]: {\r\n width: `100%`,\r\n height: 50,\r\n padding: '0 16px',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n },\r\n '&.hidden-nav': {\r\n display: 'none',\r\n },\r\n },\r\n menuButton: {\r\n display: 'none',\r\n [theme.breakpoints.down('xs')]: {\r\n display: 'unset',\r\n },\r\n },\r\n drawerPaper: {\r\n width: drawerWidth,\r\n '& .MuiTypography-body1': {\r\n fontSize: 14,\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n marginTop: '0',\r\n },\r\n },\r\n content: {\r\n flexGrow: 1,\r\n minHeight: '100vh',\r\n paddingLeft: 50,\r\n '&.hidden-nav': {\r\n paddingLeft: 0 + ' !important',\r\n paddingTop: 0 + ' !important',\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n paddingLeft: 0,\r\n paddingTop: 50,\r\n },\r\n },\r\n avatarButton: {\r\n minWidth: 'unset',\r\n borderRadius: 64,\r\n padding: 0,\r\n right: 0,\r\n top: 0,\r\n [theme.breakpoints.up('sm')]: {\r\n marginBottom: 8,\r\n },\r\n },\r\n notifButton: {},\r\n notifWrapper: {\r\n maxHeight: 500,\r\n overflowY: 'auto',\r\n },\r\n notif: {\r\n position: 'relative',\r\n padding: '12px 16px',\r\n width: 260,\r\n },\r\n notifViewAll: {\r\n position: 'absolute',\r\n top: 14,\r\n right: 16,\r\n },\r\n permanentTools: {\r\n display: 'flex',\r\n flexDirection: 'column-reverse',\r\n width: '100%',\r\n [theme.breakpoints.down('xs')]: {\r\n flexDirection: 'row',\r\n height: '100%',\r\n width: 'unset',\r\n },\r\n },\r\n desktopButton: {\r\n [theme.breakpoints.down('xs')]: {\r\n display: 'none',\r\n },\r\n },\r\n}));\r\n\r\n/**\r\n * TODO: refactor to separate SignalR concerns?\r\n */\r\nfunction NavMenu(props) {\r\n const { PushHistory, AddNotif, AddNotifs, MarkAsRead, MarkAllAsRead, Notifications, container, ClearAllNotifs } = props;\r\n const { userName, isAuthenticated, role, companyRole } = props.LogIn;\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const [mobileOpen, setMobileOpen] = React.useState(false);\r\n const [userMenuOpen, setUserMenuOpen] = React.useState(false);\r\n const [notifTrayOpen, setNotifTrayOpen] = React.useState(false);\r\n const [profileAnchorEl, setProfileAnchorEl] = React.useState(null);\r\n const [notifAnchorEl, setNotifAnchorEl] = React.useState(null);\r\n const [showBadge, setShowBadge] = React.useState(false);\r\n const [totalUnread, setTotalUnread] = React.useState(0);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [hubConnection, setHubConnection] = React.useState(null);\r\n const [showDocs, setShowDocs] = React.useState(false);\r\n const [showPushNotif, setShowPushNotif] = React.useState(false);\r\n const [showFeedbackScreen, setShowFeedbackScreen] = React.useState(false);\r\n\r\n const hasCompany = () => !isNullOrUndefined(props.LogIn.companyId);\r\n\r\n // initialise data\r\n React.useEffect(() => {\r\n async function init() {\r\n const totalResponse = await NotificationsController.getUnreadCount();\r\n if (!totalResponse.hasError) {\r\n setTotalUnread(totalResponse.data);\r\n if (totalResponse.data > 0) {\r\n setShowBadge(true);\r\n }\r\n }\r\n const notifsResponse = await NotificationsController.getTop();\r\n if (!notifsResponse.hasError) {\r\n AddNotifs(notifsResponse.data);\r\n }\r\n }\r\n if (isAuthenticated) {\r\n init();\r\n }\r\n }, [AddNotifs, isAuthenticated]);\r\n\r\n // intialise signalR\r\n React.useEffect(() => {\r\n async function cleanUpNotifications() {\r\n await hubConnection.stop();\r\n setHubConnection(null);\r\n ClearAllNotifs();\r\n console.log('Cleaned up notifs');\r\n }\r\n\r\n if (isAuthenticated && hubConnection === null) {\r\n const options = {\r\n accessTokenFactory: UserController.getToken,\r\n };\r\n const connection = new signalR.HubConnectionBuilder().withUrl(SIGNALRPath.Notifications, options).withAutomaticReconnect().build();\r\n\r\n connection.on('MarkAsRead', MarkAsRead);\r\n connection.on('MarkAllAsRead', MarkAllAsRead);\r\n connection.on('NewNotification', AddNotif);\r\n connection.start().catch(err => console.error(err));\r\n setHubConnection(connection);\r\n } else if (!isAuthenticated && hubConnection !== null) {\r\n cleanUpNotifications();\r\n }\r\n }, [AddNotif, MarkAsRead, MarkAllAsRead, ClearAllNotifs, hubConnection, isAuthenticated]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n setRedirectUrl(null);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n // notif count\r\n React.useEffect(() => {\r\n async function recalculateUnread() {\r\n let unread = 0;\r\n const totalResponse = await NotificationsController.getUnreadCount();\r\n if (!totalResponse.hasError) {\r\n unread = totalResponse.data;\r\n }\r\n setTotalUnread(unread);\r\n }\r\n if (isAuthenticated) {\r\n recalculateUnread();\r\n }\r\n }, [Notifications, isAuthenticated]);\r\n\r\n function getHiddenNavClass() {\r\n if (!isAuthenticated) {\r\n return 'hidden-nav';\r\n }\r\n return '';\r\n }\r\n\r\n function handleDrawerToggle() {\r\n setMobileOpen(!mobileOpen);\r\n handleUserMenuClose();\r\n handleNotifTrayClose();\r\n }\r\n\r\n function handleUserMenuToggle(event) {\r\n setUserMenuOpen(!userMenuOpen);\r\n setProfileAnchorEl(event.currentTarget);\r\n handleNotifTrayClose();\r\n }\r\n\r\n function handleUserMenuClose() {\r\n setUserMenuOpen(false);\r\n setProfileAnchorEl(null);\r\n }\r\n\r\n function handleNotifTrayToggle(event) {\r\n if (!notifTrayOpen) {\r\n markUnreadAsRead();\r\n setShowBadge(false);\r\n }\r\n setNotifTrayOpen(!notifTrayOpen);\r\n setNotifAnchorEl(event.currentTarget);\r\n handleUserMenuClose();\r\n }\r\n\r\n function handleNotifTrayClose() {\r\n setNotifTrayOpen(false);\r\n setNotifAnchorEl(null);\r\n }\r\n\r\n function viewAllNotifs() {\r\n handleNotifTrayClose();\r\n setRedirectUrl('/Notifications');\r\n }\r\n\r\n function handleSubmitFeedback() {\r\n setMobileOpen(false);\r\n setShowFeedbackScreen(true);\r\n //BugBattle.startBugReporting();\r\n }\r\n\r\n function markUnreadAsRead() {\r\n NotificationsController.markAllAsRead();\r\n MarkAllAsRead();\r\n setTotalUnread(0);\r\n }\r\n\r\n function buildDrawerOptionLink(name, route, icon, key = null) {\r\n return (\r\n \r\n {icon}\r\n \r\n \r\n );\r\n }\r\n\r\n function buildDrawerOptionFunc(name, func, icon, key = null) {\r\n return (\r\n {\r\n func();\r\n handleDrawerToggle();\r\n }}\r\n >\r\n {icon}\r\n \r\n \r\n );\r\n }\r\n\r\n function buildDrawerOptionOnClick(name, func, icon, key = null) {\r\n return (\r\n \r\n {icon}\r\n \r\n \r\n );\r\n }\r\n\r\n function buildDrawerOptions() {\r\n const drawerOptions = [];\r\n if (userName) {\r\n drawerOptions.push(buildDrawerOptionLink('Dashboard', '/', ));\r\n drawerOptions.push(buildDrawerOptionLink('Fleet', '/Fleet', ));\r\n drawerOptions.push(buildDrawerOptionLink('Users', '/Users', ));\r\n if (role.includes(Role.Admin)) {\r\n drawerOptions.push(buildDrawerOptionLink('Companies', '/Company', ));\r\n drawerOptions.push(buildDrawerOptionLink('Compliance Management', '/Compliance', ));\r\n }\r\n if (role.includes(Role.Admin) || companyRole === CompanyRole.Owner) {\r\n drawerOptions.push(buildDrawerOptionFunc('Document Management', () => setShowDocs(true), ));\r\n drawerOptions.push(buildDrawerOptionFunc('Push Notification', () => setShowPushNotif(true), ));\r\n }\r\n if (role.includes(Role.Admin)) {\r\n drawerOptions.push(buildDrawerOptionOnClick('Submit Feedback', handleSubmitFeedback, ));\r\n }\r\n }\r\n return {drawerOptions};\r\n }\r\n\r\n function buildProfileOptions() {\r\n return userName ? (\r\n <>\r\n \r\n \r\n \r\n Profile\r\n \r\n \r\n Logout\r\n \r\n \r\n \r\n ) : null;\r\n }\r\n\r\n function buildNotificationTray() {\r\n return userName ? (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {[\r\n \r\n Notifications\r\n \r\n ,\r\n ,\r\n buildNotifications(),\r\n ]}\r\n \r\n \r\n ) : null;\r\n }\r\n\r\n function buildNotifications() {\r\n if (Notifications.length === 0) {\r\n return (\r\n \r\n \r\n No notifications\r\n \r\n \r\n );\r\n }\r\n return
{Notifications.map((e, i) => buildNotification(e, i))}
;\r\n }\r\n\r\n function buildNotification(notif, index) {\r\n const isLastIndex = index === Notifications.length - 1;\r\n const { title, message, created } = notif;\r\n return (\r\n
\r\n \r\n \r\n {title}\r\n \r\n \r\n {message}\r\n \r\n \r\n {moment.utc(created).local().format('D MMMM YYYY')}\r\n \r\n \r\n {!isLastIndex ? : null}\r\n
\r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n {\r\n setShowFeedbackScreen(false);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n
\r\n {buildNotificationTray()}\r\n {buildProfileOptions()}\r\n
\r\n \r\n setRedirectUrl('/')} className={classes.desktopButton}>\r\n \r\n \r\n \r\n \r\n setRedirectUrl('/Fleet')} className={classes.desktopButton}>\r\n \r\n \r\n \r\n \r\n setRedirectUrl('/Users')} className={classes.desktopButton}>\r\n \r\n \r\n \r\n {role.includes(Role.Admin) ? (\r\n <>\r\n \r\n setRedirectUrl('/Company')} className={classes.desktopButton}>\r\n \r\n \r\n \r\n \r\n setRedirectUrl('/Compliance')} className={classes.desktopButton}>\r\n \r\n \r\n \r\n \r\n ) : null}\r\n {role.includes(Role.Admin) || companyRole === CompanyRole.Owner ? (\r\n <>\r\n {' '}\r\n \r\n setShowDocs(true)} className={classes.desktopButton}>\r\n \r\n \r\n \r\n \r\n setShowPushNotif(true)} className={classes.desktopButton}>\r\n \r\n \r\n \r\n \r\n ) : null}\r\n {role.includes(Role.Admin) ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n
\r\n \r\n
{props.children}
\r\n {hasCompany() ? (\r\n <>\r\n setShowDocs(false)} companyId={props.LogIn.companyId} />\r\n {\r\n setShowPushNotif(false);\r\n }}\r\n companyId={props.LogIn.companyId}\r\n />\r\n \r\n ) : null}\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n LogIn: state.Authentication,\r\n Notifications: state.Notifications,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n AddNotif: item => dispatch(AddNotif(item)),\r\n AddNotifs: items => dispatch(AddNotifs(items)),\r\n MarkAsRead: id => dispatch(MarkAsRead(id)),\r\n MarkAllAsRead: () => dispatch(MarkAllAsRead()),\r\n ClearAllNotifs: () => dispatch(ClearAll()),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(NavMenu);\r\n\r\nNavMenu.propTypes = {\r\n container: PropTypes.object,\r\n children: PropTypes.any,\r\n LogIn: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n AddNotif: PropTypes.func,\r\n AddNotifs: PropTypes.func,\r\n MarkAsRead: PropTypes.func,\r\n MarkAllAsRead: PropTypes.func,\r\n Notifications: PropTypes.array,\r\n ClearAllNotifs: PropTypes.func,\r\n};\r\n","export const AddNotif = item => ({\r\n type: 'ADD_NOTIF',\r\n item,\r\n});\r\n\r\nexport const AddNotifs = items => ({\r\n type: 'ADD_NOTIFS',\r\n items,\r\n});\r\n\r\nexport const MarkAsRead = id => ({\r\n type: 'MARK_AS_READ',\r\n id,\r\n});\r\n\r\nexport const MarkAllAsRead = () => ({\r\n type: 'MARK_ALL_AS_READ',\r\n});\r\n\r\nexport const ClearAll = () => ({\r\n type: 'CLEAR_ALL_NOTIFS',\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Button, CardHeader, CardContent, CardActions, Card, Divider } from '@material-ui/core';\r\nimport { connect } from 'react-redux';\r\nimport UserController from '../../controllers/UserController';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position: 'fixed',\r\n top: 74,\r\n zIndex: 25,\r\n right: 10,\r\n width: 400,\r\n [theme.breakpoints.down('xs')]: {\r\n width: 'calc(100% - 20px)',\r\n top: 66,\r\n },\r\n },\r\n}));\r\n\r\nfunction MOTD(props) {\r\n const [hidden, setHidden] = React.useState(true);\r\n const [message, setMessage] = React.useState('');\r\n const classes = useStyles();\r\n\r\n React.useState(() => {\r\n if (!props.LogIn.isAuthenticated) {\r\n return;\r\n }\r\n UserController.getMOTD().then(response => {\r\n if (response.hasError || isNullOrUndefined(response.data) || response.data.length === 0) {\r\n return;\r\n }\r\n setMessage(response.data);\r\n setHidden(false);\r\n });\r\n }, [props]);\r\n\r\n function markAsSeen() {\r\n setHidden(true);\r\n UserController.seenMOTD();\r\n }\r\n\r\n return !hidden ? (\r\n \r\n \r\n \r\n {message}\r\n \r\n \r\n \r\n \r\n ) : null;\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n LogIn: state.Authentication,\r\n});\r\n\r\nexport default connect(mapStateToProps)(MOTD);\r\n\r\nMOTD.propTypes = {\r\n container: PropTypes.object,\r\n children: PropTypes.object,\r\n LogIn: PropTypes.object,\r\n};\r\n","import Axios from 'axios';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst VersionController = {\r\n getVersion,\r\n};\r\n\r\nasync function getVersion(name, currentVersion) {\r\n const data = { name, currentVersion };\r\n return Axios.post(APIRoute + APIPath.GET_VERSION, data)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default VersionController;\r\n","import React from 'react';\r\nimport { versionName, versionNum } from '../../helpers/Constants';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Button, Card, CardHeader, CardContent, CardActions, Divider } from '@material-ui/core';\r\nimport VersionController from '../../controllers/VersionController';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n position: 'fixed',\r\n bottom: 10,\r\n zIndex: 25,\r\n right: 10,\r\n width: 400,\r\n [theme.breakpoints.down('xs')]: {\r\n width: 'calc(100% - 20px)',\r\n },\r\n },\r\n}));\r\n\r\nexport function CheckVersion() {\r\n const [needsUpdate, setNeedsUpdate] = React.useState(false);\r\n const classes = useStyles();\r\n\r\n const refreshNoCache = React.useCallback(() => {\r\n navigator.serviceWorker\r\n .getRegistrations()\r\n .then(async registrations => {\r\n for (let i = 0; i < registrations.length; i++) {\r\n if (!(await registrations[i].unregister())) {\r\n alert('Failed to apply update. Please perform a hard refresh to see the latest changes.');\r\n return false;\r\n }\r\n }\r\n return true;\r\n })\r\n .then(success => {\r\n if (success) {\r\n window.location.reload(true);\r\n } else {\r\n setNeedsUpdate(false);\r\n }\r\n });\r\n }, []);\r\n\r\n const checkVersion = React.useCallback(async () => {\r\n const response = await VersionController.getVersion(versionName, versionNum);\r\n if (response.hasError) {\r\n setTimeout(() => {\r\n checkVersion();\r\n }, 10000);\r\n } else {\r\n setNeedsUpdate(response.data.num > versionNum);\r\n if (response.data.isRequired) {\r\n refreshNoCache();\r\n }\r\n }\r\n }, [refreshNoCache]);\r\n\r\n // initialise\r\n React.useState(() => {\r\n checkVersion();\r\n }, [checkVersion]);\r\n\r\n return needsUpdate ? (\r\n \r\n \r\n \r\n \r\n You have an out of date version currently loaded. This means that you could be missing new features, or experience problems with this version due to the updates. Click the button to\r\n refresh to the latest version.\r\n \r\n \r\n \r\n \r\n \r\n ) : null;\r\n}\r\n","export const LogIn = data => ({\r\n type: 'LOGGED_IN',\r\n data,\r\n});\r\n\r\nexport const LogOut = () => ({\r\n type: 'LOGGED_OUT',\r\n data: {},\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport { push } from 'connected-react-router';\r\nimport { connect } from 'react-redux';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { LogOut } from '../../stores/Actions/Authentication';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core';\r\n\r\nfunction CheckToken(props) {\r\n const { Auth, LogOut, PushHistory } = props;\r\n const [showExpired, setShowExpired] = React.useState(false);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const location = useLocation();\r\n\r\n const getErrorFromObject = React.useCallback(object => {\r\n if (!isNullOrUndefined(object.message) && typeof object.message === 'string') {\r\n return object.message;\r\n } else if (!isNullOrUndefined(object.error) && typeof object.error === 'string') {\r\n return object.error;\r\n } else if (!isNullOrUndefined(object.errorMessage) && typeof object.errorMessage === 'string') {\r\n return object.errorMessage;\r\n }\r\n return 'An error occurred';\r\n }, []);\r\n\r\n const getTextFromError = React.useCallback(\r\n text => {\r\n if (isNullOrUndefined(text)) {\r\n return 'An error occurred';\r\n } else {\r\n if (typeof text === 'string') {\r\n return text;\r\n } else if ((isNullOrUndefined(text.response) || isNullOrUndefined(text.response.data)) && !isNullOrUndefined(text.message)) {\r\n return text.message;\r\n } else if (!isNullOrUndefined(text.response) && !isNullOrUndefined(text.response.data)) {\r\n const data = text.response.data;\r\n if (typeof data === 'string') {\r\n return data;\r\n } else if (typeof data === 'object') {\r\n if (Array.isArray(data)) {\r\n if (data.length > 0) {\r\n return getErrorFromObject(data[0]);\r\n }\r\n } else {\r\n return getErrorFromObject(data);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n [getErrorFromObject]\r\n );\r\n\r\n // check token when location updates\r\n React.useEffect(() => {\r\n async function checkToken() {\r\n if (Auth.isLoggingIn === true || Auth.isAuthenticated === false) {\r\n return;\r\n }\r\n const response = await UserController.getUserInfo();\r\n if (response.hasError) {\r\n const error = getTextFromError(response.data);\r\n if (error.includes('Invalid Token')) {\r\n logout();\r\n return;\r\n }\r\n }\r\n const expired = await UserController.hasTokenExpired();\r\n if (expired) {\r\n logout();\r\n return;\r\n }\r\n }\r\n function logout() {\r\n LogOut();\r\n setRedirectUrl('/Login');\r\n setShowExpired(true);\r\n }\r\n checkToken();\r\n }, [location, LogOut, Auth, setRedirectUrl, setShowExpired, getTextFromError]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n return (\r\n setShowExpired(false)}>\r\n Session Expired\r\n Your previous session has expired, please login again\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n LogOut: () => dispatch(LogOut()),\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(CheckToken);\r\n\r\nCheckToken.propTypes = {\r\n Auth: PropTypes.object,\r\n LogOut: PropTypes.func,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport NavMenu from './NavMenu.js';\r\nimport PropTypes from 'prop-types';\r\nimport MOTD from './MOTD.js';\r\nimport { CheckVersion } from './CheckVersion';\r\nimport CheckToken from './CheckToken';\r\n\r\nexport function Layout(props) {\r\n return (\r\n \r\n \r\n \r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nLayout.propTypes = {\r\n children: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const PrivateRoute = ({ component: Component, roles, role, ...rest }) => (\r\n {\r\n // TODO: may need to reimplement some kind of check here\r\n // to see if the user's token is still valid and throw to\r\n // login screen if not?\r\n\r\n // check if route is restricted by role\r\n if (roles && roles.some(r => role.includes(r))) {\r\n // authorized so return component\r\n return ;\r\n }\r\n\r\n // else return home\r\n return ;\r\n }}\r\n />\r\n);\r\n\r\nPrivateRoute.propTypes = {\r\n component: PropTypes.any,\r\n roles: PropTypes.array,\r\n role: PropTypes.any,\r\n location: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Container, makeStyles } from '@material-ui/core';\r\nimport { Colours } from '../../helpers/Colours';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n minHeight: '100%',\r\n backgroundColor: Colours.offWhite,\r\n [theme.breakpoints.down('sm')]: {\r\n flexDirection: 'column',\r\n },\r\n },\r\n centered: {\r\n display: 'flex',\r\n justifyContent: 'stretch',\r\n alignItems: 'center',\r\n },\r\n leftSide: {\r\n flexGrow: 1,\r\n backgroundImage: props => `url(${props.heroImage})`,\r\n backgroundSize: 'cover',\r\n backgroundPosition: 'center',\r\n [theme.breakpoints.down('sm')]: {\r\n maxHeight: 200,\r\n },\r\n },\r\n rightSide: {\r\n flexGrow: 1,\r\n maxWidth: '45%',\r\n backgroundColor: Colours.offWhite,\r\n [theme.breakpoints.down('md')]: {\r\n paddingTop: 40,\r\n paddingBottom: 40,\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n maxWidth: '100%',\r\n },\r\n },\r\n}));\r\n\r\nexport function AuthLayout(props) {\r\n const { children } = props;\r\n const classes = useStyles(props);\r\n\r\n return (\r\n
\r\n
\r\n {children}\r\n
\r\n );\r\n}\r\n\r\nAuthLayout.propTypes = {\r\n heroImage: PropTypes.string.isRequired,\r\n children: PropTypes.any,\r\n};\r\n","import React from 'react';\r\nimport SentiniLogo from '../../images/fathom-final.png';\r\nimport BridgeImage from '../../images/bridge.png';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { makeStyles, TextField, Button, Grid, Container, FormControlLabel, Checkbox, Link, Typography } from '@material-ui/core';\r\nimport { isNullOrUndefined, checkPassword } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { LogIn } from '../../stores/Actions/Authentication';\r\nimport { AuthLayout } from '../../components/Auth/AuthLayout';\r\nimport { CompanyRole, Role, ShipRole, versionNum } from '../../helpers/Constants';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n formRoot: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n },\r\n logo: {\r\n marginBottom: 32,\r\n maxWidth: 300,\r\n },\r\n checkbox: {\r\n textAlign: 'center',\r\n },\r\n}));\r\n\r\nfunction Login(props) {\r\n const [userName, setUserName] = React.useState('');\r\n const [password, setPassword] = React.useState('');\r\n const [rememberMe, setRememberMe] = React.useState(false);\r\n const [twoFactorTokenRequired, setTwoFactorTokenRequired] = React.useState(false);\r\n const [twoFactorToken, setTwoFactorToken] = React.useState('');\r\n const [passwordResetRequired, setPasswordResetRequired] = React.useState(false);\r\n const [passwordReset, setPasswordReset] = React.useState('');\r\n const [passwordResetConfirmation, setPasswordResetConfirmation] = React.useState(null);\r\n const [passwordRequirements, setPasswordRequirements] = React.useState(null);\r\n const [passwordErrors, setPasswordErrors] = React.useState([]);\r\n const [submitting, setSubmitting] = React.useState(false);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warningText, setWarningText] = React.useState(null);\r\n const classes = useStyles();\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n const pwordReqResponse = await UserController.getPasswordRequirements();\r\n if (!pwordReqResponse.hasError) {\r\n setPasswordRequirements(pwordReqResponse.data);\r\n } else {\r\n setWarningText('Failed to fetch password requirements');\r\n }\r\n }\r\n init();\r\n }, []);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (isNullOrUndefined(redirectUrl)) {\r\n return;\r\n }\r\n props.PushHistory(redirectUrl);\r\n }, [redirectUrl, props]);\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault();\r\n setSubmitting(true);\r\n setWarningText(null);\r\n\r\n const response = passwordResetRequired\r\n ? await UserController.loginWithPasswordReset(userName, password, rememberMe, twoFactorToken, passwordReset, passwordResetConfirmation)\r\n : await UserController.login(userName, password, rememberMe, twoFactorToken);\r\n if (!response.hasError) {\r\n const { userName, role, companyId, companyRole, shipRoles, id } = response.data;\r\n login(id, userName, role, companyId, companyRole, shipRoles);\r\n } else {\r\n if (response.data?.response?.data === 'TwoFactorRequired') {\r\n setTwoFactorTokenRequired(true);\r\n } else if (response.data?.response?.data === 'PasswordResetRequired') {\r\n setPasswordResetRequired(true);\r\n } else {\r\n setWarningText(response.data);\r\n }\r\n setSubmitting(false);\r\n }\r\n }\r\n\r\n function handleInput(event) {\r\n const { name, value, checked } = event.target;\r\n switch (name) {\r\n case 'userName':\r\n setUserName(value);\r\n break;\r\n case 'password':\r\n setPassword(value);\r\n break;\r\n case 'twoFactorToken':\r\n setTwoFactorToken(value);\r\n break;\r\n case 'newPassword':\r\n setPasswordReset(value);\r\n break;\r\n case 'newPasswordConfirmation':\r\n setPasswordResetConfirmation(value);\r\n break;\r\n case 'rememberMe':\r\n setRememberMe(checked);\r\n break;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n function login(id, userName, role, companyId, companyRole, shipRoles) {\r\n if (!role.includes(Role.Admin) && companyRole === CompanyRole.CrewMember && !shipRoles.includes(ShipRole.Owner) && !shipRoles.includes(ShipRole.Captain)) {\r\n setRedirectUrl('/Logout?redirect=NoAccess');\r\n } else {\r\n props.LogIn({\r\n id,\r\n userName,\r\n role,\r\n isLoggingIn: false,\r\n isAuthenticated: true,\r\n companyId,\r\n companyRole,\r\n shipRoles,\r\n });\r\n setRedirectUrl('/');\r\n }\r\n }\r\n\r\n async function checkPasswordIsValid() {\r\n setPasswordErrors(checkPassword(passwordRequirements, password));\r\n }\r\n\r\n function buildPasswordErrors() {\r\n if (passwordErrors.length === 0) {\r\n return null;\r\n }\r\n return passwordErrors.map((e, i) => (\r\n \r\n {e}\r\n
\r\n
\r\n ));\r\n }\r\n\r\n function buildTwoFactorTextField() {\r\n return twoFactorTokenRequired ? (\r\n \r\n \r\n \r\n ) : null;\r\n }\r\n\r\n function buildPasswordResetForm() {\r\n return (\r\n <>\r\n \r\n checkPasswordIsValid()}\r\n />\r\n \r\n \r\n \r\n \r\n {buildTwoFactorTextField()}\r\n \r\n );\r\n }\r\n\r\n function buildLoginForm() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {buildTwoFactorTextField()}\r\n \r\n } label=\"Remember me?\" />\r\n \r\n \r\n );\r\n }\r\n\r\n function buildFormContent() {\r\n return (\r\n
\r\n \r\n {passwordResetRequired ? (\r\n <>\r\n {buildPasswordResetForm()}\r\n \r\n \r\n \r\n \r\n ) : (\r\n buildLoginForm()\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Forgot password?\r\n \r\n \r\n \r\n \r\n Build no. {versionNum}\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n \"Sentini\r\n {buildFormContent()}\r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n LogIn: data => dispatch(LogIn(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Login);\r\n\r\nLogin.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n LogIn: PropTypes.func,\r\n};\r\n","import PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { LogOut } from '../../stores/Actions/Authentication';\r\nimport { ClearAll } from '../../stores/Actions/Notifications';\r\n\r\nfunction Logout(props) {\r\n const { redirect } = queryString.parse(props.location.search);\r\n UserController.logout();\r\n window.gapi.load('auth2', () => {\r\n const auth2 = window.gapi.auth2.init({\r\n client_id: '523243064179-givrom5hco81i6204ijiipssme5cnc5f.apps.googleusercontent.com',\r\n });\r\n if (auth2.isSignedIn.get()) {\r\n auth2.signOut();\r\n }\r\n });\r\n if (props.Auth.isAuthenticated) {\r\n props.ClearNotifs();\r\n props.LogOut();\r\n }\r\n props.PushHistory(`/${redirect ?? 'Login'}`);\r\n return null;\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n LogOut: () => dispatch(LogOut()),\r\n ClearNotifs: () => dispatch(ClearAll()),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Logout);\r\n\r\nLogout.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n LogOut: PropTypes.func,\r\n};\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst FileController = {\r\n getUsersFiles,\r\n uploadFile,\r\n};\r\n\r\nasync function getUsersFiles() {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.FILE_GET_USERS, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function uploadFile(file) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n return Axios.post(APIRoute + APIPath.FILE_UPlOAD, formData, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default FileController;\r\n","import { Divider, withStyles } from '@material-ui/core';\r\n\r\nexport const SpacedDivider = withStyles({\r\n root: {\r\n '&.lg-top': {\r\n marginTop: 50,\r\n },\r\n '&.lg-bottom': {\r\n marginBottom: 50,\r\n },\r\n '&.md-top': {\r\n marginTop: 30,\r\n },\r\n '&.md-bottom': {\r\n marginBottom: 30,\r\n },\r\n '&.sm-top': {\r\n marginTop: 10,\r\n },\r\n '&.sm-bottom': {\r\n marginBottom: 10,\r\n },\r\n },\r\n})(Divider);\r\n","import React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport FileController from '../../controllers/FileController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { makeStyles, Button, FormControl, FormHelperText, Input, InputLabel, Grid, Typography, Container, Card, CardMedia } from '@material-ui/core';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { SpacedDivider } from '../../components/Common/SpacedDivider';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n media: {\r\n height: 126,\r\n },\r\n}));\r\n\r\nfunction FileManager(props) {\r\n const { Auth, PushHistory } = props;\r\n const [loading, setLoading] = React.useState(true);\r\n const [file, setFile] = React.useState(null);\r\n const [imageUrls, setImageUrls] = React.useState([]);\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const classes = useStyles();\r\n\r\n const fetchUserImages = useCallback(async () => {\r\n setWarningText(null);\r\n const response = await FileController.getUsersFiles();\r\n if (!response.hasError) {\r\n setImageUrls(response.data?.urls);\r\n } else {\r\n setWarningText(response.data);\r\n }\r\n }, []);\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n if (!Auth.isAuthenticated) {\r\n setRedirectUrl('/Login');\r\n return;\r\n }\r\n await fetchUserImages();\r\n setLoading(false);\r\n }\r\n init();\r\n }, [Auth, fetchUserImages, setRedirectUrl]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [PushHistory, redirectUrl]);\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault();\r\n setWarningText(null);\r\n setLoading(true);\r\n const response = await FileController.uploadFile(file);\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n }\r\n await fetchUserImages();\r\n setLoading(false);\r\n }\r\n\r\n const handleFile = event => {\r\n const value = event.target.files[0];\r\n setFile(value);\r\n };\r\n\r\n function buildImages() {\r\n if (isNullOrUndefined(imageUrls) || imageUrls.length === 0) {\r\n return null;\r\n }\r\n return imageUrls.map((image, index) => (\r\n \r\n \r\n \r\n \r\n \r\n ));\r\n }\r\n\r\n function buildUploadForm() {\r\n return (\r\n
\r\n \r\n Upload File\r\n \r\n \r\n \r\n \r\n \r\n Upload File\r\n \r\n Insert max file size here!\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n {buildUploadForm()}\r\n\r\n \r\n\r\n \r\n {buildImages()}\r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FileManager);\r\n\r\nFileManager.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport NoImage from '../../images/no-img.png';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, Card, CardMedia, CardContent, Typography, CardActions, IconButton, Popover, CardActionArea } from '@material-ui/core';\r\nimport { MoreVert } from '@material-ui/icons';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport useOnScreen from '../../helpers/UseOnScreen';\r\nimport { useRef } from 'react';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n minHeight: 356,\r\n },\r\n media: props => ({\r\n height: 168,\r\n backgroundSize: props.fitImage === true ? 'contain' : 'cover',\r\n backgroundColor: 'black',\r\n }),\r\n content: {\r\n minHeight: 126,\r\n },\r\n actions: {\r\n flexDirection: 'row-reverse',\r\n },\r\n popover: {\r\n '& .MuiPopover-paper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n '& .MuiButton-root': {\r\n textTransform: 'none',\r\n minWidth: 120,\r\n },\r\n '& .MuiButton-label': {\r\n justifyContent: 'flex-start',\r\n fontWeight: 400,\r\n },\r\n },\r\n}));\r\n\r\nexport function SearchCard(props) {\r\n const { image, imagePromise, imageGetter, title, description, children, onClick, fitImage } = props;\r\n\r\n const [isInScreen, setIsInScreen] = React.useState(false);\r\n const [loadedImage, setLoadedImage] = React.useState(null);\r\n\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n\r\n const ref = useRef();\r\n const isVisible = useOnScreen(ref);\r\n\r\n const classes = useStyles({ fitImage: fitImage === true && (!isNullOrUndefined(image) || !isNullOrUndefined(loadedImage)) });\r\n\r\n React.useEffect(() => {\r\n async function saveImage() {\r\n const image = await imagePromise;\r\n setLoadedImage(!isNullOrUndefined(image) && image.length > 0 ? image : null);\r\n }\r\n if (!imagePromise) return;\r\n if (loadedImage === null) {\r\n saveImage();\r\n }\r\n }, [imagePromise, loadedImage]);\r\n\r\n React.useEffect(() => {\r\n async function loadImage() {\r\n const image = await imageGetter();\r\n setLoadedImage(!isNullOrUndefined(image) && image.length > 0 ? image : null);\r\n }\r\n if (!imageGetter || !isVisible || isInScreen) return;\r\n if (loadedImage === null) {\r\n setIsInScreen(true);\r\n loadImage();\r\n }\r\n }, [isVisible, imageGetter, loadedImage]);\r\n\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n const id = open ? 'search-item-popover' : undefined;\r\n const imageSrc = !isNullOrUndefined(image) && image.length !== 0 ? image : null;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {title ?? 'NONAME'}\r\n \r\n {description}\r\n \r\n \r\n \r\n {!isNullOrUndefined(children) ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n}\r\n\r\nSearchCard.propTypes = {\r\n image: PropTypes.string,\r\n imagePromise: PropTypes.object,\r\n imageGetter: PropTypes.func,\r\n title: PropTypes.string,\r\n onClick: PropTypes.func,\r\n description: PropTypes.any,\r\n children: PropTypes.any,\r\n fitImage: PropTypes.bool,\r\n};\r\n","import { useMemo, useState, useEffect } from 'react';\r\n\r\nexport default function useOnScreen(ref) {\r\n const [isIntersecting, setIntersecting] = useState(false);\r\n\r\n const observer = useMemo(() => new IntersectionObserver(([entry]) => setIntersecting(entry.isIntersecting)), [ref]);\r\n\r\n useEffect(() => {\r\n observer.observe(ref.current);\r\n return () => observer.disconnect();\r\n }, []);\r\n\r\n return isIntersecting;\r\n}\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIPath, APIRoute } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst AdminController = {\r\n banUser,\r\n unBanUser,\r\n};\r\n\r\nasync function banUser(id) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.BAN_USER + id, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function unBanUser(id) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.UN_BAN_USER + id, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default AdminController;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, Card, IconButton } from '@material-ui/core';\r\nimport { Cancel } from '@material-ui/icons';\r\nimport { Colours } from '../../helpers/Colours';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n height: 200,\r\n backgroundSize: 'cover',\r\n backgroundPosition: 'center',\r\n position: 'relative',\r\n '& .delete-btn': {\r\n backgroundColor: Colours.white,\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n },\r\n },\r\n}));\r\n\r\nexport function ItemImage(props) {\r\n const { image, disabled, onClose } = props;\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nItemImage.propTypes = {\r\n image: PropTypes.any.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n disabled: PropTypes.bool.isRequired,\r\n};\r\n","import { isNullOrUndefined } from './Utils';\r\n\r\nvar readers = [];\r\n\r\nexport function clearUploadUrls() {\r\n readers = [];\r\n}\r\n\r\nexport function getUploadUrls() {\r\n return readers.map(e => {\r\n return e.result;\r\n });\r\n}\r\n\r\nexport function removeIndex(i) {\r\n readers.splice(i, 1);\r\n}\r\n\r\nexport function readUploadUrls(files, callback) {\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i];\r\n if (isNullOrUndefined(file)) {\r\n continue;\r\n }\r\n var reader = new FileReader();\r\n readers.push(reader);\r\n reader.onload = () => {\r\n callback();\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n}\r\n\r\nexport function tsvJson(tsvData) {\r\n const lines = tsvData.split('\\n');\r\n const result = [];\r\n const headers = lines[0].split('\\t');\r\n\r\n for (let i = 1; i < lines.length; i++) {\r\n const obj = {};\r\n const currentLine = lines[i].split('\\t');\r\n\r\n for (let j = 0; j < headers.length; j++) {\r\n obj[headers[j]] = currentLine[j];\r\n }\r\n\r\n result.push(obj);\r\n }\r\n\r\n return result;\r\n}\r\n","import React from 'react';\r\nimport NoImage from '../../images/no-img.png';\r\nimport PropTypes from 'prop-types';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport {\r\n Grid,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n DialogActions,\r\n Button,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n Chip,\r\n makeStyles,\r\n Typography,\r\n FilledInput,\r\n FormControlLabel,\r\n Checkbox,\r\n} from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { CompanyRole, CompanyRoles, ShipRole, ShipRoles } from '../../helpers/Constants';\r\nimport { DarkMenuItem } from '../../components/Common/DarkMenuItem';\r\nimport { Autocomplete } from '@material-ui/lab';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { ItemImage } from '../../components/Common/ItemImage';\r\nimport { clearUploadUrls, getUploadUrls, readUploadUrls } from '../../helpers/UploadReader';\r\nimport UserController from '../../controllers/UserController';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport parsePhoneNumber from 'libphonenumber-js';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n selectArea: {\r\n '& .MuiInputBase-root': {\r\n paddingTop: 23,\r\n paddingBottom: 4,\r\n },\r\n },\r\n phoneInput: {},\r\n}));\r\n\r\nexport default function UsersAddEdit(props) {\r\n const { user, isMe, isUserAdmin, open, onClose, onDone, companyId, userCompanyRole } = props;\r\n const [userName, setUserName] = React.useState('');\r\n const [email, setEmail] = React.useState('');\r\n const [secondaryEmail, setSecondaryEmail] = React.useState('');\r\n const [forename, setForename] = React.useState('');\r\n const [surname, setSurname] = React.useState('');\r\n const [phoneNumber, setPhoneNumber] = React.useState('');\r\n const [group, setGroup] = React.useState('');\r\n const [groupsSrc, setGroupsSrc] = React.useState([]);\r\n const [ranks, setRanks] = React.useState([]);\r\n const [companyRole, setCompanyRole] = React.useState('');\r\n const [ships, setShips] = React.useState([]);\r\n const [shipsSrc, setShipsSrc] = React.useState([]);\r\n const [restPeriodsEnabled, setRestPeriodsEnabled] = React.useState(false);\r\n const [canGenerateNFCTags, setCanGenerateNFCTags] = React.useState(false);\r\n const [rank, setRank] = React.useState(false);\r\n const [image, setImage] = React.useState('');\r\n const [removeImage, setRemoveImage] = React.useState(false);\r\n const [loading, setLoading] = React.useState(true);\r\n const [saving, setSaving] = React.useState(false);\r\n const [warning, setWarning] = React.useState(null);\r\n const [, updateState] = React.useState();\r\n const classes = useStyles();\r\n\r\n const forceUpdate = React.useCallback(() => {\r\n updateState({});\r\n }, []);\r\n\r\n const userExists = () => !isNullOrUndefined(user?.id);\r\n\r\n const inviteExists = () => !isNullOrUndefined(user?.email);\r\n\r\n const isHeadOfDepartment = ships.some(ship => ship.shipRole === ShipRole.Captain || ship.shipRole === ShipRole.Owner);\r\n\r\n const loadShips = React.useCallback(async () => {\r\n const response = await ShipController.getShips(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setShipsSrc(response.data);\r\n }\r\n }, [companyId]);\r\n\r\n const loadUserGroups = React.useCallback(async () => {\r\n const response = await UserGroupController.getUserGroups(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setGroupsSrc(response.data);\r\n }\r\n }, [companyId]);\r\n\r\n const loadRanks = React.useCallback(async () => {\r\n const response = await UserController.getRanks();\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setRanks(response.data);\r\n }\r\n }, [setRanks]);\r\n\r\n // initialise when user or open state changes\r\n React.useEffect(() => {\r\n async function init() {\r\n await loadShips();\r\n await loadUserGroups();\r\n await loadRanks();\r\n }\r\n clearUploadUrls();\r\n setForename(user?.firstName ?? '');\r\n setSurname(user?.lastName ?? '');\r\n setPhoneNumber(user?.phoneNumber ?? '');\r\n setUserName(user?.userName ?? '');\r\n setEmail(user?.email ?? '');\r\n setSecondaryEmail(user?.secondaryEmail ?? '');\r\n setGroup(user?.userGroupId ?? '');\r\n setCompanyRole(user?.companyRoleId ?? CompanyRole.CrewMember);\r\n setShips((user?.ships ?? []).map(e => ({ shipId: e.shipId, shipRole: e.shipRoleId, name: e.name })));\r\n setRestPeriodsEnabled(user?.restPeriodsEnabled ?? false);\r\n setImage(user?.imageSrc ?? '');\r\n setCanGenerateNFCTags(user?.canGenerateNFCTags ?? false);\r\n setRank(user?.rank ?? '');\r\n if (open) {\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }\r\n }, [user, open, loadShips, loadUserGroups, loadRanks]);\r\n\r\n function getImage() {\r\n return getUploadUrls()[0] ?? (image === '' ? NoImage : image);\r\n }\r\n\r\n function handleClearImage() {\r\n clearUploadUrls();\r\n setImage('');\r\n setRemoveImage(true);\r\n }\r\n\r\n async function handleSave(event) {\r\n event.preventDefault();\r\n setSaving(true);\r\n\r\n const realCompanyRole = companyRole === CompanyRole.CrewMember ? '' : companyRole;\r\n if (phoneNumber !== '' && !testPhoneNumber()) {\r\n setWarning('Please set a valid number or leave the phone number empty');\r\n setSaving(false);\r\n return;\r\n }\r\n\r\n if (!userExists()) {\r\n const response = !inviteExists()\r\n ? await UserController.createMagicLink(\r\n userName,\r\n email,\r\n forename,\r\n surname,\r\n phoneNumber === '' ? null : parsePhoneNumber(phoneNumber, 'GB').formatInternational(),\r\n image,\r\n realCompanyRole,\r\n group,\r\n ships,\r\n restPeriodsEnabled,\r\n canGenerateNFCTags,\r\n rank === '' ? null : rank,\r\n secondaryEmail\r\n )\r\n : await UserController.editMagicLink(\r\n userName,\r\n email,\r\n forename,\r\n surname,\r\n phoneNumber === '' ? null : parsePhoneNumber(phoneNumber, 'GB').formatInternational(),\r\n image,\r\n realCompanyRole,\r\n group,\r\n ships,\r\n restPeriodsEnabled,\r\n canGenerateNFCTags,\r\n rank === '' ? null : rank,\r\n secondaryEmail\r\n );\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n onDone();\r\n }\r\n } else {\r\n const response = await CompanyController.editUser(\r\n companyId,\r\n user.id,\r\n email,\r\n forename,\r\n surname,\r\n phoneNumber === '' ? null : parsePhoneNumber(phoneNumber, 'GB').formatInternational(),\r\n image,\r\n removeImage,\r\n realCompanyRole,\r\n group,\r\n restPeriodsEnabled,\r\n canGenerateNFCTags,\r\n rank === '' ? null : rank,\r\n secondaryEmail\r\n );\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n for (let i = 0; i < ships.length; i++) {\r\n const { shipId, shipRole } = ships[i];\r\n const needsAdding = user.ships.filter(e => e.shipId === shipId).length === 0;\r\n if (needsAdding) {\r\n const addResponse = await ShipController.addUserToShip(companyId, shipId, shipRole, user.id);\r\n if (addResponse.hasError) {\r\n setWarning(addResponse.data);\r\n continue;\r\n }\r\n }\r\n const needsEditing = user.ships.find(e => e.shipId === shipId)?.shipRoleId !== shipRole;\r\n if (needsEditing) {\r\n const editResponse = await ShipController.editUserToShip(companyId, shipId, shipRole, user.id);\r\n if (editResponse.hasError) {\r\n setWarning(editResponse.data);\r\n continue;\r\n }\r\n }\r\n }\r\n for (let i = 0; i < user.ships.length; i++) {\r\n const { shipId } = user.ships[i];\r\n const needsRemoving = ships.filter(e => e.shipId === shipId).length === 0;\r\n if (needsRemoving) {\r\n const removeResponse = await ShipController.removeUserFromShip(companyId, shipId, user.id);\r\n if (removeResponse.hasError) {\r\n setWarning(removeResponse.data);\r\n continue;\r\n }\r\n }\r\n }\r\n onDone();\r\n }\r\n }\r\n\r\n setSaving(false);\r\n onClose();\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name, files } = event.target;\r\n switch (name) {\r\n case 'forename':\r\n setForename(value);\r\n break;\r\n case 'surname':\r\n setSurname(value);\r\n break;\r\n case 'phoneNumber':\r\n setPhoneNumber(value);\r\n break;\r\n case 'email':\r\n setEmail(value);\r\n break;\r\n case 'secondaryEmail':\r\n setSecondaryEmail(value);\r\n break;\r\n case 'userName':\r\n setUserName(value);\r\n break;\r\n case 'companyRole':\r\n setCompanyRole(value);\r\n break;\r\n case 'userGroup':\r\n setGroup(value);\r\n break;\r\n case 'ranks':\r\n setRank(value);\r\n break;\r\n case 'image':\r\n clearUploadUrls();\r\n if (!isNullOrUndefined(files[0])) {\r\n setImage(files[0]);\r\n setRemoveImage(false);\r\n readUploadUrls([files[0]], forceUpdate);\r\n } else {\r\n setImage('');\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function handleSelectShipRole(shipId, role) {\r\n setShips(ships.map(e => (e.shipId === shipId ? { ...e, shipRole: role } : e)));\r\n }\r\n\r\n function buildShipRoleSelectors() {\r\n return ships.map((e, i) => {\r\n const { name, shipRole, shipId } = e;\r\n return (\r\n \r\n \r\n {name} Role\r\n \r\n \r\n \r\n );\r\n });\r\n }\r\n\r\n function buildErrorDialog() {\r\n return (\r\n setWarning(null)}>\r\n Error\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function testPhoneNumber() {\r\n const phoneTest = parsePhoneNumber(phoneNumber, 'GB');\r\n return phoneTest !== undefined && phoneTest.isValid();\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n Add/Edit User\r\n \r\n \r\n \r\n \r\n \r\n \r\n User information\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isHeadOfDepartment ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setRestPeriodsEnabled(e.target.checked)} color=\"primary\" />}\r\n label=\"Rest Periods Enabled\"\r\n />\r\n \r\n \r\n setCanGenerateNFCTags(e.target.checked)} color=\"primary\" />}\r\n label=\"Can Generate NFC Tags\"\r\n />\r\n \r\n \r\n \r\n Rank\r\n \r\n \r\n \r\n {!isMe && (\r\n \r\n \r\n Company Role\r\n \r\n \r\n \r\n )}\r\n {companyRole === CompanyRole.CrewMember ? (\r\n <>\r\n \r\n \r\n User Group\r\n \r\n \r\n \r\n \r\n \r\n \r\n Select ships & roles\r\n \r\n \r\n \r\n ({ shipId: e.id, shipRole: null, name: e.name }))}\r\n getOptionLabel={ship => ship.name}\r\n getOptionSelected={(e, v) => e.shipId === v.shipId}\r\n className={classes.selectArea}\r\n value={ships}\r\n onChange={(_, v) => setShips(v)}\r\n name=\"ships\"\r\n disabled={loading}\r\n filterSelectedOptions\r\n renderInput={params => (\r\n \r\n )}\r\n renderTags={(value, getTagProps) =>\r\n value.map((option, index) => )\r\n }\r\n />\r\n \r\n {buildShipRoleSelectors()}\r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Profile picture\r\n \r\n \r\n \r\n \r\n Image\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n {buildErrorDialog()}\r\n \r\n );\r\n}\r\n\r\nUsersAddEdit.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onDone: PropTypes.func.isRequired,\r\n isMe: PropTypes.bool.isRequired,\r\n isUserAdmin: PropTypes.bool.isRequired,\r\n user: PropTypes.object,\r\n shipsArray: PropTypes.array,\r\n companyId: PropTypes.string.isRequired,\r\n userCompanyRole: PropTypes.string.isRequired,\r\n};\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { generateResponse, isNullOrUndefined } from '../helpers/Utils';\r\n\r\nconst ComplianceController = {\r\n getUserComplianceTests,\r\n getComplianceTests,\r\n getComplianceTestsById,\r\n getComplianceTest,\r\n getComplianceTestCategories,\r\n addComplianceTest,\r\n editComplianceTest,\r\n getCompanyComplianceResults,\r\n getShipComplianceResults,\r\n getUserComplianceResults,\r\n getComplianceResults,\r\n getQuestionOverview,\r\n getAssessmentOverview,\r\n getUserGroupsOverview,\r\n};\r\n\r\nasync function getUserComplianceTests(companyId, userId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_USER_COMPLIANCE_TESTS(companyId, userId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getComplianceTests(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPLIANCE_TESTS(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getComplianceTest(companyId, assessmentId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPLIANCE_TEST(companyId, assessmentId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getComplianceTestsById(companyId, assessmentIds) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.GET_COMPLIANCE_TESTS_SPECIFIC(companyId), assessmentIds, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getComplianceTestCategories(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPLIANCE_TEST_CATEGORIES(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addComplianceTest(\r\n companyId,\r\n title,\r\n iconIndex,\r\n categoryId,\r\n cronScheduling,\r\n start,\r\n end,\r\n allQuestions,\r\n questionCount,\r\n scoreRequirement,\r\n numPrevTestsToAccount,\r\n questions,\r\n shipIds,\r\n userIds,\r\n userGroupIds,\r\n complianceTestLevels\r\n) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const complianceModel = {\r\n title,\r\n iconIndex,\r\n categoryId,\r\n cronScheduling,\r\n start,\r\n end,\r\n allQuestions,\r\n questionCount,\r\n scoreRequirement,\r\n numPrevTestsToAccount,\r\n questions,\r\n shipIds,\r\n userIds,\r\n userGroupIds,\r\n complianceTestLevels,\r\n };\r\n return Axios.post(APIRoute + APIPath.ADD_COMPLIANCE_TEST(companyId), complianceModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editComplianceTest(\r\n companyId,\r\n id,\r\n title,\r\n iconIndex,\r\n categoryId,\r\n cronScheduling,\r\n start,\r\n end,\r\n allQuestions,\r\n questionCount,\r\n scoreRequirement,\r\n numPrevTestsToAccount,\r\n questions,\r\n shipIds,\r\n userIds,\r\n userGroupIds,\r\n complianceTestLevels\r\n) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const complianceModel = {\r\n id,\r\n title,\r\n iconIndex,\r\n categoryId,\r\n cronScheduling,\r\n start,\r\n end,\r\n allQuestions,\r\n questionCount,\r\n scoreRequirement,\r\n numPrevTestsToAccount,\r\n questions,\r\n shipIds,\r\n userIds,\r\n userGroupIds,\r\n complianceTestLevels,\r\n };\r\n return Axios.post(APIRoute + APIPath.EDIT_COMPLIANCE_TEST(companyId), complianceModel, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getCompanyComplianceResults(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.COMPANY_COMPLIANCE_TEST_RESULTS(companyId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getShipComplianceResults(companyId, shipId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.SHIP_COMPLIANCE_TEST_RESULTS(companyId, shipId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getUserComplianceResults(companyId, userId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.USER_COMPLIANCE_TEST_RESULTS(companyId, userId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getComplianceResults(companyId, userId, complianceId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.USER_TEST_RESULTS(companyId, userId, complianceId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getQuestionOverview(companyId, shipId = null, userId = null) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.QUESTION_OVERVIEW(companyId, isNullOrUndefined(shipId) ? null : shipId, isNullOrUndefined(userId) ? null : userId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getAssessmentOverview(companyId, shipId = null) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.ASSESSMENT_OVERVIEW(companyId, isNullOrUndefined(shipId) ? null : shipId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getUserGroupsOverview(companyId, shipId = null) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.USER_GROUPS_OVERVIEW(companyId, isNullOrUndefined(shipId) ? null : shipId), userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default ComplianceController;\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIPath, APIRoute } from '../helpers/Constants';\r\nimport { generateResponse } from '../helpers/Utils';\r\n\r\nconst UserComplianceTestLevelController = {\r\n getUserComplianceTestLevels,\r\n editUserComplianceTestLevels,\r\n};\r\n\r\nasync function getUserComplianceTestLevels(userId, complianceTestIds) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const model = {\r\n userId,\r\n complianceTestIds,\r\n };\r\n\r\n return Axios.post(APIRoute + APIPath.GET_USER_COMPLIANCE_TEST_LEVELS, model, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editUserComplianceTestLevels(userId, testLevelIds, complianceTestIds) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const model = {\r\n userId,\r\n testLevelIds,\r\n complianceTestIds,\r\n };\r\n\r\n return Axios.post(APIRoute + APIPath.EDIT_USER_COMPLIANCE_TEST_LEVELS, model, userHeaders)\r\n .then(response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default UserComplianceTestLevelController;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, DialogActions, Button, makeStyles, TextField, Typography } from '@material-ui/core';\r\nimport { isNullOrEmpty, isNullOrUndefined } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport ComplianceController from '../../controllers/ComplianceController';\r\nimport UserComplianceTestLevelController from '../../controllers/UserComplianceTestLevelController';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n selectArea: {\r\n '& .MuiInputBase-root': {\r\n paddingTop: 23,\r\n paddingBottom: 4,\r\n },\r\n },\r\n listItem: {\r\n borderBottom: `1px solid #eee`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n paddingTop: 8,\r\n paddingBottom: 8,\r\n '& .text-wrapper': {\r\n width: '80%',\r\n },\r\n '& .MuiTextField-root': {\r\n maxWidth: '20%',\r\n },\r\n '& .MuiInput-underline:before ': {\r\n border: 'none',\r\n },\r\n },\r\n}));\r\n\r\nexport default function UsersAssessmentLevels(props) {\r\n const { user, open, onClose, companyId } = props;\r\n const [complianceTests, setComplianceTests] = React.useState([]);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const [saving, setSaving] = React.useState(false);\r\n\r\n const classes = useStyles();\r\n\r\n React.useEffect(() => {\r\n if (!user) return;\r\n\r\n async function init() {\r\n const assessments = await loadUserComplianceTests(companyId);\r\n if (!isNullOrEmpty(assessments)) {\r\n await loadComplianceTestLevels(assessments);\r\n }\r\n }\r\n init().then(() => setLoading(false));\r\n }, [user, open]);\r\n\r\n const loadUserComplianceTests = async () => {\r\n const response = await ComplianceController.getUserComplianceTests(companyId, user?.id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n setLoading(false);\r\n } else {\r\n setComplianceTests(response.data);\r\n return response.data;\r\n }\r\n return [];\r\n };\r\n\r\n const loadComplianceTestLevels = async assessments => {\r\n const response = await UserComplianceTestLevelController.getUserComplianceTestLevels(\r\n user.id,\r\n assessments.map(e => e.id)\r\n );\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n setLoading(false);\r\n } else {\r\n const newComplianceTests = [];\r\n\r\n for (let i = 0; i < assessments.length; i++) {\r\n const test = assessments[i];\r\n const userLevel = response.data.find(l => l.complianceTestId === test.id);\r\n const level = test.complianceTestLevels.find(e => e.id === userLevel?.testLevelId);\r\n newComplianceTests.push({ ...test, userTestLevel: !isNullOrUndefined(level) ? level?.levelIndex : null, userTestLevelId: level?.id });\r\n }\r\n setComplianceTests(newComplianceTests);\r\n }\r\n };\r\n\r\n const saveUserComplianceTestLevels = async () => {\r\n setSaving(true);\r\n const testLevelIds = complianceTests.map(e => e.userTestLevelId);\r\n const complianceIds = complianceTests.map(e => e.id);\r\n\r\n const response = await UserComplianceTestLevelController.editUserComplianceTestLevels(user.id, testLevelIds, complianceIds);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setSaving(false);\r\n onClose();\r\n }\r\n setSaving(false);\r\n };\r\n\r\n const handleChangeUserTestLevel = (e, complianceTestId) => {\r\n const value = e.target.value;\r\n\r\n if (!/^[0-9]+$/.test(value)) return;\r\n\r\n const testLevelId = complianceTests.find(e => e.id === complianceTestId).complianceTestLevels.find(e => e.levelIndex == value)?.id;\r\n\r\n if (isNullOrUndefined(testLevelId) && value != 0) return;\r\n\r\n const newArray = [...complianceTests.map(e => (e.id == complianceTestId ? { ...e, userTestLevel: value, userTestLevelId: testLevelId } : e))];\r\n setComplianceTests(newArray);\r\n };\r\n\r\n function buildErrorDialog() {\r\n return (\r\n setWarning(null)}>\r\n Error\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n Edit User Assessment Levels\r\n \r\n \r\n \r\n {!loading\r\n ? complianceTests\r\n .filter(e => e.complianceTestLevels.length !== 0)\r\n .map((test, i) => {\r\n return (\r\n \r\n
\r\n
\r\n {test.title}\r\n
\r\n handleChangeUserTestLevel(e, test.id)} value={test.userTestLevel ?? 0}>\r\n
\r\n
\r\n );\r\n })\r\n : null}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n {buildErrorDialog()}\r\n \r\n );\r\n}\r\n\r\nUsersAssessmentLevels.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n isMe: PropTypes.bool.isRequired,\r\n user: PropTypes.object,\r\n shipsArray: PropTypes.array,\r\n companyId: PropTypes.string.isRequired,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, DialogActions, Button, Select, FormControl, InputLabel } from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { DarkMenuItem } from '../../components/Common/DarkMenuItem';\r\nimport moment from 'moment';\r\n\r\nexport default function UserRestPeriod(props) {\r\n const { user, open, onClose, companyId } = props;\r\n const [restPeriodDates, setRestPeriodDates] = React.useState([]);\r\n const [selectedDate, setSelectedDate] = React.useState('');\r\n const [documentDate, setDocumentDate] = React.useState('');\r\n const [documentUrl, setDocumentLink] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const [warning, setWarning] = React.useState(null);\r\n\r\n const loadRestPeriods = React.useCallback(async () => {\r\n const response = await CompanyController.getUsersRestPeriodDate(companyId, user.id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setRestPeriodDates(response.data.dates);\r\n }\r\n }, [companyId, user]);\r\n\r\n // initialise when user or open state changes\r\n React.useEffect(() => {\r\n async function init() {\r\n setSelectedDate('');\r\n await loadRestPeriods();\r\n }\r\n\r\n if (open) {\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }\r\n }, [user, open, loadRestPeriods]);\r\n\r\n const generateDocument = React.useCallback(async () => {\r\n const response = await CompanyController.getUsersRestPeriodDocument(companyId, user.id, selectedDate);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setDocumentDate(selectedDate);\r\n setDocumentLink(response.data);\r\n }\r\n }, [companyId, user, selectedDate, setDocumentLink, setDocumentDate]);\r\n\r\n function base64ToArrayBuffer(base64) {\r\n var binaryString = window.atob(base64);\r\n var binaryLen = binaryString.length;\r\n var bytes = new Uint8Array(binaryLen);\r\n for (var i = 0; i < binaryLen; i++) {\r\n var ascii = binaryString.charCodeAt(i);\r\n bytes[i] = ascii;\r\n }\r\n return bytes;\r\n }\r\n\r\n function handelClose() {\r\n setDocumentLink(null);\r\n setSelectedDate('');\r\n setDocumentDate('');\r\n\r\n onClose();\r\n }\r\n\r\n function buildErrorDialog() {\r\n return (\r\n setWarning(null)}>\r\n Error\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n let link;\r\n if (documentUrl != null) {\r\n const blob = new Blob([base64ToArrayBuffer(documentUrl)], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\r\n link = window.URL.createObjectURL(blob);\r\n }\r\n return (\r\n <>\r\n \r\n User Rest Periods\r\n \r\n \r\n \r\n \r\n \r\n Rest Period Start Date\r\n \r\n \r\n \r\n \r\n \r\n \r\n {documentUrl !== null ? (\r\n \r\n \r\n Download {moment(documentDate).format('MM/YYYY')}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {buildErrorDialog()}\r\n \r\n );\r\n}\r\n\r\nUserRestPeriod.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n user: PropTypes.object,\r\n companyId: PropTypes.string.isRequired,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, DialogActions, Button, Select, FormControl, InputLabel } from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { DarkMenuItem } from '../../components/Common/DarkMenuItem';\r\nimport moment from 'moment';\r\nimport ShipController from '../../controllers/ShipController';\r\n\r\nexport default function MassRestPeriod(props) {\r\n const { open, onClose, companyId } = props;\r\n const [ships, setShips] = React.useState([]);\r\n const [selectedShip, setSelectedShip] = React.useState('');\r\n const [users, setUsers] = React.useState([]);\r\n const [selectedUsers, setSelectedUsers] = React.useState([]);\r\n const [monthSelect, setMonthSelect] = React.useState('01');\r\n const [yearSelect, setYearSelect] = React.useState('2021');\r\n const [documentDate, setDocumentDate] = React.useState(moment.now());\r\n const [documentUrl, setDocumentLink] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const [warning, setWarning] = React.useState(null);\r\n\r\n // initialise when user or open state changes\r\n React.useEffect(() => {\r\n async function init() {\r\n const shipResponse = await ShipController.getShips(companyId);\r\n if (shipResponse.hasError) {\r\n setWarning(shipResponse.data);\r\n return;\r\n }\r\n setShips(shipResponse.data);\r\n }\r\n\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }, [companyId, setShips]);\r\n\r\n React.useEffect(() => {\r\n async function loadUsers() {\r\n if (isNullOrUndefined(selectedShip) || selectedShip === '') {\r\n setUsers([]);\r\n setSelectedUsers([]);\r\n return;\r\n }\r\n const userResponse = await ShipController.getShipUsers(companyId, selectedShip);\r\n if (userResponse.hasError) {\r\n setWarning(userResponse.data);\r\n return;\r\n }\r\n setUsers(userResponse.data);\r\n setSelectedUsers([]);\r\n }\r\n\r\n setLoading(true);\r\n loadUsers().then(() => setLoading(false));\r\n }, [companyId, setUsers, selectedShip]);\r\n\r\n const generateDocument = React.useCallback(async () => {\r\n if (isNullOrUndefined(selectedShip) || selectedShip === '') {\r\n setWarning('You must select a ship and users first');\r\n return;\r\n }\r\n if (selectedUsers.length === 0) {\r\n setWarning('You must select at least one user');\r\n return;\r\n }\r\n setLoading(true);\r\n const selectedDate = moment.utc(`01/${monthSelect}/${yearSelect}`, 'dd/MM/yyyy');\r\n\r\n const response = await CompanyController.getMassRestPeriodDocument(companyId, selectedUsers, selectedShip, selectedDate.toISOString());\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setDocumentDate(selectedDate);\r\n setDocumentLink(response.data);\r\n }\r\n setLoading(false);\r\n }, [companyId, selectedShip, selectedUsers, monthSelect, yearSelect, setDocumentLink, setDocumentDate]);\r\n\r\n function base64ToArrayBuffer(base64) {\r\n var binaryString = window.atob(base64);\r\n var binaryLen = binaryString.length;\r\n var bytes = new Uint8Array(binaryLen);\r\n for (var i = 0; i < binaryLen; i++) {\r\n var ascii = binaryString.charCodeAt(i);\r\n bytes[i] = ascii;\r\n }\r\n return bytes;\r\n }\r\n\r\n function handelClose() {\r\n setDocumentLink(null);\r\n setDocumentDate('');\r\n\r\n onClose();\r\n }\r\n\r\n function buildErrorDialog() {\r\n return (\r\n setWarning(null)}>\r\n Error\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function GenerateYears() {\r\n let testDate = moment('01/01/2020', 'dd/MM/yyyy');\r\n const years = [];\r\n while (testDate.isSameOrBefore(moment.now())) {\r\n years.push(testDate.format('yyyy'));\r\n testDate = testDate.add(1, 'year');\r\n }\r\n return years;\r\n }\r\n\r\n let link;\r\n if (documentUrl != null) {\r\n const blob = new Blob([base64ToArrayBuffer(documentUrl)], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\r\n link = window.URL.createObjectURL(blob);\r\n }\r\n return (\r\n <>\r\n \r\n User Rest Periods\r\n \r\n \r\n \r\n \r\n \r\n Ship\r\n \r\n \r\n \r\n \r\n \r\n Users\r\n \r\n \r\n \r\n \r\n \r\n Month\r\n \r\n \r\n \r\n \r\n \r\n Year\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {documentUrl !== null ? (\r\n \r\n e.id === selectedShip).name}-${moment(documentDate).format('MM-YYYY')}.xlsx`}\r\n fullWidth\r\n >\r\n Download {moment(documentDate).format('MM/YYYY')}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {buildErrorDialog()}\r\n \r\n );\r\n}\r\n\r\nMassRestPeriod.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n};\r\n","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport './style.css';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n width: '100%',\r\n height: 200,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n animation: 'skeleton 3s infinite ease-out',\r\n borderRadius: 4,\r\n margin: 8,\r\n },\r\n}));\r\n\r\nexport function Skeleton() {\r\n const classes = useStyles();\r\n\r\n return
;\r\n}\r\n","/* eslint-disable react/prop-types */\r\nimport React, { useState } from 'react';\r\nimport {\r\n Button,\r\n Card,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n Divider,\r\n FormControl,\r\n Grid,\r\n Select,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Typography,\r\n makeStyles,\r\n} from '@material-ui/core';\r\nimport { useEffect } from 'react';\r\nimport { tsvJson } from '../../helpers/UploadReader';\r\nimport { CompanyRole, CompanyRoles, ShipRole, ShipRoles } from '../../helpers/Constants';\r\nimport { DarkMenuItem } from '../../components/Common/DarkMenuItem';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport UserController from '../../controllers/UserController';\r\nimport parsePhoneNumber from 'libphonenumber-js';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n table: {\r\n '& th': {\r\n fontWeight: 'bold',\r\n },\r\n '& tr:last-child': {\r\n '& td': {\r\n borderBottom: 'none',\r\n },\r\n },\r\n },\r\n uploadArea: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n padding: 16,\r\n },\r\n}));\r\n\r\n/**\r\n * @param {{\r\n * open: boolean;\r\n * onClose: function(): void;\r\n * onSave: function;\r\n * companyId: string;\r\n * userCompanyRole: string;\r\n * isUserAdmin: boolean;\r\n * }} props\r\n * @returns {ReactNode}\r\n */\r\nexport const UploadUsers = ({ open, onClose, onSave, companyId, userCompanyRole, isUserAdmin }) => {\r\n const classes = useStyles();\r\n\r\n const [file, setFile] = useState(null);\r\n const [users, setUsers] = useState([]);\r\n const [ships, setShips] = React.useState([]);\r\n const [ranks, setRanks] = React.useState([]);\r\n const [groups, setGroups] = React.useState([]);\r\n const [warnings, setWarnings] = React.useState([]);\r\n const [loading, setLoading] = React.useState(true);\r\n const [saving, setSaving] = React.useState(false);\r\n\r\n const loadShips = React.useCallback(async () => {\r\n const response = await ShipController.getShips(companyId);\r\n if (response.hasError) {\r\n setWarnings([response.data]);\r\n } else {\r\n setShips(response.data);\r\n }\r\n }, [companyId]);\r\n\r\n const loadUserGroups = React.useCallback(async () => {\r\n const response = await UserGroupController.getUserGroups(companyId);\r\n if (response.hasError) {\r\n setWarnings([response.data]);\r\n } else {\r\n setGroups(response.data);\r\n }\r\n }, [companyId]);\r\n\r\n const loadRanks = React.useCallback(async () => {\r\n const response = await UserController.getRanks();\r\n if (response.hasError) {\r\n setWarnings([response.data]);\r\n } else {\r\n setRanks(response.data);\r\n }\r\n }, [setRanks]);\r\n\r\n // initialise when user or open state changes\r\n React.useEffect(() => {\r\n async function init() {\r\n await loadShips();\r\n await loadUserGroups();\r\n await loadRanks();\r\n }\r\n\r\n setFile(null);\r\n setWarnings([]);\r\n setUsers([]);\r\n\r\n if (open) {\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }\r\n }, [open, loadShips, loadUserGroups, loadRanks]);\r\n\r\n const handleCreateMagicLinks = async event => {\r\n event.preventDefault();\r\n\r\n const failedUsers = [];\r\n const failedUserWarnings = [];\r\n\r\n setSaving(true);\r\n\r\n for (let i = 0; i < users.length; i++) {\r\n const userName = getUserData(i, 'User Name');\r\n\r\n const phoneNumber = getUserData(i, 'Phone Number')?.trim() ?? '';\r\n const phoneTest = parsePhoneNumber(phoneNumber, 'GB');\r\n const validPhoneNumber = phoneTest !== undefined && phoneTest.isValid();\r\n\r\n if (phoneNumber !== '' && !validPhoneNumber) {\r\n failedUsers.push(users[i]);\r\n failedUserWarnings.push(`${userName} - Please set a valid number or leave the phone number empty`);\r\n continue;\r\n }\r\n\r\n const companyRole = getUserData(i, 'Company Role');\r\n const realCompanyRole = getUserData(i, 'Company Role') === CompanyRole.CrewMember ? '' : companyRole;\r\n\r\n const shipId = getUserData(i, 'Ship Id');\r\n const ship = ships.find(ship => ship.id === shipId);\r\n\r\n const response = await UserController.createMagicLink(\r\n userName,\r\n getUserData(i, 'Email Address'),\r\n getUserData(i, 'First Name'),\r\n getUserData(i, 'Last Name'),\r\n phoneNumber === '' ? null : parsePhoneNumber(phoneNumber, 'GB').formatInternational(),\r\n null,\r\n realCompanyRole,\r\n getUserData(i, 'User Group'),\r\n ship\r\n ? [\r\n {\r\n shipId,\r\n shipRole: getUserData(i, 'Ship Role'),\r\n name: ship.name,\r\n },\r\n ]\r\n : null,\r\n false,\r\n false,\r\n getUserData(i, 'Rank')\r\n );\r\n\r\n if (response.hasError) {\r\n failedUsers.push(users[i]);\r\n failedUserWarnings.push(response.data);\r\n }\r\n }\r\n\r\n setSaving(false);\r\n setUsers(failedUsers);\r\n setWarnings(failedUserWarnings);\r\n onSave();\r\n\r\n if (failedUsers.length === 0) {\r\n onClose();\r\n }\r\n };\r\n\r\n const handleFileUpload = event => {\r\n const file = event.target.files[0];\r\n const reader = new FileReader();\r\n\r\n reader.onloadend = () => {\r\n setFile(reader.result);\r\n };\r\n\r\n reader.readAsText(file, 'utf-8');\r\n };\r\n\r\n const getUserData = (index = 0, key = '') => {\r\n const user = users[index];\r\n const userKey = Object.keys(user).find(val => val.includes(key));\r\n if (!userKey) return null;\r\n return user[userKey];\r\n };\r\n\r\n const setUserData = (index = 0, key = '', value = '') => {\r\n const user = users[index];\r\n const userKey = Object.keys(user).find(val => val.includes(key)) ?? key;\r\n setUsers(users => users.map((arrUser, arrIndex) => (index === arrIndex ? { ...arrUser, [userKey]: value } : arrUser)));\r\n };\r\n\r\n useEffect(() => {\r\n if (!file) return;\r\n setUsers(tsvJson(file));\r\n }, [file]);\r\n\r\n const uploadArea = (\r\n
\r\n Upload a TSV to get started\r\n \r\n
\r\n );\r\n\r\n const userTable =\r\n users.length === 0 ? (\r\n <>\r\n ) : (\r\n \r\n \r\n \r\n \r\n User Name*\r\n Email Address*\r\n First Name*\r\n Last Name*\r\n Phone Number\r\n Rank*\r\n Company Role*\r\n User Group*\r\n Ship*\r\n Ship Role*\r\n \r\n \r\n \r\n {users.map((_, index) => (\r\n \r\n {getUserData(index, 'User Name')}\r\n {getUserData(index, 'Email Address')}\r\n {getUserData(index, 'First Name')}\r\n {getUserData(index, 'Last Name')}\r\n {getUserData(index, 'Phone Number')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {getUserData(index, 'Company Role') === CompanyRole.CrewMember ? (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n Crew Members Only\r\n \r\n )}\r\n \r\n ))}\r\n \r\n
\r\n
\r\n );\r\n\r\n const errorDialog = (\r\n 0} onClose={() => setWarnings([])}>\r\n Error\r\n \r\n {warnings.map((warning, i) => (\r\n \r\n ))}\r\n ;\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n
\r\n Upload Users\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n When exporting the template from Excel for upload here, please select 'Tab Separated Values' (.txt) as the export format.\r\n \r\n \r\n \r\n \r\n {loading ? (\r\n <>\r\n ) : (\r\n <>\r\n \r\n {users.length === 0 ? uploadArea : userTable}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n {errorDialog}\r\n\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport queryString from 'query-string';\r\nimport { connect } from 'react-redux';\r\nimport { Link } from 'react-router-dom';\r\nimport { push } from 'connected-react-router';\r\nimport { Add, CloudUpload, GetApp, MoreVert } from '@material-ui/icons';\r\nimport {\r\n makeStyles,\r\n Grid,\r\n Button,\r\n TextField,\r\n Typography,\r\n Dialog,\r\n DialogContent,\r\n DialogActions,\r\n DialogTitle,\r\n FormControlLabel,\r\n Switch,\r\n Chip,\r\n CircularProgress,\r\n TableContainer,\r\n Table,\r\n TableBody,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableSortLabel,\r\n IconButton,\r\n Popover,\r\n} from '@material-ui/core';\r\nimport { CompanyRole, Role, ShipRole } from '../../helpers/Constants';\r\nimport { descendingComparator, isEmpty, isNullOrUndefined, updateQueryString } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { SearchCard } from '../../components/Common/SearchCard';\r\nimport AdminController from '../../controllers/AdminController';\r\nimport UserController from '../../controllers/UserController';\r\nimport UsersAddEdit from './UsersAddEdit';\r\nimport UsersAssessmentLevels from './UsersAssessmentLevels';\r\nimport UserRestPeriod from './UserRestPeriod';\r\nimport MassRestPeriod from './MassRestPeriod';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport SearchIcon from '@material-ui/icons/Search';\r\nimport { setUsers } from '../../stores/Actions/Users';\r\nimport { Skeleton } from '../../components/Common/Skeleton';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { UploadUsers } from './UploadUsers';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n maxHeight: '100vh',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n '& .skeleton': {\r\n margin: 0,\r\n },\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n },\r\n topArea: {\r\n paddingBottom: 8,\r\n '& .MuiButtonBase-root': {\r\n height: '100%',\r\n },\r\n },\r\n userInfoCards: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n marginTop: 12,\r\n '& .MuiChip-root': {\r\n marginRight: 4,\r\n marginBottom: 4,\r\n },\r\n },\r\n fieldWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n height: '100%',\r\n\r\n '& .MuiFilledInput-root': {\r\n borderTopRightRadius: 0,\r\n },\r\n },\r\n buttonWrapper: {\r\n transition: 'background-color 0.2s',\r\n height: '100%',\r\n width: 48,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: `1px solid ${Colours.field}`,\r\n borderBottom: `1px solid ${Colours.border}`,\r\n borderLeft: 'none',\r\n cursor: 'pointer',\r\n borderTopRightRadius: 4,\r\n\r\n '&:hover': {\r\n backgroundColor: '#eee',\r\n },\r\n },\r\n table: {\r\n border: `1px solid ${theme.palette.divider}`,\r\n borderRadius: 6,\r\n '& th': {\r\n fontWeight: 'bold',\r\n },\r\n '& tr': {\r\n '&:last-child': {\r\n '& td': {\r\n borderBottom: 'none',\r\n },\r\n },\r\n },\r\n },\r\n popover: {\r\n '& .MuiPopover-paper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n '& .MuiButton-root': {\r\n textTransform: 'none',\r\n minWidth: 120,\r\n },\r\n '& .MuiButton-label': {\r\n justifyContent: 'flex-start',\r\n fontWeight: 400,\r\n },\r\n },\r\n}));\r\n\r\nfunction Users(props) {\r\n const { Auth, PushHistory, UsersStore, setUsers } = props;\r\n const { users } = UsersStore;\r\n\r\n const { ship: shipQuery, name: nameQuery, userGroup: userGroupQuery } = queryString.parse(window.location.search);\r\n const [nameSearch, setNameSearch] = React.useState(nameQuery ?? '');\r\n const [prevNameSearch, setPrevNameSearch] = React.useState(nameQuery ?? '');\r\n const [shipSearch, setShipSearch] = React.useState(shipQuery ?? '');\r\n const [prevShipSearch, setPrevShipSearch] = React.useState(shipQuery ?? '');\r\n const [showDisabled, setShowDisabled] = React.useState(false);\r\n const [showListView, setShowListView] = React.useState(false);\r\n const [showUploadTsv, setShowUploadTsv] = React.useState(false);\r\n const [deleteUserRef, setDeleteUserRef] = React.useState(null);\r\n const [removeLinkRef, setRemoveLinkRef] = React.useState(null);\r\n const [resendLinkRef, setResendLinkRef] = React.useState(null);\r\n const [enableUserRef, setEnableUserRef] = React.useState(null);\r\n const [addEditUserRef, setAddEditUserRef] = React.useState(null);\r\n const [assessmentUserRef, setAssessmentUserRef] = React.useState(null);\r\n const [restPeriodUserRef, setRestPeriodUserRef] = React.useState(null);\r\n const [userGroups, setUserGroups] = React.useState([]);\r\n const [showMassRestPeriodExport, setShowMassRestPeriodExport] = React.useState(false);\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const [popoverIndex, setPopoverIndex] = React.useState(null);\r\n\r\n // Sorting\r\n const [orderRow, setOrderRow] = React.useState('');\r\n const [orderDirection, setOrderDirection] = React.useState('desc');\r\n\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const [saving, setSaving] = React.useState(false);\r\n const classes = useStyles();\r\n\r\n const userIsAdmin = Auth.role.includes(Role.Admin);\r\n const userIsCaptain = Auth.shipRoles.includes(ShipRole.Captain) && Auth.companyRole !== CompanyRole.Owner;\r\n\r\n const loadUserProfilePic = React.useCallback(\r\n async user => {\r\n const isInvite = isNullOrUndefined(user.id);\r\n const imgResponse = isInvite ? await CompanyController.getMagicLinkProfilePic(Auth.companyId, user.userName) : await CompanyController.getUserProfilePic(Auth.companyId, user.id);\r\n if (imgResponse.hasError) {\r\n return null;\r\n } else {\r\n return imgResponse.data;\r\n }\r\n },\r\n [Auth]\r\n );\r\n\r\n const loadUsers = React.useCallback(async () => {\r\n setLoading(true);\r\n const authedUserResponse = await CompanyController.getCompanyFiltererdUsers(Auth.companyId, nameQuery ?? '', shipQuery ?? '');\r\n if (authedUserResponse.hasError) {\r\n setWarning(authedUserResponse.data);\r\n } else {\r\n const invitedUserResponse = await CompanyController.getCurrentMagicLinks(Auth.companyId);\r\n if (invitedUserResponse.hasError) {\r\n setWarning(invitedUserResponse.data);\r\n } else {\r\n const users = [\r\n ...authedUserResponse.data.filter(e => (userGroupQuery ?? '').length === 0 || e.userGroupId === userGroupQuery),\r\n ...invitedUserResponse.data\r\n .filter(e => (userGroupQuery ?? '').length === 0 || e.userGroupId === userGroupQuery)\r\n .filter(e => (nameQuery ?? '').length === 0 || (e.userName + e.firstName + e.lastName).toLowerCase().includes(nameQuery.toLowerCase()))\r\n .filter(e => (shipQuery ?? '').length === 0 || e.ships.filter(s => s.name.toLowerCase().includes(shipQuery.toLowerCase())).length > 0),\r\n ];\r\n users.sort((a, b) => {\r\n if (a.lastName < b.lastName) {\r\n return -1;\r\n }\r\n if (a.lastName > b.lastName) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n setUsers(users);\r\n }\r\n }\r\n setLoading(false);\r\n }, [Auth, loadUserProfilePic]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch users for initial render\r\n async function init() {\r\n const showList = localStorage.getItem('showListView');\r\n setShowListView(showList === 'false' || showList === '' || isNullOrUndefined(showList) ? false : true);\r\n const response = await UserGroupController.getUserGroups(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(response.data);\r\n }\r\n await loadUsers();\r\n }\r\n init();\r\n }, [Auth, loadUsers]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n const handleClosePopover = () => {\r\n setAnchorEl(null);\r\n setPopoverIndex(null);\r\n };\r\n\r\n const handelSortChange = React.useCallback(\r\n newSort => {\r\n if (newSort === orderRow) {\r\n if (orderDirection === 'desc') {\r\n setOrderDirection('asc');\r\n } else {\r\n setOrderDirection('desc');\r\n }\r\n return;\r\n }\r\n setOrderRow(newSort);\r\n setOrderDirection('desc');\r\n },\r\n [orderRow, orderDirection, setOrderDirection, setOrderRow]\r\n );\r\n\r\n function generateQueryString() {\r\n let output = '';\r\n if (nameSearch.trim().length > 0) {\r\n output += `name=${nameSearch}`;\r\n }\r\n if (shipSearch.trim().length > 0) {\r\n if (output.length > 0) {\r\n output += '&';\r\n }\r\n output += `ship=${shipSearch}`;\r\n }\r\n if ((userGroupQuery ?? '').trim().length > 0) {\r\n if (output.length > 0) {\r\n output += '&';\r\n }\r\n output += `userGroup=${userGroupQuery}`;\r\n }\r\n return output;\r\n }\r\n\r\n async function handleChangeOnLeaveStatus(id, onLeave) {\r\n setSaving(true);\r\n const response = await UserController.updateUserLeave(id, onLeave);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUsers(users.map(user => (user.id === id ? { ...user, onLeave } : user)));\r\n }\r\n setSaving(false);\r\n }\r\n\r\n async function handleFilterUsers(event) {\r\n if (!isNullOrUndefined(event)) {\r\n event.preventDefault();\r\n }\r\n\r\n if (prevNameSearch === nameSearch && prevShipSearch === shipSearch) {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setPrevNameSearch(nameSearch);\r\n setPrevShipSearch(shipSearch);\r\n\r\n updateQueryString(generateQueryString());\r\n\r\n const authedUserResponse = await CompanyController.getCompanyFiltererdUsers(Auth.companyId, nameSearch, shipSearch);\r\n if (authedUserResponse.hasError) {\r\n setWarning(authedUserResponse.data);\r\n } else {\r\n const invitedUserResponse = await CompanyController.getCurrentMagicLinks(Auth.companyId);\r\n if (invitedUserResponse.hasError) {\r\n setWarning(invitedUserResponse.data);\r\n } else {\r\n const newUsers = [\r\n ...authedUserResponse.data,\r\n ...invitedUserResponse.data\r\n .filter(e => nameSearch.length === 0 || (e.userName + e.firstName + e.lastName).toLowerCase().includes(nameSearch.toLowerCase()))\r\n .filter(e => shipSearch.length === 0 || e.ships.filter(s => s.name.toLowerCase().includes(shipSearch.toLowerCase())).length > 0),\r\n ];\r\n newUsers.sort((a, b) => {\r\n if (a.lastName < b.lastName) {\r\n return -1;\r\n }\r\n if (a.lastName > b.lastName) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n setUsers(newUsers);\r\n }\r\n }\r\n\r\n setLoading(false);\r\n }\r\n\r\n function handleToggleUserEnabled() {\r\n if (isNullOrUndefined(enableUserRef)) {\r\n return;\r\n }\r\n const { userIsBanned, id } = enableUserRef;\r\n (userIsBanned ? handleUnBanUser : handleBanUser)(id);\r\n setEnableUserRef(null);\r\n }\r\n\r\n async function handleResendMagicLink() {\r\n setLoading(true);\r\n const { userName } = resendLinkRef;\r\n setResendLinkRef(null);\r\n const response = await UserController.resendMagicLink(userName);\r\n if (response.hasError) {\r\n setWarning('Failed to resend link, please contact the developer');\r\n }\r\n setLoading(false);\r\n }\r\n\r\n async function handleRemoveMagicLink() {\r\n setLoading(true);\r\n const { userName } = removeLinkRef;\r\n setRemoveLinkRef(null);\r\n const response = await UserController.removeMagicLink(userName);\r\n if (response.hasError) {\r\n setWarning('Failed to delete link, please contact the developer');\r\n } else {\r\n setUsers(users.filter(e => e.userName !== userName));\r\n }\r\n setLoading(false);\r\n }\r\n\r\n async function handleDeleteUser() {\r\n if (!deleteUserRef) return;\r\n setLoading(true);\r\n setDeleteUserRef(null);\r\n const { id } = deleteUserRef;\r\n const response = await UserController.deleteUser(id);\r\n if (response.hasError) {\r\n setWarning('Failed to delete user, please contact the developer');\r\n } else {\r\n setUsers(users.filter(e => e.id !== id));\r\n }\r\n setLoading(false);\r\n }\r\n\r\n async function handleBanUser(userId) {\r\n setLoading(true);\r\n const response = await AdminController.banUser(userId);\r\n if (response.hasError) {\r\n setWarning('Failed to disable user, please contact the developer');\r\n } else {\r\n setUsers(users.map(e => (e.id === userId ? { ...e, userIsBanned: true } : e)));\r\n }\r\n setLoading(false);\r\n }\r\n\r\n async function handleUnBanUser(userId) {\r\n setLoading(true);\r\n const response = await AdminController.unBanUser(userId);\r\n if (response.hasError) {\r\n setWarning('Failed to enable user, please contact the developer');\r\n } else {\r\n setUsers(users.map(e => (e.id === userId ? { ...e, userIsBanned: false } : e)));\r\n }\r\n setLoading(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setNameSearch(value);\r\n break;\r\n case 'ship':\r\n setShipSearch(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function buildTopArea() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n setShowMassRestPeriodExport(true);\r\n }}\r\n startIcon={}\r\n >\r\n Mass Rest Period Export\r\n \r\n \r\n \r\n
\r\n (e.key === 'Enter' ? handleFilterUsers(e) : null)}\r\n onBlur={handleFilterUsers}\r\n name=\"ship\"\r\n fullWidth\r\n />\r\n
handleFilterUsers()}>\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n (e.key === 'Enter' ? handleFilterUsers(e) : null)}\r\n onBlur={handleFilterUsers}\r\n name=\"name\"\r\n fullWidth\r\n />\r\n
handleFilterUsers()}>\r\n \r\n
\r\n
\r\n
\r\n {loading ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n setShowDisabled(e.target.checked)} color=\"primary\" />} label=\"Show Disabled Users\" />\r\n {\r\n setShowListView(e.target.checked);\r\n localStorage.setItem('showListView', e.target.checked);\r\n }}\r\n color=\"primary\"\r\n />\r\n }\r\n label=\"Show List View\"\r\n />\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n function buildMenuItems(user) {\r\n const { id, userName, onLeave } = user;\r\n const isMe = Auth.userName === userName;\r\n const isInvite = isNullOrUndefined(id);\r\n return (\r\n <>\r\n {!isMe || userIsAdmin ? (\r\n <>\r\n {!isInvite ? (\r\n <>\r\n \r\n \r\n {!userIsCaptain && !isMe ? : null}\r\n \r\n \r\n {!showListView ? : null}\r\n \r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n {!showListView ? : null}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n function buildUser(user) {\r\n const { id, firstName, lastName, userName, userIsBanned, ships, userGroupId, onLeave } = user;\r\n const isMe = Auth.userName === userName;\r\n const isInvite = isNullOrUndefined(id);\r\n\r\n return (\r\n \r\n loadUserProfilePic(user)}\r\n description={\r\n <>\r\n {userName + (isMe ? ' (me)' : '')}\r\n {isInvite ? (\r\n \r\n Account creation pending\r\n \r\n ) : (\r\n \r\n {onLeave ? 'On Leave' : 'On Active Duty'}\r\n \r\n )}\r\n {userIsBanned ? User Disabled : null}\r\n
\r\n e.id === userGroupId)?.name ?? 'Not Set'} />\r\n {ships.map((e, i) => (\r\n \r\n ))}\r\n
\r\n \r\n }\r\n >\r\n {buildMenuItems(user)}\r\n \r\n
\r\n );\r\n }\r\n\r\n function buildUsers() {\r\n if (isEmpty(users) || isNullOrUndefined(users)) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {users.filter(e => (showDisabled ? true : !e.userIsBanned)).map((u, i) => buildUser(u, i))}\r\n \r\n );\r\n }\r\n\r\n function buildTableHead() {\r\n return (\r\n \r\n \r\n \r\n handelSortChange('firstName')}>\r\n Name\r\n \r\n \r\n \r\n handelSortChange('userName')}>\r\n Username\r\n \r\n \r\n \r\n handelSortChange('userGroupId')}>\r\n User Group\r\n \r\n \r\n Ships\r\n \r\n handelSortChange('id')}>\r\n Invite Pending\r\n \r\n \r\n \r\n handelSortChange('userIsBanned')}>\r\n User Disabled\r\n \r\n \r\n \r\n handelSortChange('onLeave')}>\r\n On Leave Status\r\n \r\n \r\n Toggle Leave Status\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildUserRow(user, index) {\r\n const { id, firstName, lastName, userName, userIsBanned, ships, userGroupId, onLeave } = user;\r\n const isInvite = isNullOrUndefined(id);\r\n\r\n return (\r\n <>\r\n \r\n {`${firstName} ${lastName}`}\r\n {userName}\r\n \r\n e.id === userGroupId)?.name ?? 'Not Set'} />\r\n \r\n \r\n {ships.map((e, i) => (\r\n \r\n ))}\r\n \r\n {isInvite ? 'Yes' : 'No'}\r\n {isInvite ? 'N/A' : userIsBanned ? 'Yes' : 'No'}\r\n {isInvite ? 'N/A' : onLeave ? 'On Leave' : 'On Active Duty'}\r\n \r\n {!isInvite ? handleChangeOnLeaveStatus(id, e.target.checked)} color=\"primary\" />} label=\"\" /> : null}\r\n \r\n \r\n {\r\n setAnchorEl(e.currentTarget);\r\n setPopoverIndex(index);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {buildMenuItems(user)}\r\n \r\n \r\n );\r\n }\r\n\r\n function getDefaultSortValue() {\r\n if (orderRow === 'userIsBanned' || orderRow === 'onLeave') {\r\n return -1;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n function buildListView() {\r\n return (\r\n \r\n \r\n {buildTableHead()}\r\n \r\n {users\r\n .filter(e => (showDisabled ? true : !e.userIsBanned))\r\n .sort((a, b) => {\r\n return orderDirection === 'desc' ? descendingComparator(a, b, orderRow, getDefaultSortValue()) : -descendingComparator(a, b, orderRow, getDefaultSortValue());\r\n })\r\n .map((user, i) => buildUserRow(user, i))}\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildConfirmEnableDisable() {\r\n return (\r\n setEnableUserRef(null)}>\r\n Disable/Enable User\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildConfirmDeleteUser() {\r\n return (\r\n setDeleteUserRef(null)}>\r\n Permanently Delete User\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildConfirmResendLink() {\r\n return (\r\n setResendLinkRef(null)}>\r\n Resend Registration Link\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildConfirmRemoveLink() {\r\n return (\r\n setRemoveLinkRef(null)}>\r\n Delete Unregistered User\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n {buildTopArea()}\r\n {showListView ? buildListView() : buildUsers()}\r\n {buildConfirmEnableDisable()}\r\n {buildConfirmResendLink()}\r\n {buildConfirmRemoveLink()}\r\n {buildConfirmDeleteUser()}\r\n setAssessmentUserRef(null)}\r\n isMe={Auth?.userName === assessmentUserRef?.userName}\r\n user={assessmentUserRef}\r\n companyId={Auth.companyId}\r\n userCompanyRole={Auth.companyRole}\r\n />\r\n loadUsers()}\r\n onClose={() => setAddEditUserRef(null)}\r\n isMe={Auth?.userName === addEditUserRef?.userName}\r\n isUserAdmin={userIsAdmin}\r\n user={addEditUserRef}\r\n companyId={Auth.companyId}\r\n userCompanyRole={Auth.companyRole}\r\n />\r\n setRestPeriodUserRef(null)} user={restPeriodUserRef} companyId={Auth.companyId} />\r\n setShowMassRestPeriodExport(null)} companyId={Auth.companyId} />\r\n setShowUploadTsv(false)} onSave={loadUsers} userCompanyRole={Auth.companyRole} companyId={Auth.companyId} isUserAdmin={userIsAdmin} />\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n UsersStore: state.Users,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n setUsers: items => dispatch(setUsers(items)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Users);\r\n\r\nUsers.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n UsersStore: PropTypes.object,\r\n setUsers: PropTypes.func,\r\n};\r\n","export const setUsers = items => ({\r\n type: 'SET_USERS',\r\n items,\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport moment from 'moment';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Link } from 'react-router-dom';\r\nimport { Button, Grid, Container, Typography, ListItemAvatar, Avatar, ListItemText, ListItem, List, Card } from '@material-ui/core';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport AccessTimeIcon from '@material-ui/icons/AccessTime';\r\nimport MailIcon from '@material-ui/icons/Mail';\r\nimport WorkIcon from '@material-ui/icons/Work';\r\nimport PersonIcon from '@material-ui/icons/Person';\r\n\r\nfunction Profile(props) {\r\n const [userName, setUserName] = React.useState(null);\r\n const [email, setEmail] = React.useState(null);\r\n const [appRoles, setAppRoles] = React.useState([]);\r\n const [companyRoles, setCompanyRoles] = React.useState([]);\r\n const [shipRoles, setShipRoles] = React.useState([]);\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [hideEmailButton, setHideEmailButton] = React.useState(false);\r\n const [emailConfirmed, setEmailConfirmed] = React.useState(false);\r\n const [hasTwoFactorAuth, setHasTwoFactorAuth] = React.useState(false);\r\n const [joined, setJoined] = React.useState('');\r\n const [emailConfirmationSent, setEmailConfirmationSent] = React.useState(false);\r\n const [loading, setLoading] = React.useState(true);\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n if (!props.Auth.isAuthenticated) {\r\n props.PushHistory('/Login');\r\n return;\r\n }\r\n const cachedInfoResponse = await UserController.fetchCachedUserData();\r\n if (!cachedInfoResponse.hasError) {\r\n const { companyRole, shipRoles } = cachedInfoResponse.data;\r\n setCompanyRoles(!isNullOrUndefined(companyRole) ? [companyRole] : []);\r\n setShipRoles(shipRoles);\r\n }\r\n console.log(cachedInfoResponse);\r\n const userInfoResponse = await UserController.getUserInfo();\r\n if (!userInfoResponse.hasError) {\r\n const { userName, email, emailConfirmed, joined, hasTwoFactor } = userInfoResponse.data;\r\n setUserName(userName);\r\n setEmail(email);\r\n setEmailConfirmed(emailConfirmed);\r\n setJoined(joined);\r\n setHasTwoFactorAuth(hasTwoFactor);\r\n setAppRoles(props.Auth.role);\r\n } else {\r\n setWarningText(userInfoResponse.data);\r\n }\r\n setLoading(false);\r\n }\r\n init();\r\n }, [props]);\r\n\r\n async function requestNewEmailConfirmation() {\r\n setHideEmailButton(true);\r\n setWarningText(null);\r\n const response = await UserController.requestEmailConfirmation();\r\n if (!response.hasError) {\r\n setEmailConfirmed(false);\r\n setEmailConfirmationSent(true);\r\n } else {\r\n setEmailConfirmed(false);\r\n setHideEmailButton(false);\r\n setWarningText(response.data);\r\n }\r\n }\r\n\r\n function getRoleName(role) {\r\n switch (role) {\r\n case 'UserInpersinator':\r\n return 'UserImpersonator';\r\n default:\r\n return role;\r\n }\r\n }\r\n\r\n function buildListItem(icon, primary, secondary = null) {\r\n return (\r\n \r\n \r\n {icon}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildEmailRequestLink() {\r\n const emailSent = !(!emailConfirmed && !hideEmailButton && !emailConfirmationSent);\r\n return (\r\n \r\n );\r\n }\r\n\r\n function buildRolesDisplay() {\r\n let rolesDisplay;\r\n const allRoles = [...appRoles, ...companyRoles, ...shipRoles];\r\n if (!isNullOrUndefined(allRoles) && allRoles.length > 0) {\r\n rolesDisplay = allRoles.map((role, i) => (\r\n \r\n {getRoleName(role)}\r\n {i < allRoles.length - 1 ? ', ' : ''}\r\n \r\n ));\r\n }\r\n return rolesDisplay ?? 'No Roles';\r\n }\r\n\r\n return (\r\n \r\n \r\n\r\n \r\n Profile\r\n \r\n\r\n \r\n \r\n \r\n \r\n {buildListItem(, 'User Name', userName)}\r\n {buildListItem(, email, emailConfirmed ? 'Confirmed' : 'Not Confirmed')}\r\n {buildListItem(, 'Date Joined', moment(joined).format('Do MMMM YYYY'))}\r\n {buildListItem(, 'Roles', buildRolesDisplay())}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {buildEmailRequestLink()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Profile);\r\n\r\nProfile.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Button, Container, Grid, TextField, Typography } from '@material-ui/core';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Link } from 'react-router-dom';\r\n\r\nfunction PasswordChange(props) {\r\n const [currentPassword, setCurrentPassword] = React.useState('');\r\n const [newPassword, setNewPassword] = React.useState('');\r\n const [newPasswordConfirmation, setNewPasswordConfirmation] = React.useState('');\r\n const [submitting, setSubmitting] = React.useState(false);\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [completed, setCompleted] = React.useState(false);\r\n\r\n // initialise\r\n React.useState(() => {\r\n if (!props.Auth.isAuthenticated) {\r\n props.PushHistory('/Login');\r\n }\r\n }, [props]);\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault();\r\n setSubmitting(true);\r\n setWarningText(null);\r\n if (newPassword !== newPasswordConfirmation) {\r\n setWarningText('Your new passwords do not match');\r\n return;\r\n }\r\n const response = await UserController.changePassword(currentPassword, newPassword, newPasswordConfirmation);\r\n if (!response.hasError) {\r\n setCompleted(true);\r\n } else {\r\n setWarningText(response.data);\r\n }\r\n setSubmitting(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const name = event.target.name;\r\n const value = event.target.value;\r\n\r\n switch (name) {\r\n case 'currentPassword':\r\n setCurrentPassword(value);\r\n break;\r\n case 'newPassword':\r\n setNewPassword(value);\r\n break;\r\n case 'newPasswordConfirmation':\r\n setNewPasswordConfirmation(value);\r\n break;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n function buildContent() {\r\n if (!completed) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n return (\r\n <>\r\n \r\n Password changed successfully, please use your new password next time you sign in.\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n Change Password\r\n \r\n \r\n {buildContent()}\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PasswordChange);\r\n\r\nPasswordChange.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport UserController from '../../controllers/UserController';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Container, Typography } from '@material-ui/core';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\n\r\nexport default function EmailConfirm(props) {\r\n const [loading, setLoading] = React.useState(true);\r\n const [success, setSuccess] = React.useState(false);\r\n const { search } = props.location;\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n const values = queryString.parse(search);\r\n const { userId, emailCode } = values;\r\n const response = await UserController.checkForEmailConfirmation(userId, emailCode);\r\n setSuccess(!response.hasError);\r\n setLoading(false);\r\n }\r\n init();\r\n }, [search]);\r\n\r\n function buildEmailMessage() {\r\n if (loading) {\r\n return null;\r\n }\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Email Confirmation\r\n \r\n {buildEmailMessage()}\r\n \r\n );\r\n}\r\n\r\nEmailConfirm.propTypes = {\r\n location: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { TextField, Button, Grid, Container, Typography } from '@material-ui/core';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Link } from 'react-router-dom';\r\n\r\nexport function EmailChange(props) {\r\n const [currentPassword, setCurrentPassword] = React.useState('');\r\n const [newEmail, setNewEmail] = React.useState('');\r\n const [showSuccess, setShowSuccess] = React.useState(false);\r\n const [submitting, setSubmitting] = React.useState(false);\r\n const [warningText, setWarningText] = React.useState(null);\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n if (!props.Auth.isAuthenticated) {\r\n props.PushHistory('/Login');\r\n }\r\n }, [props]);\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault();\r\n setSubmitting(true);\r\n const response = await UserController.requestEmailChange(newEmail, currentPassword);\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n } else {\r\n setShowSuccess(true);\r\n }\r\n setSubmitting(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const name = event.target.name;\r\n const value = event.target.value;\r\n\r\n switch (name) {\r\n case 'currentPassword':\r\n setCurrentPassword(value);\r\n break;\r\n case 'newEmail':\r\n setNewEmail(value);\r\n break;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n function buildTitle() {\r\n return (\r\n \r\n {showSuccess ? 'Request Sent' : 'Change Email'}\r\n \r\n );\r\n }\r\n\r\n function buildChangeEmailForm() {\r\n return (\r\n
\r\n \r\n \r\n {buildTitle()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n function buildConfirmChange() {\r\n return (\r\n <>\r\n \r\n \r\n {buildTitle()}\r\n \r\n \r\n An email has been sent to {newEmail}\r\n \r\n \r\n \r\n Please click the link within that email to confirm the change\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {showSuccess ? buildConfirmChange() : buildChangeEmailForm()}\r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(EmailChange);\r\n\r\nEmailChange.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Container, Typography } from '@material-ui/core';\r\nimport { IndexedDB } from '../../helpers/IndexedDB';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\n\r\nexport function EmailChangeConfirm(props) {\r\n const [loading, setLoading] = React.useState(true);\r\n const [success, setSuccess] = React.useState(false);\r\n const [newEmail, setNewEmail] = React.useState(false);\r\n const { PushHistory, Auth } = props;\r\n const { search } = props.location;\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n if (!Auth.isAuthenticated) {\r\n PushHistory('/Login');\r\n return;\r\n }\r\n const values = queryString.parse(search);\r\n const response = await UserController.confirmEmailChange(values.emailCode);\r\n if (response.hasError) {\r\n setSuccess(false);\r\n } else {\r\n await IndexedDB.remove('userName');\r\n await IndexedDB.add('userName', response.data.userName);\r\n setNewEmail(response.data.userName);\r\n setSuccess(true);\r\n }\r\n setLoading(false);\r\n }\r\n init();\r\n }, [props, search, PushHistory, Auth]);\r\n\r\n function buildEmailMessage() {\r\n if (loading) {\r\n return null;\r\n }\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Email Confirmation\r\n \r\n {buildEmailMessage()}\r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(EmailChangeConfirm);\r\n\r\nEmailChangeConfirm.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n location: PropTypes.any,\r\n};\r\n","import React from 'react';\r\nimport BridgeImage from '../../images/bridge.png';\r\nimport SentiniLogo from '../../images/fathom-final.png';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport { push } from 'connected-react-router';\r\nimport { connect } from 'react-redux';\r\nimport { Button, Grid, Container, Typography, TextField, makeStyles } from '@material-ui/core';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Link } from 'react-router-dom';\r\nimport { AuthLayout } from '../../components/Auth/AuthLayout';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n formRoot: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n },\r\n logo: {\r\n marginBottom: 32,\r\n maxWidth: 300,\r\n },\r\n}));\r\n\r\nfunction PasswordForgot(props) {\r\n const [userName, setUserName] = React.useState('');\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [emailSent, setEmailSent] = React.useState(false);\r\n const [submitting, setSubmitting] = React.useState(false);\r\n const classes = useStyles();\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n if (props.Auth.isAuthenticated) {\r\n props.PushHistory('/Login');\r\n }\r\n }, [props]);\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault();\r\n setWarningText(null);\r\n setSubmitting(true);\r\n const response = await UserController.forgotPassword(userName);\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n } else {\r\n setEmailSent(true);\r\n }\r\n setSubmitting(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const value = event.target.value;\r\n setUserName(value);\r\n }\r\n\r\n function buildEmailForm() {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n function buildSuccessContent() {\r\n return (\r\n \r\n \r\n \r\n An email has been sent to your account containing a reset password link\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildContent() {\r\n return !emailSent ? buildEmailForm() : buildSuccessContent();\r\n }\r\n\r\n return (\r\n \r\n \r\n \"Sentini\r\n \r\n Forgot Password\r\n \r\n {buildContent()}\r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PasswordForgot);\r\n\r\nPasswordForgot.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport BridgeImage from '../../images/bridge.png';\r\nimport SentiniLogo from '../../images/fathom-final.png';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { checkPassword, isNullOrUndefined } from '../../helpers/Utils';\r\nimport { Button, Container, TextField, Typography, Grid } from '@material-ui/core';\r\nimport { AuthLayout } from '../../components/Auth/AuthLayout';\r\n\r\nfunction PasswordReset(props) {\r\n const [password, setPassword] = React.useState('');\r\n const [passwordConfirmation, setPasswordConfirmation] = React.useState('');\r\n const [warningText, setWarningText] = React.useState('');\r\n const [showWarning, setShowWarning] = React.useState(false);\r\n const [passwordRequirements, setPasswordRequirements] = React.useState(null);\r\n const [passwordErrors, setPasswordErrors] = React.useState([]);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [submitting, setSubmitting] = React.useState(false);\r\n const values = queryString.parse(props.location.search);\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n if (props.Auth.isAuthenticated) {\r\n props.PushHistory('/');\r\n }\r\n const pwordReqResponse = await UserController.getPasswordRequirements();\r\n if (!pwordReqResponse.hasError) {\r\n setPasswordRequirements(pwordReqResponse.data);\r\n } else {\r\n setWarningText('Failed to fetch password requirements');\r\n setShowWarning(true);\r\n }\r\n }\r\n init();\r\n }, [props]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (isNullOrUndefined(redirectUrl)) {\r\n return;\r\n }\r\n props.PushHistory(redirectUrl);\r\n }, [redirectUrl, props]);\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault();\r\n setSubmitting(true);\r\n setShowWarning(false);\r\n\r\n const { userId, emailCode } = values;\r\n const response = await UserController.resetPassword(userId, emailCode, password, passwordConfirmation);\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n setSubmitting(false);\r\n setShowWarning(true);\r\n } else {\r\n setRedirectUrl('/Login');\r\n }\r\n }\r\n\r\n function handleInput(event) {\r\n const name = event.target.name;\r\n const value = event.target.value;\r\n\r\n switch (name) {\r\n case 'password':\r\n setPassword(value);\r\n break;\r\n case 'passwordConfirmation':\r\n setPasswordConfirmation(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function checkPasswordIsValid() {\r\n setPasswordErrors(checkPassword(passwordRequirements, password));\r\n }\r\n\r\n function buildPasswordErrors() {\r\n if (passwordErrors.length === 0) {\r\n return null;\r\n }\r\n return passwordErrors.map((e, i) => (\r\n \r\n {e}\r\n
\r\n
\r\n ));\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n \r\n Reset Password\r\n \r\n \r\n \r\n checkPasswordIsValid()}\r\n helperText={buildPasswordErrors()}\r\n variant=\"filled\"\r\n fullWidth\r\n required\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {showWarning ? : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(PasswordReset);\r\n\r\nPasswordReset.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n location: PropTypes.object,\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { QRCode } from 'react-qr-svg';\r\nimport { push } from 'connected-react-router';\r\nimport { Button, Container, Grid, Typography, Card, CardContent, CardHeader, Divider, TextField } from '@material-ui/core';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\n\r\nfunction TwoFactorManager(props) {\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [hasTwoFactorAuth, setHasTwoFactorAuth] = React.useState(false);\r\n const [twoFactorAuthSetup, setTwoFactorAuthSetup] = React.useState(null);\r\n const [twoFactorAuthToken, setTwoFactorAuthToken] = React.useState('');\r\n const [twoFactorAuthRecovery, setTwoFactorAuthRecovery] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n\r\n const fetchUserData = useCallback(async () => {\r\n setWarningText(null);\r\n const response = await UserController.getUserInfo();\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n return;\r\n }\r\n const { hasTwoFactor } = response.data;\r\n if (!hasTwoFactor) {\r\n const authCode = await UserController.getAuthenticatorCode();\r\n if (authCode.hasError) {\r\n setWarningText(authCode.data);\r\n return;\r\n }\r\n setTwoFactorAuthSetup(authCode.data);\r\n }\r\n setHasTwoFactorAuth(hasTwoFactor);\r\n }, []);\r\n\r\n // intialise\r\n React.useEffect(() => {\r\n async function init() {\r\n if (!props.Auth.isAuthenticated) {\r\n props.PushHistory('/Login');\r\n }\r\n await fetchUserData();\r\n setLoading(false);\r\n }\r\n init();\r\n }, [props, fetchUserData]);\r\n\r\n async function handleAdd(event) {\r\n event.preventDefault();\r\n setWarningText(null);\r\n setLoading(true);\r\n const response = await UserController.addTwoFactor(twoFactorAuthSetup.secret64, twoFactorAuthToken);\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n } else {\r\n setTwoFactorAuthRecovery(response.data);\r\n setTwoFactorAuthToken('');\r\n setHasTwoFactorAuth(true);\r\n }\r\n setLoading(false);\r\n }\r\n\r\n async function handleRemove(event) {\r\n event.preventDefault();\r\n setLoading(true);\r\n setWarningText(null);\r\n const response = await UserController.removeTwoFactor(twoFactorAuthToken);\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n } else {\r\n setTwoFactorAuthRecovery(null);\r\n setTwoFactorAuthToken('');\r\n setHasTwoFactorAuth(false);\r\n await fetchUserData();\r\n }\r\n setLoading(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const name = event.target.name;\r\n const value = event.target.value;\r\n\r\n switch (name) {\r\n case 'twoFactorAuthToken':\r\n setTwoFactorAuthToken(value);\r\n break;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n function buildAuthQRCode() {\r\n let authQrCode = null;\r\n if (!hasTwoFactorAuth && twoFactorAuthSetup != null) {\r\n authQrCode = (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n If the above doesn't work, try the code\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n {twoFactorAuthSetup.secret}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n return authQrCode;\r\n }\r\n\r\n function buildAddForm() {\r\n return (\r\n <>\r\n {buildAuthQRCode()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildRecoveryCode() {\r\n return twoFactorAuthRecovery != null ? (\r\n \r\n \r\n \r\n Your Recovery Code is\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n {twoFactorAuthRecovery}\r\n \r\n \r\n \r\n \r\n \r\n This can be used in place of your authenticatior code. Please keep it safe.\r\n \r\n \r\n \r\n \r\n ) : null;\r\n }\r\n\r\n function buildRemoveForm() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n\r\n
\r\n \r\n Two Factor Login\r\n \r\n \r\n \r\n \r\n \r\n {buildRecoveryCode()}\r\n {hasTwoFactorAuth ? buildRemoveForm() : buildAddForm()}\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(TwoFactorManager);\r\n\r\nTwoFactorManager.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Button, Grid, TextField, Typography, Container } from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\n\r\nfunction TwoFactorVerify(props) {\r\n const [code, setCode] = React.useState('');\r\n const [verifying, setVerifying] = React.useState(false);\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (isNullOrUndefined(redirectUrl)) {\r\n return;\r\n }\r\n props.PushHistory(redirectUrl);\r\n }, [redirectUrl, props]);\r\n\r\n async function verifyCode() {\r\n setVerifying(true);\r\n setWarningText(null);\r\n const response = await UserController.verifyTwoFactor(code);\r\n if (response.hasError) {\r\n setWarningText(response.data);\r\n setVerifying(false);\r\n } else {\r\n setRedirectUrl('/');\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Two Factor Code Required\r\n \r\n \r\n \r\n {\r\n setCode(e.target.value);\r\n }}\r\n value={code}\r\n type=\"text\"\r\n variant=\"filled\"\r\n fullWidth\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(TwoFactorVerify);\r\n\r\nTwoFactorVerify.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport { Container, Typography } from '@material-ui/core';\r\n\r\nexport default function NotFound() {\r\n return (\r\n \r\n 404 Page Not Found\r\n \r\n );\r\n}\r\n","import React, { useCallback } from 'react';\r\nimport moment from 'moment';\r\nimport PropTypes from 'prop-types';\r\nimport NotificationsController from '../../controllers/NotificationsController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { makeStyles, Button, Grid, Typography, Container, Paper } from '@material-ui/core';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n paddingTop: '32px',\r\n paddingBottom: '32px',\r\n },\r\n notif: {\r\n padding: '12px 16px',\r\n },\r\n}));\r\n\r\nfunction NotificationList(props) {\r\n const { PushHistory } = props;\r\n const { isAuthenticated } = props.Auth;\r\n const [loading, setLoading] = React.useState(true);\r\n const [notifications, setNotifications] = React.useState([]);\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [page, setPage] = React.useState(0);\r\n const [moreToFind, setMoreToFind] = React.useState(false);\r\n const classes = useStyles();\r\n\r\n const fetchNotifications = useCallback(async () => {\r\n setWarningText(null);\r\n setLoading(true);\r\n const response = await NotificationsController.getAll(page);\r\n if (!response.hasError) {\r\n setNotifications([...notifications, ...response.data]);\r\n if (response.data.length < 100) {\r\n setMoreToFind(false);\r\n } else {\r\n setPage(page + 1);\r\n }\r\n } else {\r\n setWarningText(response.data);\r\n setMoreToFind(false);\r\n }\r\n setLoading(false);\r\n }, [notifications, page]);\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n if (!isAuthenticated) {\r\n PushHistory('/Login');\r\n return;\r\n }\r\n if (notifications.length === 0) {\r\n await fetchNotifications();\r\n }\r\n }\r\n init();\r\n }, [isAuthenticated, PushHistory, fetchNotifications, notifications]);\r\n\r\n function buildNotifications() {\r\n if (notifications.length === 0) {\r\n return (\r\n \r\n \r\n \r\n No notifications\r\n \r\n \r\n \r\n );\r\n }\r\n return notifications.map((e, i) => buildNotification(e, i));\r\n }\r\n\r\n function buildNotification(notif, index) {\r\n const { title, message, created } = notif;\r\n return (\r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n {message}\r\n \r\n \r\n {moment.utc(created).local().format('D MMMM YYYY')}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildFindMoreButton() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n\r\n \r\n Notifications\r\n \r\n\r\n \r\n {buildNotifications()}\r\n \r\n \r\n \r\n {buildFindMoreButton()}\r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(NotificationList);\r\n\r\nNotificationList.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport chartist from 'chartist';\r\nimport ChartistGraph from 'react-chartist';\r\nimport { Button, ButtonGroup, Card, CardActions, CardHeader, CircularProgress, makeStyles, Typography } from '@material-ui/core';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport trendline from 'trendline';\r\nimport 'chartist-plugin-legend';\r\nimport 'chartist-plugin-tooltips';\r\nimport 'chartist-plugin-tooltips/dist/chartist-plugin-tooltip.css';\r\nimport moment from 'moment';\r\nimport { ArrowLeft, ArrowRight, ZoomIn, ZoomOut } from '@material-ui/icons';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n wrapper: {\r\n minHeight: 500,\r\n position: 'relative',\r\n '& .ct-chart': {\r\n minHeight: 400,\r\n ...chartLineStyle(Colours.primary, 'a'),\r\n ...chartLineStyle(Colours.secondary, 'b'),\r\n ...chartLineStyle('#f05b4f', 'c'),\r\n ...chartLineStyle('#f4c63d', 'd'),\r\n ...chartLineStyle('#46e459', 'e'),\r\n ...chartLineStyle('#7646e4', 'f'),\r\n ...chartLineStyle('#ff0070', 'g'),\r\n },\r\n '& .ct-chart-line': {\r\n minHeight: 379,\r\n },\r\n '& .ct-legend': {\r\n '& li:before': {\r\n top: 3,\r\n },\r\n ...chartLegendStyle(Colours.primary, 1),\r\n ...chartLegendStyle(Colours.secondary, 2),\r\n ...chartLegendStyle('#f05b4f', 3),\r\n ...chartLegendStyle('#f4c63d', 4),\r\n ...chartLegendStyle('#46e459', 5),\r\n ...chartLegendStyle('#7646e4', 6),\r\n ...chartLegendStyle('#ff0070', 7),\r\n },\r\n '& .ct-labels': {\r\n '& foreignObject': {\r\n fontWeight: 900,\r\n backgroundColor: 'rgba(255, 255, 255, 0.87)',\r\n },\r\n },\r\n },\r\n trendline: {\r\n '& .ct-series-b': {\r\n '& path': {\r\n strokeDasharray: '10,10',\r\n },\r\n },\r\n },\r\n tooltip: {\r\n top: 0,\r\n left: 0,\r\n color: '#000',\r\n backgroundColor: '#fff',\r\n borderRadius: 4,\r\n boxShadow: '0px 2px 1px -1px rgb(0 0 0 / 20%), 0px 1px 1px 0px rgb(0 0 0 / 14%), 0px 1px 3px 0px rgb(0 0 0 / 12%)',\r\n zIndex: 100,\r\n '&::before': {\r\n borderTopColor: 'transparent',\r\n },\r\n },\r\n tooltipHideValue: {\r\n '& .chartist-tooltip-value': {\r\n display: 'none',\r\n },\r\n },\r\n}));\r\n\r\nconst chartLegendStyle = (color, index) => ({\r\n '& li.inactive::before': {\r\n background: 'transparent !important',\r\n },\r\n [`& :nth-child(${index})::before`]: {\r\n background: color,\r\n borderColor: color,\r\n },\r\n});\r\n\r\nconst chartLineStyle = (color, series) => ({\r\n [`& g.ct-series-${series}`]: {\r\n '& .ct-line': {\r\n stroke: color,\r\n },\r\n '& .ct-point': {\r\n stroke: color,\r\n },\r\n },\r\n});\r\n\r\nconst zoomLevels = [\r\n {\r\n range: 4,\r\n interval: 1,\r\n name: '4 Weeks',\r\n },\r\n {\r\n range: 8,\r\n interval: 1,\r\n name: '8 Weeks',\r\n },\r\n {\r\n range: 12,\r\n interval: 1,\r\n name: '12 Weeks',\r\n },\r\n {\r\n range: 24,\r\n interval: 2,\r\n name: '24 Weeks',\r\n },\r\n {\r\n range: 52,\r\n interval: 4,\r\n name: '1 Year',\r\n },\r\n];\r\n\r\nexport function DashboardGraph(props) {\r\n const { title, labels, series, legend, scatterGraph, loading } = props;\r\n const [zoomLevel, setZoomLevel] = React.useState(4);\r\n const [dateRange, setDateRange] = React.useState({\r\n end: getDataValueFromDate(moment()),\r\n start: getDataValueFromDate(moment().subtract('week', zoomLevels[zoomLevel].range)),\r\n });\r\n const [cache, setCache] = React.useState(true);\r\n const [rendering, setRendering] = React.useState(true);\r\n const classes = useStyles();\r\n\r\n const cleanupTooltips = React.useCallback(() => {\r\n const tooltips = window.document.getElementsByClassName('chartist-tooltip');\r\n for (let i = 0; i < tooltips.length; i++) {\r\n tooltips[i].removeAttribute('style');\r\n }\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const newCache = JSON.stringify({ title, labels, series, legend });\r\n if (cache !== newCache) {\r\n setCache(newCache);\r\n setRendering(false);\r\n setTimeout(() => {\r\n setRendering(true);\r\n }, 50);\r\n }\r\n return cleanupTooltips;\r\n }, [title, labels, series, legend, cache, cleanupTooltips]);\r\n\r\n function handleOffsetDateRange(steps = 1) {\r\n const start = getDateFromDataValue(dateRange.start);\r\n const end = getDateFromDataValue(dateRange.end);\r\n setDateRange({\r\n end: getDataValueFromDate(end.add('week', steps)),\r\n start: getDataValueFromDate(start.add('week', steps)),\r\n });\r\n }\r\n\r\n function handleZoom(step = 1) {\r\n const desiredZoom = zoomLevel + step;\r\n if (desiredZoom >= zoomLevels.length || desiredZoom < 0) {\r\n return;\r\n }\r\n setZoomLevel(desiredZoom);\r\n setDateRange({\r\n end: dateRange.end,\r\n start: getDataValueFromDate(getDateFromDataValue(dateRange.end).subtract('week', zoomLevels[desiredZoom].range)),\r\n });\r\n }\r\n\r\n function getDataValueFromDate(value) {\r\n return value.unix() * 60 * 60 * 24;\r\n }\r\n\r\n function getDateFromDataValue(value) {\r\n return moment.unix(value / 24 / 60 / 60);\r\n }\r\n\r\n function getDateRangeLabels() {\r\n const out = [];\r\n const date = getDateFromDataValue(dateRange.start);\r\n const end = getDateFromDataValue(dateRange.end);\r\n while (date.isBefore(end)) {\r\n out.push(date.unix() * 60 * 60 * 24);\r\n date.add('week', zoomLevels[zoomLevel].interval);\r\n }\r\n return out;\r\n }\r\n\r\n const scatterGraphData = scatterGraph ? series[0]?.data.filter(e => e.x > dateRange.start && e.x < dateRange.end).map(e => ({ ...e, x: e.x, y: e.y !== null ? parseFloat(e.y) : null })) ?? [] : [];\r\n\r\n const trend = trendline(scatterGraphData, 'x', 'y');\r\n\r\n const data = {\r\n labels: scatterGraph ? getDateRangeLabels() : labels,\r\n series: scatterGraph\r\n ? [\r\n { name: 'scatter', data: scatterGraphData },\r\n { name: 'trend', data: getDateRangeLabels().map(e => ({ x: e, y: trend.calcY(e) })) },\r\n ]\r\n : series,\r\n };\r\n\r\n const options = {\r\n showGrid: true,\r\n plugins: [\r\n chartist.plugins.tooltip({\r\n class: `${classes.tooltip}${scatterGraph ? ` ${classes.tooltipHideValue}` : ''}`,\r\n anchorToPoint: true,\r\n appendToBody: true,\r\n }),\r\n chartist.plugins.legend({\r\n legendNames: legend,\r\n }),\r\n ],\r\n series: scatterGraph\r\n ? {\r\n scatter: {\r\n showLine: false,\r\n },\r\n trend: {\r\n showPoint: false,\r\n },\r\n }\r\n : {},\r\n axisY: {\r\n labelInterpolationFnc: function (value) {\r\n return value % 1 === 0 ? value : null;\r\n },\r\n ...(scatterGraph\r\n ? {\r\n low: 0,\r\n high: 100,\r\n }\r\n : {}),\r\n },\r\n axisX: scatterGraph\r\n ? {\r\n type: scatterGraph ? chartist.FixedScaleAxis : null,\r\n ticks: scatterGraph ? getDateRangeLabels() : null,\r\n labelInterpolationFnc: scatterGraph\r\n ? function (value) {\r\n return getDateFromDataValue(value).format('DD.MM.YYYY');\r\n }\r\n : null,\r\n low: scatterGraph ? dateRange.start : null,\r\n high: scatterGraph ? dateRange.end : null,\r\n }\r\n : {},\r\n };\r\n\r\n const type = 'Line';\r\n\r\n return (\r\n \r\n {rendering && (\r\n <>\r\n \r\n \r\n {loading ? : null}\r\n \r\n )}\r\n {scatterGraph && (\r\n \r\n \r\n Showing {zoomLevels[zoomLevel].name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nDashboardGraph.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n series: PropTypes.array.isRequired,\r\n scatterGraph: PropTypes.bool,\r\n labels: PropTypes.array.isRequired,\r\n legend: PropTypes.array.isRequired,\r\n loading: PropTypes.bool,\r\n};\r\n","import React from 'react';\r\nimport moment from 'moment';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport NoImage from '../../images/no-img.png';\r\nimport ComplianceController from '../../controllers/ComplianceController';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport { ButtonBase, Card, CardContent, CardHeader, CircularProgress, Divider, Grid, makeStyles, Tooltip, Typography } from '@material-ui/core';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { isEmpty, isNullOrUndefined, scoreToPercentage } from '../../helpers/Utils';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport { DashboardGraph } from './DashboardGraph';\r\nimport { Close, Done, TrendingDown, TrendingUp } from '@material-ui/icons';\r\nimport { clearStore, setCompanyCompliance, setShipCompliance, setUserCompliance, setAssessmentCompliance, setShips, setUserGroups, setShipUsers } from '../../stores/Actions/Dashboard';\r\nimport { Skeleton } from '../../components/Common/Skeleton';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n\r\n '& .progress': {\r\n position: 'absolute',\r\n top: 24,\r\n right: 24,\r\n },\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n },\r\n container: {\r\n maxWidth: 'calc(100vw - 115px)',\r\n [theme.breakpoints.down('xs')]: {\r\n maxWidth: 'calc(100vw - 33px)',\r\n },\r\n },\r\n topRowCard: {\r\n width: '100%',\r\n display: 'block',\r\n textAlign: 'unset',\r\n backgroundColor: Colours.white,\r\n borderRadius: 4,\r\n position: 'relative',\r\n '& .MuiCardContent-root': {\r\n paddingTop: 24,\r\n paddingBottom: 24,\r\n },\r\n '& .col-wrapper': {\r\n display: 'flex',\r\n marginTop: 12,\r\n },\r\n '& .single-col': {\r\n width: '100%',\r\n padding: '12px 24px',\r\n },\r\n '& .left-col, .right-col': {\r\n padding: '12px 24px',\r\n width: '50%',\r\n },\r\n '& .right-col': {\r\n borderLeft: `1px solid ${Colours.bodyText}`,\r\n },\r\n '& .item': {\r\n marginBottom: 4,\r\n '& .MuiTypography-h6': {\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n },\r\n '& .trend-icon': {\r\n display: 'block',\r\n marginLeft: 'auto',\r\n transform: 'scale(1.5)',\r\n },\r\n },\r\n listItem: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n minHeight: 80,\r\n transition: 'all 0.5s ease',\r\n position: 'relative',\r\n borderBottom: `1px solid ${Colours.bodyText}`,\r\n borderTopLeftRadius: 4,\r\n borderTopRightRadius: 4,\r\n padding: '4px 32px',\r\n cursor: 'pointer',\r\n '&:hover': {\r\n backgroundColor: Colours.white,\r\n WebkitBoxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n MozBoxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n boxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n },\r\n '& .list-img': {\r\n width: 70,\r\n height: 50,\r\n objectFit: 'cover',\r\n objectPosition: 'center',\r\n borderRadius: 4,\r\n position: 'absolute',\r\n },\r\n '& label': {\r\n pointerEvents: 'none',\r\n },\r\n '& .list-val.margin': {\r\n marginLeft: 82,\r\n },\r\n '& .list-val': {\r\n flex: 1,\r\n padding: 4,\r\n '&.wider': {\r\n flex: 2,\r\n },\r\n },\r\n },\r\n questionItem: {\r\n border: `2px solid ${Colours.red}`,\r\n position: 'relative',\r\n '& .icon': {\r\n position: 'absolute',\r\n top: 4,\r\n right: 4,\r\n backgroundColor: Colours.red,\r\n borderRadius: 64,\r\n height: 24,\r\n '& path': {\r\n fill: Colours.white,\r\n },\r\n },\r\n '&.green': {\r\n borderColor: Colours.green,\r\n '& .icon': {\r\n backgroundColor: Colours.green,\r\n },\r\n },\r\n },\r\n attemptItem: {\r\n cursor: 'pointer',\r\n padding: 16,\r\n transition: 'all 0.5s ease',\r\n '&.active': {\r\n backgroundColor: Colours.primary,\r\n '& .MuiTypography-root': {\r\n color: Colours.white + ' !important',\r\n },\r\n },\r\n '&:hover': {\r\n backgroundColor: Colours.primaryDark,\r\n '& .MuiTypography-root': {\r\n color: Colours.white + ' !important',\r\n },\r\n },\r\n },\r\n header: {\r\n marginTop: 12,\r\n },\r\n skeleton: {\r\n width: '100%',\r\n height: 200,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n animation: 'skeleton 3s infinite ease-out',\r\n borderRadius: 4,\r\n margin: 8,\r\n },\r\n}));\r\n\r\nconst DashboardViewState = {\r\n All: 0,\r\n Ship: 1,\r\n User: 2,\r\n Assessment: 3,\r\n};\r\n\r\nfunction Dashboard(props) {\r\n const queryStringValue = props.location.search;\r\n const { shipId, shipName, userId, userName, assessmentId, assessmentName } = queryString.parse(queryStringValue);\r\n const { Auth, PushHistory, DashboardStore, setCompanyCompliance, setShipCompliance, setAssessmentCompliance, setUserCompliance, setShipUsers, setUserGroups, setShips } = props;\r\n const { companyCompliance, assessmentCompliance, shipCompliance, userCompliance, shipUsers, userGroups, ships } = DashboardStore;\r\n\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [selectedAttempt, setSelectedAttempt] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [shipsLoading, setShipsLoading] = React.useState(true);\r\n const [complianceLoading, setComplianceLoading] = React.useState(true);\r\n const [userGroupsLoading, setUserGroupsLoading] = React.useState(true);\r\n const [usersLoading, setUsersLoading] = React.useState(true);\r\n const [lastQuery, setLastQuery] = React.useState(true);\r\n\r\n const classes = useStyles();\r\n\r\n const viewState =\r\n !isNullOrUndefined(assessmentId) && !isNullOrUndefined(assessmentName) && !isNullOrUndefined(userId) && !isNullOrUndefined(userName)\r\n ? DashboardViewState.Assessment\r\n : !isNullOrUndefined(userId) && !isNullOrUndefined(userName)\r\n ? DashboardViewState.User\r\n : !isNullOrUndefined(shipId) && !isNullOrUndefined(shipName)\r\n ? DashboardViewState.Ship\r\n : DashboardViewState.All;\r\n\r\n const isUser = viewState === DashboardViewState.User;\r\n const isAssessment = viewState === DashboardViewState.Assessment;\r\n\r\n const getCompliance = () => {\r\n switch (viewState) {\r\n case DashboardViewState.All:\r\n return companyCompliance;\r\n case DashboardViewState.Ship:\r\n return shipCompliance[shipId] ?? {};\r\n case DashboardViewState.User:\r\n return userCompliance[userId] ?? {};\r\n case DashboardViewState.Assessment:\r\n return assessmentCompliance[assessmentId] ?? {};\r\n default:\r\n return [];\r\n }\r\n };\r\n\r\n const compliance = getCompliance();\r\n\r\n const loadPeripheralUserGroupData = React.useCallback(async (companyId, complianceData) => {\r\n if (complianceData.userGroupsBest != null || complianceData.userGroupsWorst != null) {\r\n setUserGroupsLoading(true);\r\n const response = await UserGroupController.getUserGroups(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(response.data);\r\n setUserGroupsLoading(false);\r\n window.history.replaceState({ ...window.history.state, userGroupsCache: response.data }, '');\r\n }\r\n }\r\n }, []);\r\n\r\n const loadPeripheralShipData = React.useCallback(\r\n async (companyId, complianceData) => {\r\n if (complianceData.shipAverages != null) {\r\n setShipsLoading(true);\r\n const response = await ShipController.getShips(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const prevShips = ships;\r\n\r\n response.data = response.data.map(e => {\r\n const prevShip = prevShips.find(el => el.id === e.id);\r\n\r\n if (prevShip) {\r\n const { logoPath } = prevShip;\r\n if (Object.keys(prevShip).includes('logoPath')) {\r\n return { ...e, logoPath };\r\n }\r\n }\r\n return e;\r\n });\r\n\r\n setShips(response.data);\r\n setShipsLoading(false);\r\n\r\n for (let i = 0; i < response.data.length; i++) {\r\n const prevShip = prevShips.find(el => el.id === response.data[i].id);\r\n if (!prevShip) {\r\n const imgResponse = await ShipController.getShipLogo(companyId, response.data[i].id);\r\n if (imgResponse.hasError) {\r\n continue;\r\n }\r\n response.data[i].logoPath = imgResponse.data;\r\n }\r\n }\r\n\r\n setShips(response.data);\r\n window.history.replaceState({ ...window.history.state, shipsCache: response.data }, '');\r\n }\r\n }\r\n },\r\n [ships]\r\n );\r\n\r\n const loadPeripheralUserData = React.useCallback(\r\n async (companyId, complianceData) => {\r\n if (complianceData.userAverages != null) {\r\n setUsersLoading(true);\r\n const response = await CompanyController.getCompanyUsers(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const prevShipUsers = shipUsers;\r\n\r\n response.data = response.data.map(e => {\r\n const prevShipUser = prevShipUsers.find(el => el.id === e.id);\r\n\r\n if (prevShipUser) {\r\n const { imageSrc } = prevShipUser;\r\n if (Object.keys(prevShipUser).includes('imageSrc')) {\r\n return { ...e, imageSrc };\r\n }\r\n }\r\n\r\n return e;\r\n });\r\n\r\n setShipUsers(response.data);\r\n setUsersLoading(false);\r\n\r\n for (let i = 0; i < response.data.length; i++) {\r\n const prevShipUser = prevShipUsers.find(el => el.id === response.data[i].id);\r\n\r\n if (!prevShipUser) {\r\n const imgResponse = await CompanyController.getUserProfilePic(companyId, response.data[i].id);\r\n if (imgResponse.hasError) {\r\n return;\r\n }\r\n response.data[i].imageSrc = imgResponse.data;\r\n }\r\n }\r\n\r\n setShipUsers(response.data);\r\n window.history.replaceState({ ...window.history.state, usersCache: response.data }, '');\r\n }\r\n }\r\n },\r\n [shipUsers]\r\n );\r\n\r\n const loadPeripheralData = React.useCallback(\r\n async (companyId, complianceData) => {\r\n loadPeripheralUserGroupData(companyId, complianceData);\r\n loadPeripheralUserData(companyId, complianceData);\r\n loadPeripheralShipData(companyId, complianceData);\r\n if (!isNullOrUndefined(complianceData.length) && complianceData.length > 0) {\r\n setSelectedAttempt(complianceData[0].id);\r\n }\r\n },\r\n [ships, shipUsers, loadPeripheralUserGroupData, loadPeripheralUserData, loadPeripheralShipData]\r\n );\r\n\r\n const loadAllCompliance = React.useCallback(\r\n async companyId => {\r\n setComplianceLoading(true);\r\n\r\n const response = await ComplianceController.getCompanyComplianceResults(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setCompanyCompliance(response.data);\r\n setComplianceLoading(false);\r\n window.history.replaceState({ ...window.history.state, companyComplianceCache: response.data }, '');\r\n await loadPeripheralData(companyId, response.data);\r\n }\r\n setComplianceLoading(false);\r\n },\r\n [loadPeripheralData]\r\n );\r\n\r\n const loadShipCompliance = React.useCallback(\r\n async companyId => {\r\n setComplianceLoading(true);\r\n const response = await ComplianceController.getShipComplianceResults(companyId, shipId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const newShipCompliance = { ...shipCompliance, [shipId]: response.data };\r\n setShipCompliance(newShipCompliance);\r\n setComplianceLoading(false);\r\n window.history.replaceState({ ...window.history.state, shipComplianceCache: newShipCompliance }, '');\r\n await loadPeripheralData(companyId, response.data);\r\n }\r\n setComplianceLoading(false);\r\n },\r\n [shipId, loadPeripheralData]\r\n );\r\n\r\n const loadUserCompliance = React.useCallback(\r\n async companyId => {\r\n setComplianceLoading(true);\r\n const response = await ComplianceController.getUserComplianceResults(companyId, userId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const newUserCompliance = { ...userCompliance, [userId]: response.data };\r\n setUserCompliance(newUserCompliance);\r\n setComplianceLoading(false);\r\n window.history.replaceState({ ...window.history.state, userComplianceCache: newUserCompliance }, '');\r\n await loadPeripheralData(companyId, response.data);\r\n }\r\n setComplianceLoading(false);\r\n },\r\n [userId, loadPeripheralData]\r\n );\r\n\r\n const loadAssessmentCompliance = React.useCallback(\r\n async companyId => {\r\n setComplianceLoading(true);\r\n const response = await ComplianceController.getComplianceResults(companyId, userId, assessmentId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const newUserCompliance = { ...assessmentCompliance, [assessmentId]: response.data };\r\n setAssessmentCompliance(newUserCompliance);\r\n setComplianceLoading(false);\r\n window.history.replaceState({ ...window.history.state, newUserCompliance }, '');\r\n await loadPeripheralData(companyId, response.data);\r\n }\r\n setComplianceLoading(false);\r\n },\r\n [userId, assessmentId, loadPeripheralData]\r\n );\r\n\r\n // init from API & auth check\r\n React.useEffect(() => {\r\n if (lastQuery == queryStringValue) return;\r\n\r\n setLastQuery(queryStringValue);\r\n\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n\r\n async function init() {\r\n const { companyId } = Auth;\r\n switch (viewState) {\r\n case DashboardViewState.All:\r\n await loadAllCompliance(companyId);\r\n break;\r\n case DashboardViewState.Ship:\r\n await loadShipCompliance(companyId);\r\n break;\r\n case DashboardViewState.User:\r\n await loadUserCompliance(companyId);\r\n break;\r\n case DashboardViewState.Assessment:\r\n await loadAssessmentCompliance(companyId);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n init().then(() => {\r\n setUsersLoading(false);\r\n setUserGroupsLoading(false);\r\n setShipsLoading(false);\r\n setComplianceLoading(false);\r\n window.history.replaceState({ ...window.history.state, cacheComplete: true }, '');\r\n });\r\n }, [Auth, lastQuery, viewState, loadAllCompliance, loadShipCompliance, loadUserCompliance, loadAssessmentCompliance]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n setRedirectUrl(null);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n function getAssessmentAttempt() {\r\n try {\r\n return compliance.find(e => e.id === selectedAttempt);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function formatGraphValues(graphValues, replaceNullsWithZeroes = false) {\r\n const src = Object.values(graphValues)\r\n .reverse()\r\n .filter(e => moment.utc(e.date).isSameOrBefore(moment.utc().add(1, 'day')));\r\n\r\n const userGroups = [];\r\n\r\n for (let i = 0; i < src.length; i++) {\r\n for (let j = 0; j < src[i].userGroupeValues.length; j++) {\r\n const { key } = src[i].userGroupeValues[j];\r\n if (!userGroups.includes(key)) {\r\n userGroups.push(key);\r\n }\r\n }\r\n }\r\n\r\n const missingValue = replaceNullsWithZeroes ? 0 : null;\r\n\r\n const output = { base: src.map(e => (!isNullOrUndefined(e.value) ? Math.round(e.value) : missingValue)) };\r\n\r\n if (isUser) {\r\n return output;\r\n }\r\n\r\n for (let i = 0; i < userGroups.length; i++) {\r\n output[userGroups[i]] = src.map(e => {\r\n const value = e.userGroupeValues.find(u => u.key === userGroups[i])?.value ?? null;\r\n return !isNullOrUndefined(value) ? Math.round(value) : missingValue;\r\n });\r\n }\r\n\r\n return output;\r\n }\r\n\r\n function getTitle() {\r\n switch (viewState) {\r\n case DashboardViewState.All:\r\n return 'All Data';\r\n case DashboardViewState.Ship:\r\n return shipName;\r\n case DashboardViewState.User:\r\n return userName;\r\n case DashboardViewState.Assessment:\r\n return userName + ' - ' + assessmentName;\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n function buildPageTitle() {\r\n return Dashboard - {getTitle()};\r\n }\r\n\r\n function buildTopRow() {\r\n return (\r\n \r\n {buildTopRowCard(\r\n 'Worst Performing Questions (Mandatory Assessments)',\r\n !isEmpty(compliance)\r\n ? compliance.questionsWorst.map(e => ({\r\n name: e.title,\r\n data: `${e.incorrectlyAnswered} incorrect answers over ${e.totalAnswered} question${e.totalAnswered !== 1 ? 's' : ''}`,\r\n }))\r\n : [],\r\n [],\r\n () =>\r\n setRedirectUrl(\r\n `/OverviewQuestions?${!isNullOrUndefined(shipId) ? `shipId=${shipId}${!isNullOrUndefined(userId) ? '&' : ''}` : ''}${!isNullOrUndefined(userId) ? `userId=${userId}` : ''}`\r\n ),\r\n true\r\n )}\r\n {buildTopRowCard(\r\n 'Mandatory assessments - Worst & Best Performing',\r\n !isEmpty(compliance)\r\n ? compliance.assessmentWorst.map(e => ({\r\n name: e.title,\r\n data: `${scoreToPercentage(e.correctionPercentage, 1)}% correct over ${e.totalAnswered} assessment${e.totalAnswered !== 1 ? 's' : ''}`,\r\n }))\r\n : [],\r\n !isEmpty(compliance)\r\n ? compliance.assessmentBest.map(e => ({\r\n name: e.title,\r\n data: `${scoreToPercentage(e.correctionPercentage, 1)}% correct over ${e.totalAnswered} assessment${e.totalAnswered !== 1 ? 's' : ''}`,\r\n }))\r\n : [],\r\n isUser ? null : () => setRedirectUrl(`/OverviewAssessments?${!isNullOrUndefined(shipId) ? `shipId=${shipId}` : ''}`)\r\n )}\r\n {!isUser\r\n ? buildTopRowCard(\r\n 'Best Performing User Groups (Mandatory Assessments)',\r\n !isEmpty(compliance)\r\n ? compliance.userGroupsBest.map(e => ({\r\n name: userGroups.find(c => c.id === e.title)?.name ?? e.title,\r\n data: `${scoreToPercentage(e.correctionPercentage, 1)}% avg. score over ${e.totalAnswered} assessment${e.totalAnswered !== 1 ? 's' : ''}`,\r\n }))\r\n : [],\r\n [],\r\n () => setRedirectUrl(`/OverviewUserGroups?${!isNullOrUndefined(shipId) ? `shipId=${shipId}` : ''}`),\r\n true,\r\n true\r\n )\r\n : null}\r\n \r\n );\r\n }\r\n\r\n function buildTopRowCard(title, leftOrSingleData = [], rightData = [], onClick, singleColumn = false, trendingUp = false) {\r\n const renderItem = (item, index) => {\r\n return (\r\n
\r\n \r\n \r\n {item.name}\r\n \r\n \r\n \r\n {item.data}\r\n \r\n
\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {title.toUpperCase()}\r\n \r\n \r\n Hover over items for more info\r\n \r\n {complianceLoading ? : null}\r\n
\r\n
\r\n {singleColumn && trendingUp ? : }\r\n {leftOrSingleData.reverse().map(renderItem)}\r\n
\r\n {singleColumn ? null : (\r\n
\r\n \r\n {rightData.reverse().map(renderItem)}\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildGraphs() {\r\n if (isNullOrUndefined(compliance)) {\r\n return null;\r\n }\r\n\r\n let questionsLabels = [];\r\n let questionsSeries = [];\r\n let questionsLegend = [];\r\n let answersLabels = [];\r\n let answersSeries = [];\r\n let answersLegend = [];\r\n let scoreLabels = [];\r\n let scoreSeries = [];\r\n let scoreLegend = [];\r\n\r\n switch (viewState) {\r\n case DashboardViewState.All:\r\n case DashboardViewState.Ship:\r\n case DashboardViewState.User:\r\n if (!isNullOrUndefined(compliance.assessmentGraphData)) {\r\n const formatted = formatGraphValues(compliance.assessmentGraphData, true);\r\n questionsSeries = Object.values(formatted);\r\n questionsLabels = Object.values(compliance.assessmentGraphData)\r\n .reverse()\r\n .filter(e => moment.utc(e.date).isSameOrBefore(moment.utc()))\r\n .map(e => moment.utc(e.date).local().format('MM.YYYY'));\r\n questionsLegend = [\r\n getTitle(),\r\n ...Object.keys(formatted)\r\n .map(e => userGroups.find(u => u.id === e)?.name ?? 'Loading')\r\n .slice(1),\r\n ];\r\n }\r\n if (!isNullOrUndefined(compliance.scoresGraphData)) {\r\n const formatted = formatGraphValues(compliance.scoresGraphData);\r\n answersSeries = Object.values(formatted);\r\n answersLabels = Object.values(compliance.scoresGraphData)\r\n .reverse()\r\n .filter(e => moment.utc(e.date).isSameOrBefore(moment.utc()))\r\n .map(e => moment.utc(e.date).local().format('MM.YYYY'));\r\n answersLegend = [\r\n getTitle(),\r\n ...Object.keys(formatted)\r\n .map(e => userGroups.find(u => u.id === e)?.name ?? 'Loading')\r\n .slice(1),\r\n ];\r\n }\r\n break;\r\n case DashboardViewState.Assessment:\r\n if (!isNullOrUndefined(compliance.length)) {\r\n scoreSeries = [\r\n {\r\n name: 'series-0',\r\n data: compliance\r\n .map(e => ({\r\n meta: scoreToPercentage(e.totalScore, 1),\r\n x: moment.utc(e.taken).local().unix() * 60 * 60 * 24,\r\n y: scoreToPercentage(e.totalScore, 1),\r\n }))\r\n .reverse(),\r\n },\r\n ];\r\n scoreLabels = [];\r\n scoreLegend = [getTitle()];\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return (\r\n \r\n {!isAssessment ? (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n function buildList() {\r\n const getListTitle = () => {\r\n switch (viewState) {\r\n case DashboardViewState.All:\r\n return 'Ships';\r\n case DashboardViewState.Ship:\r\n return 'Crew Members';\r\n case DashboardViewState.User:\r\n return 'Assessment';\r\n case DashboardViewState.Assessment:\r\n return isNullOrUndefined(getAssessmentAttempt()) ? 'Assessment Date' : moment.utc(getAssessmentAttempt().taken).local().format('DD.MM.YYYY (HH:mm)');\r\n default:\r\n return 'Invalid State';\r\n }\r\n };\r\n return (\r\n \r\n \r\n \r\n {getListTitle()}\r\n \r\n {buildListTitleLoadingSpinner()}\r\n \r\n {buildListItems()}\r\n \r\n );\r\n }\r\n\r\n function buildListTitleLoadingSpinner() {\r\n switch (viewState) {\r\n case DashboardViewState.All:\r\n return shipsLoading ? : null;\r\n case DashboardViewState.Ship:\r\n return usersLoading ? : null;\r\n case DashboardViewState.Assessment:\r\n return complianceLoading ? : null;\r\n case DashboardViewState.User:\r\n return complianceLoading ? : null;\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n function buildListItems() {\r\n if (isEmpty(compliance)) {\r\n return ;\r\n }\r\n\r\n switch (viewState) {\r\n case DashboardViewState.All:\r\n if (!compliance.shipAverages && !ships) {\r\n return [];\r\n }\r\n if (ships.length > 0) {\r\n return Object.entries(compliance.shipAverages)\r\n .sort((a, b) => b[1] - a[1])\r\n .filter(e => ships.find(s => s.id === e[0]))\r\n .map((e, i) => {\r\n const ship = ships.find(s => s.id === e[0]);\r\n const shipItem = { name: ship.name, imgUrl: ship.logoPath, id: e[0], avgCorrectAnswers: e[1] };\r\n return buildImageItem(shipItem, i, true);\r\n });\r\n } else {\r\n return ;\r\n }\r\n case DashboardViewState.Ship:\r\n if (!isNullOrUndefined(compliance.userAverages) && !isNullOrUndefined(shipUsers) && shipUsers.length > 0) {\r\n return Object.entries(compliance.userAverages)\r\n .filter(e => !isNullOrUndefined(shipUsers.find(u => u.userName === e[0])))\r\n .sort((a, b) => b[1] - a[1])\r\n .map((e, i) => {\r\n const user = shipUsers.find(u => u.userName === e[0]);\r\n const userItem = { name: `${user?.firstName} ${user?.lastName}`, imgUrl: user.imageSrc, id: user.id, avgCorrectAnswers: e[1] };\r\n return buildImageItem(userItem, i, false);\r\n });\r\n } else {\r\n return ;\r\n }\r\n case DashboardViewState.User:\r\n if (!isNullOrUndefined(compliance.compianceResults)) {\r\n return Object.entries(compliance.compianceResults).map((e, i) => {\r\n const compliance = e[1];\r\n const hasResults = compliance.questionsAnswers > 0;\r\n const userItem = {\r\n name: compliance.title,\r\n questionsAnswers: compliance.questionsAnswers,\r\n correctAnswers: compliance.correctAnswers,\r\n averageScore: compliance.averageScore,\r\n id: compliance.compianceTestId,\r\n lastAttempt: hasResults ? compliance.lastAttempt : null,\r\n totalAttempts: hasResults ? compliance.attempts : 0,\r\n };\r\n return buildAssessmentItem(userItem, i);\r\n });\r\n } else {\r\n return ;\r\n }\r\n case DashboardViewState.Assessment:\r\n if (!isNullOrUndefined(compliance?.length) && !isNullOrUndefined(selectedAttempt)) {\r\n const attempt = getAssessmentAttempt();\r\n return (attempt?.questions ?? []).map(e =>\r\n buildQuestionItem({\r\n id: e.id,\r\n title: e.title,\r\n userAnswer: e.selectedAnswers[0]?.title ?? 'Question Skipped',\r\n correctAnswer: e.answers?.find(a => a.isCorrect)?.title ?? 'No Correct Answer Found',\r\n correct: e.answers?.find(a => a.id === e.selectedAnswers[0]?.id)?.isCorrect ?? false,\r\n skipped: e.selectedAnswers.length === 0,\r\n })\r\n );\r\n } else {\r\n return ;\r\n }\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n function buildImageItem(item, index, isShip) {\r\n const { name, avgCorrectAnswers, id, imgUrl } = item;\r\n\r\n const type = isShip ? 'ship' : 'user';\r\n const func = () => setRedirectUrl(`/?${type}Id=${id}&${type}Name=${name}`);\r\n return (\r\n \r\n
\r\n {name}\r\n
\r\n \r\n
\r\n {name}\r\n
\r\n
\r\n \r\n
\r\n {(avgCorrectAnswers * 100).toFixed(2)}%\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildAssessmentItem(assessment, index) {\r\n const { name, averageScore, lastAttempt, totalAttempts, id } = assessment;\r\n\r\n return (\r\n \r\n
setRedirectUrl(`/?userId=${userId}&userName=${userName}&assessmentId=${id}&assessmentName=${name}`)}>\r\n
\r\n \r\n
\r\n {name}\r\n
\r\n
\r\n \r\n
\r\n {(averageScore * 100).toFixed(2)}%\r\n
\r\n
\r\n \r\n
\r\n {lastAttempt ? moment.utc(lastAttempt).local().format('DD.MM.YYYY') : 'N/A'}\r\n
\r\n
\r\n \r\n
\r\n {totalAttempts}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildQuestionItem(question) {\r\n const { id, title, userAnswer, correctAnswer, correct, skipped } = question;\r\n\r\n return (\r\n \r\n \r\n
{!correct ? : }
\r\n \r\n \r\n \r\n \r\n {title}\r\n \r\n
\r\n \r\n {!skipped ? (\r\n <>\r\n User Answer:\r\n
\r\n \r\n ) : null}\r\n {userAnswer}\r\n
\r\n {!correct ? (\r\n <>\r\n
\r\n \r\n Correct Answer:\r\n
\r\n {correctAnswer}\r\n
\r\n \r\n ) : null}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildAssessmentAttempts() {\r\n if (isNullOrUndefined(compliance.length)) {\r\n return null;\r\n }\r\n const mappedAttempts = compliance.map(e => ({\r\n date: e.taken,\r\n score: `${scoreToPercentage(e.totalScore, 1)}%`,\r\n id: e.id,\r\n }));\r\n return (\r\n \r\n \r\n \r\n Assessment Attempts\r\n \r\n \r\n {mappedAttempts.map((e, i) => {\r\n const { date, score, id } = e;\r\n return (\r\n \r\n setSelectedAttempt(id)}>\r\n \r\n {moment.utc(date).local().format('DD.MM.YYYY (HH:mm)')}\r\n \r\n Score: {score}\r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n {buildPageTitle()}\r\n \r\n \r\n \r\n \r\n {!isAssessment ? (\r\n \r\n {buildTopRow()}\r\n \r\n ) : null}\r\n \r\n {buildGraphs()}\r\n \r\n {isAssessment ? (\r\n \r\n {buildAssessmentAttempts()}\r\n \r\n ) : null}\r\n \r\n {buildList()}\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n DashboardStore: state.Dashboard,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n setCompanyCompliance: items => dispatch(setCompanyCompliance(items)),\r\n setShipCompliance: items => dispatch(setShipCompliance(items)),\r\n setUserCompliance: items => dispatch(setUserCompliance(items)),\r\n setAssessmentCompliance: items => dispatch(setAssessmentCompliance(items)),\r\n setShipUsers: items => dispatch(setShipUsers(items)),\r\n setUserGroups: items => dispatch(setUserGroups(items)),\r\n setShips: items => dispatch(setShips(items)),\r\n clearStore: () => dispatch(clearStore()),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Dashboard);\r\n\r\nDashboard.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n DashboardStore: PropTypes.object,\r\n location: PropTypes.object,\r\n setCompanyCompliance: PropTypes.func,\r\n setShipCompliance: PropTypes.func,\r\n setUserCompliance: PropTypes.func,\r\n setAssessmentCompliance: PropTypes.func,\r\n setShipUsers: PropTypes.func,\r\n setUserGroups: PropTypes.func,\r\n setShips: PropTypes.func,\r\n clearStore: PropTypes.func,\r\n};\r\n","export const setCompanyCompliance = items => ({\r\n type: 'SET_COMPANY_COMPLIANCE',\r\n items,\r\n});\r\n\r\nexport const setShipCompliance = items => ({\r\n type: 'SET_SHIP_COMPLIANCE',\r\n items,\r\n});\r\n\r\nexport const setUserCompliance = items => ({\r\n type: 'SET_USER_COMPLIANCE',\r\n items,\r\n});\r\n\r\nexport const setAssessmentCompliance = items => ({\r\n type: 'SET_ASSESSMENT_COMPLIANCE',\r\n items,\r\n});\r\n\r\nexport const setShips = items => ({\r\n type: 'SET_SHIPS',\r\n items,\r\n});\r\n\r\nexport const setShipUsers = items => ({\r\n type: 'SET_SHIP_USERS',\r\n items,\r\n});\r\n\r\nexport const setUserGroups = items => ({\r\n type: 'SET_USER_GROUPS',\r\n items,\r\n});\r\n\r\nexport const clearStore = () => ({\r\n type: 'INITIALISE_STORE',\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, Card, CardContent, Typography, IconButton, Popover } from '@material-ui/core';\r\nimport { MoreVert } from '@material-ui/icons';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n height: 56,\r\n },\r\n content: {\r\n position: 'relative',\r\n height: '100%',\r\n padding: 0 + ' !important',\r\n '& .MuiTypography-root': {\r\n padding: 12,\r\n width: 'calc(100% - 48px)',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n position: 'absolute',\r\n },\r\n },\r\n popover: {\r\n '& .MuiPopover-paper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n '& .MuiButton-root': {\r\n textTransform: 'none',\r\n minWidth: 120,\r\n },\r\n '& .MuiButton-label': {\r\n justifyContent: 'flex-start',\r\n fontWeight: 400,\r\n },\r\n },\r\n iconBtn: {\r\n position: 'absolute',\r\n right: 0,\r\n top: 4,\r\n },\r\n}));\r\n\r\nexport function SearchCardMini(props) {\r\n const { title, children } = props;\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const classes = useStyles();\r\n\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n const id = open ? 'search-item-popover' : undefined;\r\n\r\n return (\r\n <>\r\n \r\n \r\n {title ?? 'NONAME'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n}\r\n\r\nSearchCardMini.propTypes = {\r\n title: PropTypes.string,\r\n children: PropTypes.any,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button, FormControlLabel, Checkbox } from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\n\r\nexport default function UsersGroupsAddEdit(props) {\r\n const { userGroup, open, onClose, onError, onDone, companyId } = props;\r\n const [name, setName] = React.useState('');\r\n const [scored, setScored] = React.useState(true);\r\n\r\n const userGroupExists = () => !isNullOrUndefined(userGroup?.id);\r\n\r\n // update fields with current user group info\r\n React.useEffect(() => {\r\n setName(userGroup?.name ?? '');\r\n setScored(userGroup?.scored ?? true);\r\n }, [userGroup]);\r\n\r\n async function handleSave(event) {\r\n event.preventDefault();\r\n onError(null);\r\n const response = userGroupExists() ? await UserGroupController.editUserGroup(companyId, userGroup.id, name, scored) : await UserGroupController.addUserGroup(companyId, name, scored);\r\n if (response.hasError) {\r\n onError(response.data);\r\n } else {\r\n onDone(response.data);\r\n }\r\n onClose();\r\n }\r\n\r\n function handleInput(event) {\r\n const { name, value, checked } = event.target;\r\n\r\n switch (name) {\r\n case 'name':\r\n setName(value);\r\n break;\r\n case 'scored':\r\n setScored(checked);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n Add/Edit User Group\r\n \r\n \r\n \r\n \r\n \r\n \r\n } label=\"Results scored?\" />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nUsersGroupsAddEdit.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onError: PropTypes.func.isRequired,\r\n onDone: PropTypes.func.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n userGroup: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Add } from '@material-ui/icons';\r\nimport { makeStyles, Grid, Button, TextField, Dialog, DialogContent, DialogActions, DialogTitle } from '@material-ui/core';\r\nimport { SearchCardMini } from '../../components/Common/SearchCardMini';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport UsersGroupsAddEdit from './UsersGroupsAddEdit';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n },\r\n topArea: {\r\n paddingBottom: 8,\r\n '& .MuiButtonBase-root': {\r\n height: '100%',\r\n },\r\n },\r\n}));\r\n\r\nfunction UsersGroups(props) {\r\n const { Auth, PushHistory } = props;\r\n const [userGroups, setUserGroups] = React.useState([]);\r\n const [nameSearch, setNameSearch] = React.useState('');\r\n const [deleteRef, setDeleteRef] = React.useState(null);\r\n const [addEditRef, setAddEditRef] = React.useState(null);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const classes = useStyles();\r\n\r\n const loadUserGroups = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await UserGroupController.getUserGroups(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(response.data);\r\n }\r\n setLoading(false);\r\n }, [Auth]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch user groups for inital render\r\n async function init() {\r\n await loadUserGroups();\r\n }\r\n init();\r\n }, [Auth, loadUserGroups]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n function handleUpdateUserGroups(userGroup) {\r\n const { id } = userGroup;\r\n const exists = !isNullOrUndefined(userGroups.filter(e => e.id === id)[0]);\r\n if (exists) {\r\n setUserGroups(userGroups.map(e => (e.id === id ? userGroup : e)));\r\n } else {\r\n setUserGroups([...userGroups, userGroup]);\r\n }\r\n }\r\n\r\n async function handleDeleteUserGroup() {\r\n setLoading(true);\r\n setWarning(null);\r\n const { id } = deleteRef;\r\n const response = await UserGroupController.deleteUserGroup(Auth.companyId, id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(userGroups.filter(e => e.id !== id));\r\n }\r\n setDeleteRef(null);\r\n setLoading(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setNameSearch(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function buildTopArea() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildUserGroup(userGroup) {\r\n const { id, name } = userGroup;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildUsers() {\r\n if (isNullOrUndefined(userGroups)) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {userGroups.filter(e => e.name.includes(nameSearch)).map(buildUserGroup)}\r\n \r\n );\r\n }\r\n\r\n function buildConfirmDelete() {\r\n return (\r\n setDeleteRef(null)}>\r\n Delete User Group\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n {buildTopArea()}\r\n {buildUsers()}\r\n {buildConfirmDelete()}\r\n setAddEditRef(null)}\r\n onError={setWarning}\r\n onDone={handleUpdateUserGroups}\r\n userGroup={addEditRef}\r\n companyId={Auth.companyId}\r\n />\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(UsersGroups);\r\n\r\nUsersGroups.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport NoImage from '../../images/no-img.png';\r\nimport PropTypes from 'prop-types';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button, FormControl, InputLabel, FilledInput } from '@material-ui/core';\r\nimport { clearUploadUrls, getUploadUrls, readUploadUrls } from '../../helpers/UploadReader';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { ItemImage } from '../../components/Common/ItemImage';\r\n\r\nexport function FleetAddEdit(props) {\r\n const { ship, open, onClose, onError, onDone, companyId } = props;\r\n const [name, setName] = React.useState('');\r\n const [imo, setImo] = React.useState('');\r\n const [portOfRegistry, setPortOfRegistry] = React.useState('');\r\n const [image, setImage] = React.useState('');\r\n const [removeImage, setRemoveImage] = React.useState(false);\r\n const [, updateState] = React.useState();\r\n\r\n const forceUpdate = React.useCallback(() => {\r\n updateState({});\r\n }, []);\r\n\r\n const shipExists = () => !isNullOrUndefined(ship?.id);\r\n\r\n // update fields with current ship info\r\n React.useEffect(() => {\r\n setName(ship?.name ?? '');\r\n setImo(ship?.imo ?? '');\r\n setPortOfRegistry(ship?.portOfRegistry ?? '');\r\n setImage(ship?.logoPath ?? '');\r\n }, [ship]);\r\n\r\n function getImage() {\r\n return getUploadUrls()[0] ?? (image === '' ? NoImage : image);\r\n }\r\n\r\n async function handleSave(event) {\r\n event.preventDefault();\r\n onError(null);\r\n const response = !shipExists()\r\n ? await ShipController.addShip(companyId, name, imo, portOfRegistry, image)\r\n : await ShipController.updateShip(companyId, ship.id, name, imo, portOfRegistry, removeImage, image);\r\n if (response.hasError) {\r\n onError(response.data);\r\n } else {\r\n onDone(response.data);\r\n }\r\n onClose();\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name, files } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setName(value);\r\n break;\r\n case 'imo':\r\n setImo(value);\r\n break;\r\n case 'portOfRegistry':\r\n setPortOfRegistry(value);\r\n break;\r\n case 'image':\r\n clearUploadUrls();\r\n if (!isNullOrUndefined(files[0])) {\r\n setImage(files[0]);\r\n setRemoveImage(false);\r\n readUploadUrls([files[0]], forceUpdate);\r\n } else {\r\n setImage('');\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function handleClearImage() {\r\n clearUploadUrls();\r\n setImage('');\r\n setRemoveImage(true);\r\n }\r\n\r\n return (\r\n \r\n
\r\n Add/Edit Ship\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Image\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nFleetAddEdit.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onError: PropTypes.func.isRequired,\r\n onDone: PropTypes.func.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n ship: PropTypes.object,\r\n};\r\n","export const setShips = items => ({\r\n type: 'SET_SHIPS',\r\n items,\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport queryString from 'query-string';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Add } from '@material-ui/icons';\r\nimport { makeStyles, Grid, Button, TextField, Dialog, DialogContent, DialogActions, DialogTitle, Typography, CircularProgress } from '@material-ui/core';\r\nimport { isEmpty, isNullOrUndefined, updateQueryString } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { SearchCard } from '../../components/Common/SearchCard';\r\nimport { FleetAddEdit } from './FleetAddEdit';\r\nimport { clearUploadUrls } from '../../helpers/UploadReader';\r\nimport { CompanyRole, ShipRole } from '../../helpers/Constants';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport { Skeleton } from '../../components/Common/Skeleton';\r\nimport { setShips } from '../../stores/Actions/Fleet';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n\r\n '& .skeleton': {\r\n margin: 0,\r\n },\r\n\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n },\r\n topArea: {\r\n paddingBottom: 8,\r\n '& .MuiButtonBase-root': {\r\n height: '100%',\r\n },\r\n },\r\n}));\r\n\r\nfunction Fleet(props) {\r\n const { Auth, PushHistory, FleetStore, setShips } = props;\r\n const { ships } = FleetStore;\r\n\r\n const { name: nameQuery } = queryString.parse(window.location.search);\r\n const [nameSearch, setNameSearch] = React.useState(nameQuery ?? '');\r\n const [deleteRef, setDeleteRef] = React.useState(null);\r\n const [addEditRef, setAddEditRef] = React.useState(null);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const classes = useStyles();\r\n\r\n const userIsCaptain = Auth.shipRoles.includes(ShipRole.Captain) && Auth.companyRole !== CompanyRole.Owner;\r\n\r\n const loadShips = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await ShipController.getShips(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const prevShips = ships;\r\n\r\n response.data = response.data.map(e => {\r\n const prevShip = prevShips.find(el => el.id === e.id);\r\n\r\n if (prevShip) {\r\n const { logoPath } = prevShip;\r\n if (Object.keys(prevShip).includes('logoPath')) {\r\n return { ...e, logoPath };\r\n }\r\n }\r\n return e;\r\n });\r\n\r\n setShips(response.data);\r\n\r\n for (let i = 0; i < response.data.length; i++) {\r\n const imgResponse = await ShipController.getShipLogo(Auth.companyId, response.data[i].id);\r\n if (imgResponse.hasError) {\r\n continue;\r\n }\r\n response.data[i].logoPath = imgResponse.data;\r\n }\r\n setShips(response.data);\r\n }\r\n setLoading(false);\r\n }, [Auth]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch ships for initial render\r\n async function init() {\r\n await loadShips();\r\n }\r\n init();\r\n }, [Auth, loadShips]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n function generateQueryString(name) {\r\n let output = '';\r\n if (name.trim().length > 0) {\r\n output += `name=${name}`;\r\n }\r\n return output;\r\n }\r\n\r\n async function handleUpdateShip(ship) {\r\n const { id } = ship;\r\n const imgResponse = await ShipController.getShipLogo(Auth.companyId, id);\r\n if (!imgResponse.hasError) {\r\n ship.logoPath = imgResponse.data;\r\n }\r\n\r\n const exists = ships.some(e => e.id === id);\r\n if (exists) {\r\n setShips(ships.map(e => (e.id === id ? ship : e)));\r\n } else {\r\n setShips([...ships, ship]);\r\n }\r\n }\r\n\r\n async function handleDeleteShip() {\r\n setLoading(true);\r\n setWarning(null);\r\n const { id } = deleteRef;\r\n const response = await ShipController.deleteShip(Auth.companyId, id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setShips(ships.filter(e => e.id !== id));\r\n }\r\n setDeleteRef(null);\r\n setLoading(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setNameSearch(value);\r\n updateQueryString(generateQueryString(value));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function buildTopArea() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {loading ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildShip(ship) {\r\n const { id, name, created, logoPath } = ship;\r\n return (\r\n \r\n 0}\r\n image={logoPath}\r\n description={\r\n <>\r\n Created {moment.utc(created).local().format('DD.MM.YYYY')}\r\n \r\n }\r\n >\r\n {!userIsCaptain ? : null}\r\n {!userIsCaptain ? : null}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildShips() {\r\n if (isEmpty(ships) || isNullOrUndefined(ships)) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {ships.filter(e => e.name.toLowerCase().includes(nameSearch.toLowerCase())).map(buildShip)}\r\n \r\n );\r\n }\r\n\r\n function buildConfirmDelete() {\r\n return (\r\n setDeleteRef(null)}>\r\n Delete Ship\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n {buildTopArea()}\r\n {buildShips()}\r\n {buildConfirmDelete()}\r\n {\r\n setAddEditRef(null);\r\n clearUploadUrls();\r\n }}\r\n onError={setWarning}\r\n onDone={handleUpdateShip}\r\n ship={addEditRef}\r\n companyId={Auth.companyId}\r\n />\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n FleetStore: state.Fleet,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n setShips: items => dispatch(setShips(items)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Fleet);\r\n\r\nFleet.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n FleetStore: PropTypes.object,\r\n setShips: PropTypes.func,\r\n};\r\n","// import 'date-fns';\r\nimport React from 'react';\r\nimport NoImage from '../../images/no-img.png';\r\nimport PropTypes from 'prop-types';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport { KeyboardDatePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button, FormControl, InputLabel, FilledInput } from '@material-ui/core';\r\nimport { clearUploadUrls, getUploadUrls, readUploadUrls } from '../../helpers/UploadReader';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { ItemImage } from '../../components/Common/ItemImage';\r\nimport MomentUtils from '@date-io/moment';\r\nimport moment from 'moment';\r\n\r\nexport function CompanyAddEdit(props) {\r\n const { company, open, onClose, onError, onDone, companyId } = props;\r\n const [scoreFrom, setScoreFrom] = React.useState(null);\r\n const [inputValue, setInputValue] = React.useState(null);\r\n\r\n const [name, setName] = React.useState('');\r\n const [image, setImage] = React.useState('');\r\n const [, updateState] = React.useState();\r\n const isEditing = Object.keys(company ?? {}).length !== 0;\r\n\r\n const forceUpdate = React.useCallback(() => {\r\n updateState({});\r\n }, []);\r\n\r\n // update fields with current company info\r\n React.useEffect(() => {\r\n setName(company?.name ?? '');\r\n setImage(company?.logoPath ?? '');\r\n setScoreFrom(company?.scoreFrom);\r\n }, [company]);\r\n\r\n function getImage() {\r\n return getUploadUrls()[0] ?? (image === '' ? NoImage : image);\r\n }\r\n\r\n async function handleSave(event) {\r\n event.preventDefault();\r\n onError(null);\r\n const response = isNullOrUndefined(company?.id)\r\n ? await CompanyController.addCompany(companyId, name, image)\r\n : await CompanyController.updateCompany(company.id, name, image, moment(scoreFrom).toISOString());\r\n if (response.hasError) {\r\n onError(response.data);\r\n } else {\r\n onDone(response.data);\r\n }\r\n onClose();\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name, files } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setName(value);\r\n break;\r\n case 'image':\r\n clearUploadUrls();\r\n if (!isNullOrUndefined(files[0])) {\r\n setImage(files[0]);\r\n readUploadUrls([files[0]], forceUpdate);\r\n } else {\r\n setImage('');\r\n }\r\n break;\r\n case 'scoreFrom':\r\n setScoreFrom(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const onDateChange = (date, value) => {\r\n setScoreFrom(date);\r\n setInputValue(value);\r\n };\r\n\r\n function handleClearImage() {\r\n clearUploadUrls();\r\n setImage('');\r\n }\r\n\r\n return (\r\n \r\n
\r\n Add/Edit Company\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Image\r\n \r\n \r\n \r\n {isEditing ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nCompanyAddEdit.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onError: PropTypes.func.isRequired,\r\n onDone: PropTypes.func.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n company: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { LogIn } from '../../stores/Actions/Authentication';\r\nimport { Add } from '@material-ui/icons';\r\nimport { makeStyles, Grid, Button, TextField } from '@material-ui/core';\r\nimport { isNullOrUndefined, updateQueryString } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { SearchCard } from '../../components/Common/SearchCard';\r\nimport { CompanyAddEdit } from './CompanyAddEdit';\r\nimport { clearUploadUrls } from '../../helpers/UploadReader';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport { updateCompanyId } from '../../controllers/UserController';\r\nimport { clearStore } from '../../stores/Actions/Dashboard';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n },\r\n topArea: {\r\n paddingBottom: 8,\r\n '& .MuiButtonBase-root': {\r\n height: '100%',\r\n },\r\n },\r\n}));\r\n\r\nfunction Company(props) {\r\n const { Auth, PushHistory, LogIn, clearStore } = props;\r\n const { name: nameQuery } = queryString.parse(window.location.search);\r\n const [companies, setCompanies] = React.useState([]);\r\n const [nameSearch, setNameSearch] = React.useState(nameQuery ?? '');\r\n // const [deleteRef, setDeleteRef] = React.useState(null);\r\n const [addEditRef, setAddEditRef] = React.useState(null);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const classes = useStyles();\r\n\r\n const loadCompanies = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await CompanyController.getCompanies(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n for (let i = 0; i < response.data.length; i++) {\r\n const imgResponse = await CompanyController.getCompanyLogo(response.data[i].id);\r\n if (imgResponse.hasError) {\r\n continue;\r\n }\r\n response.data[i].logoPath = imgResponse.data;\r\n }\r\n setCompanies(response.data);\r\n }\r\n setLoading(false);\r\n }, [Auth]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch companies for inital render\r\n async function init() {\r\n await loadCompanies();\r\n }\r\n init();\r\n }, [Auth, loadCompanies]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n function generateQueryString(name) {\r\n let output = '';\r\n if (name.trim().length > 0) {\r\n output += `name=${name}`;\r\n }\r\n return output;\r\n }\r\n\r\n async function handleUpdateCompany(company) {\r\n const { id } = company;\r\n const imgResponse = await CompanyController.getCompanyLogo(id);\r\n if (!imgResponse.hasError) {\r\n company.logoPath = imgResponse.data;\r\n }\r\n\r\n const exists = companies.some(e => e.id === id);\r\n if (exists) {\r\n setCompanies(companies.map(e => (e.id === id ? company : e)));\r\n } else {\r\n setCompanies([...companies, company]);\r\n }\r\n }\r\n\r\n async function handleCompanySwitch(company) {\r\n setLoading(true);\r\n const { id } = company;\r\n const switchResponse = await CompanyController.switchCompany(id);\r\n if (switchResponse.hasError) {\r\n setWarning(switchResponse.data);\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n await updateCompanyId(id);\r\n\r\n clearStore();\r\n\r\n LogIn({ ...Auth, companyId: id });\r\n }\r\n\r\n async function handleViewCompanyResults(company) {\r\n await handleCompanySwitch(company);\r\n setRedirectUrl(`/`);\r\n }\r\n\r\n // async function handleDeleteCompany() {\r\n // setLoading(true);\r\n // setWarning(null);\r\n // const { id } = deleteRef;\r\n // const response = await CompanyController.deleteCompany(Auth.companyId, id);\r\n // if (response.hasError) {\r\n // setWarning(response.data);\r\n // } else {\r\n // setCompanies(companies.filter(e => e.id !== id));\r\n // }\r\n // setDeleteRef(null);\r\n // setLoading(false);\r\n // }\r\n\r\n function handleInput(event) {\r\n const { value, name } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setNameSearch(value);\r\n updateQueryString(generateQueryString(value));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function buildTopArea() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildCompany(company) {\r\n const { id, name, logoPath } = company;\r\n return (\r\n \r\n 0} image={logoPath}>\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildCompanies() {\r\n if (isNullOrUndefined(companies)) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {companies.filter(e => e.name.toLowerCase().includes(nameSearch.toLowerCase())).map(buildCompany)}\r\n \r\n );\r\n }\r\n\r\n // function buildConfirmDelete() {\r\n // return setDeleteRef(null)}>\r\n // Delete Company\r\n // Are you sure you want to perform this action?\r\n // \r\n // \r\n // \r\n // \r\n // ;\r\n // }\r\n\r\n return (\r\n
\r\n \r\n {buildTopArea()}\r\n {buildCompanies()}\r\n {/* {buildConfirmDelete()} */}\r\n {\r\n setAddEditRef(null);\r\n clearUploadUrls();\r\n }}\r\n onError={setWarning}\r\n onDone={handleUpdateCompany}\r\n company={addEditRef}\r\n companyId={Auth.companyId}\r\n />\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n LogIn: data => dispatch(LogIn(data)),\r\n clearStore: () => dispatch(clearStore()),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Company);\r\n\r\nCompany.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n LogIn: PropTypes.func,\r\n clearStore: PropTypes.func,\r\n};\r\n","import Axios from 'axios';\r\nimport UserController from './UserController';\r\nimport { APIRoute, APIPath } from '../helpers/Constants';\r\nimport { flattenFormContent, generateResponse } from '../helpers/Utils';\r\n\r\nconst QuestionController = {\r\n getCategories,\r\n addCategories,\r\n editCategories,\r\n removeCategories,\r\n addCategory,\r\n getQuestions,\r\n getAllQuestions,\r\n getQuestion,\r\n addQuestion,\r\n editQuestion,\r\n archiveQuestion,\r\n deleteQuestion,\r\n importFromExcel,\r\n};\r\n\r\nasync function getCategories(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_QUESTION_CATEGORIES(companyId), userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addCategories(companyId, name) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.ADD_QUESTION_CATEGORIES(companyId), { name }, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editCategories(companyId, id, name) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.EDIT_QUESTION_CATEGORIES(companyId), { id, name }, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function removeCategories(companyId, id) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.REMOVE_QUESTION_CATEGORIES(companyId, id), null, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addCategory(companyId, name) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n const categoryModel = { name };\r\n return Axios.post(APIRoute + APIPath.ADD_QUESTION_CATEGORY(companyId), categoryModel, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getQuestions(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_COMPANY_QUESTIONS(companyId), userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getAllQuestions(companyId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_ALL_QUESTIONS(companyId), userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function getQuestion(companyId, questionId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.get(APIRoute + APIPath.GET_QUESTION(companyId, questionId), userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function addQuestion(companyId, title, description, type, frequency, serverity, answers, questionAnswerImages, questionCatagoryIds, documentationItems, shipIds, allowNFC) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('Title', title);\r\n formData.append('Description', description);\r\n formData.append('Type', type);\r\n formData.append('Frequency', frequency);\r\n formData.append('Severity', serverity);\r\n formData.append('AllowNFC', allowNFC);\r\n questionAnswerImages.forEach((e, index) => {\r\n formData.append(`QuestionAnswerImages`, e, index);\r\n });\r\n questionCatagoryIds.forEach((e, index) => {\r\n formData.append(`QuestionCatagoryIds[${index}]`, e);\r\n });\r\n answers.forEach((e, index) => {\r\n flattenFormContent('Answers', formData, e, index);\r\n });\r\n documentationItems.forEach((e, index) => {\r\n flattenFormContent('DocumentationItems', formData, e, index);\r\n });\r\n shipIds.forEach((e, index) => {\r\n formData.append(`ShipIds[${index}]`, e);\r\n });\r\n return Axios.post(APIRoute + APIPath.ADD_QUESTION(companyId), formData, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function editQuestion(id, companyId, title, description, frequency, serverity, answers, questionAnswerImages, questionCatagoryIds, documentationItems, shipIds, allowNFC) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('Id', id);\r\n formData.append('Title', title);\r\n formData.append('Description', description);\r\n formData.append('Frequency', frequency);\r\n formData.append('Severity', serverity);\r\n formData.append('AllowNFC', allowNFC);\r\n questionAnswerImages.forEach((e, index) => {\r\n formData.append(`QuestionAnswerImages`, e, index);\r\n });\r\n questionCatagoryIds.forEach((e, index) => {\r\n formData.append(`QuestionCatagoryIds[${index}]`, e);\r\n });\r\n answers.forEach((e, index) => {\r\n flattenFormContent('Answers', formData, e, index);\r\n });\r\n documentationItems.forEach((e, index) => {\r\n flattenFormContent('DocumentationItems', formData, e, index);\r\n });\r\n shipIds.forEach((e, index) => {\r\n formData.append(`ShipIds[${index}]`, e);\r\n });\r\n return Axios.post(APIRoute + APIPath.EDIT_QUESTION(companyId), formData, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function archiveQuestion(companyId, questionId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.ARCHIVE_QUESTION(companyId, questionId), null, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function deleteQuestion(companyId, questionId) {\r\n const userHeaders = await UserController.getUserHeaders();\r\n return Axios.post(APIRoute + APIPath.DELETE_QUESTION(companyId, questionId), null, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nasync function importFromExcel(companyId, file, shipIds) {\r\n const userHeaders = await UserController.getUserHeaders('multipart/form-data');\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n shipIds.forEach((e, index) => {\r\n formData.append(`ShipIds[${index}]`, e);\r\n });\r\n return Axios.post(APIRoute + APIPath.IMPORT_FROM_EXCEL(companyId), formData, userHeaders)\r\n .then(async response => {\r\n return generateResponse(false, response.data, response);\r\n })\r\n .catch(reason => {\r\n return generateResponse(true, reason);\r\n });\r\n}\r\n\r\nexport default QuestionController;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport QuestionController from '../../controllers/QuestionController';\r\nimport {\r\n Grid,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n DialogActions,\r\n Button,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n Slider,\r\n makeStyles,\r\n IconButton,\r\n Chip,\r\n CircularProgress,\r\n FormControlLabel,\r\n Checkbox,\r\n FilledInput,\r\n Avatar,\r\n} from '@material-ui/core';\r\nimport { DarkMenuItem } from '../../components/Common/DarkMenuItem';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { Add, Clear, Delete, Done, Remove } from '@material-ui/icons';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Autocomplete } from '@material-ui/lab';\r\nimport { Documents } from '../Documents/Documents';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n slider: {\r\n paddingTop: 30,\r\n },\r\n answerRow: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n '& .answer': {\r\n flexGrow: 1,\r\n },\r\n '& .toggle-correct': {\r\n backgroundColor: Colours.red,\r\n color: Colours.white,\r\n marginLeft: 16,\r\n '&.active': {\r\n backgroundColor: Colours.green,\r\n },\r\n '&:hover': {\r\n backgroundColor: Colours.darkRed,\r\n '&.active': {\r\n backgroundColor: Colours.darkGreen,\r\n },\r\n },\r\n },\r\n },\r\n addRemoveWrapper: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n },\r\n selectArea: {\r\n '& .MuiInputBase-root': {\r\n paddingTop: 23,\r\n paddingBottom: 4,\r\n },\r\n },\r\n chip: {\r\n marginRight: 2,\r\n marginBottom: 2,\r\n },\r\n loading: {\r\n maxHeight: '60vh',\r\n height: 512,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n questionsContainer: {\r\n position: 'relative',\r\n },\r\n imageAnswer: {\r\n backgroundSize: 'cover',\r\n backgroundPosition: 'center',\r\n },\r\n imageAnswerWrapper: {\r\n width: '100%',\r\n },\r\n}));\r\n\r\nconst defaultAnswer = isCorrect => ({\r\n title: '',\r\n description: '',\r\n imageUrl: '',\r\n isCorrect,\r\n});\r\n\r\nexport function ComplianceAddEditQuestion(props) {\r\n const { question, open, onClose, onDone, companyId, categoriesArray, shipsArray } = props;\r\n const [categoryOptions, setCategoryOptions] = React.useState([]);\r\n const [questionCategories, setQuestionCategories] = React.useState([]);\r\n const [selectedShips, setSelectedShips] = React.useState([]);\r\n const [selectedDocs, setSelectedDocs] = React.useState([]);\r\n const [content, setContent] = React.useState('');\r\n const [questionNote, setQuestionNote] = React.useState('');\r\n const [severity, setSeverity] = React.useState(50);\r\n const [startSeverity, setStartSeverity] = React.useState(50);\r\n const [frequency, setFrequency] = React.useState(100);\r\n const [startFrequency, setStartFrequency] = React.useState(100);\r\n const [answers, setAnswers] = React.useState([defaultAnswer(false), defaultAnswer(true)]);\r\n const [answerImages, setAnswerImages] = React.useState([]);\r\n const [allowNFC, setAllowNFC] = React.useState(false);\r\n const [showPickDocument, setShowPickDocument] = React.useState(false);\r\n const [showAddCategory, setShowAddCategory] = React.useState(false);\r\n const [categoryName, setCategoryName] = React.useState('');\r\n const [selectPageId, setSelectPageId] = React.useState(null);\r\n const [pageNumber, setPageNumber] = React.useState(0);\r\n const [warning, setWarning] = React.useState(null);\r\n const [saving, setSaving] = React.useState(false);\r\n const [loading, setLoading] = React.useState(false);\r\n const classes = useStyles();\r\n\r\n const questionExists = () => !isNullOrUndefined(question?.id);\r\n\r\n const loadQuestion = React.useCallback(async () => {\r\n if (question?.id !== null && question?.id !== undefined) {\r\n const response = await QuestionController.getQuestion(companyId, question.id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const { title, frequency, serverity, answers, category, documentItems, ships, allowNFC, description } = response.data;\r\n const categoryIds = category.map(e => e.id);\r\n setContent(title);\r\n setSelectedDocs(documentItems);\r\n setQuestionCategories(categoriesArray.filter(e => categoryIds.includes(e.id)));\r\n setSelectedShips(ships.map(e => e.id));\r\n setCategoryOptions(categoriesArray);\r\n setQuestionNote(description);\r\n setSeverity(serverity);\r\n setStartSeverity(serverity);\r\n setFrequency(frequency);\r\n setStartFrequency(frequency);\r\n setAnswers(answers);\r\n setAllowNFC(allowNFC);\r\n }\r\n } else {\r\n setContent('');\r\n setSelectedDocs([]);\r\n setQuestionCategories([]);\r\n setSelectedShips([]);\r\n setSeverity(50);\r\n setStartSeverity(50);\r\n setFrequency(100);\r\n setStartFrequency(100);\r\n setCategoryOptions(categoriesArray);\r\n setAnswers([defaultAnswer(false), defaultAnswer(true)]);\r\n setAllowNFC(false);\r\n }\r\n setAnswerImages([]);\r\n }, [categoriesArray, question, companyId]);\r\n\r\n // update fields with current question info\r\n React.useEffect(() => {\r\n async function init() {\r\n if (open) {\r\n await loadQuestion();\r\n }\r\n }\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }, [open, loadQuestion]);\r\n\r\n // update selected page number\r\n React.useEffect(() => {\r\n if (isNullOrUndefined(selectPageId)) {\r\n setPageNumber(0);\r\n } else {\r\n setPageNumber(selectedDocs.find(e => e.id === selectPageId).pageNum);\r\n }\r\n }, [selectPageId, selectedDocs]);\r\n\r\n async function handleSave(event) {\r\n event.preventDefault();\r\n setSaving(true);\r\n\r\n const response = questionExists()\r\n ? await QuestionController.editQuestion(\r\n question.id,\r\n companyId,\r\n content,\r\n questionNote,\r\n frequency,\r\n severity,\r\n answers,\r\n answerImages,\r\n questionCategories.map(e => e.id),\r\n selectedDocs.map(e => ({ documentId: e.id, pageNum: e.pageNum })),\r\n selectedShips,\r\n allowNFC\r\n )\r\n : await QuestionController.addQuestion(\r\n companyId,\r\n content,\r\n questionNote,\r\n 1,\r\n frequency,\r\n severity,\r\n answers,\r\n answerImages,\r\n questionCategories.map(e => e.id),\r\n selectedDocs.map(e => ({ documentId: e.id, pageNum: e.pageNum })),\r\n selectedShips,\r\n allowNFC\r\n );\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n onDone(response.data);\r\n }\r\n\r\n setSaving(false);\r\n onClose();\r\n }\r\n\r\n async function handleAddCategory(event) {\r\n event.preventDefault();\r\n setSaving(true);\r\n\r\n const response = await QuestionController.addCategory(companyId, categoryName);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setCategoryOptions([...categoryOptions, response.data]);\r\n }\r\n\r\n setShowAddCategory(false);\r\n setSaving(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name } = event.target;\r\n switch (name) {\r\n case 'content':\r\n setContent(value);\r\n break;\r\n case 'questionNote':\r\n setQuestionNote(value);\r\n break;\r\n case 'categoryName':\r\n setCategoryName(value);\r\n break;\r\n case 'pageNumber':\r\n if (value.length !== 0 && (isNaN(parseInt(value)) || parseInt(value) < 0)) {\r\n break;\r\n }\r\n setPageNumber(value.length === 0 ? '' : parseInt(value));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function handleSelectCategory(value) {\r\n if (value.includes('')) {\r\n setQuestionCategories([]);\r\n } else if (value.includes('new')) {\r\n setShowAddCategory(true);\r\n setCategoryName('');\r\n } else {\r\n setQuestionCategories(value);\r\n }\r\n }\r\n\r\n function handleUpdatePageNum(event) {\r\n event.preventDefault();\r\n setSelectedDocs(selectedDocs.map(e => (e.id === selectPageId ? { ...e, pageNum: pageNumber } : e)));\r\n setSelectPageId(null);\r\n setPageNumber(0);\r\n }\r\n\r\n function handleAddAnswer() {\r\n const newAnswers = [...answers, defaultAnswer(false)];\r\n setAnswers(newAnswers);\r\n }\r\n\r\n function handleRemoveAnswer() {\r\n if (answers.length === 1) {\r\n return;\r\n }\r\n const newAnswers = [...answers];\r\n newAnswers.pop();\r\n setAnswers(newAnswers);\r\n }\r\n\r\n function handleChangeCorrectAnswer(index) {\r\n setAnswers(answers.map((e, i) => ({ ...e, isCorrect: i === index })));\r\n }\r\n\r\n function handleChangeAnswerTitle(index, newTitle) {\r\n setAnswers(answers.map((e, i) => ({ ...e, title: i === index ? newTitle : e.title })));\r\n }\r\n\r\n function handleChangeAnswerImage(index, event) {\r\n const { files } = event.target;\r\n const newImageIndex = answerImages.length;\r\n const noEntry = index >= newImageIndex;\r\n if (files.length > 0) {\r\n if (noEntry) {\r\n setAnswerImages([...answerImages, files[0]]);\r\n setAnswers(answers.map((e, i) => (i === index ? { ...e, imageIndex: newImageIndex } : e)));\r\n } else {\r\n setAnswerImages(answerImages.map((e, i) => (i === index ? files[0] : e)));\r\n setAnswers(answers.map((e, i) => (i === index ? { ...e, imageIndex: newImageIndex } : e)));\r\n }\r\n }\r\n }\r\n\r\n function handleDeleteAnswerImage(index) {\r\n setAnswers(answers.map((e, i) => (i === index ? { ...e, imageUrl: null } : e)));\r\n }\r\n\r\n function buildAddCategoryDialog() {\r\n return (\r\n setShowAddCategory(false)}>\r\n
\r\n Add New Category\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildSelectPageDialog() {\r\n return (\r\n setSelectPageId(null)}>\r\n
\r\n Select Page Number\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildErrorDialog() {\r\n return (\r\n setWarning(null)}>\r\n Error\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildDialogContent() {\r\n return (\r\n
\r\n Add/Edit Question\r\n \r\n \r\n \r\n \r\n \r\n \r\n Categories\r\n handleSelectCategory(e.target.value)}\r\n name=\"categories\"\r\n variant=\"filled\"\r\n multiple\r\n fullWidth\r\n >\r\n {categoryOptions.map(e => (\r\n \r\n {e.name}\r\n \r\n ))}\r\n \r\n Add New\r\n \r\n \r\n None Selected\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {selectedDocs.map((e, i) => {\r\n return (\r\n : null}\r\n label={`${e.title}.${e.fileType.split('/')[e.fileType.split('/').length - 1]}${e.fileType.includes('pdf') ? ` (pg. ${e.pageNum})` : ''}`}\r\n onDelete={() => setSelectedDocs(selectedDocs.filter(d => d.id !== e.id))}\r\n />\r\n );\r\n })}\r\n \r\n \r\n setSelectedShips(v)}\r\n className={classes.selectArea}\r\n options={shipsArray.sort((a, b) => -b.name[0].toUpperCase().localeCompare(a.name[0].toUpperCase())).map(e => e.id)}\r\n groupBy={item => shipsArray.find(e => e.id === item).name[0].toUpperCase()}\r\n getOptionLabel={item => shipsArray.find(e => e.id === item).name}\r\n renderInput={params => }\r\n renderTags={(value, getTagProps) =>\r\n value.map((option, index) => {\r\n const name = shipsArray.find(e => e.id === option).name;\r\n return ;\r\n })\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Severity\r\n setSeverity(v)}\r\n name=\"severity\"\r\n step={1}\r\n min={0}\r\n max={100}\r\n />\r\n \r\n \r\n \r\n \r\n Default Frequency\r\n (x * 0.01).toFixed(1)}\r\n valueLabelDisplay=\"auto\"\r\n onChangeCommitted={(_, v) => setFrequency(v)}\r\n name=\"frequency\"\r\n step={1}\r\n min={1}\r\n max={100}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n setAllowNFC(e.target.checked)} color=\"primary\" />} label=\"Allow NFC\" />\r\n \r\n \r\n \r\n \r\n \r\n \r\n {answers.map((e, i) => (\r\n \r\n
\r\n handleChangeAnswerTitle(i, e.target.value)}\r\n value={e.title}\r\n fullWidth\r\n />\r\n
\r\n {isNullOrUndefined(e.imageUrl) || e.imageUrl.trim().length === 0 ? (\r\n \r\n {`Answer ${i + 1} Image`}\r\n handleChangeAnswerImage(i, event)}\r\n fullWidth\r\n />\r\n \r\n ) : (\r\n
\r\n handleDeleteAnswerImage(i)}>\r\n \r\n \r\n
\r\n )}\r\n
\r\n handleChangeCorrectAnswer(i)} disabled={questionExists()}>\r\n {e.isCorrect ? : }\r\n \r\n
\r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {loading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n buildDialogContent()\r\n )}\r\n
\r\n\r\n {buildSelectPageDialog()}\r\n {buildAddCategoryDialog()}\r\n {buildErrorDialog()}\r\n\r\n setShowPickDocument(false)}\r\n onSelect={document => {\r\n setSelectedDocs([...selectedDocs, document]);\r\n if (document.fileType.includes('pdf')) {\r\n setSelectPageId(document.id);\r\n }\r\n }}\r\n />\r\n \r\n );\r\n}\r\n\r\nComplianceAddEditQuestion.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onDone: PropTypes.func.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n categoriesArray: PropTypes.array.isRequired,\r\n shipsArray: PropTypes.array.isRequired,\r\n question: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, Card, Typography, IconButton, Checkbox } from '@material-ui/core';\r\nimport { AllInclusive, ArrowLeft, ArrowRight } from '@material-ui/icons';\r\nimport { Colours } from '../../helpers/Colours';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n '& .selector': {\r\n display: 'flex',\r\n height: '400px',\r\n },\r\n '& .top': {\r\n position: 'absolute',\r\n width: '100%',\r\n padding: 8,\r\n top: 0,\r\n left: 0,\r\n zIndex: 1,\r\n backgroundColor: Colours.white,\r\n WebkitBoxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n MozBoxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n boxShadow: '-2px 0px 5px 0px rgba(0,0,0,0.25)',\r\n '& .MuiTypography-button': {\r\n fontSize: 12,\r\n },\r\n },\r\n '& .pane': {\r\n width: '50%',\r\n height: '100%',\r\n overflowY: 'hidden',\r\n position: 'relative',\r\n paddingTop: 102,\r\n '&:last-child': {\r\n borderLeft: `1px solid ${Colours.archived}`,\r\n },\r\n },\r\n '& .inner': {\r\n overflowY: 'auto',\r\n height: '100%',\r\n padding: 8,\r\n },\r\n '& .actions': {\r\n borderTop: `1px solid ${Colours.archived}`,\r\n textAlign: 'center',\r\n },\r\n '& .select-all': {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'center',\r\n },\r\n '& .empty-message': {\r\n padding: 12,\r\n textAlign: 'center',\r\n },\r\n },\r\n}));\r\n\r\nexport function ComplianceSelector(props) {\r\n const { leftTitle, leftSubtitle, leftChildren, rightTitle, rightSubtitle, rightChildren, onSelectAllLeft, onSelectAllRight, onMoveLeft, onMoveRight, emptyRightMessage } = props;\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n {leftTitle}\r\n \r\n \r\n {leftSubtitle}\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
{leftChildren}
\r\n
\r\n\r\n
\r\n
\r\n \r\n {rightTitle}\r\n \r\n \r\n {rightSubtitle}\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
{rightChildren?.length > 0 ? rightChildren : {emptyRightMessage}}
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nComplianceSelector.propTypes = {\r\n leftTitle: PropTypes.string.isRequired,\r\n leftSubtitle: PropTypes.string.isRequired,\r\n leftChildren: PropTypes.array.isRequired,\r\n rightTitle: PropTypes.string.isRequired,\r\n rightSubtitle: PropTypes.string.isRequired,\r\n rightChildren: PropTypes.array.isRequired,\r\n onSelectAllLeft: PropTypes.func.isRequired,\r\n onSelectAllRight: PropTypes.func.isRequired,\r\n onMoveLeft: PropTypes.func.isRequired,\r\n onMoveRight: PropTypes.func.isRequired,\r\n emptyRightMessage: PropTypes.string,\r\n};\r\n","import React from 'react';\r\n\r\nimport { Place, MenuBook, LocalHospital, Directions, DirectionsBoat } from '@material-ui/icons';\r\n// This must MATCH 1-1 with customIcon.dart in the mobile app\r\n\r\nexport default function getCustomIcon(iconType) {\r\n switch (iconType) {\r\n case 0:\r\n return ;\r\n case 1:\r\n return ;\r\n case 2:\r\n return ;\r\n case 3:\r\n return ;\r\n case 4:\r\n return ;\r\n default:\r\n return ;\r\n }\r\n}\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport MomentUtils from '@date-io/moment';\r\nimport ComplianceController from '../../controllers/ComplianceController';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Button,\r\n makeStyles,\r\n CircularProgress,\r\n Grid,\r\n Typography,\r\n TextField,\r\n Card,\r\n Checkbox,\r\n FormControl,\r\n InputLabel,\r\n Slider,\r\n FormControlLabel,\r\n useTheme,\r\n useMediaQuery,\r\n RadioGroup,\r\n Radio,\r\n MenuItem,\r\n Select,\r\n IconButton,\r\n} from '@material-ui/core';\r\nimport { DateTimePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';\r\nimport { isNullOrUndefined, isNullOrWhitespace } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport { ComplianceSelector } from './ComplianceSelector';\r\nimport getCustomIcon from '../../helpers/CustomIcon';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport ArrowDropUpIcon from '@material-ui/icons/ArrowDropUp';\r\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n loading: {\r\n maxHeight: '60vh',\r\n height: 512,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n title: {\r\n color: Colours.bodyText,\r\n },\r\n selection: {\r\n padding: 8,\r\n marginTop: 4,\r\n position: 'relative',\r\n '&.archived': {\r\n backgroundColor: Colours.archived,\r\n },\r\n '& .checkbox': {\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n },\r\n '& .slider': {\r\n paddingTop: 24,\r\n },\r\n '& .simple-name': {\r\n paddingRight: 32,\r\n },\r\n },\r\n mandatoryCheckbox: {\r\n marginLeft: 0,\r\n },\r\n recurrenceArea: {\r\n padding: 10,\r\n borderRadius: 6,\r\n fontSize: 16,\r\n fontWeight: 300,\r\n color: Colours.bodyText,\r\n '& .repeatHeader': {\r\n marginRight: 20,\r\n },\r\n '& .dropdownPicker': {\r\n color: Colours.primary,\r\n border: 'solid 2px',\r\n borderColor: Colours.bodyText,\r\n borderRadius: 6,\r\n height: 30,\r\n padding: 5,\r\n margin: '8px 10px 8px 0px',\r\n fontSize: 16,\r\n },\r\n '& .dateTimePicker': {\r\n border: 'solid 2px',\r\n borderColor: Colours.bodyText,\r\n borderRadius: 6,\r\n padding: 5,\r\n margin: '8px 10px 8px 0px',\r\n height: 30,\r\n '& input': {\r\n minWidth: 200,\r\n textAlign: 'center',\r\n color: Colours.primary,\r\n fontSize: 16,\r\n height: 'auto',\r\n padding: 0,\r\n cursor: 'pointer',\r\n },\r\n },\r\n '& .buttonPicker': {\r\n color: Colours.primary,\r\n border: 'solid 2px',\r\n borderColor: Colours.bodyText,\r\n borderRadius: 6,\r\n padding: 5,\r\n marginTop: 'auto',\r\n marginBottom: 'auto',\r\n marginRight: '8px',\r\n height: '30px',\r\n width: '50px',\r\n minWidth: '0',\r\n '& .MuiButton-label': {\r\n top: 1,\r\n position: 'absolute',\r\n },\r\n },\r\n '& .timeHolders': {\r\n display: 'flex',\r\n },\r\n '& .recurrenceHeaders': {\r\n marginTop: 16,\r\n },\r\n '& .recurrenceChecked': {\r\n 'MuiRadio-colorSecondary.Mui-checked': `${Colours.primary} !important`,\r\n },\r\n },\r\n testLevel: {\r\n display: 'flex',\r\n },\r\n iconWrapper: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-end',\r\n marginRight: 12,\r\n marginTop: 4,\r\n width: '100%',\r\n '& .MuiSvgIcon-root': {\r\n cursor: 'pointer',\r\n },\r\n },\r\n levelContainer: {\r\n '& .MuiGrid-item': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n },\r\n}));\r\n\r\nexport function ComplianceAddEditAssessment(props) {\r\n const { assessment, open, onClose, onDone, companyId, usersArray, questionsArray, userGroupsArray, shipsArray, categories } = props;\r\n const [warning, setWarning] = React.useState(null);\r\n const [saving, setSaving] = React.useState(false);\r\n const [loading, setLoading] = React.useState(false);\r\n const [errorText, setErrorText] = React.useState('');\r\n\r\n const [step, setStep] = React.useState(0);\r\n const [questionFrequencies, setQuestionFrequencies] = React.useState([]);\r\n const [questionSelections, setQuestionSelections] = React.useState([]);\r\n const [userSelections, setUserSelections] = React.useState([]);\r\n const [userGroupSelections, setUserGroupSelections] = React.useState([]);\r\n const [shipSelections, setShipSelections] = React.useState([]);\r\n const [questionsToAsk, setQuestionsToAsk] = React.useState('');\r\n const [questionSearch, setQuestionSearch] = React.useState('');\r\n const [userSearch, setUserSearch] = React.useState('');\r\n const [groupSearch, setGroupSearch] = React.useState('');\r\n const [shipSearch, setShipSearch] = React.useState('');\r\n\r\n const [repeatSelect, setRepeatSelect] = React.useState('Weekly');\r\n const [endSelect, setEndSelect] = React.useState('On');\r\n const [startDate, setStartDate] = React.useState(moment());\r\n const [endDate, setEndDate] = React.useState(moment());\r\n const [mandatory, setMandatory] = React.useState(false);\r\n const [name, setName] = React.useState('');\r\n const [iconIndex, setIconIndex] = React.useState(0);\r\n const [categoryId, setCategoryId] = React.useState(null);\r\n const [loadAssessment, setLoadAssessment] = React.useState(false);\r\n const [complianceTestLevels, setComplianceTestLevels] = React.useState([]);\r\n const [testLevelCrons, setTestLevelCrons] = React.useState([]);\r\n\r\n const selectedQuestions = useMemo(() => questionSelections.filter(e => e.selected), [questionSelections]);\r\n const neverDate = moment.utc('2040-01-01');\r\n const theme = useTheme();\r\n const matches = useMediaQuery(theme.breakpoints.down('xs'));\r\n const classes = useStyles();\r\n\r\n const assessmentExists = () => !isNullOrUndefined(assessment?.id);\r\n\r\n const cacheFrequencies = React.useCallback(\r\n (step, questionSelections) => {\r\n if (step === 1 && questionFrequencies.length === 0) {\r\n setQuestionFrequencies(questionSelections.map(e => e.frequency));\r\n } else if (step !== 1 && questionFrequencies.length > 0) {\r\n setQuestionFrequencies([]);\r\n }\r\n },\r\n [questionFrequencies]\r\n );\r\n\r\n const loadCron = React.useCallback(\r\n assessment => {\r\n const splitCron = assessment.cronScheduling.split(' ');\r\n if (splitCron.length !== 5) {\r\n setWarning('Invalid schedule pattern, please check all fields have been filled!');\r\n return;\r\n }\r\n if (splitCron[0].includes(',')) {\r\n const minutes = splitCron[0].split(',');\r\n const hours = splitCron[1].split(',');\r\n startDate.minute(minutes[0]);\r\n startDate.minute(minutes[1]);\r\n startDate.hour(hours[0]);\r\n startDate.hour(hours[1]);\r\n setStartDate(startDate);\r\n } else {\r\n startDate.minute(splitCron[0]);\r\n startDate.hour(splitCron[1]);\r\n setStartDate(startDate);\r\n }\r\n if (splitCron[4].includes('*') && splitCron[3].includes('*') && splitCron[2].includes('*') && moment.utc(assessment.startTime).isSame(moment.utc(assessment.endTime), 'date')) {\r\n setRepeatSelect('Never');\r\n }\r\n\r\n if (!isNullOrUndefined(assessment) && !endDate.isSame(neverDate, 'date')) {\r\n setEndSelect('On');\r\n } else {\r\n setEndSelect('Never');\r\n }\r\n },\r\n [startDate, endDate, neverDate]\r\n );\r\n\r\n function loadAssessmentLevelCrons(level) {\r\n const splitCron = level.cronScheduling.split(' ');\r\n let cron = {\r\n levelIndex: level.levelIndex,\r\n };\r\n\r\n if (splitCron.length !== 5) {\r\n setWarning('Invalid schedule pattern, please check all fields have been filled!');\r\n return;\r\n }\r\n\r\n cron = { ...cron, repeatPatternDate: splitCron[2].split(',') };\r\n cron = { ...cron, repeatPatternMonth: splitCron[3].split(',') };\r\n cron = { ...cron, repeatPatternWeekDay: splitCron[4].split(',') };\r\n\r\n if (!splitCron[3].includes('*')) {\r\n cron = { ...cron, repeatSelect: 'Yearly' };\r\n } else if (!splitCron[2].includes('*')) {\r\n cron = { ...cron, repeatSelect: 'Monthly' };\r\n } else {\r\n cron = { ...cron, repeatSelect: 'Weekly' };\r\n }\r\n\r\n return cron;\r\n }\r\n\r\n const loadAssessmentData = React.useCallback(() => {\r\n if (assessment?.id === null || assessment?.id === undefined) {\r\n setQuestionSelections(questionsArray);\r\n setUserSelections(usersArray);\r\n setUserGroupSelections(userGroupsArray);\r\n setShipSelections(shipsArray);\r\n setQuestionsToAsk('');\r\n setStartDate(moment());\r\n setEndDate(neverDate);\r\n setName('');\r\n setIconIndex(0);\r\n } else {\r\n const shipSelections = shipsArray.map(e => ({ ...e, selected: assessment.ships.filter(a => a.id === e.id).length > 0 }));\r\n const assessmentCrons = [];\r\n const baselineLevel = {\r\n levelIndex: 0,\r\n numQuestions: assessment.questionCount,\r\n numPrevTestsToAccount: assessment.numPrevTestsToAccount ?? 0,\r\n scoreRequirement: assessment.scoreRequirement ?? 0,\r\n };\r\n const testLevelCron = {\r\n levelIndex: 0,\r\n repeatSelect: 'Weekly',\r\n repeatPatternWeekDay: [moment.utc().format('d')],\r\n repeatPatternDate: [moment.utc().format('D')],\r\n repeatPatternMonth: [moment.utc().format('M')],\r\n };\r\n\r\n setQuestionSelections(\r\n questionsArray.map(e => ({\r\n ...e,\r\n // filter out any previously selected questions if they have now unselected ships attached\r\n selected: assessment.questions.filter(a => a.id === e.id).length > 0 && (e.ships.some(a => shipSelections.map(s => s.id).includes(a.id)) || e.ships.length === 0),\r\n }))\r\n );\r\n setUserSelections(\r\n usersArray.map(e => ({\r\n ...e,\r\n // filter out any previously selected users if they are now serving on unselected ships\r\n selected: assessment.users.filter(a => a.id === e.id).length > 0 && e.ships.some(a => shipSelections.map(s => s.id).includes(a.shipId)),\r\n }))\r\n );\r\n\r\n setUserGroupSelections(userGroupsArray.map(e => ({ ...e, selected: assessment.userGroups.filter(a => a.id === e.id).length > 0 })));\r\n setShipSelections(shipSelections);\r\n setQuestionsToAsk(assessment.questionCount.toString());\r\n setStartDate(moment.utc(assessment.start).local());\r\n setEndDate(moment.utc(assessment.end).local());\r\n setName(assessment.title);\r\n setIconIndex(assessment.iconIndex);\r\n setComplianceTestLevels([baselineLevel, ...assessment.complianceTestLevels?.filter(e => e.levelIndex !== 0)]);\r\n setMandatory(!isNullOrUndefined(assessment.cronScheduling));\r\n\r\n if (!isNullOrUndefined(assessment.cronScheduling)) {\r\n loadCron(assessment);\r\n\r\n if (isNullOrUndefined(assessment.complianceTestLevels[0])) {\r\n const baseCron = { levelIndex: 0, cronScheduling: assessment.cronScheduling };\r\n assessmentCrons.push(loadAssessmentLevelCrons(baseCron));\r\n }\r\n } else {\r\n assessmentCrons.push(testLevelCron);\r\n }\r\n\r\n for (let i = 0; i < assessment?.complianceTestLevels.length; i++) {\r\n const level = assessment?.complianceTestLevels[i];\r\n if (!isNullOrUndefined(level.cronScheduling)) {\r\n assessmentCrons.push(loadAssessmentLevelCrons(level));\r\n } else {\r\n assessmentCrons.push({ ...testLevelCron, levelIndex: level.levelIndex });\r\n }\r\n }\r\n setTestLevelCrons(assessmentCrons);\r\n }\r\n }, [assessment, questionsArray, usersArray, userGroupsArray, shipsArray, neverDate, loadCron, loadAssessmentLevelCrons, testLevelCrons, setTestLevelCrons]);\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n setQuestionSearch('');\r\n setUserSearch('');\r\n setGroupSearch('');\r\n setShipSearch('');\r\n setComplianceTestLevels([]);\r\n setTestLevelCrons([]);\r\n setStep(0);\r\n if (open) {\r\n setLoadAssessment(true);\r\n }\r\n }\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }, [open]);\r\n\r\n // load assessment data when told\r\n React.useEffect(() => {\r\n if (loadAssessment) {\r\n loadAssessmentData();\r\n setLoadAssessment(false);\r\n setCategoryId(assessment.categoryId ?? categories[0].id);\r\n }\r\n }, [loadAssessment, loadAssessmentData]);\r\n\r\n // step setup\r\n React.useEffect(() => {\r\n if (open) {\r\n cacheFrequencies(step, questionSelections);\r\n }\r\n }, [step, open, questionSelections, cacheFrequencies]);\r\n\r\n function handleInput(event) {\r\n const { name, value } = event.target;\r\n\r\n setErrorText('');\r\n switch (name) {\r\n case 'numQuestions':\r\n if (value > selectedQuestions.length || value < 0) {\r\n setErrorText(`Please provide a valid value (0-${selectedQuestions.length})`);\r\n return;\r\n }\r\n setQuestionsToAsk(value);\r\n break;\r\n case 'questionSearch':\r\n setQuestionSearch(value);\r\n break;\r\n case 'userSearch':\r\n setUserSearch(value);\r\n break;\r\n case 'groupSearch':\r\n setGroupSearch(value);\r\n break;\r\n case 'shipSearch':\r\n setShipSearch(value);\r\n break;\r\n case 'repeatSelect':\r\n setRepeatSelect(value);\r\n break;\r\n case 'endSelect':\r\n setEndSelect(value);\r\n break;\r\n case 'name':\r\n setName(value);\r\n break;\r\n case 'iconIndex':\r\n setIconIndex(value);\r\n break;\r\n case 'category':\r\n setCategoryId(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function handleUpdateNewComplianceTestLevels(e, levelIndex) {\r\n const { name, value } = e.target;\r\n setErrorText('');\r\n\r\n switch (name) {\r\n case 'numQuestions':\r\n if (value > selectedQuestions.length || value < 0) {\r\n setErrorText(`Please provide a valid value (0-${selectedQuestions.length})`);\r\n return;\r\n }\r\n break;\r\n case 'scoreRequirement':\r\n if (value < 0 || value > 100) {\r\n setErrorText('Score % must be between 0-100');\r\n return;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n const newTestLevels = complianceTestLevels.map(e => (e.levelIndex === levelIndex ? { ...e, [name]: value } : e));\r\n setComplianceTestLevels(newTestLevels);\r\n }\r\n\r\n function filterQuestion(question) {\r\n return ('Q' + question.id.toString() + question.title + question.category.map(e => e.name).join('')).toLowerCase().includes(questionSearch.toLowerCase());\r\n }\r\n\r\n function filterUser(user) {\r\n return (user.firstName + user.lastName).toLowerCase().includes(userSearch.toLowerCase());\r\n }\r\n\r\n function filterUserGroup(userGroup) {\r\n return userGroup.name.toLowerCase().includes(groupSearch.toLowerCase());\r\n }\r\n\r\n function filterShip(ship) {\r\n return ship.name.toLowerCase().includes(shipSearch.toLowerCase());\r\n }\r\n\r\n function handleToggleCheckedQuestion(questionId, checked) {\r\n setQuestionSelections(questionSelections.map(e => (e.id === questionId && filterQuestion(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllUnselectedQuestions(checked) {\r\n setQuestionSelections(questionSelections.map(e => (!e.selected && filterQuestion(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllSelectedQuestions(checked) {\r\n setQuestionSelections(questionSelections.map(e => (e.selected && filterQuestion(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleSelectQuestions(selected) {\r\n setQuestionSelections(questionSelections.map(e => (e.selected !== selected && e.checked && filterQuestion(e) ? { ...e, selected, checked: false } : e)));\r\n }\r\n\r\n function handleUpdateFrequency(questionId, frequency) {\r\n setQuestionSelections(questionSelections.map(e => (e.id === questionId ? { ...e, frequency } : e)));\r\n }\r\n\r\n function handleToggleCheckedUser(userId, checked) {\r\n setUserSelections(userSelections.map(e => (e.id === userId && filterUser(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllUnselectedUsers(checked) {\r\n setUserSelections(userSelections.map(e => (!e.selected && filterUser(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllSelectedUsers(checked) {\r\n setUserSelections(userSelections.map(e => (e.selected && filterUser(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleSelectUsers(selected) {\r\n setUserSelections(userSelections.map(e => (e.selected !== selected && e.checked && filterUser(e) ? { ...e, selected, checked: false } : e)));\r\n }\r\n\r\n function handleToggleCheckedUserGroup(groupId, checked) {\r\n setUserGroupSelections(userGroupSelections.map(e => (e.id === groupId && filterUserGroup(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllUnselectedUserGroups(checked) {\r\n setUserGroupSelections(userGroupSelections.map(e => (!e.selected && filterUserGroup(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllSelectedUserGroups(checked) {\r\n setUserGroupSelections(userGroupSelections.map(e => (e.selected && filterUserGroup(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleSelectUserGroups(selected) {\r\n setUserGroupSelections(userGroupSelections.map(e => (e.selected !== selected && e.checked && filterUserGroup(e) ? { ...e, selected, checked: false } : e)));\r\n }\r\n\r\n function handleToggleCheckedShip(shipId, checked) {\r\n setShipSelections(shipSelections.map(e => (e.id === shipId && filterShip(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllUnselectedShips(checked) {\r\n setShipSelections(shipSelections.map(e => (!e.selected && filterShip(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleCheckAllSelectedShips(checked) {\r\n setShipSelections(shipSelections.map(e => (e.selected && filterShip(e) ? { ...e, checked } : e)));\r\n }\r\n\r\n function handleSelectShips(selected) {\r\n setShipSelections(shipSelections.map(e => (e.selected !== selected && e.checked && filterShip(e) ? { ...e, selected, checked: false } : e)));\r\n }\r\n\r\n function handleGenerateTestLevelCrons(testLevelCron) {\r\n let cron = startDate.format('m') + ' ' + startDate.format('H');\r\n const { repeatSelect, repeatPatternWeekDay, repeatPatternDate, repeatPatternMonth } = testLevelCron;\r\n\r\n switch (repeatSelect) {\r\n case 'Weekly':\r\n if (repeatPatternWeekDay.length === 0) {\r\n //warn\r\n return null;\r\n }\r\n cron += ' * * ' + (repeatPatternWeekDay.length === 7 ? '*' : repeatPatternWeekDay.join(','));\r\n return cron;\r\n case 'Monthly':\r\n if (repeatPatternDate.length === 0) {\r\n //warn\r\n return null;\r\n }\r\n cron += ' ' + (repeatPatternDate.length === 31 ? '*' : repeatPatternDate.join(',')) + ' * ' + (repeatPatternWeekDay.length === 7 ? '*' : repeatPatternWeekDay.join(','));\r\n return cron;\r\n case 'Yearly':\r\n if (repeatPatternDate.length === 0 || repeatPatternMonth.length === 0) {\r\n //warn\r\n return null;\r\n }\r\n cron +=\r\n ' ' +\r\n (repeatPatternDate.length === 31 ? '*' : repeatPatternDate.join(',')) +\r\n ' ' +\r\n (repeatPatternMonth.length === 12 ? '*' : repeatPatternMonth.join(',')) +\r\n ' ' +\r\n (repeatPatternWeekDay.length === 7 ? '*' : repeatPatternWeekDay.join(','));\r\n return cron;\r\n default:\r\n //warn\r\n setWarning('Invalid repeat state ' + repeatSelect);\r\n return null;\r\n }\r\n }\r\n\r\n function handleAssessmentLevelCronInputs(event, assessmentLevelIndex) {\r\n const { name, value } = event.target;\r\n switch (name) {\r\n case 'repeatSelect':\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatSelect: value } : e)));\r\n break;\r\n case 'repeatPatternWeekDay':\r\n if (value.includes('*')) {\r\n const pattern = testLevelCrons.find(e => e.levelIndex === assessmentLevelIndex).repeatPatternWeekDay;\r\n if (pattern.length === 1 && pattern.includes('*')) {\r\n const v = value.filter(value => {\r\n return value !== '*';\r\n });\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternWeekDay: v } : e)));\r\n break;\r\n }\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternWeekDay: ['*'] } : e)));\r\n break;\r\n }\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternWeekDay: value } : e)));\r\n break;\r\n case 'repeatPatternDate':\r\n if (value.includes('*')) {\r\n const pattern = testLevelCrons.find(e => e.levelIndex === assessmentLevelIndex).repeatPatternDate;\r\n if (pattern.length === 1 && pattern.includes('*')) {\r\n const v = value.filter(value => {\r\n return value !== '*';\r\n });\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternDate: v } : e)));\r\n break;\r\n }\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternDate: ['*'] } : e)));\r\n break;\r\n }\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternDate: value } : e)));\r\n break;\r\n case 'repeatPatternMonth':\r\n if (value.includes('*')) {\r\n const pattern = testLevelCrons.find(e => e.levelIndex === assessmentLevelIndex).repeatPatternMonth;\r\n if (pattern.length === 1 && pattern.includes('*')) {\r\n const v = value.filter(value => {\r\n return value !== '*';\r\n });\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternMonth: v } : e)));\r\n break;\r\n }\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternMonth: ['*'] } : e)));\r\n break;\r\n }\r\n setTestLevelCrons(testLevelCrons.map(e => (e.levelIndex === assessmentLevelIndex ? { ...e, repeatPatternMonth: value } : e)));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function handleAddNewAssessmentLevel() {\r\n const newAssessmentLevel = { levelIndex: complianceTestLevels.length, numQuestions: 0, numPrevTestsToAccount: 0, scoreRequirement: 0, cronScheduling: null };\r\n const testLevelCron = {\r\n levelIndex: complianceTestLevels.length,\r\n repeatSelect: 'Weekly',\r\n repeatPatternWeekDay: [moment.utc().format('d')],\r\n repeatPatternDate: [moment.utc().format('D')],\r\n repeatPatternMonth: [moment.utc().format('M')],\r\n };\r\n\r\n setComplianceTestLevels([...complianceTestLevels, newAssessmentLevel]);\r\n setTestLevelCrons([...testLevelCrons, testLevelCron]);\r\n }\r\n\r\n function handleChangeAssessmentLevelPosition(index, direction) {\r\n const newIndex = index + direction;\r\n const newComplianceTestLevels = complianceTestLevels.map(e => (e.levelIndex === index ? { ...e, levelIndex: newIndex } : e.levelIndex === newIndex ? { ...e, levelIndex: index } : e));\r\n const newTestLevelCrons = testLevelCrons.map(e => (e.levelIndex === index ? { ...e, levelIndex: newIndex } : e.levelIndex === newIndex ? { ...e, levelIndex: index } : e));\r\n setComplianceTestLevels(newComplianceTestLevels);\r\n setTestLevelCrons(newTestLevelCrons);\r\n }\r\n\r\n function handleDeleteAssessmentLevel(index) {\r\n const newComplianceTestLevels = complianceTestLevels.filter(e => e.levelIndex !== index).map(e => (e.levelIndex > index ? { ...e, levelIndex: e.levelIndex - 1 } : e));\r\n const newTestLevelCrons = testLevelCrons.filter(e => e.levelIndex !== index).map(e => (e.levelIndex > index ? { ...e, levelIndex: e.levelIndex - 1 } : e));\r\n setComplianceTestLevels(newComplianceTestLevels);\r\n setTestLevelCrons(newTestLevelCrons);\r\n }\r\n\r\n async function handleSave(event) {\r\n event.preventDefault();\r\n setSaving(true);\r\n\r\n let cron = null;\r\n\r\n const scoreRequirement = complianceTestLevels[0]?.scoreRequirement ?? null;\r\n const numPrevTestsToAccount = complianceTestLevels[0]?.numPrevTestsToAccount ?? null;\r\n const questionsToAsk = complianceTestLevels[0]?.numQuestions ?? null;\r\n\r\n const newComplianceTestLevels = complianceTestLevels.map(e => {\r\n const testLevelCron = testLevelCrons.find(t => t.levelIndex === e.levelIndex);\r\n const generatedCron = mandatory ? handleGenerateTestLevelCrons(testLevelCron) : null;\r\n\r\n if (e.levelIndex === 0) {\r\n cron = generatedCron;\r\n }\r\n\r\n return { ...e, cronScheduling: generatedCron };\r\n });\r\n\r\n const selectedShips = shipSelections.filter(e => e.selected).map(e => e.id);\r\n const selectedQuestions = questionSelections.filter(e => e.selected).map(e => ({ id: e.id, frequency: e.frequency }));\r\n const selectedUsers = userSelections.filter(e => e.selected).filter(e => e.ships.some(s => selectedShips.includes(s.shipId)));\r\n const selectedUserIds = selectedUsers.map(e => e.id);\r\n const selectedUserGroups = userGroupSelections.filter(e => e.selected).map(e => e.id);\r\n\r\n const response = assessmentExists()\r\n ? await ComplianceController.editComplianceTest(\r\n companyId,\r\n assessment.id,\r\n name,\r\n iconIndex,\r\n categoryId,\r\n mandatory ? cron : null,\r\n startDate,\r\n mandatory ? endDate : neverDate,\r\n true,\r\n questionsToAsk,\r\n scoreRequirement,\r\n numPrevTestsToAccount,\r\n selectedQuestions,\r\n selectedShips,\r\n selectedUserIds,\r\n selectedUserGroups,\r\n newComplianceTestLevels\r\n )\r\n : await ComplianceController.addComplianceTest(\r\n companyId,\r\n name,\r\n iconIndex,\r\n categoryId,\r\n mandatory ? cron : null,\r\n startDate,\r\n mandatory ? endDate : neverDate,\r\n true,\r\n questionsToAsk,\r\n scoreRequirement,\r\n numPrevTestsToAccount,\r\n selectedQuestions,\r\n selectedShips,\r\n selectedUserIds,\r\n selectedUserGroups,\r\n newComplianceTestLevels\r\n );\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const assessmentResponse = await ComplianceController.getComplianceTest(companyId, response.data.id);\r\n if (assessmentResponse.hasError) {\r\n setWarning(assessmentResponse.data);\r\n } else {\r\n const { users, ships } = assessmentResponse.data;\r\n response.data = { ...response.data, users, ships };\r\n onDone(response.data);\r\n onClose();\r\n }\r\n }\r\n\r\n setSaving(false);\r\n }\r\n\r\n function buildErrorDialog() {\r\n return (\r\n setWarning(null)}>\r\n Error\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildDialogContent() {\r\n switch (step) {\r\n case 0:\r\n return buildPageOne();\r\n case 1:\r\n return buildPageTwo();\r\n case 2:\r\n return buildPageThree();\r\n case 3:\r\n return buildPageFour();\r\n case 4:\r\n return buildPageFive();\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n function buildQuestionSelection(question, index, showFrequencySlider = false) {\r\n if (questionFrequencies.length === 0) {\r\n return null;\r\n }\r\n const defaultFrequency = questionFrequencies[index];\r\n const { id, title, isArchived, category, checked } = question;\r\n return (\r\n \r\n \r\n Q{id}\r\n {isArchived ? ' (archived)' : ''}\r\n \r\n \r\n {category.map(e => e.name.toUpperCase()).join(', ')}\r\n \r\n \r\n {title}\r\n \r\n {showFrequencySlider ? (\r\n \r\n Repeat Frequency\r\n (x * 0.01).toFixed(1)}\r\n valueLabelDisplay=\"auto\"\r\n onChangeCommitted={(_, v) => handleUpdateFrequency(id, v)}\r\n name=\"frequency\"\r\n step={1}\r\n min={1}\r\n max={100}\r\n />\r\n \r\n ) : null}\r\n handleToggleCheckedQuestion(id, !checked)} />\r\n \r\n );\r\n }\r\n\r\n function buildSimpleSelection(item, onChange) {\r\n const { id, name, checked } = item;\r\n return (\r\n \r\n {name}\r\n onChange(id, v)} className=\"checkbox\" />\r\n \r\n );\r\n }\r\n\r\n function buildAssessmentLevelRepeatPatten(assessmentLevelIndex) {\r\n const testLevelCron = testLevelCrons.find(e => e.levelIndex === assessmentLevelIndex);\r\n\r\n switch (testLevelCron?.repeatSelect) {\r\n case 'Weekly':\r\n return (\r\n handleAssessmentLevelCronInputs(e, assessmentLevelIndex)}\r\n value={testLevelCron.repeatPatternWeekDay}\r\n placeholder=\"Day of the week\"\r\n multiple\r\n key=\"repeatPatternWeekDaySelect\"\r\n disableUnderline\r\n className=\"dropdownPicker\"\r\n >\r\n Every Week Day\r\n Monday\r\n Tuesday\r\n Wednesday\r\n Thursday\r\n Friday\r\n Saturday\r\n Sunday\r\n \r\n );\r\n case 'Monthly':\r\n return [\r\n handleAssessmentLevelCronInputs(e, assessmentLevelIndex)}\r\n value={testLevelCron.repeatPatternWeekDay}\r\n placeholder=\"Day of the week\"\r\n multiple\r\n key=\"repeatPatternWeekDaySelect\"\r\n disableUnderline\r\n className=\"dropdownPicker\"\r\n >\r\n Every Week Day\r\n Monday\r\n Tuesday\r\n Wednesday\r\n Thursday\r\n Friday\r\n Saturday\r\n Sunday\r\n ,\r\n handleAssessmentLevelCronInputs(e, assessmentLevelIndex)}\r\n value={testLevelCron.repeatPatternDate}\r\n placeholder=\"Day of the month\"\r\n multiple\r\n key=\"repeatPatternDateSelect\"\r\n disableUnderline\r\n className=\"dropdownPicker\"\r\n >\r\n {buildMonthlySelectItems()}\r\n ,\r\n ];\r\n case 'Yearly':\r\n return [\r\n handleAssessmentLevelCronInputs(e, assessmentLevelIndex)}\r\n value={testLevelCron.repeatPatternWeekDay}\r\n placeholder=\"Day of the week\"\r\n multiple\r\n key=\"repeatPatternWeekDaySelect\"\r\n disableUnderline\r\n className=\"dropdownPicker\"\r\n >\r\n Every Week Day\r\n Monday\r\n Tuesday\r\n Wednesday\r\n Thursday\r\n Friday\r\n Saturday\r\n Sunday\r\n ,\r\n handleAssessmentLevelCronInputs(e, assessmentLevelIndex)}\r\n value={testLevelCron.repeatPatternDate}\r\n placeholder=\"Day of the month\"\r\n multiple\r\n key=\"repeatPatternDateSelect\"\r\n disableUnderline\r\n className=\"dropdownPicker\"\r\n >\r\n {buildMonthlySelectItems()}\r\n ,\r\n handleAssessmentLevelCronInputs(e, assessmentLevelIndex)}\r\n value={testLevelCron.repeatPatternMonth}\r\n placeholder=\"Months\"\r\n multiple\r\n key=\"repeatPatternMonthSelect\"\r\n disableUnderline\r\n className=\"dropdownPicker\"\r\n >\r\n Every Month\r\n January\r\n February\r\n March\r\n April\r\n May\r\n June\r\n July\r\n August\r\n September\r\n October\r\n November\r\n December\r\n ,\r\n ];\r\n case 'Never':\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n function buildMonthlySelectItems() {\r\n const monthlyItems = [\r\n \r\n Every Day\r\n ,\r\n ];\r\n for (let i = 1; i < 32; i++) {\r\n monthlyItems.push(\r\n \r\n {i.toString()}\r\n \r\n );\r\n }\r\n return monthlyItems;\r\n }\r\n\r\n function buildCategoryList() {\r\n const categoryList = [];\r\n for (let i = 0; i < categories.length; i++) {\r\n const category = categories[i];\r\n categoryList.push(\r\n \r\n {category.name}\r\n \r\n );\r\n }\r\n return categoryList;\r\n }\r\n\r\n function buildRecurrenceArea() {\r\n return (\r\n
\r\n
\r\n {repeatSelect !== 'Never' ? (\r\n
\r\n
Ends:
\r\n \r\n } label=\"Never\" labelPlacement=\"end\" />\r\n } label=\"On\" labelPlacement=\"end\" />\r\n \r\n
\r\n ) : null}\r\n
\r\n \r\n
\r\n
Starts On:
\r\n \r\n
\r\n
\r\n
Ends On:
\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildPageOne() {\r\n // ships\r\n const totalSelectedShips = shipSelections.filter(e => e.selected).length;\r\n const totalUnselectedShips = shipSelections.filter(e => !e.selected).length;\r\n const selectedShips = shipSelections.filter(filterShip).filter(e => e.selected);\r\n const unselectedShips = shipSelections.filter(filterShip).filter(e => !e.selected);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n Ships\r\n \r\n Select one or more ships that this assessment will be made available to\r\n \r\n \r\n \r\n buildSimpleSelection(e, handleToggleCheckedShip))}\r\n rightTitle=\"Included in Assessment\"\r\n rightSubtitle={`Showing ${selectedShips.length} out of ${totalSelectedShips}`}\r\n rightChildren={selectedShips.map(e => buildSimpleSelection(e, handleToggleCheckedShip))}\r\n onSelectAllLeft={(_, val) => handleCheckAllUnselectedShips(val)}\r\n onSelectAllRight={(_, val) => handleCheckAllSelectedShips(val)}\r\n onMoveLeft={() => handleSelectShips(false)}\r\n onMoveRight={() => handleSelectShips(true)}\r\n emptyRightMessage=\"No ships assigned, this assessment will not be available to anyone\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildPageTwo() {\r\n const totalSelected = selectedQuestions.length;\r\n const unselectedQuestions = questionSelections.filter(\r\n e =>\r\n !e.selected &&\r\n (e.ships.length === 0 ||\r\n e.ships.some(e =>\r\n shipSelections\r\n .filter(e => e.selected)\r\n .map(s => s.id)\r\n .includes(e.id)\r\n ))\r\n );\r\n const selectedItems = selectedQuestions\r\n .sort((a, b) => parseInt(a.id) - parseInt(b.id))\r\n .sort((a, b) => a.isArchived + -b.isArchived)\r\n .filter(filterQuestion);\r\n const unselectedItems = unselectedQuestions\r\n .sort((a, b) => parseInt(a.id) - parseInt(b.id))\r\n .sort((a, b) => a.isArchived + -b.isArchived)\r\n .filter(filterQuestion);\r\n const onSubmit = e => {\r\n e.preventDefault();\r\n if (totalSelected !== 0) {\r\n setStep(2);\r\n }\r\n };\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n Questions\r\n \r\n \r\n Use the search box to filter results in the left and right hand panes of the below configurator. Results in the left 'ALL QUESTIONS' pane ARE NOT included in\r\n this assessment. Results in the right 'INCLUDED IN ASSESSMENT' pane ARE included in this assessment.\r\n \r\n \r\n \r\n \r\n buildQuestionSelection(e, i))}\r\n rightTitle=\"Included in Assessment\"\r\n rightSubtitle={`Showing ${selectedItems.length} out of ${totalSelected}`}\r\n rightChildren={selectedItems.map((e, i) => buildQuestionSelection(e, i, true))}\r\n onSelectAllLeft={(_, val) => handleCheckAllUnselectedQuestions(val)}\r\n onSelectAllRight={(_, val) => handleCheckAllSelectedQuestions(val)}\r\n onMoveLeft={() => handleSelectQuestions(false)}\r\n onMoveRight={() => handleSelectQuestions(true)}\r\n emptyRightMessage=\"You must assign at least one question to this assessment to continue.\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n function buildPageThree() {\r\n // users\r\n const shipOnlyUsers = userSelections.filter(e =>\r\n e.ships.some(e =>\r\n shipSelections\r\n .filter(e => e.selected)\r\n .map(s => s.id)\r\n .includes(e.shipId)\r\n )\r\n );\r\n const totalSelectedUsers = shipOnlyUsers.filter(e => e.selected).length;\r\n const totalUnselectedUsers = shipOnlyUsers.filter(e => !e.selected).length;\r\n const selectedUsers = shipOnlyUsers.filter(filterUser).filter(e => e.selected);\r\n const unselectedUsers = shipOnlyUsers.filter(filterUser).filter(e => !e.selected);\r\n\r\n // user groups\r\n const totalSelectedUserGroups = userGroupSelections.filter(e => e.selected).length;\r\n const totalUnselectedUserGroups = userGroupSelections.filter(e => !e.selected).length;\r\n const selectedUserGroups = userGroupSelections.filter(filterUserGroup).filter(e => e.selected);\r\n const unselectedUserGroups = userGroupSelections.filter(filterUserGroup).filter(e => !e.selected);\r\n\r\n // availability message\r\n let userGroupMsg = 'No users are eligible for this assessment.';\r\n let usersMsg;\r\n if (shipOnlyUsers.length > 0) {\r\n if (selectedUserGroups.length !== 0) {\r\n userGroupMsg = 'This assessment is available to all users across the following User Groups: ' + selectedUserGroups.map(e => e.name).join(', ') + '.';\r\n } else {\r\n userGroupMsg = 'This assessment is available to all users on the selected Ship(s).';\r\n }\r\n if (selectedUsers.length !== 0) {\r\n usersMsg = 'This assessment is assigned to ' + selectedUsers.map(e => e.firstName + ' ' + e.lastName).join(', ') + ', even if they do not belong to a selected User Group.';\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n Users, Groups & Ships\r\n \r\n \r\n Any user directly added to this assessment or by association (through a ship or user group) will have access to the assessment and all associated questions and files.\r\n The user may revise the content of the assessment at any time through their companion mobile application.\r\n \r\n \r\n \r\n \r\n Users\r\n \r\n \r\n buildSimpleSelection({ ...e, name: e.firstName + ' ' + e.lastName }, handleToggleCheckedUser))}\r\n rightTitle=\"Included in Assessment\"\r\n rightSubtitle={`Showing ${selectedUsers.length} out of ${totalSelectedUsers}`}\r\n rightChildren={selectedUsers.map(e => buildSimpleSelection({ ...e, name: e.firstName + ' ' + e.lastName }, handleToggleCheckedUser))}\r\n onSelectAllLeft={(_, val) => handleCheckAllUnselectedUsers(val)}\r\n onSelectAllRight={(_, val) => handleCheckAllSelectedUsers(val)}\r\n onMoveLeft={() => handleSelectUsers(false)}\r\n onMoveRight={() => handleSelectUsers(true)}\r\n emptyRightMessage=\"Assign this assessment to specific crew members\"\r\n />\r\n \r\n \r\n \r\n User Groups\r\n \r\n \r\n buildSimpleSelection(e, handleToggleCheckedUserGroup))}\r\n rightTitle=\"Included in Assessment\"\r\n rightSubtitle={`Showing ${selectedUserGroups.length} out of ${totalSelectedUserGroups}`}\r\n rightChildren={selectedUserGroups.map(e => buildSimpleSelection(e, handleToggleCheckedUserGroup))}\r\n onSelectAllLeft={(_, val) => handleCheckAllUnselectedUserGroups(val)}\r\n onSelectAllRight={(_, val) => handleCheckAllSelectedUserGroups(val)}\r\n onMoveLeft={() => handleSelectUserGroups(false)}\r\n onMoveRight={() => handleSelectUserGroups(true)}\r\n emptyRightMessage=\"Assign this assessment to all crew members in a specific user group\"\r\n />\r\n \r\n \r\n \r\n {userGroupMsg}\r\n \r\n \r\n {usersMsg ? (\r\n \r\n \r\n {usersMsg}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildPageFour() {\r\n const isError = complianceTestLevels.some(level => level?.numQuestions > selectedQuestions.length || level?.numQuestions < 0 || level?.scoreRequirement > 100 || level?.scoreRequirement < 0);\r\n return (\r\n <>\r\n \r\n \r\n Edit Assessment Levels\r\n \r\n \r\n Assessment level description...\r\n \r\n \r\n \r\n \r\n Interval\r\n \r\n setMandatory(v)} />}\r\n label=\"Do you want this assessment to be made mandatory for completion on an interval? \"\r\n labelPlacement=\"start\"\r\n />\r\n \r\n (If not enabled the assigned crew members will still have access to this assessment but will not be forced to complete it by the system)\r\n \r\n \r\n \r\n \r\n \r\n No. Questions\r\n \r\n \r\n Assessments to score\r\n \r\n \r\n Score %\r\n \r\n {mandatory ? (\r\n \r\n Frequency\r\n \r\n ) : null}\r\n \r\n \r\n \r\n {complianceTestLevels.sort((a, b) => a.levelIndex - b.levelIndex).map(e => buildComplianceTestLevelEditor(e, mandatory))}\r\n \r\n
\r\n \r\n {errorText}\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildComplianceTestLevelEditor(assessmentLevel, mandatory) {\r\n const isBaseline = assessmentLevel?.levelIndex === 0;\r\n const isInvalidQuestionCount = assessmentLevel?.numQuestions > selectedQuestions.length || assessmentLevel?.numQuestions === 0;\r\n const isInvalidScorePercent = assessmentLevel?.scoreRequirement > 100 || assessmentLevel?.scoreRequirement < 0;\r\n\r\n return (\r\n \r\n \r\n {!isBaseline ? (\r\n handleDeleteAssessmentLevel(assessmentLevel?.levelIndex)}>\r\n \r\n \r\n ) : null}\r\n
\r\n {!isBaseline ? handleChangeAssessmentLevelPosition(assessmentLevel?.levelIndex, -1)}> : null}\r\n {complianceTestLevels.length - 1 !== assessmentLevel?.levelIndex ? (\r\n handleChangeAssessmentLevelPosition(assessmentLevel?.levelIndex, 1)}>\r\n ) : null}\r\n
\r\n
\r\n \r\n \r\n Level {assessmentLevel.levelIndex}\r\n \r\n \r\n \r\n \r\n {\r\n handleUpdateNewComplianceTestLevels(e, assessmentLevel?.levelIndex);\r\n if (isBaseline) {\r\n handleInput(e);\r\n }\r\n }}\r\n value={assessmentLevel?.numQuestions}\r\n name=\"numQuestions\"\r\n type=\"number\"\r\n required\r\n fullWidth\r\n size=\"small\"\r\n error={isInvalidQuestionCount}\r\n />\r\n \r\n \r\n handleUpdateNewComplianceTestLevels(e, assessmentLevel?.levelIndex)}\r\n value={assessmentLevel?.numPrevTestsToAccount}\r\n name=\"numPrevTestsToAccount\"\r\n type=\"number\"\r\n required\r\n fullWidth\r\n size=\"small\"\r\n />\r\n \r\n \r\n handleUpdateNewComplianceTestLevels(e, assessmentLevel?.levelIndex)}\r\n value={assessmentLevel?.scoreRequirement}\r\n name=\"scoreRequirement\"\r\n type=\"number\"\r\n required\r\n fullWidth\r\n size=\"small\"\r\n error={isInvalidScorePercent}\r\n />\r\n \r\n {mandatory ? (\r\n \r\n
\r\n {'Repeat '}\r\n handleAssessmentLevelCronInputs(e, assessmentLevel?.levelIndex)}\r\n value={testLevelCrons?.find(e => e.levelIndex === assessmentLevel?.levelIndex)?.repeatSelect}\r\n className=\"dropdownPicker\"\r\n disableUnderline\r\n >\r\n Weekly\r\n Monthly\r\n Yearly\r\n \r\n {' on '}\r\n {buildAssessmentLevelRepeatPatten(assessmentLevel?.levelIndex)}\r\n
\r\n
\r\n ) : null}\r\n
\r\n
\r\n );\r\n }\r\n\r\n function buildPageFive() {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n Assessment Name\r\n \r\n \r\n \r\n \r\n \r\n Icon\r\n \r\n \r\n \r\n \r\n \r\n Category\r\n \r\n \r\n \r\n {buildRecurrenceArea()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n Add/Edit Assessment\r\n {loading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n buildDialogContent()\r\n )}\r\n
\r\n\r\n {buildErrorDialog()}\r\n \r\n );\r\n}\r\n\r\nComplianceAddEditAssessment.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onDone: PropTypes.func.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n questionsArray: PropTypes.array.isRequired,\r\n usersArray: PropTypes.array.isRequired,\r\n userGroupsArray: PropTypes.array.isRequired,\r\n shipsArray: PropTypes.array.isRequired,\r\n assessment: PropTypes.object,\r\n categories: PropTypes.array,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport parser from 'cron-parser';\r\nimport moment from 'moment';\r\nimport { makeStyles, Card, CardContent, Typography, IconButton, Popover, Chip } from '@material-ui/core';\r\nimport { MoreVert } from '@material-ui/icons';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n assessmentItem: {\r\n position: 'relative',\r\n padding: '16px !important',\r\n backgroundColor: Colours.white,\r\n '& .assessment': {\r\n flexGrow: 1,\r\n [theme.breakpoints.down('xs')]: {\r\n marginRight: 30,\r\n },\r\n },\r\n '& .options': {\r\n position: 'absolute',\r\n right: 4,\r\n top: 4,\r\n },\r\n '& .categories': {\r\n display: 'block',\r\n '& .MuiChip-root': {\r\n margin: 2,\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n display: 'none',\r\n },\r\n },\r\n '& .totals': {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n '& .total': {\r\n marginTop: 8,\r\n marginRight: 16,\r\n },\r\n },\r\n popover: {\r\n '& .MuiPopover-paper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n '& .MuiButton-root': {\r\n textTransform: 'none',\r\n minWidth: 120,\r\n },\r\n '& .MuiButton-label': {\r\n justifyContent: 'flex-start',\r\n fontWeight: 400,\r\n },\r\n },\r\n}));\r\n\r\nexport function ComplianceAssessmentCard(props) {\r\n const { title, categories, totalQuestions, userCount, shipCount, children, cron, start, end } = props;\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const classes = useStyles(props);\r\n\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n function getUniqueCategories() {\r\n const cats = [];\r\n categories.forEach(e => {\r\n if (!cats.includes(e)) {\r\n cats.push(e);\r\n }\r\n });\r\n return cats;\r\n }\r\n\r\n function getNextDueDate() {\r\n if (isNullOrUndefined(cron)) {\r\n return 'Never';\r\n }\r\n const startDate = moment.utc(start);\r\n const endDate = moment.utc(end);\r\n const today = moment().utc();\r\n const workingDate = today.isBefore(endDate) ? (today.isAfter(startDate) ? today : startDate) : null;\r\n if (isNullOrUndefined(workingDate)) {\r\n return 'Never';\r\n }\r\n const options = {\r\n currentDate: workingDate.toDate(),\r\n endDate: endDate.toDate(),\r\n iterator: true,\r\n };\r\n try {\r\n const interval = parser.parseExpression(cron, options);\r\n const next = interval.next();\r\n const date = moment(next.value.toString()).format('D MMM YYYY');\r\n return date;\r\n } catch {\r\n return 'Never';\r\n }\r\n }\r\n\r\n const open = Boolean(anchorEl);\r\n const popoverId = open ? 'search-item-popover' : undefined;\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n {title}\r\n \r\n Asks {totalQuestions} question{totalQuestions > 1 ? 's' : ''} per assessment\r\n \r\n
\r\n
\r\n {getUniqueCategories().map(e => (\r\n \r\n ))}\r\n
\r\n
\r\n
\r\n \r\n Assigned Crew\r\n \r\n {userCount}\r\n
\r\n
\r\n \r\n Assigned Ships\r\n \r\n {shipCount}\r\n
\r\n
\r\n \r\n Next Due\r\n \r\n {getNextDueDate()}\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {children}\r\n \r\n \r\n );\r\n}\r\n\r\nComplianceAssessmentCard.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n categories: PropTypes.array.isRequired,\r\n totalQuestions: PropTypes.number.isRequired,\r\n userCount: PropTypes.number.isRequired,\r\n shipCount: PropTypes.number.isRequired,\r\n cron: PropTypes.string,\r\n start: PropTypes.string,\r\n end: PropTypes.string,\r\n children: PropTypes.any,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, Card, CardContent, Typography, IconButton, Popover, Chip } from '@material-ui/core';\r\nimport { MoreVert } from '@material-ui/icons';\r\nimport { Colours } from '../../helpers/Colours';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n questionItem: props => ({\r\n position: 'relative',\r\n display: 'flex',\r\n padding: '16px !important',\r\n backgroundColor: props.isArchived ? Colours.archived : Colours.white,\r\n '& .question': {\r\n flexGrow: 1,\r\n [theme.breakpoints.down('xs')]: {\r\n marginRight: 30,\r\n },\r\n },\r\n '& .categories': {\r\n width: 140,\r\n textAlign: 'right',\r\n marginRight: 30,\r\n '& .MuiChip-root': {\r\n margin: 2,\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n display: 'none',\r\n },\r\n },\r\n '& .options': {\r\n position: 'absolute',\r\n right: 4,\r\n top: 4,\r\n },\r\n '& .archived': {\r\n color: Colours.bodyText,\r\n },\r\n }),\r\n popover: {\r\n '& .MuiPopover-paper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n '& .MuiButton-root': {\r\n textTransform: 'none',\r\n minWidth: 120,\r\n },\r\n '& .MuiButton-label': {\r\n justifyContent: 'flex-start',\r\n fontWeight: 400,\r\n },\r\n },\r\n}));\r\n\r\nexport function ComplianceQuestionCard(props) {\r\n const { id, title, categories, isArchived, children } = props;\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const classes = useStyles(props);\r\n\r\n const handleClick = event => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n const popoverId = open ? 'search-item-popover' : undefined;\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n {isArchived ? (\r\n \r\n Archived\r\n \r\n ) : null}\r\n \r\n Q{id}\r\n \r\n {title}\r\n
\r\n
\r\n {categories.map(e => (\r\n \r\n ))}\r\n
\r\n {!isNullOrUndefined(children) ? (\r\n \r\n \r\n \r\n ) : null}\r\n
\r\n
\r\n \r\n {children}\r\n \r\n \r\n );\r\n}\r\n\r\nComplianceQuestionCard.propTypes = {\r\n id: PropTypes.any.isRequired,\r\n title: PropTypes.string.isRequired,\r\n isArchived: PropTypes.bool.isRequired,\r\n categories: PropTypes.array.isRequired,\r\n children: PropTypes.any,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button, Chip } from '@material-ui/core';\r\nimport { Autocomplete } from '@material-ui/lab';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport moment from 'moment';\r\n\r\nfunction QuestionTagRender(props) {\r\n const { assessments, questions, onClose, open } = props;\r\n const [tagAmount, setTagAmount] = React.useState(1);\r\n const [selectedAssessments, setSelectedAssessments] = React.useState([]);\r\n const [generatedCSV, setGeneratedCSV] = React.useState(null);\r\n\r\n // update fields with current user group info\r\n\r\n async function generateCsv() {\r\n const csvRows = ['Content Type,Data,qr code,Quantity,Question Id'];\r\n for (let i = 0; i < selectedAssessments.length; i++) {\r\n const assessment = selectedAssessments[i];\r\n const assessmentNFCQuestions = assessment.questions.filter(e => e.allowNFC);\r\n for (let k = 0; k < assessmentNFCQuestions.length; k++) {\r\n const question = questions.find(e => e.id === assessmentNFCQuestions[k].id);\r\n for (let j = 0; j < question.answers.length; j++) {\r\n const answer = question.answers[j];\r\n csvRows.push(`application/com.sentinimarine.cbt.answertag,${answer.id},${answer.id},${tagAmount},${question.id}`);\r\n }\r\n }\r\n }\r\n setGeneratedCSV(csvRows.join('\\n'));\r\n }\r\n\r\n return (\r\n \r\n Generate Question Tags Export\r\n \r\n \r\n \r\n {\r\n setTagAmount(Math.max(1, event.target.valueAsNumber));\r\n setGeneratedCSV(null);\r\n }}\r\n fullWidth\r\n variant=\"filled\"\r\n type=\"Number\"\r\n />\r\n \r\n \r\n e.questions.some(r => r.allowNFC))}\r\n getOptionLabel={e => e.title}\r\n getOptionSelected={e => selectedAssessments.some(r => r === e.id)}\r\n /*className={classes.selectArea}*/\r\n onChange={(_, values) => {\r\n setSelectedAssessments(values);\r\n setGeneratedCSV(null);\r\n }}\r\n value={selectedAssessments}\r\n placeholder=\"Search by Name\"\r\n filterSelectedOptions\r\n renderInput={params => }\r\n renderTags={(value, getTagProps) => value.map((option, index) => )}\r\n />\r\n \r\n \r\n {!isNullOrUndefined(generatedCSV) ? (\r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst QuestionTagExport = React.memo(QuestionTagRender, function areEqual(prevProps, currentProps) {\r\n return prevProps.open === currentProps.open;\r\n});\r\n\r\nexport default QuestionTagExport;\r\n\r\nQuestionTagRender.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n questions: PropTypes.array,\r\n assessments: PropTypes.array,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport QuestionController from '../../controllers/QuestionController';\r\nimport CompanyController from '../../controllers/CompanyController';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport ShipController from '../../controllers/ShipController';\r\nimport ComplianceController from '../../controllers/ComplianceController';\r\nimport { push } from 'connected-react-router';\r\nimport { connect } from 'react-redux';\r\nimport { Add } from '@material-ui/icons';\r\nimport { isNullOrUndefined, isNullOrWhitespace } from '../../helpers/Utils';\r\nimport {\r\n Box,\r\n Button,\r\n Chip,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n Divider,\r\n FilledInput,\r\n FormControl,\r\n FormHelperText,\r\n Grid,\r\n InputLabel,\r\n makeStyles,\r\n Select,\r\n TextField,\r\n Typography,\r\n} from '@material-ui/core';\r\nimport { ComplianceAddEditQuestion } from './ComplianceAddEditQuestion';\r\nimport { ComplianceAddEditAssessment } from './ComplianceAddEditAssessment';\r\nimport { ComplianceAssessmentCard } from './ComplianceAssessmentCard';\r\nimport { ComplianceQuestionCard } from './ComplianceQuestionCard';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { DarkMenuItem } from '../../components/Common/DarkMenuItem';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { CompanyRole, Role, ShipRole } from '../../helpers/Constants';\r\nimport { clearUploadUrls, readUploadUrls } from '../../helpers/UploadReader';\r\nimport { Autocomplete, Pagination } from '@material-ui/lab';\r\nimport QuestionTagExport from './QuestionTagExport';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n display: 'flex',\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n [theme.breakpoints.down('lg')]: {\r\n flexDirection: 'column',\r\n },\r\n },\r\n topArea: {\r\n paddingBottom: 8,\r\n minHeight: 88,\r\n '& .MuiButtonBase-root': {\r\n height: '100%',\r\n },\r\n },\r\n leftArea: {\r\n minWidth: '55%',\r\n },\r\n rightArea: {\r\n minWidth: '45%',\r\n marginLeft: 16,\r\n [theme.breakpoints.down('lg')]: {\r\n marginLeft: 0,\r\n marginTop: 16,\r\n },\r\n },\r\n searchWrapper: {\r\n flexGrow: 1,\r\n [theme.breakpoints.down('md')]: {\r\n width: 'calc(100% - 200px)',\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n width: '100%',\r\n },\r\n },\r\n categoryWrapper: {\r\n maxWidth: 200,\r\n width: 200,\r\n flexGrow: 1,\r\n [theme.breakpoints.down('xs')]: {\r\n maxWidth: 'unset',\r\n width: '100%',\r\n },\r\n },\r\n shipSelectArea: {\r\n padding: '16px 32px',\r\n },\r\n}));\r\n\r\nconst MAX_PER_PAGE = 20;\r\n\r\nfunction QuestionsPaneRender(props) {\r\n const {\r\n questions,\r\n questionCategory,\r\n questionSearch,\r\n questionCategories,\r\n questionShip,\r\n Auth,\r\n warning,\r\n setArchiveQuestionRef,\r\n setAddEditQuestionRef,\r\n setShowExcelModal,\r\n setShowQuestionExport,\r\n setRedirectUrl,\r\n handleInput,\r\n handelDelete,\r\n page,\r\n onChangePage,\r\n } = props;\r\n const classes = useStyles();\r\n\r\n const sortedQuestions = questions\r\n .filter(\r\n e =>\r\n (e.title + 'q' + e.id).toLowerCase().includes(questionSearch.toLowerCase()) &&\r\n (isNullOrWhitespace(questionCategory) || e.category.some(c => c.name.includes(questionCategory))) &&\r\n (isNullOrWhitespace(questionShip) || e.ships.some(c => c.id === questionShip))\r\n )\r\n .sort((a, b) => (a.isArchived + -b.isArchived === 0 ? parseInt(a.id) - parseInt(b.id) : a.isArchived + -b.isArchived));\r\n\r\n const totalPages = Math.ceil(sortedQuestions.length / MAX_PER_PAGE);\r\n\r\n function buildQuestionsTopArea() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Category\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildQuestionItem(question) {\r\n const { id, title, category, isArchived } = question;\r\n return (\r\n \r\n \r\n {Auth.companyRole === CompanyRole.Owner || Auth.role.includes(Role.Admin) ? (\r\n !isArchived ? (\r\n <>\r\n \r\n \r\n \r\n ) : (\r\n \r\n )\r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Questions\r\n \r\n \r\n {buildQuestionsTopArea()}\r\n {sortedQuestions.filter((_, i) => i < (page + 1) * MAX_PER_PAGE && i >= page * MAX_PER_PAGE).map(buildQuestionItem)}\r\n \r\n onChangePage(i - 1)} />\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst QuestionsPane = React.memo(QuestionsPaneRender, function areEqual(prevProps, currentProps) {\r\n return (\r\n prevProps.questions === currentProps.questions &&\r\n prevProps.questionCategory === currentProps.questionCategory &&\r\n prevProps.questionSearch === currentProps.questionSearch &&\r\n prevProps.questionCategories === currentProps.questionCategories &&\r\n prevProps.questionShip === currentProps.questionShip &&\r\n prevProps.ships === currentProps.ships &&\r\n prevProps.Auth === currentProps.Auth &&\r\n prevProps.warning === currentProps.warning &&\r\n prevProps.page === currentProps.page\r\n );\r\n});\r\nQuestionsPaneRender.propTypes = {\r\n questions: PropTypes.array,\r\n questionSearch: PropTypes.string,\r\n questionCategory: PropTypes.string,\r\n questionCategories: PropTypes.array,\r\n questionShip: PropTypes.string,\r\n ships: PropTypes.array,\r\n Auth: PropTypes.object,\r\n warning: PropTypes.string,\r\n setArchiveQuestionRef: PropTypes.func,\r\n setAddEditQuestionRef: PropTypes.func,\r\n setShowQuestionExport: PropTypes.func,\r\n setShowExcelModal: PropTypes.func,\r\n handelDelete: PropTypes.func,\r\n setRedirectUrl: PropTypes.func,\r\n handleInput: PropTypes.func,\r\n page: PropTypes.number,\r\n onChangePage: PropTypes.func,\r\n};\r\n\r\nfunction Compliance(props) {\r\n const { Auth, PushHistory } = props;\r\n const [selectedShip, setSelectedShip] = React.useState(null);\r\n const [questionSearch, setQuestionSearch] = React.useState('');\r\n const [questionCategory, setQuestionCategory] = React.useState('');\r\n const [questionPage, setQuestionPage] = React.useState(0);\r\n const [assessmentSearch, setAssessmentSearch] = React.useState('');\r\n const [assessmentCategory, setAssessmentCategory] = React.useState('');\r\n const [assessmentPage, setAssessmentPage] = React.useState(0);\r\n const [addEditQuestionRef, setAddEditQuestionRef] = React.useState(null);\r\n const [archiveQuestionRef, setArchvieQuestionRef] = React.useState(null);\r\n const [addEditAssessmentRef, setAddEditAssessmentRef] = React.useState(null);\r\n const [duplicateAssessmentRef, setDuplicateAssessmentRef] = React.useState(null);\r\n const [questionCategories, setQuestionCategories] = React.useState([]);\r\n const [questions, setQuestions] = React.useState([]);\r\n const [assessments, setAssessments] = React.useState([]);\r\n const [categories, setCategories] = React.useState([]);\r\n const [users, setUsers] = React.useState([]);\r\n const [userGroups, setUserGroups] = React.useState([]);\r\n const [ships, setShips] = React.useState([]);\r\n const [excelFile, setExcelFile] = React.useState('');\r\n const [selectedExcelShips, setSelectedExcelShips] = React.useState([]);\r\n const [showExcelModal, setShowExcelModal] = React.useState(false);\r\n const [showQuestionExport, setShowQuestionExport] = React.useState(false);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const [, updateState] = React.useState();\r\n const classes = useStyles();\r\n\r\n const selectedShipId = selectedShip === 'opt-all-ships' ? '' : selectedShip;\r\n\r\n const sortedAssessments = assessments\r\n .filter(\r\n e =>\r\n e.title.toLowerCase().includes(assessmentSearch.toLowerCase()) &&\r\n (isNullOrWhitespace(assessmentCategory) || e.linkedCatagories.filter(c => c.includes(assessmentCategory)).length > 0) &&\r\n (isNullOrWhitespace(selectedShipId) || e.linkedShips.some(r => r.includes(selectedShipId)))\r\n )\r\n .sort((a, b) => a.isArchived + -b.isArchived);\r\n\r\n const totalAssessmentPages = Math.ceil(sortedAssessments.length / MAX_PER_PAGE);\r\n\r\n const forceUpdate = React.useCallback(() => {\r\n updateState({});\r\n }, []);\r\n\r\n const loadQuestionCategories = React.useCallback(async companyId => {\r\n const response = await QuestionController.getCategories(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setQuestionCategories(response.data);\r\n }\r\n }, []);\r\n\r\n const loadQuestions = React.useCallback(async companyId => {\r\n const response = await QuestionController.getQuestions(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setQuestions(response.data);\r\n }\r\n }, []);\r\n\r\n const loadUsers = React.useCallback(async companyId => {\r\n const response = await CompanyController.getCompanyUsers(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUsers(response.data);\r\n }\r\n }, []);\r\n\r\n const loadUserGroups = React.useCallback(async companyId => {\r\n const response = await UserGroupController.getUserGroups(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(response.data);\r\n }\r\n }, []);\r\n\r\n const loadShips = React.useCallback(async companyId => {\r\n const response = await ShipController.getShips(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setShips(response.data.filter(e => e.companyId === companyId));\r\n }\r\n }, []);\r\n\r\n const loadAssessments = React.useCallback(async companyId => {\r\n const testsResponse = await ComplianceController.getComplianceTests(companyId);\r\n if (testsResponse.hasError) {\r\n setWarning(testsResponse.data);\r\n } else {\r\n const detailResponse = await ComplianceController.getComplianceTestsById(\r\n companyId,\r\n testsResponse.data.map(e => e.id)\r\n );\r\n if (detailResponse.hasError) {\r\n setWarning(detailResponse.data);\r\n } else {\r\n for (let i = 0; i < testsResponse.data.length; i++) {\r\n const assessmentDetail = detailResponse.data.find(e => e.id == testsResponse.data[i].id);\r\n testsResponse.data[i] = { ...testsResponse.data[i], ...assessmentDetail };\r\n }\r\n setAssessments(testsResponse.data);\r\n }\r\n }\r\n }, []);\r\n\r\n const loadCategories = React.useCallback(async companyId => {\r\n const response = await ComplianceController.getComplianceTestCategories(companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setCategories(response.data);\r\n }\r\n }, []);\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n const { companyId, isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n return;\r\n }\r\n await Promise.all([\r\n loadQuestionCategories(companyId),\r\n loadQuestions(companyId),\r\n loadUsers(companyId),\r\n loadUserGroups(companyId),\r\n loadShips(companyId),\r\n loadAssessments(companyId),\r\n loadCategories(companyId),\r\n ]);\r\n }\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }, [Auth, loadQuestionCategories, loadQuestions, loadUsers, loadUserGroups, loadShips, loadAssessments]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n function handleInput(event) {\r\n const { name, value, files } = event.target;\r\n switch (name) {\r\n case 'questionSearch':\r\n setQuestionSearch(value);\r\n setQuestionPage(0);\r\n break;\r\n case 'questionCategory':\r\n setQuestionCategory(value);\r\n setQuestionPage(0);\r\n break;\r\n case 'assessmentSearch':\r\n setAssessmentSearch(value);\r\n setAssessmentPage(0);\r\n break;\r\n case 'assessmentCategory':\r\n setAssessmentCategory(value);\r\n setAssessmentPage(0);\r\n break;\r\n case 'excelFile':\r\n clearUploadUrls();\r\n if (!isNullOrUndefined(files[0])) {\r\n setExcelFile(files[0]);\r\n readUploadUrls([files[0]], forceUpdate);\r\n } else {\r\n setExcelFile('');\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n async function handleAddQuestion(question) {\r\n await loadQuestionCategories(Auth.companyId);\r\n if (questions.filter(e => e.id === question.id).length > 0) {\r\n setQuestions(questions.map(e => (e.id === question.id ? question : e)));\r\n } else {\r\n setQuestions([...questions, question]);\r\n }\r\n }\r\n\r\n async function handleArchiveQuestion(tryDeletion = false) {\r\n setLoading(true);\r\n const { id } = archiveQuestionRef;\r\n const response = await QuestionController.archiveQuestion(Auth.companyId, id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setQuestions(questions.map(e => (e.id === id ? { ...e, isArchived: true } : e)));\r\n }\r\n if (tryDeletion) {\r\n return await handelDelete();\r\n }\r\n\r\n setArchvieQuestionRef(null);\r\n setLoading(false);\r\n }\r\n\r\n async function handelDelete(idOveride) {\r\n setLoading(true);\r\n let id = idOveride;\r\n if (!isNullOrUndefined(archiveQuestionRef)) {\r\n id = archiveQuestionRef.id;\r\n }\r\n const response = await QuestionController.deleteQuestion(Auth.companyId, id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setQuestions(questions.filter(e => e.id !== id));\r\n setArchvieQuestionRef(null);\r\n }\r\n setLoading(false);\r\n }\r\n\r\n function handleAddEditAssessment(newAssessment) {\r\n if (assessments.filter(e => e.id === newAssessment.id).length > 0) {\r\n setAssessments(assessments.map(e => (e.id === newAssessment.id ? newAssessment : e)));\r\n } else {\r\n setAssessments([...assessments, newAssessment]);\r\n }\r\n }\r\n\r\n async function handleDuplicateAssessment() {\r\n setLoading(true);\r\n const { id } = duplicateAssessmentRef;\r\n setDuplicateAssessmentRef(null);\r\n\r\n const assessmentResponse = await ComplianceController.getComplianceTest(Auth.companyId, id);\r\n if (assessmentResponse.hasError) {\r\n setWarning(assessmentResponse.data);\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n const { title, cronScheduling, start, end, allQuestions, questionCount, questions, ships, users, userGroups, categoryId, iconIndex } = assessmentResponse.data;\r\n const addResponse = await ComplianceController.addComplianceTest(\r\n Auth.companyId,\r\n title,\r\n iconIndex,\r\n categoryId,\r\n cronScheduling,\r\n start,\r\n end,\r\n allQuestions,\r\n questionCount,\r\n questions.map(e => ({ id: e.id, frequency: e.frequency })),\r\n ships.map(e => e.id),\r\n users.map(e => e.id),\r\n userGroups.map(e => e.id)\r\n );\r\n if (addResponse.hasError) {\r\n setWarning(addResponse.data);\r\n } else {\r\n setAssessments([...assessments, assessmentResponse.data]);\r\n }\r\n\r\n setLoading(false);\r\n }\r\n\r\n async function handleEditAssessment(id) {\r\n setLoading(true);\r\n const assessmentResponse = await ComplianceController.getComplianceTest(Auth.companyId, id);\r\n if (assessmentResponse.hasError) {\r\n setWarning(assessmentResponse.data);\r\n } else {\r\n setAddEditAssessmentRef(assessmentResponse.data);\r\n }\r\n setLoading(false);\r\n }\r\n\r\n async function handleImportExcel() {\r\n setLoading(true);\r\n setShowExcelModal(false);\r\n const response = await QuestionController.importFromExcel(Auth.companyId, excelFile, selectedExcelShips);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const { companyId } = Auth;\r\n\r\n await loadQuestions(companyId);\r\n await loadQuestionCategories(companyId);\r\n }\r\n handleCloseExcelDialog();\r\n setLoading(false);\r\n }\r\n\r\n function handleCloseExcelDialog() {\r\n clearUploadUrls();\r\n setExcelFile('');\r\n setShowExcelModal(false);\r\n setSelectedExcelShips([]);\r\n }\r\n\r\n function buildAssessmentPane() {\r\n return (\r\n \r\n \r\n \r\n Assessments\r\n \r\n \r\n {buildAssessmentTopArea()}\r\n {sortedAssessments.filter((_, i) => i < (assessmentPage + 1) * MAX_PER_PAGE && i >= assessmentPage * MAX_PER_PAGE).map(buildAssessmentItem)}\r\n \r\n setAssessmentPage(i - 1)} />\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildAssessmentTopArea() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Category\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildAssessmentItem(assessment) {\r\n const { id, title, linkedCatagories, questionCount, addedUserId, users, ships, cronScheduling, start, end } = assessment;\r\n const canEdit = Auth.role.includes(Role.Admin) || (Auth.shipRoles.includes(ShipRole.Captain) && addedUserId === Auth.id) || Auth.companyRole === CompanyRole.Owner;\r\n return (\r\n \r\n \r\n \r\n {canEdit ? : null}\r\n \r\n \r\n );\r\n }\r\n\r\n function buildArchiveQuestionDialog() {\r\n return (\r\n setArchvieQuestionRef(null)}>\r\n Archive Q{archiveQuestionRef?.id}\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildDuplicateAssessmentDialog() {\r\n return (\r\n setDuplicateAssessmentRef(null)}>\r\n Duplicate {duplicateAssessmentRef?.title}\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildExcelDialog() {\r\n return (\r\n handleCloseExcelDialog()}>\r\n Upload Question TSV\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Questions TSV\r\n \r\n \r\n \r\n \r\n setSelectedExcelShips(v)}\r\n className={classes.selectArea}\r\n options={ships.sort((a, b) => -b.name[0].toUpperCase().localeCompare(a.name[0].toUpperCase())).map(e => e.id)}\r\n groupBy={item => ships.find(e => e.id === item).name[0].toUpperCase()}\r\n getOptionLabel={item => ships.find(e => e.id === item).name}\r\n renderInput={params => }\r\n renderTags={(value, getTagProps) =>\r\n value.map((option, index) => {\r\n const name = ships.find(e => e.id === option).name;\r\n return ;\r\n })\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n\r\n \r\n \r\n Selected Ship\r\n \r\n {selectedShip === null ? You must select a ship before adding new compliance data : null}\r\n \r\n \r\n\r\n \r\n\r\n {selectedShip !== null ? (\r\n
\r\n
\r\n \r\n
\r\n
{buildAssessmentPane()}
\r\n
\r\n ) : null}\r\n\r\n setAddEditQuestionRef(null)}\r\n onDone={handleAddQuestion}\r\n categoriesArray={questionCategories}\r\n question={addEditQuestionRef}\r\n shipsArray={ships}\r\n />\r\n\r\n setAddEditAssessmentRef(null)}\r\n onDone={handleAddEditAssessment}\r\n assessment={addEditAssessmentRef}\r\n categoriesArray={questionCategories}\r\n categories={categories}\r\n questionsArray={questions.map(e => ({ ...e, checked: false, selected: false }))}\r\n usersArray={users.map(e => ({ ...e, checked: false, selected: false }))}\r\n userGroupsArray={userGroups.map(e => ({ ...e, checked: false, selected: false }))}\r\n shipsArray={ships.map(e => ({ ...e, checked: false, selected: false }))}\r\n />\r\n\r\n {buildArchiveQuestionDialog()}\r\n {buildDuplicateAssessmentDialog()}\r\n {buildExcelDialog()}\r\n {\r\n setShowQuestionExport(false);\r\n }}\r\n open={showQuestionExport}\r\n questions={questions}\r\n assessments={assessments}\r\n />\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Compliance);\r\n\r\nCompliance.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Grid, Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button } from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport QuestionController from '../../controllers/QuestionController';\r\n\r\nexport default function CategorysAddEdit(props) {\r\n const { category, open, onClose, onError, onDone, companyId } = props;\r\n const [name, setName] = React.useState('');\r\n\r\n const categoryExists = () => !isNullOrUndefined(category?.id);\r\n\r\n // update fields with current user group info\r\n React.useEffect(() => {\r\n setName(category?.name ?? '');\r\n }, [category]);\r\n\r\n async function handleSave(event) {\r\n event.preventDefault();\r\n onError(null);\r\n const response = categoryExists() ? await QuestionController.editCategories(companyId, category.id, name) : await QuestionController.addCategories(companyId, name);\r\n if (response.hasError) {\r\n onError(response.data);\r\n } else {\r\n onDone(response.data);\r\n }\r\n onClose();\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setName(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n Add/Edit Category\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nCategorysAddEdit.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onError: PropTypes.func.isRequired,\r\n onDone: PropTypes.func.isRequired,\r\n companyId: PropTypes.string.isRequired,\r\n category: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport QuestionController from '../../controllers/QuestionController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Add } from '@material-ui/icons';\r\nimport { makeStyles, Grid, Button, TextField, Dialog, DialogContent, DialogActions, DialogTitle } from '@material-ui/core';\r\nimport { SearchCardMini } from '../../components/Common/SearchCardMini';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport ComplianceCategoryAddEdit from './ComplianceCategoryAddEdit.js';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n },\r\n topArea: {\r\n paddingBottom: 8,\r\n '& .MuiButtonBase-root': {\r\n height: '100%',\r\n },\r\n },\r\n}));\r\n\r\nfunction ComplianceCategory(props) {\r\n const { Auth, PushHistory } = props;\r\n const [category, setCategory] = React.useState([]);\r\n const [nameSearch, setNameSearch] = React.useState('');\r\n const [deleteRef, setDeleteRef] = React.useState(null);\r\n const [addEditRef, setAddEditRef] = React.useState(null);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const classes = useStyles();\r\n\r\n const loadCategory = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await QuestionController.getCategories(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setCategory(response.data);\r\n }\r\n setLoading(false);\r\n }, [Auth]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch user groups for inital render\r\n async function init() {\r\n await loadCategory();\r\n }\r\n init();\r\n }, [Auth, loadCategory]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n function handleUpdateCategory(edited) {\r\n const { id } = edited;\r\n const exists = !isNullOrUndefined(category.filter(e => e.id === id)[0]);\r\n if (exists) {\r\n setCategory(category.map(e => (e.id === id ? edited : e)));\r\n } else {\r\n setCategory([...category, edited]);\r\n }\r\n }\r\n\r\n async function handleDeleteCategory() {\r\n setLoading(true);\r\n setWarning(null);\r\n const { id } = deleteRef;\r\n const response = await QuestionController.removeCategories(Auth.companyId, id);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setCategory(category.filter(e => e.id !== id));\r\n }\r\n setDeleteRef(null);\r\n setLoading(false);\r\n }\r\n\r\n function handleInput(event) {\r\n const { value, name } = event.target;\r\n switch (name) {\r\n case 'name':\r\n setNameSearch(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function buildTopArea() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildCategory(category) {\r\n const { id, name } = category;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildUsers() {\r\n if (isNullOrUndefined(category)) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {category.filter(e => e.name.includes(nameSearch)).map(buildCategory)}\r\n \r\n );\r\n }\r\n\r\n function buildConfirmDelete() {\r\n return (\r\n setDeleteRef(null)}>\r\n Delete Category\r\n Are you sure you want to perform this action?\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n {buildTopArea()}\r\n {buildUsers()}\r\n {buildConfirmDelete()}\r\n setAddEditRef(null)}\r\n onError={setWarning}\r\n onDone={handleUpdateCategory}\r\n category={addEditRef}\r\n companyId={Auth.companyId}\r\n />\r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ComplianceCategory);\r\n\r\nComplianceCategory.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport SentiniLogo from '../../images/fathom-final.png';\r\nimport BridgeImage from '../../images/bridge.png';\r\nimport AppStore from '../../images/app-store.png';\r\nimport GooglePlay from '../../images/google-play.png';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport UserController from '../../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { TextField, Button, Grid, Container, FormControlLabel, Checkbox, makeStyles, Typography } from '@material-ui/core';\r\nimport { checkPassword } from '../../helpers/Utils';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport { LogIn } from '../../stores/Actions/Authentication';\r\nimport { AuthLayout } from '../../components/Auth/AuthLayout';\r\nimport { Link } from 'react-router-dom';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n formRoot: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n },\r\n logo: {\r\n marginBottom: 32,\r\n maxWidth: 300,\r\n },\r\n storeLink: {\r\n display: 'inline-block',\r\n width: '50%',\r\n '& img': {\r\n WebkitBoxShadow: '0px 0px 2px 0px rgba(0,0,0,0.6)',\r\n boxShadow: '0px 0px 2px 0px rgba(0,0,0,0.6)',\r\n borderRadius: 12,\r\n maxWidth: 160,\r\n margin: 6,\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n width: '100%',\r\n },\r\n },\r\n}));\r\n\r\nfunction Register(props) {\r\n const { userName, token } = queryString.parse(props.location.search);\r\n const [password, setPassword] = React.useState('');\r\n const [passwordConfirmation, setPasswordConfirmation] = React.useState('');\r\n const [acceptsTerms, setAcceptsTerms] = React.useState(false);\r\n const [passwordRequirements, setPasswordRequirements] = React.useState(null);\r\n const [passwordErrors, setPasswordErrors] = React.useState([]);\r\n const [submitting, setSubmitting] = React.useState(false);\r\n const [warningText, setWarningText] = React.useState(null);\r\n const [completeRegistration, setCompleteRegistration] = React.useState(false);\r\n const classes = useStyles();\r\n\r\n // initialise\r\n React.useEffect(() => {\r\n async function init() {\r\n const pwordReqResponse = await UserController.getPasswordRequirements();\r\n if (!pwordReqResponse.hasError) {\r\n setPasswordRequirements(pwordReqResponse.data);\r\n } else {\r\n setWarningText('Failed to fetch password requirements');\r\n }\r\n }\r\n init();\r\n }, []);\r\n\r\n async function handleSubmit(event) {\r\n event.preventDefault();\r\n setSubmitting(true);\r\n setWarningText(null);\r\n\r\n if (!acceptsTerms) {\r\n setWarningText('You must confirm you have read and agree to the Terms of Service and Privacy Policy');\r\n setSubmitting(false);\r\n return;\r\n }\r\n\r\n if (password !== passwordConfirmation) {\r\n setWarningText('Password and confirmation do not match');\r\n setSubmitting(false);\r\n return;\r\n }\r\n\r\n const response = await UserController.registerMagicLink(userName, token, password, false);\r\n if (!response.hasError) {\r\n setCompleteRegistration(true);\r\n } else {\r\n setWarningText(response.data);\r\n setSubmitting(false);\r\n }\r\n }\r\n\r\n function handleInput(event) {\r\n const { name, value, checked } = event.target;\r\n switch (name) {\r\n case 'password':\r\n setPassword(value);\r\n break;\r\n case 'passwordConfirmation':\r\n setPasswordConfirmation(value);\r\n break;\r\n case 'acceptsTerms':\r\n setAcceptsTerms(checked);\r\n break;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n async function checkPasswordIsValid() {\r\n setPasswordErrors(checkPassword(passwordRequirements, password));\r\n }\r\n\r\n function buildPasswordErrors() {\r\n if (passwordErrors.length === 0) {\r\n return null;\r\n }\r\n return passwordErrors.map((e, i) => (\r\n \r\n {e}\r\n
\r\n
\r\n ));\r\n }\r\n\r\n function buildFormContent() {\r\n if (completeRegistration) {\r\n return null;\r\n }\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n checkPasswordIsValid()}\r\n helperText={buildPasswordErrors()}\r\n variant=\"filled\"\r\n fullWidth\r\n />\r\n \r\n \r\n \r\n \r\n \r\n }\r\n label={\r\n \r\n I have read and agree to the{' '}\r\n \r\n Terms of Service\r\n {' '}\r\n and{' '}\r\n \r\n Privacy Policy\r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n function buildCompleteForm() {\r\n if (!completeRegistration) {\r\n return null;\r\n }\r\n return (\r\n \r\n \r\n \r\n Registration Complete\r\n \r\n \r\n You can now login to the app using the email and password provided, or click the button below to be taken to the administration login.\r\n \r\n \r\n \r\n \r\n Download the mobile app here\r\n \r\n \r\n \r\n \r\n \"App\r\n \r\n \r\n \"Google\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n \"Sentini\r\n {buildFormContent()}\r\n {buildCompleteForm()}\r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n LogIn: data => dispatch(LogIn(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Register);\r\n\r\nRegister.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n LogIn: PropTypes.func,\r\n location: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport SentiniLogo from '../../images/fathom-final.png';\r\nimport BridgeImage from '../../images/bridge.png';\r\nimport AppStore from '../../images/app-store.png';\r\nimport GooglePlay from '../../images/google-play.png';\r\nimport { makeStyles, Button, Grid, Container, Typography } from '@material-ui/core';\r\nimport { AuthLayout } from '../../components/Auth/AuthLayout';\r\nimport { Link } from 'react-router-dom';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n logo: {\r\n marginBottom: 20,\r\n maxWidth: '100%',\r\n },\r\n storeLink: {\r\n display: 'inline-block',\r\n width: '50%',\r\n '& img': {\r\n WebkitBoxShadow: '0px 0px 2px 0px rgba(0,0,0,0.6)',\r\n boxShadow: '0px 0px 2px 0px rgba(0,0,0,0.6)',\r\n borderRadius: 12,\r\n maxWidth: 160,\r\n margin: 6,\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n width: '100%',\r\n },\r\n },\r\n}));\r\n\r\nexport default function NoAccess() {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \"Sentini\r\n \r\n \r\n \r\n Sorry, you do not have sufficient permissions to access the administrators' portal\r\n \r\n \r\n \r\n \r\n Please download the CBT mobile app instead\r\n \r\n \r\n \r\n \r\n \"App\r\n \r\n \r\n \"Google\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport QuestionController from '../../controllers/QuestionController';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n wrapper: {\r\n padding: '16px 32px',\r\n [theme.breakpoints.down('xs')]: {\r\n padding: 16,\r\n },\r\n },\r\n}));\r\n\r\nfunction QuestionsPlainText(props) {\r\n const { Auth, PushHistory } = props;\r\n const [questions, setQuestions] = React.useState([]);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n const classes = useStyles();\r\n\r\n const loadAllQuestions = React.useCallback(async () => {\r\n setLoading(true);\r\n const response = await QuestionController.getAllQuestions(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n const questions = [...response.data];\r\n questions.sort((a, b) => a.id - b.id);\r\n setQuestions(questions);\r\n }\r\n setLoading(false);\r\n }, [Auth]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch ships for inital render\r\n async function init() {\r\n await loadAllQuestions();\r\n }\r\n init();\r\n }, [Auth, loadAllQuestions]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n function buildQuestionItem(question) {\r\n const { id, title, answers } = question;\r\n return (\r\n
  • \r\n Q{id} : {title}\r\n
      \r\n {answers.map(e => (\r\n
    1. {e.title}
    2. \r\n ))}\r\n
    \r\n
  • \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n \r\n \r\n
      {questions.map(buildQuestionItem)}
    \r\n
    \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(QuestionsPlainText);\r\n\r\nQuestionsPlainText.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Box, Collapse, Divider, IconButton, makeStyles, TableCell, TableRow, Typography } from '@material-ui/core';\r\nimport { isNullOrUndefined } from '../../helpers/Utils';\r\nimport { Add, Remove } from '@material-ui/icons';\r\nimport { Colours } from '../../helpers/Colours';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n tableRow: {\r\n '& > *': {\r\n borderBottom: 'none',\r\n },\r\n '&.open': {\r\n backgroundColor: Colours.archived,\r\n },\r\n },\r\n}));\r\n\r\nfunction OverviewTableItem({ mainCells, mainCellLength, childTitle, childContent }) {\r\n const [open, setOpen] = React.useState(false);\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n setOpen(!open)} disabled={isNullOrUndefined(childContent) || childContent.length === 0}>\r\n {!open ? : }\r\n \r\n \r\n {mainCells}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {childTitle}\r\n \r\n {childContent}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(OverviewTableItem);\r\n\r\nOverviewTableItem.propTypes = {\r\n mainCells: PropTypes.node,\r\n mainCellLength: PropTypes.number,\r\n childTitle: PropTypes.node,\r\n childContent: PropTypes.any,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { Card, makeStyles, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TableSortLabel } from '@material-ui/core';\r\nimport { descendingComparator, isNullOrUndefined, scoreToPercentage } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport ComplianceController from '../../controllers/ComplianceController';\r\nimport OverviewTableItem from './OverviewTableItem';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\nimport { Exposure } from '@material-ui/icons';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n wrapper: {\r\n maxHeight: '100vh',\r\n },\r\n table: {\r\n maxHeight: '100vh',\r\n '& th': {\r\n fontWeight: 'bold',\r\n },\r\n '& .btn-cell': {\r\n paddingRight: 8,\r\n },\r\n },\r\n card: {\r\n '& .MuiTableBody-root': {\r\n '& :last-child': {\r\n '& > *': {\r\n border: 'none',\r\n },\r\n },\r\n },\r\n },\r\n}));\r\n\r\nfunction OverviewQuestions(props) {\r\n const { Auth, PushHistory } = props;\r\n const { shipId, userId } = queryString.parse(props.location.search);\r\n const [questions, setQuestions] = React.useState([]);\r\n const [userGroups, setUserGroups] = React.useState([]);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n //Sorting\r\n const [orderRow, setOrderRow] = React.useState('totalAnswered');\r\n const [orderDirection, setOrderDirection] = React.useState('desc');\r\n\r\n const classes = useStyles();\r\n\r\n const loadQuestionOverview = React.useCallback(async () => {\r\n const response = await ComplianceController.getQuestionOverview(Auth.companyId, shipId, userId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setQuestions(response.data);\r\n }\r\n }, [Auth, shipId, userId]);\r\n\r\n const loadUserGroups = React.useCallback(async () => {\r\n const response = await UserGroupController.getUserGroups(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(response.data);\r\n }\r\n }, [Auth]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch ships for inital render\r\n async function init() {\r\n await Promise.all([loadQuestionOverview(), loadUserGroups()]);\r\n }\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }, [Auth, loadQuestionOverview, loadUserGroups]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n const handelSortChange = React.useCallback(\r\n newSort => {\r\n if (newSort === orderRow) {\r\n if (orderDirection === 'desc') {\r\n setOrderDirection('asc');\r\n } else {\r\n setOrderDirection('desc');\r\n }\r\n return;\r\n }\r\n setOrderRow(newSort);\r\n setOrderDirection('desc');\r\n },\r\n [orderRow, orderDirection, setOrderDirection, setOrderRow]\r\n );\r\n\r\n function getComparator(order, orderBy) {\r\n switch (orderBy) {\r\n case 'id':\r\n return order === 'desc' ? (a, b) => idDescendingComparator(a, b) : (a, b) => -idDescendingComparator(a, b);\r\n default:\r\n return order === 'desc' ? (a, b) => descendingComparator(a, b, orderBy) : (a, b) => -descendingComparator(a, b, orderBy);\r\n }\r\n }\r\n\r\n function idDescendingComparator(a, b) {\r\n const aComp = Number(a.id);\r\n const bComp = Number(b.id);\r\n if (bComp < aComp) {\r\n return -1;\r\n }\r\n if (bComp > aComp) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n function buildTableHead() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n handelSortChange('id')}>\r\n Question Number\r\n \r\n \r\n \r\n handelSortChange('title')}>\r\n Title\r\n \r\n \r\n \r\n handelSortChange('totalAnswered')}>\r\n Total Answered\r\n \r\n \r\n \r\n handelSortChange('correctlyAnswered')}\r\n >\r\n Correct Answers\r\n \r\n \r\n \r\n handelSortChange('incorrectlyAnswered')}\r\n >\r\n Incorrect Answers\r\n \r\n \r\n \r\n handelSortChange('correctionPercentage')}\r\n >\r\n Correct Percentage\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildQuestionRow(question) {\r\n const { id, title, totalAnswered, correctlyAnswered, incorrectlyAnswered, correctionPercentage, userGroupePerformance } = question;\r\n return (\r\n \r\n Q{id}\r\n {title}\r\n {totalAnswered}\r\n {correctlyAnswered}\r\n {incorrectlyAnswered}\r\n {scoreToPercentage(correctionPercentage, 1)}%\r\n \r\n }\r\n mainCellLength={6}\r\n childTitle=\"User Groups\"\r\n childContent={\r\n \r\n \r\n \r\n \r\n Title\r\n Total Answered\r\n Correct Answers\r\n Incorrect Answers\r\n Correct Percentage\r\n \r\n \r\n \r\n {userGroupePerformance.map((userGroup, i) => (\r\n \r\n {userGroups.find(e => e.id === userGroup.title)?.name ?? 'No Name'}\r\n {userGroup.totalAnswered}\r\n {userGroup.correctlyAnswered}\r\n {userGroup.incorrectlyAnswered}\r\n {scoreToPercentage(userGroup.correctionPercentage, 1)}%\r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n }\r\n />\r\n );\r\n }\r\n\r\n function buildRows() {\r\n const comparator = getComparator(orderDirection, orderRow);\r\n\r\n return (\r\n questions\r\n ?.sort((a, b) => {\r\n return comparator(a, b, orderRow);\r\n })\r\n .map(buildQuestionRow) ?? <>\r\n );\r\n }\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n {buildTableHead()}\r\n {buildRows()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(OverviewQuestions);\r\n\r\nOverviewQuestions.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n location: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { makeStyles, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TableSortLabel } from '@material-ui/core';\r\nimport { descendingComparator, isNullOrUndefined, scoreToPercentage } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport ComplianceController from '../../controllers/ComplianceController';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n wrapper: {\r\n maxHeight: '100vh',\r\n },\r\n table: {\r\n maxHeight: '100vh',\r\n '& th': {\r\n fontWeight: 'bold',\r\n },\r\n },\r\n}));\r\n\r\nfunction OverviewAssessments(props) {\r\n const { Auth, PushHistory } = props;\r\n const { shipId } = queryString.parse(props.location.search);\r\n const [assessments, setAssessments] = React.useState([]);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n //Sorting\r\n const [orderRow, setOrderRow] = React.useState('totalAnswered');\r\n const [orderDirection, setOrderDirection] = React.useState('desc');\r\n\r\n const classes = useStyles();\r\n\r\n const loadAssessmentOverview = React.useCallback(async () => {\r\n const response = await ComplianceController.getAssessmentOverview(Auth.companyId, shipId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setAssessments(response.data);\r\n }\r\n }, [Auth, shipId]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch ships for inital render\r\n async function init() {\r\n await loadAssessmentOverview();\r\n }\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }, [Auth, loadAssessmentOverview]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n const handelSortChange = React.useCallback(\r\n newSort => {\r\n if (newSort === orderRow) {\r\n if (orderDirection === 'desc') {\r\n setOrderDirection('asc');\r\n } else {\r\n setOrderDirection('desc');\r\n }\r\n return;\r\n }\r\n setOrderRow(newSort);\r\n setOrderDirection('desc');\r\n },\r\n [orderRow, orderDirection, setOrderDirection, setOrderRow]\r\n );\r\n\r\n function buildTableHead() {\r\n return (\r\n \r\n \r\n \r\n handelSortChange('title')}>\r\n Assessment\r\n \r\n \r\n \r\n handelSortChange('totalAnswered')}>\r\n Total Questions Answered\r\n \r\n \r\n \r\n handelSortChange('correctlyAnswered')}\r\n >\r\n Correct Answers\r\n \r\n \r\n \r\n handelSortChange('incorrectlyAnswered')}\r\n >\r\n Incorrect Answers\r\n \r\n \r\n \r\n handelSortChange('totalMissed')}>\r\n Missed Assessments\r\n \r\n \r\n \r\n handelSortChange('correctionPercentage')}\r\n >\r\n Avg. Score\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildAssessmentRow(question) {\r\n const { id, title, totalAnswered, correctlyAnswered, incorrectlyAnswered, correctionPercentage, totalMissed } = question;\r\n return (\r\n \r\n {title}\r\n {totalAnswered}\r\n {correctlyAnswered}\r\n {incorrectlyAnswered}\r\n {totalMissed}\r\n {scoreToPercentage(correctionPercentage, 1)}%\r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n {buildTableHead()}\r\n \r\n {assessments\r\n ?.sort((a, b) => {\r\n return orderDirection === 'desc' ? descendingComparator(a, b, orderRow) : -descendingComparator(a, b, orderRow);\r\n })\r\n .map(buildAssessmentRow) ?? <>}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(OverviewAssessments);\r\n\r\nOverviewAssessments.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n location: PropTypes.object,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport queryString from 'query-string';\r\nimport { connect } from 'react-redux';\r\nimport { push } from 'connected-react-router';\r\nimport { makeStyles, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TableSortLabel } from '@material-ui/core';\r\nimport { descendingComparator, isNullOrUndefined, scoreToPercentage } from '../../helpers/Utils';\r\nimport { LoadingOverlay } from '../../components/Common/LoadingOverlay';\r\nimport { Alert } from '../../components/Common/Alert';\r\nimport ComplianceController from '../../controllers/ComplianceController';\r\nimport UserGroupController from '../../controllers/UserGroupController';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n wrapper: {\r\n maxHeight: '100vh',\r\n },\r\n table: {\r\n maxHeight: '100vh',\r\n '& th': {\r\n fontWeight: 'bold',\r\n },\r\n },\r\n}));\r\n\r\nfunction OverviewUserGroups(props) {\r\n const { Auth, PushHistory } = props;\r\n const { shipId } = queryString.parse(props.location.search);\r\n const [userGroupStats, setUserGroupStats] = React.useState([]);\r\n const [userGroups, setUserGroups] = React.useState([]);\r\n const [redirectUrl, setRedirectUrl] = React.useState(null);\r\n const [warning, setWarning] = React.useState(null);\r\n const [loading, setLoading] = React.useState(true);\r\n //Sorting\r\n const [orderRow, setOrderRow] = React.useState('totalAnswered');\r\n const [orderDirection, setOrderDirection] = React.useState('desc');\r\n const classes = useStyles();\r\n\r\n const loadUserGroupOverview = React.useCallback(async () => {\r\n const response = await ComplianceController.getUserGroupsOverview(Auth.companyId, shipId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroupStats(response.data);\r\n }\r\n }, [Auth, shipId]);\r\n\r\n const loadUserGroups = React.useCallback(async () => {\r\n const response = await UserGroupController.getUserGroups(Auth.companyId);\r\n if (response.hasError) {\r\n setWarning(response.data);\r\n } else {\r\n setUserGroups(response.data);\r\n }\r\n }, [Auth]);\r\n\r\n // init & auth check\r\n React.useEffect(() => {\r\n // ensure user is signed in\r\n const { isAuthenticated, isLoggingIn } = Auth;\r\n if (!isAuthenticated && !isLoggingIn) {\r\n setRedirectUrl('/Login');\r\n }\r\n // fetch ships for inital render\r\n async function init() {\r\n await Promise.all([loadUserGroupOverview(), loadUserGroups()]);\r\n }\r\n setLoading(true);\r\n init().then(() => setLoading(false));\r\n }, [Auth, loadUserGroupOverview, loadUserGroups]);\r\n\r\n // redirect\r\n React.useEffect(() => {\r\n if (!isNullOrUndefined(redirectUrl)) {\r\n PushHistory(redirectUrl);\r\n }\r\n }, [redirectUrl, PushHistory]);\r\n\r\n const handelSortChange = React.useCallback(\r\n newSort => {\r\n if (newSort === orderRow) {\r\n if (orderDirection === 'desc') {\r\n setOrderDirection('asc');\r\n } else {\r\n setOrderDirection('desc');\r\n }\r\n return;\r\n }\r\n setOrderRow(newSort);\r\n setOrderDirection('desc');\r\n },\r\n [orderRow, orderDirection, setOrderDirection, setOrderRow]\r\n );\r\n\r\n function getComparator(order, orderBy) {\r\n switch (orderBy) {\r\n case 'title':\r\n return order === 'desc' ? (a, b) => titleDescendingComparator(a, b) : (a, b) => -titleDescendingComparator(a, b);\r\n default:\r\n return order === 'desc' ? (a, b) => descendingComparator(a, b, orderBy) : (a, b) => -descendingComparator(a, b, orderBy);\r\n }\r\n }\r\n\r\n function titleDescendingComparator(a, b) {\r\n const aComp = userGroups.find(e => e.id === a.title)?.name ?? 'No Name';\r\n const bComp = userGroups.find(e => e.id === b.title)?.name ?? 'No Name';\r\n if (bComp < aComp) {\r\n return -1;\r\n }\r\n if (bComp > aComp) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n function buildTableHead() {\r\n return (\r\n \r\n \r\n \r\n handelSortChange('title')}>\r\n Title\r\n \r\n \r\n \r\n handelSortChange('totalAnswered')}>\r\n Total Questions Answered\r\n \r\n \r\n \r\n handelSortChange('correctlyAnswered')}\r\n >\r\n Correct Answers\r\n \r\n \r\n \r\n handelSortChange('incorrectlyAnswered')}\r\n >\r\n Incorrect Answers\r\n \r\n \r\n \r\n handelSortChange('totalMissed')}>\r\n Missed Assessments\r\n \r\n \r\n \r\n handelSortChange('correctionPercentage')}\r\n >\r\n Avg. Score\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n function buildAssessmentRow(question) {\r\n const { id, title, totalAnswered, correctlyAnswered, incorrectlyAnswered, correctionPercentage, totalMissed } = question;\r\n return (\r\n \r\n {userGroups.find(e => e.id === title)?.name ?? 'No Name'}\r\n {totalAnswered}\r\n {correctlyAnswered}\r\n {incorrectlyAnswered}\r\n {totalMissed}\r\n {scoreToPercentage(correctionPercentage, 1)}%\r\n \r\n );\r\n }\r\n\r\n function buildRows() {\r\n const comparator = getComparator(orderDirection, orderRow);\r\n return (\r\n userGroupStats\r\n ?.sort((a, b) => {\r\n return comparator(a, b, orderRow);\r\n })\r\n .map(buildAssessmentRow) ?? <>\r\n );\r\n }\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n {buildTableHead()}\r\n {buildRows()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n PushHistory: data => dispatch(push(data)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(OverviewUserGroups);\r\n\r\nOverviewUserGroups.propTypes = {\r\n Auth: PropTypes.object,\r\n PushHistory: PropTypes.func,\r\n location: PropTypes.object,\r\n};\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport UserController from '../controllers/UserController';\r\nimport { connect } from 'react-redux';\r\nimport { Route, Switch } from 'react-router';\r\nimport { Layout } from '../domain/Layout/Layout';\r\nimport { LogIn, LogOut } from '../stores/Actions/Authentication';\r\nimport { IndexedDB } from '../helpers/IndexedDB';\r\nimport { isNullOrUndefined } from '../helpers/Utils';\r\nimport { PrivateRoute } from '../components/Common/PrivateRoute';\r\nimport { Role } from '../helpers/Constants';\r\n\r\n// Pages\r\nimport Login from '../domain/Auth/Login';\r\nimport Logout from '../domain/Auth/Logout';\r\nimport FileManager from '../domain/User/FileManager';\r\nimport Users from '../domain/Users/Users';\r\nimport Profile from '../domain/User/Profile';\r\nimport PasswordChange from '../domain/User/PasswordChange';\r\nimport EmailConfirm from '../domain/User/EmailConfirm';\r\nimport EmailChange from '../domain/User/EmailChange';\r\nimport EmailChangeConfirm from '../domain/User/EmailChangeConfirm';\r\nimport PasswordForgot from '../domain/User/PasswordForgot';\r\nimport PasswordReset from '../domain/User/PasswordReset';\r\nimport TwoFactorManager from '../domain/User/TwoFactorManager';\r\nimport TwoFactorVerify from '../domain/User/TwoFactorVerify';\r\nimport NotFound from '../domain/Error/NotFound';\r\nimport NotificationList from '../domain/User/NotificationList';\r\nimport Dashboard from '../domain/Dashboard/Dashboard';\r\nimport UsersGroups from '../domain/Users/UsersGroups';\r\nimport Fleet from '../domain/Fleet/Fleet';\r\nimport Company from '../domain/Company/Company';\r\nimport Compliance from '../domain/Compliance/Compliance';\r\nimport ComplianceCategory from '../domain/Compliance/ComplianceCategory';\r\nimport Register from '../domain/Auth/Register';\r\nimport NoAccess from '../domain/Auth/NoAccess';\r\nimport QuestionsPlainText from '../domain/Compliance/QuestionsPlainText';\r\nimport OverviewQuestions from '../domain/Dashboard/OverviewQuestions';\r\nimport OverviewAssessments from '../domain/Dashboard/OverviewAssessments';\r\nimport OverviewUserGroups from '../domain/Dashboard/OverviewUserGroups';\r\n\r\nclass App extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.initTokenStore(props);\r\n }\r\n\r\n initTokenStore = async props => {\r\n // initialise local data store\r\n const init = await IndexedDB.init();\r\n if (init.hasError) {\r\n console.warn(init.data);\r\n return;\r\n }\r\n // check if existing token is valid\r\n if (await UserController.hasTokenExpired()) {\r\n props.LogOut();\r\n return;\r\n }\r\n // check for existing token\r\n const userData = await UserController.fetchCachedUserData();\r\n if (userData.hasError) {\r\n console.warn(userData.data);\r\n props.LogOut();\r\n return;\r\n }\r\n // save cached data if any\r\n const { userName, role, companyId, companyRole, shipRoles, id } = userData.data;\r\n if (!isNullOrUndefined(userName)) {\r\n props.LogIn({\r\n userName,\r\n role,\r\n isLoggingIn: false,\r\n isAuthenticated: true,\r\n companyId,\r\n companyRole,\r\n shipRoles,\r\n id,\r\n });\r\n } else {\r\n props.LogOut();\r\n }\r\n };\r\n\r\n render() {\r\n if (this.props.Auth.isLoggingIn) {\r\n return
    ;\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n Auth: state.Authentication,\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n LogIn: data => dispatch(LogIn(data)),\r\n LogOut: () => dispatch(LogOut()),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(App);\r\n\r\nApp.propTypes = {\r\n Auth: PropTypes.object,\r\n LogIn: PropTypes.func,\r\n LogOut: PropTypes.func,\r\n};\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\nexport default function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log('This web app is being served cache-first by a service ' + 'worker. To learn more, visit https://bit.ly/CRA-PWA');\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log('New content is available and will be used when all ' + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.');\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","const AUTH_INITIAL_STATE = {\r\n id: null,\r\n isAuthenticated: false,\r\n userName: '',\r\n role: [],\r\n isLoggingIn: true,\r\n companyId: null,\r\n companyRole: null,\r\n shipRoles: [],\r\n};\r\n\r\nconst Authentication = (state = AUTH_INITIAL_STATE, action) => {\r\n switch (action.type) {\r\n case 'LOGGED_IN':\r\n return Object.assign({}, state, action.data);\r\n case 'LOGGED_OUT':\r\n return Object.assign({}, state, {\r\n id: null,\r\n isAuthenticated: false,\r\n userName: '',\r\n role: [],\r\n isLoggingIn: false,\r\n companyId: null,\r\n companyRole: null,\r\n shipRoles: [],\r\n });\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default Authentication;\r\n","const NOTIFS_INITIAL_STATE = [];\r\n\r\nconst Notifications = (state = NOTIFS_INITIAL_STATE, action) => {\r\n switch (action.type) {\r\n case 'ADD_NOTIF':\r\n return [action.item, ...state];\r\n case 'ADD_NOTIFS':\r\n return [...action.items, ...state];\r\n case 'MARK_AS_READ':\r\n return state.map(e => (e.id === action.id ? { markedAsRead: true, ...e } : e));\r\n case 'MARK_ALL_AS_READ':\r\n return state.map(e => {\r\n return { markedAsRead: true, ...e };\r\n });\r\n case 'CLEAR_ALL_NOTIFS':\r\n return NOTIFS_INITIAL_STATE;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default Notifications;\r\n","const { userGroupsCache, shipsCache, usersCache, companyComplianceCache, assessmentComplianceCache, shipComplianceCache, userComplianceCache } = window?.history?.state ?? {};\r\n\r\nconst DASHBOARD_INITIAL_STATE = {\r\n companyCompliance: companyComplianceCache ?? [],\r\n assessmentCompliance: assessmentComplianceCache ?? [],\r\n shipCompliance: shipComplianceCache ?? [],\r\n userCompliance: userComplianceCache ?? [],\r\n ships: shipsCache ?? [],\r\n shipUsers: usersCache ?? [],\r\n userGroups: userGroupsCache ?? [],\r\n};\r\n\r\nconst DASHBOARD_CLEAR_STATE = {\r\n companyCompliance: [],\r\n assessmentCompliance: [],\r\n shipCompliance: [],\r\n userCompliance: [],\r\n ships: [],\r\n shipUsers: [],\r\n userGroups: [],\r\n};\r\n\r\nconst Dashboard = (state = DASHBOARD_INITIAL_STATE, action) => {\r\n switch (action.type) {\r\n case 'SET_COMPANY_COMPLIANCE':\r\n return { ...state, companyCompliance: action.items };\r\n case 'SET_SHIP_COMPLIANCE':\r\n return { ...state, shipCompliance: { ...state.shipCompliance, ...action.items } };\r\n case 'SET_USER_COMPLIANCE':\r\n return { ...state, userCompliance: { ...state.userCompliance, ...action.items } };\r\n case 'SET_ASSESSMENT_COMPLIANCE':\r\n return { ...state, assessmentCompliance: { ...state.assessmentCompliance, ...action.items } };\r\n case 'SET_SHIPS':\r\n return { ...state, ships: action.items };\r\n case 'SET_SHIP_USERS':\r\n return { ...state, shipUsers: action.items };\r\n case 'SET_USER_GROUPS':\r\n return { ...state, userGroups: action.items };\r\n case 'INITIALISE_STORE':\r\n return DASHBOARD_CLEAR_STATE;\r\n case 'LOGGED_OUT':\r\n return DASHBOARD_INITIAL_STATE;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default Dashboard;\r\n","const { shipsCache } = window?.history?.state ?? {};\r\n\r\nconst FLEET_INITIAL_STATE = {\r\n ships: shipsCache ?? [],\r\n};\r\n\r\nconst Fleet = (state = FLEET_INITIAL_STATE, action) => {\r\n switch (action.type) {\r\n case 'SET_SHIPS':\r\n return { ...state, ships: action.items };\r\n case 'LOGGED_OUT':\r\n return FLEET_INITIAL_STATE;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default Fleet;\r\n","const { usersCache } = window?.history?.state ?? {};\r\n\r\nconst USERS_INITIAL_STATE = {\r\n users: usersCache ?? [],\r\n};\r\n\r\nconst Users = (state = USERS_INITIAL_STATE, action) => {\r\n switch (action.type) {\r\n case 'SET_USERS':\r\n return { ...state, users: action.items };\r\n case 'LOGGED_OUT':\r\n return USERS_INITIAL_STATE;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default Users;\r\n","import { createBrowserHistory } from 'history';\r\nimport { applyMiddleware, compose, createStore } from 'redux';\r\nimport { routerMiddleware } from 'connected-react-router';\r\nimport combineReducers from '../Store';\r\n\r\nexport const history = createBrowserHistory();\r\n\r\nexport default function configureStore(preloadedState) {\r\n const store = createStore(\r\n combineReducers(history), // root reducer with router state\r\n preloadedState,\r\n compose(applyMiddleware(routerMiddleware(history)))\r\n );\r\n\r\n return store;\r\n}\r\n","import './app/Polyfill';\r\nimport 'pwacompat';\r\nimport App from './app/App';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport registerServiceWorker from './app/ServiceWorker';\r\nimport configureStore, { history } from './stores/Reducers/History';\r\nimport { Provider } from 'react-redux';\r\nimport { ConnectedRouter } from 'connected-react-router';\r\nimport { MuiThemeProvider, createMuiTheme, CssBaseline } from '@material-ui/core';\r\nimport { Colours } from './helpers/Colours';\r\n\r\nconst store = configureStore();\r\nconst rootElement = document.getElementById('root');\r\nconst theme = createMuiTheme({\r\n typography: {\r\n fontFamily: '\"Open Sans\", \"Helvetica\", \"Arial\", sans-serif',\r\n fontSize: 14,\r\n fontWeightLight: 300,\r\n fontWeightRegular: 400,\r\n fontWeightMedium: 500,\r\n allVariants: {\r\n color: Colours.black,\r\n },\r\n body1: {\r\n color: Colours.bodyText,\r\n },\r\n body2: {\r\n color: Colours.bodyText,\r\n },\r\n },\r\n palette: {\r\n primary: {\r\n main: Colours.primary,\r\n },\r\n secondary: {\r\n main: Colours.secondary,\r\n contrastText: Colours.white,\r\n },\r\n },\r\n status: {\r\n danger: 'red',\r\n },\r\n props: {\r\n MuiButton: {\r\n disableElevation: true,\r\n },\r\n },\r\n});\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n rootElement\r\n);\r\n\r\nregisterServiceWorker();\r\n","import { combineReducers } from 'redux';\r\nimport { connectRouter } from 'connected-react-router';\r\nimport Authentication from './Reducers/Authentication';\r\nimport Notifications from './Reducers/Notifications';\r\nimport Dashboard from './Reducers/Dashboard';\r\nimport Fleet from './Reducers/Fleet';\r\nimport Users from './Reducers/Users';\r\n\r\nexport default history =>\r\n combineReducers({\r\n router: connectRouter(history),\r\n Authentication,\r\n Notifications,\r\n Dashboard,\r\n Fleet,\r\n Users,\r\n });\r\n","module.exports = __webpack_public_path__ + \"static/media/fathom-final.eba3cc9d.png\";","module.exports = __webpack_public_path__ + \"static/media/bridge.14f41685.png\";","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}