{"version":3,"file":"main.de9d18400ab78b82.js","mappings":"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,QAAmC,IAAjB0wB,EAAM1wB,SACjDtF,KAAKy3C,oBAAoBzhB,EAAMA,MAGlC,CAEQyhB,oBAAoBC,GAC3B13C,KAAKmhB,KAAKw2B,IAAI,IACN33C,KAAKsnC,SAASuO,kBAAkBpiC,KAAmB,CACzDzS,KAAM,CAAEkK,QAASwsC,EAAKj9B,UAAWhH,YACjCqiC,WAAY,WACZjtB,SAAUpV,OAGb,wCAtBY8jC,GAAgBtiC,qDAAhBsiC,EAAgBhrC,QAAhBgrC,EAAgB,qBAFhB,wBCkBN,MAAMK,2CAAS,0BAATA,EAASC,WAFTtC,kCAND,CACV,CAAEuC,QAAS7iC,MAAc8iC,SAAUR,GACnC,CAAEO,QAAStjC,KAAgCwjC,SAAU,CAAEC,WAAY,YACnE,CAAEH,QAASzyB,KAAmB0yB,SAAUf,EAAqBkB,OAAO,GACpE,CAAEJ,QAASzyB,KAAmB0yB,SAAUrB,EAAmBwB,OAAO,IAClEpiC,SANSqiC,KAAe9C,EAAkB+C,KAAyBC,IAAchzB,iBCR/EizB,iBACHrjC,SAGDkjC,OACEI,gBAAgBX,GAChBhD,MAAO9e,GAAQG,QAAQD,MAAMF,GAAI,kBCdnC,OACA,aACA,gBACA,WACA,eACA,kBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,cACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,eACA,kBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,YACA,eACA,mBACA,sBACA,kBACA,qBACA,aACA,gBACA,aACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,iBACA,oBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,cACA,iBACA,aACA,gBACA,cACA,iBACA,cACA,kBACA,qBACA,iBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,mBACA,sBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,oBAIA,cACA,WACA,WACA,CACA,cACA,cACA,8CACA,gCACA3P,CACA,CACA,WACA,CACAqyB,kBACA,qBACA,EACAA,YACAC,YACAD","names":["displayMessages","header","body","BdidNotFoundComponent","constructor","sessionStore","router","route","this","ngOnInit","isAuthenticatedAndReady$","subscribe","isAuth","navigate","assignErrorCodeValue","errorCode","snapshot","queryParamMap","get","errorMsg","_angular_core__WEBPACK_IMPORTED_MODULE_1__","selectors","_angular_core__WEBPACK_IMPORTED_MODULE_0__","ConfirmDialog","data","dialogRef","confirm","close","actionConfirmed","emit","cancel","_angular_material_dialog__WEBPACK_IMPORTED_MODULE_1__","ctx","DdosListComponent","DialogComponent","DdosToggleButtonDirective","renderer","el","ngAfterViewInit","activeElement","nativeElement","querySelector","onClick","event","target","localName","classList","contains","value","innerHTML","toUpperCase","replaceAll","addClass","removeClass","className","element","_angular_core__WEBPACK_IMPORTED_MODULE_2__","LoaderComponent","loaderStore","hasRequestsInProgress$","httpProgress$","PageNotFoundComponent","errorMessage","url","_src_app_routing_constants__WEBPACK_IMPORTED_MODULE_0__","navigateToPortal","PropertyGetterPipe","transform","object","keyName","pure","DurationPipe","durationString","_src_app_stores_report_mitigation_mitigation_converter__WEBPACK_IMPORTED_MODULE_0__","InnerHtmlPipe","sanitizer","htmlString","bypassSecurityTrustHtml","SearchDateFilterComponent","d","statusFormGroupValue","statusFormGroup","isBeforeNow","moment__WEBPACK_IMPORTED_MODULE_0___default","isSameOrBefore","isAfterMinStartDate","minStartDate","isSameOrAfter","endDate","startDate","end","isBetween","add","onStatusChange","status","name","patchValue","checked","resetEndDateOnOngoing","checkEnableRecent","enableRecent","isOngoing","ongoing","isRecent","recent","enable","onlySelf","disable","format","convertToBooleanInput","_angular_core__WEBPACK_IMPORTED_MODULE_4__","SearchWizardAlertComponent","wizardService","rxjs__WEBPACK_IMPORTED_MODULE_5__","wizardType","templateType","alertSearchWizardForm","context","configureAlertWizardElements","ngOnDestroy","destroy$","next","unsubscribe","initAvailableValues","valueChanges","pipe","rxjs__WEBPACK_IMPORTED_MODULE_6__","rxjs__WEBPACK_IMPORTED_MODULE_7__","rxjs__WEBPACK_IMPORTED_MODULE_8__","rxjs__WEBPACK_IMPORTED_MODULE_9__","rxjs__WEBPACK_IMPORTED_MODULE_10__","prevForm","nextForm","lodash__WEBPACK_IMPORTED_MODULE_1__","checkFormChanges","alertSeverity","getAlertSeverityLevels","alertType","getAlertTypesDropdowns","alertClassification","getAlertClassificationDropdowns","availableStatuses","getStatus","statusStart","getStatusByType","statusEnd","alertMaxTrafficImpact","getAlertTrafficUnitsDropDowns","alertMaxSeverityLowBoundPercent","getAlertSeverityPercentDropdownsByType","alertMaxSeverityHighBoundPercent","minAlertStartDate","subtract","toLocaleString","hideSearchString","search","searchString","form","maxSeverityPercent","highValue","lowValue","updateAlertValidators","controls","maxImpactAlertTraffic","alertStatus","updateValueAndValidity","searchButtonDisabled","valid","_angular_material_dialog__WEBPACK_IMPORTED_MODULE_11__","SearchWizardMitigationComponent","mitigationSearchForm","configureMitigationWizardElements","mitigationIpVersion","getMitigationIpVersions","mitigationType","getMitigationTypes","minMitigationStartDate","toString","mitigationSearch","mitigationSearchString","mitigationStatus","DDOS_CONFIRM_DIALOG_DEFAULT_CONFIGS","width","disableClose","DDOS_CONFIRM_DIALOG_NO_DATA","title","message","confirmActionText","closable","DDOS_CONFIRM_DIALOG_INVALID_ERROR","DDOS_CONFIRM_DIALOG_FORBIDDEN_ERROR","ConfirmDialogService","dialog","openConfirmDialog","config","closeAll","open","_confirm_dialog_confirm_component__WEBPACK_IMPORTED_MODULE_0__","Object","dialogInstances","push","getDialogInstances","closeDialog","closeAllDialogs","forEach","hasActiveDialogs","length","factory","SearchWizardAlertService","_src_app_stores_report_traffic_traffic_model__WEBPACK_IMPORTED_MODULE_0__","getAlertTypeDropdowns","getItemsPerPage","type","setAlertStatusFormValues","selectedStatus","_src_app_stores_alert_alert_model__WEBPACK_IMPORTED_MODULE_1__","disableEndStatus","enableEndStatus","controlGroup","newValidators","_angular_forms__WEBPACK_IMPORTED_MODULE_2__","setValidators","setAlertClassificationOptions","alertClassificationOptions","defaultAlertClassification","generateSearchWizardForm","disabled","alertItemsPerPage","severity","high","medium","low","isStart","isEnd","start","startTime","endTime","lowHighValueUnits","getSearchQuery","_a","size","_b","importanceHigh","_c","importanceMedium","_d","importanceLow","_e","_f","toLowerCase","classification","_g","onGoing","_h","_j","startBeforeOrAfter","_k","_l","endBeforeOrAfter","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","lowThreshold","_x","highThreshold","_y","thresholdUnit","_z","lowSeverityPercent","_0","highSeverityPercent","_1","SearchWizardMitigationService","setMinMitigationStartDate","mitigationMinStartDate","getMinMitigationStartDate","generateMitigationSearchWizardForm","_angular_forms__WEBPACK_IMPORTED_MODULE_1__","mitigationItemsPerPage","ipVersion","ipv4","ipv6","flowspec","notFlowspec","DdosRadioButtonDirective","ngOnChanges","changes","selected","currentValue","elementClass","fesm2015_core","AlertToAlertPipe","alertKeyObject","alertId","assert","objects","AlertToAlertsPipe","keys","map","k","sidebar_component","shell_component","ddos_toggle_button_directive","timer_component","search_wizard_alert_component","search_wizard_mitigation_component","search_date_filter_component","table_component","loader_component","ddos_list_component","page_not_found_component","bdid_not_found_component","confirm_component","dialog_component","snackbar_component","data_property_getter_pipe","inner_html_pipe","duration_pipe","MODULES","common","toolbar","icon","layout","fesm2015_button","sidenav","list","menu","card","expansion","form_field","input","snack_bar","fesm2015_forms","button_toggle","fesm2015_checkbox","fesm2015_select","divider","datepicker","core","tabs","table","paginator","sort","chips","scrolling","tooltip","progress_spinner","progress_bar","fesm2015_radio","ngx_mat_timepicker","SharedModule","imports","_angular_core__WEBPACK_IMPORTED_MODULE_7__","ShellComponent","navigationStore","globalGetsStore","confirmDialogService","_app_stores_common_model__WEBPACK_IMPORTED_MODULE_1__","user$","currentCompany$","assignedCompanies$","tabItems$","globalGetsDone$","loadUserData","beforeReload$","reload","saveCurrentCompany","onCustomerSelectionChange","changeCompanyId","onLogout","endSession","openArborPortalModal","arborDialog","cancelActionText","subscribeToArborModalConfirm","componentInstance","saveCurrentSettings","currentCompany","arborModalSub","window","_src_environments_environment__WEBPACK_IMPORTED_MODULE_0__","SidebarComponent","cd","rxjs__WEBPACK_IMPORTED_MODULE_2__","sidebarItems","items","sidebarStarted","_sidebarItems","setInitialActiveElement","events","rxjs__WEBPACK_IMPORTED_MODULE_3__","_angular_router__WEBPACK_IMPORTED_MODULE_4__","captureTopNavTrafficEvent","setActiveElement","currentItem","s","isActive","path","children","desactivateChildren","detectChanges","setActiveChildElement","childRouteItem","childrenActivated","c","onRouteClick","item","then","onChildRouteClick","trackByItems","_index","currentElement","getElementByUrl","filter","childElement","menuElements","find","includes","topNavigationFound","trafficAnalyticsElement","SNACKBAR_TYPE","SUCCESS","snackBarDuration","SnackbarComponent","snackRef","getIcon","snackType","ERROR","getClass","dismiss","_angular_material_snack_bar__WEBPACK_IMPORTED_MODULE_1__","_angular_core__WEBPACK_IMPORTED_MODULE_3__","ctx_r12","$event","ctx_r16","DEFAULT_PAGINATION_SIZES","DdosTableTableComponent","_angular_material_table__WEBPACK_IMPORTED_MODULE_4__","_angular_cdk_collections__WEBPACK_IMPORTED_MODULE_5__","row","sortHeaderId","formatDateForSorting","formatDurationForSorting","Number","dataSource","_","_simpleSearchText","_flatPlainObjectFilterJson","filterObject","_src_app_utils_key_object__WEBPACK_IMPORTED_MODULE_7__","matched","entries","every","key","filterValue","dataValue","some","matSort","tblDataSource","defaultPageSize","_defaultPageSize","matPaginator","pageSize","_changePageSize","firstPage","_data","_tableHasBeenInitialized","initDataSource","columns","tblColumns","flatPlainObjectFilterJson","searchText","selection","changed","_destroy$","onSelectRow","initTableColumns","initialized","tblHeaders","tableColumn","columnName","rowActionIcon","rowActionSingleIcon","Array","isArray","rowActionIconList","isSelectable","rowActionMenu","sortingDataAccessor","showPaginate","filterPredicate","connect","asObservable","rawDate","formattedDate","date","splittedDate","split","year","set","rawDuration","formattedDuration","test","duratioWithDays","padStart","slice","join","hasData","getIconColor","iconOptions","dataKeyIconColor","isAllSelected","toggleAllRows","clear","select","sortTable","sortParameters","active","column","dataKey","emitRowAction","rowAction","actionIcon","rowValue","hasIdLink","onRowClick","onPaginatorChange","page","paginatorEvent","_angular_material_paginator__WEBPACK_IMPORTED_MODULE_9__","_angular_material_sort__WEBPACK_IMPORTED_MODULE_10__","TimerComponent","zone","datePipe","systemTimezone","zoneAbbr","UTCTimezone","runOutsideAngular","setInterval","setProperty","currentTimeElRef1","Date","toUTCString","now","currentTime","currentTimeElRef","AppLayoutRouting","TrafficLayoutRouting","HOME","TabsForReactiveUser","ZONES","ADMIN","REPORTS","MITIGATION_REPORT","TabsForRegularUser","TRAFFIC","ALERT_REPORT","TrafficSidebarsForRegularUser","parent","BYAPP","BYUDP","BYTCP","BYTOPDEST","ALERTS","MITIGATIONS","ReportSidebarsForRegularUser","IP_UNDER_PIM","PIM","NON_PIM_CMO","NON_PIM","IP_MONITORED","BILLING_REPORT","getAdminDataSources","liaisonKeyObject","liaison","firstName","lastName","liaisonID","company","companyName","email","cellPhone","businessPhone","sendNotifications","disableActionIcon","_admin_model__WEBPACK_IMPORTED_MODULE_0__","getAdminDataSource","getLiaisonContractKeyObject","response","_src_app_utils_key_object__WEBPACK_IMPORTED_MODULE_1__","dataObject","liaisonList","US_STATES","ADMIN_CONTACT_ACTION_ICON","EDIT","ADMIN_CONTACT_ACTION_ICONS","DELETE","AdminStore","http","liaisonContactKeyObject$","liaisonContactKeyObjectSub","liaisonContactKeyObject","defaultContactZone$","defaultContactZoneSub","defaultContactZone","findLiaisonContractById","liaisonContactId","getLiaisonContacts","getLiaisonCustomerDetailsUrl","_src_app_stores_api_urls__WEBPACK_IMPORTED_MODULE_0__","_src_app_utils_assert__WEBPACK_IMPORTED_MODULE_4__","companyID","e","snapshotKeys","_admin_converter__WEBPACK_IMPORTED_MODULE_1__","getContactByBdId","bdId","getContactByBdIdUrl","replace","checkExistingBdid","bdid","values","contact","loginId","createLiaisonContact","payload","createLiaisonContactUrl","post","ddosResponse","updateLiaisonContact","liaisonId","updateLiaisonContactUrl","put","deleteLiaisonCustomer","deleteLiaisonCustomerUrl","delete","_angular_core__WEBPACK_IMPORTED_MODULE_9__","formatBits","bits","decimals","dm","i","Math","floor","log","parseFloat","toFixed","getFormatAlert","alert","days","hours","minutes","alertStartAt","parseAlertTimeStamps","duration","measureAlertDuration","alertEndAt","timeDifference","diff","abs","seconds","alertStartAtFormatted","_common_utils__WEBPACK_IMPORTED_MODULE_2__","alertDuration","modifiedEndTime","endTimeFormat","createAlertTitle","params","defaultZoneName","direction","targetIPAddress","alertOwnedBy","misuseTypes","alertTypeModified","charAt","substring","parseAlertType","alertTitle","createAlertDetailTitle","moName","getAlertTitle","impactBps","severityPercent","severityThreshold","impBps","findMaxTimeSeriesItem","prev","current","average","fetchTopMisuse","alertDetails","dataset","dataSets","reduce","generateTrafficDatasets","alertDatasetItem","topMisUseDataset","alertDataset","currentDatasetValue","currentTopMisuseValue","dataSetItemPercent","dataSetName","dataSetItem","itemName","datasetValue","getAlertCharacterizations","maxDatasetItem","flat","generateStackedLineChartData","limit","datasets","chartLabels","traffic","dataSet","sortedItems","a","b","alertStartTime","getTime","timeseries","_value","j","color","random","label","backgroundColor","fill","generateTotalStackedLineChartData","alertDetail","timeseriesTotalValues","getChartLabels","getAlertTrafficDatasets","trafficDatasets","datasetItems","datasetItem","dataSetItems","getElementsEqualToValue","array","getImportanceAlertChartDatasets","alerts","startOf","toISOString","timeSlots","highImportance","mediumImportance","lowImportance","chartDatasets","lastSixMonthsAlerts","alertDate","alertMonth","month","alertsOnMonth","borderColor","getAlertKeyInformation","severityUnit","impactPps","importance","_utils_assert__WEBPACK_IMPORTED_MODULE_3__","maxSeverity","topMisuseType","maxImpact","directions","misuseType","managedObject","getAlertKeyObject","_src_app_utils_key_object__WEBPACK_IMPORTED_MODULE_4__","alertData","ALL_VALUE","BPS_VALUE","BYTESPS_VALUE","BEFORE_VALUE","AFTER_VALUE","AlertStatusEnum","DDOS_TITLE_TYPE","ONGOING","TA_DROPDOWN_ALERTS_DISPLAYS","ALL","RECENT","TA_DROPDOWN_ALERT_CLASSES","id","TA_ALERT_TABLE_COLUMNS","sortArrowPosition","isSortable","isTextFilter","isLink","columnNameIcon","columnNameIconColor","dataKeyIcon","isFilterable","isInnerHtmlString","MISSING_ROUTE_DATA","AlertStore","dialogService","location","alertKeyObject$","alertKeyObjectSub","alertDetailKeyObject$","alertDetailKeyObjectSub","alertDetailKeyObject","alertsUpdateEvent$","alertsUpdateEvent","defaultZoneName$","defaultZoneNameSub","changeAlertStatusFilter","alertStatusFilter","_alert_model__WEBPACK_IMPORTED_MODULE_2__","resetAlertsSnapshot","filterAlert","filterOnImportanceLevel","filterOnStatus","filterOnAlertType","filterOnClassification","filterOnLowAndHighTrafficThreshold","filterOnLowAndHighSeverityThresholdPercent","filterOnBeforeOrAfterStartAndEndTime","filterStartBeforeOrAfter","filterEndBeforeOrAfter","filterStartDate","filterEndDate","filterStartTime","filterEndTime","currentSnapshotKeys","dateformat","alertStartFormatted","moment_moment__WEBPACK_IMPORTED_MODULE_5___default","alertEndFormatted","toObject","filterStartFormatted","filterEndFormatted","alertStartTimFormatted","_src_app_utils_assert__WEBPACK_IMPORTED_MODULE_10__","importanceLevels","sortAlerts","compare","localeCompare","aKey","bKey","removeAlertFromSnapshot","getAlerts","refresh","getCustomerAlertReportUrl","request","rxjs__WEBPACK_IMPORTED_MODULE_11__","rxjs__WEBPACK_IMPORTED_MODULE_12__","rxjs__WEBPACK_IMPORTED_MODULE_13__","_common_utils__WEBPACK_IMPORTED_MODULE_4__","_alert_converter__WEBPACK_IMPORTED_MODULE_3__","region","currentCompanyDetail","site","currentCompanySite","intervalAlertsSub","rxjs__WEBPACK_IMPORTED_MODULE_14__","_common_model__WEBPACK_IMPORTED_MODULE_1__","rxjs__WEBPACK_IMPORTED_MODULE_15__","rxjs__WEBPACK_IMPORTED_MODULE_16__","getAlertsByPeriod","alertKey","_app_stores_report_billing_billing_converter__WEBPACK_IMPORTED_MODULE_6__","getAlertDetails","queryParams","unit","getCustomerAlertByIdUrl","err","_app_components_shared_services_dialog_confirm_dialog_service__WEBPACK_IMPORTED_MODULE_7__","error","console","afterClosed","goBack","back","Error","_angular_core__WEBPACK_IMPORTED_MODULE_17__","COMPANY_ID","REQUEST_ID","ORDER_SSPP_GUID","LIAISON_ID","FILENAME","BDID","getApiUrl","requestPath","companyId","_environments_environment__WEBPACK_IMPORTED_MODULE_0__","_src_app_utils_assert__WEBPACK_IMPORTED_MODULE_1__","customerUrl","customerWithRequiredCompanyIdUrl","adminWithRequiredCompanyIdUrl","knowledgeBaseDocsUrl","LOGOUT_URL","GET_CONTACT_BY_BDID","GET_REQUEST_DETAILS","GET_CUSTOMER_COMPANY_INFO","GET_CUSTOMER_DETAILS","GET_TRAFFIC_INFO","CUSTOMER_ALERTS","CUSTOMER_ALERT_BY_ID","ONGOING_MITIGATION_REPORT","MITIGATION_SUMMARY_REPORT","GET_BILLING_REPORT","GET_NETWORK_CONNECTIONS","ADD_NETWORK_CONNECTIONS","BULK_UPDATE_NETWORK_CONNECTIONS","MITIGATION_BY_ACTION","KNOWLEDGE_BASE_DOCS","UPLOAD_KNOWLEDGE_BASE_DOC","DOWNLOAD_KNOWLEDGE_BASE_DOC","CUSTOMER_DETAILS_BY_LIAISONS","CREATE_LIAISON","DELETE_LIAISONS","UPDATE_LIAISONS","AppLayoutStore","rxjs__WEBPACK_IMPORTED_MODULE_4__","isReady","buildTabItemsByOfferType","_angular_router__WEBPACK_IMPORTED_MODULE_5__","currentCompanyDetail$","buildSidebarMenuItems","regularUserSidebarItems$","sidebarsSub","regularUserSidebarItems","tabsSub","tabItems","OfferType","currentRoute","sidebars","CompanyOfferType","ServiceType","updateDelay","ReturnCode","isSucceededResponse","returnCode","buildFilterOptions","Set","r","addPropertiesToEachObject","obj","props","newObj","objKey","formatDataNumberSize","bitsToBytes","sizes","bytes","newSizes","tickYCallback","tick","_array","selectedUnit","negative","formatUnits","dateFormat","isSame","dateFormatRange","getColorVariant","index","GlobalGetsStore","alertStore","mitigationStore","adminStore","globalGetsObservables","mitigationKeyObject$","syncedStatusNetworkConnectionKeyObjects$","mitigation","syncedNetworkStatus","offerType","_common_model__WEBPACK_IMPORTED_MODULE_0__","globalGetsDoneSub","firstLoad","companyDetailSub","getMitigations","getSyncedMitigationStatus","globalGetsDone","_angular_core__WEBPACK_IMPORTED_MODULE_8__","LoaderStore","rxjs__WEBPACK_IMPORTED_MODULE_0__","httpProgressSub","httpProgress","increaseRemoteCallCount","count","decreaseRemoteCallCount","getContractedHours","sites","flatMap","levels","level","planDescription","match","parseInt","getContractHoursFromPlanDescription","acc","cur","getPlanName","planName","shift","getBillingReportTimeRange","period","pastMonth","endOf","pastYearMonth","getMitigationReports","mitigations","mitigationName","ipDiverisonData","attackStartDate","_common_utils__WEBPACK_IMPORTED_MODULE_1__","attackEndDate","_mitigation_mitigation_converter__WEBPACK_IMPORTED_MODULE_2__","resources","getMitigationReport","getBillingReports","billingReportData","customerName","getBillingReport","getCmoReports","cmoKeyObject","cmoList","cmoName","cmoIp","getCmoReport","getIpMonitorReport","connection","networkAddress","protectedZones","networkType","serviceType","agnosticType","getAlertReport","getNetworkConnectionDataSource","networkConnectionKeyObject","allKeys","zoneKey","network","netConnectionID","siteNameSSPP","mitigationReady","mitigationPending","action","disableMitigation","getMitigationDisplayData","isValidDate","isValid","getMitigationStatusForNetworkAddress","calculateOneMinAvg","samples","calculateFiveMinAvg","fiveMinSamples","max","sum","calculateSummaryAvg","ratesTotal","calculatePercentDropped","passAvg","dropAvg","total","calculateTotalAvg","formatBytes","units","formattedValue","dropUnitKey","calculateAverages","trafficUtilSummData","typeValues","drop","pass","rate","groupSamplesByTypeAndUnit","oneMinDropAvg","oneMinPassAvg","oneMinuteTotalAvg","oneMinPercentDropped","fiveMinDropAvg","fiveMinPassAvg","fiveMinuteTotalAvg","fiveMinPercentDropped","summaryDropAvg","summaryPassAvg","percentDropped","totalAvg","oneMinAvg","fiveMinAvg","summaryAvg","totalUtilization","trafficDropped","trafficPassed","totalTraffic","percentageDropped","calculateTotalMitigationHours","mitigationStartRange","mitigationEndRange","totalHours","previousEndDate","uniqueItems","newItem","getUniqueItems","endOfDay","valueOf","isAfter","getMitigationSummary","mitigationRates","mitigationID","alertID","formatTimeStamp","timestamp","mode","protectionPrefixes","zoneName","formatMitigationDuration","mitigationDuration","resultDuration","durationArr","getMitigationDataSource","portPrefixes","_common_utils__WEBPACK_IMPORTED_MODULE_3__","user","cspUserIdStart","isMitigationPim","highlightRow","link","_src_app_routing_constants__WEBPACK_IMPORTED_MODULE_2__","getNetworkConnectionKeyObjects","networkConnectionList","netAddressDetailList","remain","tslib__WEBPACK_IMPORTED_MODULE_5__","_src_app_utils_key_object__WEBPACK_IMPORTED_MODULE_6__","getCMOKeyObjects","isPim","cmo","pimIndicator","pim","cmoIpList","getNonPIMCOMKeyObjects","getPIMCOMKeyObjects","getMitigationKeyObject","mitigationsWithId","mitigationList","getUpdateNetworkConnections","siteID","circuitTier","n","arecordAssignmentIP","ipType","getMitigationRate","MitigationStore","snackbar","_src_app_stores_common_model__WEBPACK_IMPORTED_MODULE_3__","syncedStatusNetworkConnectionKeyObjects","ongoingMitigations$","_networkConnectionKeyObjects$","res","ongoingMitigations","networks","syncOngoingMitigationNetworkConnectionsStatus","mitigationKeyObjectSub","mitigationKeyObject","mitigationRateKeyObject$","mitigationRateKeyObjectSub","mitigationRateKeyObject","mitigationsUpdateEvent$","mitigationsUpdateEvent","syncedStatusNetworkConnectionKeyObjectsSub","_networkConnectionKeyObjectsSub","_networkConnectionKeyObjects","pimCMOKeyObjects$","pimCMOKeyObjectsSub","pimCMOKeyObjects","cmoKeyObjects$","cmoKeyObjectsSub","cmoKeyObjects","ongoingMitigationsSub","canAddIpNetworkConnection$","canAddIpNetworkConnectionSub","canAddIpNetworkConnection","getMitigationReportUrl","_src_app_utils_assert__WEBPACK_IMPORTED_MODULE_12__","_common_utils__WEBPACK_IMPORTED_MODULE_6__","_mitigation_converter__WEBPACK_IMPORTED_MODULE_7__","intervalMitigationSub","rxjs__WEBPACK_IMPORTED_MODULE_17__","rxjs__WEBPACK_IMPORTED_MODULE_18__","getMitigationByPeriod","utcStartTime","moment__WEBPACK_IMPORTED_MODULE_1___default","utcEndTime","getKeysInTimeRangeForMitigations","getMitigationDetailReportUrl","encodeURIComponent","mitigationRate","_app_components_shared_services_dialog_confirm_dialog_service__WEBPACK_IMPORTED_MODULE_4__","getOngoingMitigations","checkOngoingMitigationsUrl","updatedIps","rxjs__WEBPACK_IMPORTED_MODULE_19__","getNetworkConnections","requestMitigationAction","mitigationActionUrl","ipAddressList","ipAddress","updateIpsStatus","updatedIp","tslib__WEBPACK_IMPORTED_MODULE_20__","found","findNetworkConnectionByAddress","cloned","stop","getNetworkConnectionsUrl","networkConnectionKeyObjects","checkEnableCanAddIpZone","addNewNetworkConnection","networkConnection","addNetworkConnection","wanIPAddress","addNetworkConnectionUrl","addNetworkAddressToExistingNetworkConnection","newAddress","_src_app_utils_key_object__WEBPACK_IMPORTED_MODULE_21__","updateReq","updateNetworkConnections","returnDescription","serviceName","deleteNetworkConnection","removedKeys","address","updateNetworkConnection","updateNetworkAddress","bulkUpdateNetworkConnectionUrl","bulkUpdateConnectionsReq","createWarningActionResponse","description","resetMitigationSnapshot","filterMitigation","filterQuery","filterOnIpVersion","filterOnType","filterIpv4","filterIpv6","filterFlowspec","filterNotFlowspec","mitigationStartFormatted","mitigationEndFormatted","_alert_alert_model__WEBPACK_IMPORTED_MODULE_5__","_angular_core__WEBPACK_IMPORTED_MODULE_22__","TA_DROPDOWN_PERIOD","TA_DROPDOWN_GRAPH_TYPE","TA_PERIOD_ENUMS","TODAY","TA_DROPDOWN_UNITS","TA_DROPDOWN_VOLUME","TA_WIZARD_ITEMS_PER_PAGE","DDOS_DEFAULT_REGIONS","TA_DROPDOWN_ALERT_SEVERITY","TA_DROPDOWN_ALERT_TYPE","TA_ALERT_CLASS_ENUM","TA_DROPDOWN_STATUS_START","TA_DROPDOWN_STATUS_END","TA_DROPDOWN_ALERT_LOW_SEVERITY_PERCENT","TA_DROPDOWN_ALERT_HIGH_SEVERITY_PERCENT","TA_TRAFFIC_TABLE_COLUMNS","GraphClassType","GraphType","TA_DISPLAY_VALUES","TA_DROPDOWN_DISPLAYS","TOTAL","ONLY_IN","IN","ONLY_OUT","OUT","TrafficFacet","CUSTOMER_COMPARE","BY_APPLICATION","BY_TCP","BY_UDP","BY_TOP_TALKER","BY_TOP_SOURCES","TrafficLayoutRouteParam","TA_DROPDOWN_MITIGATION_IP_VERSION","TA_DROPDOWN_MITIGATION_TYPE","TA_DEFAULT_CONFIGS_ENUM","TA_DEFAULT_VOLUME_ENUM","MITIGATION_SUMMARY_TABLE_COLUMNS","SessionStore","BehaviorSubject","userSub","isAdminRole$","isAdminRoleSub","isAdminRole","assignedCompaniesSub","assignedCompanies","currentCompanyInfoSub","ssppDataList","isAuthenticatedAndReady","isAuthenticatedAndReadySub","beforeReload","afterReload","AfterReload","companyInfo","getCustomerDetails","companyDetail","verifyIfAuthenticatedAndReady","initSession","URL","href","redirectUri","searchParams","has","origin","api_urls","responseType","finalize","assign","environment","getCustomerInfo","tap","customerInfo","isAdmin","customerList","userinfo","storedCompanyInfo","getCurrentSettings","selectedCompany","localStorage","removeItem","ongoingReload","afterPageReload","settings","setItem","JSON","stringify","clearCurrentSettings","settingsStr","getItem","parse","assertValue","assertHttpResponse","toKeyObject","source","toPlainObjectByKey","cloneKeyObject","remainder","tslib__WEBPACK_IMPORTED_MODULE_0__","tryParseJson","str","production","API_BACKEND_URL","env","BUSINESS_CENTER_URL","ARBOR_PORTAL_URL","MACD_URL","MACD_PROD_URL","setTimeout","AppRoutes","redirectTo","pathMatch","routing_constants","loadChildren","Promise","m","HomeModule","catch","TrafficModule","ZonesModule","ReportsModule","AdminModule","__webpack_require__","KnowledgeModule","SettingsModule","component","AppRoutingModule","fesm2015_router","AppComponent","snackBar","RouterSubscription","navigated","errorText","detectBrowserValidity","openFromComponent","panelClass","unloadHandler","es5","navigator","userAgent","satisfies","windows","macos","safari","chrome","firefox","opera","LoaderInterceptor","intercept","req","handle","catchError","throwError","DdosHttpInterceptor","ddosHeaders","clone","headers","confirm_dialog_service","goToErrorPage","code","DdosErrorHandler","handleError","showSnackbarMessage","msg","run","AppModule","bootstrap","provide","useClass","useValue","appearance","multi","platform_browser","animations","shared_module","N","bootstrapModule","webpackContext","module"],"sourceRoot":"webpack:///","sources":["./src/app/components/shared/bdid-not-found/bdid-not-found.component.ts","./src/app/components/shared/bdid-not-found/bdid-not-found.component.html","./src/app/components/shared/confirm-dialog/confirm.component.html","./src/app/components/shared/confirm-dialog/confirm.component.ts","./src/app/components/shared/ddos-list/ddos-list.component.html","./src/app/components/shared/ddos-list/ddos-list.component.ts","./src/app/components/shared/dialog/dialog.component.ts","./src/app/components/shared/dialog/dialog.component.html","./src/app/components/shared/directives/ddos-toggle-button.directive.ts","./src/app/components/shared/loader/loader.component.html","./src/app/components/shared/loader/loader.component.ts","./src/app/components/shared/page-not-found/page-not-found.component.ts","./src/app/components/shared/page-not-found/page-not-found.component.html","./src/app/components/shared/pipes/data-property-getter.pipe.ts","./src/app/components/shared/pipes/duration.pipe.ts","./src/app/components/shared/pipes/inner-html.pipe.ts","./src/app/components/shared/search-wizard/common/search-date-filter/search-date-filter.component.html","./src/app/components/shared/search-wizard/common/search-date-filter/search-date-filter.component.ts","./src/app/components/shared/search-wizard/search-wizard-alert/search-wizard-alert.component.html","./src/app/components/shared/search-wizard/search-wizard-alert/search-wizard-alert.component.ts","./src/app/components/shared/search-wizard/search-wizard-mitigation/search-wizard-mitigation.component.html","./src/app/components/shared/search-wizard/search-wizard-mitigation/search-wizard-mitigation.component.ts","./src/app/components/shared/services/dialog/confirm-dialog.service.ts","./src/app/components/shared/services/search/search-wizard-alert.service.ts","./src/app/components/shared/services/search/search-wizard-mitigation.service.ts","./src/app/components/shared/directives/ddos-radio-button.directive.ts","./src/app/components/shared/pipes/alert-ko-alert.pipe.ts","./src/app/components/shared/pipes/alert-ko-alerts.pipe.ts","./src/app/components/shared/shared.module.ts","./src/app/components/shared/shell/shell.component.html","./src/app/components/shared/shell/shell.component.ts","./src/app/components/shared/sidebar/sidebar.component.html","./src/app/components/shared/sidebar/sidebar.component.ts","./src/app/components/shared/snackbar/snackbar.component.ts","./src/app/components/shared/snackbar/snackbar.component.html","./src/app/components/shared/table/table.component.html","./src/app/components/shared/table/table.component.ts","./src/app/components/shared/timer/timer.component.ts","./src/app/components/shared/timer/timer.component.html","./src/app/routing-constants.ts","./src/app/stores/admin/admin.converter.ts","./src/app/stores/admin/admin.model.ts","./src/app/stores/admin/admin.store.ts","./src/app/stores/alert/alert.converter.ts","./src/app/stores/alert/alert.model.ts","./src/app/stores/alert/alert.store.ts","./src/app/stores/api.urls.ts","./src/app/stores/app-layout/app-layout.store.ts","./src/app/stores/common.model.ts","./src/app/stores/common.utils.ts","./src/app/stores/global-gets.store.ts","./src/app/stores/loader/loader.store.ts","./src/app/stores/report/billing/billing.converter.ts","./src/app/stores/report/mitigation/mitigation.converter.ts","./src/app/stores/report/mitigation/mitigation.store.ts","./src/app/stores/report/traffic/traffic.model.ts","./src/app/stores/session/session.store.ts","./src/app/stores/session/session.model.ts","./src/app/utils/assert.ts","./src/app/utils/key-object.ts","./src/environments/environment.prod.ts","./src/app/app-routes.ts","./src/app/app-routing.module.ts","./src/app/app.component.ts","./src/app/app.component.html","./src/app/interceptors/http-spinner.interceptor.ts","./src/app/interceptors/http.interceptors.ts","./src/app/interceptors/ddos-error.interceptor.ts","./src/app/app.module.ts","./src/main.ts","./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Component, OnInit } from '@angular/core';\nimport { SessionStore } from '@app/stores/session/session.store';\nimport { ActivatedRoute, Router } from '@angular/router';\n\ntype DisplayMsg = {\n\theader: string;\n\tbody: string;\n};\n\nconst enum ERROR_CODES {\n\tNOT_FOUND = '404',\n\tBAD_GATEWAY = '502',\n\tGATEWAY_TIMEOUT = '504',\n}\n\nexport const displayMessages: { [key: string]: DisplayMsg } = {\n\t'404': {\n\t\theader: 'Your Business Direct ID is not found in the system',\n\t\tbody: 'Please contact your Business Center Company Administrator or the Business Center Helpdesk at rm-emkc@att.com for assistance.',\n\t},\n\t'502': {\n\t\theader: 'Page under maintenance please try again later',\n\t\tbody: 'Sorry for the inconvenience.',\n\t},\n\t'504': {\n\t\theader: 'Something went wrong',\n\t\tbody: 'If this message is concurrent, please email threat@att.com or call 844-288-3367.',\n\t},\n};\n\n@Component({\n\tselector: 'ddos-ui-bdid-not-found',\n\ttemplateUrl: './bdid-not-found.component.html',\n\tstyleUrls: ['./bdid-not-found.component.scss'],\n})\nexport class BdidNotFoundComponent implements OnInit {\n\terrorCode: string = ERROR_CODES.NOT_FOUND;\n\n\tconstructor(\n\t\tprivate sessionStore: SessionStore,\n\t\tprivate router: Router,\n\t\tprivate route: ActivatedRoute\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.sessionStore.isAuthenticatedAndReady$.subscribe((isAuth) => {\n\t\t\tif (isAuth) {\n\t\t\t\tthis.router.navigate([`/home`]);\n\t\t\t}\n\t\t});\n\t\tthis.assignErrorCodeValue();\n\t}\n\n\tprivate assignErrorCodeValue() {\n\t\tthis.errorCode = this.route.snapshot.queryParamMap.get('code');\n\t}\n\n\tget errorMsg(): { header: string; body: string } {\n\t\tif (!displayMessages[this.errorCode]) {\n\t\t\treturn displayMessages[ERROR_CODES.BAD_GATEWAY];\n\t\t}\n\t\treturn displayMessages[this.errorCode];\n\t}\n}\n","
\n
\n

{{errorMsg.header}}

\n

{{errorMsg.body}}

\n
\n
\n","
\n

{{ data?.title }}

\n \n
\n\n
\n

{{ data?.message }}

\n
\n\n
\n \n \n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, EventEmitter, Inject, OnInit, Output } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { ConfirmDialogData } from '@src/app/components/shared/services/dialog/confirm-dialog.service';\n\n@Component({\n\tselector: 'ddos-ui-confirm',\n\ttemplateUrl: './confirm.component.html',\n\tstyleUrls: ['./confirm.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfirmDialog implements OnInit {\n\n\t@Output() actionConfirmed: EventEmitter = new EventEmitter();\n\n\tconstructor(\n\t\t@Inject(MAT_DIALOG_DATA) public data: ConfirmDialogData,\n\t\tpublic dialogRef: MatDialogRef\n\t) {}\n\n\tngOnInit(): void {}\n\n\tconfirm() {\n\t\tthis.dialogRef.close(true);\n\t\tthis.actionConfirmed.emit();\n\t}\n\n\tcancel() {\n\t\tthis.dialogRef.close(false);\n\t}\n}\n\nexport const DDOS_CONFIRM_DIALOG_DEFAULT_CONFIGS: MatDialogConfig = {\n\twidth: '500px',\n\tdisableClose: true,\n};\n","
\n \n {{ characterization.dataSetName }}\n {{ characterization.dataSetItem }}\n\n \n \n {{ characterization.dataSetItemPercent }}%\n \n \n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { AlertCharacterization } from '@src/app/stores/alert/alert.model';\n\n@Component({\n\tselector: 'ddos-ui-list',\n\ttemplateUrl: './ddos-list.component.html',\n\tstyleUrls: ['./ddos-list.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DdosListComponent {\n\t@Input() characterization: AlertCharacterization;\n\n\t@Input() isElevated = false;\n\n\t@Input() displayName = true;\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { DialogData } from '../services/dialog/dialog-factory.service';\n\n@Component({\n\tselector: 'ddos-ui-dialog',\n\ttemplateUrl: './dialog.component.html',\n\tstyleUrls: ['./dialog.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DialogComponent implements OnInit {\n\tconstructor(\n\t\tpublic dialogRef: MatDialogRef,\n\t\t@Inject(MAT_DIALOG_DATA) public data: DialogData\n\t) {}\n\n\tngOnInit(): void {}\n}\n","
\n \n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Directive, ElementRef, EventEmitter, HostBinding, HostListener, Output, Renderer2 } from '@angular/core';\n\n@Directive({\n\tselector: '[ddos-button-toggle-group]',\n})\nexport class DdosToggleButtonDirective {\n\t@Output() value: EventEmitter = new EventEmitter();\n\n\tactiveElement: ElementRef;\n\n\t@HostBinding('class.ddos-button-toggle-group')\n\thostClass = true;\n\n\tconstructor(\n\t\tprivate renderer: Renderer2,\n\t\tpublic el: ElementRef\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.activeElement = this.el.nativeElement.querySelector('.active-button-toggle');\n\t}\n\n\t@HostListener('click', ['$event']) onClick(event) {\n\t\tif (event.target.localName === 'div') {\n\t\t\treturn;\n\t\t}\n\t\tif (event.target.classList.contains('active-button-toggle')) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.activeElement = this.el.nativeElement.querySelector('.active-button-toggle');\n\n\t\tthis.value.emit(event.target.innerHTML.toUpperCase().replaceAll(' ', '_'));\n\t\tthis.renderer.addClass(event.target, 'active-button-toggle');\n\t\tthis.renderer.removeClass(this.activeElement, 'active-button-toggle');\n\t}\n\n\taddClass(className: string, element: any) {\n\t\tthis.renderer.addClass(element, className);\n\t}\n\n\tremoveClass(className: string, element: any) {\n\t\tthis.renderer.removeClass(element, className);\n\t}\n}\n","
\n \n
\n\n
\n \n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\nimport { LoaderStore } from '@src/app/stores/loader/loader.store';\nimport { SessionStore } from '@src/app/stores/session/session.store';\nimport { Observable } from 'rxjs';\n\n@Component({\n\tselector: 'ddos-ui-loader',\n\ttemplateUrl: './loader.component.html',\n\tstyleUrls: ['./loader.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoaderComponent implements OnInit {\n\thasRequestsInProgress$: Observable;\n\n\tisAuthenticatedAndReady$: Observable;\n\n\t@Input() inComponent: boolean = false;\n\n\t@Input() forceDisplay: boolean = false;\n\n\tconstructor(\n\t\tprivate loaderStore: LoaderStore,\n\t\tprivate sessionStore: SessionStore,\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.hasRequestsInProgress$ = this.loaderStore.httpProgress$;\n\t\tthis.isAuthenticatedAndReady$ = this.sessionStore.isAuthenticatedAndReady$;\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AppLayoutRouting } from '@src/app/routing-constants';\n\nconst ACCESS_DENIED_ERROR = 'Access Denied';\nconst PAGE_NOT_FOUND_ERROR = 'Page Not Found';\n\n@Component({\n\tselector: 'ddos-ui-page-not-found',\n\ttemplateUrl: './page-not-found.component.html',\n\tstyleUrls: ['./page-not-found.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PageNotFoundComponent implements OnInit {\n\terrorMessage: string;\n\n\tconstructor(private router: Router) {}\n\n\tngOnInit(): void {\n\t\tthis.errorMessage =\n\t\t\tthis.router.url === `${AppLayoutRouting.USER_ERROR}` ? ACCESS_DENIED_ERROR : PAGE_NOT_FOUND_ERROR;\n\t}\n\n\tasync navigateToPortal() {\n\t\tawait this.router.navigate(['/home']);\n\t}\n}\n","
\n
\n

Well this is awkward....

\n
\n \"404\n
\n

{{ errorMessage }}

\n

\n The page you are looking for does not exist
\n Please check the link and try again.\n

\n
\n

For more information, please see Click to access AT&T DDoS Defense Portal

\n
\n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'propertyGetter',\n})\nexport class PropertyGetterPipe implements PipeTransform {\n\ttransform(object: Record, keyName: string): unknown {\n\t\treturn object[keyName];\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { formatMitigationDuration } from '@src/app/stores/report/mitigation/mitigation.converter';\n\n@Pipe({\n\tname: 'formatDuration',\n})\nexport class DurationPipe implements PipeTransform {\n\ttransform(durationString: string): string {\n\t\treturn formatMitigationDuration(durationString);\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Pipe } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Pipe({ name: 'safeHtml' })\nexport class InnerHtmlPipe {\n\tconstructor(protected sanitizer: DomSanitizer) {}\n\n\ttransform(htmlString: string): SafeHtml {\n\t\treturn this.sanitizer.bypassSecurityTrustHtml(htmlString);\n\t}\n}\n","
\n\n
\n \n {{ s.name }}\n \n
\n\n
\n \n\n \n Start\n \n \n {{ start.name }}\n \n \n \n\n \n Time\n \n \n\n \n Date\n \n \n \n \n
\n\n
\n \n\n \n End\n \n \n {{ end.name }}\n \n \n \n\n \n Time\n \n \n\n \n Date\n \n \n \n \n
\n
\n","/* Copyright 2024, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { NameValueOption, PrimitiveValue } from '@src/app/stores/common.model';\nimport { DateFilterFn } from '@angular/material/datepicker';\nimport moment from 'moment';\nimport { MatCheckboxChange } from '@angular/material/checkbox';\nimport { SearchStatusControls } from '../../../services/search/search.model';\n\n@Component({\n\tselector: 'ddos-ui-search-date-filter',\n\ttemplateUrl: './search-date-filter.component.html',\n\tstyleUrls: ['./search-date-filter.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchDateFilterComponent {\n\t@Input() statusFormGroup: FormGroup;\n\n\t@Input() statusStart: NameValueOption[];\n\n\t@Input() statusEnd: NameValueOption[];\n\n\t@Input() minStartDate: string;\n\n\t@Input() availableStatuses: NameValueOption[] = [];\n\n\t@Input() tooltipOngoingMsg: string;\n\n\t@Input() tooltipRecentMsg: string;\n\n\tstartTimeFilter: DateFilterFn = (d: Date) => {\n\t\tconst statusFormGroupValue = this.statusFormGroup.value;\n\t\tconst isBeforeNow: boolean = moment.utc(d).isSameOrBefore(moment.utc());\n\t\tconst isAfterMinStartDate: boolean =\n\t\t\t!!this.minStartDate && moment.utc(d).isSameOrAfter(moment.utc(this.minStartDate));\n\n\t\tif (statusFormGroupValue.endDate) {\n\t\t\tconst isBeforeEnd: boolean =\n\t\t\t\tmoment.utc(d).isSameOrBefore(moment.utc(statusFormGroupValue.endDate)) &&\n\t\t\t\tmoment.utc(d).isSameOrBefore(moment.utc());\n\t\t\treturn isBeforeEnd && isAfterMinStartDate;\n\t\t}\n\t\treturn isBeforeNow && isAfterMinStartDate;\n\t};\n\n\tendTimeFilter: DateFilterFn = (d: Date) => {\n\t\tconst statusFormGroupValue = this.statusFormGroup.value;\n\n\t\tif (statusFormGroupValue.startDate) {\n\t\t\tif (statusFormGroupValue.end === 'before') {\n\t\t\t\treturn moment.utc(d).isBetween(moment.utc(statusFormGroupValue.startDate), moment.utc().add(1, 'day'));\n\t\t\t}\n\t\t\treturn moment.utc(d).isBetween(moment.utc(statusFormGroupValue.startDate), moment.utc());\n\t\t}\n\t\tif (statusFormGroupValue.end === 'before') {\n\t\t\treturn moment.utc(d).isBetween(this.minStartDate, moment.utc().add(1, 'day'));\n\t\t}\n\t\treturn moment.utc(d).isBetween(this.minStartDate, moment.utc());\n\t};\n\n\tonStatusChange(event: MatCheckboxChange, status: NameValueOption) {\n\t\tthis.statusFormGroup.get(status.name).patchValue(event.checked);\n\t\tif (status.name === 'ongoing' && event.checked === true) {\n\t\t\tthis.resetEndDateOnOngoing();\n\t\t}\n\n\t\tthis.checkEnableRecent();\n\t}\n\n\tprivate checkEnableRecent() {\n\t\tlet enableRecent = false;\n\t\tconst isOngoing = this.statusFormGroup.value.ongoing;\n\t\tconst isRecent = this.statusFormGroup.value.recent;\n\n\t\tenableRecent = !isOngoing && isRecent;\n\n\t\tif (enableRecent) {\n\t\t\tthis.statusFormGroup.get('end').enable({ onlySelf: true });\n\t\t\tthis.statusFormGroup.get('isEnd').enable({ onlySelf: true });\n\t\t\tthis.statusFormGroup.get('endTime').enable({ onlySelf: true });\n\t\t\tthis.statusFormGroup.get('endDate').enable({ onlySelf: true });\n\t\t\tthis.statusFormGroup.get('isEnd').patchValue(true);\n\t\t} else {\n\t\t\tthis.statusFormGroup.get('isEnd').patchValue(false);\n\t\t\tthis.statusFormGroup.get('end').disable({ onlySelf: false });\n\t\t\tthis.statusFormGroup.get('isEnd').disable({ onlySelf: false });\n\t\t\tthis.statusFormGroup.get('endTime').disable({ onlySelf: false });\n\t\t\tthis.statusFormGroup.get('endDate').disable({ onlySelf: false });\n\t\t}\n\t}\n\n\tprivate resetEndDateOnOngoing() {\n\t\tthis.statusFormGroup.get('endDate').patchValue(moment.utc().add(1, 'day').format('YYYY-MM-DD'));\n\t\tthis.statusFormGroup.get('end').patchValue('before');\n\t\tthis.statusFormGroup.get('isEnd').patchValue(true);\n\t}\n\n\tprotected convertToBooleanInput(value: PrimitiveValue): boolean {\n\t\treturn !!value;\n\t}\n}\n","
\n
\n
\n
\n

Search Wizard

\n \n
\n\n
\n
\n
\n \n Search string\n \n \n\n \n Items per page\n \n 5\n 10\n 25\n 50\n \n \n
\n
\n \n
\n \n\n
\n \n Alert Type\n \n \n {{ alert.name }}\n \n \n \n\n \n Alert Classification\n \n \n {{ class.name }}\n \n \n \n
\n
\n\n
\n

Display

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

Low/High Alert Traffic Thresholds

\n
\n \n Low\n \n \n\n \n High\n \n \n\n \n Units\n \n \n {{ class.name }}\n \n \n \n
\n
\n\n
\n

Low/High Severity % Thresholds

\n\n
\n \n Low\n \n \n\n \n High\n \n \n
\n
\n
\n\n
\n \n \n
\n
\n
\n
","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport moment from 'moment';\nimport { SearchWizardAlertService } from '@src/app/components/shared/services/search/search-wizard-alert.service';\nimport { NameValueOption } from '@src/app/stores/common.model';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { WizardType, SearchWizardDialogData } from '../../services/dialog/dialog-factory.service';\nimport { AlertLowHighControls, AlertSearchForm, AlertSearchFormValuesPartial } from '../../services/search/search.model';\nimport { Subject, debounceTime, distinctUntilChanged, pairwise, startWith, takeUntil } from 'rxjs';\nimport { isEqual } from 'lodash';\n\n@Component({\n\tselector: 'ddos-ui-search-wizard-alert',\n\ttemplateUrl: './search-wizard-alert.component.html',\n\tstyleUrls: ['./search-wizard-alert.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchWizardAlertComponent implements OnInit, OnDestroy {\n\tBooleanInput: BooleanInput;\n\n\twizardType: WizardType;\n\n\talertSeverity: NameValueOption[];\n\n\talertClass: NameValueOption[];\n\n\talertType: NameValueOption[];\n\n\talertClassification: NameValueOption[];\n\n\tavailableStatuses: NameValueOption[];\n\n\tstatusStart: NameValueOption[];\n\n\tstatusEnd: NameValueOption[];\n\n\talertMaxTrafficImpact: NameValueOption[];\n\n\talertMaxSeverityLowBoundPercent: NameValueOption[];\n\n\talertMaxSeverityHighBoundPercent: NameValueOption[];\n\n\titemsPerPage: number;\n\n\talertSearchWizardForm: FormGroup;\n\n\tsearchButtonDisabled: boolean = false;\n\n\tprivate destroy$ = new Subject();\n\n\tmitigationSearchForm: FormGroup;\n\n\tmitigationIpVersion: NameValueOption[];\n\n\tmitigationType: NameValueOption[];\n\n\thideSearchString: boolean = false;\n\n\tminAlertStartDate: string;\n\n\treadonly tooltipRecentMsg: string = 'All closed alerts dating back to the last 6 months.';\n\n\treadonly tooltipOngoingMsg: string = 'Selecting \"Ongoing\" checkbox will disable the \"End by\" date selection option for \"Ongoing\" and \"Recent\" (if selected) alerts.';\n\n\tconstructor(\n\t\tpublic dialogRef: MatDialogRef,\n\t\t@Inject(MAT_DIALOG_DATA) public data: SearchWizardDialogData,\n\t\tpublic wizardService: SearchWizardAlertService,\n\t) { }\n\n\tngOnInit(): void {\n\t\tthis.wizardType = this.data.templateType;\n\t\tthis.alertSearchWizardForm = this.data.context;\n\t\tthis.configureAlertWizardElements();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.destroy$.next(true);\n\t\tthis.destroy$.unsubscribe();\n\t}\n\n\tconfigureAlertWizardElements() {\n\t\tif (!this.alertSearchWizardForm) {\n\t\t\treturn;\n\t\t}\n\t\tthis.initAvailableValues();\n\n\t\tthis.alertSearchWizardForm.valueChanges.pipe(\n\t\t\tdebounceTime(300),\n\t\t\tdistinctUntilChanged(),\n\t\t\tstartWith({}),\n\t\t\tpairwise(),\n\t\t\ttakeUntil(this.destroy$)\n\t\t).subscribe(([prevForm, nextForm]) => {\n\t\t\tif (!isEqual(prevForm, nextForm)) {\n\t\t\t\tthis.checkFormChanges(nextForm);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate initAvailableValues() {\n\t\tthis.alertSeverity = this.wizardService.getAlertSeverityLevels();\n\t\tthis.alertType = this.wizardService.getAlertTypesDropdowns();\n\t\tthis.alertClassification = this.wizardService.getAlertClassificationDropdowns();\n\t\tthis.availableStatuses = this.wizardService.getStatus();\n\t\tthis.statusStart = this.wizardService.getStatusByType('START');\n\t\tthis.statusEnd = this.wizardService.getStatusByType('END');\n\t\tthis.alertMaxTrafficImpact = this.wizardService.getAlertTrafficUnitsDropDowns();\n\t\tthis.alertMaxSeverityLowBoundPercent = this.wizardService.getAlertSeverityPercentDropdownsByType('LOW');\n\t\tthis.alertMaxSeverityHighBoundPercent = this.wizardService.getAlertSeverityPercentDropdownsByType('HIGH');\n\t\tthis.minAlertStartDate = moment.utc().subtract(6, 'months').toLocaleString();\n\t\tthis.hideSearchString = !!this.alertSearchWizardForm.value.search.searchString\n\t}\n\n\tprivate checkFormChanges(form: AlertSearchFormValuesPartial) {\n\t\tif (!!form.maxSeverityPercent.highValue || !!form.maxSeverityPercent.lowValue) {\n\t\t\tthis.wizardService.updateAlertValidators(this.alertSearchWizardForm.controls['maxSeverityPercent']);\n\t\t}\n\n\t\tif (!!form.maxImpactAlertTraffic.highValue || !!form.maxImpactAlertTraffic.lowValue) {\n\t\t\tthis.wizardService.updateAlertValidators(this.alertSearchWizardForm.controls['maxImpactAlertTraffic'] as unknown as FormGroup);\n\t\t}\n\n\t\tif (!!form.alertStatus.startDate || !!form.alertStatus.endDate) {\n\t\t\tthis.alertSearchWizardForm.get('alertStatus').get('endDate').updateValueAndValidity();\n\t\t\tthis.alertSearchWizardForm.get('alertStatus').get('startDate').updateValueAndValidity();\n\t\t\tthis.alertSearchWizardForm.get('alertStatus').get('endTime').updateValueAndValidity();\n\t\t\tthis.alertSearchWizardForm.get('alertStatus').get('startTime').updateValueAndValidity();\n\t\t}\n\n\t\tthis.searchButtonDisabled = !this.alertSearchWizardForm.valid;\n\t}\n}\n","
\n
\n
\n
\n

Mitigation Wizard

\n \n
\n
\n
\n\n
\n \n Search string\n \n \n\n \n Items per page\n \n 5\n 10\n 25\n 50\n \n \n
\n
\n\n
\n

Status

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

IP Version

\n\n
\n IP v4 \n IP v6 \n
\n
\n\n
\n

Mitigation Type

\n\n
\n Flowspec \n Non-Flowspec \n
\n
\n
\n\n
\n \n \n search\n {{ data?.confirmActionText || \"Search\" }}\n \n
\n
\n
\n
","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\n\nimport moment from 'moment';\nimport { NameValueOption } from '@src/app/stores/common.model';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { WizardType, SearchWizardDialogData } from '../../services/dialog/dialog-factory.service';\nimport { Subject, debounceTime, distinctUntilChanged, pairwise, startWith, takeUntil } from 'rxjs';\nimport { SearchWizardMitigationService } from '../../services/search/search-wizard-mitigation.service';\nimport { isEqual } from 'lodash';\nimport { MitigationSearchForm, MitigationSearchFormValuesPartial } from '../../services/search/search.model';\n\n@Component({\n\tselector: 'ddos-ui-search-wizard-mitigation',\n\ttemplateUrl: './search-wizard-mitigation.component.html',\n\tstyleUrls: ['./search-wizard-mitigation.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchWizardMitigationComponent implements OnInit, OnDestroy {\n\tBooleanInput: BooleanInput;\n\n\twizardType: WizardType;\n\n\tavailableStatuses: NameValueOption[];\n\n\tstatusStart: NameValueOption[];\n\n\tstatusEnd: NameValueOption[];\n\n\tprivate destroy$ = new Subject();\n\n\tmitigationSearchForm: FormGroup;\n\n\tmitigationIpVersion: NameValueOption[];\n\n\tmitigationType: NameValueOption[];\n\n\tsearchButtonDisabled: boolean = false;\n\n\treadonly tooltipRecentMsg: string = 'All closed mitigations dating back to the last 6 months';\n\n\treadonly tooltipOngoingMsg: string = 'Selecting \"Ongoing\" checkbox will disable the \"End by\" date selection option for \"Ongoing\" and \"Recent\" (if selected) mitigations.';\n\n\thideSearchString: boolean = false;\n\n\tminMitigationStartDate: string;\n\n\tconstructor(\n\t\tpublic dialogRef: MatDialogRef,\n\t\t@Inject(MAT_DIALOG_DATA) public data: SearchWizardDialogData,\n\t\tpublic wizardService: SearchWizardMitigationService,\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.mitigationSearchForm = this.data.context;\n\t\tthis.configureMitigationWizardElements();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.destroy$.next(true);\n\t\tthis.destroy$.unsubscribe();\n\t}\n\n\tconfigureMitigationWizardElements() {\n\t\tif (!this.mitigationSearchForm) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.initAvailableValues();\n\n\t\tthis.mitigationSearchForm.valueChanges.pipe(\n\t\t\tdebounceTime(300),\n\t\t\tdistinctUntilChanged(),\n\t\t\tstartWith({}),\n\t\t\tpairwise(),\n\t\t\ttakeUntil(this.destroy$)\n\t\t ).subscribe(([prevForm, nextForm]) => {\n\t\t\tif (!isEqual(prevForm, nextForm)) {\n\t\t\t\tthis.checkFormChanges(nextForm);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate initAvailableValues() {\n\t\tthis.availableStatuses = this.wizardService.getStatus();\n\t\tthis.statusStart = this.wizardService.getStatusByType('START');\n\t\tthis.statusEnd = this.wizardService.getStatusByType('END');\n\t\tthis.mitigationIpVersion = this.wizardService.getMitigationIpVersions();\n\t\tthis.mitigationType = this.wizardService.getMitigationTypes();\n\t\tthis.minMitigationStartDate = moment.utc().subtract(6, 'months').toString();\n\t\tthis.hideSearchString = !!this.mitigationSearchForm.value.mitigationSearch.mitigationSearchString\n\t}\n\n\tprivate checkFormChanges(form: MitigationSearchFormValuesPartial) {\n\t\tif (!!form.mitigationStatus.startDate || !!form.mitigationStatus.endDate) {\n\t\t\tthis.mitigationSearchForm.get('mitigationStatus').get('startDate').updateValueAndValidity();\n\t\t\tthis.mitigationSearchForm.get('mitigationStatus').get('startTime').updateValueAndValidity();\n\t\t\tthis.mitigationSearchForm.get('mitigationStatus').get('endDate').updateValueAndValidity();\n\t\t\tthis.mitigationSearchForm.get('mitigationStatus').get('endTime').updateValueAndValidity();\n\t\t}\n\n\t\tthis.searchButtonDisabled = !this.mitigationSearchForm.valid;\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable } from '@angular/core';\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { ConfirmDialog } from '../../confirm-dialog/confirm.component';\n\nexport type ConfirmDialogData = {\n\ttitle: string;\n\tmessage: string;\n\tconfirmActionText: string;\n\tcancelActionText?: string;\n\tclosable?: boolean;\n};\n\nexport const DDOS_CONFIRM_DIALOG_DEFAULT_CONFIGS: MatDialogConfig = {\n\twidth: '500px',\n\tdisableClose: true,\n};\n\nexport const DDOS_CONFIRM_DIALOG_NO_DATA: ConfirmDialogData = {\n\ttitle: 'No Data Returned',\n\tmessage: 'No data was returned from the reporting system – please contact Technical Support for details.',\n\tconfirmActionText: 'Go back',\n\tclosable: true\n};\n\nexport const DDOS_CONFIRM_DIALOG_UNKNOWN_ERROR: ConfirmDialogData = {\n\ttitle: 'Unknown Error',\n\tmessage: 'No data was returned – please contact Technical Support for details.',\n\tconfirmActionText: 'OK',\n\tclosable: false\n};\n\nexport const DDOS_CONFIRM_DIALOG_INVALID_ERROR: ConfirmDialogData = {\n\ttitle: 'Invalid Request',\n\tmessage: 'Bad Request – Something is missing.',\n\tconfirmActionText: 'OK',\n\tclosable: true\n};\n\nexport const DDOS_CONFIRM_DIALOG_UNAUTHORIZED_ERROR: ConfirmDialogData = {\n\ttitle: 'Unauthorized User',\n\tmessage: 'Unauthorized User or token expired - You will be redirected to the login page.',\n\tconfirmActionText: 'OK',\n\tclosable: false\n};\n\nexport const DDOS_CONFIRM_DIALOG_FORBIDDEN_ERROR: ConfirmDialogData = {\n\ttitle: 'Forbidden',\n\tmessage: 'Unauthorized access - You will be redirected to the login page.',\n\tconfirmActionText: 'OK',\n\tclosable: false\n};\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class ConfirmDialogService {\n\tprivate dialogInstances: MatDialogRef[] = [];\n\n\tconstructor(private dialog: MatDialog) {}\n\n\topenConfirmDialog(data: ConfirmDialogData, config = DDOS_CONFIRM_DIALOG_DEFAULT_CONFIGS): MatDialogRef {\n\t\tthis.dialog.closeAll();\n\t\tconst dialogRef = this.dialog.open(ConfirmDialog, { data, ...config });\n\t\tthis.dialogInstances.push(dialogRef);\n\n\t\treturn dialogRef;\n\t}\n\n\tgetDialogInstances(): MatDialogRef[] {\n\t\treturn this.dialogInstances;\n\t}\n\n\tcloseDialog(dialogRef: MatDialogRef) {\n\t\tdialogRef.close();\n\t}\n\n\tcloseAllDialogs() {\n\t\tthis.dialogInstances.forEach((dialogRef) => dialogRef.close());\n\t}\n\n\thasActiveDialogs(): boolean {\n\t\treturn this.dialogInstances.length > 0;\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable } from '@angular/core';\nimport { FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';\nimport {\n\tTA_DROPDOWN_ALERT_SEVERITY,\n\tTA_DROPDOWN_ALERT_TYPE,\n\tTA_WIZARD_ITEMS_PER_PAGE,\n\tTA_DROPDOWN_STATUS_START,\n\tTA_DROPDOWN_STATUS_END,\n\tTA_DROPDOWN_UNITS,\n\tTA_DROPDOWN_ALERT_LOW_SEVERITY_PERCENT,\n\tTA_DROPDOWN_ALERT_HIGH_SEVERITY_PERCENT,\n} from '@src/app/stores/report/traffic/traffic.model';\nimport { NameValueOption } from '@src/app/stores/common.model';\nimport { AlertSearchForm, SearchWizardStatusType, AlertSeverityPercentType, AlertLowHighControls, AlertSearchFormValuesPartial } from './search.model';\nimport { AlertStatusFilter, AlertSearchQuery, AlertStatusEnum, } from '@src/app/stores/alert/alert.model';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class SearchWizardAlertService {\n\n\talertSeverity: NameValueOption[];\n\n\treadonly alertType: NameValueOption[] = [\n\t\t{ name: 'All', value: 'all'} ,\n\t\t{ name: 'Profiled', value: 'profiled'},\n\t\t{ name: 'Hosted', value: 'host'}\n\t];\n\n\treadonly defaultAlertClassification: NameValueOption = { name: 'All', value: 'all'};\n\n\talertClassification: NameValueOption[];\n\n\talertStatus: NameValueOption[];\n\n\talertStatusStart: NameValueOption[];\n\n\talertStatusEnd: NameValueOption[];\n\n\talertMaxTrafficImpact: NameValueOption[];\n\n\talertMaxSeverityLowBoundPercent: NameValueOption[];\n\n\talertMaxSeverityHighBoundPercent: NameValueOption[];\n\n\talertItemsPerPage: NameValueOption[];\n\n\tgetAlertSeverityLevels(): NameValueOption[] {\n\t\treturn [...TA_DROPDOWN_ALERT_SEVERITY];\n\t}\n\n\tgetAlertTypesDropdowns(): NameValueOption[] {\n\t\treturn this.alertType;\n\t}\n\n\tgetAlertTypeDropdowns(): NameValueOption[] {\n\t\treturn [...TA_DROPDOWN_ALERT_TYPE];\n\t}\n\n\tgetAlertClassificationDropdowns(): NameValueOption[] {\n\t\treturn this.alertClassification;\n\t}\n\n\tgetItemsPerPage(): number {\n\t\treturn TA_WIZARD_ITEMS_PER_PAGE;\n\t}\n\n\tgetStatus(): NameValueOption[] {\n\t\treturn [\n\t\t\t{ name: 'ongoing', value: false },\n\t\t\t{ name: 'recent', value: false },\n\t\t];\n\t}\n\n\tgetStatusByType(type: SearchWizardStatusType): NameValueOption[] {\n\t\treturn type === 'START' ? [...TA_DROPDOWN_STATUS_START] : [...TA_DROPDOWN_STATUS_END];\n\t}\n\n\tgetAlertTrafficUnitsDropDowns(): NameValueOption[] {\n\t\treturn [...TA_DROPDOWN_UNITS];\n\t}\n\n\tgetAlertSeverityPercentDropdownsByType(type: AlertSeverityPercentType): NameValueOption[] {\n\t\treturn type === 'LOW' ? [...TA_DROPDOWN_ALERT_LOW_SEVERITY_PERCENT] : [...TA_DROPDOWN_ALERT_HIGH_SEVERITY_PERCENT];\n\t}\n\n\tsetAlertStatusFormValues(selectedStatus: AlertStatusFilter, form: FormGroup) {\n\t\tswitch (selectedStatus) {\n\t\t\tcase AlertStatusEnum.ALL:\n\t\t\t\tform.get('alertStatus').get('ongoing').patchValue(true);\n\t\t\t\tform.get('alertStatus').get('recent').patchValue(true);\n\t\t\t\tthis.disableEndStatus(form);\n\t\t\t\tbreak;\n\t\t\tcase AlertStatusEnum.ONGOING:\n\t\t\t\tform.get('alertStatus').get('ongoing').patchValue(true);\n\t\t\t\tform.get('alertStatus').get('recent').patchValue(false);\n\t\t\t\tthis.disableEndStatus(form);\n\t\t\t\tbreak;\n\t\t\tcase AlertStatusEnum.RECENT:\n\t\t\t\tform.get('alertStatus').get('recent').patchValue(true);\n\t\t\t\tform.get('alertStatus').get('ongoing').patchValue(false);\n\t\t\t\tthis.enableEndStatus(form);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate enableEndStatus(form: FormGroup) {\n\t\tform.get('alertStatus').get('isEnd').enable();\n\t\tform.get('alertStatus').get('isEnd').patchValue(true);\n\t\tform.get('alertStatus').get('end').enable();\n\t\tform.get('alertStatus').get('endTime').enable();\n\t}\n\n\tprivate disableEndStatus(form: FormGroup) {\n\t\tform.get('alertStatus').get('isEnd').patchValue(false);\n\t\tform.get('alertStatus').get('isEnd').disable();\n\t\tform.get('alertStatus').get('end').disable();\n\t\tform.get('alertStatus').get('endTime').disable();\n\t}\n\n\tupdateAlertValidators(controlGroup: FormGroup) {\n\t\tlet newValidators: ValidatorFn[] = [];\n\t\tif (controlGroup.controls['lowValue'].value && controlGroup.controls['highValue'].value) {\n\t\t\tnewValidators = [Validators.min(+controlGroup.controls['lowValue'].value)];\n\t\t}\n\t\tcontrolGroup.get('highValue').setValidators(newValidators);\n\t\tcontrolGroup.get('highValue').updateValueAndValidity()\n\n\t\tnewValidators = [];\n\t\tif (controlGroup.controls['highValue'].value && controlGroup.controls['lowValue'].value) {\n\t\t\tnewValidators = [Validators.max(+controlGroup.controls['highValue'].value)];\n\t\t}\n\t\tcontrolGroup.get('lowValue').setValidators(newValidators);\n\t\tcontrolGroup.get('lowValue').updateValueAndValidity()\n\t}\n\n\tsetAlertClassificationOptions(alertClassificationOptions: NameValueOption[]) {\n\t\tthis.alertClassification = [this.defaultAlertClassification, ...alertClassificationOptions];\n\t}\n\n\tgenerateSearchWizardForm(): FormGroup {\n\t\treturn new FormGroup({\n\t\t\tsearch: new FormGroup({\n\t\t\t\tsearchString: new FormControl({\n\t\t\t\t\tvalue: '',\n\t\t\t\t\tdisabled: false,\n\t\t\t\t}),\n\t\t\t\talertItemsPerPage: new FormControl(),\n\t\t\t}),\n\t\t\tseverity: new FormGroup({\n\t\t\t\thigh: new FormControl({\n\t\t\t\t\tvalue: true,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t}),\n\t\t\t\tmedium: new FormControl({\n\t\t\t\t\tvalue: false,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t}),\n\t\t\t\tlow: new FormControl({\n\t\t\t\t\tvalue: false,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t}),\n\t\t\t\talertType: new FormControl(''),\n\t\t\t\talertClassification: new FormControl(''),\n\t\t\t}),\n\t\t\talertStatus: new FormGroup({\n\t\t\t\tongoing: new FormControl(false),\n\t\t\t\trecent: new FormControl(false),\n\t\t\t\tisStart: new FormControl({ value: false, disabled: false }),\n\t\t\t\tisEnd: new FormControl({ value: false, disabled: true }),\n\t\t\t\tstart: new FormControl(''),\n\t\t\t\tend: new FormControl({ value: '', disabled: true }),\n\t\t\t\tstartDate: new FormControl(''),\n\t\t\t\tstartTime: new FormControl(''),\n\t\t\t\tendDate: new FormControl({ value: '', disabled: true }),\n\t\t\t\tendTime: new FormControl({ value: '', disabled: true }),\n\t\t\t}),\n\t\t\tmaxImpactAlertTraffic: new FormGroup({\n\t\t\t\tlowValue: new FormControl(null),\n\t\t\t\thighValue: new FormControl(null),\n\t\t\t\tlowHighValueUnits: new FormControl(''),\n\t\t\t}),\n\t\t\tmaxSeverityPercent: new FormGroup({\n\t\t\t\tlowValue: new FormControl(null),\n\t\t\t\thighValue: new FormControl(null),\n\t\t\t}),\n\t\t});\n\t}\n\n\tgetSearchQuery(search: AlertSearchFormValuesPartial): Partial {\n\t\treturn {\n\t\t\tsearchString: { value: search.search?.searchString },\n\t\t\tsize: { value: search.search?.alertItemsPerPage },\n\t\t\timportanceHigh: { value: search.severity?.high },\n\t\t\timportanceMedium: { value: search.severity?.medium },\n\t\t\timportanceLow: { value: search.severity?.low },\n\t\t\talertType: { value: search.severity?.alertType.toLowerCase() },\n\t\t\tclassification: { value: search.severity?.alertClassification },\n\t\t\tonGoing: { value: search.alertStatus?.ongoing },\n\t\t\trecent: { value: search.alertStatus?.recent },\n\t\t\tstartBeforeOrAfter: { value: search.alertStatus?.isStart && search.alertStatus?.start },\n\t\t\tendBeforeOrAfter: { value: search.alertStatus?.isEnd && search.alertStatus?.end },\n\t\t\tstartDate: { value: search.alertStatus?.isStart && search.alertStatus?.startDate },\n\t\t\tstartTime: { value: search.alertStatus?.isStart && search.alertStatus?.startTime },\n\t\t\tendDate: { value: search.alertStatus?.isEnd && search.alertStatus?.endDate },\n\t\t\tendTime: { value: search.alertStatus?.isEnd && search.alertStatus?.endTime },\n\t\t\tlowThreshold: { value: search.maxImpactAlertTraffic?.lowValue },\n\t\t\thighThreshold: { value: search.maxImpactAlertTraffic?.highValue },\n\t\t\tthresholdUnit: { value: search.maxImpactAlertTraffic?.lowHighValueUnits },\n\t\t\tlowSeverityPercent: { value: search.maxSeverityPercent?.lowValue },\n\t\t\thighSeverityPercent: { value: search.maxSeverityPercent?.highValue },\n\t\t};\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport {\n\tTA_DROPDOWN_ITEMS_PER_PAGE,\n\tTA_WIZARD_ITEMS_PER_PAGE,\n\tTA_DROPDOWN_STATUS_START,\n\tTA_DROPDOWN_STATUS_END,\n\tTA_DROPDOWN_MITIGATION_TYPE,\n\tTA_DROPDOWN_MITIGATION_IP_VERSION,\n} from '@src/app/stores/report/traffic/traffic.model';\nimport { NameValueOption } from '@src/app/stores/common.model';\nimport { MitigationSearchForm, MitigationSearchFormValuesPartial, SearchWizardStatusType } from './search.model';\nimport { MitigationSearchQuery } from '@src/app/stores/report/mitigation/mitigation.model';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class SearchWizardMitigationService {\n\n\tprivate mitigationMinStartDate: string;\n\n\tgetItemsPerPage(): number {\n\t\treturn TA_WIZARD_ITEMS_PER_PAGE;\n\t}\n\n\tgetStatus(): NameValueOption[] {\n\t\treturn [\n\t\t\t{ name: 'ongoing', value: false },\n\t\t\t{ name: 'recent', value: false },\n\t\t];\n\t}\n\n\tgetStatusByType(type: SearchWizardStatusType): NameValueOption[] {\n\t\treturn type === 'START' ? [...TA_DROPDOWN_STATUS_START] : [...TA_DROPDOWN_STATUS_END];\n\t}\n\n\tgetMitigationTypes(): NameValueOption[] {\n\t\treturn [...TA_DROPDOWN_MITIGATION_TYPE];\n\t}\n\n\tgetMitigationIpVersions(): NameValueOption[] {\n\t\treturn [...TA_DROPDOWN_MITIGATION_IP_VERSION];\n\t}\n\n\tsetMinMitigationStartDate(startTime: string) {\n\t\tthis.mitigationMinStartDate = startTime;\n\t}\n\n\tgetMinMitigationStartDate() {\n\t\treturn this.mitigationMinStartDate;\n\t}\n\n\tgenerateMitigationSearchWizardForm(): FormGroup {\n\t\treturn new FormGroup({\n\t\t\tmitigationSearch: new FormGroup({\n\t\t\t\tmitigationSearchString: new FormControl(''),\n\t\t\t\tmitigationItemsPerPage: new FormControl(this.getItemsPerPage()),\n\t\t\t}),\n\t\t\tmitigationStatus: new FormGroup({\n\t\t\t\tongoing: new FormControl(true),\n\t\t\t\trecent: new FormControl(true),\n\t\t\t\tisStart: new FormControl({ value: true, disabled: false }),\n\t\t\t\tisEnd: new FormControl({ value: false, disabled: true }),\n\t\t\t\tstart: new FormControl('after'),\n\t\t\t\tend: new FormControl({ value: 'before', disabled: true }),\n\t\t\t\tstartDate: new FormControl(''),\n\t\t\t\tendDate: new FormControl({ value: '', disabled: true }),\n\t\t\t\tstartTime: new FormControl(''),\n\t\t\t\tendTime: new FormControl({ value: '', disabled: true }),\n\t\t\t}),\n\t\t\tipVersion: new FormGroup({\n\t\t\t\tipv4: new FormControl(false),\n\t\t\t\tipv6: new FormControl(false),\n\t\t\t}),\n\t\t\tmitigationType: new FormGroup({\n\t\t\t\tflowspec: new FormControl(false),\n\t\t\t\tnotFlowspec: new FormControl(false),\n\t\t\t}),\n\t\t});\n\t}\n\n\tgetSearchQuery(search: MitigationSearchFormValuesPartial): Partial {\n\t\treturn {\n\t\t\tmitigationSearchString: { value: search.mitigationSearch?.mitigationSearchString },\n\t\t\tmitigationItemsPerPage: { value: search.mitigationSearch?.mitigationItemsPerPage },\n\t\t\tonGoing: { value: search.mitigationStatus?.ongoing },\n\t\t\trecent: { value: search.mitigationStatus?.recent },\n\t\t\tstartBeforeOrAfter: { value: search.mitigationStatus?.isStart && search.mitigationStatus?.start },\n\t\t\tendBeforeOrAfter: { value: search.mitigationStatus?.isEnd && search.mitigationStatus?.end },\n\t\t\tstartDate: { value: search.mitigationStatus?.isStart && search.mitigationStatus?.startDate },\n\t\t\tendDate: { value: search.mitigationStatus?.isEnd && search.mitigationStatus?.endDate },\n\t\t\tstartTime: { value: search.mitigationStatus?.isStart && search.mitigationStatus?.startTime },\n\t\t\tendTime: { value: search.mitigationStatus?.isEnd && search.mitigationStatus?.endTime },\n\t\t\tipv4: { value: search.ipVersion?.ipv4 },\n\t\t\tipv6: { value: search.ipVersion?.ipv6 },\n\t\t\tflowspec: { value: search.mitigationType?.flowspec },\n\t\t\tnotFlowspec: { value: search.mitigationType?.notFlowspec },\n\t\t};\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport {\n\tAfterViewInit,\n\tDirective,\n\tElementRef,\n\tHostListener,\n\tInput,\n\tOnChanges,\n\tRenderer2,\n\tSimpleChanges,\n} from '@angular/core';\n\n@Directive({\n\tselector: '[ddos-radio-button]',\n})\nexport class DdosRadioButtonDirective implements AfterViewInit, OnChanges {\n\t@Input('selected') selected: boolean;\n\n\telementClass = 'active-radio';\n\n\tconstructor(\n\t\tprivate renderer: Renderer2,\n\t\tpublic el: ElementRef\n\t) {}\n\n\tngAfterViewInit() {}\n\n\tngOnChanges(changes: SimpleChanges): void {\n\t\tif (changes.selected.currentValue) {\n\t\t\tthis.renderer.addClass(this.el.nativeElement, this.elementClass);\n\t\t} else {\n\t\t\tthis.renderer.removeClass(this.el.nativeElement, this.elementClass);\n\t\t}\n\t}\n\n\t@HostListener('click', ['$event']) onClick(event) {\n\t\tconst activeElement = this.el.nativeElement.classList.contains(this.elementClass);\n\n\t\tif (!activeElement) {\n\t\t\tthis.renderer.addClass(event.target, this.elementClass);\n\t\t} else {\n\t\t\tthis.renderer.removeClass(event.target, this.elementClass);\n\t\t}\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { Alert, AlertKeyObject } from '@src/app/stores/alert/alert.model';\nimport { assertValue } from '@src/app/utils/assert';\n\n@Pipe({\n\tname: 'alertToAlert',\n})\nexport class AlertToAlertPipe implements PipeTransform {\n\ttransform(alertKeyObject: AlertKeyObject, alertId: string): Alert {\n\t\treturn assertValue(alertKeyObject.objects[alertId]);\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { Alert, AlertKeyObject } from '@src/app/stores/alert/alert.model';\n\n@Pipe({\n\tname: 'alertToAlerts',\n})\nexport class AlertToAlertsPipe implements PipeTransform {\n\ttransform(alertKeyObject: AlertKeyObject): Alert[] {\n\t\treturn alertKeyObject.keys.map((k) => alertKeyObject.objects[k]);\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { NgModule } from '@angular/core';\nimport { CommonModule, DatePipe, TitleCasePipe } from '@angular/common';\n\n// MATERIAL IMPORTS\n\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatIconModule } from '@angular/material/icon';\nimport { LayoutModule } from '@angular/cdk/layout';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule, MatOptionModule } from '@angular/material/core';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\n\nimport { NgxMatTimepickerModule } from 'ngx-mat-timepicker';\nimport { DdosToggleButtonDirective } from './directives/ddos-toggle-button.directive';\nimport { DdosRadioButtonDirective } from './directives/ddos-radio-button.directive';\nimport { ConfirmDialog } from './confirm-dialog/confirm.component';\nimport { DdosListComponent } from './ddos-list/ddos-list.component';\nimport { DialogComponent } from './dialog/dialog.component';\nimport { LoaderComponent } from './loader/loader.component';\nimport { PageNotFoundComponent } from './page-not-found/page-not-found.component';\nimport { PropertyGetterPipe } from './pipes/data-property-getter.pipe';\nimport { InnerHtmlPipe } from './pipes/inner-html.pipe';\nimport { SearchWizardAlertComponent } from './search-wizard/search-wizard-alert/search-wizard-alert.component';\nimport { SearchWizardMitigationComponent } from './search-wizard/search-wizard-mitigation/search-wizard-mitigation.component';\nimport { ShellComponent } from './shell/shell.component';\nimport { SidebarComponent } from './sidebar/sidebar.component';\nimport { DdosTableTableComponent } from './table/table.component';\nimport { TimerComponent } from './timer/timer.component';\nimport { AlertToAlertPipe } from './pipes/alert-ko-alert.pipe';\nimport { AlertToAlertsPipe } from './pipes/alert-ko-alerts.pipe';\nimport { SearchDateFilterComponent } from './search-wizard/common/search-date-filter/search-date-filter.component';\nimport { DurationPipe } from './pipes/duration.pipe';\nimport { BdidNotFoundComponent } from './bdid-not-found/bdid-not-found.component';\nimport { SnackbarComponent } from './snackbar/snackbar.component';\n\nconst COMPONENTS = [\n\tSidebarComponent,\n\tShellComponent,\n\tDdosToggleButtonDirective,\n\tDdosRadioButtonDirective,\n\tTimerComponent,\n\tSearchWizardAlertComponent,\n\tSearchWizardMitigationComponent,\n\tSearchDateFilterComponent,\n\tDdosTableTableComponent,\n\tLoaderComponent,\n\tDdosListComponent,\n\tPageNotFoundComponent,\n\tBdidNotFoundComponent,\n];\n\nconst DIALOGS = [ConfirmDialog, DialogComponent, SnackbarComponent];\n\nconst PIPES = [PropertyGetterPipe, InnerHtmlPipe, AlertToAlertPipe, AlertToAlertsPipe, DurationPipe];\nconst MODULES = [\n\tCommonModule,\n\tMatToolbarModule,\n\tMatIconModule,\n\tLayoutModule,\n\tMatButtonModule,\n\tMatSidenavModule,\n\tMatListModule,\n\tMatMenuModule,\n\tMatIconModule,\n\tMatCardModule,\n\tMatExpansionModule,\n\tMatFormFieldModule,\n\tMatInputModule,\n\tMatSnackBarModule,\n\tFormsModule,\n\tReactiveFormsModule,\n\tRouterModule,\n\tMatButtonToggleModule,\n\tMatCheckboxModule,\n\tMatSelectModule,\n\tMatDividerModule,\n\tMatDatepickerModule,\n\tMatNativeDateModule,\n\tMatTabsModule,\n\tMatTableModule,\n\tMatOptionModule,\n\tMatPaginatorModule,\n\tMatSortModule,\n\tMatChipsModule,\n\tScrollingModule,\n\tMatDialogModule,\n\tMatTooltipModule,\n\tMatProgressSpinnerModule,\n\tMatProgressBarModule,\n\tMatRadioModule,\n\tNgxMatTimepickerModule,\n];\n\n@NgModule({\n\tdeclarations: [...COMPONENTS, ...DIALOGS, ...PIPES],\n\timports: [...MODULES],\n\tentryComponents: [...DIALOGS],\n\tproviders: [DatePipe, TitleCasePipe],\n\texports: [...COMPONENTS, ...MODULES, ...PIPES],\n})\nexport class SharedModule {}\n","
\n
\n
\n \"Company\n

AT&T DDoS Portal

\n
\n
\n \n
\n
\n\n
\n \n
\n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { TabItem } from '@src/app/routing-constants';\nimport { AppLayoutStore } from '@src/app/stores/app-layout/app-layout.store';\nimport { MatRadioChange } from '@angular/material/radio';\nimport { Observable, Subject, Subscription, takeUntil } from 'rxjs';\nimport { SessionStore } from '@src/app/stores/session/session.store';\nimport { CompanyInfo, Userinfo } from '@src/app/stores/session/session.model';\nimport { GlobalGetsStore } from '@src/app/stores/global-gets.store';\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { environment } from '@src/environments/environment';\nimport { CompanyOfferType } from '@app/stores/common.model';\nimport { SidebarComponent } from '../sidebar/sidebar.component';\nimport { ConfirmDialogData, ConfirmDialogService } from '../services/dialog/confirm-dialog.service';\nimport { ConfirmDialog } from '../confirm-dialog/confirm.component';\n\n@Component({\n\tselector: 'ddos-ui-shell',\n\ttemplateUrl: './shell.component.html',\n\tstyleUrls: ['./shell.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShellComponent implements OnInit, OnDestroy {\n\tuser$: Observable;\n\n\tassignedCompanies$: Observable;\n\n\tcurrentCompany$: Observable;\n\n\ttabItems$: Observable;\n\n\tglobalGetsDone$: Observable;\n\n\tisAuthenticatedAndReady$: Observable;\n\n\treadonly userBtnTooltip: string = 'User settings';\n\n\t@ViewChild('sidebar', { static: true }) sidebar: SidebarComponent;\n\n\tprivate arborModalSub: Subscription;\n\n\tprivate arborDialog: MatDialogRef;\n\n\tprivate destroy$ = new Subject();\n\n\tprotected readonly CompanyOfferType = CompanyOfferType;\n\n\tconstructor(\n\t\tprivate navigationStore: AppLayoutStore,\n\t\tprivate sessionStore: SessionStore,\n\t\tprivate globalGetsStore: GlobalGetsStore,\n\t\tprivate confirmDialogService: ConfirmDialogService\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.user$ = this.sessionStore.user$;\n\t\tthis.currentCompany$ = this.sessionStore.currentCompany$;\n\t\tthis.assignedCompanies$ = this.sessionStore.assignedCompanies$;\n\t\tthis.tabItems$ = this.navigationStore.tabItems$;\n\t\tthis.globalGetsDone$ = this.globalGetsStore.globalGetsDone$;\n\t\tthis.sessionStore.loadUserData();\n\t\tthis.isAuthenticatedAndReady$ = this.sessionStore.isAuthenticatedAndReady$;\n\t\tthis.sessionStore.beforeReload$.pipe(takeUntil(this.destroy$)).subscribe((reload) => {\n\t\t\tif (reload) {\n\t\t\t\tthis.saveCurrentCompany();\n\t\t\t}\n\t\t});\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.destroy$.next(true);\n\t\tthis.destroy$.unsubscribe();\n\t}\n\n\tonCustomerSelectionChange(event: MatRadioChange) {\n\t\tthis.sessionStore.changeCompanyId(event.value as number);\n\t\tthis.saveCurrentCompany();\n\t}\n\n\tonLogout() {\n\t\tthis.sessionStore.endSession();\n\t}\n\n\topenArborPortalModal() {\n\t\tconst data: ConfirmDialogData = {\n\t\t\ttitle: 'Arbor Portal',\n\t\t\tmessage: 'Access to the Customer Arbor Portal will be available until the end of 2024 and then will be removed.',\n\t\t\tconfirmActionText: 'Ok',\n\t\t\tcancelActionText: 'Cancel',\n\t\t\tclosable: true,\n\t\t};\n\t\tconst dialogConfig: MatDialogConfig = {\n\t\t\twidth: '500px',\n\t\t\tdisableClose: false,\n\t\t};\n\n\t\tthis.arborDialog = this.confirmDialogService.openConfirmDialog(data, dialogConfig);\n\n\t\tthis.subscribeToArborModalConfirm(this.arborDialog.componentInstance);\n\t}\n\n\tprivate saveCurrentCompany() {\n\t\tthis.sessionStore.saveCurrentSettings('companyInfo', this.sessionStore.currentCompany);\n\t}\n\n\tprivate subscribeToArborModalConfirm(dialog: ConfirmDialog) {\n\t\tthis.arborModalSub?.unsubscribe();\n\n\t\tthis.arborModalSub = dialog.actionConfirmed.pipe(takeUntil(this.destroy$)).subscribe(() => {\n\t\t\twindow.open(environment.ARBOR_PORTAL_URL, '_blank');\n\t\t});\n\t}\n}\n","
0\" #drawer id=\"ddos-sidebar\" class=\"ddos-sidebar-container\" data-cy=\"sidebar-nav-menu\">\n \n \n \n \n \n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { AppLayoutRouting, SidebarChild, SidebarItem, TrafficLayoutRouting } from '@src/app/routing-constants';\nimport { Subject, filter, takeUntil } from 'rxjs';\n\n@Component({\n\tselector: 'ddos-ui-sidebar',\n\ttemplateUrl: './sidebar.component.html',\n\tstyleUrls: ['./sidebar.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarComponent implements OnInit, OnDestroy {\n\t@Input() sidebarOpened: boolean;\n\n\tprivate sidebarStarted = false;\n\n\tprivate _sidebarItems: SidebarItem[];\n\n\t@Input() set sidebarItems(items: SidebarItem[]) {\n\t\tif (items?.length > 0 && !this.sidebarStarted) {\n\t\t\tthis.sidebarStarted = true;\n\t\t\tthis._sidebarItems = items;\n\t\t\tthis.setInitialActiveElement();\n\t\t}\n\t}\n\n\tget sidebarItems(): SidebarItem[] {\n\t\treturn this._sidebarItems;\n\t}\n\n\tprivate destroy$ = new Subject();\n\n\tconstructor(\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate router: Router\n\t) {}\n\n\tngOnInit() {\n\t\tthis.router.events\n\t\t\t.pipe(\n\t\t\t\tfilter((event) => event instanceof NavigationEnd),\n\t\t\t\ttakeUntil(this.destroy$)\n\t\t\t)\n\t\t\t.subscribe((event: NavigationEnd) => this.captureTopNavTrafficEvent(event));\n\t}\n\n\tngOnDestroy() {\n\t\tthis.destroy$.next(true);\n\t\tthis.destroy$.unsubscribe();\n\t}\n\n\tsetActiveElement(currentItem: SidebarItem) {\n\t\tthis._sidebarItems = this._sidebarItems?.map((s) => ({\n\t\t\t...s,\n\t\t\tisActive: s.path === currentItem.path,\n\t\t\tchildren: this.desactivateChildren(s.children),\n\t\t}));\n\t\tthis.cd.detectChanges();\n\t}\n\n\tsetActiveChildElement(currentItem: SidebarItem, childRouteItem: SidebarChild) {\n\t\tthis._sidebarItems = this._sidebarItems?.map((s) => {\n\t\t\tconst childrenActivated: SidebarChild[] = s.children?.map((c) => ({\n\t\t\t\t...c,\n\t\t\t\tisActive: c.path === childRouteItem.path,\n\t\t\t}));\n\n\t\t\treturn s.path !== currentItem.path ? s : { ...s, children: [...childrenActivated] };\n\t\t});\n\t\tthis.cd.detectChanges();\n\t}\n\n\tasync onRouteClick(item: SidebarItem) {\n\t\tawait this.router.navigate([item.path]).then(() => {\n\t\t\tthis.setActiveElement(item);\n\t\t});\n\t}\n\n\tasync onChildRouteClick(childRouteItem: SidebarChild, currentItem: SidebarItem) {\n\t\tawait this.router.navigate([childRouteItem.path]).then(() => {\n\t\t\tthis.setActiveChildElement(currentItem, childRouteItem);\n\t\t});\n\t}\n\n\ttrackByItems(_index: number, item: SidebarItem | SidebarChild) {\n\t\treturn `${item.path}${item.isActive ? 'active' : ''}`;\n\t}\n\n\tprivate setInitialActiveElement() {\n\t\tconst { url } = this.router;\n\t\tconst currentElement: SidebarItem = this.getElementByUrl(this.router.url, this.sidebarItems);\n\t\tif (!currentElement) {\n\t\t\tthis.sidebarItems\n\t\t\t\t.filter((s) => s.children?.length > 0)\n\t\t\t\t?.forEach((c) => {\n\t\t\t\t\tconst childElement = this.getElementByUrl(url, c.children);\n\t\t\t\t\tif (childElement) {\n\t\t\t\t\t\tthis.setActiveElement(c);\n\t\t\t\t\t\tthis.setActiveChildElement(c, childElement);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.setActiveElement(currentElement);\n\t\t}\n\t}\n\n\tprivate getElementByUrl(url: string, menuElements: T[]): T | undefined {\n\t\treturn menuElements?.find((item) => item.path.includes(url));\n\t}\n\n\tprivate captureTopNavTrafficEvent(event: NavigationEnd) {\n\t\tlet topNavigationFound: string;\n\t\tif (event.url === `/${AppLayoutRouting.TRAFFIC}`) {\n\t\t\ttopNavigationFound = `/${AppLayoutRouting.TRAFFIC}/${TrafficLayoutRouting.ANALYTICS}`;\n\t\t} else if (event.url === `/${AppLayoutRouting.REPORTS}/${AppLayoutRouting.ALERT_REPORT}`) {\n\t\t\ttopNavigationFound = `/${AppLayoutRouting.REPORTS}/${AppLayoutRouting.ALERT_REPORT}`;\n\t\t} else if (event.url === `/${AppLayoutRouting.REPORTS}/${AppLayoutRouting.MITIGATION_REPORT}`) {\n\t\t\ttopNavigationFound = `/${AppLayoutRouting.REPORTS}/${AppLayoutRouting.MITIGATION_REPORT}`;\n\t\t}\n\t\tif (topNavigationFound) {\n\t\t\tconst trafficAnalyticsElement: SidebarItem = this.getElementByUrl(\n\t\t\t\ttopNavigationFound,\n\t\t\t\tthis.sidebarItems\n\t\t\t);\n\t\t\tif (trafficAnalyticsElement) {\n\t\t\t\tthis.setActiveElement(trafficAnalyticsElement);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate desactivateChildren(children: SidebarChild[]): SidebarChild[] {\n\t\treturn children.map((c) => ({ ...c, isActive: false }));\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Component, Inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\n\nexport enum SNACKBAR_TYPE {\n\tSUCCESS = 'success',\n\tERROR = 'error',\n\tINFO = 'info',\n}\n\nexport type SnackbarData = {\n\tsnackType: SNACKBAR_TYPE;\n\tmessage: string;\n};\n\nexport const snackBarDuration = 6000;\n\n@Component({\n\tselector: 'ddos-ui-snackbar',\n\ttemplateUrl: './snackbar.component.html',\n\tstyleUrls: ['./snackbar.component.scss'],\n})\nexport class SnackbarComponent {\n\tconstructor(\n\t\t@Inject(MAT_SNACK_BAR_DATA) public data: SnackbarData,\n\t\tprivate snackRef: MatSnackBarRef\n\t) {}\n\n\tget getIcon(): string {\n\t\tswitch (this.data.snackType) {\n\t\t\tcase SNACKBAR_TYPE.SUCCESS:\n\t\t\t\treturn 'check_circle';\n\t\t\tcase SNACKBAR_TYPE.ERROR:\n\t\t\t\treturn 'error_outline';\n\t\t\tdefault:\n\t\t\t\treturn 'info_outline';\n\t\t}\n\t}\n\n\tget getClass(): string {\n\t\treturn `snackbar-${this.data.snackType}`;\n\t}\n\n\tclose(): void {\n\t\tthis.snackRef.dismiss();\n\t}\n}\n","
\n
\n {{getIcon}}\n {{data.message}}\n
\n \n
\n","\n

\n
\n\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n ‌\n \n \n \n \n \n \n \n \n\n \n \n \n ‌\n \n \n \n \n \n\n \n \n \n ‌\n \n \n \n \n \n \n \n\n \n \n \n \n {{ tblColumn.columnName }}\n \n {{ tblColumn.columnNameIcon }}\n \n \n \n \n \n \n {{ tblColumn.columnName }}\n \n {{ tblColumn.columnNameIcon }}\n \n \n \n\n \n \n \n \n {{ tblColumn.dataKeyIcon }}\n \n \n \n\n \n \n \n \n \n {{ element | propertyGetter : tblColumn.dataKey }}\n \n \n \n \n \n {{ element | propertyGetter : tblColumn.dataKey }}\n \n \n \n \n {{ element | propertyGetter : tblColumn.dataKey }}\n \n \n \n \n \n \n\n \n \n \n\n \n \n \n \n \n
\n\n
\n \n \n \n
\n
\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport {\n\tAfterViewInit,\n\tChangeDetectionStrategy,\n\tComponent,\n\tEventEmitter,\n\tInput,\n\tOnDestroy,\n\tOnInit,\n\tOutput,\n\tViewChild,\n} from '@angular/core';\nimport { MatSort, Sort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { Observable, Subject, takeUntil } from 'rxjs';\nimport { NumberInput } from '@angular/cdk/coercion';\nimport { TableColumn, TableRowClick, TableDataSource } from '@src/app/stores/common.model';\nimport { tryParseJson } from '@src/app/utils/key-object';\nimport { OrUndefineable } from '@src/types/types.utils';\nimport moment from 'moment';\n\nconst DEFAULT_PAGINATION_SIZES: number[] = [5, 10, 15];\nconst DEFAULT_DATE_YEAR = 2001;\nconst DEFAULT_NO_DATA_MESSAGE = 'No data available';\n\n@Component({\n\tselector: 'ddos-table',\n\ttemplateUrl: './table.component.html',\n\tstyleUrls: ['./table.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DdosTableTableComponent implements OnInit, AfterViewInit, OnDestroy {\n\tprotected tblHeaders: string[];\n\n\tprotected tblColumns: TableColumn[] = [];\n\n\tprotected tblDataSource = new MatTableDataSource([]);\n\n\tprotected selection = new SelectionModel(true, []);\n\n\tprotected showPaginate = false;\n\n\tprotected rowActionIconList: { icon: string; tooltip: string }[];\n\n\tprotected rowActionSingleIcon: string;\n\n\tprivate _data: TableDataSource[];\n\n\tprivate _destroy$ = new Subject();\n\n\tprivate _tableHasBeenInitialized = false;\n\n\tprivate _simpleSearchText: OrUndefineable = undefined;\n\n\tprivate _flatPlainObjectFilterJson: OrUndefineable = undefined;\n\n\t@ViewChild(MatPaginator, { static: false }) matPaginator: MatPaginator;\n\n\t@ViewChild(MatSort) set matSort(sort: MatSort) {\n\t\tthis.tblDataSource.sort = sort;\n\t}\n\n\t// Table input properties.\n\t@Input() isPageable = false;\n\n\t@Input() isSortable = false;\n\n\t@Input() isFilterable = false;\n\n\t@Input() isStickyHeader = false;\n\n\t@Input() isSelectable = false;\n\n\t@Input() hasRowLink = false;\n\n\t@Input() hasIdLink = false;\n\n\t@Input() rowActionIcon:\n\t\t| string\n\t\t| {\n\t\t\t\ticon: string;\n\t\t\t\ttooltip: string;\n\t\t }[] = [];\n\n\t@Input() rowActionMenu: string[] = [];\n\n\t@Input() paginationSizes: number[] = DEFAULT_PAGINATION_SIZES;\n\n\tprivate _defaultPageSize: NumberInput = DEFAULT_PAGINATION_SIZES[1];\n\n\t@Input() defaultSortingColumn: string;\n\n\t@Input() defaultSortingDirection: 'asc' | 'desc' | undefined;\n\n\t@Input() set defaultPageSize(size) {\n\t\tthis._defaultPageSize = size;\n\t\tif (this.matPaginator) {\n\t\t\tthis.matPaginator.pageSize = +size;\n\t\t\tthis.matPaginator._changePageSize(+size);\n\t\t\tthis.tblDataSource.paginator.firstPage();\n\t\t}\n\t}\n\n\tget defaultPageSize(): NumberInput {\n\t\treturn this._defaultPageSize;\n\t}\n\n\t@Input() set data(data: TableDataSource[]) {\n\t\tthis._data = data;\n\t\tif (this._tableHasBeenInitialized) {\n\t\t\tthis.initDataSource();\n\t\t}\n\t}\n\n\t@Input() set columns(columns: TableColumn[]) {\n\t\tthis.tblColumns = columns;\n\t}\n\n\t@Input() set flatPlainObjectFilterJson(value: string) {\n\t\tthis._flatPlainObjectFilterJson = value;\n\t\t// just use to trigger the filter, we don't use * here.\n\t\tthis.tblDataSource.filter = '*';\n\t}\n\n\t@Input() set searchText(value: string) {\n\t\tthis._simpleSearchText = value;\n\t\t// just use to trigger the filter, we don't use * here.\n\t\tthis.tblDataSource.filter = '*';\n\t}\n\n\t@Input() noDataMessage = DEFAULT_NO_DATA_MESSAGE;\n\n\t@Output() sort: EventEmitter = new EventEmitter();\n\n\t@Output() rowAction = new EventEmitter();\n\n\t@Output() onRowClick = new EventEmitter();\n\n\t@Output() onSelectRow = new EventEmitter();\n\n\t@Output() connect = new EventEmitter>();\n\n\t@Output() initialized = new EventEmitter();\n\n\t@Output() paginatorEvent = new EventEmitter();\n\n\tngOnInit() {\n\t\tthis.selection.changed.pipe(takeUntil(this._destroy$)).subscribe(() => {\n\t\t\tthis.onSelectRow.emit(this.selection.selected);\n\t\t});\n\t}\n\n\tngAfterViewInit() {\n\t\tthis.initTableColumns();\n\t\tthis.initDataSource();\n\t\tthis._tableHasBeenInitialized = true;\n\t\tthis.initialized.emit(true);\n\t}\n\n\tngOnDestroy() {\n\t\tthis._destroy$.next(true);\n\t\tthis._destroy$.unsubscribe();\n\t}\n\n\tinitTableColumns() {\n\t\tconst columns = [...this.tblColumns];\n\t\tthis.tblHeaders = columns.map((tableColumn: TableColumn) => tableColumn.columnName);\n\t\tif (typeof this.rowActionIcon === 'string') {\n\t\t\tthis.rowActionSingleIcon = this.rowActionIcon;\n\t\t\tthis.tblHeaders = [...this.tblHeaders, this.rowActionSingleIcon];\n\t\t} else if (Array.isArray(this.rowActionIcon)) {\n\t\t\tthis.rowActionIconList = [...this.rowActionIcon];\n\t\t\tthis.tblHeaders = [...this.tblHeaders, ...this.rowActionIconList.map((item) => item.icon)];\n\t\t}\n\n\t\tthis.tblHeaders = this.isSelectable ? ['select', ...this.tblHeaders] : this.tblHeaders;\n\t\tthis.tblHeaders = this.rowActionMenu?.length ? [...this.tblHeaders, 'actionMenu'] : this.tblHeaders;\n\t}\n\n\tprivate initDataSource() {\n\t\tthis.tblDataSource = new MatTableDataSource(this._data);\n\t\tthis.tblDataSource.sortingDataAccessor = this.sortingDataAccessor;\n\t\tif (this.matPaginator) {\n\t\t\tthis.matPaginator.pageSize = this.matPaginator.pageSize ?? (DEFAULT_PAGINATION_SIZES[1] as NumberInput);\n\t\t\tthis.tblDataSource.paginator = this.matPaginator;\n\t\t}\n\t\tthis.showPaginate = this.tblDataSource.data.length > 0;\n\t\tthis.tblDataSource.filterPredicate = this.filterPredicate;\n\t\tthis.connect.emit(this.tblDataSource.connect().asObservable());\n\t\tthis._tableHasBeenInitialized = true;\n\t\t// This line is for triggering the search event after the filterpredicate has been set, it only happens once\n\t\tthis.searchText = this._simpleSearchText;\n\t\tthis.tblDataSource.filter = '*';\n\t}\n\n\tsortingDataAccessor: (row: TableDataSource, sortHeaderId: string) => string | number = (\n\t\trow: TableDataSource,\n\t\tsortHeaderId: string\n\t): string | number => {\n\t\tswitch (sortHeaderId) {\n\t\t\tcase 'startDate':\n\t\t\tcase 'startTime':\n\t\t\tcase 'endDate':\n\t\t\tcase 'endTime':\n\t\t\t\treturn row[sortHeaderId] ? this.formatDateForSorting(row[sortHeaderId].toString()) : '';\n\n\t\t\tcase 'duration':\n\t\t\t\treturn row[sortHeaderId] ? this.formatDurationForSorting(row[sortHeaderId].toString()) : '';\n\n\t\t\tdefault:\n\t\t\t\tif (typeof row[sortHeaderId] === 'string') {\n\t\t\t\t\treturn row[sortHeaderId].toString().toLowerCase();\n\t\t\t\t}\n\t\t\t\tif (typeof row[sortHeaderId] === 'bigint' || typeof row[sortHeaderId] === 'number') {\n\t\t\t\t\treturn Number(row[sortHeaderId]);\n\t\t\t\t}\n\t\t\t\treturn row[sortHeaderId].toString();\n\t\t}\n\t};\n\n\tprivate formatDateForSorting(rawDate: string): string {\n\t\tlet formattedDate = '';\n\t\tlet date = '';\n\t\tconst splittedDate: string[] = rawDate.toString().split(' - ');\n\t\tif (splittedDate?.length > 1) {\n\t\t\t[date] = splittedDate;\n\t\t} else {\n\t\t\t[date] = splittedDate;\n\t\t}\n\t\tconst dateIncludesYear: boolean = DEFAULT_DATE_YEAR < moment.utc(date).year();\n\t\tformattedDate = dateIncludesYear\n\t\t\t? moment.utc(date).format()\n\t\t\t: moment.utc(date).set('year', moment.utc().year()).format();\n\t\treturn formattedDate;\n\t}\n\n\tprivate formatDurationForSorting(rawDuration: string): string {\n\t\tlet formattedDuration = '';\n\t\tconst mitigationWithDaysDuration = /[0-9]+d,\\s\\d\\d:\\d\\d:\\d\\d/;\n\t\tconst mitigationWithoutDaysDuration = /\\d\\d:\\d\\d:\\d\\d/;\n\t\tif (mitigationWithDaysDuration.test(rawDuration)) {\n\t\t\tconst duratioWithDays: string[] = rawDuration.split('d, ');\n\t\t\tformattedDuration = `${duratioWithDays[0].padStart(3, '0')}:${duratioWithDays[1]}`;\n\t\t} else if (mitigationWithoutDaysDuration.test(rawDuration)) {\n\t\t\tformattedDuration = `000:${rawDuration}`;\n\t\t} else {\n\t\t\tconst splittedDate: string[] = rawDuration.toString().split(' ');\n\t\t\tif (splittedDate?.length > 2) {\n\t\t\t\tconst date: string = splittedDate.slice(0, 3).join(' ');\n\t\t\t\tformattedDuration = moment.utc(date).format();\n\t\t\t} else {\n\t\t\t\tformattedDuration = rawDuration;\n\t\t\t}\n\t\t}\n\t\treturn formattedDuration;\n\t}\n\n\tprotected hasData() {\n\t\treturn this._data?.length > 0;\n\t}\n\n\tgetIconColor(element: TableColumn, iconOptions: string | string[]) {\n\t\tif ('dataKeyIconColor' in element) {\n\t\t\treturn element.dataKeyIconColor;\n\t\t}\n\n\t\treturn iconOptions;\n\t}\n\n\tfilterPredicate = (dataSource: TableDataSource, _: string): boolean => {\n\t\tif (!this._simpleSearchText && !this._flatPlainObjectFilterJson) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// try to parse the filter if it was constructed from a plain object.\n\t\t// otherwise, it was a simple string, skip to the next if.\n\t\tconst filterObject = tryParseJson(this._flatPlainObjectFilterJson);\n\t\tlet matched = true;\n\t\tif (filterObject && typeof filterObject === 'object' && Object.keys(filterObject).length > 0) {\n\t\t\tmatched = Object.entries(filterObject).every(([key, filterValue]) => {\n\t\t\t\tconst dataValue = dataSource[key];\n\t\t\t\treturn (\n\t\t\t\t\t!filterValue ||\n\t\t\t\t\tfilterValue === 'All' ||\n\t\t\t\t\tdataValue.toString().toLowerCase().includes(filterValue.toLowerCase())\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tif (!this._simpleSearchText) {\n\t\t\treturn matched;\n\t\t}\n\n\t\tmatched =\n\t\t\tmatched &&\n\t\t\tObject.entries(dataSource).some(([, value]) => {\n\t\t\t\treturn value?.toString().toLowerCase().includes(this._simpleSearchText.toLowerCase());\n\t\t\t});\n\n\t\treturn matched;\n\t};\n\n\tisAllSelected() {\n\t\tconst numSelected = this.selection.selected.length;\n\t\tconst numRows = this.tblDataSource.data?.length;\n\t\treturn numSelected === numRows;\n\t}\n\n\ttoggleAllRows() {\n\t\tif (this.isAllSelected()) {\n\t\t\tthis.selection.clear();\n\t\t} else {\n\t\t\tthis.selection.select(...this.tblDataSource.data);\n\t\t}\n\t}\n\n\tsortTable(sortParameters: Sort) {\n\t\tthis.sort.emit({\n\t\t\t...sortParameters,\n\t\t\tactive: this.tblColumns.find((column) => column.dataKey === sortParameters.active).dataKey,\n\t\t});\n\t}\n\n\temitRowAction(row: TableDataSource, icon?: string) {\n\t\tthis.rowAction.emit({ actionIcon: icon, rowValue: row });\n\t}\n\n\tonClick(row: TableDataSource, icon: string | string[]) {\n\t\tif (!this.hasIdLink) {\n\t\t\tthis.onRowClick.emit({ actionIcon: icon, rowValue: row });\n\t\t}\n\t}\n\n\tonPaginatorChange(page: PageEvent) {\n\t\tthis.paginatorEvent.emit(page);\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { DatePipe } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tElementRef,\n\tInput,\n\tNgZone,\n\tOnInit,\n\tRenderer2,\n\tViewChild,\n} from '@angular/core';\nimport moment from 'moment';\nimport 'moment-timezone';\n\n@Component({\n\tselector: 'ddos-ui-timer',\n\ttemplateUrl: './timer.component.html',\n\tstyleUrls: ['./timer.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimerComponent implements OnInit {\n\tnow: Date;\n\n\tcurrentTime: string;\n\n\t@Input() type: any = '';\n\n\t@Input() format = 'HH:mm:ss';\n\n\t@ViewChild('clock')\n\tpublic currentTimeElRef: ElementRef;\n\n\t@ViewChild('clock1')\n\tpublic currentTimeElRef1: ElementRef;\n\n\tsystemTimezone: string;\n\n\tUTCTimezone: string;\n\n\tconstructor(\n\t\tprivate zone: NgZone,\n\t\tprivate renderer: Renderer2,\n\t\tprivate datePipe: DatePipe\n\t) {}\n\n\tngOnInit(): void {\n\t\tconst systemTimezone = moment.tz.guess();\n\t\tthis.systemTimezone = moment.tz(systemTimezone).zoneAbbr();\n\t\tthis.UTCTimezone = moment.tz().zoneAbbr();\n\t\tthis.zone.runOutsideAngular(() => {\n\t\t\tsetInterval(() => {\n\t\t\t\tthis.renderer.setProperty(\n\t\t\t\t\tthis.currentTimeElRef1.nativeElement,\n\t\t\t\t\t'textContent',\n\t\t\t\t\tnew Date().toUTCString().split(' ')[4]\n\t\t\t\t);\n\t\t\t\tthis.now = new Date();\n\t\t\t\tconst currentTime = this.datePipe.transform(new Date(), this.format);\n\t\t\t\tthis.renderer.setProperty(this.currentTimeElRef.nativeElement, 'textContent', currentTime);\n\t\t\t\t// }\n\t\t\t}, 1);\n\t\t});\n\t}\n}\n","Current Time  {{ systemTimezone }} \n/\n  {{ UTCTimezone }}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nexport type SidebarChild = {\n\ttitle: string;\n\tpath: string;\n\tisActive?: boolean;\n};\n\nexport type SidebarItem = SidebarChild & {\n\ticon?: string;\n\tparent: boolean;\n\tchildren: SidebarChild[];\n};\n\nexport type TabItem = { title: string; path: string };\n\nexport enum AppLayoutRouting {\n\tHOME = 'home',\n\tDASHBOARD = 'dashboard',\n\tTRAFFIC = 'traffic',\n\tZONES = 'zones',\n\tREPORTS = 'reports',\n\tADMIN = 'admin',\n\tKNOWLEDGE = 'knowledge',\n\tALERTS = 'alerts',\n\tSETTINGS = 'settings',\n\tALERT_REPORT = 'alert-report',\n\tMITIGATIONS = 'mitigations',\n\tMITIGATION_REPORT = 'mitigation-report',\n\tMITIGATION_DETAILS = 'mitigation-details',\n\tIP_UNDER_PIM = `IP's Under PIM`,\n\tNON_PIM_CMO = `IP's Under child objects`,\n\tIP_MONITORED = 'monitor',\n\tBILLING_REPORT = 'billing-report',\n\tIP_BY_TYPE = 'ip-by-type',\n\tPIM = 'pim',\n\tNON_PIM = 'non-pim',\n\tMONITORED = 'MONITORED',\n\tUSER_ERROR = 'user-error',\n\tBDID_ERROR = 'bdid-error',\n}\n\nexport enum TrafficLayoutRouting {\n\tANALYTICS = 'analytics',\n\tTRAFFIC = 'analytics',\n\tBYAPP = 'app',\n\tBYTCP = 'by-tcp',\n\tBYUDP = 'by-udp',\n\tBYTOPDEST = 'by-top-dest',\n\tKNOWLEDGE = 'knowledge',\n\tALERTS = 'alerts',\n\tALERT_SUMMARY = 'alert-summary',\n\tTRAFFIC_DETAILS = 'traffic-details',\n\tNOTES = 'notes',\n\tCOMPANY = 'company',\n}\n\nexport const TabsForReactiveUser: TabItem[] = [\n\t{ title: 'Home', path: `/${AppLayoutRouting.HOME}` },\n\t{ title: `Registered IP's`, path: `/${AppLayoutRouting.ZONES}` },\n\t{ title: 'Admin', path: `/${AppLayoutRouting.ADMIN}` },\n\t{ title: 'Reports', path: `/${AppLayoutRouting.REPORTS}/${AppLayoutRouting.MITIGATION_REPORT}` },\n\t// { title: 'Knowledge Base', path: `/${AppLayoutRouting.KNOWLEDGE}` },\n];\n\nexport const TabsForRegularUser: TabItem[] = [\n\t{ title: 'Home', path: `/${AppLayoutRouting.HOME}` },\n\t{ title: 'Traffic Analytics', path: `/${AppLayoutRouting.TRAFFIC}` },\n\t{ title: `Protected Zones`, path: `/${AppLayoutRouting.ZONES}` },\n\t{ title: 'Admin', path: `/${AppLayoutRouting.ADMIN}` },\n\t{ title: 'Reports', path: `/${AppLayoutRouting.REPORTS}/${AppLayoutRouting.ALERT_REPORT}` },\n\t// { title: 'Knowledge Base', path: `/${AppLayoutRouting.KNOWLEDGE}` },\n];\n\nexport const TrafficSidebarsForRegularUser: SidebarItem[] = [\n\t{\n\t\ttitle: 'Traffic',\n\t\tpath: `/${AppLayoutRouting.TRAFFIC}/${TrafficLayoutRouting.TRAFFIC}`,\n\t\tparent: true,\n\t\tchildren: [\n\t\t\t{ title: 'Application', path: `/traffic/${TrafficLayoutRouting.BYAPP}` },\n\t\t\t{ title: 'UDP', path: `/traffic/${TrafficLayoutRouting.BYUDP}` },\n\t\t\t{ title: 'TCP', path: `/traffic/${TrafficLayoutRouting.BYTCP}` },\n\t\t\t{ title: 'Top Talker', path: `/traffic/${TrafficLayoutRouting.BYTOPDEST}` },\n\t\t],\n\t},\n\t{\n\t\ttitle: 'Alerts',\n\t\tpath: `/traffic/${AppLayoutRouting.ALERTS}`,\n\t\tparent: false,\n\t\tchildren: [],\n\t},\n\t{\n\t\ttitle: 'Mitigations',\n\t\tpath: `/traffic/${AppLayoutRouting.MITIGATIONS}`,\n\t\tparent: false,\n\t\tchildren: [],\n\t},\n];\n\nexport const ReportSidebarsForRegularUser: SidebarItem[] = [\n\t{ title: 'Alerts', path: `/reports/${AppLayoutRouting.ALERT_REPORT}`, parent: false, children: [] },\n\t{ title: 'Mitigation', path: `/reports/${AppLayoutRouting.MITIGATION_REPORT}`, parent: false, children: [] },\n\t{\n\t\ttitle: AppLayoutRouting.IP_UNDER_PIM,\n\t\tpath: `/reports/${AppLayoutRouting.PIM}`,\n\t\tparent: false,\n\t\tchildren: [],\n\t},\n\t{\n\t\ttitle: AppLayoutRouting.NON_PIM_CMO,\n\t\tpath: `/reports/${AppLayoutRouting.NON_PIM}`,\n\t\tparent: false,\n\t\tchildren: [],\n\t},\n\t{ title: \"IP's Monitored\", path: `/reports/${AppLayoutRouting.IP_MONITORED}`, parent: false, children: [] },\n\t{ title: 'Billing Reports', path: `/reports/${AppLayoutRouting.BILLING_REPORT}`, parent: false, children: [] },\n];\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { toKeyObject } from '@src/app/utils/key-object';\nimport { ApiResponse } from '../common.model';\nimport {\n\tADMIN_CONTACT_ACTION_ICON,\n\tAdminDataSource,\n\tLiaisonContact,\n\tLiaisonContactKeyObject,\n\tLiaisonContacts,\n} from './admin.model';\n\nconst getAdminDataSource = (liaison: LiaisonContact): AdminDataSource => {\n\treturn {\n\t\tname: `${liaison.firstName} ${liaison.lastName}`,\n\t\tliaisonID: liaison.liaisonID,\n\t\tcompany: liaison.companyName,\n\t\temail: liaison.email,\n\t\tcellPhone: liaison.cellPhone,\n\t\tbusinessPhone: liaison.businessPhone,\n\t\tsendNotifications: liaison.sendNotifications ? 'Yes' : 'No',\n\t\tdisableActionIcon: ADMIN_CONTACT_ACTION_ICON.DELETE,\n\t};\n};\n\nexport const getAdminDataSources = (liaisonKeyObject: LiaisonContactKeyObject): AdminDataSource[] => {\n\treturn liaisonKeyObject?.keys.map((k) => getAdminDataSource(liaisonKeyObject.objects[k]));\n};\n\nexport const getLiaisonContractKeyObject = (response: ApiResponse): LiaisonContactKeyObject => {\n\treturn {\n\t\t...toKeyObject(response.dataObject.liaisonList, 'liaisonID'),\n\t};\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { KeyObjects, OrUndefineable } from '@src/types/types.utils';\nimport { CompanyIdentifier } from '../common.model';\n\nexport const US_STATES = [\n\t{ type: 'ALABAMA', value: 'AL' },\n\t{ type: 'ALASKA', value: 'AK' },\n\t{ type: 'AMERICAN SAMOA', value: 'AS' },\n\t{ type: 'ARIZONA', value: 'AZ' },\n\t{ type: 'ARKANSAS', value: 'AR' },\n\t{ type: 'CALIFORNIA', value: 'CA' },\n\t{ type: 'COLORADO', value: 'CO' },\n\t{ type: 'CONNECTICUT', value: 'CT' },\n\t{ type: 'DELAWARE', value: 'DE' },\n\t{ type: 'DISTRICT OF COLUMBIA', value: 'DC' },\n\t{ type: 'FEDERATED STATES OF MICRONESIA', value: 'FM' },\n\t{ type: 'FLORIDA', value: 'FL' },\n\t{ type: 'GEORGIA', value: 'GA' },\n\t{ type: 'GUAM', value: 'GU' },\n\t{ type: 'HAWAII', value: 'HI' },\n\t{ type: 'IDAHO', value: 'ID' },\n\t{ type: 'ILLINOIS', value: 'IL' },\n\t{ type: 'INDIANA', value: 'IN' },\n\t{ type: 'IOWA', value: 'IA' },\n\t{ type: 'KANSAS', value: 'KS' },\n\t{ type: 'KENTUCKY', value: 'KY' },\n\t{ type: 'LOUISIANA', value: 'LA' },\n\t{ type: 'MAINE', value: 'ME' },\n\t{ type: 'MARSHALL ISLANDS', value: 'MH' },\n\t{ type: 'MARYLAND', value: 'MD' },\n\t{ type: 'MASSACHUSETTS', value: 'MA' },\n\t{ type: 'MICHIGAN', value: 'MI' },\n\t{ type: 'MINNESOTA', value: 'MN' },\n\t{ type: 'MISSISSIPPI', value: 'MS' },\n\t{ type: 'MISSOURI', value: 'MO' },\n\t{ type: 'MONTANA', value: 'MT' },\n\t{ type: 'NEBRASKA', value: 'NE' },\n\t{ type: 'NEVADA', value: 'NV' },\n\t{ type: 'NEW HAMPSHIRE', value: 'NH' },\n\t{ type: 'NEW JERSEY', value: 'NJ' },\n\t{ type: 'NEW MEXICO', value: 'NM' },\n\t{ type: 'NEW YORK', value: 'NY' },\n\t{ type: 'NORTH CAROLINA', value: 'NC' },\n\t{ type: 'NORTH DAKOTA', value: 'ND' },\n\t{ type: 'NORTHERN MARIANA ISLANDS', value: 'MP' },\n\t{ type: 'OHIO', value: 'OH' },\n\t{ type: 'OKLAHOMA', value: 'OK' },\n\t{ type: 'OREGON', value: 'OR' },\n\t{ type: 'PALAU', value: 'PW' },\n\t{ type: 'PENNSYLVANIA', value: 'PA' },\n\t{ type: 'PUERTO RICO', value: 'PR' },\n\t{ type: 'RHODE ISLAND', value: 'RI' },\n\t{ type: 'SOUTH CAROLINA', value: 'SC' },\n\t{ type: 'SOUTH DAKOTA', value: 'SD' },\n\t{ type: 'TENNESSEE', value: 'TN' },\n\t{ type: 'TEXAS', value: 'TX' },\n\t{ type: 'UTAH', value: 'UT' },\n\t{ type: 'VERMONT', value: 'VT' },\n\t{ type: 'VIRGIN ISLANDS', value: 'VI' },\n\t{ type: 'VIRGINIA', value: 'VA' },\n\t{ type: 'WASHINGTON', value: 'WA' },\n\t{ type: 'WEST VIRGINIA', value: 'WV' },\n\t{ type: 'WISCONSIN', value: 'WI' },\n\t{ type: 'WYOMING', value: 'WY' },\n];\n\nexport enum ADMIN_CONTACT_ACTION_ICON {\n\tEDIT = 'edit',\n\tDELETE = 'delete_outline',\n}\nexport const ADMIN_CONTACT_ACTION_ICONS = [\n\t{ icon: ADMIN_CONTACT_ACTION_ICON.EDIT, tooltip: 'Edit contact' },\n\t{ icon: ADMIN_CONTACT_ACTION_ICON.DELETE, tooltip: 'Delete contact' },\n];\n\nexport type LiaisonContactIdentifier = {\n\tliaisonID: number;\n};\n\nexport type LiaisonContact = CompanyIdentifier &\n\tLiaisonContactIdentifier & {\n\t\tdefaultZoneName: string;\n\t\tofferType: number;\n\t\tfirstName: string;\n\t\tlastName: string;\n\t\tliaisontype: number;\n\t\taddress: string;\n\t\troom: string;\n\t\tcity: string;\n\t\tstate: string;\n\t\tzipCode: string;\n\t\tcountry: string;\n\t\tbusinessPhoneCountry: string;\n\t\tbusinessPhoneArea: string;\n\t\tbusinessPhone: string;\n\t\tbusinessPhoneExt: string;\n\t\tcellPhoneCountry: string;\n\t\tcellPhoneArea: string;\n\t\tcellPhone: string;\n\t\temail: string;\n\t\tloginId: string;\n\t\tsendNotifications: boolean;\n\t\tduties: string;\n\t\thoursOfContact: string;\n\t\treseller: number;\n\t\tresellerCompanyName: string;\n\t\tliaisonID?: number;\n\t};\n\nexport type LiaisonContacts = {\n\tliaisonList: LiaisonContact[];\n};\n\nexport type CreateOrUpdateLiaisonContact = {\n\temail: string;\n\tloginId: string;\n\tcompanyID: number;\n\tdefaultZoneName: string;\n\tfirstName: string;\n\tlastName: string;\n\tbusinessPhoneCountry: string;\n\tbusinessPhone: string;\n\tbusinessPhoneExt: string;\n\tcellPhone: string;\n\tsendNotifications: boolean;\n\thoursOfContact: string;\n};\n\nexport type AdminDataSource = LiaisonContactIdentifier & {\n\tname: string;\n\tcompany: string;\n\temail: string;\n\tcellPhone: string;\n\tbusinessPhone: string;\n\tsendNotifications: string;\n\tdisableActionIcon: OrUndefineable;\n};\n\nexport type ContactInfo = {\n\tfirstName: string;\n\tlastName: string;\n\temail: string;\n\tbusinessPhoneCountry: string;\n\tbusinessPhoneExt: string;\n\tbusinessPhone: string;\n\tcellPhone: string;\n};\n\nexport type AdminDataFormSource = {\n\tfirstName: string;\n\tlastName: string;\n\tliasonType: string;\n\tbusinessPhoneExt: string;\n\tbusinessPhone: string;\n\tbusinessPhoneCountry: string;\n\tcellPhone: string;\n\tloginId: string;\n\temail: string;\n\tsendNotifications: boolean;\n\thoursOfContact: string;\n\tregion: string;\n\tsite: string;\n};\n\nexport type LiaisonContactDetailsFormValues = {\n\tfirstName: string;\n\tlastName: string;\n\tbusinessPhoneExt: string;\n\tbusinessPhone: string;\n\tbusinessPhoneCountry: string;\n\tcellPhone: string;\n\tloginId: string;\n\temail: string;\n\tsendNotifications: boolean;\n\thoursOfContact?: string;\n\tliaisonID?: string;\n};\n\nexport type LiaisonContactActionResponse = {\n\tcompanyID: number;\n\trequestID: number;\n\trequestServiceName: string;\n\tresponseStatus: string;\n\tresponseDetail: string;\n};\n\nexport type LiaisonContactKeyObject = KeyObjects;\n\nexport type RequestDetails = {\n\tcompanyID: number;\n\trequestID: number;\n\trequestServiceName: string;\n\tresponseStatus: 'Pending' | 'Complete' | 'Failed';\n\tresponseDetail: string;\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, catchError, map, Observable, tap, throwError } from 'rxjs';\nimport * as URLS from '@src/app/stores/api.urls';\nimport { SessionStore } from '@src/app/stores/session/session.store';\nimport { assertValue } from '@src/app/utils/assert';\nimport { Undefineable } from '@src/types/types.utils';\nimport { BDID } from '@src/app/stores/api.urls';\nimport {\n\tLiaisonContacts,\n\tCreateOrUpdateLiaisonContact,\n\tLiaisonContactActionResponse,\n\tLiaisonContactKeyObject,\n\tContactInfo,\n\tLiaisonContact,\n} from './admin.model';\nimport { ApiResponse } from '../common.model';\nimport { getLiaisonContractKeyObject } from './admin.converter';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class AdminStore {\n\tprivate readonly liaisonContactKeyObjectSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly defaultContactZoneSub = new BehaviorSubject(undefined);\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate sessionStore: SessionStore\n\t) {}\n\n\tget liaisonContactKeyObject$() {\n\t\treturn this.liaisonContactKeyObjectSub.asObservable();\n\t}\n\n\tget liaisonContactKeyObject() {\n\t\treturn this.liaisonContactKeyObjectSub.value;\n\t}\n\n\tget defaultContactZone$() {\n\t\treturn this.defaultContactZoneSub.asObservable();\n\t}\n\n\tget defaultContactZone() {\n\t\treturn this.defaultContactZoneSub.value;\n\t}\n\n\tfindLiaisonContractById(liaisonContactId: string) {\n\t\treturn this.liaisonContactKeyObject.objects[liaisonContactId];\n\t}\n\n\tgetLiaisonContacts() {\n\t\tconst getLiaisonCustomerDetailsUrl = URLS.getApiUrl(\n\t\t\tURLS.CUSTOMER_DETAILS_BY_LIAISONS,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t);\n\n\t\t// notify subscribers that it is reloading.\n\t\tthis.liaisonContactKeyObjectSub.next(undefined);\n\t\tthis.http\n\t\t\t.get>(getLiaisonCustomerDetailsUrl)\n\t\t\t.pipe(\n\t\t\t\tcatchError((e: Error) => {\n\t\t\t\t\t// to complete the global gets.\n\t\t\t\t\tthis.liaisonContactKeyObjectSub.next({\n\t\t\t\t\t\tobjects: {},\n\t\t\t\t\t\tkeys: [],\n\t\t\t\t\t\tsnapshotKeys: [],\n\t\t\t\t\t});\n\t\t\t\t\treturn throwError(() => e);\n\t\t\t\t}),\n\t\t\t\ttap((response) => {\n\t\t\t\t\tthis.liaisonContactKeyObjectSub.next(getLiaisonContractKeyObject(response));\n\t\t\t\t})\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\tgetContactByBdId(bdId: string): Observable {\n\t\tconst getContactByBdIdUrl = URLS.getApiUrl(URLS.GET_CONTACT_BY_BDID).replace(BDID, bdId);\n\t\treturn this.http.get(getContactByBdIdUrl);\n\t}\n\n\tcheckExistingBdid(bdid: string): LiaisonContact | undefined {\n\t\treturn Object.values(this.liaisonContactKeyObject?.objects).find((contact) => contact.loginId === `bd-${bdid}`);\n\t}\n\n\tcreateLiaisonContact(payload: CreateOrUpdateLiaisonContact): Observable {\n\t\tconst createLiaisonContactUrl = URLS.getApiUrl(\n\t\t\tURLS.CREATE_LIAISON,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t);\n\t\treturn this.http\n\t\t\t.post>(createLiaisonContactUrl, payload)\n\t\t\t.pipe(map((ddosResponse) => ddosResponse.dataObject));\n\t}\n\n\tupdateLiaisonContact(\n\t\tpayload: CreateOrUpdateLiaisonContact,\n\t\tliaisonId: string\n\t): Observable {\n\t\tconst updateLiaisonContactUrl = URLS.getApiUrl(\n\t\t\tURLS.UPDATE_LIAISONS,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t).replace(URLS.LIAISON_ID, liaisonId);\n\t\treturn this.http\n\t\t\t.put>(updateLiaisonContactUrl, payload)\n\t\t\t.pipe(map((ddosResponse) => ddosResponse.dataObject));\n\t}\n\n\tdeleteLiaisonCustomer(liaisonId: string): Observable {\n\t\tconst deleteLiaisonCustomerUrl = URLS.getApiUrl(\n\t\t\tURLS.DELETE_LIAISONS,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t).replace(URLS.LIAISON_ID, liaisonId);\n\t\treturn this.http\n\t\t\t.delete>(deleteLiaisonCustomerUrl)\n\t\t\t.pipe(map((ddosResponse) => ddosResponse.dataObject));\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport moment from 'moment';\nimport { capitalize } from 'lodash';\nimport { FormGroup } from '@angular/forms';\nimport { toKeyObject } from '@src/app/utils/key-object';\nimport {\n\tAlert,\n\tAlertCharacterization,\n\tAlertChartDatParams,\n\tAlertChartParams,\n\tAlertCollection,\n\tAlertDetail,\n\tAlertDetailTitleParams,\n\tAlertKeyInformation,\n\tAlertKeyObject,\n\tAlertTitleParams,\n\tAlertTrafficDataset,\n\tChartDataset,\n\tDataSet,\n\tItem,\n} from './alert.model';\nimport { ApiResponse } from '../common.model';\nimport { assertValue } from '../../utils/assert';\nimport { dateFormat, dateFormatRange, formatUnits } from '../common.utils';\n\nexport const formatBits = (bits: number, decimals = 2) => {\n\tif (!+bits) {\n\t\treturn '0';\n\t}\n\n\tconst k = 1000; // 1024\n\tconst dm = decimals < 0 ? 0 : decimals;\n\tconst sizes = ['bps', 'Kbps', 'Mbps', 'Gbps', 'Tbps', 'Pbps', 'Ebps', 'Zbps', 'Ybps'];\n\n\tconst i = Math.floor(Math.log(bits) / Math.log(k));\n\n\treturn `${parseFloat((bits / k ** i).toFixed(dm))} ${sizes[i]}`;\n};\n\nexport const getFormatAlert = (alert: Alert): Alert => {\n\tconst { days, hours, minutes, alertStartAt } = parseAlertTimeStamps(alert.startTime, alert.endTime);\n\tconst duration = measureAlertDuration(days, hours, minutes, alert.endTime, alertStartAt);\n\n\treturn {\n\t\t...alert,\n\t\tduration,\n\t};\n};\n\nconst parseAlertType = (type: string): string => {\n\treturn type\n\t\t.toLowerCase()\n\t\t.split('_')\n\t\t.map((s) => s.charAt(0).toUpperCase() + s.substring(1))\n\t\t.join(' ');\n};\n\nexport const parseAlertTimeStamps = (startTime: string, endTime: string) => {\n\tconst alertStartAt = moment.utc(startTime).format('MMM DD HH:mm y');\n\tconst alertEndAt = endTime ? moment.utc(endTime) : moment.utc();\n\tconst timeDifference = moment.duration(alertEndAt.diff(moment.utc(startTime))).abs();\n\t//\tTotal days of the alert\n\tconst days = alertEndAt.diff(moment.utc(startTime), 'days');\n\tconst hours = timeDifference.hours().toString().padStart(2, '0');\n\tconst minutes = timeDifference.minutes().toString().padStart(2, '0');\n\tconst seconds = timeDifference.seconds().toString().padStart(2, '0');\n\treturn { days, hours, minutes, seconds, alertStartAt };\n};\n\nexport const measureAlertDuration = (\n\tdays: number,\n\thours: string | number,\n\tminutes: string | number,\n\tendTime: string,\n\talertStartAt: string\n) => {\n\tconst alertStartAtFormatted: string = moment.utc(alertStartAt).format(dateFormat(moment.utc(alertStartAt)));\n\tconst daysDuration: string = days > 0 ? `${days}d, ` : '';\n\tconst alertDuration = `${daysDuration}${hours}:${minutes}`;\n\tlet modifiedEndTime = '';\n\tif (endTime) {\n\t\tconst endTimeFormat = dateFormatRange(alertStartAt, endTime);\n\t\tmodifiedEndTime = moment.utc(endTime).format(endTimeFormat);\n\t}\n\tconst modifiedStartTime = endTime\n\t\t? `${alertStartAtFormatted} - ${modifiedEndTime} (${alertDuration})`\n\t\t: `${alertStartAtFormatted} (${alertDuration})`;\n\treturn modifiedStartTime;\n};\n\nexport const createAlertTitle = (params: AlertTitleParams, defaultZoneName: string) => {\n\tconst { alertType, direction, targetIPAddress, alertOwnedBy, misuseTypes } = params;\n\tconst alertTypeModified = parseAlertType(alertType);\n\tlet alertTitle = `${direction} ${alertTypeModified} to ${targetIPAddress} using ${alertOwnedBy}}`;\n\n\t// Comparing against API alertType value\n\tif (alertType === 'dos_profiled_router') {\n\t\talertTitle = `${alertTitle}.\n\t\tDescription: ${defaultZoneName}_${targetIPAddress}`;\n\t} else if (alertType === 'dos_host_detection') {\n\t\talertTitle = `${alertTitle}.\n\t\tMisuse Types: ${misuseTypes.join(', ')}`;\n\t}\n\n\treturn alertTitle;\n};\n\nexport const createAlertDetailTitle = ({ defaultZoneName, startTime, endTime }: AlertDetailTitleParams) => {\n\tconst { days, hours, minutes, alertStartAt } = parseAlertTimeStamps(startTime, endTime);\n\tconst duration = measureAlertDuration(days, hours, minutes, endTime, alertStartAt);\n\n\treturn {\n\t\ttitle: defaultZoneName\n\t\t\t.toUpperCase()\n\t\t\t.split('_')\n\t\t\t.map((s) => s)\n\t\t\t.join(' '),\n\t\tduration,\n\t};\n};\n\nexport const alertOwnedBy = (moName: string, defaultZoneName: string) => {\n\treturn moName ? `${moName} (parent: ${defaultZoneName})` : defaultZoneName;\n};\n\nexport const getAlertTitle = (alert: Alert): string => {\n\tconst { impactBps, severityPercent, severityThreshold } = alert;\n\tconst sThreshold = `${formatBits(severityThreshold)}`;\n\tconst impBps = `${formatBits(impactBps)}`;\n\tconst newTitle = `${severityPercent}% of ${sThreshold} ${impBps} `;\n\treturn newTitle;\n};\n\nexport const findMaxTimeSeriesItem = (prev: Item, current: Item) => {\n\tconst prevLastElement = prev.average;\n\tconst currentLastElement = current.average;\n\n\treturn prevLastElement > currentLastElement ? prev : current;\n};\n\nexport const fetchTopMisuse = (alertDetails: AlertDetail[]) => {\n\treturn alertDetails\n\t\t?.map((dataset) => dataset.dataSets.find((set) => set.name === 'Misuse Types'))\n\t\t.map((dataset) => dataset.items)\n\t\t.reduce((i) => i)\n\t\t.reduce((prev, current) => findMaxTimeSeriesItem(prev, current));\n};\n\nexport const generateTrafficDatasets = (\n\talertDatasetItem: Item,\n\ttopMisUseDataset: Item,\n\talertDataset: DataSet\n): AlertCharacterization => {\n\tconst currentDatasetValue: number = alertDatasetItem.average;\n\tconst currentTopMisuseValue: number = topMisUseDataset.average;\n\tconst dataSetItemPercent: string =\n\t\tcurrentDatasetValue && currentTopMisuseValue\n\t\t\t? ((currentDatasetValue / currentTopMisuseValue) * 100).toFixed(2)\n\t\t\t: '0.00';\n\n\treturn {\n\t\tdataSetName: alertDataset.name,\n\t\tdataSetItem: `${alertDatasetItem.itemName}`,\n\t\tdatasetValue: currentDatasetValue ? `${formatBits(currentDatasetValue)}` : null,\n\t\tdataSetItemPercent,\n\t};\n};\n\nexport const getAlertCharacterizations = (alertDetails: AlertDetail[]): AlertCharacterization[] => {\n\tconst topMisUseDataset = fetchTopMisuse(alertDetails);\n\n\treturn alertDetails\n\t\t?.map((alert) => {\n\t\t\treturn alert.dataSets.map((dataset) => {\n\t\t\t\tconst maxDatasetItem = dataset.items.reduce((prev, current) => findMaxTimeSeriesItem(prev, current));\n\t\t\t\treturn generateTrafficDatasets(maxDatasetItem, topMisUseDataset, dataset);\n\t\t\t});\n\t\t})\n\t\t.flat();\n};\n\nexport const generateStackedLineChartData = (alertDetails: AlertDetail[], limit?: number): AlertChartParams => {\n\tconst datasets: ChartDataset[] = [];\n\tlet chartLabels: string[] = [];\n\n\t// Loop through each trafficData object and extract data for the chart\n\talertDetails.forEach((traffic: AlertDetail) => {\n\t\ttraffic.dataSets.forEach((dataSet) => {\n\t\t\tlet sortedItems: Item[];\n\t\t\tif (limit && dataSet.items.length > limit) {\n\t\t\t\tsortedItems = [...dataSet.items].sort((a, b) => b.average - a.average).slice(0, limit);\n\t\t\t}\n\t\t\t(sortedItems ?? dataSet.items).forEach((item) => {\n\t\t\t\tconst alertStartTime = new Date(traffic.startTime).getTime() / 1000;\n\n\t\t\t\tchartLabels = item.timeseries.map((_value, j) =>\n\t\t\t\t\tmoment.utc((alertStartTime + (traffic.duration / (item.timeseries.length - 1)) * j) * 1000).format('HH:mm:ss')\n\t\t\t\t);\n\n\t\t\t\tconst color = `rgba(${Math.floor(Math.random() * 201)}, ${Math.floor(Math.random() * 201)}, ${Math.floor(\n\t\t\t\t\tMath.random() * 201\n\t\t\t\t)}, 0.41)`;\n\n\t\t\t\tdatasets.push({\n\t\t\t\t\tlabel: `${dataSet.name} - ${item.itemName}`,\n\t\t\t\t\tdata: item.timeseries,\n\t\t\t\t\tbackgroundColor: color,\n\t\t\t\t\tfill: false,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\treturn { datasets, chartLabels };\n};\n\nexport const generateTotalStackedLineChartData = (alertDetails: AlertDetail[]): AlertChartParams => {\n\tconst datasets: ChartDataset[] = [];\n\tlet chartLabels: string[] = [];\n\n\tconst alertDetail: AlertDetail = alertDetails?.length && alertDetails[0];\n\tconst dataset: DataSet =\n\t\talertDetail?.dataSets?.length && alertDetail.dataSets.find((dataset) => dataset.name === 'Misuse Types');\n\tconst timeseriesTotalValues: number[] =\n\t\tdataset?.items?.find((item) => item.itemName === 'Total Traffic')?.timeseries || [];\n\n\tif (timeseriesTotalValues) {\n\t\tconst color = 'rgba(101, 101, 101, 0.41)';\n\t\tdatasets.push({\n\t\t\tlabel: '',\n\t\t\tdata: timeseriesTotalValues,\n\t\t\tbackgroundColor: color,\n\t\t\tfill: true,\n\t\t});\n\n\t\tconst alertStartTime = new Date(alertDetail.startTime).getTime() / 1000;\n\n\t\tchartLabels = getChartLabels(timeseriesTotalValues, alertStartTime, alertDetail.duration);\n\t}\n\n\treturn { datasets, chartLabels };\n};\n\nconst getChartLabels = (timeseries: number[], startTime: number, duration: number): string[] => {\n\treturn timeseries.map((_value, j) =>\n\t\tmoment.utc((startTime + (duration / (timeseries.length - 1)) * j) * 1000).format('HH:mm:ss')\n\t);\n};\n\nexport const getAlertTrafficDatasets = (alertDetails: AlertDetail[]): AlertTrafficDataset[] => {\n\tconst topMisUseDataset = fetchTopMisuse(alertDetails);\n\tconst trafficDatasets: AlertTrafficDataset[] = [];\n\n\talertDetails.forEach((alert) => {\n\t\talert.dataSets.forEach((dataset) => {\n\t\t\tconst datasetItems = dataset.items\n\t\t\t\t.map((item) => generateTrafficDatasets(item, topMisUseDataset, dataset))\n\t\t\t\t.filter((d) => d.dataSetItemPercent !== '0');\n\n\t\t\tconst datasetItem: AlertTrafficDataset = {\n\t\t\t\tdataSetName: dataset.name,\n\t\t\t\tdataSetItems: datasetItems,\n\t\t\t};\n\n\t\t\ttrafficDatasets.push(datasetItem);\n\t\t});\n\t});\n\treturn trafficDatasets;\n};\n\nexport function getElementsEqualToValue(array: unknown[], key: string, value: unknown): unknown[] {\n\treturn array.filter((element) => element[key] === value);\n}\n\nexport const getImportanceAlertChartDatasets = (alerts: Alert[]): AlertChartDatParams => {\n\tlet startTime = moment.utc().subtract(5, 'months').startOf('month').toISOString();\n\tconst endTime = moment.utc().startOf('month').toISOString();\n\tconst timeSlots: string[] = [];\n\tconst highImportance: number[] = [];\n\tconst mediumImportance: number[] = [];\n\tconst lowImportance: number[] = [];\n\tconst chartDatasets: ChartDataset[] = [];\n\tconst lastSixMonthsAlerts: { [key: string]: Alert[] } = {};\n\n\talerts.forEach((alert) => {\n\t\tconst alertDate = moment.utc(alert.startTime).startOf('day');\n\t\tif (alertDate.diff(startTime, 'days') >= 0) {\n\t\t\tconst alertMonth = moment.utc(alertDate).format('MMM');\n\t\t\tif (!lastSixMonthsAlerts[alertMonth]) {\n\t\t\t\tlastSixMonthsAlerts[alertMonth] = [];\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n\t\t\tlastSixMonthsAlerts[alertMonth].push(alert);\n\t\t}\n\t});\n\twhile (moment.utc(startTime).isSameOrBefore(endTime, 'month')) {\n\t\tconst month = moment.utc(startTime).format('MMM');\n\t\ttimeSlots.push(month);\n\t\tconst alertsOnMonth = typeof lastSixMonthsAlerts[month] !== 'undefined' ? lastSixMonthsAlerts[month] : [];\n\t\thighImportance.push(getElementsEqualToValue(alertsOnMonth, 'importance', 'high').length);\n\t\tmediumImportance.push(getElementsEqualToValue(alertsOnMonth, 'importance', 'medium').length);\n\t\tlowImportance.push(getElementsEqualToValue(alertsOnMonth, 'importance', 'low').length);\n\t\tstartTime = moment.utc(startTime).add(1, 'M').toISOString();\n\t}\n\tchartDatasets.push({ data: highImportance, label: 'high', borderColor: '#FF6384' });\n\tchartDatasets.push({ data: mediumImportance, label: 'medium', borderColor: '#FFC663FF' });\n\tchartDatasets.push({ data: lowImportance, label: 'low', borderColor: '#2EA123FF' });\n\n\treturn { datasets: chartDatasets, chartLabels: timeSlots };\n};\n\nexport const hasValueInAlertSearchForm = (formGroup: FormGroup): boolean => {\n\tconst formValues = formGroup.getRawValue() as Record;\n\treturn Object.values(formValues).some((value) => {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\treturn Object.values(value).some((innerValue) => Boolean(innerValue));\n\t\t}\n\t\treturn Boolean(value);\n\t});\n};\n\nexport const getAlertKeyInformation = (alert: Alert): AlertKeyInformation[] => {\n\tconst {\n\t\tseverityPercent,\n\t\tseverityThreshold,\n\t\tseverityUnit,\n\t\tmisuseTypes,\n\t\timpactBps,\n\t\timpactPps,\n\t\ttargetIPAddress,\n\t\tdirection,\n\t\timportance,\n\t\tmoName,\n\t} = assertValue(alert);\n\n\treturn [\n\t\t{\n\t\t\tseverity: capitalize(importance),\n\t\t\tmaxSeverity: `${severityPercent}% of ${severityThreshold} ${severityUnit}`,\n\t\t\ttopMisuseType: `${misuseTypes?.join(' ')}`,\n\t\t\tmaxImpact: `${formatUnits(impactBps, 'bps')} / ${formatUnits(impactPps, 'pps')}`,\n\t\t\tdirections: `${direction}`,\n\t\t\tmisuseType: `${misuseTypes?.join(' ')}`,\n\t\t\tmanagedObject: `${moName}`,\n\t\t\ttarget: `${targetIPAddress}`,\n\t\t} as AlertKeyInformation,\n\t];\n};\n\nexport const getAlertKeyObject = (response: ApiResponse): AlertKeyObject => {\n\treturn {\n\t\tdefaultZoneName: assertValue(response.dataObject).defaultZoneName,\n\t\t...toKeyObject(response.dataObject.alertData, 'alertId'),\n\t};\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { KeyObjects, MakeAllKeysWithType } from '@src/types/types.utils';\nimport { Params } from '@angular/router';\nimport { ApiResponse, NameValueOption, QueryNode, TableColumn, TimeRangeParam, UnitType } from '../common.model';\n\nexport const ALL_VALUE = 'all';\nexport const BPS_VALUE = 'bps';\nexport const BYTESPS_VALUE = 'Bps';\nexport const PPS_VALUE = 'pps';\nexport const BEFORE_VALUE = 'before';\nexport const AFTER_VALUE = 'after';\n\nexport enum AlertStatusEnum {\n\tONGOING = 'Ongoing',\n\tRECENT = 'Recent',\n\tALL = 'All',\n}\n\nexport type AlertSearchQuery = {\n\tsearchString: QueryNode;\n\timportanceHigh: QueryNode;\n\timportanceMedium: QueryNode;\n\timportanceLow: QueryNode;\n\talertClass: QueryNode;\n\talertType: QueryNode;\n\tclassification: QueryNode;\n\tsize: QueryNode;\n\tonGoing: QueryNode;\n\trecent: QueryNode;\n\tstartBeforeOrAfter: QueryNode;\n\tendBeforeOrAfter: QueryNode;\n\tstartDate: QueryNode;\n\tendDate: QueryNode;\n\tstartTime: QueryNode;\n\tendTime: QueryNode;\n\tlowThreshold: QueryNode;\n\thighThreshold: QueryNode;\n\tthresholdUnit: QueryNode;\n\tlowSeverityPercent: QueryNode;\n\thighSeverityPercent: QueryNode;\n};\n\nexport enum DDOS_TITLE_TYPE {\n\tALERT = 'ALERT',\n\tMITIGATION = 'MITIGATION',\n}\n\nexport type AlertStatusFilter = AlertStatusEnum.ALL | AlertStatusEnum.ONGOING | AlertStatusEnum.RECENT;\n\nexport const TA_DROPDOWN_ALERTS_DISPLAYS = [\n\t{ type: AlertStatusEnum.ALL, value: AlertStatusEnum.ALL },\n\t{ type: AlertStatusEnum.RECENT, value: AlertStatusEnum.RECENT },\n\t{ type: AlertStatusEnum.ONGOING, value: AlertStatusEnum.ONGOING },\n];\n\nexport type PageParams = {\n\tpage: number;\n\tsize: number;\n};\n\nexport const TA_DROPDOWN_ALERT_CLASSES = [\n\t{ id: 0, type: 'BGP', value: 'bgp' },\n\t{ id: 1, type: 'Cloud Signaling', value: 'cloud_signaling' },\n\t{ id: 2, type: 'Data', value: 'data' },\n\t{ id: 3, type: 'DoS', value: 'dos' },\n\t{ id: 4, type: 'Mobile Analytics', value: 'mobile_analytics' },\n\t{ id: 5, type: 'Smart', value: 'smart' },\n\t{ id: 6, type: 'System Error', value: 'system_error' },\n\t{ id: 7, type: 'System Event', value: 'system_event' },\n\t{ id: 8, type: 'TMS', value: 'tms' },\n\t{ id: 9, type: 'Traffic', value: 'traffic' },\n\t{ id: 10, type: 'Total', value: 'total' },\n];\n\nexport const TA_ALERT_TABLE_COLUMNS: TableColumn[] = [\n\t{\n\t\tcolumnName: 'id',\n\t\tdataKey: 'alertId',\n\t\tsortArrowPosition: 'left',\n\t\tisSortable: false,\n\t\tisTextFilter: true,\n\t\tisLink: true,\n\t},\n\t{\n\t\tcolumnName: 'importance',\n\t\tcolumnNameIcon: 'info',\n\t\tcolumnNameIconColor: 'primary',\n\t\tdataKey: 'importance',\n\t\tdataKeyIcon: 'error',\n\t\tdataKeyIconColor: 'ddos-error-900',\n\t\tsortArrowPosition: 'left',\n\t\tisSortable: true,\n\t},\n\t{\n\t\tcolumnName: 'class',\n\t\tdataKey: 'class',\n\t\tsortArrowPosition: 'left',\n\t\tisSortable: true,\n\t\tisFilterable: true,\n\t},\n\t{\n\t\tcolumnName: 'alert',\n\t\tdataKey: 'alert',\n\t\tsortArrowPosition: 'left',\n\t\tisSortable: true,\n\t\tisInnerHtmlString: true,\n\t},\n\t{\n\t\tcolumnName: 'start time',\n\t\tdataKey: 'startTime',\n\t\tsortArrowPosition: 'left',\n\t\tisSortable: true,\n\t},\n\t{\n\t\tcolumnName: 'classification & notes',\n\t\tdataKey: 'classAndNotes',\n\t\tsortArrowPosition: 'left',\n\t\tisSortable: true,\n\t},\n];\n\nexport const TA_ALERT_SUMMARY_TABLE_COLUMNS: TableColumn[] = [\n\t{\n\t\tcolumnName: 'Severity',\n\t\tdataKey: 'severity',\n\t\tdataKeyIcon: 'error',\n\t\tdataKeyIconColor: 'ddos-error-900',\n\t},\n\t{\n\t\tcolumnName: 'Low/High Severity % Thresholds',\n\t\tcolumnNameIcon: 'info',\n\t\tcolumnNameIconColor: 'primary',\n\t\tdataKey: 'maxSeverity',\n\t},\n\t{\n\t\tcolumnName: 'Top Misuse Type',\n\t\tdataKey: 'topMisuseType',\n\t},\n\t{\n\t\tcolumnName: 'Low/High Alert Traffic Thresholds',\n\t\tcolumnNameIcon: 'info',\n\t\tcolumnNameIconColor: 'primary',\n\t\tdataKey: 'maxImpact',\n\t},\n\t{\n\t\tcolumnName: 'directions',\n\t\tdataKey: 'directions',\n\t},\n\t{\n\t\tcolumnName: 'Misuse Type',\n\t\tdataKey: 'misuseType',\n\t},\n\t{\n\t\tcolumnName: 'managed Object',\n\t\tdataKey: 'managedObject',\n\t},\n\t{\n\t\tcolumnName: 'target',\n\t\tdataKey: 'target',\n\t},\n];\n\nexport type SelectedCustomerOption = NameValueOption & {\n\tfacetId: string[];\n};\n\nexport type Annotation = {\n\ttext: string;\n\tadded: string;\n};\n\nexport type ChartDataset = {\n\tlabel: string;\n\tdata: number[];\n\tfill?: boolean;\n\tborderColor?: string;\n\tpointRadius?: number;\n\tlineTension?: number;\n\tyAxisID?: string;\n\tbackgroundColor?: string | any[];\n};\n\nexport type AlertChartParams = {\n\tdatasets: ChartDataset[];\n\tchartLabels: string[];\n};\n\nexport type AlertChartDatParams = {\n\tdatasets: ChartDataset[];\n\tchartLabels: string[];\n};\n\nexport type AlertIdentifier = {\n\talertId: number;\n};\n\nexport type Alert = AlertIdentifier &\n\tTimeRangeParam & {\n\t\talertClass: string;\n\t\talertType: string;\n\t\tannotationList?: {\n\t\t\ttext: string;\n\t\t\tadded: string;\n\t\t}[];\n\t\tclassification: string;\n\t\timportance: string;\n\t\tongoing: boolean;\n\t\tdirection: string;\n\t\ttargetIPAddress: string;\n\t\timpactBps: number;\n\t\timpactPps: number;\n\t\tmisuseTypes: string[];\n\t\tseverityPercent: number;\n\t\tseverityThreshold: number;\n\t\tseverityUnit: string;\n\t\tfastDetected: boolean;\n\t\tduration?: string;\n\t\tmoName: string;\n\t\tregion?: string; // Client Prop\n\t\tsite?: string; // Client Prop\n\t};\n\nexport type AlertCollection = {\n\tdefaultZoneName: string;\n\talertData: Alert[];\n};\n\nexport type GetAlertsResponse = ApiResponse;\n\nexport type CustomerAlertDetailPayload = AlertIdentifier & {\n\tunit?: UnitType;\n};\n\nexport type Item = {\n\titemName: string;\n\tpct95: number;\n\taverage: number;\n\tmax: number;\n\ttimeseries: number[];\n};\n\nexport type DataSet = Partial & {\n\tname: string;\n\titems: Item[];\n};\n\nexport type AlertDetail = AlertIdentifier &\n\tTimeRangeParam & {\n\t\tunit: string;\n\t\tduration: number;\n\t\tdataSets: DataSet[];\n\t};\n\nexport type AlertDetailCollection = {\n\tdefaultZoneName: string;\n\talertData: AlertDetail[];\n};\n\nexport type GetAlertDetailsResponse = ApiResponse;\n\nexport type AlertDataSource = AlertIdentifier &\n\tTimeRangeParam & {\n\t\timportance: string;\n\t\tclass: string;\n\t\talert: string;\n\t\tclassAndNotes: string;\n\t\tlink: string;\n\t};\n\nexport type AlertKeyInformation = {\n\tmaxSeverity: string;\n\ttopMisuseType: string;\n\tmaxImpact: string;\n\tdirections: string;\n\tmisuseType: string;\n\tmanagedObject: string;\n\ttarget: number | string;\n};\n\nexport type AlertCharacterization = {\n\tdataSetName: string;\n\tdataSetItem: string;\n\tdatasetValue?: string | number;\n\tdataSetItemPercent: string;\n};\n\nexport type AlertTrafficDataset = {\n\tdataSetName: string;\n\tdataSetItems: AlertCharacterization[];\n};\n\nexport type AlertDetailTitle = {\n\ttitle: string;\n\tduration: string;\n};\n\nexport type AlertTitleParams = {\n\talertType: string;\n\tdirection: string;\n\ttargetIPAddress: string;\n\talertOwnedBy: string;\n\tmisuseTypes: string[];\n};\n\nexport type AlertDetailQueryParam = MakeAllKeysWithType &\n\tTimeRangeParam & {\n\t\tunit?: UnitType;\n\t};\n\nexport type AlertDetailTitleParams = Partial & {\n\tdefaultZoneName: string;\n};\n\nexport type AlertKeyObject = Omit & KeyObjects;\nexport type AlertDetailKeyObject = Omit & KeyObjects;\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport * as URLS from '@src/app/stores/api.urls';\nimport { BehaviorSubject, Subscription, catchError, interval, mergeMap, startWith, tap, throwError } from 'rxjs';\nimport { assertValue } from '@src/app/utils/assert';\nimport { SessionStore } from '@src/app/stores/session/session.store';\nimport { Sort } from '@angular/material/sort';\nimport { Undefineable } from '@src/types/types.utils';\nimport { ApiResponse, updateDelay } from '../common.model';\nimport {\n\tAlertKeyObject,\n\tAlertDetailKeyObject,\n\tAlertStatusFilter,\n\tAlertSearchQuery,\n\tAlert,\n\tBEFORE_VALUE,\n\tAFTER_VALUE,\n\tBPS_VALUE,\n\tALL_VALUE,\n\tAlertCollection,\n\tAlertDetailQueryParam,\n\tAlertDetailCollection,\n\tBYTESPS_VALUE,\n\tAlertStatusEnum,\n} from './alert.model';\nimport { getAlertKeyObject } from './alert.converter';\nimport { addPropertiesToEachObject, isSucceededResponse } from '../common.utils';\nimport moment from 'moment/moment';\nimport { AlertReportsDataSource } from '@app/stores/report/billing/billing.model';\nimport { getAlertReport } from '@app/stores/report/billing/billing.converter';\nimport { ConfirmDialogService, DDOS_CONFIRM_DIALOG_NO_DATA } from '@app/components/shared/services/dialog/confirm-dialog.service';\nimport { Location } from '@angular/common';\nexport const MISSING_ROUTE_DATA = 'missing {data} on the current route';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class AlertStore {\n\tprivate readonly alertKeyObjectSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly alertDetailKeyObjectSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly alertsUpdateEvent = new BehaviorSubject>(undefined);\n\n\tprivate readonly defaultZoneNameSub = new BehaviorSubject(undefined);\n\n\tintervalAlertsSub: Subscription;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate sessionStore: SessionStore,\n\t\tprivate dialogService: ConfirmDialogService,\n\t\tprivate location: Location\n\t) { }\n\n\tget alertKeyObject$() {\n\t\treturn this.alertKeyObjectSub.asObservable();\n\t}\n\n\tget alertKeyObject() {\n\t\treturn this.alertKeyObjectSub.value;\n\t}\n\n\tget alertDetailKeyObject$() {\n\t\treturn this.alertDetailKeyObjectSub.asObservable();\n\t}\n\n\tget alertDetailKeyObject() {\n\t\treturn this.alertDetailKeyObjectSub.value;\n\t}\n\n\tget alertsUpdateEvent$() {\n\t\treturn this.alertsUpdateEvent.asObservable();\n\t}\n\n\tget defaultZoneName$() {\n\t\treturn this.defaultZoneNameSub.asObservable();\n\t}\n\n\tget defaultZoneName() {\n\t\treturn this.defaultZoneNameSub.value;\n\t}\n\n\tchangeAlertStatusFilter(alertStatusFilter: AlertStatusFilter) {\n\t\tif (!this.alertKeyObject) {\n\t\t\treturn;\n\t\t}\n\t\tif (alertStatusFilter === AlertStatusEnum.ALL) {\n\t\t\tthis.alertKeyObjectSub.next({\n\t\t\t\t...this.alertKeyObject,\n\t\t\t\tsnapshotKeys: [...this.alertKeyObject.keys],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst { keys, objects } = this.alertKeyObject;\n\t\tif (alertStatusFilter === AlertStatusEnum.ONGOING) {\n\t\t\tthis.alertKeyObjectSub.next({\n\t\t\t\t...this.alertKeyObject,\n\t\t\t\tsnapshotKeys: keys.filter((k) => objects[k].ongoing),\n\t\t\t});\n\t\t} else if (alertStatusFilter === AlertStatusEnum.RECENT) {\n\t\t\tthis.alertKeyObjectSub.next({\n\t\t\t\t...this.alertKeyObject,\n\t\t\t\tsnapshotKeys: keys.filter((k) => !objects[k].ongoing),\n\t\t\t});\n\t\t}\n\n\t}\n\n\tresetAlertsSnapshot() {\n\t\tif (this.alertKeyObject) {\n\t\t\tthis.alertKeyObjectSub.next({\n\t\t\t\t...this.alertKeyObject,\n\t\t\t\tsnapshotKeys: [...this.alertKeyObject?.keys],\n\t\t\t});\n\t\t}\n\t}\n\n\tfilterAlert(filter: AlertSearchQuery) {\n\t\tif (!this.alertKeyObject) {\n\t\t\treturn;\n\t\t}\n\t\tlet snapshotKeys = [...this.alertKeyObject.keys];\n\t\tsnapshotKeys = this.filterOnImportanceLevel(filter, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnStatus(filter, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnAlertType(filter, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnClassification(filter, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnLowAndHighTrafficThreshold(filter, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnLowAndHighSeverityThresholdPercent(filter, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnBeforeOrAfterStartAndEndTime(filter, snapshotKeys);\n\n\t\tthis.alertKeyObjectSub.next({\n\t\t\t...this.alertKeyObject,\n\t\t\tsnapshotKeys,\n\t\t});\n\t}\n\n\tprivate filterOnBeforeOrAfterStartAndEndTime(filter: AlertSearchQuery, keys: string[]) {\n\t\tconst filterStartBeforeOrAfter = filter.startBeforeOrAfter.value;\n\t\tconst filterEndBeforeOrAfter = filter.endBeforeOrAfter.value;\n\t\tconst filterStartDate = filter.startDate?.value && `${filter.startDate.value}`;\n\t\tconst filterEndDate = filter.endDate?.value && `${filter.endDate.value}`;\n\t\tconst filterStartTime = filter.startTime?.value && `${filter.startTime.value}`;\n\t\tconst filterEndTime = filter.endTime?.value && `${filter.endTime.value}`;\n\t\tconst currentSnapshotKeys = [...keys];\n\t\tconst { objects } = this.alertKeyObject;\n\t\tconst dateformat = 'YYYY-MM-DD HH:mm:ss';\n\t\tif (filterStartDate && filterEndDate) {\n\t\t\treturn currentSnapshotKeys.filter((k) => {\n\t\t\t\tconst alert = objects[k];\n\t\t\t\tconst alertStartFormatted = alert.startTime ? moment.utc(alert.startTime).format(dateformat) : undefined;\n\t\t\t\tconst alertEndFormatted = alert.endTime ? moment.utc(alert.endTime).format(dateformat) : undefined;\n\n\t\t\t\tconst startTime = moment.utc(filterStartTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst endTime = moment.utc(filterEndTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst filterStartFormatted = moment.utc(filterStartDate).add({hours: startTime.hours, minutes: startTime.minutes, seconds: startTime.seconds}).format(dateformat);\n\t\t\t\tconst filterEndFormatted = moment.utc(filterEndDate).add({hours: endTime.hours, minutes: endTime.minutes, seconds: endTime.seconds}).format(dateformat);\n\n\t\t\t\tif (filterStartBeforeOrAfter === BEFORE_VALUE && filterEndBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn alertStartFormatted < filterStartFormatted && alertEndFormatted >= filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterStartBeforeOrAfter === AFTER_VALUE && filterEndBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn alertStartFormatted >= filterStartFormatted && alertEndFormatted < filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterStartBeforeOrAfter === AFTER_VALUE && filterEndBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn alertStartFormatted > filterStartFormatted && alertEndFormatted >= filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterStartBeforeOrAfter === BEFORE_VALUE && filterEndBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn alertStartFormatted < filterStartFormatted && alertEndFormatted < filterEndFormatted;\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (filterStartDate) {\n\t\t\treturn currentSnapshotKeys.filter((k) => {\n\t\t\t\tconst alert = objects[k];\n\t\t\t\tconst alertStartTimFormatted = alert.startTime ? moment.utc(alert.startTime).format(dateformat) : undefined;\n\n\t\t\t\tconst startTime = moment.utc(filterStartTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst filterStartFormatted = moment.utc(filterStartDate).add({hours: startTime.hours, minutes: startTime.minutes, seconds: startTime.seconds}).format(dateformat);\n\n\t\t\t\tif (alertStartTimFormatted && filterStartBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn alertStartTimFormatted < filterStartFormatted;\n\t\t\t\t} else if (alertStartTimFormatted && filterStartBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn alertStartTimFormatted >= filterStartFormatted;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t});\n\t\t} else if (filterEndDate) {\n\t\t\treturn currentSnapshotKeys.filter((k) => {\n\t\t\t\tconst alert = objects[k];\n\t\t\t\tconst alertEndFormatted = alert.endTime ? moment.utc(alert.endTime).format(dateformat) : undefined;\n\n\t\t\t\tconst endTime = moment.utc(filterEndTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst filterEndFormatted = moment.utc(filterEndDate).add({hours: endTime.hours, minutes: endTime.minutes, seconds: endTime.seconds}).format(dateformat);\n\n\t\t\t\tif (filterEndBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn alertEndFormatted >= filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterEndBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn alertEndFormatted < filterEndFormatted;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnLowAndHighSeverityThresholdPercent(filter: AlertSearchQuery, keys: string[]) {\n\t\tconst lowSeverityPercent = filter.lowSeverityPercent.value;\n\t\tconst highSeverityPercent = filter.highSeverityPercent.value;\n\t\tconst currentSnapshotKeys = [...keys];\n\t\tconst { objects } = this.alertKeyObject;\n\t\tif (lowSeverityPercent && highSeverityPercent) {\n\t\t\treturn currentSnapshotKeys.filter(\n\t\t\t\t(k) => objects[k].severityPercent >= +lowSeverityPercent && objects[k].severityPercent <= +highSeverityPercent\n\t\t\t);\n\t\t}\n\n\t\tif (lowSeverityPercent) {\n\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].severityPercent >= +lowSeverityPercent);\n\t\t}\n\t\tif (highSeverityPercent) {\n\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].severityPercent <= +highSeverityPercent);\n\t\t}\n\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnLowAndHighTrafficThreshold(filter: AlertSearchQuery, keys: string[]) {\n\t\tconst thresholdUnit = filter.thresholdUnit.value;\n\t\tconst lowThreshold = filter.lowThreshold.value;\n\t\tconst highThreshold = filter.highThreshold.value;\n\t\tconst currentSnapshotKeys = [...keys];\n\t\tconst { objects } = this.alertKeyObject;\n\t\tif (lowThreshold && highThreshold) {\n\t\t\tif (thresholdUnit === BPS_VALUE) {\n\t\t\t\treturn currentSnapshotKeys.filter(\n\t\t\t\t\t(k) => objects[k].impactBps >= +lowThreshold && objects[k].impactBps <= +highThreshold\n\t\t\t\t);\n\t\t\t} else if (thresholdUnit === BYTESPS_VALUE) {\n\t\t\t\t(k) => objects[k].impactBps >= +lowThreshold / 8 && objects[k].impactBps <= +highThreshold / 8\n\t\t\t}\n\t\t\treturn currentSnapshotKeys.filter(\n\t\t\t\t(k) => objects[k].impactPps >= +lowThreshold && objects[k].impactPps <= +highThreshold\n\t\t\t);\n\t\t}\n\n\t\tif (lowThreshold) {\n\t\t\tif (thresholdUnit === BPS_VALUE) {\n\t\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].impactBps >= +lowThreshold);\n\t\t\t} else if (thresholdUnit === BYTESPS_VALUE) {\n\t\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].impactBps >= +lowThreshold / 8);\n\t\t\t}\n\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].impactPps >= +lowThreshold);\n\t\t}\n\t\tif (highThreshold) {\n\t\t\tif (thresholdUnit === BPS_VALUE) {\n\t\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].impactBps <= +highThreshold);\n\t\t\t} else if (thresholdUnit === BYTESPS_VALUE) {\n\t\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].impactBps <= +lowThreshold / 8);\n\t\t\t}\n\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].impactPps <= +highThreshold);\n\t\t}\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnClassification(filter: AlertSearchQuery, keys: string[]) {\n\t\tconst classification = assertValue(filter.classification.value).toString();\n\t\tconst currentSnapshotKeys = [...keys];\n\t\tconst { objects } = this.alertKeyObject;\n\t\tif (classification && classification !== ALL_VALUE) {\n\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].classification === classification);\n\t\t}\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnAlertType(filter: AlertSearchQuery, keys: string[]) {\n\t\tconst alertType = assertValue(filter.alertType.value).toString();\n\t\tconst currentSnapshotKeys = [...keys];\n\t\tconst { objects } = this.alertKeyObject;\n\t\tif (alertType !== ALL_VALUE) {\n\t\t\treturn currentSnapshotKeys.filter((k) => objects[k].alertType.includes(alertType));\n\t\t}\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnStatus(filter: AlertSearchQuery, keys: string[]) {\n\t\tconst onGoing = filter.onGoing.value;\n\t\tconst recent = filter.recent.value;\n\t\tconst { objects } = this.alertKeyObject;\n\t\tlet currentSnapshotKeys = [...keys];\n\t\tif (onGoing && !recent) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => objects[k].ongoing);\n\t\t}\n\n\t\tif (!onGoing && recent) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => !objects[k].ongoing);\n\t\t}\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnImportanceLevel(filter: AlertSearchQuery, keys: string[]) {\n\t\tconst importanceLevels: string[] = [];\n\t\tfilter.importanceHigh.value && importanceLevels.push('high');\n\t\tfilter.importanceMedium.value && importanceLevels.push('medium');\n\t\tfilter.importanceLow.value && importanceLevels.push('low');\n\t\tconst currentSnapshotKeys = [...keys];\n\t\tif (importanceLevels.length > 0) {\n\t\t\treturn currentSnapshotKeys.filter((k) => importanceLevels.includes(this.alertKeyObject.objects[k].importance));\n\t\t}\n\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tsortAlerts(sort: Sort) {\n\t\tconst keyName = sort.active;\n\t\tfunction compare(a: Alert, b: Alert): number {\n\t\t\tif (typeof a[keyName] === 'number' || typeof a[keyName] === 'bigint') {\n\t\t\t\treturn +a[keyName] - +b[keyName];\n\t\t\t}\n\n\t\t\tif (typeof a[keyName] === 'string') {\n\t\t\t\treturn (a[keyName]).localeCompare(b[keyName]);\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst { snapshotKeys, objects } = this.alertKeyObject;\n\t\tlet currentSnapshotKeys = [...snapshotKeys];\n\t\tif (sort.direction === 'asc') {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.sort((aKey, bKey) => {\n\t\t\t\treturn compare(objects[aKey], objects[bKey]);\n\t\t\t});\n\t\t} else if (sort.direction === 'desc') {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.sort((aKey, bKey) => {\n\t\t\t\treturn compare(objects[bKey], objects[aKey]);\n\t\t\t});\n\t\t}\n\n\t\tthis.alertKeyObjectSub.next({\n\t\t\t...this.alertKeyObject,\n\t\t\tsnapshotKeys: currentSnapshotKeys,\n\t\t});\n\t}\n\n\tremoveAlertFromSnapshot(alertId: number) {\n\t\tconst snapshotKeys = this.alertKeyObject.snapshotKeys.filter((id) => id !== alertId.toString());\n\t\tthis.alertKeyObjectSub.next({\n\t\t\t...this.alertKeyObject,\n\t\t\tsnapshotKeys,\n\t\t});\n\t}\n\n\tgetAlerts(refresh = true) {\n\t\tif (refresh || !this.alertKeyObject?.keys.length) {\n\t\t\tconst getCustomerAlertReportUrl = URLS.getApiUrl(\n\t\t\t\tURLS.CUSTOMER_ALERTS,\n\t\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t\t);\n\n\t\t\t// notify subscribers that it is reloading.\n\t\t\tthis.alertKeyObjectSub.next(undefined);\n\t\t\tconst request = this.http.get>(getCustomerAlertReportUrl, {}).pipe(\n\t\t\t\tcatchError((e: Error) => {\n\t\t\t\t\t// to complete the global gets.\n\t\t\t\t\tthis.alertKeyObjectSub.next({\n\t\t\t\t\t\tobjects: {},\n\t\t\t\t\t\tkeys: [],\n\t\t\t\t\t\tsnapshotKeys: [],\n\t\t\t\t\t\tdefaultZoneName: undefined,\n\t\t\t\t\t});\n\t\t\t\t\treturn throwError(() => e);\n\t\t\t\t}),\n\t\t\t\ttap((response) => {\n\t\t\t\t\tif (isSucceededResponse(response)) {\n\t\t\t\t\t\tthis.defaultZoneNameSub.next(assertValue(response.dataObject).defaultZoneName);\n\t\t\t\t\t\tconst alertKeyObject = getAlertKeyObject(response);\n\t\t\t\t\t\t// The use of addPropertiesToEachElement is emulating the addition of region and site properties, in the future this func is not needed\n\t\t\t\t\t\talertKeyObject.objects = addPropertiesToEachObject(alertKeyObject.objects, {\n\t\t\t\t\t\t\tregion: this.sessionStore.currentCompanyDetail.region,\n\t\t\t\t\t\t\tsite: this.sessionStore.currentCompanySite,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.alertKeyObjectSub.next(alertKeyObject);\n\t\t\t\t\t\tthis.alertsUpdateEvent.next(true);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tif (this.intervalAlertsSub) {\n\t\t\t\tthis.intervalAlertsSub.unsubscribe();\n\t\t\t}\n\t\t\tthis.intervalAlertsSub = interval(updateDelay)\n\t\t\t\t.pipe(\n\t\t\t\t\tstartWith(0),\n\t\t\t\t\tmergeMap(() => request)\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\t\t}\n\t}\n\n\tgetAlertsByPeriod(startTime: string, endTime: string): AlertReportsDataSource[] {\n\t\treturn this.alertKeyObject.keys.filter((alertKey) => {\n\t\t\tconst alert = this.alertKeyObject.objects[alertKey];\n\t\t\treturn alert.startTime && moment.utc(alert.startTime as string).isBetween(moment.utc(startTime), moment.utc(endTime).add(1, 'day'))\n\t\t}).map(key => getAlertReport(this.alertKeyObject.objects[key]));\n\t}\n\n\tgetAlertDetails(queryParams: AlertDetailQueryParam) {\n\t\tconst alertId = assertValue(queryParams.alertId, MISSING_ROUTE_DATA.replace('{data}', 'alertId'));\n\t\tconst startTime = assertValue(queryParams.startTime, MISSING_ROUTE_DATA.replace('{data}', 'startTime'));\n\t\tconst endTime = assertValue(queryParams.endTime, MISSING_ROUTE_DATA.replace('{data}', 'endTime'));\n\t\tconst unit = assertValue(queryParams.unit, MISSING_ROUTE_DATA.replace('{data}', 'unit'));\n\t\tconst getCustomerAlertByIdUrl = URLS.getApiUrl(\n\t\t\tURLS.CUSTOMER_ALERT_BY_ID,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t).replace('{alertId}', alertId.toString());\n\n\t\tthis.alertDetailKeyObjectSub.next(undefined);\n\t\tthis.http\n\t\t\t.get>(getCustomerAlertByIdUrl, {\n\t\t\t\tparams: { startTime, endTime, unit },\n\t\t\t})\n\t\t\t.pipe(\n\t\t\t\ttap((response) => {\n\t\t\t\t\tconst alertDetailKeyObject: AlertDetailKeyObject = {\n\t\t\t\t\t\tdefaultZoneName: assertValue(response.dataObject).defaultZoneName,\n\t\t\t\t\t\tkeys: [alertId],\n\t\t\t\t\t\tsnapshotKeys: [alertId],\n\t\t\t\t\t\tobjects: {[alertId]: response.dataObject.alertData}\n\t\t\t\t\t};\n\t\t\t\t\tthis.alertDetailKeyObjectSub.next(alertDetailKeyObject);\n\t\t\t\t}),\n\t\t\t\tcatchError((err: HttpErrorResponse) => {\n\t\t\t\t\tif (err.status === 404) {\n\t\t\t\t\t\tlet dialog: any;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdialog = this.dialogService.openConfirmDialog(DDOS_CONFIRM_DIALOG_NO_DATA);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.log(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdialog.afterClosed().subscribe((goBack) => {\n\t\t\t\t\t\t\tif (goBack) {\n\t\t\t\t\t\t\t\tthis.location.back();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn throwError(() => new Error());\n\t\t\t\t})\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { assertValue } from '@src/app/utils/assert';\nimport { environment } from '../../environments/environment';\n\nexport const COMPANY_ID = '{companyId}';\nexport const REQUEST_ID = '{requestId}';\nexport const ALERT_ID = '{alertId}';\nexport const NETWORK_CONNECTION_ID = '{networkConnectionId}';\nexport const ORDER_SSPP_GUID = '{orderSSPPGuid}';\nexport const LIAISON_ID = '{liaisonId}';\nexport const FILENAME = '{filename}';\nexport const BDID = '{bdId}';\n\nexport const getApiUrl = (requestPath: string, companyId?: number): string => {\n\treturn companyId\n\t\t? `${environment.API_BACKEND_URL}${requestPath}`.replace(COMPANY_ID, assertValue(companyId).toString())\n\t\t: `${environment.API_BACKEND_URL}${requestPath}`;\n};\n\nconst version = ''; // example: /1.0, /2.0, /v1.0, always prefix with slash.\nconst customerUrl = `/ddos${version}/customer`;\nconst customerWithRequiredCompanyIdUrl = `${customerUrl}/${COMPANY_ID}`;\nconst adminUrl = `/ddos${version}/admin`;\nconst adminWithRequiredCompanyIdUrl = `${adminUrl}/${COMPANY_ID}`;\nconst knowledgeBaseDocsUrl = `/ddos${version}/knowledgeBaseDoc`;\nconst authBaseUrl = `/auth${version}`;\n\nexport const LOGOUT_URL = `${authBaseUrl}/logout`;\n\nexport const GET_CONTACT_BY_BDID = `${customerUrl}/validate/${BDID}`;\nexport const GET_REQUEST_DETAILS = `${customerWithRequiredCompanyIdUrl}/request/${REQUEST_ID}`;\nexport const GET_CUSTOMER_COMPANY_INFO = `${customerUrl}-info`;\nexport const GET_CUSTOMER_DETAILS = `${customerWithRequiredCompanyIdUrl}/detail`;\n\nexport const GET_TRAFFIC_INFO = `${customerWithRequiredCompanyIdUrl}/report/traffic`;\nexport const CUSTOMER_ALERTS = `${customerWithRequiredCompanyIdUrl}/report/alert`;\nexport const CUSTOMER_ALERT_BY_ID = `${customerWithRequiredCompanyIdUrl}/report/alert/${ALERT_ID}`;\nexport const MITIGATION_REPORT = `${customerWithRequiredCompanyIdUrl}/report/mitigation`;\nexport const ONGOING_MITIGATION_REPORT = `${MITIGATION_REPORT}?mitigationPeriod=1`;\nexport const MITIGATION_SUMMARY_REPORT = `${customerWithRequiredCompanyIdUrl}/report/mitigation/traffic?{startTime}&{endTime}&{mitigationName}`;\nexport const GET_BILLING_REPORT = `${customerWithRequiredCompanyIdUrl}/report/mitigation/${ORDER_SSPP_GUID}/billing?{startTime}&{endTime}`;\n\nexport const GET_NETWORK_CONNECTIONS = `${customerWithRequiredCompanyIdUrl}/networkConnection`;\nexport const GET_NETWORK_CONNECTION = `${customerWithRequiredCompanyIdUrl}/networkConnection/${NETWORK_CONNECTION_ID}`;\nexport const ADD_NETWORK_CONNECTIONS = `${customerWithRequiredCompanyIdUrl}/networkConnection`;\nexport const UPDATE_NETWORK_CONNECTIONS = `${customerWithRequiredCompanyIdUrl}/networkConnection/{${NETWORK_CONNECTION_ID}}`;\nexport const BULK_UPDATE_NETWORK_CONNECTIONS = `${customerWithRequiredCompanyIdUrl}/networkConnection/bulk/update`;\n\nexport const MITIGATION_BY_ACTION = `${customerWithRequiredCompanyIdUrl}/mitigation`;\n\nexport const KNOWLEDGE_BASE_DOCS = `${knowledgeBaseDocsUrl}`;\nexport const UPLOAD_KNOWLEDGE_BASE_DOC = `${knowledgeBaseDocsUrl}`;\nexport const DOWNLOAD_KNOWLEDGE_BASE_DOC = `${knowledgeBaseDocsUrl}/${FILENAME}`;\n\nexport const CUSTOMER_DETAILS_BY_LIAISONS = `${adminWithRequiredCompanyIdUrl}/liaison`;\nexport const CREATE_LIAISON = `${adminWithRequiredCompanyIdUrl}/liaison`;\nexport const DELETE_LIAISONS = `${adminWithRequiredCompanyIdUrl}/liaison/${LIAISON_ID}`;\nexport const UPDATE_LIAISONS = `${adminWithRequiredCompanyIdUrl}/liaison/${LIAISON_ID}`;\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { BehaviorSubject, combineLatestWith, filter } from 'rxjs';\nimport {\n\tSidebarItem,\n\tTabItem,\n\tAppLayoutRouting,\n\tTrafficSidebarsForRegularUser,\n\tTabsForRegularUser,\n\tTabsForReactiveUser,\n\tReportSidebarsForRegularUser,\n} from '@src/app/routing-constants';\nimport { OrUndefineable } from '@src/types/types.utils';\nimport { CompanyOfferType } from '../common.model';\nimport { SessionStore } from '../session/session.store';\nimport { CompanyDetail } from '../session/session.model';\n\nexport type Breadcrumb = { label: string; url: string };\n\n/**\n * Navigation Store\n */\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class AppLayoutStore {\n\tprivate readonly sidebarsSub = new BehaviorSubject>([]);\n\n\tprivate readonly tabsSub = new BehaviorSubject>(TabsForRegularUser);\n\n\tconstructor(\n\t\tprivate router: Router,\n\t\tprivate sessionStore: SessionStore\n\t) {\n\t\tthis.sessionStore.isAuthenticatedAndReady$\n\t\t\t.pipe(filter((isReady) => isReady))\n\t\t\t.subscribe(() => this.buildTabItemsByOfferType());\n\n\t\tthis.router.events\n\t\t\t.pipe(\n\t\t\t\tfilter((event) => event instanceof NavigationEnd),\n\t\t\t\tcombineLatestWith(this.sessionStore.currentCompanyDetail$)\n\t\t\t)\n\t\t\t.subscribe(([_, company]) => this.buildSidebarMenuItems(company));\n\t}\n\n\tget regularUserSidebarItems$() {\n\t\treturn this.sidebarsSub.asObservable();\n\t}\n\n\tget regularUserSidebarItems() {\n\t\treturn this.sidebarsSub.value;\n\t}\n\n\tget tabItems$() {\n\t\treturn this.tabsSub.asObservable();\n\t}\n\n\tget tabItems() {\n\t\treturn this.tabsSub.value;\n\t}\n\n\tprivate buildTabItemsByOfferType() {\n\t\tconst company = this.sessionStore.currentCompanyDetail;\n\t\tif (company && company.OfferType === CompanyOfferType.REACTIVE) {\n\t\t\tthis.tabsSub.next(TabsForReactiveUser);\n\t\t} else {\n\t\t\t// Based on Karen Steele, the Bandwidth tier and regular tier\n\t\t\t// should see the same tabs/sidebars UI.\n\t\t\tthis.tabsSub.next(TabsForRegularUser);\n\t\t}\n\t}\n\n\tprivate buildSidebarMenuItems(company: CompanyDetail) {\n\t\tconst currentRoute = this.router.url;\n\t\tlet sidebars: SidebarItem[] = [];\n\t\tif (company.OfferType !== CompanyOfferType.REACTIVE) {\n\t\t\tif (currentRoute.includes(AppLayoutRouting.TRAFFIC)) {\n\t\t\t\tsidebars = TrafficSidebarsForRegularUser;\n\t\t\t} else if (currentRoute.includes(AppLayoutRouting.REPORTS)) {\n\t\t\t\tsidebars = ReportSidebarsForRegularUser;\n\t\t\t}\n\t\t}\n\n\t\tthis.sidebarsSub.next(sidebars);\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { MatSelectChange } from '@angular/material/select';\nimport { Params } from '@angular/router';\n\nexport type NetworkAddress = string;\n\nexport type PrimitiveValue = bigint | number | string | string[] | boolean | null | undefined | Params;\n\nexport type CompanyIdentifier = {\n\tcompanyID: number;\n\tcompanyName: string;\n};\n\nexport type TimeRangeParam = {\n\tstartTime: string;\n\tendTime?: string;\n};\n\nexport type DateRangeParam = {\n\tstartDate: string;\n\tendDate: string;\n};\n\nexport type MonthObject = {\n\tmonth: string;\n\tvalue: number;\n};\n\nexport type NameValueOption = {\n\tname: string;\n\tvalue: PrimitiveValue;\n};\n\nexport type TableDataSource = { [k: string]: PrimitiveValue };\n\nexport type TableFilter = NameValueOption & {\n\toptions: NameValueOption[];\n\ttooltip?: string;\n};\n\nexport type TableFilterDropDownOption = {\n\tchangeOption: MatSelectChange;\n\tselectedFilter: TableFilter;\n};\n\nexport type TableColumn = {\n\tcolumnName: string;\n\tdataKey: string;\n\tisIconData?: boolean;\n\ttooltip?: string;\n\t// key to get tooltip from data source.\n\ttooltipKey?: string;\n\tcolumnNameIcon?: string | string[];\n\tcolumnNameIconColor?: string;\n\tdataKeyIcon?: string | string[];\n\tdataKeyIconColor?: string;\n\tsortArrowPosition?: 'right' | 'left';\n\tisInnerHtmlString?: boolean;\n\tisSortable?: boolean;\n\tisTextFilter?: boolean;\n\tisFilterable?: boolean;\n\tisDataKeyHidden?: boolean;\n\tisRowCenterAligned?: boolean;\n\tisLink?: boolean;\n};\n\nexport type TableRowClick = {\n\tactionIcon: string | string[];\n\trowValue: TableDataSource;\n};\n\nexport type ApiResponse = {\n\tserviceName: string;\n\treturnCode: number;\n\treturnDescription: string;\n\tdataObject?: T;\n};\n\nexport enum CompanyOfferType {\n\tNON_REACTIVE = 0,\n\tREACTIVE = 1,\n\tBANDWIDTH_TIER = 2,\n}\n\nexport enum ServiceType {\n\tRL = 'RL',\n\tIDC = 'IDC',\n}\n\nexport const updateDelay: number = 3 * 60 * 1000;\n\nexport type NodeValue = string | number | boolean | Date | undefined;\n\nexport type QueryNode = {\n\tvalue: NodeValue;\n\toptions?: Set;\n};\n\nexport enum ReturnCode {\n\tSUCCESS = 0,\n\tERROR = 1,\n\tNOT_FOUND = 2,\n}\n\nexport type UnitType = 'bps' | 'pps';\n","import { OrUndefineable } from '@src/types/types.utils';\nimport moment, { Moment } from 'moment';\nimport { assertValue } from '../utils/assert';\nimport { ApiResponse, NameValueOption, ReturnCode, TableDataSource } from './common.model';\n\n/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nexport const isSucceededResponse = (response: ApiResponse): boolean => response.returnCode === ReturnCode.SUCCESS;\n\n// ====================================================================================================\n// get response error text.\n// NOTEs: we need this function because there are no standard way from the ddo service that can help\n// us to get the friend error message but I found the following way is the most reliable way that I\n// found to deal with the service, especially with ddo service.\nexport const getResponseErrorMessage = (response: ApiResponse): OrUndefineable => {\n\tif (!isSucceededResponse(response)) {\n\t\tconst splitters = assertValue(response.returnDescription).split('Error :');\n\t\tif (splitters.length >= 2) {\n\t\t\treturn splitters.at(splitters.length - 1);\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nexport const buildFilterOptions = (data: TableDataSource[], filter: string): NameValueOption[] => {\n\tconst set = new Set();\n\tdata.filter((r) => r[filter]).forEach((r) => set.add(r[filter].toString()));\n\treturn [...set].map((value) => ({\n\t\tname: filter,\n\t\tvalue,\n\t}));\n};\n\nexport const addPropertiesToEachElement = (arr: T[], obj: Partial): T[] => {\n\treturn arr.map((element) => {\n\t\treturn { ...element, ...obj };\n\t});\n};\n\nexport const addPropertiesToEachObject = (obj: { [k: string]: T }, props: Partial): { [k: string]: T } => {\n\tconst newObj: { [k: string]: T } = {};\n\t// eslint-disable-next-line no-restricted-syntax, guard-for-in\n\tfor (const objKey in obj) {\n\t\tnewObj[objKey] = { ...obj[objKey], ...props };\n\t}\n\treturn newObj;\n};\n\nexport const formatDataNumberSize = (value: number, bitsToBytes = false, sizes: string[] = [], k = 1024): string => {\n\tif (!+value) return '0';\n\tconst bytes = bitsToBytes ? value / 8 : value;\n\n\tconst decimals = 1;\n\tconst newSizes = sizes.length > 0 ? sizes : ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];\n\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn `${parseFloat((bytes / k ** i).toFixed(decimals))} ${newSizes[i] || ''}`;\n};\n\nexport const tickYCallback = (tick: number | string, _index: number, _array: any[], selectedUnit: string): string => {\n\tconst negative: string = +tick < 0 ? '-' : '';\n\tconst value: number = Math.abs(+tick);\n\tconst sizes: string[] = selectedUnit === 'pps' ? ['', 'K', 'M', 'B', 'T', 'P'] : [];\n\tconst k = 1000;\n\treturn negative + formatDataNumberSize(value, false, sizes, k) + selectedUnit;\n};\n\nexport const formatUnits = (traffic: number, unit: string): string => {\n\treturn tickYCallback(traffic, null, null, unit);\n};\n\nexport const dateFormat = (date: string | Moment): string => {\n\tconst isSameYear: boolean = moment.utc().isSame(moment.utc(date), 'year');\n\treturn isSameYear ? 'MMM DD HH:mm' : 'MMM DD YYYY HH:mm';\n};\n\nexport const dateFormatRange = (startDate: string | Moment, endDate: string | Moment): string => {\n\tconst startEndSameDay: boolean = moment.utc(startDate).isSame(moment.utc(endDate), 'day');\n\tif (startEndSameDay) {\n\t\treturn 'HH:mm';\n\t}\n\tconst isSameYear: boolean = moment.utc(endDate).isSame(moment.utc(startDate), 'year');\n\treturn isSameYear ? 'MMM DD HH:mm' : 'MMM DD YYYY HH:mm';\n};\n\nexport const generateNewColorVariant = (): string => {\n\treturn `#${Math.floor(Math.random() * 16777215)\n\t\t.toString(16)\n\t\t.padStart(6, '0')}`;\n};\n\nexport const getColorVariant = (index: number): string => {\n\tconst backgroundColor = ['#003E86', '#649543', '#FF4349', '#FFB74D', '#FF8500'];\n\n\tif (index < backgroundColor.length) {\n\t\treturn backgroundColor[index];\n\t}\n\n\treturn generateNewColorVariant();\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, combineLatest, filter, Observable, Subscription } from 'rxjs';\nimport { OrUndefineable } from '@src/types/types.utils';\nimport { SessionStore } from './session/session.store';\nimport { AlertStore } from './alert/alert.store';\nimport { MitigationStore } from './report/mitigation/mitigation.store';\nimport { AdminStore } from './admin/admin.store';\nimport { CompanyOfferType } from './common.model';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class GlobalGetsStore {\n\tprivate globalGetsDoneSub = new BehaviorSubject(false);\n\n\tprivate companyDetailSub: OrUndefineable;\n\n\tprivate globalGetsObservables: Observable[];\n\n\tprivate globalUpdatesObservables: Observable[];\n\n\tprivate firstLoad = true;\n\n\tconstructor(\n\t\tprivate sessionStore: SessionStore,\n\t\tprivate alertStore: AlertStore,\n\t\tprivate mitigationStore: MitigationStore,\n\t\t// private knowledgebaseStore: KnowledgeBaseStore,\n\t\tprivate adminStore: AdminStore\n\t) {\n\t\t// setup global gets observables.\n\t\tthis.globalGetsObservables = [\n\t\t\tthis.alertStore.alertKeyObject$,\n\t\t\tthis.mitigationStore.mitigationKeyObject$,\n\t\t\tthis.mitigationStore.syncedStatusNetworkConnectionKeyObjects$,\n\t\t\tthis.adminStore.liaisonContactKeyObject$,\n\t\t\t// this.knowledgebaseStore.knowledgebaseDocFile$,\n\t\t];\n\n\t\t// listening to all.\n\t\tcombineLatest(this.globalGetsObservables).subscribe(([alert, mitigation, syncedNetworkStatus, liaison]) => {\n\t\t\tconst offerType: number | undefined = this.sessionStore.currentCompanyDetail?.OfferType;\n\t\t\tif (\n\t\t\t\t(alert || (!!offerType && offerType === CompanyOfferType.REACTIVE)) &&\n\t\t\t\tmitigation &&\n\t\t\t\tsyncedNetworkStatus &&\n\t\t\t\tliaison\n\t\t\t) {\n\t\t\t\tthis.globalGetsDoneSub.next(true);\n\t\t\t}\n\t\t});\n\n\t\tthis.sessionStore.isAuthenticatedAndReady$.pipe(filter((isReady) => isReady)).subscribe(() => {\n\t\t\tif (this.firstLoad) {\n\t\t\t\tthis.firstLoad = false;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// unsubscribe before resubscribe it again.\n\t\t\tthis.companyDetailSub?.unsubscribe();\n\n\t\t\t// speed the portal by loading all the gets globally.\n\t\t\tthis.companyDetailSub = this.sessionStore.currentCompanyDetail$.subscribe((company) => {\n\t\t\t\tif (company) {\n\t\t\t\t\tif (this.sessionStore.currentCompanyDetail.OfferType !== CompanyOfferType.REACTIVE) {\n\t\t\t\t\t\tthis.alertStore.getAlerts();\n\t\t\t\t\t}\n\t\t\t\t\tthis.mitigationStore.getMitigations();\n\t\t\t\t\tthis.mitigationStore.getSyncedMitigationStatus();\n\t\t\t\t\tthis.adminStore.getLiaisonContacts();\n\t\t\t\t\t// this.knowledgebaseStore.getKnowledgeBaseDocs();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tget globalGetsDone$() {\n\t\treturn this.globalGetsDoneSub.asObservable();\n\t}\n\n\tget globalGetsDone() {\n\t\treturn this.globalGetsDoneSub.value;\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class LoaderStore {\n\tprivate count = 0;\n\n\tprivate readonly httpProgressSub = new BehaviorSubject(false);\n\n\tget httpProgress$() {\n\t\treturn this.httpProgressSub.asObservable();\n\t}\n\n\tget httpProgress() {\n\t\treturn this.httpProgressSub.value;\n\t}\n\n\tincreaseRemoteCallCount() {\n\t\tthis.count += 1;\n\t\tif (this.count > 0) {\n\t\t\tthis.httpProgressSub.next(true);\n\t\t}\n\t}\n\n\tdecreaseRemoteCallCount() {\n\t\tthis.count -= 1;\n\t\tif (this.count <= 0) {\n\t\t\tthis.count = 0;\n\t\t\tthis.httpProgressSub.next(false);\n\t\t}\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport moment from 'moment';\nimport {\n\tCMOKeyObject,\n\tCmoIpList,\n\tLevel,\n\tMitigation,\n\tNetworkConnectionKeyObject,\n\tSite,\n} from '../mitigation/mitigation.model';\nimport {\n\tPeriod,\n\tMitigationBillingResult,\n\tBillingReportDataSource,\n\tIpMonitoredReportDataSource,\n\tMitigationReportDataSource,\n\tAlertReportsDataSource,\n\tCmoReportDataSource,\n} from './billing.model';\nimport { Alert, AlertKeyObject } from '../../alert/alert.model';\nimport { NetworkAddress } from '../../common.model';\nimport { dateFormat } from '../../common.utils';\nimport { formatMitigationDuration } from '../mitigation/mitigation.converter';\n\nexport const getContractHoursFromPlanDescription = (planDescription: string): number => {\n\tconst match = planDescription.match(/\\d+/);\n\treturn match ? parseInt(match[0], 10) : 0;\n};\n\nexport const getContractedHours = (response: MitigationBillingResult): number => {\n\tlet hours = 0;\n\tif (response.sites) {\n\t\thours = response.sites\n\t\t\t.flatMap((site) => {\n\t\t\t\treturn site.levels.map((level) => getContractHoursFromPlanDescription(level.name));\n\t\t\t})\n\t\t\t.reduce((acc, cur) => acc + cur, 0);\n\t}\n\treturn hours;\n};\n\nexport const getPlanName = (response: MitigationBillingResult): string => {\n\tlet planName = '';\n\tif (response.sites) {\n\t\tplanName = response.sites\n\t\t\t.flatMap((site) => {\n\t\t\t\treturn site.levels.map((level) => level.name);\n\t\t\t})\n\t\t\t.shift();\n\t}\n\treturn planName;\n};\n\nexport const getBillingReportTimeRange = (period?: Period): [string, string] => {\n\tconst now = moment.utc();\n\tconst isCurrentMonth = period === undefined || period === moment.utc().get('M');\n\tif (isCurrentMonth) {\n\t\treturn [now.startOf('month').format('YYYY-MM-DD'), moment.utc().format('YYYY-MM-DD')];\n\t}\n\n\tconst isPastMonth = period < now.get('M');\n\tif (isPastMonth) {\n\t\t// If period is a past month, set start and end time accordingly\n\t\tconst pastMonth = moment.utc().month(period);\n\t\treturn [pastMonth.startOf('month').format('YYYY-MM-DD'), pastMonth.endOf('month').format('YYYY-MM-DD')];\n\t}\n\n\t// If period is a past month in previous year, set start and end time accordingly\n\tconst pastYearMonth = moment.utc().subtract(12, 'months').month(period);\n\treturn [pastYearMonth.startOf('month').format('YYYY-MM-DD'), pastYearMonth.endOf('month').format('YYYY-MM-DD')];\n};\n\n// =====================================================================================================================\n// convert models to data sources for reports.\nexport const getMitigationReport = (mitigation: Mitigation): MitigationReportDataSource => {\n\treturn {\n\t\tname: mitigation.mitigationName,\n\t\ttarget: mitigation.ipDiverisonData,\n\t\tregion: mitigation.region,\n\t\tsite: mitigation.site,\n\t\tstartDate: moment.utc(mitigation.attackStartDate).format(dateFormat(mitigation.attackStartDate)),\n\t\tendDate: mitigation.attackEndDate\n\t\t\t? moment.utc(mitigation.attackEndDate).format(dateFormat(mitigation.attackEndDate))\n\t\t\t: 'In Progress',\n\t\tduration: formatMitigationDuration(mitigation.duration),\n\t\tresources: '',\n\t\tclassification: '',\n\t};\n};\n\nexport const getMitigationReports = (mitigations: Mitigation[]): MitigationReportDataSource[] => {\n\treturn mitigations.map((mitigation) => getMitigationReport(mitigation));\n};\n\nexport const getBillingReport = (site: Site, level: Level): BillingReportDataSource => {\n\tconst duration = `${moment.utc(level.endDate).add(1, 'second').diff(moment.utc(level.startDate), 'days')} days`;\n\treturn {\n\t\tname: site.customerName,\n\t\tstartDate: moment.utc(level.startDate).format('YYYY/MM/DD HH:mm:ss'),\n\t\tendDate: moment.utc(level.endDate).format('YYYY/MM/DD HH:mm:ss'),\n\t\tduration,\n\t};\n};\n\nexport const getBillingReports = (response: MitigationBillingResult): BillingReportDataSource[] => {\n\tlet billingReportData: BillingReportDataSource[] = [];\n\tif (response.sites) {\n\t\tbillingReportData = response.sites.flatMap((site) => {\n\t\t\treturn site.levels.map((level) => getBillingReport(site, level));\n\t\t});\n\t}\n\treturn billingReportData;\n};\n\nexport const getCmoReport = (cmoList: CmoIpList, cmoName: string): CmoReportDataSource => {\n\treturn {\n\t\tcmoName,\n\t\tcmoIp: cmoList.cmoIp,\n\t};\n};\n\nexport const getCmoReports = (cmoKeyObject: CMOKeyObject): CmoReportDataSource[] => {\n\treturn cmoKeyObject.keys.map((k) => getCmoReport(cmoKeyObject.objects[k], cmoKeyObject.cmoName));\n};\n\nexport const getIpMonitorReport = (\n\tconnection: NetworkConnectionKeyObject,\n\tnetworkAddress: NetworkAddress\n): IpMonitoredReportDataSource => {\n\tconst dataSource: IpMonitoredReportDataSource = {\n\t\tname: connection.companyName,\n\t\tprotectedZones: networkAddress,\n\t\tnetworkType: connection.serviceType,\n\t\tagnosticType: connection.agnosticType,\n\t};\n\n\treturn dataSource;\n};\n\nexport const getAlertReport = (alert: Alert): AlertReportsDataSource => {\n\tconst { alertId, classification, moName, region, site } = alert;\n\treturn {\n\t\talertId,\n\t\tregion,\n\t\tsite,\n\t\tresources: moName,\n\t\tclassification,\n\t};\n};\n\nexport const getAlertReports = (alertKeyObject: AlertKeyObject): AlertReportsDataSource[] => {\n\treturn alertKeyObject.keys.map((k) => getAlertReport(alertKeyObject.objects[k]));\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport moment from 'moment';\nimport 'moment-timezone';\nimport { assertValue } from '@src/app/utils/assert';\nimport { toKeyObject } from '@src/app/utils/key-object';\nimport { AppLayoutRouting } from '@src/app/routing-constants';\nimport { ApiResponse, TableColumn } from '../../common.model';\nimport {\n\tDropAndPass,\n\tNetworkConnectionKeyObject,\n\tMitigationDataSource,\n\tMitigationSummary,\n\tTrafficClass,\n\tMitigationRate,\n\tMitigation,\n\tMitigationStatus,\n\tNetworkAddressDetail,\n\tUpdateNetworkConnections,\n\tUpdateIpStatus,\n\tNetworkConnectionCollection,\n\tMitigationCollection,\n\tNetWorkConnectionDataSource,\n\tMitigationDisplayData,\n\tMitigationKeyObject,\n\tTrafficUtilSummFlat,\n\tCMOKeyObject,\n} from './mitigation.model';\nimport { dateFormat } from '../../common.utils';\n\n// calculate mitigation status\n// ====================================================================================================\nexport const getMitigationDisplayData = (mitigationStatus: MitigationStatus): MitigationDisplayData => {\n\tconst status = assertValue(mitigationStatus, 'mitigation status must be defined');\n\n\tif (!status.mitigationReady) {\n\t\treturn {\n\t\t\tmitigation: 'Validating IP',\n\t\t\tdisableMitigation: true,\n\t\t\tdataKeyIcon: 'block',\n\t\t\tdataKeyIconColor: 'ddos-error-500',\n\t\t\ttooltip:\n\t\t\t\t'Mitigation can only start once the IP has been validated. Contact (844) 288-3367 for immediate assistance',\n\t\t};\n\t}\n\n\tif (status.mitigationPending && !status.action) {\n\t\treturn {\n\t\t\tmitigation: 'Mitigation Start Pending',\n\t\t\tdisableMitigation: true,\n\t\t\tdataKeyIcon: 'play_circle',\n\t\t\tdataKeyIconColor: 'ddos-success-500',\n\t\t\ttooltip: 'Mitigation start in progress',\n\t\t};\n\t}\n\n\tif (!status.mitigationPending && !status.action) {\n\t\treturn {\n\t\t\tmitigation: 'Start Mitigation',\n\t\t\tdisableMitigation: false,\n\t\t\tdataKeyIcon: 'play_circle',\n\t\t\tdataKeyIconColor: 'ddos-success-500',\n\t\t\ttooltip: 'Start Mitigation',\n\t\t};\n\t}\n\n\t// If original requesting from Start Mitigation, means the user wanted to start\n\t// mitigation.\n\tif (status.mitigationPending && status.action === 'Start Mitigation') {\n\t\treturn {\n\t\t\tmitigation: 'Mitigation Start Pending',\n\t\t\tdisableMitigation: true,\n\t\t\tdataKeyIcon: 'play_circle',\n\t\t\tdataKeyIconColor: 'ddos-success-500',\n\t\t\ttooltip: 'Mitigation start in progress',\n\t\t};\n\t}\n\n\t// If original requesting from Stop Mitigation, means the user wanted to stop\n\t// mitigation.\n\tif (status.mitigationPending && status.action === 'Stop Mitigation') {\n\t\treturn {\n\t\t\tmitigation: 'Mitigation Stop Pending',\n\t\t\tdisableMitigation: true,\n\t\t\tdataKeyIcon: 'stop_circle',\n\t\t\tdataKeyIconColor: 'ddos-error-500',\n\t\t\ttooltip: 'Mitigation stop in progress',\n\t\t};\n\t}\n\n\tif (!status.mitigationPending && status.action === 'Stop Mitigation') {\n\t\treturn {\n\t\t\tmitigation: 'Stop Mitigation',\n\t\t\tdisableMitigation: false,\n\t\t\tdataKeyIcon: 'stop_circle',\n\t\t\tdataKeyIconColor: 'ddos-error-500',\n\t\t\ttooltip: 'Stop Mitigation',\n\t\t};\n\t}\n\n\treturn {\n\t\tmitigation: 'Start Mitigation',\n\t\tdisableMitigation: false,\n\t\tdataKeyIcon: 'play_circle',\n\t\tdataKeyIconColor: 'ddos-success-500',\n\t\ttooltip: 'Start Mitigation',\n\t};\n};\n\n// ====================================================================================================\n\nexport const getNetworkConnectionDataSource = (\n\tnetworkConnectionKeyObject: NetworkConnectionKeyObject[],\n\tdefaultZoneName: string\n): NetWorkConnectionDataSource[] => {\n\tconst allKeys = [];\n\treturn networkConnectionKeyObject.flatMap((zone) => {\n\t\tconst networkConnectionData = zone.keys\n\t\t\t.filter((zoneKey) => !allKeys.includes(zoneKey))\n\t\t\t.map((key) => {\n\t\t\t\tconst network = zone.objects[key];\n\t\t\t\tallKeys.push(key);\n\t\t\t\treturn {\n\t\t\t\t\tdefaultZoneName: zone.defaultZoneName,\n\t\t\t\t\tnetConnectionID: zone.netConnectionID,\n\t\t\t\t\tnetworkAddress: network.networkAddress,\n\t\t\t\t\tsite: defaultZoneName,\n\t\t\t\t\tregion: zone.siteNameSSPP,\n\t\t\t\t\tmitigationReady: network.mitigationReady,\n\t\t\t\t\tmitigationPending: network.mitigationPending,\n\t\t\t\t\t...getMitigationDisplayData(network),\n\t\t\t\t};\n\t\t\t});\n\t\treturn networkConnectionData;\n\t});\n};\n\nexport const isValidDate = (date: string): boolean => {\n\treturn moment(date).isValid();\n};\n\nexport const getMitigationStatusForNetworkAddress = (mitigation: Mitigation): UpdateIpStatus => {\n\treturn {\n\t\tnetworkAddress: mitigation.networkAddress,\n\t\taction: !isValidDate(mitigation.attackEndDate) ? 'Stop Mitigation' : 'Start Mitigation',\n\t\tmitigationPending: false,\n\t\tmitigationReady: true,\n\t};\n};\n\nexport const createDisplayedColumnsStrings = (pzTableColumn: TableColumn[]): string[] => {\n\treturn pzTableColumn.slice().map((col: { dataKey: string }) => col.dataKey);\n};\n\nexport const groupSamplesByTypeAndUnit = (ratesTotal: TrafficClass[]): DropAndPass => {\n\tconst typeValues: DropAndPass = {\n\t\tdrop: {},\n\t\tpass: {},\n\t};\n\n\tratesTotal.forEach((rate) => {\n\t\tif (rate.type === 'drop' || rate.type === 'pass') {\n\t\t\tconst key = `${rate.type}-${rate.unit}`;\n\t\t\tif (!typeValues[rate.type]?.[`${key}`]) {\n\t\t\t\ttypeValues[rate.type][key] = [];\n\t\t\t}\n\t\t\ttypeValues[rate.type][`${key}`] = rate.samples;\n\t\t}\n\t});\n\n\treturn typeValues;\n};\n\nexport const sortNetworkAddresses = (\n\tmitigations: Pick[]\n): string[] => {\n\treturn [...mitigations]\n\t\t.sort((a, b) => {\n\t\t\tconst aNumber = a.mitigationPending ? 1 : 0;\n\t\t\tconst bNumber = b.mitigationPending ? 1 : 0;\n\t\t\treturn bNumber - aNumber;\n\t\t})\n\t\t.map((i) => i.networkAddress);\n};\n\nexport const calculateOneMinAvg = (duration: number, type: string, unit: string, samples: number[]) => {\n\tif (duration === 60) {\n\t\treturn samples[samples.length - 1];\n\t}\n\treturn samples[samples.length - 1];\n};\n\nexport const calculateFiveMinAvg = (duration: number, type: string, unit: string, samples: number[]) => {\n\tif (duration === 60) {\n\t\tconst fiveMinSamples = samples.slice(Math.max(samples.length - 5, 0));\n\t\treturn fiveMinSamples.reduce((sum, value) => sum + value) / fiveMinSamples.length;\n\t}\n\treturn samples[samples.length - 1];\n};\n\nexport const calculateSummaryAvg = (type: string, unit: string, ratesTotal: TrafficClass[]) => {\n\treturn ratesTotal.find((r) => r.type === type && r.unit === unit)?.average;\n};\n\nexport const calculatePercentDropped = (unit: string, passAvg: number, dropAvg: number) => {\n\tconst total = passAvg + dropAvg;\n\tconst percentDropped = total === 0 ? 0 : (dropAvg / total) * 100;\n\treturn `${percentDropped.toFixed(2)}%`;\n};\n\nexport const calculateTotalAvg = (unit: string, passAvg: number, dropAvg: number) => {\n\treturn passAvg + dropAvg;\n};\n\nexport const formatBytes = (value: number, unit: string) => {\n\tconst units =\n\t\tunit === 'bps' ? ['Bps', 'Kbps', 'Mbps', 'Gbps', 'Tbps', 'Pbps'] : ['pps', 'Kpps', 'Mpps', 'Gpps', 'Tpps', 'Ppps'];\n\n\tlet formattedValue = value;\n\tlet i = 0;\n\n\twhile (formattedValue >= 1024 && i < units.length - 1) {\n\t\tformattedValue /= 1000;\n\t\ti += 1;\n\t}\n\n\treturn `${formattedValue.toFixed(2)} ${units[i]}`;\n};\n\nexport const dropUnitKey = (unit: string) => `drop-${unit}`;\nexport const passUnitKey = (unit: string) => `pass-${unit}`;\nexport const calculateAverages = (\n\tduration: number,\n\tunits: string,\n\tratesTotal: TrafficClass[],\n\ttrafficUtilSummData: TrafficUtilSummFlat\n) => {\n\tconst typeValues: DropAndPass = groupSamplesByTypeAndUnit(ratesTotal);\n\n\tconst unit: string = units === 'bps' || units === 'pps' ? units : 'bps';\n\n\tconst oneMinDropAvg: number = calculateOneMinAvg(duration, 'drop', unit, typeValues.drop[dropUnitKey(unit)]);\n\tconst oneMinPassAvg: number = calculateOneMinAvg(duration, 'pass', unit, typeValues.pass[`pass-${unit}`]);\n\tconst oneMinuteTotalAvg = formatBytes(calculateTotalAvg(unit, oneMinPassAvg, oneMinDropAvg), unit);\n\tconst oneMinPercentDropped: string = calculatePercentDropped(unit, oneMinPassAvg, oneMinDropAvg);\n\tconst fiveMinDropAvg: number = calculateFiveMinAvg(duration, 'drop', unit, typeValues.drop[dropUnitKey(unit)]);\n\tconst fiveMinPassAvg: number = calculateFiveMinAvg(duration, 'pass', unit, typeValues.pass[`pass-${unit}`]);\n\tconst fiveMinuteTotalAvg = formatBytes(calculateTotalAvg(unit, fiveMinPassAvg, fiveMinDropAvg), unit);\n\tconst fiveMinPercentDropped: string = calculatePercentDropped(unit, fiveMinPassAvg, fiveMinDropAvg);\n\tconst summaryDropAvg: number = calculateSummaryAvg('drop', unit, ratesTotal);\n\tconst summaryPassAvg: number = calculateSummaryAvg('pass', unit, ratesTotal);\n\tconst percentDropped: string = calculatePercentDropped(unit, summaryPassAvg, summaryDropAvg);\n\tconst totalAvg = formatBytes(\n\t\tcalculateTotalAvg(\n\t\t\tunit,\n\t\t\tratesTotal.find((rate) => rate.unit === unit && rate.type === 'pass').average,\n\t\t\tratesTotal.find((rate) => rate.unit === unit && rate.type === 'drop').average\n\t\t),\n\t\tunit\n\t);\n\n\treturn [\n\t\t{\n\t\t\ttype: 'drop',\n\t\t\toneMinAvg: formatBytes(oneMinDropAvg, unit),\n\t\t\tfiveMinAvg: formatBytes(fiveMinDropAvg, unit),\n\t\t\tsummaryAvg: formatBytes(summaryDropAvg, unit),\n\t\t\ttotalUtilization: trafficUtilSummData.trafficDropped,\n\t\t},\n\t\t{\n\t\t\ttype: 'pass',\n\t\t\toneMinAvg: formatBytes(oneMinPassAvg, unit),\n\t\t\tfiveMinAvg: formatBytes(fiveMinPassAvg, unit),\n\t\t\tsummaryAvg: formatBytes(summaryPassAvg, unit),\n\t\t\ttotalUtilization: trafficUtilSummData.trafficPassed,\n\t\t},\n\t\t{\n\t\t\ttype: 'total',\n\t\t\toneMinAvg: oneMinuteTotalAvg,\n\t\t\tfiveMinAvg: fiveMinuteTotalAvg,\n\t\t\tsummaryAvg: totalAvg,\n\t\t\ttotalUtilization: trafficUtilSummData.totalTraffic,\n\t\t},\n\t\t{\n\t\t\ttype: 'percent Dropped',\n\t\t\toneMinAvg: oneMinPercentDropped,\n\t\t\tfiveMinAvg: fiveMinPercentDropped,\n\t\t\tsummaryAvg: percentDropped,\n\t\t\ttotalUtilization: trafficUtilSummData.percentageDropped,\n\t\t},\n\t];\n};\n\nexport const doDateRangesOverlap = (dateRange1: string[], dateRange2: string[]) => {\n\tconst start1 = Date.parse(dateRange1[0]);\n\tconst end1 = Date.parse(dateRange1[1]);\n\tconst start2 = Date.parse(dateRange2[0]);\n\tconst end2 = Date.parse(dateRange2[1]);\n\n\treturn start1 <= end2 && end1 >= start2;\n};\n\nexport const convertUtcToEt = (utcDateString: string) => {\n\tconst utcMoment = moment.utc(utcDateString, 'MM/DD/YYYY HH:mm:ss');\n\tconst etMoment = utcMoment.tz('America/New_York');\n\treturn new Date(etMoment.format('MM/DD/YYYY HH:mm:ss'));\n};\n\nexport const getUniqueItems = (sortedItems: Mitigation[], mitigationStartRange: string): Mitigation[] => {\n\tlet previousEndDate = '';\n\tconst uniqueItems: Mitigation[] = [];\n\tsortedItems.forEach((item) => {\n\t\tif (!uniqueItems.length) {\n\t\t\t// Item is starting after completion of other items in the uniqueItems list, hence add it straight away\n\t\t\tuniqueItems.push(item);\n\t\t\tpreviousEndDate = item.attackEndDate;\n\t\t} else {\n\t\t\tconst newItem: Mitigation = { ...item };\n\t\t\tif (new Date(previousEndDate) > new Date(newItem.attackStartDate)) {\n\t\t\t\tnewItem.attackStartDate = previousEndDate;\n\t\t\t}\n\t\t\tnewItem.attackStartDate =\n\t\t\t\tnew Date(newItem.attackStartDate) > new Date(mitigationStartRange)\n\t\t\t\t\t? newItem.attackStartDate\n\t\t\t\t\t: mitigationStartRange;\n\t\t\t// Add the new item to uniqueItems\n\t\t\tuniqueItems.push(newItem);\n\t\t\tif (new Date(newItem.attackEndDate) > new Date(previousEndDate)) {\n\t\t\t\tpreviousEndDate = item.attackEndDate;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn uniqueItems;\n};\n\nexport const calculateTotalMitigationHours = (\n\tlist: Mitigation[],\n\tmitigationStartRange: string,\n\tmitigationEndRange: string\n): number => {\n\tlet totalHours = 0;\n\n\t// Sort the list by start date ascending and end date descending\n\tconst sortedItems = [...list].sort((a, b) => {\n\t\treturn (\n\t\t\tnew Date(a.attackStartDate).getTime() - new Date(b.attackStartDate).getTime() ||\n\t\t\tnew Date(b.attackEndDate).getTime() - new Date(a.attackEndDate).getTime()\n\t\t);\n\t});\n\n\t// Get unique items to avoid double counting of overlapping items\n\tconst uniqueItems: Mitigation[] = getUniqueItems(sortedItems, mitigationStartRange);\n\n\t// Calculate the total hours based on the uniqueItems array\n\tuniqueItems.forEach((item) => {\n\t\ttry {\n\t\t\tconst endOfDay: number = moment.utc(mitigationEndRange).add(1, 'day').valueOf();\n\t\t\tlet endDate: number;\n\n\t\t\t// Check if the item has an attack end date and if it's after the end of the day\n\t\t\tif (!item.attackEndDate) {\n\t\t\t\tendDate = endOfDay;\n\t\t\t} else if (moment.utc(item.attackEndDate).isAfter(moment.utc(endOfDay).valueOf())) {\n\t\t\t\t// If the attack end date is after the end of the day, set it to the end of the day\n\t\t\t\tendDate = endOfDay;\n\t\t\t} else {\n\t\t\t\t// Otherwise, use the attack end date as is\n\t\t\t\tendDate = moment.utc(item.attackEndDate).valueOf();\n\t\t\t}\n\n\t\t\tlet startDate: number = null;\n\t\t\tif (moment.utc(item.attackStartDate).isAfter(moment.utc(mitigationStartRange))) {\n\t\t\t\tstartDate = moment.utc(item.attackStartDate).valueOf();\n\t\t\t} else {\n\t\t\t\tstartDate = moment.utc(mitigationStartRange).valueOf();\n\t\t\t}\n\n\t\t\t// Calculate the time difference between the start and end dates in milliseconds\n\t\t\tconst ts: number = endDate - startDate;\n\n\t\t\t// Convert the time difference to hours\n\t\t\tconst hours = ts / (1000 * 60 * 60);\n\t\t\tif (hours > 0) {\n\t\t\t\ttotalHours += hours;\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-empty\n\t\t} catch (_) {}\n\t});\n\n\t// Truncate total hours to one decimal point and return the result\n\treturn Math.floor(totalHours);\n};\n\nexport const getMitigationSummary = (mitigationRates: MitigationRate, mitigation?: Mitigation): MitigationSummary => {\n\tconst { startTime, endTime, mitigationID, alertID } = mitigationRates;\n\tconst formatTimeStamp = (timestamp: string) => moment.utc(timestamp).format('MMM DD HH:mm');\n\tconst status = endTime\n\t\t? `${formatTimeStamp(startTime)} - ${formatTimeStamp(endTime)}`\n\t\t: `${formatTimeStamp(startTime)}`;\n\n\treturn {\n\t\talertID,\n\t\tmitigationID,\n\t\tmode: endTime ? 'Inactive' : 'Active',\n\t\tstatus,\n\t\tprotectionPrefixes: mitigation?.ipDiverisonData,\n\t\tmanagedObject: mitigation?.zoneName,\n\t};\n};\n\nexport const formatMitigationDuration = (mitigationDuration: string): string => {\n\tlet resultDuration = '';\n\tconst durationArr: string[] = mitigationDuration?.split(':');\n\tif (durationArr?.length < 3) {\n\t\tresultDuration = mitigationDuration;\n\t} else {\n\t\tconst duration: moment.Duration = moment.duration(durationArr[0], 'd');\n\t\tduration.add(durationArr[1], 'h');\n\t\tduration.add(durationArr[2], 'm');\n\t\tduration.add(durationArr[3], 's');\n\t\tresultDuration = duration.days() > 0 ? `${duration.days()}d, ` : '';\n\t\tresultDuration = `${resultDuration}${durationArr[1]}:${durationArr[2]}:${durationArr[3]}`;\n\t}\n\treturn resultDuration;\n};\n\nexport const getMitigationDataSource = (mitigation: Mitigation): MitigationDataSource => {\n\treturn {\n\t\tname: mitigation.mitigationName,\n\t\tportPrefixes: mitigation.ipDiverisonData,\n\t\tduration: formatMitigationDuration(mitigation.duration),\n\t\tattackStartDate: mitigation.attackStartDate,\n\t\tattackEndDate: mitigation.attackEndDate,\n\t\tstartTime: moment.utc(mitigation.attackStartDate).format(dateFormat(mitigation.attackStartDate)),\n\t\tendTime: mitigation.attackEndDate\n\t\t\t? moment.utc(mitigation.attackEndDate).format(dateFormat(mitigation.attackEndDate))\n\t\t\t: 'In Progress',\n\t\tuser: mitigation.cspUserIdStart,\n\t\ttype: mitigation.isMitigationPim ? `Auto ${mitigation.mitigationName}` : mitigation.mitigationName,\n\t\thighlightRow: !mitigation.attackEndDate && 'endTime',\n\t\tlink: `/traffic/${AppLayoutRouting.MITIGATION_DETAILS}/${mitigation.mitigationName}`,\n\t\tqueryParams: {\n\t\t\tstartTime: mitigation.attackStartDate,\n\t\t\tendTime: mitigation.attackEndDate,\n\t\t\tname: mitigation.mitigationName,\n\t\t},\n\t};\n};\n\n// build the order map data from the response.\nexport const getNetworkConnectionKeyObjects = (\n\tresponse: ApiResponse\n): NetworkConnectionKeyObject[] => {\n\treturn [...(response.dataObject.networkConnectionList ?? [])].map((zone) => {\n\t\tconst { netAddressDetailList, ...remain } = zone;\n\t\treturn {\n\t\t\t...remain,\n\t\t\t...toKeyObject(netAddressDetailList, 'networkAddress'),\n\t\t};\n\t});\n};\n\nconst getCMOKeyObjects = (response: ApiResponse, isPim: boolean): CMOKeyObject[] => {\n\treturn [...(response.dataObject.cmoList ?? [])]\n\t\t.filter((cmo) => cmo.pimIndicator === isPim)\n\t\t.map((pim) => {\n\t\t\treturn {\n\t\t\t\tcmoName: pim.cmoName,\n\t\t\t\t...toKeyObject(pim.cmoIpList, 'cmoIp'),\n\t\t\t};\n\t\t});\n};\n\nexport const getNonPIMCOMKeyObjects = (response: ApiResponse): CMOKeyObject[] => {\n\treturn getCMOKeyObjects(response, false);\n};\n\nexport const getPIMCOMKeyObjects = (response: ApiResponse): CMOKeyObject[] => {\n\treturn getCMOKeyObjects(response, true);\n};\n\nexport const getMitigations = (response: ApiResponse): Mitigation[] => {\n\treturn [...(response.dataObject?.mitigationList ?? [])];\n};\n\nexport const getMitigationKeyObject = (response: ApiResponse): MitigationKeyObject => {\n\tconst mitigationsWithId = response.dataObject?.mitigationList.map((mitigation, index) => ({\n\t\t...mitigation,\n\t\tid: `${index}`,\n\t}));\n\treturn toKeyObject(mitigationsWithId, 'id');\n};\n\nexport const getUpdateNetworkConnections = (zone: NetworkConnectionKeyObject): UpdateNetworkConnections => {\n\tconst { objects, snapshotKeys } = zone;\n\tconst updateReq: UpdateNetworkConnections = {\n\t\tnetConnectionID: zone.netConnectionID,\n\t\tserviceType: zone.serviceType,\n\t\tdefaultZoneName: zone.defaultZoneName,\n\t\tsiteID: zone.siteID,\n\t\tsiteNameSSPP: zone.siteNameSSPP,\n\t\tcompanyID: zone.companyID,\n\t\tcompanyName: zone.companyName,\n\t\tcircuitTier: zone.circuitTier,\n\t\tnetAddressDetailList: snapshotKeys\n\t\t\t.map((k) => objects[k])\n\t\t\t.map((n) => ({\n\t\t\t\tnetworkAddress: n.networkAddress,\n\t\t\t\tarecordAssignmentIP: n.arecordAssignmentIP,\n\t\t\t\tipType: n.ipType,\n\t\t\t\tname: n.name,\n\t\t\t\tmitigationPending: n.mitigationPending,\n\t\t\t\tmitigationReady: n.mitigationReady,\n\t\t\t})),\n\t};\n\n\treturn updateReq;\n};\n\nexport const getMitigationRate = (response: ApiResponse): MitigationRate => {\n\treturn assertValue(response.dataObject);\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport * as URLS from '@src/app/stores/api.urls';\nimport {\n\tBehaviorSubject,\n\tcatchError,\n\tcombineLatest,\n\tfilter,\n\tinterval,\n\tmergeMap,\n\tObservable,\n\tof,\n\tstartWith,\n\tSubscription,\n\ttap,\n\tthrowError,\n} from 'rxjs';\nimport moment from 'moment';\nimport 'moment-timezone';\nimport { SessionStore } from '@src/app/stores/session/session.store';\nimport { assertValue } from '@src/app/utils/assert';\nimport {\n\tApiResponse,\n\tCompanyOfferType,\n\tPrimitiveValue,\n\tReturnCode,\n\tServiceType,\n\tupdateDelay,\n} from '@src/app/stores/common.model';\nimport { OrUndefineable, Undefineable } from '@src/types/types.utils';\nimport { cloneKeyObject } from '@src/app/utils/key-object';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { SnackbarComponent, snackBarDuration, SNACKBAR_TYPE } from '@app/components/shared/snackbar/snackbar.component';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport {\n\tConfirmDialogService,\n\tDDOS_CONFIRM_DIALOG_NO_DATA,\n} from '@app/components/shared/services/dialog/confirm-dialog.service';\nimport { Location } from '@angular/common';\nimport { RequestDetails } from '@app/stores/admin/admin.model';\nimport { REQUEST_ID } from '@src/app/stores/api.urls';\nimport { AFTER_VALUE, BEFORE_VALUE } from '../../alert/alert.model';\nimport { addPropertiesToEachObject, isSucceededResponse } from '../../common.utils';\nimport {\n\tUpdateIpStatus,\n\tNetworkConnectionKeyObject,\n\tMitigationQueryParams,\n\tAddNetworkConnection,\n\tBulkUpdateNetworkConnection,\n\tMitigationRate,\n\tUpdateNetworkConnection,\n\tDeleteNetworkConnection,\n\tUpdateNetworkConnections,\n\tAddNewNetworkConnection,\n\tMitigation,\n\tMitigationKeyObject,\n\tMitigationRateKeyObject,\n\tMitigationCollection,\n\tActionResult,\n\tMitigationActionRequest,\n\tStartMitigationRequest,\n\tStopMitigationRequest,\n\tNetworkConnectionCollection,\n\tMitigationSearchQuery,\n\tCMOKeyObject,\n} from './mitigation.model';\nimport {\n\tgetMitigationStatusForNetworkAddress,\n\tgetMitigationKeyObject,\n\tgetUpdateNetworkConnections,\n\tgetNetworkConnectionKeyObjects,\n\tgetMitigationRate,\n\tgetNonPIMCOMKeyObjects,\n\tgetPIMCOMKeyObjects,\n} from './mitigation.converter';\n\nexport const REACTIVE_USERS_IP_LIMIT = 10;\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class MitigationStore {\n\t// keyed by mitigation name.\n\tprivate readonly mitigationKeyObjectSub = new BehaviorSubject(undefined);\n\n\t// keyed by mitigation rate name.\n\tprivate readonly mitigationRateKeyObjectSub = new BehaviorSubject(undefined);\n\n\t// Used to apply filters once everytime it updates the mitigations\n\tprivate readonly mitigationsUpdateEvent = new BehaviorSubject>(undefined);\n\n\t// each of NetworkConnectionKeyObject keyed by network address.\n\tprivate readonly _networkConnectionKeyObjectsSub = new BehaviorSubject>(\n\t\tundefined\n\t);\n\n\tprivate readonly syncedStatusNetworkConnectionKeyObjectsSub = new BehaviorSubject<\n\t\tOrUndefineable\n\t>(undefined);\n\n\t// each of PimCMOKeyObject was keyed by network address(pimCMOIp)\n\tprivate readonly pimCMOKeyObjectsSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly cmoKeyObjectsSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly ongoingMitigationsSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly canAddIpNetworkConnectionSub = new BehaviorSubject(false);\n\n\tintervalMitigationSub: Subscription;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate sessionStore: SessionStore,\n\t\tprivate snackbar: MatSnackBar,\n\t\tprivate dialogService: ConfirmDialogService,\n\t\tprivate location: Location\n\t) {\n\t\tcombineLatest([this.ongoingMitigations$, this._networkConnectionKeyObjects$])\n\t\t\t.pipe(filter((res) => !!res[0] && !!res[1]))\n\t\t\t.subscribe(([ongoingMitigations, networks]) => {\n\t\t\t\tif (ongoingMitigations && networks) {\n\t\t\t\t\tthis.syncOngoingMitigationNetworkConnectionsStatus(ongoingMitigations);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tget mitigationKeyObject$() {\n\t\treturn this.mitigationKeyObjectSub.asObservable();\n\t}\n\n\tget mitigationKeyObject() {\n\t\treturn this.mitigationKeyObjectSub.value;\n\t}\n\n\tget mitigationRateKeyObject$() {\n\t\treturn this.mitigationRateKeyObjectSub.asObservable();\n\t}\n\n\tget mitigationRateKeyObject() {\n\t\treturn this.mitigationRateKeyObjectSub.value;\n\t}\n\n\tget mitigationsUpdateEvent$() {\n\t\treturn this.mitigationsUpdateEvent.asObservable();\n\t}\n\n\tget syncedStatusNetworkConnectionKeyObjects$() {\n\t\treturn this.syncedStatusNetworkConnectionKeyObjectsSub.asObservable();\n\t}\n\n\tget syncedStatusNetworkConnectionKeyObjects() {\n\t\treturn this.syncedStatusNetworkConnectionKeyObjectsSub.value;\n\t}\n\n\tprivate get _networkConnectionKeyObjects$() {\n\t\treturn this._networkConnectionKeyObjectsSub.asObservable();\n\t}\n\n\tprivate get _networkConnectionKeyObjects() {\n\t\treturn this._networkConnectionKeyObjectsSub.value;\n\t}\n\n\tget pimCMOKeyObjects$() {\n\t\treturn this.pimCMOKeyObjectsSub.asObservable();\n\t}\n\n\tget pimCMOKeyObjects() {\n\t\treturn this.pimCMOKeyObjectsSub.value;\n\t}\n\n\tget cmoKeyObjects$() {\n\t\treturn this.cmoKeyObjectsSub.asObservable();\n\t}\n\n\tget cmoKeyObjects() {\n\t\treturn this.cmoKeyObjectsSub.value;\n\t}\n\n\tget ongoingMitigations$() {\n\t\treturn this.ongoingMitigationsSub.asObservable();\n\t}\n\n\tget ongoingMitigations() {\n\t\treturn this.ongoingMitigationsSub.value;\n\t}\n\n\tget canAddIpNetworkConnection$() {\n\t\treturn this.canAddIpNetworkConnectionSub.asObservable();\n\t}\n\n\tget canAddIpNetworkConnection() {\n\t\treturn this.canAddIpNetworkConnectionSub.value;\n\t}\n\n\tgetMitigations(refresh = true) {\n\t\tif (refresh || !this.mitigationKeyObject?.keys.length) {\n\t\t\tconst getMitigationReportUrl = URLS.getApiUrl(\n\t\t\t\tURLS.MITIGATION_REPORT,\n\t\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t\t);\n\n\t\t\t// notify subscribers that it is reloading.\n\t\t\tthis.mitigationKeyObjectSub.next(undefined);\n\t\t\tconst request = this.http.get>(getMitigationReportUrl).pipe(\n\t\t\t\tcatchError((e: Error) => {\n\t\t\t\t\t// to complete the global gets.\n\t\t\t\t\tthis.mitigationKeyObjectSub.next(undefined);\n\t\t\t\t\treturn throwError(() => e);\n\t\t\t\t}),\n\t\t\t\ttap((response) => {\n\t\t\t\t\tif (isSucceededResponse(response)) {\n\t\t\t\t\t\tconst mitigationKeyObject: MitigationKeyObject = getMitigationKeyObject(response);\n\t\t\t\t\t\t// The use of addPropertiesToEachElement is emulating the addition of region and site properties, in the future this func is not needed\n\t\t\t\t\t\tmitigationKeyObject.objects = addPropertiesToEachObject(mitigationKeyObject.objects, {\n\t\t\t\t\t\t\tregion: this.sessionStore.currentCompanyDetail.region,\n\t\t\t\t\t\t\tsite: this.sessionStore.currentCompanySite,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.mitigationKeyObjectSub.next(mitigationKeyObject);\n\t\t\t\t\t\tthis.mitigationsUpdateEvent.next(true);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tif (this.intervalMitigationSub) {\n\t\t\t\tthis.intervalMitigationSub.unsubscribe();\n\t\t\t}\n\t\t\tthis.intervalMitigationSub = interval(updateDelay)\n\t\t\t\t.pipe(\n\t\t\t\t\tstartWith(0),\n\t\t\t\t\tmergeMap(() => request)\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\t\t}\n\t}\n\n\tgetMitigationByPeriod(startTime: string, endTime: string): Mitigation[] {\n\t\tconst utcStartTime = moment.utc(startTime).format('MM/DD/YYYY');\n\t\tconst utcEndTime = moment.utc(endTime).format('MM/DD/YYYY');\n\t\treturn this.getKeysInTimeRangeForMitigations(utcStartTime, utcEndTime);\n\t}\n\n\tprivate getKeysInTimeRangeForMitigations(startTime: string, endTime: string): Mitigation[] {\n\t\treturn this.mitigationKeyObject.keys\n\t\t\t.map((k) => this.mitigationKeyObject.objects[k])\n\t\t\t.filter((mitigation) => {\n\t\t\t\treturn (\n\t\t\t\t\t(mitigation.attackStartDate &&\n\t\t\t\t\t\tmoment\n\t\t\t\t\t\t\t.utc(mitigation.attackStartDate)\n\t\t\t\t\t\t\t.isBetween(moment.utc(startTime), moment.utc(endTime).add(1, 'day'))) ||\n\t\t\t\t\t(mitigation.attackEndDate &&\n\t\t\t\t\t\tmoment.utc(mitigation.attackEndDate).isBetween(moment.utc(startTime), moment.utc(endTime).add(1, 'day')))\n\t\t\t\t);\n\t\t\t});\n\t}\n\n\tgetMitigationRate(params: MitigationQueryParams, refresh = true) {\n\t\tif (refresh || !this.mitigationRateKeyObject.objects[params.name]) {\n\t\t\tconst startDate = moment.utc(params.startTime).format();\n\t\t\tconst endDate = params.endTime && moment(params.endTime).isValid() ? moment.utc(params.endTime).format() : '';\n\n\t\t\tconst getMitigationDetailReportUrl = URLS.getApiUrl(\n\t\t\t\tURLS.MITIGATION_SUMMARY_REPORT,\n\t\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t\t)\n\t\t\t\t.replace('{startTime}', `startTime=${encodeURIComponent(startDate)}`)\n\t\t\t\t.replace('{endTime}', `endTime=${encodeURIComponent(endDate)}`)\n\t\t\t\t.replace('{mitigationName}', `mitigationName=${params.name}`);\n\n\t\t\tthis.http\n\t\t\t\t.get>(getMitigationDetailReportUrl)\n\t\t\t\t.pipe(\n\t\t\t\t\ttap((response) => {\n\t\t\t\t\t\tif (response.dataObject) {\n\t\t\t\t\t\t\tconst mitigationRate = getMitigationRate(response);\n\t\t\t\t\t\t\tthis.mitigationRateKeyObjectSub.next({\n\t\t\t\t\t\t\t\t...(this.mitigationRateKeyObject ?? undefined),\n\t\t\t\t\t\t\t\tobjects: {\n\t\t\t\t\t\t\t\t\t...this.mitigationRateKeyObject?.objects,\n\t\t\t\t\t\t\t\t\t[`${params.name}`]: mitigationRate,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.mitigationRateKeyObjectSub.next({\n\t\t\t\t\t\t\t\tobjects: {},\n\t\t\t\t\t\t\t\tkeys: [],\n\t\t\t\t\t\t\t\tsnapshotKeys: [],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tcatchError((err: HttpErrorResponse) => {\n\t\t\t\t\t\tif (err.status === 404) {\n\t\t\t\t\t\t\tconst dialog = this.dialogService.openConfirmDialog(DDOS_CONFIRM_DIALOG_NO_DATA);\n\t\t\t\t\t\t\tdialog.afterClosed().subscribe((goBack) => {\n\t\t\t\t\t\t\t\tif (goBack) {\n\t\t\t\t\t\t\t\t\tthis.location.back();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn throwError(() => err);\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\t\t}\n\t}\n\n\tgetOngoingMitigations() {\n\t\tconst checkOngoingMitigationsUrl = URLS.getApiUrl(\n\t\t\tURLS.ONGOING_MITIGATION_REPORT,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t);\n\n\t\tthis.ongoingMitigationsSub.next(undefined);\n\t\tthis.http\n\t\t\t.get>(checkOngoingMitigationsUrl)\n\t\t\t.pipe(\n\t\t\t\ttap((response) => {\n\t\t\t\t\tif (isSucceededResponse(response)) {\n\t\t\t\t\t\tconst updatedIps = response.dataObject.mitigationList.map((mitigation) =>\n\t\t\t\t\t\t\tgetMitigationStatusForNetworkAddress(mitigation)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.ongoingMitigationsSub.next(updatedIps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.ongoingMitigationsSub.next([]);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tcatchError((_) => {\n\t\t\t\t\tthis.ongoingMitigationsSub.next([]);\n\t\t\t\t\treturn of(null);\n\t\t\t\t})\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\tgetSyncedMitigationStatus() {\n\t\tthis.getNetworkConnections();\n\t\tthis.getOngoingMitigations();\n\t}\n\n\tprivate requestMitigationAction(request: MitigationActionRequest) {\n\t\tconst mitigationActionUrl = URLS.getApiUrl(\n\t\t\tURLS.MITIGATION_BY_ACTION,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t);\n\n\t\treturn this.http.post>(mitigationActionUrl, request).pipe(\n\t\t\ttap((response) => {\n\t\t\t\tif (isSucceededResponse(response)) {\n\t\t\t\t\tconst ongoingMitigations: UpdateIpStatus[] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnetworkAddress: request.ipAddressList[0].ipAddress,\n\t\t\t\t\t\t\tmitigationPending: true,\n\t\t\t\t\t\t\tmitigationReady: true,\n\t\t\t\t\t\t\taction: request.action === 'start' ? 'Start Mitigation' : 'Stop Mitigation',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t\tthis.syncOngoingMitigationNetworkConnectionsStatus(ongoingMitigations);\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate syncOngoingMitigationNetworkConnectionsStatus(updateIpsStatus: UpdateIpStatus[]) {\n\t\tupdateIpsStatus.forEach((updatedIp) => {\n\t\t\tconst { networkAddress, ...status } = updatedIp;\n\t\t\tconst found = this.findNetworkConnectionByAddress(networkAddress);\n\t\t\tif (found) {\n\t\t\t\tfound.objects[networkAddress] = {\n\t\t\t\t\t...found.objects[networkAddress],\n\t\t\t\t\t...status,\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\tconst cloned = [...this._networkConnectionKeyObjects];\n\t\tthis.syncedStatusNetworkConnectionKeyObjectsSub.next(cloned);\n\t}\n\n\tstart(request: StartMitigationRequest) {\n\t\treturn this.requestMitigationAction(request);\n\t}\n\n\tstop(request: StopMitigationRequest) {\n\t\treturn this.requestMitigationAction(request);\n\t}\n\n\tgetNetworkConnections(refresh = true) {\n\t\tif (refresh || !this.syncedStatusNetworkConnectionKeyObjects) {\n\t\t\tconst getNetworkConnectionsUrl = URLS.getApiUrl(\n\t\t\t\tURLS.GET_NETWORK_CONNECTIONS,\n\t\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t\t);\n\n\t\t\tthis._networkConnectionKeyObjectsSub.next(undefined);\n\t\t\tthis.http\n\t\t\t\t.get>(getNetworkConnectionsUrl)\n\t\t\t\t.pipe(\n\t\t\t\t\ttap((response) => {\n\t\t\t\t\t\tif (isSucceededResponse(response)) {\n\t\t\t\t\t\t\tconst networkConnectionKeyObjects = getNetworkConnectionKeyObjects(response);\n\t\t\t\t\t\t\tconst pimCMOKeyObjects: CMOKeyObject[] = getPIMCOMKeyObjects(response);\n\t\t\t\t\t\t\tconst cmoKeyObjects: CMOKeyObject[] = getNonPIMCOMKeyObjects(response);\n\t\t\t\t\t\t\tthis.pimCMOKeyObjectsSub.next(pimCMOKeyObjects);\n\t\t\t\t\t\t\tthis.cmoKeyObjectsSub.next(cmoKeyObjects);\n\t\t\t\t\t\t\tthis._networkConnectionKeyObjectsSub.next(networkConnectionKeyObjects);\n\t\t\t\t\t\t\tthis.canAddIpNetworkConnectionSub.next(this.checkEnableCanAddIpZone());\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._networkConnectionKeyObjectsSub.next([]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tcatchError((err: HttpErrorResponse) => {\n\t\t\t\t\t\tthis._networkConnectionKeyObjectsSub.next([]);\n\t\t\t\t\t\treturn throwError(() => err);\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\t\t}\n\t}\n\n\taddNewNetworkConnection(request: AddNewNetworkConnection): Observable> {\n\t\tconst networkConnection = this.syncedStatusNetworkConnectionKeyObjects.find(\n\t\t\t(n) => n.serviceType === ServiceType.RL\n\t\t);\n\t\tassertValue(networkConnection, 'This user cannot get to this feature');\n\t\tconst addNetworkConnection: AddNetworkConnection = {\n\t\t\tcompanyID: this.sessionStore.currentCompanyDetail.companyID,\n\t\t\tcompanyName: this.sessionStore.currentCompanyDetail.companyName,\n\t\t\tdefaultZoneName: this.sessionStore.currentCompanyDetail.defaultZoneName,\n\t\t\tcircuitTier: networkConnection.circuitTier,\n\t\t\twanIPAddress: networkConnection.wanIPAddress,\n\t\t\tserviceType: networkConnection.serviceType,\n\t\t\tsiteNameSSPP: networkConnection.siteNameSSPP,\n\t\t\tsiteID: request.siteID,\n\t\t\tnetAddressDetailList: [\n\t\t\t\t{\n\t\t\t\t\tnetworkAddress: assertValue(request.networkAddress),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\tconst addNetworkConnectionUrl = URLS.getApiUrl(\n\t\t\tURLS.ADD_NETWORK_CONNECTIONS,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t);\n\t\treturn this.http.post>(addNetworkConnectionUrl, addNetworkConnection);\n\t}\n\n\taddNetworkAddressToExistingNetworkConnection(request: AddNewNetworkConnection) {\n\t\tconst networkConnection = this.syncedStatusNetworkConnectionKeyObjects.find(\n\t\t\t(n) => n.serviceType === ServiceType.RL\n\t\t);\n\t\tconst newAddress = assertValue(request.networkAddress);\n\t\t// Allow reactive user to add to the existing.\n\t\t// Skip if the network address is already in the list.\n\t\t// Skip if the number of network address is smaller than 10.\n\t\tif (\n\t\t\tnetworkConnection &&\n\t\t\t!networkConnection.objects[newAddress] &&\n\t\t\tnetworkConnection.keys.length < REACTIVE_USERS_IP_LIMIT\n\t\t) {\n\t\t\tconst cloned = cloneKeyObject(networkConnection);\n\t\t\tconst updateReq = getUpdateNetworkConnections(cloned as NetworkConnectionKeyObject);\n\t\t\tupdateReq.netAddressDetailList.push({\n\t\t\t\tnetworkAddress: newAddress,\n\t\t\t\tipType: '',\n\t\t\t\tmitigationPending: false,\n\t\t\t\tmitigationReady: false,\n\t\t\t\tname: '',\n\t\t\t\tarecordAssignmentIP: newAddress,\n\t\t\t});\n\n\t\t\treturn this.updateNetworkConnections([updateReq]);\n\t\t}\n\n\t\tconst response: ApiResponse = {\n\t\t\treturnCode: ReturnCode.ERROR,\n\t\t\treturnDescription: `This network address (${newAddress}) already exists in the network with id(${networkConnection.netConnectionID})`,\n\t\t\tserviceName: '',\n\t\t};\n\t\treturn of(response);\n\t}\n\n\tdeleteNetworkConnection(request: DeleteNetworkConnection): Observable> {\n\t\tconst networkConnection = this.findNetworkConnectionByAddress(request.networkAddress);\n\t\tif (!networkConnection) {\n\t\t\tconst response: ApiResponse = {\n\t\t\t\treturnCode: ReturnCode.NOT_FOUND,\n\t\t\t\treturnDescription: `Cannot find the ip: ${request.networkAddress} on the network id ${request.netConnectionID}`,\n\t\t\t\tserviceName: '',\n\t\t\t};\n\t\t\treturn of(response);\n\t\t}\n\n\t\tconst { snapshotKeys } = networkConnection;\n\t\tconst removedKeys = snapshotKeys.filter((address) => request.networkAddress !== address);\n\n\t\t// remove the matched network address.\n\t\tconst updateReq = getUpdateNetworkConnections({\n\t\t\t...networkConnection,\n\t\t\tsnapshotKeys: removedKeys,\n\t\t});\n\t\treturn this.updateNetworkConnections([updateReq]);\n\t}\n\n\tupdateNetworkConnection(request: UpdateNetworkConnection): Observable> {\n\t\tconst networkConnection: Undefineable = this.findNetworkConnectionByAddress(\n\t\t\trequest.networkAddress\n\t\t);\n\t\tif (!networkConnection?.objects[request.networkAddress]) {\n\t\t\tconst response: ApiResponse = {\n\t\t\t\treturnCode: ReturnCode.NOT_FOUND,\n\t\t\t\treturnDescription: `Cannot find the ip: ${request.networkAddress} on the network id ${request.netConnectionID}`,\n\t\t\t\tserviceName: '',\n\t\t\t};\n\t\t\treturn of(response);\n\t\t}\n\n\t\t// replace the matched address with the new address.\n\t\tnetworkConnection.objects[request.networkAddress] = {\n\t\t\t...networkConnection.objects[request.networkAddress],\n\t\t\tnetworkAddress: request.updateNetworkAddress,\n\t\t};\n\t\tconst updateReq = getUpdateNetworkConnections(networkConnection);\n\t\treturn this.updateNetworkConnections([updateReq]);\n\t}\n\n\tupdateNetworkConnections(\n\t\tupdateNetworkConnections: UpdateNetworkConnections[]\n\t): Observable> {\n\t\tconst bulkUpdateNetworkConnectionUrl = URLS.getApiUrl(\n\t\t\tURLS.BULK_UPDATE_NETWORK_CONNECTIONS,\n\t\t\tassertValue(this.sessionStore.currentCompany.companyID)\n\t\t);\n\n\t\tconst bulkUpdateConnectionsReq: BulkUpdateNetworkConnection = {\n\t\t\tnetworkConnectionList: updateNetworkConnections,\n\t\t};\n\t\treturn this.http.put>(bulkUpdateNetworkConnectionUrl, bulkUpdateConnectionsReq);\n\t}\n\n\tfindNetworkConnectionByAddress(networkAddress: string): OrUndefineable {\n\t\treturn this._networkConnectionKeyObjects.find((zone) => zone.objects[networkAddress]);\n\t}\n\n\tprivate checkEnableCanAddIpZone = () => {\n\t\tif (this.sessionStore.currentCompanyDetail.OfferType === CompanyOfferType.NON_REACTIVE) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn (\n\t\t\tthis.syncedStatusNetworkConnectionKeyObjects\n\t\t\t\t?.filter((c) => c.serviceType === ServiceType.RL)\n\t\t\t\t.filter((d) => d.keys.length < REACTIVE_USERS_IP_LIMIT).length > 0\n\t\t);\n\t};\n\n\tprivate createWarningActionResponse(description: string): ApiResponse {\n\t\tconst response: ApiResponse = {\n\t\t\treturnCode: ReturnCode.NOT_FOUND,\n\t\t\treturnDescription: description,\n\t\t\tserviceName: '',\n\t\t};\n\n\t\treturn response;\n\t}\n\n\tresetMitigationSnapshot() {\n\t\tthis.mitigationKeyObjectSub.next({\n\t\t\t...this.mitigationKeyObject,\n\t\t\tsnapshotKeys: [...this.mitigationKeyObject.keys],\n\t\t});\n\t}\n\n\tfilterMitigation(filterQuery: MitigationSearchQuery) {\n\t\tif (!this.mitigationKeyObject) {\n\t\t\treturn;\n\t\t}\n\t\tlet snapshotKeys: string[] = [...this.mitigationKeyObject.keys];\n\t\tsnapshotKeys = this.filterOnStatus(filterQuery, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnBeforeOrAfterStartAndEndTime(filterQuery, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnIpVersion(filterQuery, snapshotKeys);\n\t\tsnapshotKeys = this.filterOnType(filterQuery, snapshotKeys);\n\n\t\tthis.mitigationKeyObjectSub.next({\n\t\t\t...this.mitigationKeyObject,\n\t\t\tsnapshotKeys,\n\t\t});\n\t}\n\n\tprivate filterOnIpVersion(filterQuery: MitigationSearchQuery, keys: string[]) {\n\t\tconst filterIpv4 = filterQuery.ipv4.value;\n\t\tconst filterIpv6 = filterQuery.ipv6.value;\n\t\tconst { objects } = this.mitigationKeyObject;\n\t\tlet currentSnapshotKeys = [...keys];\n\n\t\tif (!filterIpv4 && filterIpv6) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => objects[k].networkAddress.includes(':'));\n\t\t} else if (filterIpv4 && !filterIpv6) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => !objects[k].networkAddress.includes(':'));\n\t\t}\n\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprotected convertToBooleanInput(value: PrimitiveValue): BooleanInput {\n\t\treturn value as BooleanInput;\n\t}\n\n\tprivate filterOnType(filterQuery: MitigationSearchQuery, keys: string[]) {\n\t\tconst filterFlowspec = filterQuery.flowspec.value;\n\t\tconst filterNotFlowspec = filterQuery.notFlowspec.value;\n\t\tconst { objects } = this.mitigationKeyObject;\n\t\tlet currentSnapshotKeys = [...keys];\n\n\t\tif (!filterFlowspec && filterNotFlowspec) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => !objects[k].flowspec);\n\t\t} else if (filterFlowspec && !filterNotFlowspec) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => objects[k].flowspec);\n\t\t}\n\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnStatus(filterQuery: MitigationSearchQuery, keys: string[]) {\n\t\tconst onGoing = filterQuery.onGoing.value;\n\t\tconst recent = filterQuery.recent.value;\n\t\tconst { objects } = this.mitigationKeyObject;\n\t\tlet currentSnapshotKeys = [...keys];\n\t\tif (onGoing && !recent) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => !objects[k].attackEndDate);\n\t\t}\n\n\t\tif (!onGoing && recent) {\n\t\t\tcurrentSnapshotKeys = currentSnapshotKeys.filter((k) => !!objects[k].attackEndDate);\n\t\t}\n\t\treturn currentSnapshotKeys;\n\t}\n\n\tprivate filterOnBeforeOrAfterStartAndEndTime(filterQuery: MitigationSearchQuery, keys: string[]) {\n\t\tconst filterStartBeforeOrAfter = filterQuery.startBeforeOrAfter.value;\n\t\tconst filterEndBeforeOrAfter = filterQuery.endBeforeOrAfter.value;\n\t\tconst filterStartDate = filterQuery.startDate?.value && filterQuery.startDate.value.toString();\n\t\tconst filterEndDate = filterQuery.endDate?.value && filterQuery.endDate.value.toString();\n\t\tconst filterStartTime = filterQuery.startTime?.value && filterQuery.startTime.toString();\n\t\tconst filterEndTime = filterQuery.endTime?.value && filterQuery.endTime.toString();\n\t\tconst currentSnapshotKeys = [...keys];\n\t\tconst { objects } = this.mitigationKeyObject;\n\t\tconst dateformat = 'YYYY-MM-DD HH:mm:ss';\n\t\tif (filterStartDate && filterEndDate) {\n\t\t\treturn currentSnapshotKeys.filter((k) => {\n\t\t\t\tconst mitigation = objects[k];\n\t\t\t\tconst mitigationStartFormatted = mitigation.attackStartDate\n\t\t\t\t\t? moment.utc(mitigation.attackStartDate).format(dateformat)\n\t\t\t\t\t: undefined;\n\t\t\t\tconst mitigationEndFormatted = mitigation.attackEndDate\n\t\t\t\t\t? moment.utc(mitigation.attackEndDate).format(dateformat)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst startTime = moment.utc(filterStartTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst endTime = moment.utc(filterEndTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst filterStartFormatted = moment\n\t\t\t\t\t.utc(filterStartDate)\n\t\t\t\t\t.add({ hours: startTime.hours, minutes: startTime.minutes, seconds: startTime.seconds })\n\t\t\t\t\t.format(dateformat);\n\t\t\t\tconst filterEndFormatted = moment\n\t\t\t\t\t.utc(filterEndDate)\n\t\t\t\t\t.add({ hours: endTime.hours, minutes: endTime.minutes, seconds: endTime.seconds })\n\t\t\t\t\t.format(dateformat);\n\n\t\t\t\tif (filterStartBeforeOrAfter === BEFORE_VALUE && filterEndBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn mitigationStartFormatted < filterStartFormatted && mitigationEndFormatted >= filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterStartBeforeOrAfter === AFTER_VALUE && filterEndBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn mitigationStartFormatted >= filterStartFormatted && mitigationEndFormatted < filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterStartBeforeOrAfter === AFTER_VALUE && filterEndBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn mitigationStartFormatted >= filterStartFormatted && mitigationEndFormatted >= filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterStartBeforeOrAfter === BEFORE_VALUE && filterEndBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn mitigationStartFormatted < filterStartFormatted && mitigationEndFormatted < filterEndFormatted;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\n\t\tif (filterStartDate) {\n\t\t\treturn currentSnapshotKeys.filter((k) => {\n\t\t\t\tconst mitigation = objects[k];\n\t\t\t\tconst mitigationStartFormatted = mitigation.attackStartDate\n\t\t\t\t\t? moment.utc(mitigation.attackStartDate).format(dateformat)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst startTime = moment.utc(filterStartTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst filterStartFormatted = moment\n\t\t\t\t\t.utc(filterStartDate)\n\t\t\t\t\t.add({ hours: startTime.hours, minutes: startTime.minutes, seconds: startTime.seconds })\n\t\t\t\t\t.format(dateformat);\n\n\t\t\t\tif (mitigationStartFormatted && filterStartBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn mitigationStartFormatted < filterStartFormatted;\n\t\t\t\t}\n\n\t\t\t\tif (mitigationStartFormatted && filterStartBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn mitigationStartFormatted >= filterStartFormatted;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\n\t\tif (filterEndDate) {\n\t\t\treturn currentSnapshotKeys.filter((k) => {\n\t\t\t\tconst mitigation = objects[k];\n\t\t\t\tconst mitigationEndFormatted = mitigation.attackEndDate\n\t\t\t\t\t? moment.utc(mitigation.attackEndDate).format(dateformat)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst endTime = moment.utc(filterEndTime, 'HH:mm:ss').toObject();\n\t\t\t\tconst filterEndFormatted = moment\n\t\t\t\t\t.utc(filterEndDate)\n\t\t\t\t\t.add({ hours: endTime.hours, minutes: endTime.minutes, seconds: endTime.seconds })\n\t\t\t\t\t.format(dateformat);\n\n\t\t\t\tif (filterEndBeforeOrAfter === AFTER_VALUE) {\n\t\t\t\t\treturn mitigationEndFormatted >= filterEndFormatted;\n\t\t\t\t}\n\t\t\t\tif (filterEndBeforeOrAfter === BEFORE_VALUE) {\n\t\t\t\t\treturn mitigationEndFormatted < filterEndFormatted;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\n\t\treturn currentSnapshotKeys;\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { FormControl } from '@angular/forms';\nimport { SelectedCustomerOption } from '../../alert/alert.model';\nimport { NameValueOption, TableColumn, UnitType } from '../../common.model';\n\nexport type FacetTypes = 'Application' | 'TCP_Port' | 'UDP_Port' | 'Top_Sources' | 'Top_Destinations';\n\nexport const TA_DROPDOWN_PERIOD: NameValueOption[] = [\n\t{ name: 'Today', value: 'Today' },\n\t{ name: 'Yesterday', value: 'YESTERDAY' },\n\t{ name: 'This Week', value: 'THIS_WEEK' },\n\t{ name: 'This Month', value: 'THIS_MONTH' },\n\t{ name: 'This Year', value: 'THIS_YEAR' },\n\t{ name: 'Custom', value: 'Custom' },\n];\n\nexport const TA_DROPDOWN_GRAPH_TYPE: NameValueOption[] = [\n\t{ name: 'Stacked', value: 'Stacked' },\n\t{ name: 'Bar', value: 'Bar' },\n\t{ name: 'Pie', value: 'Pie' },\n];\n\nexport type TrafficUnitValue = UnitType | 'Bps';\nexport enum TA_PERIOD_ENUMS {\n\tTODAY = 'Today',\n\tYESTERDAY = 'YESTERDAY',\n\tTHIS_WEEK = 'THIS_WEEK',\n\tTHIS_MONTH = 'THIS_MONTH',\n\tTHIS_YEAR = 'THIS_YEAR',\n\tCUSTOM = 'Custom',\n}\n\nexport const TA_DROPDOWN_UNITS: NameValueOption[] = [\n\t{ name: 'bps', value: 'bps' },\n\t{ name: 'Bps', value: 'Bps' },\n\t{ name: 'pps', value: 'pps' },\n\t// { name: 'Bytes', value: 'Bytes' },\n\t// { name: 'Packets', value: 'Packets' },\n];\n\nexport const TA_DROPDOWN_VOLUME: NameValueOption[] = [\n\t{ name: 'Average', value: 'Average' },\n\t{ name: 'Current', value: 'Current' },\n];\n\nexport const TA_DROPDOWN_SEARCH_LIMIT: NameValueOption[] = [{ name: 'limit', value: 100 }];\n\nexport const TA_DROPDOWN_ITEMS_PER_PAGE: NameValueOption[] = [{ name: 'perPage', value: 10 }];\nexport const TA_WIZARD_SEARCH_LIMIT = 100;\n\nexport const TA_WIZARD_ITEMS_PER_PAGE = 10;\n\nexport const TA_DROPDOWN_STATUS: NameValueOption[] = [\n\t{ name: 'ongoing', value: false },\n\t{ name: 'recent', value: false },\n];\n\nexport const DDOS_DEFAULT_REGIONS: NameValueOption[] = [\n\t{ name: 'US', value: 'US' },\n\t{ name: 'AP', value: 'AP' },\n\t{ name: 'EMEA', value: 'EMEA' },\n];\n\n// ALERT SEARCH WIZARD DROPDOWN CONTROLS\n\nexport const TA_DROPDOWN_ALERT_SEVERITY: NameValueOption[] = [\n\t{ name: 'high', value: true },\n\t{ name: 'medium', value: false },\n\t{ name: 'low', value: false },\n];\n\nexport const TA_DROPDOWN_ALERT_TYPE = [{ name: 'All', value: 'all' }];\n\nexport enum TA_ALERT_CLASS_ENUM {\n\tDOS = 'DoS',\n}\n\nexport const TA_DROPDOWN_ALERT_CLASSIFICATION: NameValueOption[] = [{ name: 'All', value: 'all' }];\n\nexport const TA_DROPDOWN_STATUS_START: NameValueOption[] = [\n\t{ name: 'Is Before', value: 'before' },\n\t{ name: 'Is After', value: 'after' },\n];\n\nexport const TA_DROPDOWN_STATUS_END: NameValueOption[] = [\n\t{ name: 'Is Before', value: 'before' },\n\t{ name: 'Is After', value: 'after' },\n];\n\nexport const TA_DROPDOWN_ALERT_LOW_SEVERITY_PERCENT: NameValueOption[] = [{ name: 'low', value: 0 }];\n\nexport const TA_DROPDOWN_ALERT_HIGH_SEVERITY_PERCENT: NameValueOption[] = [{ name: 'high', value: 0 }];\n\nexport const TA_TRAFFIC_TABLE_COLUMNS = ['select', 'customer', 'in', 'out', 'total'];\n\nexport enum GraphClassType {\n\tIN = 'in',\n\tOUT = 'out',\n\tTOTAL = 'total',\n}\nexport enum GraphType {\n\tSTACKED = 'Stacked',\n\tBAR = 'Bar',\n\tPIE = 'Pie',\n}\n\nexport enum TA_DISPLAY_VALUES {\n\tTOTAL = 'Total In/Out',\n\tONLY_IN = 'In Only',\n\tONLY_OUT = 'Out Only',\n}\n\nexport const TA_DROPDOWN_DISPLAYS: NameValueOption[] = [\n\t{ name: TA_DISPLAY_VALUES.TOTAL, value: GraphClassType.TOTAL },\n\t{ name: TA_DISPLAY_VALUES.ONLY_IN, value: GraphClassType.IN },\n\t{ name: TA_DISPLAY_VALUES.ONLY_OUT, value: GraphClassType.OUT },\n];\n\nexport const TrafficFacet: { [k: string]: string } = {\n\tCUSTOMER_COMPARE: '',\n\tBY_APPLICATION: 'Application',\n\tBY_TCP: 'TCP_Port',\n\tBY_UDP: 'UDP_Port',\n\tBY_TOP_TALKER: 'Top_Destinations',\n\tBY_TOP_SOURCES: 'Top_Sources',\n};\n\nexport enum TrafficLayoutRouteParam {\n\t'ANALYTICS' = 'Customer Compare',\n\t'APP' = 'by Application',\n\t'BY-TCP' = 'by TCP',\n\t'BY-UDP' = 'by UDP',\n\t'BY-TOP-DEST' = 'by Top Talker',\n}\n\n// TRAFFIC FILTERS FORM FIELDS\nexport type CustomerTrafficFiltersForm = {\n\tselectedCustomer?: FormControl;\n\tselectedPeriod: FormControl;\n\tselectedGraphType: FormControl;\n\tselectedUnits: FormControl;\n\tselectedDisplay: FormControl;\n\tselectedVolume: FormControl;\n};\n\nexport type CustomerTrafficFiltersValues = {\n\tselectedCustomer?: SelectedCustomerOption;\n\tselectedPeriod: string;\n\tselectedGraphType: string;\n\tselectedUnits: string;\n\tselectedDisplay: string;\n\tselectedVolume: string;\n};\n\n// MITIGATION SEARCH WIZARD DROPDOWN CONTROLS\n\nexport const TA_DROPDOWN_MITIGATION_IP_VERSION = [\n\t{ name: 'ipv4', value: false },\n\t{ name: 'ipv6', value: false },\n];\n\nexport const TA_DROPDOWN_MITIGATION_TYPE = [\n\t{ name: 'tms', value: false },\n\t{ name: 'flowspec', value: false },\n\t{ name: 'blackhole', value: false },\n\t{ name: 'learning', value: false },\n];\n\nexport enum TA_DEFAULT_CONFIGS_ENUM {\n\tPERIOD = 'Today',\n\tGRAPH_TYPE = 'Stacked',\n\tUNITS = 'bps',\n\tDISPLAYS = 'Total In/Out',\n\tVOLUME = 'Average',\n}\n\nexport enum TA_DEFAULT_VOLUME_ENUM {\n\tCURRENT = 'current',\n\tAVERAGE = 'average',\n\tMAX = 'max',\n\tPCT95 = 'pct95',\n}\n\n// MITIGATION SUMMARY TABLE COLUMNS\n\nexport const MITIGATION_SUMMARY_TABLE_COLUMNS: TableColumn[] = [\n\t{\n\t\tcolumnName: 'Status',\n\t\tdataKey: 'status',\n\t},\n\t{\n\t\tcolumnName: 'Mode',\n\t\tdataKey: 'mode',\n\t},\n\t{\n\t\tcolumnName: 'Alert',\n\t\tdataKey: 'alertID',\n\t},\n\t{\n\t\tcolumnName: 'Protection Prefixes',\n\t\tdataKey: 'protectionPrefixes',\n\t},\n\t{\n\t\tcolumnName: 'Managed object',\n\t\tdataKey: 'managedObject',\n\t},\n];\n\n// CustomerTraffic Response Type\n\nexport type Class = {\n\ttype: string;\n\taverage: number;\n\tmax: number;\n\tpct95: number;\n\ttimeseries: number[];\n};\n\nexport type TrafficData = {\n\tmoName: string;\n\tclass: Class[];\n\tfacetId?: string;\n\tfacetName?: string;\n\tcolorVariant?: string;\n};\n\nexport type ChartTimeSeriesOptions = {\n\ttrafficData: TrafficData[];\n\ttrafficByType: TrafficLayoutRouteParam;\n\tgraphType?: string;\n\tclassType?: string;\n\tunit?: string;\n};\n\nexport type CustomerTrafficDataSource = {\n\tcustomer: string;\n\tport?: string;\n\tcolorVariant?: string;\n\tin: string;\n\tout: string;\n\ttotal: string;\n\tfacetId?: string;\n\tfacetName?: string;\n\ttotalPercent?: string;\n};\n\nexport type CustomerTrafficGrouped = {\n\tmoName: string;\n\ttrafficData: TrafficData[];\n};\n\nexport type CustomerTrafficDataObject = {\n\tdefaultZoneName: string;\n\tduration: number;\n\tstartTime: string;\n\tendTime: string;\n\tunit: string;\n\ttrafficData: TrafficData[];\n};\n\nexport type CustomerTraffic = {\n\tserviceName: string;\n\treturnCode: number;\n\treturnDescription: string;\n\tdataObject: CustomerTrafficDataObject;\n};\n\nexport type CustomerTrafficApiPayload = {\n\tperiod: TA_PERIOD_ENUMS;\n\tunit: TrafficUnitValue;\n\tfacet: FacetTypes;\n\tstartDate?: string;\n\tendDate?: string;\n\tstartTime?: string;\n\tendTime?: string;\n};\n\nexport type CustomerTrafficTimeSeries = {\n\tlabelName: string;\n\tcolorVariant: string;\n\tvalue: number[] | string[];\n\tformattedValue?: string;\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, finalize, map, tap } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport * as URLS from '@src/app/stores/api.urls';\nimport { OrUndefineable } from '@src/types/types.utils';\nimport { assertValue } from '@src/app/utils/assert';\nimport { environment } from '@src/environments/environment';\nimport { ApiResponse } from '../common.model';\nimport { Userinfo, CustomerInfo, CompanyDetail, RELOADED, CompanyInfo } from './session.model';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class SessionStore {\n\tprivate readonly userSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly assignedCompaniesSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly currentCompanyInfoSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly isAdminRoleSub = new BehaviorSubject(false);\n\n\tprivate readonly companyDetailSub = new BehaviorSubject>(undefined);\n\n\tprivate readonly isAuthenticatedAndReadySub = new BehaviorSubject(false);\n\n\tprivate readonly beforeReload = new BehaviorSubject(false);\n\n\tprivate readonly AfterReload = new BehaviorSubject(false);\n\n\tconstructor(private http: HttpClient) {}\n\n\tget user$() {\n\t\treturn this.userSub.asObservable();\n\t}\n\n\tget user(): OrUndefineable {\n\t\treturn this.userSub.value;\n\t}\n\n\tget isAdminRole$() {\n\t\treturn this.isAdminRoleSub.asObservable();\n\t}\n\n\tget isAdminRole() {\n\t\treturn this.isAdminRoleSub.value;\n\t}\n\n\tget assignedCompanies$() {\n\t\treturn this.assignedCompaniesSub.asObservable();\n\t}\n\n\tget assignedCompanies() {\n\t\treturn this.assignedCompaniesSub.value;\n\t}\n\n\tget currentCompany$() {\n\t\treturn this.currentCompanyInfoSub.asObservable();\n\t}\n\n\tget currentCompany(): OrUndefineable {\n\t\treturn this.currentCompanyInfoSub.value;\n\t}\n\n\tget currentCompanyDetail$() {\n\t\treturn this.companyDetailSub.asObservable();\n\t}\n\n\tget currentCompanyDetail(): OrUndefineable {\n\t\treturn this.companyDetailSub.value;\n\t}\n\n\tget currentCompanySite() {\n\t\treturn (\n\t\t\tthis.companyDetailSub.value.ssppDataList?.length && this.companyDetailSub.value.ssppDataList[0]?.siteNameSSPP\n\t\t);\n\t}\n\n\tget isAuthenticatedAndReady() {\n\t\treturn this.isAuthenticatedAndReadySub.value;\n\t}\n\n\tget isAuthenticatedAndReady$() {\n\t\treturn this.isAuthenticatedAndReadySub.asObservable();\n\t}\n\n\tget beforeReload$() {\n\t\treturn this.beforeReload.asObservable();\n\t}\n\n\tget afterReload() {\n\t\treturn this.AfterReload.value;\n\t}\n\n\tchangeCompanyId(companyId: number) {\n\t\tif (companyId !== this.currentCompany?.companyID) {\n\t\t\tconst companyInfo = this.assignedCompanies?.find((c) => c.companyID === companyId);\n\t\t\tif (companyInfo) {\n\t\t\t\tthis.getCustomerDetails(companyId).subscribe((companyDetail) => {\n\t\t\t\t\tthis.currentCompanyInfoSub.next(assertValue(companyInfo, \"companyId should've already in the list\"));\n\t\t\t\t\tthis.companyDetailSub.next(companyDetail);\n\t\t\t\t\tthis.verifyIfAuthenticatedAndReady();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tinitSession() {\n\t\tconst url = new URL(window.location.href);\n\t\tconst redirectUri = 'redirect_uri';\n\t\tif (url.searchParams.has(redirectUri)) {\n\t\t\twindow.location.href = `${url.origin}/auth/login?${redirectUri}=${url.searchParams.get(redirectUri)}`;\n\t\t} else {\n\t\t\twindow.location.href = `${url.origin}/auth/login?${redirectUri}=${url.href}`;\n\t\t}\n\t}\n\n\tendSession(): void {\n\t\t// invalidate all the browser current session.\n\t\tconst message = 'You will be redirecting away from the DDOS portal to the Business center, are you sure?';\n\t\t// eslint-disable-next-line no-restricted-globals, no-alert\n\t\tif (confirm(message)) {\n\t\t\tthis.http\n\t\t\t\t.get(URLS.LOGOUT_URL, {\n\t\t\t\t\tresponseType: 'text',\n\t\t\t\t})\n\t\t\t\t.pipe(\n\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\twindow.location.assign(environment.BUSINESS_CENTER_URL);\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.subscribe();\n\t\t}\n\t}\n\n\tloadUserData() {\n\t\tthis.getCustomerInfo();\n\t}\n\n\tprivate getCustomerInfo() {\n\t\tconst url = URLS.getApiUrl(URLS.GET_CUSTOMER_COMPANY_INFO);\n\t\tthis.http\n\t\t\t.get>(url)\n\t\t\t.pipe(\n\t\t\t\ttap((res) => {\n\t\t\t\t\tconst customerInfo = res.dataObject;\n\t\t\t\t\tthis.isAdminRoleSub.next(customerInfo.isAdmin);\n\t\t\t\t\tthis.assignedCompaniesSub.next(customerInfo.customerList);\n\t\t\t\t\tthis.userSub.next(customerInfo.userinfo);\n\t\t\t\t\tconst storedCompanyInfo = this.getCurrentSettings('companyInfo');\n\t\t\t\t\tconst selectedCompany = storedCompanyInfo ?? customerInfo.customerList[0];\n\t\t\t\t\tthis.currentCompanyInfoSub.next(\n\t\t\t\t\t\tassertValue(selectedCompany, `No company was assigned for ${this.user.email}`)\n\t\t\t\t\t);\n\t\t\t\t\tthis.getCustomerDetails(this.currentCompany.companyID).subscribe((companyDetail) => {\n\t\t\t\t\t\tthis.companyDetailSub.next(companyDetail);\n\t\t\t\t\t\tthis.verifyIfAuthenticatedAndReady();\n\t\t\t\t\t\tlocalStorage.removeItem(RELOADED);\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t)\n\t\t\t.subscribe();\n\t}\n\n\tprivate getCustomerDetails(companyId: number): Observable {\n\t\tconst url = URLS.getApiUrl(URLS.GET_CUSTOMER_DETAILS, companyId);\n\t\treturn this.http.get>(url).pipe(map((res) => res.dataObject));\n\t}\n\n\tprivate verifyIfAuthenticatedAndReady() {\n\t\tif (this.user && this.currentCompany && this.currentCompanyDetail && this.assignedCompanies) {\n\t\t\tthis.isAuthenticatedAndReadySub.next(true);\n\t\t}\n\t}\n\n\tongoingReload() {\n\t\tthis.beforeReload.next(true);\n\t}\n\n\tafterPageReload(value: boolean) {\n\t\tthis.AfterReload.next(value);\n\t}\n\n\tsaveCurrentSettings(name: string, settings: T) {\n\t\tlocalStorage.setItem(name, JSON.stringify(settings));\n\t}\n\n\tclearCurrentSettings(name: string) {\n\t\tlocalStorage.removeItem(name);\n\t}\n\n\tgetCurrentSettings(name: string): T | undefined {\n\t\tconst settingsStr = localStorage.getItem(name);\n\t\treturn settingsStr !== 'undefined' ? (JSON.parse(settingsStr) as T) : undefined;\n\t}\n}\n","import { CompanyIdentifier } from '../common.model';\n\n/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nexport const TOKEN_KEY = 'halo-access-token';\nexport const RELOADED = 'reloaded';\n\nexport type CompanyInfo = CompanyIdentifier & {\n\tcustomerGuidSSPP: string;\n\torderGuidSSPP: string;\n\tofferType: number;\n\tipbb: boolean;\n\tbdId: string;\n};\n\nexport type Userinfo = {\n\temail: string;\n\tuserGroups: string;\n\tphone_number: string;\n\tpostalCode: string;\n\tauth_time: string;\n\tgiven_name: string;\n\tedgeportal_roles: string;\n\tfamily_name: string;\n};\n\nexport type CustomerInfo = {\n\tisAdmin: boolean;\n\tcustomerList: CompanyInfo[];\n\tuserinfo: Userinfo;\n};\n\nexport type ZoneData = {\n\tipAddress: string;\n\tcidr: string;\n\tnetworkType: string;\n\tagnosticType: string;\n\tarecordAssignmentIP: string;\n};\n\nexport type SsppData = {\n\torderGuidSSPP: string;\n\tsiteNameSSPP: string;\n};\n\nexport type GpsData = {\n\tsocCode: string;\n\tsiteID: string;\n\tassetName: string;\n};\n\nexport type CloudSignalingData = {\n\tcloudSignalingInstances: number;\n\tpremiseDeviceList: Record;\n\tattManagedCloudSignalingInstances: number;\n\tattManagedInstances: number;\n\tcloudSignalingPremiseDeviceList: unknown[] | undefined;\n};\n\nexport type CompanyDetail = CompanyIdentifier & {\n\tdefaultZoneName: string;\n\tcustomerGuidSSPP: string;\n\tOfferType: number;\n\torderGuidSSPP: string;\n\tturnUpDate: string;\n\tdetectionOnly: boolean;\n\tusageBilling: boolean;\n\tregion: string;\n\tagnostic: boolean;\n\tssppDataList: SsppData[] | undefined;\n\tzoneDefinitionList: ZoneData[] | undefined;\n\tgpsData: GpsData;\n\tmodel: number;\n\tdistinctEndClientType: number;\n\tresellerList: SsppData;\n\tcloudSignalingData: CloudSignalingData;\n\tipbb: boolean;\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { ApiResponse } from '@app/stores/common.model';\n\nexport const assertValue = (value: T, errorMessage?: string): T => {\n\tif (typeof value === 'undefined' || value === null ) {\n\t\tconsole.error(errorMessage || 'value cannot be null or undefined');\n\t}\n\n\treturn value;\n};\n\nexport const assertHttpResponse = (response: ApiResponse): boolean => {\n\treturn !(typeof response === 'undefined' || response.returnCode === 1)\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { KeyObjects } from '@src/types/types.utils';\n\nexport const toPlainObjectByKey = (source: T[], key: keyof T): { [k: string]: T } => {\n\tconst plainObject = source.reduce((acc, current) => {\n\t\tacc[current[key].toString()] = current;\n\t\treturn acc;\n\t}, {});\n\treturn plainObject;\n};\n\nexport const toKeyObject = (source: T[], key: keyof T): KeyObjects => {\n\tconst objects = toPlainObjectByKey(source, key);\n\tconst allKeys = Object.keys(objects);\n\tconst keyObject = {\n\t\tsnapshotKeys: allKeys,\n\t\tkeys: allKeys,\n\t\tobjects,\n\t};\n\n\treturn keyObject;\n};\n\nexport const cloneKeyObject = (source: KeyObjects): KeyObjects => {\n\tconst { keys, snapshotKeys, objects, ...remainder } = source;\n\tconst cloned = {\n\t\t...remainder,\n\t\tsnapshotKeys: [...snapshotKeys],\n\t\tkeys: [...keys],\n\t\tobjects: {\n\t\t\t...keys.reduce((acc, k) => ({ ...acc, [`${k}`]: objects[k] }), {}),\n\t\t},\n\t};\n\n\treturn cloned;\n};\n\nexport const tryParseJson = (str: string): { [k: string]: string } => {\n\ttry {\n\t\treturn JSON.parse(str) as { [k: string]: string };\n\t} catch (e) {\n\t\treturn undefined;\n\t}\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nexport const environment = {\n\tproduction: true,\n\tAPI_BACKEND_URL: window.env?.API_BACKEND_URL,\n\tBUSINESS_CENTER_URL: window.env?.BUSINESS_CENTER_URL,\n\tARBOR_PORTAL_URL: window.env?.ARBOR_PORTAL_URL,\n\tMACD_URL: window.env?.MACD_PROD_URL,\n};\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Routes } from '@angular/router';\nimport { AppLayoutRouting } from '@src/app/routing-constants';\nimport { BdidNotFoundComponent } from '@app/components/shared/bdid-not-found/bdid-not-found.component';\nimport { PageNotFoundComponent } from './components/shared/page-not-found/page-not-found.component';\n\nfunction reload(path: string) {\n\tsetTimeout(() => {\n\t\twindow.location.href = `${window.location.origin}/${path}`;\n\t}, 0);\n}\n\nexport const AppRoutes: Routes = [\n\t{\n\t\tpath: '',\n\t\tredirectTo: '/home',\n\t\tpathMatch: 'full',\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.HOME}`,\n\t\tloadChildren: () =>\n\t\t\timport('@src/app/components/home/home.module')\n\t\t\t\t.then((m) => m.HomeModule)\n\t\t\t\t.catch((err: Error) => {\n\t\t\t\t\tif (err?.name === 'ChunkLoadError') {\n\t\t\t\t\t\treload(AppLayoutRouting.HOME);\n\t\t\t\t\t}\n\t\t\t\t\treturn err;\n\t\t\t\t}),\n\t\tdata: { title: `${AppLayoutRouting.HOME}` },\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.ALERTS}`,\n\t\tredirectTo: '/traffic/alerts',\n\t\tpathMatch: 'full',\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.TRAFFIC}`,\n\t\tloadChildren: () =>\n\t\t\timport('@src/app/components/traffic/traffic.module')\n\t\t\t\t.then((m) => m.TrafficModule)\n\t\t\t\t.catch((err: Error) => {\n\t\t\t\t\tif (err?.name === 'ChunkLoadError') {\n\t\t\t\t\t\treload(AppLayoutRouting.TRAFFIC);\n\t\t\t\t\t}\n\t\t\t\t\treturn err;\n\t\t\t\t}),\n\t\tdata: { title: `${AppLayoutRouting.TRAFFIC}` },\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.ZONES}`,\n\t\tloadChildren: () =>\n\t\t\timport('@src/app/components/zones/zones.module')\n\t\t\t\t.then((m) => m.ZonesModule)\n\t\t\t\t.catch((err: Error) => {\n\t\t\t\t\tif (err?.name === 'ChunkLoadError') {\n\t\t\t\t\t\treload(AppLayoutRouting.ZONES);\n\t\t\t\t\t}\n\t\t\t\t\treturn err;\n\t\t\t\t}),\n\t\tdata: { title: `${AppLayoutRouting.ZONES}` },\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.REPORTS}`,\n\t\tloadChildren: () =>\n\t\t\timport('@src/app/components/reports/reports.module')\n\t\t\t\t.then((m) => m.ReportsModule)\n\t\t\t\t.catch((err: Error) => {\n\t\t\t\t\tif (err?.name === 'ChunkLoadError') {\n\t\t\t\t\t\treload(AppLayoutRouting.REPORTS);\n\t\t\t\t\t}\n\t\t\t\t\treturn err;\n\t\t\t\t}),\n\t\tdata: { title: `${AppLayoutRouting.REPORTS}` },\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.ADMIN}`,\n\t\tloadChildren: () =>\n\t\t\timport('@src/app/components/admin/admin.module')\n\t\t\t\t.then((m) => m.AdminModule)\n\t\t\t\t.catch((err: Error) => {\n\t\t\t\t\tif (err?.name === 'ChunkLoadError') {\n\t\t\t\t\t\treload(AppLayoutRouting.ADMIN);\n\t\t\t\t\t}\n\t\t\t\t\treturn err;\n\t\t\t\t}),\n\t\tdata: { title: `${AppLayoutRouting.ADMIN}` },\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.KNOWLEDGE}`,\n\t\tloadChildren: () =>\n\t\t\timport('@src/app/components/knowledge/knowledge.module')\n\t\t\t\t.then((m) => m.KnowledgeModule)\n\t\t\t\t.catch((err: Error) => {\n\t\t\t\t\tif (err?.name === 'ChunkLoadError') {\n\t\t\t\t\t\treload(AppLayoutRouting.KNOWLEDGE);\n\t\t\t\t\t}\n\t\t\t\t\treturn err;\n\t\t\t\t}),\n\t\tdata: { title: `${AppLayoutRouting.KNOWLEDGE}` },\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.SETTINGS}`,\n\t\tloadChildren: () =>\n\t\t\timport('@src/app/components/settings/settings.module')\n\t\t\t\t.then((m) => m.SettingsModule)\n\t\t\t\t.catch((err) => {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\tif (err?.name === 'ChunkLoadError') {\n\t\t\t\t\t\treload(AppLayoutRouting.SETTINGS);\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\t\t\treturn err;\n\t\t\t\t}),\n\t\tdata: { title: `${AppLayoutRouting.SETTINGS}` },\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.USER_ERROR}`,\n\t\tcomponent: PageNotFoundComponent,\n\t},\n\t{\n\t\tpath: `${AppLayoutRouting.BDID_ERROR}`,\n\t\tcomponent: BdidNotFoundComponent,\n\t},\n\t{\n\t\tpath: '**',\n\t\tcomponent: PageNotFoundComponent,\n\t},\n];\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { AppRoutes } from './app-routes';\n\n@NgModule({\n\timports: [RouterModule.forRoot(AppRoutes)],\n\texports: [RouterModule],\n})\nexport class AppRoutingModule {}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { ChangeDetectionStrategy, Component, HostListener } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { NavigationStart, Router } from '@angular/router';\nimport * as Bowser from 'bowser'; // TypeScript\nimport { Subscription } from 'rxjs';\nimport { SessionStore } from '@app/stores/session/session.store';\nimport { SnackbarComponent, snackBarDuration, SNACKBAR_TYPE } from '@app/components/shared/snackbar/snackbar.component';\n\n@Component({\n\tselector: 'ddos-ui-root',\n\ttemplateUrl: './app.component.html',\n\tstyleUrls: ['./app.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppComponent {\n\tRouterSubscription: Subscription;\n\n\t@HostListener('window:beforeunload', ['$event']) unloadHandler(_: Event) {\n\t\tthis.sessionStore.ongoingReload();\n\t}\n\n\tconstructor(\n\t\tprivate snackBar: MatSnackBar,\n\t\tprivate router: Router,\n\t\tprivate sessionStore: SessionStore\n\t) {\n\t\tthis.RouterSubscription = router.events.subscribe((event) => {\n\t\t\tif (event instanceof NavigationStart) {\n\t\t\t\tthis.sessionStore.afterPageReload(!router.navigated);\n\t\t\t}\n\t\t});\n\t\tconst errorText = this.detectBrowserValidity()\n\t\t\t? null\n\t\t\t: `Your browser is out of date and is not compatible with this site.\n Please use the latest version of Chrome, Firefox, or Safari`;\n\n\t\tif (errorText) {\n\t\t\tthis.snackBar.openFromComponent(SnackbarComponent, {\n\t\t\t\tdata: {\n\t\t\t\t\tmessage: errorText,\n\t\t\t\t\tsnackType: SNACKBAR_TYPE.ERROR,\n\t\t\t\t},\n\t\t\t\tpanelClass: 'snackbar',\n\t\t\t\tduration: snackBarDuration,\n\t\t\t});\n\t\t}\n\t}\n\n\tdetectBrowserValidity() {\n\t\tconst browser = Bowser.getParser(window.navigator.userAgent);\n\t\treturn browser.satisfies({\n\t\t\twindows: {\n\t\t\t\t'internet explorer': '>15',\n\t\t\t\t'Microsoft Edge': '>80',\n\t\t\t},\n\t\t\tmacos: {\n\t\t\t\tsafari: '>13',\n\t\t\t},\n\t\t\tchrome: '>80',\n\t\t\tfirefox: '>80',\n\t\t\topera: '>80',\n\t\t});\n\t}\n}\n","\n \n \n\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport {\n\tHttpErrorResponse,\n\tHttpEvent,\n\tHttpHandler,\n\tHttpInterceptor,\n\tHttpRequest,\n\tHttpResponseBase,\n} from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, catchError, tap, throwError } from 'rxjs';\nimport { LoaderStore } from '@src/app/stores/loader/loader.store';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class LoaderInterceptor implements HttpInterceptor {\n\tconstructor(private loaderStore: LoaderStore) {}\n\n\tintercept(req: HttpRequest, next: HttpHandler): Observable> {\n\t\tthis.loaderStore.increaseRemoteCallCount();\n\t\treturn next.handle(req).pipe(\n\t\t\ttap((event) => {\n\t\t\t\tif (event instanceof HttpResponseBase) {\n\t\t\t\t\tthis.loaderStore.decreaseRemoteCallCount();\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError((error: HttpErrorResponse | undefined) => {\n\t\t\t\tthis.loaderStore.decreaseRemoteCallCount();\n\t\t\t\treturn throwError(() => error);\n\t\t\t})\n\t\t);\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { Injectable, NgZone } from '@angular/core';\nimport {\n\tHttpInterceptor,\n\tHttpRequest,\n\tHttpHandler,\n\tHttpEvent,\n\tHttpHeaders,\n\tHttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable, catchError, throwError } from 'rxjs';\nimport { SessionStore } from '@src/app/stores/session/session.store';\nimport { assertValue } from '@src/app/utils/assert';\nimport {\n\tConfirmDialogService,\n\tDDOS_CONFIRM_DIALOG_FORBIDDEN_ERROR,\n\tDDOS_CONFIRM_DIALOG_INVALID_ERROR,\n} from '@app/components/shared/services/dialog/confirm-dialog.service';\nimport { Router } from '@angular/router';\nimport { AppLayoutRouting } from '@app/routing-constants';\nimport { GET_CUSTOMER_COMPANY_INFO } from '@app/stores/api.urls';\n\n@Injectable()\nexport class DdosHttpInterceptor implements HttpInterceptor {\n\tconstructor(\n\t\tprivate sessionStore: SessionStore,\n\t\tprivate zone: NgZone,\n\t\tprivate dialogService: ConfirmDialogService,\n\t\tprivate router: Router\n\t) {}\n\n\tintercept(request: HttpRequest, next: HttpHandler): Observable> {\n\t\tlet ddosHeaders = {};\n\t\tif (this.sessionStore.currentCompany) {\n\t\t\tddosHeaders = {\n\t\t\t\t[`x-ddos-bdid`]: `${assertValue(this.sessionStore.currentCompany.bdId)}`,\n\t\t\t\t[`x-ddos-companyID`]: `${assertValue(this.sessionStore.currentCompany.companyID)}`,\n\t\t\t};\n\t\t}\n\n\t\tconst req = request.clone({\n\t\t\theaders: new HttpHeaders({\n\t\t\t\t...ddosHeaders,\n\t\t\t}),\n\t\t});\n\n\t\treturn next.handle(req).pipe(\n\t\t\tcatchError((error: HttpErrorResponse | undefined) => {\n\t\t\t\tswitch (error?.status) {\n\t\t\t\t\tcase 400: {\n\t\t\t\t\t\tthis.dialogService.openConfirmDialog(DDOS_CONFIRM_DIALOG_INVALID_ERROR);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 401: {\n\t\t\t\t\t\tthis.sessionStore.initSession();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 403: {\n\t\t\t\t\t\tthis.sessionStore.initSession();\n\t\t\t\t\t\tthis.dialogService.openConfirmDialog(DDOS_CONFIRM_DIALOG_FORBIDDEN_ERROR);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 404: {\n\t\t\t\t\t\tthis.goToErrorPage(error);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 502: {\n\t\t\t\t\t\tthis.goToErrorPage(error);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 504: {\n\t\t\t\t\t\tthis.goToErrorPage(error);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line prettier/prettier\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\t/* empty */\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn throwError(() => error);\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate goToErrorPage(error: HttpErrorResponse) {\n\t\tif (error.url.includes(GET_CUSTOMER_COMPANY_INFO)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\tthis.router.navigate([`/${AppLayoutRouting.BDID_ERROR}`], { queryParams: { code: error.status } });\n\t\t}\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { ErrorHandler, Injectable, NgZone } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { SnackbarComponent, snackBarDuration, SNACKBAR_TYPE } from '@app/components/shared/snackbar/snackbar.component';\n\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class DdosErrorHandler implements ErrorHandler {\n\tconstructor(\n\t\tprivate snackbar: MatSnackBar,\n\t\tprivate zone: NgZone\n\t) {}\n\n\thandleError(error: unknown) {\n\t\tif (error instanceof HttpErrorResponse) {\n\t\t\tif (error.error && (error.status === 500 || error.status === 0)) {\n\t\t\t\tthis.showSnackbarMessage(error.error as string);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate showSnackbarMessage(msg: string) {\n\t\tthis.zone.run(() => {\n\t\t\treturn this.snackbar.openFromComponent(SnackbarComponent, {\n\t\t\t\tdata: { message: msg, snackType: SNACKBAR_TYPE.ERROR },\n\t\t\t\tpanelClass: 'snackbar',\n\t\t\t\tduration: snackBarDuration,\n\t\t\t});\n\t\t});\n\t}\n}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\nimport { BrowserModule } from '@angular/platform-browser';\nimport { ErrorHandler, NgModule } from '@angular/core';\n\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';\nimport { AppRoutingModule } from './app-routing.module';\nimport { AppComponent } from './app.component';\nimport { LoaderInterceptor } from './interceptors/http-spinner.interceptor';\nimport { DdosHttpInterceptor } from './interceptors/http.interceptors';\nimport { DdosErrorHandler } from './interceptors/ddos-error.interceptor';\nimport { SharedModule } from './components/shared/shared.module';\n\n@NgModule({\n\tdeclarations: [AppComponent],\n\timports: [BrowserModule, AppRoutingModule, BrowserAnimationsModule, SharedModule, HttpClientModule],\n\tproviders: [\n\t\t{ provide: ErrorHandler, useClass: DdosErrorHandler },\n\t\t{ provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { appearance: 'outline' } },\n\t\t{ provide: HTTP_INTERCEPTORS, useClass: DdosHttpInterceptor, multi: true },\n\t\t{ provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptor, multi: true },\n\t],\n\tbootstrap: [AppComponent],\n})\nexport class AppModule {}\n","/* Copyright 2023, AT&T Intellectual Property. All rights reserved. */\n\nimport { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n\tenableProdMode();\n}\n\nplatformBrowserDynamic()\n\t.bootstrapModule(AppModule)\n\t.catch((err) => console.error(err));\n","var map = {\n\t\"./af\": 58685,\n\t\"./af.js\": 58685,\n\t\"./ar\": 254,\n\t\"./ar-dz\": 4312,\n\t\"./ar-dz.js\": 4312,\n\t\"./ar-kw\": 32614,\n\t\"./ar-kw.js\": 32614,\n\t\"./ar-ly\": 18630,\n\t\"./ar-ly.js\": 18630,\n\t\"./ar-ma\": 28674,\n\t\"./ar-ma.js\": 28674,\n\t\"./ar-sa\": 49032,\n\t\"./ar-sa.js\": 49032,\n\t\"./ar-tn\": 24730,\n\t\"./ar-tn.js\": 24730,\n\t\"./ar.js\": 254,\n\t\"./az\": 53052,\n\t\"./az.js\": 53052,\n\t\"./be\": 60150,\n\t\"./be.js\": 60150,\n\t\"./bg\": 63069,\n\t\"./bg.js\": 63069,\n\t\"./bm\": 13466,\n\t\"./bm.js\": 13466,\n\t\"./bn\": 18516,\n\t\"./bn-bd\": 90557,\n\t\"./bn-bd.js\": 90557,\n\t\"./bn.js\": 18516,\n\t\"./bo\": 26273,\n\t\"./bo.js\": 26273,\n\t\"./br\": 9588,\n\t\"./br.js\": 9588,\n\t\"./bs\": 19815,\n\t\"./bs.js\": 19815,\n\t\"./ca\": 83331,\n\t\"./ca.js\": 83331,\n\t\"./cs\": 21320,\n\t\"./cs.js\": 21320,\n\t\"./cv\": 72219,\n\t\"./cv.js\": 72219,\n\t\"./cy\": 68266,\n\t\"./cy.js\": 68266,\n\t\"./da\": 66427,\n\t\"./da.js\": 66427,\n\t\"./de\": 67435,\n\t\"./de-at\": 52871,\n\t\"./de-at.js\": 52871,\n\t\"./de-ch\": 12994,\n\t\"./de-ch.js\": 12994,\n\t\"./de.js\": 67435,\n\t\"./dv\": 82357,\n\t\"./dv.js\": 82357,\n\t\"./el\": 95649,\n\t\"./el.js\": 95649,\n\t\"./en-au\": 59961,\n\t\"./en-au.js\": 59961,\n\t\"./en-ca\": 19878,\n\t\"./en-ca.js\": 19878,\n\t\"./en-gb\": 3924,\n\t\"./en-gb.js\": 3924,\n\t\"./en-ie\": 70864,\n\t\"./en-ie.js\": 70864,\n\t\"./en-il\": 91579,\n\t\"./en-il.js\": 91579,\n\t\"./en-in\": 30940,\n\t\"./en-in.js\": 30940,\n\t\"./en-nz\": 16181,\n\t\"./en-nz.js\": 16181,\n\t\"./en-sg\": 44301,\n\t\"./en-sg.js\": 44301,\n\t\"./eo\": 85291,\n\t\"./eo.js\": 85291,\n\t\"./es\": 54529,\n\t\"./es-do\": 53764,\n\t\"./es-do.js\": 53764,\n\t\"./es-mx\": 12584,\n\t\"./es-mx.js\": 12584,\n\t\"./es-us\": 63425,\n\t\"./es-us.js\": 63425,\n\t\"./es.js\": 54529,\n\t\"./et\": 35203,\n\t\"./et.js\": 35203,\n\t\"./eu\": 70678,\n\t\"./eu.js\": 70678,\n\t\"./fa\": 83483,\n\t\"./fa.js\": 83483,\n\t\"./fi\": 96262,\n\t\"./fi.js\": 96262,\n\t\"./fil\": 52521,\n\t\"./fil.js\": 52521,\n\t\"./fo\": 34555,\n\t\"./fo.js\": 34555,\n\t\"./fr\": 63131,\n\t\"./fr-ca\": 88239,\n\t\"./fr-ca.js\": 88239,\n\t\"./fr-ch\": 21702,\n\t\"./fr-ch.js\": 21702,\n\t\"./fr.js\": 63131,\n\t\"./fy\": 267,\n\t\"./fy.js\": 267,\n\t\"./ga\": 23821,\n\t\"./ga.js\": 23821,\n\t\"./gd\": 71753,\n\t\"./gd.js\": 71753,\n\t\"./gl\": 4074,\n\t\"./gl.js\": 4074,\n\t\"./gom-deva\": 92762,\n\t\"./gom-deva.js\": 92762,\n\t\"./gom-latn\": 5969,\n\t\"./gom-latn.js\": 5969,\n\t\"./gu\": 82809,\n\t\"./gu.js\": 82809,\n\t\"./he\": 45402,\n\t\"./he.js\": 45402,\n\t\"./hi\": 315,\n\t\"./hi.js\": 315,\n\t\"./hr\": 10410,\n\t\"./hr.js\": 10410,\n\t\"./hu\": 38288,\n\t\"./hu.js\": 38288,\n\t\"./hy-am\": 67928,\n\t\"./hy-am.js\": 67928,\n\t\"./id\": 71334,\n\t\"./id.js\": 71334,\n\t\"./is\": 86959,\n\t\"./is.js\": 86959,\n\t\"./it\": 34864,\n\t\"./it-ch\": 51124,\n\t\"./it-ch.js\": 51124,\n\t\"./it.js\": 34864,\n\t\"./ja\": 36141,\n\t\"./ja.js\": 36141,\n\t\"./jv\": 29187,\n\t\"./jv.js\": 29187,\n\t\"./ka\": 42136,\n\t\"./ka.js\": 42136,\n\t\"./kk\": 94332,\n\t\"./kk.js\": 94332,\n\t\"./km\": 18607,\n\t\"./km.js\": 18607,\n\t\"./kn\": 84305,\n\t\"./kn.js\": 84305,\n\t\"./ko\": 70234,\n\t\"./ko.js\": 70234,\n\t\"./ku\": 16003,\n\t\"./ku.js\": 16003,\n\t\"./ky\": 75061,\n\t\"./ky.js\": 75061,\n\t\"./lb\": 32786,\n\t\"./lb.js\": 32786,\n\t\"./lo\": 66183,\n\t\"./lo.js\": 66183,\n\t\"./lt\": 50029,\n\t\"./lt.js\": 50029,\n\t\"./lv\": 24169,\n\t\"./lv.js\": 24169,\n\t\"./me\": 68577,\n\t\"./me.js\": 68577,\n\t\"./mi\": 68177,\n\t\"./mi.js\": 68177,\n\t\"./mk\": 50337,\n\t\"./mk.js\": 50337,\n\t\"./ml\": 65260,\n\t\"./ml.js\": 65260,\n\t\"./mn\": 52325,\n\t\"./mn.js\": 52325,\n\t\"./mr\": 14695,\n\t\"./mr.js\": 14695,\n\t\"./ms\": 75334,\n\t\"./ms-my\": 37151,\n\t\"./ms-my.js\": 37151,\n\t\"./ms.js\": 75334,\n\t\"./mt\": 63570,\n\t\"./mt.js\": 63570,\n\t\"./my\": 97963,\n\t\"./my.js\": 97963,\n\t\"./nb\": 88028,\n\t\"./nb.js\": 88028,\n\t\"./ne\": 86638,\n\t\"./ne.js\": 86638,\n\t\"./nl\": 50302,\n\t\"./nl-be\": 66782,\n\t\"./nl-be.js\": 66782,\n\t\"./nl.js\": 50302,\n\t\"./nn\": 33501,\n\t\"./nn.js\": 33501,\n\t\"./oc-lnc\": 50563,\n\t\"./oc-lnc.js\": 50563,\n\t\"./pa-in\": 50869,\n\t\"./pa-in.js\": 50869,\n\t\"./pl\": 65302,\n\t\"./pl.js\": 65302,\n\t\"./pt\": 49687,\n\t\"./pt-br\": 74884,\n\t\"./pt-br.js\": 74884,\n\t\"./pt.js\": 49687,\n\t\"./ro\": 79107,\n\t\"./ro.js\": 79107,\n\t\"./ru\": 33627,\n\t\"./ru.js\": 33627,\n\t\"./sd\": 30355,\n\t\"./sd.js\": 30355,\n\t\"./se\": 83427,\n\t\"./se.js\": 83427,\n\t\"./si\": 11848,\n\t\"./si.js\": 11848,\n\t\"./sk\": 54590,\n\t\"./sk.js\": 54590,\n\t\"./sl\": 20184,\n\t\"./sl.js\": 20184,\n\t\"./sq\": 56361,\n\t\"./sq.js\": 56361,\n\t\"./sr\": 78965,\n\t\"./sr-cyrl\": 81287,\n\t\"./sr-cyrl.js\": 81287,\n\t\"./sr.js\": 78965,\n\t\"./ss\": 25456,\n\t\"./ss.js\": 25456,\n\t\"./sv\": 70451,\n\t\"./sv.js\": 70451,\n\t\"./sw\": 77558,\n\t\"./sw.js\": 77558,\n\t\"./ta\": 51356,\n\t\"./ta.js\": 51356,\n\t\"./te\": 73693,\n\t\"./te.js\": 73693,\n\t\"./tet\": 21243,\n\t\"./tet.js\": 21243,\n\t\"./tg\": 42500,\n\t\"./tg.js\": 42500,\n\t\"./th\": 55768,\n\t\"./th.js\": 55768,\n\t\"./tk\": 77761,\n\t\"./tk.js\": 77761,\n\t\"./tl-ph\": 35780,\n\t\"./tl-ph.js\": 35780,\n\t\"./tlh\": 29590,\n\t\"./tlh.js\": 29590,\n\t\"./tr\": 33807,\n\t\"./tr.js\": 33807,\n\t\"./tzl\": 93857,\n\t\"./tzl.js\": 93857,\n\t\"./tzm\": 60654,\n\t\"./tzm-latn\": 8806,\n\t\"./tzm-latn.js\": 8806,\n\t\"./tzm.js\": 60654,\n\t\"./ug-cn\": 30845,\n\t\"./ug-cn.js\": 30845,\n\t\"./uk\": 19232,\n\t\"./uk.js\": 19232,\n\t\"./ur\": 47052,\n\t\"./ur.js\": 47052,\n\t\"./uz\": 77967,\n\t\"./uz-latn\": 32233,\n\t\"./uz-latn.js\": 32233,\n\t\"./uz.js\": 77967,\n\t\"./vi\": 98615,\n\t\"./vi.js\": 98615,\n\t\"./x-pseudo\": 12320,\n\t\"./x-pseudo.js\": 12320,\n\t\"./yo\": 31313,\n\t\"./yo.js\": 31313,\n\t\"./zh-cn\": 64490,\n\t\"./zh-cn.js\": 64490,\n\t\"./zh-hk\": 55910,\n\t\"./zh-hk.js\": 55910,\n\t\"./zh-mo\": 98262,\n\t\"./zh-mo.js\": 98262,\n\t\"./zh-tw\": 44223,\n\t\"./zh-tw.js\": 44223\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;"],"x_google_ignoreList":[70]}