ms-time-sheet 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ms-time-sheet.mjs","sources":["../../../projects/ms-time-sheet/src/lib/ms-time-sheet.service.ts","../../../projects/ms-time-sheet/src/lib/services/split-columns.service.ts","../../../projects/ms-time-sheet/src/lib/services/common.service.ts","../../../projects/ms-time-sheet/src/lib/badges.ts","../../../projects/ms-time-sheet/src/lib/services/copy-service.service.ts","../../../projects/ms-time-sheet/src/lib/pipes/filter.pipe.ts","../../../projects/ms-time-sheet/src/lib/pipes/pinned-columns.pipe.ts","../../../projects/ms-time-sheet/src/lib/components/badge-overflow/badge-overflow.component.ts","../../../projects/ms-time-sheet/src/lib/components/badge-overflow/badge-overflow.component.html","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.ts","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.html","../../../projects/ms-time-sheet/src/public-api.ts","../../../projects/ms-time-sheet/src/ms-time-sheet.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MsTimeSheetService {\r\n\r\n constructor() { }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SplitColumnsService {\r\n prepareColumns(columns: any[], containerWidth: number): any {\r\n const left: any[] = [];\r\n const center: any[] = [];\r\n const right: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const leftChildren: any[] = [];\r\n const centerChildren: any[] = [];\r\n const rightChildren: any[] = [];\r\n\r\n for (const child of col.children) {\r\n if (child.is_visible === false) continue;\r\n\r\n const pinned = child.pinned ?? col.pinned ?? null;\r\n const childWithPinned = { ...child, pinned };\r\n\r\n if (pinned === 'left') leftChildren.push(childWithPinned);\r\n else if (pinned === 'right') rightChildren.push(childWithPinned);\r\n else centerChildren.push(childWithPinned);\r\n }\r\n\r\n if (leftChildren.length) {\r\n left.push({ header: col.header, children: leftChildren, id: col?.id || col?._id });\r\n }\r\n if (centerChildren.length) {\r\n center.push({\r\n header: col.header,\r\n children: centerChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n if (rightChildren.length) {\r\n right.push({\r\n header: col.header,\r\n children: rightChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n } else if (col.is_visible !== false) {\r\n const pinned = col.pinned ?? null;\r\n if (pinned === 'left') left.push(col);\r\n else if (pinned === 'right') right.push(col);\r\n else center.push(col);\r\n }\r\n }\r\n\r\n return { left, center, right };\r\n }\r\n\r\n setColumnsQuery(columns: any[]) {\r\n for (const col of columns) {\r\n // if (col.children?.length) {\r\n // for (const child of col.children) {\r\n // if (!child?.query?.firt_value && !child?.query?._ids?.length) {\r\n // child['query'] = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n // }\r\n // }\r\n // if (!col?.query?.firt_value && !col?.query?._ids?.length) {\r\n // col.query = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n }\r\n\r\n console.log('Updated Columns: ', columns);\r\n\r\n return columns;\r\n }\r\n\r\n assignDefaultWidths(columns: any[], containerWidth: number): any[] {\r\n const visibleLeafCols = this.getVisibleLeafColumns(columns);\r\n\r\n if (!visibleLeafCols.length) return columns;\r\n\r\n let defaultWidth = Math.floor(containerWidth / visibleLeafCols.length);\r\n if (defaultWidth < 80) defaultWidth = 80;\r\n\r\n const cloneColumns = (cols: any[]): any[] =>\r\n cols.map((col) => {\r\n if (col.children?.length) {\r\n const newChildren = col.children.map((child: any) => {\r\n // If visible → dynamic default width\r\n // If invisible → fixed 150px\r\n if (!child.width) {\r\n if (child.is_visible === false) {\r\n return { ...child, width: 150 };\r\n } else {\r\n return { ...child, width: defaultWidth };\r\n }\r\n }\r\n return { ...child };\r\n });\r\n\r\n return { ...col, children: newChildren };\r\n }\r\n\r\n if (!col.width) {\r\n if (col.is_visible === false) {\r\n return { ...col, width: 150 };\r\n } else {\r\n return { ...col, width: defaultWidth };\r\n }\r\n }\r\n\r\n return { ...col };\r\n });\r\n\r\n return cloneColumns(columns);\r\n}\r\n\r\n\r\n private getVisibleLeafColumns(columns: any[]): any[] {\r\n const result: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const visibleChildren = col.children.filter(\r\n (c: any) => c.is_visible !== false\r\n );\r\n result.push(...visibleChildren);\r\n } else if (col.is_visible !== false) {\r\n result.push(col);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { EventEmitter, Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommonService {\r\n\r\n constructor() { }\r\n gethasVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n gethasInVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (!col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n\r\n getTotalColumnsLength(columns: any[]): number {\r\n let count = 0;\r\n\r\n columns.forEach(col => {\r\n if (col.children && Array.isArray(col.children) && col.children.length) {\r\n count += col.children.length; // count children instead of parent\r\n } else {\r\n count += 1; // count parent directly\r\n }\r\n });\r\n\r\n return count;\r\n }\r\n\r\n gethasRightPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'right' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n gethasLeftPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'left' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n\r\n getExpandedRowCount(data: any[]): number {\r\n let groupCount = 0;\r\n let rowCount = 0;\r\n\r\n data.forEach(group => {\r\n if (group?.isGroup) {\r\n groupCount++;\r\n\r\n if (group?.isExpand && Array.isArray(group?.children)) {\r\n group.children.forEach((child: any) => {\r\n if (child.isGroup) {\r\n if (child.isExpand && Array.isArray(child.children)) {\r\n rowCount += child.children.length;\r\n }\r\n } else {\r\n rowCount++;\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (groupCount === 0) {\r\n return data.length;\r\n }\r\n\r\n return groupCount + rowCount;\r\n }\r\n\r\n\r\ngetFiltersFromColumns(columns: any[], filtersConfig:any []): any[] {\r\n const result: any[] = [];\r\n \r\n const checkColumn = (col: any) => {\r\n const hasFirstValue = col.query?.first_value != null && col.query?.first_value !== \"\" && filtersConfig.some((ele)=> ele.field == col.field);\r\n const hasIds = Array.isArray(col.query?._ids) && col.query._ids.length > 0 && filtersConfig.some((ele)=> ele.field == col.field);\r\n if (hasFirstValue || hasIds) {\r\n result.push({\r\n search: col.search ?? \"\",\r\n field: col.field,\r\n type: col.type,\r\n _ids: col.type == 'dropdown'? col.query?._ids: [],\r\n query: col.type == 'dropdown'? null : (col?.query?.first_value ? col?.query : null)\r\n });\r\n }\r\n \r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n col.children.forEach(checkColumn);\r\n }\r\n };\r\n columns.forEach(checkColumn);\r\n \r\n return result;\r\n}\r\n\r\nasync applyFiltersToColumns(columns: any[], filters: any[]): Promise<any[]> {\r\n \r\n for (const col of columns) {\r\n if (!col.query) {\r\n col.query = {\r\n first_value: null,\r\n second_value: null,\r\n first_condition: 'contain',\r\n second_condition: null,\r\n condition: 'none',\r\n _ids: []\r\n };\r\n }\r\n\r\n const filter = filters.find(f => f.field === col.field);\r\n\r\n if (filter) {\r\n if (col.type === 'dropdown') {\r\n col.filterValue = filter._ids ?? [];\r\n col.search = filter.search ?? '';\r\n col.query._ids = filter._ids ?? [];\r\n } else {\r\n col.filterValue = filter.search ?? null;\r\n col.search = filter.search ?? '';\r\n col.query.first_value = filter.query?.first_value ?? null;\r\n col.query.second_value = filter.query?.second_value ?? null;\r\n col.query.first_condition = filter.query?.first_condition ?? 'contain';\r\n col.query.second_condition = filter.query?.second_condition ?? 'contain';\r\n col.query.condition = filter.query?.condition ?? 'none';\r\n }\r\n }\r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n col.children = await this.applyFiltersToColumns(col.children, filters);\r\n }\r\n }\r\n return columns;\r\n}\r\n\r\n\r\n public globalSearch: EventEmitter<any> = new EventEmitter<any>();\r\n private userData: any = null;\r\n \r\n\r\n \r\n setUserData(user: any) {\r\n this.userData = user;\r\n }\r\n \r\n formatDateTimeWithPrefs() {\r\n let lsUser = this.userData;\r\n let timeZone = lsUser?.business_id?.time_zone ? lsUser?.business_id?.time_zone : 'UTC';\r\n let dateFormat = lsUser?.date_format ? this.convertMomentToAngularDateFormat(lsUser.date_format) : 'MM/dd/yyyy';\r\n let timeFormat = !lsUser?.business_id?.is_24_hour_format ? 'h:mm a' : 'H:mm';\r\n return {timeZone, dateFormat, timeFormat};\r\n }\r\n\r\n private convertMomentToAngularDateFormat(momentFormat: string): string {\r\n // Convert moment.js date format to Angular DatePipe format\r\n return momentFormat\r\n .replace(/DD/g, 'dd') // Day of month: DD -> dd\r\n .replace(/YYYY/g, 'yyyy') // Year: YYYY -> yyyy\r\n .replace(/YY/g, 'yy') // Year: YY -> yy\r\n .replace(/MM/g, 'MM') // Month: MM -> MM (same)\r\n .replace(/M/g, 'M') // Month: M -> M (same)\r\n .replace(/HH/g, 'HH') // Hour 24: HH -> HH (same)\r\n .replace(/H/g, 'H') // Hour 24: H -> H (same)\r\n .replace(/hh/g, 'h') // Hour 12: hh -> h\r\n .replace(/h/g, 'h') // Hour 12: h -> h (same)\r\n .replace(/mm/g, 'mm') // Minute: mm -> mm (same)\r\n .replace(/m/g, 'm') // Minute: m -> m (same)\r\n .replace(/ss/g, 'ss') // Second: ss -> ss (same)\r\n .replace(/s/g, 's') // Second: s -> s (same)\r\n .replace(/A/g, 'a') // AM/PM: A -> a\r\n .replace(/a/g, 'a'); // AM/PM: a -> a (same)\r\n }\r\n \r\n\r\n\r\nactiveFilteredColumns: any[] = [];\r\nupdateActiveFilteredColumns(columns: any[]): any[] {\r\n const collectFiltered = (cols: any[]): any[] => {\r\n let result: any[] = [];\r\n\r\n for (let i = 0; i < cols.length; i++) {\r\n const col = cols[i];\r\n if (col.children && col.children.length > 0) {\r\n result = result.concat(collectFiltered(col.children));\r\n }\r\n\r\n if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0;\r\n\r\n const hasValueFilter =\r\n (col.query.first_value && col.query.first_value !== '') ||\r\n (col.query.second_value && col.query.second_value !== '');\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n }\r\n return result;\r\n };\r\n this.activeFilteredColumns = [...collectFiltered(columns)];\r\n return this.activeFilteredColumns;\r\n}\r\n\r\n\r\n\r\nhasFieldChanged(current: any, original: any, type: string): boolean {\r\n switch (type) {\r\n case 'number':\r\n return Number(current) !== Number(original);\r\n\r\n case 'string':\r\n return String(current || '') !== String(original || '');\r\n\r\n case 'dropdown':\r\n if (typeof current === 'object' && typeof original === 'object') {\r\n return current?.id !== original?.id || current?.value !== original?.value;\r\n }\r\n return current !== original;\r\n\r\n case 'boolean':\r\n return Boolean(current) !== Boolean(original);\r\n\r\n case 'date':\r\n const currentDate = new Date(current).getTime();\r\n const originalDate = new Date(original).getTime();\r\n return isNaN(currentDate) || isNaN(originalDate)\r\n ? current !== original\r\n : currentDate !== originalDate;\r\n\r\n default:\r\n return JSON.stringify(current) !== JSON.stringify(original);\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","export const BADGES_MAP: { [key: string]: string } = {\r\n // Success – Green\r\n 'active': 'badge-success',\r\n 'approved': 'badge-success',\r\n 'accepted': 'badge-success',\r\n 'completed': 'badge-success',\r\n 'evaluated': 'badge-success',\r\n 'assigned': 'badge-success',\r\n 'scrap': 'badge-success',\r\n 'move-available': 'badge-success',\r\n 'move-assigned': 'badge-success',\r\n 'present': 'badge-success',\r\n 'ontime': 'badge-success',\r\n 'ontimeout': 'badge-success',\r\n 'OnTimeOut': 'badge-success',\r\n 'clocked_in': 'badge-success',\r\n 'clocked in': 'badge-success',\r\n\r\n // Warning – Yellow/Amber\r\n 'contract': 'badge-warning',\r\n 'warranty': 'badge-warning',\r\n 'scheduled': 'badge-warning',\r\n 'leased': 'badge-warning',\r\n 'disposed': 'badge-warning',\r\n 'maintenance': 'badge-warning',\r\n 'assigning start': 'badge-warning',\r\n 'evaluation start': 'badge-warning',\r\n 'to be start assigning': 'badge-warning',\r\n 'pending': 'badge-warning',\r\n 'leave': 'badge-info',\r\n 'Leave': 'badge-info',\r\n 'on leave': 'badge-info',\r\n 'earlyin': 'badge-warning',\r\n 'EarlyIn': 'badge-warning',\r\n 'earlyout': 'badge-warning',\r\n 'EarlyOut': 'badge-warning',\r\n 'lateness': 'badge-warning',\r\n 'Lateness': 'badge-warning',\r\n 'onshortleave': 'badge-warning',\r\n 'OnShortLeave': 'badge-warning',\r\n\r\n // Danger – Red\r\n 'inactive': 'badge-danger',\r\n 'rejected': 'badge-danger',\r\n 'unassigned': 'badge-danger',\r\n 'trashed': 'badge-danger',\r\n 'onhold': 'badge-danger',\r\n 'assigning stop': 'badge-danger',\r\n 'evaluation stop': 'badge-danger',\r\n 'unavailable': 'badge-danger',\r\n 'move-error': 'badge-danger',\r\n 'failed': 'badge-danger',\r\n 'absent': 'badge-danger',\r\n 'Absent': 'badge-danger',\r\n 'misspunchout': 'badge-danger',\r\n 'MissPunchOut': 'badge-danger',\r\n 'lateout': 'badge-danger',\r\n 'LateOut': 'badge-danger',\r\n\r\n // Info – Blue\r\n 'insurance': 'badge-info',\r\n 'pastdue': 'badge-info',\r\n 'publicholiday': 'badge-info',\r\n 'publicHoliday': 'badge-info',\r\n 'holiday': 'badge-info',\r\n\r\n // Dark – Neutral/Other\r\n 'expired': 'badge-secondary',\r\n 'draft': 'badge-secondary',\r\n 'clocked_out': 'badge-secondary',\r\n 'clocked out': 'badge-secondary',\r\n 'block': 'badge-secondary',\r\n 'Block': 'badge-secondary'\r\n};\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CopyServiceService {\r\n\r\n constructor() { }\r\n getSelectedDataForCopy(\r\n dataSet: any[],\r\n columns: any[],\r\n rowSelectedIndexes: Set<number>,\r\n selectedCells: any[],\r\n getNestedValue: (obj: any, path: string) => any\r\n ): any[][] {\r\n const copiedRows: any[][] = [];\r\n const findRowByVirtualIndex = (vIndex: number) =>\r\n dataSet.find((r: any) => r.__virtualIndex === vIndex);\r\n if (rowSelectedIndexes && rowSelectedIndexes.size > 0) {\r\n const sortedIndexes = [...rowSelectedIndexes].sort((a, b) => a - b);\r\n for (const vIndex of sortedIndexes) {\r\n const row = findRowByVirtualIndex(vIndex);\r\n if (!row) continue;\r\n const extractValue = (field: string): string => {\r\n const nested = getNestedValue(row, field);\r\n const value =\r\n nested?.value ??\r\n nested?.name ??\r\n nested ??\r\n '-';\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map(v =>\r\n typeof v === 'object'\r\n ? (v.departmentName ?? v.roleName ?? '')\r\n : (v?.toString() ?? '')\r\n )\r\n .join(', ');\r\n }\r\n return value ?? '';\r\n };\r\n const mapped = columns.map(col => {\r\n if (col.children && Array.isArray(col.children)) {\r\n return col.children.map((c: { field: string }) => extractValue(c.field));\r\n }\r\n return [extractValue(col.field)];\r\n });\r\n const rowValues = mapped.reduce<string[]>((acc, curr) => acc.concat(curr), []);\r\n copiedRows.push(rowValues);\r\n }\r\n }\r\n if (selectedCells && selectedCells.length > 0) {\r\n const rowsMap = new Map<number, any[]>();\r\n for (const cell of selectedCells) {\r\n const row = findRowByVirtualIndex(cell.rowIndex);\r\n if (!row) continue;\r\n const col = columns[cell.colIndex];\r\n let fieldName = col?.field;\r\n if (col?.children && col.children[cell.subColIndex]) {\r\n fieldName = col.children[cell.subColIndex].field;\r\n }\r\n let value = getNestedValue(row, fieldName) || getNestedValue(row, fieldName)?.name || getNestedValue(row, fieldName) || '-';\r\n if (Array.isArray(value)) {\r\n value = value\r\n .map(v =>\r\n typeof v === 'object'\r\n ? v.departmentName ?? v.roleName ?? ''\r\n : v?.toString() ?? ''\r\n )\r\n .join(', ');\r\n } else {\r\n value = value ?? '';\r\n }\r\n if (!rowsMap.has(cell.rowIndex)) rowsMap.set(cell.rowIndex, []);\r\n rowsMap.get(cell.rowIndex)!.push(value);\r\n }\r\n const sortedCells = [...rowsMap.entries()]\r\n .sort(([a], [b]) => a - b)\r\n .map(([_, v]) => v);\r\n copiedRows.push(...sortedCells);\r\n }\r\n if (copiedRows.length === 0) {\r\n const activeCell = document.querySelector('.active-cell');\r\n if (activeCell) return [[activeCell.textContent?.trim() || '']];\r\n }\r\n\r\n const maxCols = copiedRows.reduce((max, row) => Math.max(max, row.length), 0);\r\n return copiedRows.map(row => {\r\n const newRow = [...row];\r\n while (newRow.length < maxCols) newRow.push('');\r\n return newRow;\r\n });\r\n }\r\n\r\n\r\n copyToClipboard(\r\n selectedData: any[][],\r\n selector = '.selected-cell, .active-cell, .row-selected'\r\n ): void {\r\n if (!selectedData || selectedData.length === 0) return;\r\n const textToCopy = selectedData\r\n .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\r\n .join('\\n');\r\n navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\r\n const selectedEls = document.querySelectorAll(selector);\r\n selectedEls.forEach(el => el.classList.add('flash-bg'));\r\n setTimeout(() => {\r\n selectedEls.forEach(el => el.classList.remove('flash-bg'));\r\n }, 1000);\r\n }\r\n\r\n\r\n updateRows: any[] = [];\r\n async pasteFromClipboardText(\r\n text: string,\r\n dataSet: any[],\r\n columns: any[],\r\n startRowIndex: number,\r\n startColIndex: number,\r\n startSubColIndex: number = 0\r\n ): Promise<any[]> {\r\n if (!text) return [];\r\n this.updateRows = [];\r\n const rows = text.split(/\\r?\\n/).map(r => r.split('\\t'));\r\n const flattenedColumns: any[] = [];\r\n columns.forEach(col => {\r\n if (col.children?.length) {\r\n col.children.forEach((child: any) => flattenedColumns.push({ parent: col, ...child }));\r\n } else {\r\n flattenedColumns.push(col);\r\n }\r\n });\r\n let startFlattenedIndex = 0;\r\n for (let i = 0; i < startColIndex; i++) {\r\n const col = columns[i];\r\n startFlattenedIndex += col.children?.length || 1;\r\n }\r\n const startCol = columns[startColIndex];\r\n if (startCol?.children?.length) {\r\n startFlattenedIndex += Math.min(startSubColIndex, startCol.children.length - 1);\r\n }\r\n\r\n rows.forEach((rowValues, rOffset) => {\r\n const targetRowIndex = startRowIndex + rOffset;\r\n const row = dataSet.find(r => r?.__virtualIndex === targetRowIndex);\r\n if (!row) return;\r\n\r\n rowValues.forEach((value, cOffset) => {\r\n const targetIndex = startFlattenedIndex + cOffset;\r\n if (targetIndex < 0 || targetIndex >= flattenedColumns.length) return;\r\n\r\n const targetColumn = flattenedColumns[targetIndex];\r\n this.setNestedValue(row, targetColumn, value);\r\n });\r\n });\r\n\r\n return this.updateRows;\r\n }\r\n\r\n\r\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n debugger\r\n if (column.type === 'date' || column.type === 'image') return;\r\n const path = column.field;\r\n if (!path) return;\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n const parent = keys.reduce((acc: any, key: string) => (acc[key] ??= {}), obj);\r\n if (parent && lastKey) {\r\n if (typeof option === 'object' && option !== null) {\r\n parent[lastKey] = {\r\n id: option.id ?? 1,\r\n value: option.value ?? option,\r\n };\r\n } else {\r\n parent[lastKey] = option;\r\n }\r\n }\r\n const sendObj = {\r\n data: { ...obj },\r\n eventType: 'onCellEdit',\r\n };\r\n this.updateRows.push(obj);\r\n }\r\n\r\n\r\n cutSelectedSelectedData(\r\n dataSet: any[],\r\n rowSelectedIndexes: Set<number>,\r\n selectedCells: any[],\r\n columns: any[],\r\n setNestedValue: (obj: any, column: any, value: any) => void\r\n ): any {\r\n let updatedData = [...dataSet];\r\n if (rowSelectedIndexes?.size) {\r\n const indexes = [...rowSelectedIndexes];\r\n updatedData = updatedData.filter(\r\n (row: any) => !indexes.includes(row.__virtualIndex)\r\n );\r\n // rowSelectedIndexes.clear();\r\n }\r\n else if (selectedCells?.length) {\r\n this.updateRows = [];\r\n for (const cell of selectedCells) {\r\n const row = updatedData.find(r => r.__virtualIndex === cell.rowIndex);\r\n if (!row) continue;\r\n let col = columns[cell.colIndex];\r\n if (col?.children && col.children[cell.subColIndex]) {\r\n col = col.children[cell.subColIndex];\r\n }\r\n this.setNestedValue(row, col, '');\r\n }\r\n // selectedCells.length = 0;\r\n }\r\n return {updatedData: updatedData, updatedRows: this.updateRows};\r\n }\r\n\r\n\r\n cutWithAnimation(\r\n selectedData: any[][],\r\n selector = '.selected-cell, .active-cell, .row-selected'\r\n ): void {\r\n if (!selectedData || selectedData.length === 0) return;\r\n\r\n const textToCopy = selectedData\r\n .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\r\n .join('\\n');\r\n\r\n navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\r\n\r\n // Apply red cut animation\r\n const selectedEls = document.querySelectorAll(selector);\r\n selectedEls.forEach(el => el.classList.add('cut-flash-bg'));\r\n setTimeout(() => {\r\n selectedEls.forEach(el => el.classList.remove('cut-flash-bg'));\r\n }, 1000);\r\n }\r\n\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'filter',\r\n standalone: true\r\n})\r\nexport class FilterPipe implements PipeTransform {\r\ntransform(items: any[], searchText: string, key?: string): any[] {\r\n if (!items || !searchText) return items;\r\n\r\n searchText = searchText.toLowerCase();\r\n\r\nreturn items.filter(item => {\r\n const value = key ? item?.[key] : item;\r\n return value?.toString().toLowerCase().includes(searchText);\r\n });\r\n}}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({ name: 'pinnedColumns', pure: true, standalone: true })\r\nexport class PinnedColumnsPipe implements PipeTransform {\r\n transform(columns: any[], pinned: 'left' | 'right' | null): any[] {\r\n if (!columns) return [];\r\n return columns.filter(col => col.is_visible !== false && col.pinned === pinned);\r\n }\r\n}","import { Component, Input, Output, EventEmitter, ElementRef, AfterViewInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface BadgeItem {\r\n text: string;\r\n class?: string;\r\n tooltip?: string;\r\n data?: any; // Additional data for callbacks\r\n}\r\n\r\n@Component({\r\n selector: 'app-badge-overflow',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './badge-overflow.component.html',\r\n styles: [`\r\n .badge-overflow-container {\r\n display: flex;\r\n flex-wrap: nowrap;\r\n gap: 4px;\r\n align-items: center;\r\n min-width: 0;\r\n overflow: hidden;\r\n width: 100%;\r\n }\r\n\r\n .badge {\r\n flex-shrink: 0;\r\n white-space: nowrap;\r\n font-size: 12px;\r\n padding: 4px 8px;\r\n border-radius: 50%; /* Make badges circular like circle-value */\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-weight: 600; /* Match circle-value font-weight */\r\n line-height: 1;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); /* Match circle-value transition */\r\n border: 2px solid transparent; /* Match circle-value border style */\r\n width: 32px; /* Fixed circular size */\r\n height: 32px; /* Fixed circular size */\r\n box-sizing: border-box;\r\n cursor: pointer; /* Match circle-value cursor */\r\n transform: translateZ(0); /* Hardware acceleration */\r\n will-change: transform, box-shadow, background-color;\r\n backface-visibility: hidden;\r\n color: white !important;\r\n\r\n &:hover {\r\n transform: scale(1.15) translateY(-2px); /* Match circle-value hover effect */\r\n box-shadow: 0 6px 16px rgba(0, 123, 255, 0.25); /* Match circle-value shadow */\r\n }\r\n\r\n &:active {\r\n transform: scale(1.08) translateY(-1px); /* Match circle-value active effect */\r\n transition-duration: 0.15s;\r\n }\r\n }\r\n\r\n /* Break color classes for proper badge coloring */\r\n .break-color-paid {\r\n background-color: #4CAF50 !important;\r\n border-color: #4CAF50 !important;\r\n }\r\n\r\n .break-color-unpaid {\r\n background-color: #F44336 !important;\r\n border-color: #F44336 !important;\r\n }\r\n\r\n .break-color-lunch {\r\n background-color: #2196F3 !important;\r\n border-color: #2196F3 !important;\r\n }\r\n\r\n .break-color-default {\r\n background-color: #F44336 !important;\r\n border-color: #F44336 !important;\r\n }\r\n\r\n .badge-overflow-count {\r\n background-color: #6c757d !important;\r\n color: white !important;\r\n cursor: pointer;\r\n border: 2px solid #6c757d !important; /* Match circular border style */\r\n flex-shrink: 0;\r\n border-radius: 50%; /* Make count badge circular too */\r\n width: 32px; /* Match size */\r\n height: 32px; /* Match size */\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-weight: 600; /* Match font-weight */\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); /* Match transition */\r\n transform: translateZ(0);\r\n will-change: transform, box-shadow, background-color;\r\n backface-visibility: hidden;\r\n font-size: 12px;\r\n line-height: 1;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n\r\n &:hover {\r\n background-color: #5a6268 !important;\r\n border-color: #5a6268 !important;\r\n transform: scale(1.15) translateY(-2px); /* Match hover effect */\r\n box-shadow: 0 6px 16px rgba(0, 123, 255, 0.25);\r\n }\r\n\r\n &:active {\r\n transform: scale(1.08) translateY(-1px);\r\n transition-duration: 0.15s;\r\n }\r\n }\r\n `]\r\n})\r\nexport class BadgeOverflowComponent implements AfterViewInit, OnDestroy {\r\n @Input() badges: BadgeItem[] = [];\r\n @Input() maxWidth: number = 200;\r\n @Output() badgeMouseEnter = new EventEmitter<{event: MouseEvent, badge: BadgeItem}>();\r\n @Output() badgeMouseLeave = new EventEmitter<{event: MouseEvent, badge: BadgeItem}>();\r\n @Output() overflowCountClick = new EventEmitter<{ event: MouseEvent; overflowBadges: BadgeItem[] }>();\r\n\r\n visibleBadges: BadgeItem[] = [];\r\n overflowBadges: BadgeItem[] = [];\r\n overflowCount = 0;\r\n\r\n private resizeObserver: ResizeObserver | null = null;\r\n private containerElement: HTMLElement | null = null;\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n ngAfterViewInit() {\r\n this.containerElement = this.elementRef.nativeElement.querySelector('.badge-overflow-container');\r\n this.setupResizeObserver();\r\n this.updateBadgeVisibility();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n }\r\n\r\n private setupResizeObserver() {\r\n if (!this.containerElement) return;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.updateBadgeVisibility();\r\n });\r\n\r\n // Observe the parent container for width changes\r\n const parentElement = this.elementRef.nativeElement.parentElement;\r\n if (parentElement) {\r\n this.resizeObserver.observe(parentElement);\r\n }\r\n }\r\n\r\n private updateBadgeVisibility() {\r\n if (!this.containerElement || !this.badges.length) return;\r\n\r\n const containerWidth = this.containerElement.parentElement?.clientWidth || this.maxWidth;\r\n let totalWidth = 0;\r\n const visible: BadgeItem[] = [];\r\n const overflow: BadgeItem[] = [];\r\n\r\n // Calculate width needed for each badge\r\n for (let i = 0; i < this.badges.length; i++) {\r\n const badge = this.badges[i];\r\n const badgeWidth = this.estimateBadgeWidth(badge);\r\n\r\n if (totalWidth + badgeWidth <= containerWidth || visible.length === 0) {\r\n visible.push(badge);\r\n totalWidth += badgeWidth + 4; // +4 for gap\r\n } else {\r\n overflow.push(badge);\r\n }\r\n }\r\n\r\n // If we have overflow, check if we need to show count badge\r\n if (overflow.length > 0) {\r\n const countBadgeWidth = this.estimateCountBadgeWidth(overflow.length);\r\n const lastVisibleIndex = visible.length - 1;\r\n\r\n // If adding count badge would exceed width, remove one more visible badge\r\n if (totalWidth + countBadgeWidth > containerWidth && visible.length > 1) {\r\n const removedBadge = visible.pop();\r\n if (removedBadge) {\r\n overflow.unshift(removedBadge);\r\n }\r\n }\r\n }\r\n\r\n this.visibleBadges = visible;\r\n this.overflowBadges = overflow;\r\n this.overflowCount = overflow.length;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n private estimateBadgeWidth(badge: BadgeItem): number {\r\n // Rough estimation: text length * 8px per character + padding\r\n const textWidth = badge.text.length * 8;\r\n const padding = 16; // 8px left + 8px right\r\n return textWidth + padding;\r\n }\r\n\r\n private estimateCountBadgeWidth(count: number): number {\r\n const text = `+${count}`;\r\n const textWidth = text.length * 8;\r\n const padding = 16;\r\n return textWidth + padding;\r\n }\r\n\r\n getOverflowTooltip(): string {\r\n return this.overflowBadges.map(b => b.text).join(', ');\r\n }\r\n\r\n onBadgeMouseEnter(event: MouseEvent, badge: BadgeItem) {\r\n this.badgeMouseEnter.emit({ event, badge });\r\n }\r\n\r\n onBadgeMouseLeave(event: MouseEvent, badge: BadgeItem) {\r\n this.badgeMouseLeave.emit({ event, badge });\r\n }\r\n\r\n onOverflowCountClick(event: MouseEvent) {\r\n this.overflowCountClick.emit({ event, overflowBadges: this.overflowBadges });\r\n }\r\n // In BadgeOverflowComponent\r\nrefresh() {\r\n this.updateBadgeVisibility();\r\n}\r\n}","<div class=\"badge-overflow-container\" #container>\r\n <span\r\n *ngFor=\"let badge of visibleBadges; let i = index\"\r\n class=\"badge\"\r\n [class]=\"badge.class || 'badge-secondary'\"\r\n \r\n (mouseenter)=\"onBadgeMouseEnter($event, badge)\"\r\n (mouseleave)=\"onBadgeMouseLeave($event, badge)\"\r\n >\r\n {{ badge.text }}\r\n </span>\r\n <span\r\n *ngIf=\"overflowCount > 0\"\r\n class=\"badge badge-overflow-count\"\r\n [title]=\"getOverflowTooltip()\"\r\n (click)=\"onOverflowCountClick($event)\"\r\n >\r\n +{{ overflowCount }}\r\n </span>\r\n</div>","\r\nimport {\r\n Component,\r\n OnInit,\r\n Input,\r\n Output,\r\n OnChanges,\r\n SimpleChanges,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit,\r\n HostListener,\r\n ChangeDetectorRef,\r\n EventEmitter,\r\n NgZone,\r\n ChangeDetectionStrategy,\r\n OnDestroy,\r\n inject,\r\n ViewContainerRef,\r\n ComponentRef,\r\n Injector,\r\n} from '@angular/core';\r\nimport { SplitColumnsService } from './services/split-columns.service';\r\nimport { CommonService } from './services/common.service';\r\n// import { SwapColumnsService } from './services/swap-columns.service';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { BsDatepickerModule, BsDaterangepickerDirective, BsDaterangepickerConfig } from 'ngx-bootstrap/datepicker';\r\nimport {\r\n CdkDrag,\r\n CdkDragDrop,\r\n CdkDragEnd,\r\n CdkDragEnter,\r\n CdkDragExit,\r\n CdkDragMove,\r\n CdkDragSortEvent,\r\n CdkDragStart,\r\n DragDrop,\r\n moveItemInArray,\r\n} from '@angular/cdk/drag-drop';\r\nimport {\r\n trigger,\r\n state,\r\n style,\r\n transition,\r\n animate,\r\n} from '@angular/animations';\r\nimport { CdkDropList } from '@angular/cdk/drag-drop';\r\nimport { BADGES_MAP } from './badges';\r\nimport { CopyServiceService } from './services/copy-service.service';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { InlineSVGModule } from 'ng-inline-svg';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { CommonModule, formatDate } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { FilterPipe } from './pipes/filter.pipe';\r\n// import { DraggableHeaderDirective } from './directives/draggable-header.directive';\r\nimport { PinnedColumnsPipe } from './pipes/pinned-columns.pipe';\r\nimport { DatePipe } from '@angular/common';\r\n// import { TimezoneFormatPipe } from '../../../../src/app/shared/pipes/timezone-format.pipe';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport moment from 'moment';\r\nimport { BehaviorSubject, Observable, Subject, debounceTime, throttleTime, distinctUntilChanged } from 'rxjs';\r\nimport { BadgeOverflowComponent } from './components/badge-overflow/badge-overflow.component';\r\n\r\n// Advanced caching imports for service worker - using native APIs\r\n\r\n// Lazy-loaded imports for better tree shaking\r\nlet VirtualScrollModule: any = null;\r\nlet DragDropModuleLazy: any = null;\r\nlet DatePickerModule: any = null;\r\n\r\n\r\n\r\n\r\n\r\nexport interface DateTimePrefs {\r\n timeZone: string;\r\n dateFormat: string;\r\n timeFormat: string;\r\n}\r\n\r\ninterface CellPosition {\r\n rowIndex: number;\r\n colIndex: number;\r\n subColIndex: number;\r\n field: string;\r\n key: string;\r\n}\r\n\r\ninterface PerformanceMetrics {\r\n renderTime: number;\r\n scrollTime: number;\r\n filterTime: number;\r\n sortTime: number;\r\n infiniteScrollTime: number;\r\n lastRenderStart: number;\r\n renderCount: number;\r\n}\r\n\r\n\r\n\r\n@Component({\r\n selector: 'time-sheet',\r\n templateUrl: './ms-time-sheet.component.html',\r\n styleUrls: ['./ms-time-sheet.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, InlineSVGModule, FilterPipe, PinnedColumnsPipe, DragDropModule, BsDatepickerModule, ScrollingModule, BadgeOverflowComponent, DatePipe,],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('accordionToggle', [\r\n state(\r\n 'collapsed',\r\n style({ height: '0px', overflow: 'hidden' })\r\n ),\r\n state('expanded', style({ height: '*', overflow: 'visible' })),\r\n transition('collapsed <=> expanded', animate('300ms ease-in')),\r\n ]),\r\n trigger('slideToggle', [\r\n transition(':enter', [\r\n style({ height: '0px', opacity: 0, overflow: 'hidden' }),\r\n animate('300ms ease-out', style({ height: '*', opacity: 1 }))\r\n ]),\r\n transition(':leave', [\r\n style({ height: '*', opacity: 1, overflow: 'hidden' }),\r\n animate('300ms ease-in', style({ height: '0px', opacity: 0 }))\r\n ])\r\n ]),\r\n trigger('slideUp', [\r\n state('void', style({ transform: 'translateY(100%)', opacity: 0 })),\r\n state('*', style({ transform: 'translateY(0)', opacity: 1 })),\r\n transition('void => *', animate('300ms ease-out')),\r\n transition('* => void', animate('300ms ease-in')),\r\n ])\r\n ],\r\n})\r\n\r\nexport class TimeSheetComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\r\n\r\n // **************************************//\r\n // ********** Input Goes Here *********** //\r\n // **************************************//\r\n // **************************************//\r\n // Add a new property to track expanded rows\r\n expandedRows: Set<string> = new Set();\r\n@Output() onShortBreakClick = new EventEmitter<any>();\r\n@Output() searchEvent = new EventEmitter<any>();\r\n// Advanced Performance Optimizations\r\nprivate scrollSubject = new Subject<number>();\r\nprivate filterSubject = new Subject<any[]>();\r\nprivate dataSubject = new BehaviorSubject<any[]>([]);\r\nprivate viewportResizeSubject = new Subject<void>();\r\nprivate destroy$ = new Subject<void>();\r\n\r\n// Prevent multiple initial API calls\r\nprivate hasEmittedInitialDate = false;\r\n\r\n // Enhanced caching system\r\n private dataCache = new Map<string, { data: any; timestamp: number; ttl: number }>();\r\n private computationCache = new Map<string, { result: any; timestamp: number }>();\r\n private domCache = new Map<string, HTMLElement>();\r\n\r\n // Advanced Virtual scrolling optimizations\r\n private virtualScrollBuffer = 20;\r\n private maxRenderedItems = 100;\r\n private itemHeightCache = new Map<string, number>();\r\n private dynamicItemHeights = new Map<number, number>();\r\n private averageItemHeight = 44; // Default row height\r\n private heightCalculationSamples = 10;\r\n private viewportHeight = 0;\r\n private scrollDirection: 'up' | 'down' | 'none' = 'none';\r\n private lastScrollTop = 0;\r\n private scrollVelocity = 0;\r\n private scrollAcceleration = 0;\r\n\r\n // Infinite scroll optimizations\r\n private dataLoadQueue: any[] = [];\r\n private isLoadingData = false;\r\n private lastScrollPosition = 0;\r\n\r\n // Memory management\r\n private componentRefs = new Set<ComponentRef<any>>();\r\n private eventListeners = new Map<string, EventListener>();\r\n private resizeObservers = new Set<ResizeObserver>();\r\n private timeouts = new Set<number>();\r\n private intervals = new Set<number>();\r\n// For Short Break Tooltip\r\nhideShortBreakTooltip() {\r\n this.currentShortBreakTooltip = null;\r\n}\r\n // Viewport-based lazy loading\r\n private intersectionObserver: IntersectionObserver | null = null;\r\n private lazyLoadCallbacks = new Map<string, () => void>();\r\n private viewportElements = new WeakMap<Element, boolean>();\r\n\r\n // Pagination Config Store Here\r\n @Input() paginationConfig: any = {};\r\n\r\n // The dataset store here;\r\n @Input() dataSet: any[] = [];\r\n // The columns Store Here\r\n @Input() columns: any[] = [];\r\n\r\n // Row Height;\r\n @Input() rowHeight: number = 44;\r\n\r\n // Header Row Height;\r\n @Input() headerRowHeight: number = 44;\r\n\r\n // Show Vertical Borders;\r\n @Input() showVerticalBorder: boolean = true;\r\n\r\n // Even Rows Background Color;\r\n @Input() evenRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Even Rows Background Color;\r\n @Input() oddRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Header Rows Background Color;\r\n @Input() headerBackgroundColor: string = '#eaeaea';\r\n\r\n // Header Rows Background Color;\r\n @Input() checkboxesBackgroundColor: string = '#eaeaea';\r\n\r\n // Show Columns Grouping;\r\n @Input() showColumnsGrouping: boolean = false;\r\n\r\n // Row Hovered Background color;\r\n @Input() rowHoverColor: string | undefined = 'rgba(0, 123, 255, 0.1)';\r\n\r\n // Left PinnedBackground color;\r\n @Input() leftPinnedBackgroundColor: string | undefined = '#000';\r\n\r\n // Body Background color;\r\n @Input() bodyBackgroundColor: string | undefined = '#fff';\r\n\r\n // Right Pinned Background color;\r\n @Input() rightPinnedBackgroundColor: string | undefined = '#000';\r\n\r\n // Side Menu Background color;\r\n @Input() sidemenuBackgroundColor: string | undefined = '#000';\r\n\r\n // Body text color;\r\n @Input() bodyTextColor: string | undefined = '#000';\r\n\r\n // Header text color;\r\n @Input() headerTextColor: string | undefined = '#000';\r\n\r\n // Header text size;\r\n @Input() headerTextFontsSize: number | undefined = 16;\r\n\r\n // Body text color;\r\n @Input() bodyTextFontsSize: number | undefined = 16;\r\n\r\n // Header font weight;\r\n @Input() headerFontWeight: number | undefined = 500;\r\n\r\n // Body Font Weight;\r\n @Input() bodyFontWeight: number | undefined = 400;\r\n\r\n // Checked Row Background Color;\r\n @Input() checkedRowBackgroundColor: string | undefined = '';\r\n\r\n // dropdowns Background Color;\r\n @Input() dropdownsBackgroundColor: string | undefined = '';\r\n\r\n // Footer row Height;\r\n @Input() footerRowHeight: number = 46;\r\n\r\n // Footer row Height;\r\n @Input() topGroupedBadgesBackgroundColor: string | undefined = '';\r\n\r\n // Show Row wise grouping;\r\n @Input() showRowsGrouping: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() showFilterRow: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() fontFaimly: string | undefined = 'sans-serif';\r\n\r\n // Show SideColumn;\r\n @Input() showSideMenu: boolean = false;\r\n\r\n // Footer Padding\r\n @Input() footerPadding: number = 3\r\n\r\n\r\n // Footer Padding\r\n @Input() topFilterRowHeight: number = 50;\r\n\r\n // Show Rows shading\r\n @Input() rowShadingEnabled: boolean = false;\r\n\r\n // Show Rows shading\r\n @Input() showSerialNumber: boolean = false;\r\n\r\n // Enable export functionality\r\n @Input() enableExport: boolean = false;\r\n\r\n // Single Spa Url Attach to icons\r\n @Input() singleSpaAssetsPath: string = 'assets/';\r\n\r\n\r\n // Applied Filters\r\n @Input() filtersConfig: any[] = [];\r\n\r\n\r\n // Applied Filters\r\n @Input() loading: boolean = false;\r\n\r\n //Vertical Scrollbar style\r\n @Input() verticalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n //Horizintal Scrollbar style\r\n @Input() horizintalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n // Show Cell details box\r\n @Input() showCellDetailsBox: boolean = false;\r\n\r\n //Date format\r\n\r\n @Input() dateFormat: string = 'dd/MM/yyyy'\r\n\r\n //Date format\r\n @Input() tableSearch: string = '';\r\n\r\n\r\n //Date format\r\n @Input() actions: any[] = [];\r\n\r\n\r\n // Table Config for paginations is here\r\n @Input() config: any;\r\n\r\n\r\n // Selection task bar\r\n @Input() showTaskbar = false\r\n\r\n // Table Name for state manage\r\n @Input() tableName = true\r\n\r\n\r\n // Listing type\r\n @Input() listingType: string | boolean = '';\r\n\r\n // Listing type\r\n\r\n @Input() checkboxState: { reset: boolean } = {\r\n reset: true\r\n }\r\n\r\n // Taskbar actions\r\n @Input() taskbarActions: any[] = []\r\n\r\n\r\n // Sorting Config to show sort icons\r\n @Input() sortingConfig: { field: string, order_by: string } | null = null;\r\n\r\n\r\n @Input() set tableFilterViewId(value: any) {\r\n this._tableFilterViewId = value;\r\n this.cdr.markForCheck();\r\n }\r\n get tableFilterViewId(): any {\r\n return this._tableFilterViewId;\r\n }\r\n private _tableFilterViewId: any = '';\r\n\r\n\r\n @Input() selectedTableLayout: any = 'medium'\r\n\r\n @Input() selectedPresetId: any;\r\n\r\n @Input() closeDropdown: { preset: { closed: boolean, loading: boolean } } = { preset: { closed: false, loading: false } };\r\n\r\n // Table View\r\n\r\n // GlobalSearch\r\n @Input() globalSearchText: string = '';\r\n\r\n// Nested Table Row Fontsize\r\n @Input() nestedTablerowFontsize = 14;\r\n\r\n // Nested table row Header row Height\r\n @Input() nestedTableHeaderRowHeight = 40;\r\n\r\n // Nested Table row height\r\n @Input() nestedTablerowHeight = 36;\r\n\r\n\r\n @Input() gridType: string = 'TimeSheet';\r\n\r\n @Input() isSingleDay: boolean = false;\r\n\r\n @Input() leftPinnedBoxshadow: string = '#4b4b4b 1px 1px 5px 0px';\r\n\r\n @Input() rightPinnedBoxshadow: string = '#4b4b4b 4px 1px 6px 0px';\r\n\r\n // Conditional styling inputs\r\n @Input() enableAccordionShadow: boolean = false;\r\n @Input() enableAccordionSeparators: boolean = false;\r\n @Input() enableRowShading: boolean = false;\r\n\r\n // GlobalSearch\r\n @Input() selectedRowsBackgroundColor: string = '#8ac5ff';\r\n\r\n // GlobalSearch\r\n @Input() nestedTableHeaderBAckgroundColor: string = '#eaeaea';\r\n\r\n @Input() tableView: any[] = [];\r\n\r\n\r\n @Input() columnThreedotsMunuConfig = {\r\n showPinleft: true,\r\n showPinright: true,\r\n showAscending: true,\r\n showDescending: true,\r\n showFilter: true,\r\n showRowsGrouping: this.showRowsGrouping,\r\n showAutosizeAllColumns: true,\r\n showAutosizeThisColumn: true,\r\n showChoseColumns: true,\r\n showResetColumns: true,\r\n\r\n\r\n };\r\n\r\n @Input() timezonePrefs: any;\r\n prefs!: DateTimePrefs\r\n\r\n // Action buttons configuration\r\n // buttons: any[] = [];\r\n shouldShowButton(condition: string | null): boolean {\r\n if (!condition) return true;\r\n if (condition === 'isSingleDay') return this.isSingleDay;\r\n if (condition === '!isSingleDay') return !this.isSingleDay;\r\n return true;\r\n}\r\n\r\n getButtonPermission(button: any): boolean {\r\n if (typeof button.has_permission === 'function') {\r\n return button.has_permission();\r\n }\r\n return button.has_permission;\r\n }\r\n\r\n // Progressive loading for large datasets\r\n @Input() enableProgressiveLoading = false;\r\n @Input() progressiveChunkSize = 100;\r\n @Input() progressiveDelay = 50; // ms between chunks\r\n private progressiveLoadingChunks: any[][] = [];\r\n private progressiveLoadingIndex = 0;\r\n private isProgressiveLoading = false;\r\n\r\n // Infinite scroll inputs/outputs\r\n @Input() enableInfiniteScroll = false;\r\n @Input() hasMoreData = true;\r\n @Input() loadingMore = false;\r\n @Output() loadMoreData = new EventEmitter<void>();\r\n\r\n\r\n\r\n\r\n\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n // Out Put Events\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n //Change Table Layout\r\n @Output() public changeLayout = new EventEmitter<any>();\r\n\r\n // Filter Apply event;\r\n @Output() public filterOptions = new EventEmitter<any>();\r\n\r\n // Filter cleared event with flag\r\n @Output() public filterCleared = new EventEmitter<boolean>();\r\n\r\n @Output() genericEvent: EventEmitter<any> = new EventEmitter();\r\n\r\n @Output() tablePresetConfig: EventEmitter<any> = new EventEmitter();\r\n\r\n @Output() sortingOrderOptions: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n @Output() createUpdateConfigListing: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n\r\n\r\n// Tooltip state\r\ncurrentBreakTooltip: any = null;\r\ncurrentShortBreakTooltip: any = null;\r\ncurrentOverflowBreakTooltip: any[] = [];\r\ntooltipPosition = { x: 0, y: 0 };\r\nmanualLogsTooltipVisible: boolean = false;\r\nmanualLogsTooltipPosition = { x: 0, y: 0 };\r\ncurrentManualLogs: any[] = [];\r\nnoShortLeaveDetail: any = null;\r\nnoShortLeaveLeft: any = null;\r\nmanualLogsMoused: boolean = false;\r\nshowShortLeaveTooltipModal: boolean = false;\r\nshortLeaveTooltipPosition = { x: 0, y: 0 };\r\ncurrentShortLeaveData: any[] = [];\r\nshortLeaveTooltipMoused: boolean = false;\r\noverflowBreakTooltipVisible: boolean = false;\r\noverflowBreakTooltipPosition = { x: 0, y: 0 };\r\n\r\n// Tooltip performance optimization\r\nprivate tooltipShowTimeout: any = null;\r\nprivate tooltipHideTimeout: any = null;\r\n\r\nshowBreakTooltip(event: MouseEvent, breakItem: any) {\r\n // Clear any pending hide timeout\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Debounce show tooltip to prevent rapid firing\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n }\r\n\r\n this.tooltipShowTimeout = setTimeout(() => {\r\n this.currentBreakTooltip = breakItem;\r\n this.currentShortBreakTooltip = null;\r\n this.setPosition(event);\r\n this.tooltipShowTimeout = null;\r\n }, 50); // Small delay for smooth experience\r\n}\r\n\r\nshowShortBreakTooltip(event: MouseEvent, shortBreak: any, type?: string) {\r\n // Clear any pending hide timeout\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Debounce show tooltip to prevent rapid firing\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n }\r\n\r\n this.tooltipShowTimeout = setTimeout(() => {\r\n this.currentShortBreakTooltip = shortBreak;\r\n this.currentBreakTooltip = null;\r\n this.setPosition(event);\r\n this.tooltipShowTimeout = null;\r\n }, 50); // Small delay for smooth experience\r\n}\r\n\r\nsetPosition(event: MouseEvent) {\r\n this.tooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n}\r\n\r\nhideBreakTooltip() {\r\n // Clear any pending show timeout\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n this.tooltipShowTimeout = null;\r\n }\r\n\r\n // Debounce hide tooltip to prevent flickering\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n }\r\n\r\n this.tooltipHideTimeout = setTimeout(() => {\r\n this.currentBreakTooltip = null;\r\n this.tooltipHideTimeout = null;\r\n }, 150); // Longer delay to prevent accidental hiding\r\n}\r\n\r\nshowOverflowBreakTooltip(event: MouseEvent, overflowBadges: any[]) {\r\n // Clear any pending hide timeout\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Debounce show tooltip to prevent rapid firing\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n }\r\n\r\n this.tooltipShowTimeout = setTimeout(() => {\r\n this.currentOverflowBreakTooltip = overflowBadges;\r\n this.overflowBreakTooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n this.overflowBreakTooltipVisible = true;\r\n this.tooltipShowTimeout = null;\r\n }, 50); // Small delay for smooth experience\r\n}\r\n\r\nhideOverflowBreakTooltip() {\r\n // Clear any pending show timeout\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n this.tooltipShowTimeout = null;\r\n }\r\n\r\n // Debounce hide tooltip to prevent flickering\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n }\r\n\r\n this.tooltipHideTimeout = setTimeout(() => {\r\n this.overflowBreakTooltipVisible = false;\r\n this.currentOverflowBreakTooltip = [];\r\n this.tooltipHideTimeout = null;\r\n }, 150); // Longer delay to prevent accidental hiding\r\n}\r\n\r\ngetBreakTooltip(breakItem: any): string {\r\n if (!breakItem) return '';\r\n return `Break: ${breakItem.break_duration || 0} minutes`;\r\n}\r\n\r\nhasManualLogs(row: any): boolean {\r\n return row && row.manually_logs && Array.isArray(row.manually_logs) && row.manually_logs.length > 0;\r\n}\r\n\r\npreventManualLogsTooltipHide() {\r\n this.manualLogsMoused = true;\r\n}\r\n\r\n// showShortLeaveTooltip(event: MouseEvent, row: any) {\r\n// if (row?.short_leave?.length > 0) {\r\n// this.currentShortLeaveData = row?.short_leave;\r\n// this.shortLeaveTooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n// this.shortLeaveTooltipMoused = true;\r\n// this.showShortLeaveTooltipModal = true;\r\n// this.cdr.markForCheck();\r\n// }\r\n// }\r\n\r\n// hideShortLeaveTooltip() {\r\n// this.shortLeaveTooltipMoused = false;\r\n// setTimeout(() => {\r\n// if (!this.shortLeaveTooltipMoused) {\r\n// this.showShortLeaveTooltipModal = false;\r\n// this.currentShortLeaveData = [];\r\n// this.cdr.markForCheck();\r\n// }\r\n// }, 500);\r\n// }\r\n\r\n// preventShortLeaveTooltipHide() {\r\n// this.shortLeaveTooltipMoused = true;\r\n// }\r\n\r\ngetBreakColor(type: string): string {\r\n switch (type?.toLowerCase()) {\r\n case 'paid': return '#4CAF50';\r\n case 'unpaid': return '#F44336';\r\n case 'lunch': return '#2196F3';\r\n default: return '#F44336';\r\n }\r\n}\r\n\r\ngetBreakColorClass(type: string): string {\r\n switch (type?.toLowerCase()) {\r\n case 'paid': return 'break-color-paid';\r\n case 'unpaid': return 'break-color-unpaid';\r\n case 'lunch': return 'break-color-lunch';\r\n default: return 'break-color-default';\r\n }\r\n}\r\n\r\ngetBreakBadges(breaks: any[]): any[] {\r\n if (!Array.isArray(breaks)) return [];\r\n return breaks.map(breakItem => ({\r\n text: `${breakItem.break_duration}m`,\r\n class: this.getBreakColorClass(breakItem.break_type?.data_value_name || breakItem.breakType),\r\n tooltip: `Break: ${breakItem.break_duration || 0} minutes`,\r\n data: breakItem // Include full break item data for tooltip\r\n }));\r\n}\r\n\r\n\r\n\r\n groupedColumns: any[] = [];\r\n activeCol: any = null;\r\n activeFilterCell: any = null;\r\n showActionsDropDown = false;\r\n sideMenuVisible = false;\r\n pivotMode: boolean = false;\r\n\r\n columnSearch: string = '';\r\n expandAllAccordians = true;\r\n currentOpenedSideMenue: 'cols' | 'filtrs' | null = null;\r\n\r\n // Global detail sort properties\r\n detailSortField: string | null = null;\r\n detailSortOrder: 'asc' | 'desc' | null = null;\r\n\r\n originalColumns: any[] = [];\r\n originalDataSet: any[] = [];\r\n activeTopButton: string | null = '';\r\n filterColumnsList: any[] = [];\r\n groupBoxPadding = 200;\r\n presetName: string = '';\r\n presetFilter: any = '';\r\n searchTextPresetTable = '';\r\n addFilterColumnInput = '';\r\n searchInDropdown = '';\r\n addFilterDropdownSearch = ''\r\n topShowHideColumns = '';\r\n choseColumnsSearch = ''\r\n editinDropdownSearch = '';\r\n isThreeDotsFilterOpen = false;\r\n confirmDelete = false;\r\n subMenueOpendField = ''\r\n openDropdownId: string | null = null;\r\n fontFamilies: string[] = [\r\n // Common Excel fonts\r\n 'Arial',\r\n 'Arial Black',\r\n 'Bahnschrift',\r\n 'Calibri',\r\n 'Cambria',\r\n 'Cambria Math',\r\n 'math',\r\n 'Candara',\r\n 'Comic Sans MS',\r\n 'Consolas',\r\n 'Constantia',\r\n 'Corbel',\r\n 'Courier New',\r\n 'Ebrima',\r\n 'Franklin Gothic Medium',\r\n 'Gabriola',\r\n 'Gadugi',\r\n 'Georgia',\r\n 'Impact',\r\n 'Ink Free',\r\n 'Javanese Text',\r\n 'Leelawadee UI',\r\n 'Lucida Console',\r\n 'Lucida Sans Unicode',\r\n 'Malgun Gothic',\r\n 'Microsoft Himalaya',\r\n 'Microsoft JhengHei',\r\n 'Microsoft New Tai Lue',\r\n 'Microsoft PhagsPa',\r\n 'Microsoft Sans Serif',\r\n 'Microsoft Tai Le',\r\n 'Microsoft YaHei',\r\n 'Microsoft Yi Baiti',\r\n 'Mongolian Baiti',\r\n 'MS Gothic',\r\n 'MS PGothic',\r\n 'MS UI Gothic',\r\n 'MV Boli',\r\n 'Nirmala UI',\r\n 'Palatino Linotype',\r\n 'Segoe Print',\r\n 'Segoe Script',\r\n 'Segoe UI',\r\n 'Segoe UI Historic',\r\n 'Segoe UI Emoji',\r\n 'Segoe UI Symbol',\r\n 'SimSun',\r\n 'Sitka Small',\r\n 'Sylfaen',\r\n 'Symbol',\r\n 'Tahoma',\r\n 'Times New Roman',\r\n 'Trebuchet MS',\r\n 'Verdana',\r\n 'Webdings',\r\n 'Wingdings',\r\n 'Yu Gothic',\r\n 'sans-serif',\r\n 'serif',\r\n 'monospace',\r\n 'Inter'\r\n ];\r\n\r\n fontSizes: string[] = [\r\n '8', '9', '10', '11', '12', '14', '16', '18', '20', '24', '28', '32'\r\n ];\r\n\r\n\r\n\r\n\r\n // Use Angular's inject function for better tree shaking\r\n private columnService = inject(SplitColumnsService);\r\n private cdr = inject(ChangeDetectorRef);\r\n public commonSevice = inject(CommonService);\r\n private elementRef = inject(ElementRef);\r\n private ngZone = inject(NgZone);\r\n private copyService = inject(CopyServiceService);\r\n // private timeSheetService = inject(MsTimeSheetService);\r\n\r\n // Remove characters array for status transformation\r\n removeCharacters = [\r\n {\r\n find: '_',\r\n replace: ' '\r\n },\r\n {\r\n find: '-',\r\n replace: ' '\r\n }\r\n ];\r\n\r\n\r\n // Method to transform status strings\r\n transformStatus(status: string): string {\r\n if (!status) return status;\r\n let result = status;\r\n this.removeCharacters.forEach(item => {\r\n result = result.replace(new RegExp(item.find, 'g'), item.replace);\r\n });\r\n // Insert spaces before capital letters (for camelCase)\r\n result = result.replace(/([a-z])([A-Z])/g, '$1 $2');\r\n // Capitalize first letter of each word\r\n return result.replace(/\\b\\w/g, l => l.toUpperCase());\r\n }\r\n\r\n constructor(private injector: Injector, private vcr: ViewContainerRef, private commonService : CommonService ) {\r\n // Constructor is now empty - dependencies injected above\r\n // This enables better tree shaking as the injector can eliminate unused dependencies\r\n\r\n // Initialize reactive streams for performance optimization\r\n this.initializeReactiveStreams();\r\n\r\n // Lazy load heavy modules based on usage\r\n this.initializeLazyModules();\r\n }\r\n\r\n // Inject DatePipe for formatting\r\n private datePipe = inject(DatePipe);\r\n\r\n\r\n ngOnInit(): void {\r\n this.prefs = this.commonService.formatDateTimeWithPrefs();\r\n this.tableFilterViewId = this.selectedPresetId;\r\n // Initialize action buttons\r\n // this.initializeButtons();\r\n\r\n // Prevent multiple initial API calls on refresh/navigation\r\n if (this.hasEmittedInitialDate) {\r\n return;\r\n }\r\n\r\n // Set default date range to current date\r\n const today = new Date();\r\n this.bsRangeValue = [today, today];\r\n this.isDefaultDateRange = true; // Mark as default\r\n\r\n // Emit default date event to send to API\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: this.bsRangeValue,\r\n isSingleDay: true\r\n }\r\n };\r\n this.genericEvent.emit(eventData);\r\n\r\n // Mark as emitted to prevent duplicate calls\r\n this.hasEmittedInitialDate = true;\r\n\r\n // Modify actions to include calendar and clear buttons\r\n if (this.actions) {\r\n const emailIndex = this.actions.findIndex(button => button.name === 'Email');\r\n if (emailIndex !== -1) {\r\n this.actions[emailIndex] = {\r\n name: 'Calendar',\r\n iconPath: '',\r\n has_permission: true,\r\n is_showIcon: true,\r\n condition: null\r\n };\r\n this.actions.splice(emailIndex + 1, 0, {\r\n name: 'Clear',\r\n iconPath: '',\r\n has_permission: true,\r\n is_showIcon: true,\r\n condition: null\r\n });\r\n }\r\n }\r\n\r\n // Apply theme from backend config if provided, otherwise use default theme\r\n // Theme functionality removed\r\n\r\n // // Subscribe to loading state from service\r\n // this.timeSheetService.loading$.subscribe(loading => {\r\n // this.loading = loading;\r\n // this.cdr.markForCheck();\r\n // });\r\n }\r\n\r\n // private initializeButtons(): void {\r\n // this.buttons = [\r\n // {\r\n // name: 'Email',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/New/smsIcon.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Add Attendance',\r\n // iconPath: this.singleSpaAssetsPath + 'data-grid/icons/plus.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Back Pay',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/back pay.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Grand Total',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/grandtotal.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Print',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/New/printIcon.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Export',\r\n // iconPath: '../../../../assets/media/icons/techbar/general/export.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: '!isSingleDay'\r\n // },\r\n // {\r\n // name: 'Export Daily Timesheet',\r\n // iconPath: '../../../../assets/media/icons/techbar/general/export.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: 'isSingleDay'\r\n // }\r\n // ];\r\n // }\r\n\r\n private async initializeLazyModules(): Promise<void> {\r\n // Lazy load virtual scrolling module only when needed\r\n if (this.enableInfiniteScroll || this.dataSet.length > 100) {\r\n if (!VirtualScrollModule) {\r\n VirtualScrollModule = await import('@angular/cdk/scrolling');\r\n }\r\n }\r\n\r\n // Lazy load drag-drop module only when drag operations are enabled\r\n if (this.columns.some(col => col.is_draggable)) {\r\n if (!DragDropModuleLazy) {\r\n DragDropModuleLazy = await import('@angular/cdk/drag-drop');\r\n }\r\n }\r\n\r\n // Lazy load date picker module only when date columns exist\r\n if (this.columns.some(col => col.type === 'date')) {\r\n if (!DatePickerModule) {\r\n DatePickerModule = await import('ngx-bootstrap/datepicker');\r\n }\r\n }\r\n }\r\n\r\n private initializeReactiveStreams(): void {\r\n // Throttled scroll handling\r\n this.scrollSubject.pipe(\r\n throttleTime(16), // ~60fps\r\n distinctUntilChanged()\r\n ).subscribe(scrollTop => {\r\n this.handleOptimizedScroll(scrollTop);\r\n });\r\n\r\n // Debounced filter handling\r\n this.filterSubject.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged()\r\n ).subscribe(filters => {\r\n this.handleOptimizedFilter(filters);\r\n });\r\n\r\n // Viewport resize handling\r\n this.viewportResizeSubject.pipe(\r\n throttleTime(100)\r\n ).subscribe(() => {\r\n this.handleViewportResize();\r\n });\r\n }\r\n\r\n @ViewChild('cellText', { static: false }) cellText!: ElementRef;\r\n async ngAfterViewInit() {\r\n this.startPerformanceTimer('renderTime');\r\n\r\n // Use requestAnimationFrame for better performance\r\n requestAnimationFrame(async () => {\r\n // Initialize efficient data structures\r\n this.initializeDataStructures();\r\n\r\n await this.SetColumnsDefaultWidth();\r\n await this.refreshHeaders();\r\n this.updateFlattenedData();\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n\r\n // Setup optimized resize observer\r\n if (this.cellText) {\r\n const observer = new ResizeObserver(() => {\r\n this.ngZone.run(() => {\r\n this.viewportResizeSubject.next();\r\n });\r\n });\r\n observer.observe(this.cellText.nativeElement);\r\n this.resizeObservers.add(observer);\r\n }\r\n\r\n // Setup scroll listeners with optimization\r\n this.setupOptimizedScrollListeners();\r\n \r\n // Initialize viewport-based lazy loading\r\n this.initializeViewportLazyLoading();\r\n \r\n // Initialize advanced service worker caching\r\n this.initializeServiceWorkerCaching();\r\n \r\n this.endPerformanceTimer('renderTime');\r\n });\r\n }\r\n\r\n private setupOptimizedScrollListeners(): void {\r\n if (this.mainScroll?.nativeElement) {\r\n const scrollHandler = (event: Event) => {\r\n const scrollTop = (event.target as HTMLElement).scrollTop;\r\n this.updateScrollMetrics(scrollTop);\r\n this.scrollSubject.next(scrollTop);\r\n };\r\n\r\n this.mainScroll.nativeElement.addEventListener('scroll', scrollHandler, { passive: true });\r\n this.eventListeners.set('mainScroll', scrollHandler);\r\n }\r\n }\r\n\r\n private updateScrollMetrics(scrollTop: number): void {\r\n const now = performance.now();\r\n const deltaTime = now - (this.lastScrollTime || now);\r\n this.lastScrollTime = now;\r\n\r\n const deltaScroll = scrollTop - this.lastScrollTop;\r\n this.scrollVelocity = deltaScroll / deltaTime;\r\n this.scrollAcceleration = (this.scrollVelocity - (this.previousVelocity || 0)) / deltaTime;\r\n this.previousVelocity = this.scrollVelocity;\r\n\r\n // Determine scroll direction\r\n if (deltaScroll > 5) {\r\n this.scrollDirection = 'down';\r\n } else if (deltaScroll < -5) {\r\n this.scrollDirection = 'up';\r\n } else {\r\n this.scrollDirection = 'none';\r\n }\r\n\r\n this.lastScrollTop = scrollTop;\r\n }\r\n\r\n private lastScrollTime = 0;\r\n private previousVelocity = 0;\r\n\r\n private handleOptimizedScroll(scrollTop: number): void {\r\n this.expandedCells.clear();\r\n\r\n if (this.groupedColumns?.length > 0) {\r\n this.startIndex = 0;\r\n this.scheduleAnimationFrame(() => this.cdr.markForCheck());\r\n return;\r\n }\r\n\r\n // If dataset is small (<=1000 items), show all data without virtual scrolling\r\n if (this.flattenedData.length <= 1000) {\r\n this.visibleRows = this.flattenedData.slice();\r\n this.translateY = 0;\r\n this.startIndex = 0;\r\n this.scheduleAnimationFrame(() => this.cdr.markForCheck());\r\n return;\r\n }\r\n\r\n // Dynamic item height estimation with caching\r\n this.updateItemHeightEstimations();\r\n\r\n // Adaptive overscan based on scroll velocity\r\n const adaptiveOverscan = this.calculateAdaptiveOverscan();\r\n const newStartIndex = this.calculateStartIndex(scrollTop);\r\n const start = Math.max(0, newStartIndex - adaptiveOverscan);\r\n const end = Math.min(this.flattenedData.length, newStartIndex + this.viewportRows + adaptiveOverscan);\r\n\r\n // Only update if there's a significant change or direction change\r\n if (Math.abs(this.startIndex - start) > 3 || this.scrollDirection !== this.previousScrollDirection) {\r\n this.translateY = this.calculateTranslateY(start);\r\n this.startIndex = start;\r\n this.visibleRows = this.flattenedData.slice(start, end);\r\n this.previousScrollDirection = this.scrollDirection;\r\n\r\n // Use animation frame for smooth updates\r\n this.scheduleAnimationFrame(() => this.cdr.markForCheck());\r\n }\r\n\r\n // Advanced infinite scroll with prefetching\r\n this.handleAdvancedInfiniteScroll(scrollTop);\r\n\r\n // Force recalculation when accordion state changes\r\n if (this.hasAccordionStateChanged()) {\r\n this.updateVisibleRowsOptimized(scrollTop);\r\n }\r\n }\r\n\r\n private updateItemHeightEstimations(): void {\r\n if (this.dynamicItemHeights.size < this.heightCalculationSamples) {\r\n // Sample actual heights from rendered items\r\n const rows = this.mainScroll?.nativeElement?.querySelectorAll('.data-row');\r\n if (rows) {\r\n rows.forEach((row, index) => {\r\n const height = (row as HTMLElement).offsetHeight;\r\n if (height > 0) {\r\n this.dynamicItemHeights.set(this.startIndex + index, height);\r\n }\r\n });\r\n }\r\n\r\n // Calculate average height\r\n if (this.dynamicItemHeights.size > 0) {\r\n const heights = Array.from(this.dynamicItemHeights.values());\r\n this.averageItemHeight = heights.reduce((sum, h) => sum + h, 0) / heights.length;\r\n }\r\n }\r\n }\r\n\r\n private calculateAdaptiveOverscan(): number {\r\n // Increase overscan during fast scrolling\r\n const baseOverscan = this.virtualScrollBuffer;\r\n const velocityMultiplier = Math.min(Math.abs(this.scrollVelocity) * 100, 2);\r\n return Math.floor(baseOverscan * (1 + velocityMultiplier));\r\n }\r\n\r\n private calculateStartIndex(scrollTop: number): number {\r\n // Use dynamic height estimation for more accurate positioning\r\n let totalHeight = 0;\r\n let index = 0;\r\n\r\n for (let i = 0; i < this.flattenedData.length; i++) {\r\n const row = this.flattenedData[i];\r\n let itemHeight: number;\r\n\r\n if (row && row.isDetailsExpand) {\r\n // For expanded rows, use the actual accordion height\r\n itemHeight = this.getAccordionRowHeight(row);\r\n } else {\r\n itemHeight = this.dynamicItemHeights.get(i) || this.averageItemHeight;\r\n }\r\n\r\n if (totalHeight + itemHeight > scrollTop) {\r\n index = i;\r\n break;\r\n }\r\n totalHeight += itemHeight;\r\n }\r\n\r\n return index;\r\n }\r\n\r\n private calculateTranslateY(startIndex: number): number {\r\n let translateY = 0;\r\n for (let i = 0; i < startIndex; i++) {\r\n const row = this.flattenedData[i];\r\n if (row && row.isDetailsExpand) {\r\n // For expanded rows, use the actual accordion height\r\n const accordionHeight = this.getAccordionRowHeight(row);\r\n translateY += accordionHeight;\r\n } else {\r\n translateY += this.dynamicItemHeights.get(i) || this.averageItemHeight;\r\n }\r\n }\r\n return translateY;\r\n }\r\n\r\n private previousScrollDirection: 'up' | 'down' | 'none' = 'none';\r\n\r\n private handleAdvancedInfiniteScroll(scrollTop: number): void {\r\n if (!this.enableInfiniteScroll || this.isLoadingData || !this.hasMoreData) return;\r\n\r\n const el = this.mainScroll.nativeElement;\r\n const viewportHeight = el.clientHeight;\r\n const contentHeight = el.scrollHeight;\r\n const scrollProgress = scrollTop / (contentHeight - viewportHeight);\r\n\r\n // Dynamic thresholds based on scroll velocity\r\n const velocityMultiplier = Math.min(Math.abs(this.scrollVelocity) * 50, 0.3);\r\n const prefetchThreshold = Math.max(0.5, 0.7 - velocityMultiplier); // Earlier prefetch during fast scrolling\r\n const loadThreshold = Math.max(0.8, 0.9 - velocityMultiplier); // Earlier loading during fast scrolling\r\n\r\n if (scrollProgress >= loadThreshold) {\r\n this.loadMoreDataOptimized();\r\n } else if (scrollProgress >= prefetchThreshold && !this.isPrefetching) {\r\n this.prefetchData();\r\n }\r\n\r\n // Adaptive data windowing based on scroll position\r\n this.adaptiveDataWindowing(scrollTop, contentHeight);\r\n }\r\n\r\n private adaptiveDataWindowing(scrollTop: number, contentHeight: number): void {\r\n // Adjust data window size based on scroll position and velocity\r\n const scrollProgress = scrollTop / contentHeight;\r\n const velocity = Math.abs(this.scrollVelocity);\r\n\r\n // Increase window size during fast scrolling near the end\r\n if (scrollProgress > 0.8 && velocity > 2) {\r\n this.maxRenderedItems = Math.min(200, this.maxRenderedItems + 50);\r\n } else if (scrollProgress < 0.2 && velocity < 1) {\r\n // Reduce window size when scrolling slowly at the beginning\r\n this.maxRenderedItems = Math.max(50, this.maxRenderedItems - 10);\r\n }\r\n }\r\n\r\n private isPrefetching = false;\r\n\r\n private prefetchData(): void {\r\n if (this.isPrefetching) return;\r\n this.isPrefetching = true;\r\n\r\n // Prefetch next batch in background\r\n setTimeout(() => {\r\n // Simulate prefetch logic - in real implementation, this would prepare data\r\n this.isPrefetching = false;\r\n }, 100);\r\n }\r\n\r\n private prefetchNextBatch(): void {\r\n if (this.isPrefetching || !this.hasMoreData) return;\r\n\r\n this.isPrefetching = true;\r\n\r\n // Prepare data for next batch without triggering UI updates\r\n // This could involve pre-calculating virtual indexes, caching computations, etc.\r\n setTimeout(() => {\r\n // Pre-compute next batch of data structures\r\n const nextBatchSize = Math.min(100, this.paginationConfig?.limit || 50);\r\n const startIndex = this.dataSet.length;\r\n\r\n // Pre-allocate space in data structures\r\n for (let i = 0; i < nextBatchSize; i++) {\r\n const virtualIndex = startIndex + i + 1;\r\n // Pre-compute any expensive calculations here\r\n this.dataCache.set(`virtualIndex_${virtualIndex}`, { data: virtualIndex, timestamp: Date.now(), ttl: 30000 });\r\n }\r\n\r\n this.isPrefetching = false;\r\n }, 50); // Small delay to avoid blocking main thread\r\n }\r\n\r\n private handleOptimizedFilter(filters: any[]): void {\r\n this.startPerformanceTimer('filterTime');\r\n\r\n // Use worker for heavy filtering operations\r\n if (this.dataSet.length > 500) {\r\n this.processHeavyComputationsWithWorker(this.dataSet, 'filter')\r\n .then(filteredData => {\r\n // Apply filtered data\r\n this.dataSet = filteredData;\r\n this.updateFlattenedData();\r\n this.updateVisibleRowsOptimized(0);\r\n this.endPerformanceTimer('filterTime');\r\n this.cdr.markForCheck();\r\n })\r\n .catch(error => {\r\n console.warn('Worker filtering failed, falling back to main thread:', error);\r\n this.applyFilteroptionList().then(() => {\r\n this.endPerformanceTimer('filterTime');\r\n });\r\n });\r\n } else {\r\n this.applyFilteroptionList().then(() => {\r\n this.endPerformanceTimer('filterTime');\r\n });\r\n }\r\n }\r\n\r\n private handleViewportResize(): void {\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private loadMoreDataOptimized(): void {\r\n if (this.isLoadingData) return;\r\n\r\n this.isLoadingData = true;\r\n this.startPerformanceTimer('infiniteScrollTime');\r\n\r\n // Implement data windowing - keep only recent data in memory\r\n this.optimizeDataWindow();\r\n\r\n // Prefetch next batch in background for smoother experience\r\n this.prefetchNextBatch();\r\n\r\n this.loadMoreData.emit();\r\n\r\n // Reset loading flag after a timeout to prevent rapid firing\r\n const timeoutId = window.setTimeout(() => {\r\n this.isLoadingData = false;\r\n this.endPerformanceTimer('infiniteScrollTime');\r\n }, 1000);\r\n this.timeouts.add(timeoutId);\r\n }\r\n\r\n private optimizeDataWindow(): void {\r\n // Keep only a sliding window of data to prevent memory bloat\r\n const maxWindowSize = 1000; // Keep max 1000 items in memory\r\n const windowStart = Math.max(0, this.dataSet.length - maxWindowSize);\r\n\r\n if (this.dataSet.length > maxWindowSize) {\r\n // Remove old data from the beginning, but keep track of total count\r\n this.dataSet.splice(0, this.dataSet.length - maxWindowSize);\r\n this.originalDataSet.splice(0, this.originalDataSet.length - maxWindowSize);\r\n\r\n // Adjust virtual indexes\r\n this.dataSet.forEach((row, i) => {\r\n row.__virtualIndex = windowStart + i + 1;\r\n });\r\n\r\n // Clear caches that might be affected\r\n this.dynamicItemHeights.clear();\r\n this.itemHeightCache.clear();\r\n\r\n // Update visible rows to reflect new data window\r\n this.updateVisibleRowsOptimized(0);\r\n\r\n // Force viewport recalculation\r\n this.computeViewportRows();\r\n }\r\n }\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n // Batch change detection updates\r\n let needsUpdate = false;\r\n\r\n if (changes['selectedPresetId'] && changes['selectedPresetId'].currentValue) {\r\n this.tableFilterViewId = changes['selectedPresetId'].currentValue;\r\n const selectedPreset = this.tableView?.find(preset => preset.id === this.tableFilterViewId);\r\n if (selectedPreset) {\r\n this.presetName = selectedPreset.name;\r\n }\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['filtersConfig']) {\r\n this.filterSubject.next(this.filtersConfig);\r\n this.checkFilterChangesEffect();\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['columns']?.currentValue?.length) {\r\n await this.commonSevice.applyFiltersToColumns(this.columns, this.filtersConfig)\r\n // Use immutable data patterns for better performance\r\n this.originalColumns = [...this.columns.map(col => ({ ...col }))];\r\n this.buildColumnIndex();\r\n\r\n if (this.dataGridContainer?.nativeElement?.offsetWidth) {\r\n await Promise.all([\r\n this.SetColumnsDefaultWidth(),\r\n this.updateColumnWidthsAndGroups(),\r\n this.refreshPreviewColumns()\r\n ]);\r\n this.setSectionsWidth();\r\n needsUpdate = true;\r\n }\r\n this.generateDropListIds();\r\n }\r\n\r\n if (changes['dataSet']) {\r\n // Check if progressive loading should be used\r\n if (this.enableProgressiveLoading && this.dataSet && this.dataSet.length > this.progressiveChunkSize) {\r\n this.initializeProgressiveLoading();\r\n } else {\r\n this.processDataSetDirectly();\r\n }\r\n\r\n if (this.enableInfiniteScroll && this.groupedColumns.length > 0) {\r\n console.warn('Grouping with infinite scroll may not work as expected');\r\n }\r\n\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['checkboxState']?.currentValue?.reset) {\r\n this.selectedRows.clear();\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['closeDropdown']) {\r\n if (this.closeDropdown.preset.closed) {\r\n this.activeTopButton = null;\r\n }\r\n }\r\n\r\n if (changes['oddRowsBackgroundColor']) {\r\n this.rowShadingEnabled = this.oddRowsBackgroundColor ? true : false;\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['isSingleDay']?.currentValue === true) {\r\n // Use immutable update pattern\r\n this.dataSet = this.dataSet.map(row => ({\r\n ...row,\r\n isDetailsExpand: false\r\n }));\r\n needsUpdate = true;\r\n }\r\n\r\n // Handle theme-related input changes - theme functionality removed\r\n\r\n if (needsUpdate) {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n\r\n\r\n async applyFilteroptionList() {\r\n this.startPerformanceTimer('filterTime');\r\n\r\n const updatedColumns = await this.commonSevice.applyFiltersToColumns(this.columns, this.filtersConfig);\r\n this.columns = [...updatedColumns];\r\n this.cdr.markForCheck();\r\n\r\n this.endPerformanceTimer('filterTime');\r\n }\r\n leftPinnedColumns: any[] = [];\r\n centerColumns: any[] = [];\r\n rightPinnedColumns: any[] = [];\r\n\r\n previewLeftPinnedColumns: any[] = [];\r\n previewCenterColumns: any[] = [];\r\n previewRightPinnedColumns: any[] = [];\r\n\r\n // Main Container Template References\r\n @ViewChild('dataGridContainer')\r\n dataGridContainer!: ElementRef<HTMLDivElement>;\r\n\r\n // Body Template References\r\n @ViewChild('leftPinnedBody')\r\n leftPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedBody')\r\n centerPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedBody')\r\n rightPinnedBody!: ElementRef<HTMLDivElement>;\r\n\r\n // Headers Template References\r\n @ViewChild('leftPinnedHeader')\r\n leftPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedHeader')\r\n centerPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedHeader')\r\n rightPinnedHeader!: ElementRef<HTMLDivElement>;\r\n\r\n @ViewChild('columnsGroupedBox')\r\n columnsGroupedBox!: ElementRef<HTMLDivElement>;\r\n\r\n // Cached DOM elements for performance\r\n private cachedElements = new Map<string, HTMLElement[]>();\r\n private resizeObserver: ResizeObserver | null = null;\r\n private elementCacheTimeout: any;\r\n\r\n // Efficient data structures for performance\r\n private columnIndex = new Map<string, any>(); // field -> column mapping\r\n private rowIndex = new WeakMap<any, number>(); // row object -> index mapping\r\n private visibleColumnCache = new Map<string, any[]>(); // cache for visible columns\r\n\r\n // Advanced DOM query optimization and caching\r\n private domQueryCache = new Map<string, { elements: HTMLElement[]; timestamp: number; ttl: number }>();\r\n private domQueryStats = new Map<string, { hits: number; misses: number; lastAccess: number }>();\r\n private cacheCleanupInterval: number | null = null;\r\n private readonly CACHE_TTL = 10000; // 10 seconds\r\n private readonly MAX_CACHE_SIZE = 100;\r\n\r\n private getOptimizedElements(selector: string, context?: Element): HTMLElement[] {\r\n const cacheKey = context ? `${selector}:${context.tagName}[${context.className}]` : selector;\r\n const now = Date.now();\r\n\r\n // Check cache first\r\n const cached = this.domQueryCache.get(cacheKey);\r\n if (cached && (now - cached.timestamp) < cached.ttl) {\r\n // Update stats\r\n const stats = this.domQueryStats.get(cacheKey) || { hits: 0, misses: 0, lastAccess: 0 };\r\n stats.hits++;\r\n stats.lastAccess = now;\r\n this.domQueryStats.set(cacheKey, stats);\r\n return cached.elements;\r\n }\r\n\r\n // Cache miss - perform query\r\n const stats = this.domQueryStats.get(cacheKey) || { hits: 0, misses: 0, lastAccess: 0 };\r\n stats.misses++;\r\n stats.lastAccess = now;\r\n this.domQueryStats.set(cacheKey, stats);\r\n\r\n // Perform optimized query\r\n let elements: HTMLElement[];\r\n if (context) {\r\n elements = Array.from(context.querySelectorAll(selector)) as HTMLElement[];\r\n } else {\r\n elements = Array.from(document.querySelectorAll(selector)) as HTMLElement[];\r\n }\r\n\r\n // Cache the result with TTL\r\n this.domQueryCache.set(cacheKey, {\r\n elements: [...elements], // Clone to prevent external mutations\r\n timestamp: now,\r\n ttl: this.CACHE_TTL\r\n });\r\n\r\n // Implement LRU eviction if cache is too large\r\n if (this.domQueryCache.size > this.MAX_CACHE_SIZE) {\r\n this.evictOldestCacheEntries();\r\n }\r\n\r\n return elements;\r\n }\r\n\r\n private evictOldestCacheEntries(): void {\r\n const entries = Array.from(this.domQueryCache.entries())\r\n .sort((a, b) => a[1].timestamp - b[1].timestamp);\r\n\r\n const toRemove = Math.floor(this.MAX_CACHE_SIZE * 0.2); // Remove 20% oldest\r\n for (let i = 0; i < toRemove && entries.length > 0; i++) {\r\n this.domQueryCache.delete(entries[i][0]);\r\n }\r\n }\r\n\r\n private getOptimizedElement(selector: string, context?: Element): HTMLElement | null {\r\n const elements = this.getOptimizedElements(selector, context);\r\n return elements.length > 0 ? elements[0] : null;\r\n }\r\n\r\n private invalidateDomCache(pattern?: string): void {\r\n if (pattern) {\r\n // Invalidate cache entries matching pattern\r\n for (const key of this.domQueryCache.keys()) {\r\n if (key.includes(pattern)) {\r\n this.domQueryCache.delete(key);\r\n }\r\n }\r\n } else {\r\n // Clear all cache\r\n this.domQueryCache.clear();\r\n this.domQueryStats.clear();\r\n }\r\n }\r\n\r\n private startCacheCleanup(): void {\r\n if (this.cacheCleanupInterval) return;\r\n\r\n this.cacheCleanupInterval = window.setInterval(() => {\r\n const now = Date.now();\r\n const toDelete: string[] = [];\r\n\r\n for (const [key, cached] of this.domQueryCache.entries()) {\r\n if (now - cached.timestamp > cached.ttl) {\r\n toDelete.push(key);\r\n }\r\n }\r\n\r\n toDelete.forEach(key => this.domQueryCache.delete(key));\r\n }, 5000); // Clean every 5 seconds\r\n }\r\n\r\n private stopCacheCleanup(): void {\r\n if (this.cacheCleanupInterval) {\r\n clearInterval(this.cacheCleanupInterval);\r\n this.cacheCleanupInterval = null;\r\n }\r\n }\r\n\r\n // Legacy methods for backward compatibility\r\n private getCachedElements(selector: string): HTMLElement[] {\r\n return this.getOptimizedElements(selector);\r\n }\r\n\r\n private clearElementCache(): void {\r\n this.invalidateDomCache();\r\n }\r\n\r\n // Efficient data structure methods\r\n private buildColumnIndex(): void {\r\n this.columnIndex.clear();\r\n this.columns.forEach((col, index) => {\r\n this.columnIndex.set(col.field, { ...col, globalIndex: index });\r\n if (col.children) {\r\n col.children.forEach((child, childIndex) => {\r\n this.columnIndex.set(child.field, { ...child, globalIndex: index, childIndex });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private buildRowIndex(): void {\r\n this.rowIndex = new WeakMap();\r\n this.dataSet.forEach((row, index) => {\r\n this.rowIndex.set(row, index);\r\n });\r\n }\r\n\r\n private getColumnByField(field: string): any {\r\n return this.columnIndex.get(field);\r\n }\r\n\r\n private getRowIndex(row: any): number {\r\n return this.rowIndex.get(row) ?? -1;\r\n }\r\n\r\n // Enhanced caching methods\r\n private setDataCache(key: string, data: any, ttl: number = 5000): void {\r\n this.dataCache.set(key, { data, timestamp: Date.now(), ttl });\r\n }\r\n\r\n private getDataCache(key: string): any {\r\n const item = this.dataCache.get(key);\r\n if (item && Date.now() - item.timestamp < item.ttl) {\r\n return item.data;\r\n }\r\n this.dataCache.delete(key);\r\n return null;\r\n }\r\n\r\n private setComputationCache(key: string, result: any): void {\r\n this.computationCache.set(key, { result, timestamp: Date.now() });\r\n }\r\n\r\n private getComputationCache(key: string): any {\r\n const cached = this.computationCache.get(key);\r\n if (cached && Date.now() - cached.timestamp < 1000) { // 1 second TTL\r\n return cached.result;\r\n }\r\n return null;\r\n }\r\n\r\n // Advanced template expression memoization\r\n private templateExpressionCache = new Map<string, { value: any; timestamp: number; ttl: number }>();\r\n\r\n // Memoize expensive template expressions with TTL\r\n memoizeTemplateExpression(key: string, expression: () => any, ttl: number = 1000): any {\r\n const cached = this.templateExpressionCache.get(key);\r\n const now = performance.now();\r\n\r\n if (cached && (now - cached.timestamp) < cached.ttl) {\r\n return cached.value;\r\n }\r\n\r\n const result = expression();\r\n this.templateExpressionCache.set(key, { value: result, timestamp: now, ttl });\r\n return result;\r\n }\r\n\r\n // Clear template cache when data changes\r\n clearTemplateCache(): void {\r\n this.templateExpressionCache.clear();\r\n }\r\n\r\n // Advanced Zone.js optimizations for ultra-fast change detection\r\n private zoneOptimizationEnabled = true;\r\n private microtaskQueue: (() => void)[] = [];\r\n private isProcessingMicrotasks = false;\r\n private animationFrameQueue: (() => void)[] = [];\r\n private isProcessingAnimationFrames = false;\r\n\r\n // Advanced memory management with object pooling\r\n private objectPool = new Map<string, any[]>();\r\n private maxPoolSize = 100;\r\n\r\n // Get object from pool or create new one\r\n private getPooledObject<T>(type: string, factory: () => T): T {\r\n const pool = this.objectPool.get(type) || [];\r\n if (pool.length > 0) {\r\n return pool.pop() as T;\r\n }\r\n return factory();\r\n }\r\n\r\n // Return object to pool\r\n private returnToPool(type: string, obj: any): void {\r\n const pool = this.objectPool.get(type) || [];\r\n if (pool.length < this.maxPoolSize) {\r\n pool.push(obj);\r\n this.objectPool.set(type, pool);\r\n }\r\n }\r\n\r\n // Ultra-fast change detection with batched microtasks\r\n private scheduleMicrotask(callback: () => void): void {\r\n if (!this.zoneOptimizationEnabled) {\r\n callback();\r\n return;\r\n }\r\n\r\n this.microtaskQueue.push(callback);\r\n\r\n if (!this.isProcessingMicrotasks) {\r\n this.isProcessingMicrotasks = true;\r\n queueMicrotask(() => this.processMicrotaskQueue());\r\n }\r\n }\r\n\r\n private processMicrotaskQueue(): void {\r\n const queue = [...this.microtaskQueue];\r\n this.microtaskQueue.length = 0;\r\n this.isProcessingMicrotasks = false;\r\n\r\n // Process in batches to prevent stack overflow\r\n const batchSize = 10;\r\n for (let i = 0; i < queue.length; i += batchSize) {\r\n const batch = queue.slice(i, i + batchSize);\r\n batch.forEach(callback => callback());\r\n }\r\n }\r\n\r\n // Animation frame scheduling for smooth DOM updates\r\n private scheduleAnimationFrame(callback: () => void): void {\r\n this.animationFrameQueue.push(callback);\r\n\r\n if (!this.isProcessingAnimationFrames) {\r\n this.isProcessingAnimationFrames = true;\r\n requestAnimationFrame(() => this.processAnimationFrameQueue());\r\n }\r\n }\r\n\r\n private processAnimationFrameQueue(): void {\r\n const queue = [...this.animationFrameQueue];\r\n this.animationFrameQueue.length = 0;\r\n this.isProcessingAnimationFrames = false;\r\n\r\n queue.forEach(callback => callback());\r\n }\r\n\r\n // Advanced memory leak prevention with WeakRefs\r\n private weakRefRegistry = new WeakMap<object, Set<() => void>>();\r\n\r\n // Register object for advanced cleanup\r\n registerForAdvancedCleanup(obj: object, cleanup: () => void): void {\r\n if (!this.weakRefRegistry.has(obj)) {\r\n this.weakRefRegistry.set(obj, new Set());\r\n }\r\n this.weakRefRegistry.get(obj)!.add(cleanup);\r\n }\r\n\r\n // Cleanup WeakRef registered objects\r\n cleanupWeakRefs(): void {\r\n // Note: WeakRefs are automatically cleaned up, but we can manually trigger cleanup\r\n this.weakRefRegistry = new WeakMap();\r\n }\r\n\r\n // Progressive hydration for better initial load\r\n private hydrationQueue: { callback: () => void; priority: number }[] = [];\r\n private isHydrating = false;\r\n\r\n // Add component to hydration queue with priority\r\n queueForHydration(callback: () => void, priority: number = 0): void {\r\n this.hydrationQueue.push({ callback, priority });\r\n this.hydrationQueue.sort((a, b) => a.priority - b.priority);\r\n\r\n if (!this.isHydrating) {\r\n this.startProgressiveHydration();\r\n }\r\n }\r\n\r\n private startProgressiveHydration(): void {\r\n this.isHydrating = true;\r\n\r\n const hydrateNext = () => {\r\n if (this.hydrationQueue.length === 0) {\r\n this.isHydrating = false;\r\n return;\r\n }\r\n\r\n const item = this.hydrationQueue.shift()!;\r\n item.callback();\r\n\r\n // Schedule next hydration with requestIdleCallback for better performance\r\n if (typeof requestIdleCallback !== 'undefined') {\r\n requestIdleCallback(hydrateNext);\r\n } else {\r\n setTimeout(hydrateNext, 0);\r\n }\r\n };\r\n\r\n hydrateNext();\r\n }\r\n\r\n // Center Fake scrollbard\r\n @ViewChild('centerFakeScrollbar')\r\n centerFakeScrollbar!: ElementRef<HTMLDivElement>;\r\n async updateColumnWidthsAndGroups(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap in a promise so we can await\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.leftPinnedColumns = left;\r\n this.centerColumns = center;\r\n this.rightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 0));\r\n this.cdr.markForCheck();\r\n }\r\n\r\n async refreshPreviewColumns(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap prepareColumns in a Promise to make it awaitable\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.previewLeftPinnedColumns = left;\r\n this.previewCenterColumns = center;\r\n this.previewRightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.cdr.markForCheck();\r\n }\r\n\r\n\r\n async SetColumnsDefaultWidth() {\r\n const containerWidth = this.dataGridContainer?.nativeElement.offsetWidth;\r\n this.columns = this.columnService.assignDefaultWidths(\r\n this.columns,\r\n containerWidth\r\n );\r\n await new Promise(resolve => setTimeout(resolve, 0));\r\n this.cdr.markForCheck();\r\n }\r\n\r\n\r\n setSectionsWidth() {\r\n const left = this.getCachedElement('.left-pinned-body');\r\n const center = this.getCachedElement('.center-scrollable-body');\r\n const right = this.getCachedElement('.right-pinned-body');\r\n\r\n if (left && this.leftPinnedHeader) {\r\n left.style.minWidth = `${this.leftPinnedHeader.nativeElement.offsetWidth}px`;\r\n }\r\n if (center && this.centerPinnedHeader) {\r\n center.style.minWidth = `${this.centerPinnedHeader.nativeElement.offsetWidth}px`;\r\n }\r\n if (right && this.rightPinnedHeader) {\r\n right.style.minWidth = `${this.rightPinnedHeader.nativeElement.offsetWidth}px`;\r\n }\r\n\r\n // Invalidate DOM cache after width changes to ensure fresh queries\r\n this.invalidateDomCache('.left-pinned-body');\r\n this.invalidateDomCache('.center-scrollable-body');\r\n this.invalidateDomCache('.right-pinned-body');\r\n }\r\n\r\n // Optimized DOM query with advanced caching\r\n private getCachedElement(selector: string, context?: Element): HTMLElement | null {\r\n return this.getOptimizedElement(selector, context);\r\n }\r\n\r\n // Performance monitoring utilities\r\n private performanceMetrics: PerformanceMetrics = {\r\n renderTime: 0,\r\n scrollTime: 0,\r\n filterTime: 0,\r\n sortTime: 0,\r\n infiniteScrollTime: 0,\r\n lastRenderStart: 0,\r\n renderCount: 0\r\n };\r\n\r\n private startPerformanceTimer(metric: keyof typeof this.performanceMetrics): void {\r\n if (typeof performance !== 'undefined') {\r\n this.performanceMetrics.lastRenderStart = performance.now();\r\n }\r\n }\r\n\r\n private endPerformanceTimer(metric: keyof typeof this.performanceMetrics): void {\r\n if (typeof performance !== 'undefined' && this.performanceMetrics.lastRenderStart > 0) {\r\n const duration = performance.now() - this.performanceMetrics.lastRenderStart;\r\n this.performanceMetrics[metric] += duration;\r\n if (metric === 'renderTime') {\r\n this.performanceMetrics.renderCount++;\r\n }\r\n this.performanceMetrics.lastRenderStart = 0;\r\n\r\n // Log performance warnings for slow operations\r\n if (duration > 16.67) { // More than one frame at 60fps\r\n console.warn(`Performance warning: ${metric} took ${duration.toFixed(2)}ms`);\r\n }\r\n }\r\n }\r\n\r\n // Progressive loading implementation\r\n private initializeProgressiveLoading(): void {\r\n this.progressiveLoadingChunks = [];\r\n this.progressiveLoadingIndex = 0;\r\n this.isProgressiveLoading = true;\r\n\r\n // Split data into chunks\r\n for (let i = 0; i < this.dataSet.length; i += this.progressiveChunkSize) {\r\n this.progressiveLoadingChunks.push(this.dataSet.slice(i, i + this.progressiveChunkSize));\r\n }\r\n\r\n // Start with empty dataset\r\n this.dataSet = [];\r\n this.originalDataSet = [];\r\n this.flattenedData = [];\r\n\r\n // Start progressive loading\r\n this.loadNextProgressiveChunk();\r\n }\r\n\r\n private loadNextProgressiveChunk(): void {\r\n if (this.progressiveLoadingIndex >= this.progressiveLoadingChunks.length) {\r\n this.isProgressiveLoading = false;\r\n this.finalizeProgressiveLoading();\r\n return;\r\n }\r\n\r\n const chunk = this.progressiveLoadingChunks[this.progressiveLoadingIndex];\r\n const processedChunk = chunk.map((row, i) => ({\r\n ...row,\r\n __virtualIndex: (this.progressiveLoadingIndex * this.progressiveChunkSize) + i + 1\r\n }));\r\n\r\n // Add chunk to dataset\r\n this.dataSet = [...this.dataSet, ...processedChunk];\r\n this.originalDataSet = [...this.originalDataSet, ...processedChunk.map(row => ({ ...row }))];\r\n\r\n this.progressiveLoadingIndex++;\r\n\r\n // Update UI progressively\r\n this.updateFlattenedData();\r\n this.buildRowIndex();\r\n this.expandedCells.clear();\r\n\r\n // Schedule next chunk\r\n if (this.progressiveLoadingIndex < this.progressiveLoadingChunks.length) {\r\n setTimeout(() => this.loadNextProgressiveChunk(), this.progressiveDelay);\r\n } else {\r\n this.finalizeProgressiveLoading();\r\n }\r\n\r\n // Trigger change detection\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private finalizeProgressiveLoading(): void {\r\n this.isProgressiveLoading = false;\r\n\r\n // Final updates\r\n requestAnimationFrame(() => {\r\n if (this.mainScroll?.nativeElement) {\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n }\r\n });\r\n\r\n if (this.centerPinnedHeader?.nativeElement) {\r\n void this.centerPinnedHeader.nativeElement.offsetWidth;\r\n if (this.centerScrollableBody?.nativeElement) {\r\n this.centerScrollableBody.nativeElement.scrollLeft = this.centerPinnedHeader.nativeElement.scrollLeft;\r\n }\r\n }\r\n }\r\n\r\n private processDataSetDirectly(): void {\r\n // Optimize data processing with immutable patterns\r\n const processedData = this.dataSet?.map((row, i) => ({\r\n ...row,\r\n __virtualIndex: i + 1\r\n })) || [];\r\n\r\n // Create immutable copies\r\n this.dataSet = [...processedData];\r\n this.originalDataSet = [...processedData.map(row => ({ ...row }))];\r\n this.buildRowIndex();\r\n this.expandedCells.clear();\r\n\r\n // Reapply grouping if columns are grouped\r\n if (this.groupedColumns?.length > 0) {\r\n this.reapplyGroupingAfterDataChange();\r\n } else {\r\n this.updateFlattenedData();\r\n }\r\n\r\n // Clear template cache when data changes\r\n this.clearTemplateCache();\r\n\r\n // Use requestAnimationFrame for smooth updates\r\n requestAnimationFrame(() => {\r\n if (this.mainScroll?.nativeElement) {\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n }\r\n });\r\n\r\n if (this.centerPinnedHeader?.nativeElement) {\r\n void this.centerPinnedHeader.nativeElement.offsetWidth;\r\n if (this.centerScrollableBody?.nativeElement) {\r\n this.centerScrollableBody.nativeElement.scrollLeft = this.centerPinnedHeader.nativeElement.scrollLeft;\r\n }\r\n }\r\n }\r\n\r\n private reapplyGroupingAfterDataChange(): void {\r\n if (!this.groupedColumns?.length) return;\r\n\r\n const fields = this.groupedColumns.map((col) => col.field);\r\n this.dataSet = this.groupData(this.originalDataSet, fields);\r\n this.updateFlattenedData();\r\n }\r\n\r\n // Advanced performance profiling and optimization metrics\r\n private profilerMarks = new Map<string, number>();\r\n private profilerMeasures = new Map<string, { start: number; end: number; duration: number }>();\r\n private performanceThresholds = {\r\n renderTime: 16.67, // 60fps\r\n scrollTime: 8.33, // 120fps for smooth scrolling\r\n filterTime: 100, // 100ms for acceptable filter response\r\n infiniteScrollTime: 50, // 50ms for smooth infinite scroll\r\n };\r\n\r\n // Performance metrics interface\r\n metrics: PerformanceMetrics = {} as PerformanceMetrics;\r\n\r\n // Start performance profiling\r\n startProfiling(markName: string): void {\r\n if (typeof performance !== 'undefined' && performance.mark) {\r\n const mark = `${markName}_${Date.now()}`;\r\n performance.mark(mark);\r\n this.profilerMarks.set(markName, performance.now());\r\n }\r\n }\r\n\r\n // End performance profiling and measure\r\n endProfiling(markName: string): number {\r\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\r\n const startMark = `${markName}_${Date.now() - 1000}`; // Look back 1 second\r\n const endMark = `${markName}_${Date.now()}`;\r\n\r\n try {\r\n performance.mark(endMark);\r\n const measureName = `${markName}_measure`;\r\n performance.measure(measureName, startMark, endMark);\r\n\r\n const measure = performance.getEntriesByName(measureName)[0];\r\n const duration = measure ? measure.duration : 0;\r\n\r\n this.profilerMeasures.set(markName, {\r\n start: this.profilerMarks.get(markName) || 0,\r\n end: performance.now(),\r\n duration\r\n });\r\n\r\n // Log warnings for performance issues\r\n this.checkPerformanceThresholds(markName, duration);\r\n\r\n // Cleanup\r\n performance.clearMarks(startMark);\r\n performance.clearMarks(endMark);\r\n performance.clearMeasures(measureName);\r\n\r\n return duration;\r\n } catch (error) {\r\n // Fallback to basic timing\r\n const startTime = this.profilerMarks.get(markName);\r\n if (startTime) {\r\n const duration = performance.now() - startTime;\r\n this.checkPerformanceThresholds(markName, duration);\r\n return duration;\r\n }\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n private checkPerformanceThresholds(operation: string, duration: number): void {\r\n const threshold = this.performanceThresholds[operation as keyof typeof this.performanceThresholds];\r\n if (threshold && duration > threshold) {\r\n console.warn(`Performance warning: ${operation} took ${duration.toFixed(2)}ms (threshold: ${threshold}ms)`);\r\n\r\n // Log additional context for debugging\r\n if (operation === 'renderTime') {\r\n console.warn('Consider optimizing change detection or reducing DOM complexity');\r\n } else if (operation === 'scrollTime') {\r\n console.warn('Consider reducing scroll event handlers or optimizing virtual scrolling');\r\n } else if (operation === 'filterTime') {\r\n console.warn('Consider using web workers for heavy filtering operations');\r\n }\r\n }\r\n }\r\n\r\n // Get detailed performance report\r\n getDetailedPerformanceReport(): {\r\n metrics: PerformanceMetrics;\r\n measures: Map<string, { start: number; end: number; duration: number }>;\r\n domCacheStats: { size: number; hitRate: number; totalQueries: number };\r\n memoryUsage: any;\r\n } {\r\n const totalQueries = Array.from(this.domQueryStats.values()).reduce((sum, stat) => sum + stat.hits + stat.misses, 0);\r\n const totalHits = Array.from(this.domQueryStats.values()).reduce((sum, stat) => sum + stat.hits, 0);\r\n const hitRate = totalQueries > 0 ? (totalHits / totalQueries) * 100 : 0;\r\n\r\n return {\r\n metrics: { ...this.performanceMetrics },\r\n measures: new Map(this.profilerMeasures),\r\n domCacheStats: {\r\n size: this.domQueryCache.size,\r\n hitRate,\r\n totalQueries\r\n },\r\n memoryUsage: this.getMemoryUsage()\r\n };\r\n }\r\n\r\n private getMemoryUsage(): any {\r\n if (typeof performance !== 'undefined' && (performance as any).memory) {\r\n const mem = (performance as any).memory;\r\n return {\r\n used: Math.round(mem.usedJSHeapSize / 1024 / 1024), // MB\r\n total: Math.round(mem.totalJSHeapSize / 1024 / 1024), // MB\r\n limit: Math.round(mem.jsHeapSizeLimit / 1024 / 1024), // MB\r\n usagePercent: Math.round((mem.usedJSHeapSize / mem.jsHeapSizeLimit) * 100)\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n // Performance optimization suggestions\r\n getOptimizationSuggestions(): string[] {\r\n const suggestions: string[] = [];\r\n const report = this.getDetailedPerformanceReport();\r\n\r\n // Check render performance\r\n if (report.metrics.renderTime > this.performanceThresholds.renderTime * 2) {\r\n suggestions.push('Consider implementing OnPush change detection strategy');\r\n suggestions.push('Use trackBy functions in *ngFor directives');\r\n suggestions.push('Implement lazy loading for heavy components');\r\n }\r\n\r\n // Check scroll performance\r\n if (report.metrics.scrollTime > this.performanceThresholds.scrollTime * 2) {\r\n suggestions.push('Optimize virtual scrolling implementation');\r\n suggestions.push('Reduce scroll event listeners or throttle them');\r\n suggestions.push('Use passive event listeners for scroll events');\r\n }\r\n\r\n // Check DOM cache efficiency\r\n if (report.domCacheStats.hitRate < 70) {\r\n suggestions.push('Optimize DOM query patterns to improve cache hit rate');\r\n suggestions.push('Consider using more specific selectors for DOM queries');\r\n }\r\n\r\n // Check memory usage\r\n if (report.memoryUsage && report.memoryUsage.usagePercent > 80) {\r\n suggestions.push('High memory usage detected - consider implementing data windowing');\r\n suggestions.push('Clear unused caches and event listeners');\r\n suggestions.push('Use WeakMap/WeakSet for temporary object references');\r\n }\r\n\r\n return suggestions;\r\n }\r\n\r\n // Get performance metrics for debugging\r\n getPerformanceMetrics(): PerformanceMetrics {\r\n return { ...this.performanceMetrics };\r\n }\r\n\r\n // Reset performance metrics\r\n resetPerformanceMetrics(): void {\r\n Object.keys(this.performanceMetrics).forEach(key => {\r\n if (key !== 'renderCount') {\r\n (this.performanceMetrics as any)[key] = 0;\r\n }\r\n });\r\n\r\n // Clear profiling data\r\n this.profilerMarks.clear();\r\n this.profilerMeasures.clear();\r\n this.domQueryStats.clear();\r\n }\r\n\r\n // Initialize efficient data structures\r\n private initializeDataStructures(): void {\r\n this.buildColumnIndex();\r\n this.buildRowIndex();\r\n\r\n // Clear caches on initialization\r\n this.dataCache.clear();\r\n this.computationCache.clear();\r\n this.domCache.clear();\r\n this.itemHeightCache.clear();\r\n\r\n // Initialize advanced DOM caching\r\n this.startCacheCleanup();\r\n }\r\n\r\n // Initialize viewport-based lazy loading\r\n private initializeViewportLazyLoading(): void {\r\n if (typeof IntersectionObserver === 'undefined') return;\r\n\r\n this.intersectionObserver = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n const element = entry.target as Element;\r\n const callback = this.lazyLoadCallbacks.get(element.id);\r\n if (callback) {\r\n callback();\r\n this.lazyLoadCallbacks.delete(element.id);\r\n this.intersectionObserver?.unobserve(element);\r\n }\r\n }\r\n });\r\n },\r\n {\r\n root: this.mainScroll?.nativeElement,\r\n rootMargin: '50px', // Load 50px before entering viewport\r\n threshold: 0.1\r\n }\r\n );\r\n }\r\n\r\n // Advanced Service Worker Caching for Static Assets\r\n private initializeServiceWorkerCaching(): void {\r\n if ('serviceWorker' in navigator && 'caches' in window) {\r\n // Register service worker for advanced caching\r\n navigator.serviceWorker.register('/sw.js').then(registration => {\r\n console.log('Service Worker registered for advanced caching');\r\n\r\n // Implement advanced caching strategies\r\n this.setupAdvancedCaching();\r\n }).catch(error => {\r\n console.warn('Service Worker registration failed:', error);\r\n });\r\n }\r\n }\r\n\r\n private setupAdvancedCaching(): void {\r\n // Implement advanced caching strategies using native Cache API\r\n if ('caches' in window) {\r\n // Create different cache strategies manually\r\n this.createCacheStrategy('ms-time-sheet-static-v1', 'cache-first');\r\n this.createCacheStrategy('ms-time-sheet-dynamic-v1', 'network-first');\r\n this.createCacheStrategy('ms-time-sheet-swr-v1', 'stale-while-revalidate');\r\n }\r\n\r\n // Pre-cache critical assets\r\n this.precacheCriticalAssets();\r\n }\r\n\r\n private createCacheStrategy(cacheName: string, strategy: string): void {\r\n // Manual implementation of caching strategies using native APIs\r\n caches.open(cacheName).then(cache => {\r\n // Cache is ready for use\r\n console.log(`${strategy} cache '${cacheName}' initialized`);\r\n }).catch(error => {\r\n console.warn(`Failed to create ${strategy} cache:`, error);\r\n });\r\n }\r\n\r\n private precacheCriticalAssets(): void {\r\n const criticalAssets = [\r\n '/assets/icons/',\r\n '/assets/images/',\r\n '/assets/fonts/',\r\n // Add other critical assets\r\n ];\r\n\r\n caches.open('ms-time-sheet-critical-v1').then(cache => {\r\n return cache.addAll(criticalAssets);\r\n }).catch(error => {\r\n console.warn('Critical assets pre-caching failed:', error);\r\n });\r\n }\r\n\r\n // Register element for viewport-based lazy loading\r\n registerForLazyLoading(elementId: string, callback: () => void): void {\r\n this.lazyLoadCallbacks.set(elementId, callback);\r\n const element = document.getElementById(elementId);\r\n if (element && this.intersectionObserver) {\r\n this.intersectionObserver.observe(element);\r\n }\r\n }\r\n\r\n // Check if element is in viewport\r\n isElementInViewport(element: Element): boolean {\r\n if (this.viewportElements.has(element)) {\r\n return this.viewportElements.get(element)!;\r\n }\r\n\r\n const rect = element.getBoundingClientRect();\r\n const containerRect = this.mainScroll?.nativeElement?.getBoundingClientRect();\r\n\r\n if (!containerRect) return false;\r\n\r\n const isVisible = (\r\n rect.top >= containerRect.top &&\r\n rect.left >= containerRect.left &&\r\n rect.bottom <= containerRect.bottom &&\r\n rect.right <= containerRect.right\r\n );\r\n\r\n this.viewportElements.set(element, isVisible);\r\n return isVisible;\r\n }\r\n\r\n // onCenterBodyScroll(): void {\r\n // const scrollTop = this.centerPinnedBody.nativeElement.scrollTop;\r\n // const scrollLeft = this.centerPinnedBody.nativeElement.scrollLeft;\r\n\r\n // // Sync vertical scroll with left & right pinned bodies\r\n // this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\r\n // this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\r\n\r\n // // Sync horizontal scroll with center header\r\n // this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n // this.centerFakeScrollbar.nativeElement.scrollLeft = scrollLeft;\r\n // }\r\n\r\n onLeftBodyScroll(): void {\r\n const scrollTop = this.leftPinnedBody.nativeElement.scrollTop;\r\n this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\r\n this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\r\n }\r\n onRightBodyScroll(): void {\r\n const scrollTop = this.rightPinnedBody.nativeElement.scrollTop;\r\n this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\r\n this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\r\n }\r\n\r\n fakeScrollbarScrollLeft = 0;\r\n onFakeScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n this.fakeScrollbarScrollLeft = target.scrollLeft;\r\n this.centerPinnedBody.nativeElement.scrollLeft = target.scrollLeft;\r\n this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n\r\n\r\n\r\n\r\n getNestedValue(obj: any, field: string): any {\r\n return field.split('.').reduce((acc, part) => acc && acc[part], obj);\r\n }\r\n\r\n isNestedValueArray(obj: any, field: string): boolean {\r\n if (!obj || !field) return false;\r\n const value = field\r\n .split('.')\r\n .reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\r\n return Array.isArray(value);\r\n }\r\n\r\n onResizeGroup(event: MouseEvent, col: any, isRightPinned?: boolean): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n const children = col.children || [];\r\n if (!children.length) return;\r\n\r\n // Cache DOM elements for better performance\r\n const childElements = children.map((child: any) => ({\r\n field: child.field,\r\n elements: Array.from(document.querySelectorAll(`[field=\"${child.field}\"]`)) as HTMLElement[],\r\n initialWidth: (document.querySelector(`[field=\"${child.field}\"]`) as HTMLElement)?.offsetWidth || 0\r\n }));\r\n\r\n const totalInitialWidth = childElements.reduce((sum, child) => sum + child.initialWidth, 0);\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n let deltaX = moveEvent.clientX - startX;\r\n\r\n if (isRightPinned) {\r\n deltaX = -deltaX;\r\n }\r\n\r\n // Prevent shrinking too small\r\n if (totalInitialWidth + deltaX < children.length * 80) return;\r\n\r\n let totalNewWidth = 0;\r\n\r\n childElements.forEach((child) => {\r\n const ratio = child.initialWidth / totalInitialWidth;\r\n const newWidth = Math.max(child.initialWidth + deltaX * ratio, 80);\r\n totalNewWidth += newWidth;\r\n\r\n // Batch DOM updates\r\n child.elements.forEach((el) => {\r\n el.style.minWidth = `${newWidth}px`;\r\n el.style.width = `${newWidth}px`;\r\n });\r\n\r\n this.updateColumnWidthInSourceByField(child.field, newWidth);\r\n });\r\n\r\n // ✅ Update group header width in DOM\r\n const groupHeaderEl = this.getCachedElement(`[group=\"${col.header}\"]`);\r\n if (groupHeaderEl) {\r\n groupHeaderEl.style.width = `${totalNewWidth}px`;\r\n this.cdr.markForCheck();\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n this.refreshHeaders();\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n private updateColumnWidthInSourceByField(field: string, width: number): void {\r\n const update = (columns: any[]) => {\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n update(col.children);\r\n } else if (col.field === field) {\r\n col.width = width;\r\n }\r\n }\r\n };\r\n\r\n update(this.columns);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onResizeColumn(event: MouseEvent, col: any): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n\r\n const targetEl = document.querySelector(`[field=\"${col.field}\"]`) as HTMLElement;\r\n const initialWidth = targetEl?.offsetWidth || 150;\r\n\r\n const matchingEls = Array.from(document.querySelectorAll(`[field=\"${col.field}\"]`)) as HTMLElement[];\r\n\r\n // 👉 Add highlight while resizing (batch operation)\r\n const highlightClass = col?.pinned === 'right' ? 'resizing-highlight-right' : 'resizing-highlight';\r\n matchingEls.forEach((el) => el.classList.add(highlightClass));\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n let deltaX = moveEvent.clientX - startX;\r\n\r\n // 👉 Reverse if the column is pinned to the right\r\n if (col.pinned === 'right') {\r\n deltaX = -deltaX;\r\n }\r\n\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 80) return;\r\n\r\n // Batch DOM updates\r\n matchingEls.forEach((el) => {\r\n el.style.minWidth = `${newWidth}px`;\r\n el.style.width = `${newWidth}px`;\r\n });\r\n\r\n this.updateColumnWidthInSourceByField(col.field, newWidth);\r\n };\r\n\r\n const onMouseUp = () => {\r\n this.refreshHeaders();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n // Remove highlights (batch operation)\r\n matchingEls.forEach((el) => {\r\n el.classList.remove('resizing-highlight');\r\n el.classList.remove('resizing-highlight-right');\r\n });\r\n\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n this.cdr.markForCheck();\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n\r\n\r\n onResizeGroupBox(event: MouseEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n\r\n const targetEl = document.getElementById('groupBoxHeaderDiv');\r\n const initialWidth = targetEl?.offsetWidth || 150;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const deltaX = moveEvent.clientX - startX;\r\n\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 100) newWidth = 100;\r\n\r\n if (targetEl) {\r\n targetEl.style.width = `${newWidth}px`;\r\n targetEl.style.minWidth = `${newWidth}px`;\r\n this.groupBoxPadding = newWidth;\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n\r\n onFilterChange(col: any): void {\r\n const filterValue = col.filterValue?.toLowerCase() || '';\r\n }\r\n\r\n // Get Body Height\r\n get bodyWrapperHeight(): string {\r\n const rows = this.showColumnsGrouping && this.showFilterRow ? 3 : (this.showColumnsGrouping || this.showFilterRow ? 2 : 1);\r\n const offset = this.headerRowHeight * rows + 17;\r\n return `calc(100% - ${offset}px)`;\r\n }\r\n\r\n // Row Hover Logic Here\r\n hoveredRowId: string | number | null = null;\r\n onRowHover(row: any): void {\r\n this.hoveredRowId = row._id || row.id;\r\n }\r\n\r\n onRowLeave(): void {\r\n this.hoveredRowId = null;\r\n }\r\n\r\n isBreaksArray(value: any): boolean {\r\n return Array.isArray(value);\r\n}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n const target = event.target as HTMLElement;\r\n this.isVisible = false;\r\n if (\r\n !this.hasParentWithClass(target, [\r\n 'three-dots',\r\n 'filter-icon-wrapper',\r\n 'column-menu',\r\n 'filter-menu',\r\n ])\r\n ) {\r\n this.activeCol = null;\r\n this.activeFilterCell = null;\r\n }\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.showActionsDropDown = false;\r\n }\r\n const insideTopFilterRow = target.closest('.filter-tags') || target.closest('.add-filter-button-menu') ||\r\n target.closest('.table-right-top-actions') || target.closest('.table-layout') || target.closest('.filter-row-filter-wrapper');\r\n const isClickedInsideThreeDotsFilter = target.closest('.three-dots-filter') || target.closest('.filter-menu-container');\r\n if (!isClickedInsideThreeDotsFilter) {\r\n this.closeThreeDotsMenuFilter();\r\n }\r\n if (!insideTopFilterRow) {\r\n this.closeFilterDropdowns(event);\r\n }\r\n if(!target.closest('.set-default-preset')){\r\n document.querySelector('.set-default-preset')?.classList?.remove('show');\r\n }\r\n\r\n // if (!target.closest('.custom-tooltip') && !target.closest('.circle-value')) {\r\n // this.tooltipVisible = false;\r\n // }\r\n\r\n// if (!target.closest('.popover__content') && !target.closest('[class*=\"popover__wrapper\"]')) {\r\n// this.restrictionTooltipVisible = false;\r\n// this.closeManualLogsModal();\r\n// }\r\n\r\n // Close detail column menu when clicking outside\r\n if (!this.hasParentWithClass(event.target as HTMLElement, ['detail-column-menu', 'three-dots'])) {\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n }\r\n\r\n\r\n const insideDetailTable = target.closest('.accordion-details-wrapper');\r\n if (!insideDetailTable) {\r\n this.detailSelectionState.clear();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n }\r\n\r\n\r\n closeThreeDotsMenuFilter() {\r\n this.isThreeDotsFilterOpen = false;\r\n }\r\n\r\n\r\n closeFilterDropdowns(event: MouseEvent) {\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n this.activeFilterCell = null;\r\n }\r\n\r\n private hasParentWithClass(\r\n element: HTMLElement,\r\n classList: string[]\r\n ): boolean {\r\n let el: HTMLElement | null = element;\r\n\r\n while (el !== null) {\r\n if (\r\n el.classList &&\r\n classList.some((className) => el!.classList.contains(className))\r\n ) {\r\n return true;\r\n }\r\n el = el.parentElement;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isMenueHidden = false;\r\nopenThreeDotsMenu(event: MouseEvent, child: any) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isMenueHidden = true;\r\n\r\n this.activeCol = child;\r\n this.activeFilterCell = null;\r\n\r\n const clickX = event.clientX;\r\n const screenWidth = window.innerWidth;\r\n const menuWidth = 240; // your menu size\r\n\r\n requestAnimationFrame(() => {\r\n const element = this.getCachedElement('.column-menu');\r\n\r\n if (element) {\r\n let leftPos = clickX;\r\n\r\n // If menu overflows on right → open to the left\r\n if (clickX + menuWidth > screenWidth) {\r\n leftPos = clickX - menuWidth;\r\n }\r\n\r\n // If menu overflows on left → push to 0\r\n if (leftPos < 0) {\r\n leftPos = 0;\r\n }\r\n\r\n element.style.left = `${leftPos}px`;\r\n }\r\n\r\n this.isMenueHidden = false;\r\n this.cdr.markForCheck();\r\n });\r\n}\r\n\r\n // ////////////////////////////////////////////////////////////////////////////////////////\r\n // ////////////////////////////////////////////////////////////////////////////////////////\r\n // Column Three Dots Actions\r\n // //////////////////////////////////////////////////////////////////////////////////////\r\n // //////////////////////////////////////////////////////////////////////////////////////\r\n sortAsc(col: any) {\r\n this.startPerformanceTimer('sortTime');\r\n\r\n if (!col.is_sortable) return;\r\n col!.order_by = 'asc';\r\n this.sortingConfig = { field: col.field, order_by: 'asc' };\r\n const event = {\r\n order: 'asc',\r\n column: col\r\n }\r\n this.cdr.detectChanges();\r\n this.sortingOrderOptions.emit(event);\r\n\r\n // Emit generic event to trigger API call with sorting\r\n const apiEvent = {\r\n obj: {\r\n sortingConfig: this.sortingConfig\r\n },\r\n eventType: 'sort'\r\n };\r\n this.genericEvent.emit(apiEvent);\r\n\r\n this.endPerformanceTimer('sortTime');\r\n }\r\n\r\n sortDesc(col: any) {\r\n this.startPerformanceTimer('sortTime');\r\n\r\n if (!col.is_sortable) return;\r\n col!.order_by = 'desc';\r\n this.sortingConfig = { field: col.field, order_by: 'desc' };\r\n const event = {\r\n order: 'desc',\r\n column: col\r\n }\r\n this.cdr.detectChanges();\r\n this.sortingOrderOptions.emit(event);\r\n\r\n // Emit generic event to trigger API call with sorting\r\n const apiEvent = {\r\n obj: {\r\n sortingConfig: this.sortingConfig\r\n },\r\n eventType: 'sort'\r\n };\r\n this.genericEvent.emit(apiEvent);\r\n\r\n this.endPerformanceTimer('sortTime');\r\n }\r\n\r\n resetSort(col: any) {\r\n this.sortingConfig = { field: '', order_by: '' };\r\n const event = { field: null, order_by: null }\r\n this.cdr.detectChanges();\r\n this.sortingOrderOptions.emit(event);\r\n\r\n // Emit generic event to trigger API call with reset sorting\r\n const apiEvent = {\r\n obj: {\r\n sortingConfig: this.sortingConfig\r\n },\r\n eventType: 'sort'\r\n };\r\n this.genericEvent.emit(apiEvent);\r\n }\r\n\r\n\r\n async updateColumnPinInSourceByField(\r\n column: any,\r\n pinned: 'left' | 'right' | null\r\n ) {\r\n const update = (columns: any[]) => {\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n update(col.children);\r\n } else if (col.field === column.field) {\r\n col.pinned = pinned;\r\n }\r\n }\r\n };\r\n this.activeCol = null;\r\n update(this.columns);\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n autosizeColumn(cols: any | any[]): void {\r\n this.activeCol = null;\r\n\r\n // Normalize input to an array\r\n const columnsToResize = Array.isArray(cols) ? cols : [cols];\r\n\r\n // Helper: Flatten all visible leaf columns\r\n const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n const result: any[] = [];\r\n for (const column of columns) {\r\n if (column.children && Array.isArray(column.children)) {\r\n result.push(...getVisibleLeafColumns(column.children));\r\n } else if (column.is_visible) {\r\n result.push(column);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n const visibleColumns = getVisibleLeafColumns(this.columns);\r\n const visibleCount = visibleColumns.length;\r\n\r\n if (visibleCount === 0) return;\r\n\r\n const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\r\n const equalWidth = Math.floor(containerWidth / visibleCount);\r\n\r\n // Resize each passed column\r\n for (const col of columnsToResize) {\r\n if (col && col.field) {\r\n col.width = equalWidth;\r\n this.updateColumnWidthInSourceByField(col.field, equalWidth);\r\n }\r\n }\r\n\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n }\r\n\r\n getGroupWidth(group: any): number {\r\n return (\r\n group?.children\r\n ?.filter((col: any) => col?.is_visible)\r\n ?.reduce((acc: number, col: any) => acc + (col?.width || 0), 0) || 0\r\n );\r\n }\r\n\r\n autosizeAllColumns(): void {\r\n this.activeCol = null;\r\n\r\n const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n const result: any[] = [];\r\n\r\n for (const column of columns) {\r\n if (column.children && Array.isArray(column.children)) {\r\n result.push(...getVisibleLeafColumns(column.children));\r\n } else if (column.is_visible !== false) {\r\n result.push(column);\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const visibleColumns = getVisibleLeafColumns(this.columns);\r\n const visibleCount = visibleColumns.length;\r\n\r\n if (visibleCount === 0) return;\r\n\r\n const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\r\n const equalWidth = Math.max(Math.floor(containerWidth / visibleCount), 150);\r\n\r\n // Update widths for all visible columns\r\n visibleColumns.forEach((col) => {\r\n col.width = equalWidth;\r\n this.updateColumnWidthInSourceByField(col.field, equalWidth);\r\n });\r\n\r\n this.refreshHeaders();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n private markColumnAsGrouped(columns: any[], field: string): void {\r\n for (const col of columns) {\r\n if (col.field === field) {\r\n col.isRowGrouped = true;\r\n return;\r\n }\r\n if (col.children?.length) {\r\n this.markColumnAsGrouped(col.children, field);\r\n }\r\n }\r\n }\r\n\r\n async groupBy(col: any) {\r\n this.activeCol = null;\r\n if (!col) return;\r\n\r\n // Check if column is already grouped - implement toggle behavior\r\n const isAlreadyGrouped = this.groupedColumns.some(groupedCol => groupedCol.field === col.field);\r\n\r\n if (isAlreadyGrouped) {\r\n // Ungroup the column\r\n await this.ungroupColumn(col);\r\n return;\r\n }\r\n\r\n // Group the column (existing logic)\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n\r\n if (col?.is_groupable) {\r\n this.groupedColumns.push(col);\r\n this.markColumnAsGrouped(this.columns, col.field);\r\n }\r\n\r\n const fields = this.groupedColumns.map((item) => item.field);\r\n\r\n // Use worker for heavy grouping operations\r\n if (this.originalDataSet.length > 1000) {\r\n try {\r\n const groupedData = await this.processHeavyComputationsWithWorker(this.originalDataSet, 'group');\r\n this.dataSet = groupedData.map((group: any) => ({\r\n isGroup: true,\r\n groupField: fields[0], // Primary grouping field\r\n groupValue: group.key,\r\n children: group.items,\r\n isExpand: false\r\n }));\r\n } catch (error) {\r\n console.warn('Worker grouping failed, falling back to main thread:', error);\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n }\r\n } else {\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateFlattenedData();\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.updateVisibleRows(0);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }, 100);\r\n\r\n setTimeout(() => {\r\n this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\r\n this.cdr.detectChanges()\r\n }, 10);\r\n }\r\n\r\n async groupDataAsync(data: any[], groupFields: string[]): Promise<any[]> {\r\n // Use web worker for heavy grouping operations if available\r\n if (typeof Worker !== 'undefined' && data.length > 1000) {\r\n return this.groupDataWithWorker(data, groupFields);\r\n }\r\n\r\n // For smaller datasets, use optimized synchronous grouping\r\n return new Promise(resolve => {\r\n // Use requestAnimationFrame for better performance than setTimeout\r\n requestAnimationFrame(() => {\r\n const result = this.groupData(data, groupFields);\r\n resolve(result);\r\n });\r\n });\r\n }\r\n\r\n private async processHeavyComputationsWithWorker(data: any[], operation: string): Promise<any> {\r\n if (typeof Worker === 'undefined') {\r\n // Fallback to main thread processing\r\n return this.processHeavyComputations(data, operation);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const workerCode = `\r\n self.onmessage = function(e) {\r\n const { data, operation } = e.data;\r\n\r\n function processData(data, operation) {\r\n try {\r\n switch(operation) {\r\n case 'filter':\r\n // Heavy filtering logic\r\n return data.filter(item => {\r\n // Complex filtering conditions\r\n return item && typeof item === 'object';\r\n });\r\n\r\n case 'sort':\r\n // Heavy sorting logic\r\n return data.sort((a, b) => {\r\n // Complex sorting logic\r\n return 0;\r\n });\r\n\r\n case 'group':\r\n // Heavy grouping logic\r\n const groups = new Map();\r\n for (const item of data) {\r\n const key = item.id || item._id || 'unknown';\r\n if (!groups.has(key)) groups.set(key, []);\r\n groups.get(key).push(item);\r\n }\r\n return Array.from(groups.entries()).map(([key, items]) => ({\r\n key,\r\n items,\r\n count: items.length\r\n }));\r\n\r\n case 'aggregate':\r\n // Heavy aggregation logic\r\n const result = {\r\n total: data.length,\r\n averages: {},\r\n sums: {}\r\n };\r\n return result;\r\n\r\n default:\r\n return data;\r\n }\r\n } catch (error) {\r\n throw new Error('Processing failed: ' + error.message);\r\n }\r\n }\r\n\r\n try {\r\n const result = processData(data, operation);\r\n self.postMessage({ success: true, result });\r\n } catch (error) {\r\n self.postMessage({ success: false, error: error.message });\r\n }\r\n };\r\n `;\r\n\r\n const blob = new Blob([workerCode], { type: 'application/javascript' });\r\n const worker = new Worker(URL.createObjectURL(blob));\r\n\r\n worker.postMessage({ data, operation });\r\n\r\n worker.onmessage = (e) => {\r\n const { success, result, error } = e.data;\r\n worker.terminate();\r\n if (success) {\r\n resolve(result);\r\n } else {\r\n reject(new Error(error));\r\n }\r\n };\r\n\r\n worker.onerror = (error) => {\r\n worker.terminate();\r\n reject(error);\r\n };\r\n\r\n // Timeout for long-running operations\r\n setTimeout(() => {\r\n worker.terminate();\r\n reject(new Error('Worker timeout'));\r\n }, 30000); // 30 second timeout\r\n });\r\n }\r\n\r\n private processHeavyComputations(data: any[], operation: string): any {\r\n // Fallback processing on main thread\r\n switch(operation) {\r\n case 'filter':\r\n return data.filter(item => item && typeof item === 'object');\r\n case 'sort':\r\n return [...data].sort();\r\n case 'group':\r\n const groups = new Map();\r\n for (const item of data) {\r\n const key = item.id || item._id || 'unknown';\r\n if (!groups.has(key)) groups.set(key, []);\r\n groups.get(key).push(item);\r\n }\r\n return Array.from(groups.entries()).map(([key, items]) => ({\r\n key,\r\n items,\r\n count: items.length\r\n }));\r\n case 'aggregate':\r\n return {\r\n total: data.length,\r\n averages: {},\r\n sums: {}\r\n };\r\n default:\r\n return data;\r\n }\r\n }\r\n\r\n private async groupDataWithWorker(data: any[], groupFields: string[]): Promise<any[]> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const workerCode = `\r\n self.onmessage = function(e) {\r\n const { data, groupFields } = e.data;\r\n\r\n function groupData(data, groupFields) {\r\n if (!groupFields.length) return data;\r\n const [currentField, ...restFields] = groupFields;\r\n const groupedMap = new Map();\r\n\r\n for (const item of data) {\r\n let keyValue = currentField.split('.').reduce((obj, k) => obj?.[k], item);\r\n let groupKey = keyValue ?? \"_Blank\";\r\n if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\r\n groupedMap.get(groupKey).push(item);\r\n }\r\n\r\n return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\r\n isGroup: true,\r\n groupField: currentField,\r\n groupValue,\r\n children: groupData(groupItems, restFields),\r\n isExpand: false,\r\n }));\r\n }\r\n\r\n const result = groupData(data, groupFields);\r\n self.postMessage(result);\r\n };\r\n `;\r\n\r\n const blob = new Blob([workerCode], { type: 'application/javascript' });\r\n const worker = new Worker(URL.createObjectURL(blob));\r\n\r\n worker.postMessage({ data, groupFields });\r\n\r\n worker.onmessage = (e) => {\r\n resolve(e.data);\r\n worker.terminate();\r\n };\r\n\r\n worker.onerror = (error) => {\r\n reject(error);\r\n worker.terminate();\r\n };\r\n\r\n // Timeout fallback\r\n setTimeout(() => {\r\n worker.terminate();\r\n reject(new Error('Grouping timeout'));\r\n }, 10000);\r\n\r\n } catch (error) {\r\n // Fallback to main thread if worker fails\r\n resolve(this.groupData(data, groupFields));\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n chooseColumns() {\r\n this.activeCol = null;\r\n this.showColumnPanel = true;\r\n }\r\n\r\n resetColumns() {\r\n this.activeCol = null;\r\n\r\n this.columns = structuredClone(this.originalColumns);\r\n this.SetColumnsDefaultWidth();\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }\r\n\r\n clearFilter(col: any) {\r\n col.firstValue = '';\r\n col.secondValue = '';\r\n col.firstCondition = 'contains';\r\n col.secondCondition = 'contains';\r\n col.logic = 'AND';\r\n col.selectAll = false;\r\n col.selectedOptions = {};\r\n col.searchValue = '';\r\n\r\n }\r\n\r\n\r\n applyFilter(col: any) {\r\n this.filterColumnsList.push(col);\r\n }\r\n\r\n // Rows Selection Logic Goes Here\r\n\r\n selectedRows: Set<string> = new Set();\r\n\r\n /**\r\n * Get normalized ID from row.\r\n */\r\n private getRowId(row: any): string {\r\n return row.id ?? row._id;\r\n }\r\n\r\n /**\r\n * Toggle a single row selection.\r\n */\r\n toggleRowSelection(row: any): void {\r\n const id = this.getRowId(row);\r\n if (this.selectedRows.has(id)) {\r\n this.selectedRows.delete(id);\r\n } else {\r\n this.selectedRows.add(id);\r\n }\r\n\r\n const ids = Array.from(this.selectedRows);\r\n const event = {\r\n data: {\r\n listingType: this.listingType,\r\n obj: ids\r\n },\r\n eventType: \"onSelectRow\",\r\n }\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n\r\n toggleSelectAll(data: any[]): void {\r\n const allIds = this.originalDataSet.map((row) => this.getRowId(row));\r\n const allSelected = allIds.every((id) => this.selectedRows.has(id));\r\n\r\n if (allSelected) {\r\n allIds.forEach((id) => this.selectedRows.delete(id));\r\n } else {\r\n allIds.forEach((id) => this.selectedRows.add(id));\r\n }\r\n this.cdr.detectChanges();\r\n const ids = Array.from(this.selectedRows);\r\n const event = {\r\n data: {\r\n listingType: this.listingType,\r\n obj: ids\r\n },\r\n eventType: \"onSelectRow\",\r\n }\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n isRowSelected(row: any): boolean {\r\n return this.selectedRows.has(this.getRowId(row));\r\n }\r\n\r\n isAllSelected(data: any[]): boolean {\r\n return (data?.every((row) => this.selectedRows.has(this.getRowId(row))) && (this.dataSet?.length > 0));\r\n }\r\n\r\n isIndeterminateState(data: any[]): boolean {\r\n if (!data || data.length === 0) return false;\r\n const selectedCount = data.filter(row => this.selectedRows.has(this.getRowId(row))).length;\r\n return selectedCount > 0 && selectedCount < data.length;\r\n }\r\n\r\n // Side Menu Working Goes Here\r\n toggleSideMenu(clickedOn: 'cols' | 'filtrs') {\r\n if (this.currentOpenedSideMenue == clickedOn) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n } else if (\r\n this.sideMenuVisible &&\r\n clickedOn != this.currentOpenedSideMenue\r\n ) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n return;\r\n } else {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n }\r\n }\r\n\r\n toggleGroupVisibility(col: any) {\r\n const allVisible = col.children.every((child: any) => child.is_visible);\r\n col.children.forEach((child: any) => (child.is_visible = !allVisible));\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.SetColumnsDefaultWidth();\r\n this.cdr.detectChanges();\r\n }, 10);\r\n }\r\n\r\n isColumnVisible(columns: any) {\r\n if (columns?.children) {\r\n return columns.children.every((element: any) => element.is_visible);\r\n }\r\n\r\n return columns?.is_visible;\r\n }\r\n\r\n allColumnsSelected(): boolean {\r\n const flatten = this.flattenColumns(this.columns);\r\n return flatten.every((col) => col.is_visible);\r\n }\r\n\r\n\r\n private findColumnByField(field: string, cols: any[]): any | null {\r\n for (const col of cols) {\r\n if (col.field === field) {\r\n return col;\r\n }\r\n if (col.children && Array.isArray(col.children)) {\r\n const found = this.findColumnByField(field, col.children);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n\r\n\r\n async toggleColumnVisibility(column: any, isVisible: boolean) {\r\n const col = this.findColumnByField(column.field, this.columns);\r\n if (col) {\r\n col.is_visible = isVisible;\r\n }\r\n await this.refreshHeaders();\r\n this.cdr.detectChanges();\r\n\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n };\r\n this.createUpdateConfigListing.emit(event);\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n\r\n\r\n toggleAllColumnsVisibility(): void {\r\n const flatten = this.flattenColumns(this.columns);\r\n const allSelected = flatten.every((col: any) => col.is_visible);\r\n flatten.forEach((col: any) => (col.is_visible = !allSelected));\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n setTimeout(() => {\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }, 100);\r\n }\r\n\r\n flattenColumns(cols: any[]): any[] {\r\n return cols.reduce((acc: any[], col: any) => {\r\n if (col?.children && col.children.length) {\r\n // recursively flatten children\r\n return acc.concat(this.flattenColumns(col.children));\r\n } else {\r\n // leaf column\r\n return acc.concat(col);\r\n }\r\n }, []);\r\n }\r\n\r\n\r\n filteredColumns(cols: any[]): any[] {\r\n const search = this.columnSearch.toLowerCase();\r\n return cols\r\n .map((col) => {\r\n if (col.children) {\r\n const filteredChildren = this.filteredColumns(col.children);\r\n if (\r\n col.header.toLowerCase().includes(search) ||\r\n filteredChildren.length\r\n ) {\r\n return { ...col, children: filteredChildren };\r\n }\r\n return null;\r\n } else {\r\n return col.header.toLowerCase().includes(search) ? col : null;\r\n }\r\n })\r\n .filter(Boolean);\r\n }\r\n\r\n get accordionState(): 'all' | 'none' | 'some' {\r\n const groups = this.getAllGroupColumns(this.columns);\r\n const expandedCount = groups.filter((col) => col.expanded).length;\r\n\r\n if (expandedCount === 0) return 'none';\r\n if (expandedCount === groups.length) return 'all';\r\n return 'some';\r\n }\r\n\r\n get filterAccordionState(): 'all' | 'none' | 'some' {\r\n const groups = this.getAllGroupColumns(this.columns);\r\n const expandedCount = groups.filter((col) => col.expandedFilter).length;\r\n\r\n if (expandedCount === 0) return 'none';\r\n if (expandedCount === groups.length) return 'all';\r\n return 'some';\r\n }\r\n\r\n // Recursively collect all group columns\r\n private getAllGroupColumns(cols: any[]): any[] {\r\n let groups: any[] = [];\r\n for (const col of cols) {\r\n if (col.children?.length) {\r\n groups.push(col);\r\n groups = groups.concat(this.getAllGroupColumns(col.children));\r\n }\r\n }\r\n return groups;\r\n }\r\n\r\n // Toggle based on current state\r\n toggleAllAccordions(): void {\r\n const nextState = this.accordionState === 'all' ? false : true;\r\n this.setAccordionState(this.columns, nextState);\r\n }\r\n\r\n toggleAllFilterAccordions(): void {\r\n const nextState = this.filterAccordionState === 'all' ? false : true;\r\n this.setFilterAccordionState(this.columns, nextState);\r\n }\r\n\r\n private setAccordionState(cols: any[], state: boolean): void {\r\n for (let col of cols) {\r\n if (col.children?.length) {\r\n col.expanded = state;\r\n this.setAccordionState(col.children, state); // Recursively handle nested\r\n }\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n private setFilterAccordionState(cols: any[], state: boolean): void {\r\n for (let col of cols) {\r\n if (col.children?.length) {\r\n col.expandedFilter = state;\r\n this.setFilterAccordionState(col.children, state); // Recursively handle nested\r\n }\r\n }\r\n }\r\n\r\n showColumnPanel = false;\r\n\r\n closeModalColumnPanel() {\r\n this.showColumnPanel = false;\r\n }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n onEscape(event: KeyboardEvent) {\r\n this.closeModalColumnPanel();\r\n }\r\n\r\n // Check If Any column have right pinned\r\n get hasRightPinnedColumns() {\r\n return this.commonSevice.gethasRightPinnedColumns(this.columns);\r\n }\r\n\r\n get hasLeftPinnedColumns() {\r\n return this.commonSevice.gethasLeftPinnedColumns(this.columns);\r\n }\r\n\r\n get dataSetLength() {\r\n return this.commonSevice.getExpandedRowCount(this.dataSet);\r\n }\r\n\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: UIEvent) {\r\n // Trigger viewport resize handling through reactive stream\r\n // this.viewportResizeSubject.next();\r\n }\r\n\r\n async refreshHeaders() {\r\n this.ngZone.runOutsideAngular(async () => {\r\n await new Promise(r => setTimeout(r, 0));\r\n await this.updateColumnWidthsAndGroups();\r\n await this.refreshPreviewColumns();\r\n\r\n this.ngZone.run(() => this.cdr.detectChanges());\r\n });\r\n }\r\n\r\n async onBadgeOverflowCountClick(col: any) {\r\n // Increase the width of the breaks column when overflow count is clicked\r\n if (col && col.field === 'breaks') {\r\n const currentWidth = col.width || 200;\r\n const newWidth = Math.min(currentWidth + 100, 500); // Increase by 100px, max 500px\r\n col.width = newWidth;\r\n\r\n // Update the column width in the source\r\n this.updateColumnWidthInSourceByField(col.field, newWidth);\r\n\r\n // Refresh headers to apply changes\r\n await this.refreshHeaders();\r\n }\r\n }\r\n\r\n get hasAnyVisibleColumn() {\r\n return this.commonSevice.gethasVisibleColumns(this.columns);\r\n }\r\n\r\n get hasAnyInVisibleColumn() {\r\n return this.commonSevice.gethasInVisibleColumns(this.columns);\r\n }\r\n\r\n get columnsCount() {\r\n return this.commonSevice.getTotalColumnsLength(this.columns);\r\n }\r\n\r\n tableHeaderAndBodyHeight() {\r\n return `calc(100% - ${this.footerRowHeight})`;\r\n }\r\n\r\n draggingInGroupArea = false;\r\n\r\n @ViewChild('centerScroll') centerScroll!: ElementRef<HTMLDivElement>;\r\n visibleRowCount = 25;\r\n startIndex = 0;\r\n visibleRows: any[] = [];\r\n\r\n private flattenGroupedRows(\r\n rows: any[] = [],\r\n level = 0,\r\n result: any[] = []\r\n ): any[] {\r\n for (const row of rows) {\r\n result.push({ ...row, __depth: level });\r\n if (row.isGroup && row.isExpand && row.children?.length) {\r\n this.flattenGroupedRows(row.children, level + 1, []);\r\n }\r\n }\r\n this.assignVirtualIndexes(this.visibleRows);\r\n return result;\r\n }\r\n\r\n assignVirtualIndexes(data: any[]): any[] {\r\n let currentIndex = 1;\r\n const walk = (items: any[]): void => {\r\n for (const item of items) {\r\n item.__virtualIndex = currentIndex++;\r\n if (item?.isGroup) {\r\n const group = item;\r\n if (group.isExpand && Array.isArray(group.children)) {\r\n walk(group.children);\r\n }\r\n }\r\n }\r\n };\r\n walk(data);\r\n console.log('This dataset: ', this.visibleRows)\r\n return data;\r\n }\r\n\r\n\r\n updateVisibleRows(scrollTop: number) {\r\n this.updateVisibleRowsOptimized(scrollTop);\r\n }\r\n\r\n private updateVisibleRowsOptimized(scrollTop: number): void {\r\n const cacheKey = `visibleRows_${scrollTop}_${this.dataSet.length}`;\r\n const cached = this.getComputationCache(cacheKey);\r\n if (cached) {\r\n this.visibleRows = cached;\r\n return;\r\n }\r\n\r\n const flatData = this.flattenGroupedRows(this.dataSet);\r\n // Show all data instead of virtual scrolling to display all items\r\n this.visibleRows = [...flatData]; // Immutable copy\r\n this.firstIndex = 0;\r\n this.startIndex = 0;\r\n this.renderStart = 0;\r\n this.assignVirtualIndexes(this.visibleRows);\r\n\r\n this.setComputationCache(cacheKey, this.visibleRows);\r\n }\r\n\r\n\r\n trackByRenderedIndex = (i: number, _row: any) => this.renderStart + i;\r\n\r\n private isSyncingFromMain = false;\r\n private isSyncingFromFake = false;\r\n private mainScrollRaf: number | null = null;\r\n\r\n trackById(index: number, item: any) {\r\n return item.id || item._id || item.__virtualIndex || index;\r\n }\r\n\r\n // Enhanced trackBy functions for better performance\r\n trackByColumnField(index: number, item: any) {\r\n return item?.field || index;\r\n }\r\n\r\n trackByColumn(index: number, item: any) {\r\n return item?.field || item?.header || index;\r\n }\r\n\r\n trackByRow(index: number, item: any) {\r\n return item?.id || item?._id || item?.__virtualIndex || index;\r\n }\r\n\r\n trackByGroupedRow(index: number, item: any) {\r\n return item?.groupValue || item?.id || item?._id || index;\r\n }\r\n\r\n flattenedData: any[] = [];\r\n\r\n updateFlattenedData(): void {\r\n setTimeout(() => {\r\n this.flattenedData = [...this.flattenGroupedRows(this.dataSet)]; // Immutable copy\r\n this.cdr.markForCheck(); // Use markForCheck instead of detectChanges for better performance\r\n }, 10);\r\n }\r\n\r\n // requestAnimationFrame IDs\r\n private fakeScrollRaf: number | null = null;\r\n private autoScrollInterval: number | null = null;\r\n\r\n\r\n translateY = 0;\r\n\r\n @Output() loadMore = new EventEmitter<void>();\r\n\r\n // Remove the old onMainScroll method as it's now handled by the reactive stream\r\n\r\n\r\n get isScrollbarVisible(): boolean {\r\n if (!this.mainScroll) return false;\r\n const el = this.mainScroll.nativeElement;\r\n return el.scrollHeight > el.clientHeight;\r\n }\r\n\r\n // toggleExpand(row: any) {\r\n // if (row.details) {\r\n // row.isDetailsExpand = !row.isDetailsExpand;\r\n // } else {\r\n // row.isExpand = !row.isExpand;\r\n // }\r\n\r\n // // setTimeout(() => {\r\n // // this.cdr.detectChanges();\r\n // // }, 100);\r\n // }\r\n\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand) {\r\n// if (!row.details.originalColumns) {\r\n// row.details.originalColumns = structuredClone(row.details.columns);\r\n// }\r\n// // 👇 Prefer originalFlatData, fallback to current data only if needed\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = structuredClone(\r\n// row.details.originalFlatData || row.details.data\r\n// );\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n onMainFakeScroll(event: Event) {\r\n if (this.isSyncingFromMain) {\r\n this.isSyncingFromMain = false;\r\n return;\r\n }\r\n if (this.groupedColumns?.length > 0) {\r\n this.startIndex = 0;\r\n this.cdr.detectChanges();\r\n return;\r\n }\r\n const scrollTop = (event.target as HTMLElement).scrollTop;\r\n if (this.mainScrollRaf) cancelAnimationFrame(this.mainScrollRaf);\r\n this.mainScrollRaf = requestAnimationFrame(() => {\r\n this.isSyncingFromFake = true;\r\n this.mainScroll.nativeElement.scrollTop = scrollTop;\r\n const overscan = this.overscan ?? 0;\r\n this.startIndex = Math.floor(scrollTop / this.rowHeight);\r\n const start = Math.max(0, this.startIndex - overscan);\r\n const end = Math.min(\r\n this.flattenedData.length,\r\n this.startIndex + this.viewportRows + overscan\r\n );\r\n this.visibleRows = this.flattenedData.slice(start, end);\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n\r\n viewportRows = 0; // how many rows fit in viewport (computed)\r\n firstIndex = 0; // index of the first visible row (clamped)\r\n renderStart = 0; // where the slice actually starts (firstIndex - overscan, clamped)\r\n\r\n private scrollRaf: number | null = null;\r\n private pendingScrollTop = 0;\r\n\r\n @ViewChild('mainScroll') mainScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('fakeScroll') fakeScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('horizintalFakeScroll')\r\n horizintalFakeScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerScrollableBody')\r\n centerScrollableBody!: ElementRef<any>;\r\n private overscan = 10; // buffer rows above and below\r\n\r\n computeViewportRows() {\r\n if (this.fakeScroll?.nativeElement) {\r\n this.fakeScroll.nativeElement.scrollTop = 0;\r\n }\r\n\r\n if (this.mainScroll?.nativeElement) {\r\n this.mainScroll.nativeElement.scrollTop = 0;\r\n const h = this.mainScroll.nativeElement.clientHeight ?? 0;\r\n\r\n // rows visible in viewport\r\n const rowsInViewport = Math.max(1, Math.ceil(h / this.rowHeight));\r\n\r\n // add buffer rows (overscan)\r\n this.viewportRows = rowsInViewport + this.overscan * 2;\r\n\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n\r\n onHorizintalFakeScroll(event: Event) {\r\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n this.centerScrollableBody.nativeElement.scrollLeft = scrollLeft;\r\n }\r\n\r\n onCenterBodyScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n if (this.centerPinnedHeader) {\r\n this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n }\r\n\r\n onCenterHeaderScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n if (this.horizintalFakeScroll?.nativeElement) {\r\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n if (this.centerScrollableBody?.nativeElement) {\r\n this.centerScrollableBody.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n }\r\n\r\n // Dragging Logic is implemented here\r\n // private initialIndex: number | null = null;\r\n\r\n draggingColumn: any;\r\n dragStartIndex: any = 0;\r\n // onDragStart(data: any, index: number) {\r\n // this.draggingColumn = data.column;\r\n // this.dragStartIndex = index;\r\n // }\r\n // onDragMove(data: any) {\r\n // const { clientX, clientY } = data.event;\r\n // const headers = Array.from(\r\n // document.querySelectorAll('.one-row-header-cells')\r\n // ) as HTMLElement[];\r\n\r\n // headers.forEach((headerEl, idx) => {\r\n // const rect = headerEl.getBoundingClientRect();\r\n // if (\r\n // idx !== this.dragStartIndex &&\r\n // clientX > rect.left &&\r\n // clientX < rect.right &&\r\n // clientY > rect.top &&\r\n // clientY < rect.bottom\r\n // ) {\r\n // const otherIndex = idx;\r\n // console.log(`${this.dragStartIndex} --> ${otherIndex}`);\r\n // this.swapColumn(this.dragStartIndex, otherIndex);\r\n // console.log('Updated Columns: ', this.columns);\r\n // this.dragStartIndex = otherIndex; // update index\r\n // }\r\n // });\r\n // }\r\n\r\n // swapColumn(previusIndex: number, currentIndex: number) {\r\n // const columns = structuredClone(this.columns);\r\n // const flattenColumns = this.flattenColumns(columns);\r\n\r\n // const visibleFlattenColumns = flattenColumns.filter(\r\n // (col) => col.is_visible\r\n // );\r\n // const previusColumn = visibleFlattenColumns[previusIndex];\r\n // const currentColumn = visibleFlattenColumns[currentIndex];\r\n\r\n // console.log('Previus Column: ', previusColumn);\r\n // console.log('current clumn: ', currentColumn);\r\n // }\r\n\r\n // onDragEnd(data: any) {\r\n // this.draggingColumn = null;\r\n // this.dragStartIndex = null;\r\n // }\r\n\r\n // CDK DRAG DROP LOGIC GOES HERE\r\n\r\n\r\n canEnterToRowsGrouping = (drag: CdkDrag<any>, drop: CdkDropList<any>) => {\r\n // Example: Block if already pinned left\r\n const data = drag.data;\r\n if (data?.children && data?.children.length) {\r\n return data.children.some(\r\n (col: any) => col.is_visible && col.is_groupable\r\n );\r\n }\r\n return data.is_visible && data.is_groupable;\r\n };\r\n\r\n onDragMoved(event: CdkDragMove<any>) {\r\n const pointerX = event.pointerPosition.x;\r\n const pointerY = event.pointerPosition.y;\r\n\r\n const targetElement = document.getElementById(\r\n 'rows-grouping-top-container'\r\n );\r\n\r\n if (targetElement) {\r\n const rect = targetElement.getBoundingClientRect();\r\n\r\n const isOverTarget =\r\n pointerX >= rect.left &&\r\n pointerX <= rect.right &&\r\n pointerY >= rect.top &&\r\n pointerY <= rect.bottom;\r\n\r\n if (isOverTarget) {\r\n this.draggingInGroupArea = true;\r\n } else {\r\n this.draggingInGroupArea = false;\r\n }\r\n }\r\n }\r\n\r\n enterToTopRowGrouping(dropList: CdkDragEnter<any>) {\r\n const draggingData = dropList.item.data;\r\n this.draggingInGroupArea = true;\r\n\r\n if (Array.isArray(draggingData?.children)) {\r\n const targetGroup = this.columns.find(\r\n (col) => col.header === draggingData.header\r\n );\r\n if (targetGroup) {\r\n draggingData.children.forEach((draggedChild: any) => {\r\n const matchingChild = targetGroup.children.find(\r\n (child: any) => child.field === draggedChild.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = !!matchingChild.is_groupable;\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n // Try finding it in top-level columns first\r\n let targetColumn = this.columns.find(\r\n (col: any) => col.field === draggingData.field\r\n );\r\n\r\n if (targetColumn) {\r\n targetColumn.isRowGrouped = !!targetColumn.is_groupable;\r\n } else {\r\n for (let group of this.columns) {\r\n if (Array.isArray(group.children)) {\r\n const matchingChild = group.children.find(\r\n (child: any) => child.field === draggingData.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = !!matchingChild.is_groupable;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ✅ Refresh UI\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n onDropListEnter(\r\n dropList: CdkDragEnter<any>,\r\n section: 'left' | 'center' | 'right'\r\n ) {\r\n const draggingData = dropList.item.data;\r\n\r\n const targetColumn: any = this.columns.find(\r\n (col) => col.header == draggingData.header\r\n );\r\n\r\n if (!targetColumn) return;\r\n\r\n if (\r\n Array.isArray(draggingData?.children) &&\r\n Array.isArray(targetColumn?.children)\r\n ) {\r\n draggingData.children.forEach((draggedChild: any) => {\r\n const matchingChild = targetColumn.children.find(\r\n (child: any) => child.field === draggedChild.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.pinned = section === 'center' ? null : section;\r\n matchingChild['isRowGrouped'] = false;\r\n }\r\n });\r\n } else {\r\n targetColumn.pinned = section === 'center' ? null : section;\r\n targetColumn['isRowGrouped'] = false;\r\n }\r\n\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n enterToTopGroupingRow(dropList: CdkDragEnter<any>) {\r\n this.shouldDisableDroplistSorting = this.isDisableColumnGrouping;\r\n this.draggingInGroupArea = true;\r\n // const index = this.groupedColumns.findIndex(\r\n // (col) => col.field === column.field\r\n // );\r\n // if (index !== -1) {\r\n // this.groupedColumns.splice(index, 1);\r\n // }\r\n\r\n // // 2. Traverse this.columns to find and update the matching column\r\n // this.columns.forEach((group) => {\r\n // if (group?.children && Array.isArray(group.children)) {\r\n // group.children.forEach((child) => {\r\n // if (child.field === column.field) {\r\n // child.isRowGrouped = false;\r\n // }\r\n // });\r\n // } else if (group.field === column.field) {\r\n // group.isRowGrouped = false;\r\n // }\r\n // });\r\n this.cdr.detectChanges();\r\n }\r\n\r\n exitedFromTheTopRow(dropList: CdkDragExit<any>) {\r\n this.draggingInGroupArea = false;\r\n this.isDisableColumnGrouping = false;\r\n this.shouldDisableDroplistSorting = false;\r\n const draggingData = dropList.item.data;\r\n if (Array.isArray(draggingData?.children)) {\r\n const targetGroup = this.columns.find(\r\n (col) => col.header === draggingData.header\r\n );\r\n if (targetGroup) {\r\n draggingData.children.forEach((draggedChild: any) => {\r\n const matchingChild = targetGroup.children.find(\r\n (child: any) => child.field === draggedChild.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = false;\r\n }\r\n });\r\n }\r\n } else {\r\n let targetColumn = this.columns.find(\r\n (col: any) => col.field === draggingData.field\r\n );\r\n\r\n if (targetColumn) {\r\n targetColumn.isRowGrouped = false;\r\n } else {\r\n for (let group of this.columns) {\r\n if (Array.isArray(group.children)) {\r\n const matchingChild = group.children.find(\r\n (child: any) => child.field === draggingData.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n shouldDisableDroplistSorting = false;\r\n isDisableColumnGrouping = false;\r\n checkColumnGroupingStatus(col: any) {\r\n if (col?.children && Array.isArray(col.children)) {\r\n const allChildrenDisabled = col.children.every(\r\n (child: any) => child.is_groupable === false\r\n );\r\n this.isDisableColumnGrouping = allChildrenDisabled;\r\n } else {\r\n this.isDisableColumnGrouping = col.is_groupable === false;\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n currentDraggingColumn: any = null;\r\n dragStartOnGroup(col: any) {\r\n this.currentDraggingColumn = col;\r\n }\r\n\r\n onSortGroup = async (event: CdkDragSortEvent<any>, section: string) => {\r\n const columns = (this as any)[section];\r\n if (event.previousIndex === event.currentIndex) return;\r\n const visibleColumns = columns.filter((col: any) => {\r\n if (col?.children && Array.isArray(col.children)) {\r\n return col.children.some((child: any) => child.is_visible);\r\n }\r\n return col.is_visible;\r\n });\r\n const previousHeader = visibleColumns[event.previousIndex].header;\r\n const currentHeader = visibleColumns[event.currentIndex].header;\r\n const visiblePrevIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === previousHeader\r\n );\r\n const visibleCurrIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === currentHeader\r\n );\r\n const getFields = (item: any): string[] => {\r\n if (item?.children && Array.isArray(item.children)) {\r\n return item.children.map((child: any) => child.field);\r\n }\r\n return [item.field];\r\n };\r\n const prevFields = getFields(visibleColumns[visiblePrevIndex]);\r\n const currFields = getFields(visibleColumns[visibleCurrIndex]);\r\n const allFields = [...prevFields, ...currFields];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n console.log(\"this .coluns\", this.columns);\r\n moveItemInArray((this as any)[section], visiblePrevIndex, visibleCurrIndex);\r\n\r\n const prevColIndexInColumns = this.columns.findIndex(item => item.header === previousHeader);\r\n const currColIndexInColumns = this.columns.findIndex(item => item.header === currentHeader);\r\n moveItemInArray(this.columns, prevColIndexInColumns, currColIndexInColumns);\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n updatedCells.forEach((el) => {\r\n const newLeft = el.getBoundingClientRect().left;\r\n const oldLeft = firstPositions.get(el)!;\r\n const deltaX = oldLeft - newLeft;\r\n if (deltaX !== 0) {\r\n el.style.willChange = 'transform';\r\n el.style.transition = 'none';\r\n el.style.transform = `translateX(${deltaX}px)`;\r\n void el.offsetWidth;\r\n el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n el.style.transform = 'translateX(0)';\r\n const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n onDropGroup() {\r\n this.leftPinnedColumns = structuredClone(this.previewLeftPinnedColumns);\r\n this.centerColumns = structuredClone(this.previewCenterColumns);\r\n this.rightPinnedColumns = structuredClone(this.previewRightPinnedColumns);\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n async onDropTopGroup(event: CdkDragDrop<any>) {\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n const draggedData = event.item.data;\r\n if (draggedData?.children && Array.isArray(draggedData.children)) {\r\n draggedData.children.forEach((col: any) => {\r\n if (col.is_visible && col.is_groupable) {\r\n this.groupedColumns.push(col);\r\n }\r\n });\r\n } else {\r\n if (draggedData.is_visible && draggedData.is_groupable) {\r\n this.groupedColumns.push(draggedData);\r\n }\r\n }\r\n this.draggingInGroupArea = false;\r\n const fields = this.groupedColumns.map((item) => item.field);\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.updateVisibleRows(0);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }\r\n\r\n async ungroupColumn(column: any) {\r\n try {\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n const index = this.groupedColumns.findIndex(\r\n (col) => col.field === column.field\r\n );\r\n if (index !== -1) {\r\n this.groupedColumns.splice(index, 1);\r\n }\r\n const fields = this.groupedColumns.map((item) => item.field);\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n this.columns.forEach((group) => {\r\n if (group?.children && Array.isArray(group.children)) {\r\n group.children.forEach((child: any) => {\r\n if (child.field === column.field) {\r\n child.isRowGrouped = false;\r\n }\r\n });\r\n } else if (group.field === column.field) {\r\n group.isRowGrouped = false;\r\n }\r\n });\r\n setTimeout(() => {\r\n this.updateFlattenedData();\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.updateVisibleRows(0);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }, 100);\r\n\r\n } catch (err) {\r\n console.error(\"Error in ungroupColumn:\", err);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n\r\n shouldTheGroupHeaderShow(group: any) {\r\n if (group?.children && group.children.length) {\r\n return group.children.some(\r\n (col: any) => col.is_visible && !col?.isRowGrouped\r\n );\r\n }\r\n return group?.is_visible && !group?.isRowGrouped;\r\n }\r\n\r\n\r\n onChildDragStart() {\r\n debugger;\r\n }\r\n\r\n dropListIds: string[] = [];\r\n\r\n generateDropListIds() {\r\n this.dropListIds = [];\r\n\r\n const sectionKeys = [\r\n 'leftPinnedColumns',\r\n 'centerColumns',\r\n 'rightPinnedColumns',\r\n ];\r\n\r\n sectionKeys.forEach((sectionKey) => {\r\n const sectionCols = (this as any)[sectionKey];\r\n\r\n this.columns.forEach((col: any, i: number) => {\r\n if (col?.children?.length > 0) {\r\n col.children.forEach((child: any, childIndex: number) => {\r\n if (child?.is_visible && !child.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n } else if (col?.is_visible && !col.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n });\r\n }\r\n\r\n onChildDroplistSorted = async (event: CdkDragSortEvent<any>, section: string) => {\r\n if (event.previousIndex === event.currentIndex) return;\r\n\r\n const pinned =\r\n section == 'previewLeftPinnedColumns'\r\n ? 'left'\r\n : section == 'previewRightPinnedColumns'\r\n ? 'right'\r\n : \"\";\r\n\r\n const column = event.item.data;\r\n let group = this.columns.find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n const groupIndex = this.columns.findIndex(\r\n (col) => col.header === group.header\r\n );\r\n const filteredGroup = group?.children.filter((col: any) => {\r\n const isPinnedMatch =\r\n (pinned === \"\" && (!col?.pinned || col?.pinned === \"\")) || col?.pinned === pinned;\r\n return isPinnedMatch && col?.is_visible;\r\n });\r\n\r\n const previousField = filteredGroup[event.previousIndex].field;\r\n const currentField = filteredGroup[event.currentIndex].field;\r\n const visiblePrevIndex = group.children.findIndex(\r\n (col: any) => col.field == previousField\r\n );\r\n const visibleCurrIndex = group.children.findIndex(\r\n (col: any) => col.field == currentField\r\n );\r\n const allFields = [previousField, currentField];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n\r\n const groupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const filterGroupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const groupInSectionIndex = (this as any)[section].findIndex(\r\n (col: any) => col.header === groupInSection.header\r\n );\r\n\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n moveItemInArray(\r\n this.columns[groupIndex]?.children,\r\n visiblePrevIndex,\r\n visibleCurrIndex\r\n );\r\n\r\n moveItemInArray(\r\n (this as any)[section]?.[groupInSectionIndex].children,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n updatedCells.forEach((el) => {\r\n const newLeft = el.getBoundingClientRect().left;\r\n const oldLeft = firstPositions.get(el)!;\r\n const deltaX = oldLeft - newLeft;\r\n if (deltaX !== 0) {\r\n el.style.willChange = 'transform';\r\n el.style.transition = 'none';\r\n el.style.transform = `translateX(${deltaX}px)`;\r\n void el.offsetWidth;\r\n el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n el.style.transform = 'translateX(0)';\r\n\r\n const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n console.group('Group: ', group);\r\n }\r\n\r\n\r\n onChildDroplistDroped(cdkDragDropevent: CdkDragDrop<any>) {\r\n this.updateColumnWidthsAndGroups();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n setTimeout(() => {\r\n this.cdr.detectChanges();\r\n }, 2);\r\n }\r\n\r\n // Rows Grouping Logic Goes Here\r\n\r\n groupData(data: any[], groupFields: string[]): any[] {\r\n let dataSet = structuredClone(data);\r\n if (!groupFields.length) return data;\r\n const [currentField, ...restFields] = groupFields;\r\n const groupedMap = new Map<string, any[]>();\r\n for (const item of dataSet) {\r\n let keyValue = currentField.split('.').reduce((obj, k) => obj?.[k], item);\r\n let groupKey: string;\r\n if (Array.isArray(keyValue)) {\r\n if (keyValue.length === 0) {\r\n groupKey = \"_Blank\";\r\n } else if (typeof keyValue[0] === \"object\") {\r\n groupKey = keyValue\r\n .map(obj => (obj?.department_name || obj.roleName) ?? \"_Blank\")\r\n .join(\",\");\r\n } else {\r\n groupKey = keyValue\r\n .map(val => val ?? \"_Blank\")\r\n .join(\",\");\r\n }\r\n } else {\r\n groupKey = keyValue ?? \"_Blank\";\r\n }\r\n if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\r\n groupedMap.get(groupKey)!.push(item);\r\n }\r\n return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\r\n isGroup: true,\r\n groupField: currentField,\r\n groupValue,\r\n children: this.groupData(groupItems, restFields),\r\n isExpand: false,\r\n }));\r\n }\r\n\r\n\r\n countLeafRows(group: any): number {\r\n if (!group.children || !group.children.length) return 0;\r\n\r\n return group.children.reduce((count: number, child: any) => {\r\n return count + (child.isGroup ? this.countLeafRows(child) : 1);\r\n }, 0);\r\n }\r\n\r\n isActiveFilterOpen = false;\r\n toggleActiveFilter() {\r\n this.isActiveFilterOpen = !this.isActiveFilterOpen;\r\n }\r\n\r\n toggleActions(type: string) {\r\n if (type === this.activeTopButton) this.activeTopButton = type;\r\n else this.activeTopButton = type;\r\n this.activeSubButton = '';\r\n this.isFilterOpen = false;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n activeSubButton = '';\r\n toggleSubActions(type: string) {\r\n if (type === this.activeSubButton) this.activeSubButton = '';\r\n else this.activeSubButton = type;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n toggleActionsDropdown() {\r\n this.showActionsDropDown = !this.showActionsDropDown;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n async changeTableLayout(event: Event, layoutType: string) {\r\n let target = event.target as HTMLInputElement;\r\n\r\n if (target.checked) {\r\n this.selectedTableLayout = layoutType;\r\n if (layoutType === 'small') {\r\n this.rowHeight = 36;\r\n this.headerRowHeight = 40;\r\n this.bodyTextFontsSize = 10;\r\n this.headerTextFontsSize = 10;\r\n\r\n } else if (layoutType === 'medium') {\r\n this.rowHeight = 44;\r\n this.headerRowHeight = 44;\r\n this.bodyTextFontsSize = 14;\r\n this.headerTextFontsSize = 14;\r\n\r\n } else {\r\n this.rowHeight = 60;\r\n this.headerRowHeight = 52;\r\n this.bodyTextFontsSize = 16;\r\n this.headerTextFontsSize = 16;\r\n }\r\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n await this.refreshHeaders();\r\n }\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n this.onFontChange()\r\n }\r\n\r\n\r\n pageSizeOptions = [5, 25, 50, 75, 100, 150, 200, 250, 300, 500];\r\n get startIndexData() {\r\n return (this.paginationConfig.page - 1) * this.paginationConfig.limit;\r\n }\r\n\r\n get endIndex() {\r\n return Math.min(this.startIndex + this.paginationConfig.limit, this.paginationConfig.totalResults);\r\n }\r\n\r\n get visiblePages(): (number | string)[] {\r\n const pages: (number | string)[] = [];\r\n\r\n if (this.paginationConfig.totalPages <= 7) {\r\n for (let i = 1; i <= this.paginationConfig.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push(1);\r\n if (this.paginationConfig.page > 3) {\r\n pages.push('...');\r\n }\r\n let start = Math.max(2, this.paginationConfig.page - 1);\r\n let end = Math.min(this.paginationConfig.totalPages - 1, this.paginationConfig.page + 1);\r\n\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n if (this.paginationConfig.page < this.paginationConfig.totalPages - 2) {\r\n pages.push('...');\r\n }\r\n pages.push(this.paginationConfig.totalPages);\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n\r\n searchTextForFilterDropDown = '';\r\n toggleColumnInFilterDropdown(col: any) {\r\n\r\n }\r\n\r\n removeColumnFromFilter(option: any) {\r\n\r\n }\r\n\r\n handleBackspace(event: Event) {\r\n // If search is empty, remove last tag\r\n if (!this.searchTextForFilterDropDown && this.selectedFilterOptions.length) {\r\n const last = this.selectedFilterOptions[this.selectedFilterOptions.length - 1];\r\n this.toggleSelectionInFilter(last);\r\n }\r\n }\r\n\r\n @ViewChild('filterMenueSearchInput') filterMenueSearchInput!: ElementRef<HTMLInputElement>\r\n @ViewChild('filterMenueTextchInput') filterMenueTextchInput!: ElementRef<HTMLInputElement>\r\n\r\n openFilteronThreeDotsClick(col: any) {\r\n if(col.type == 'image' || col.type === '') return;\r\n this.selectedColumnForFilter = col;\r\n this.isThreeDotsFilterOpen = true;\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n // Use column_dropdown_value if available, otherwise fallback to column_data\r\n let dropdownData = this.selectedColumnForFilter?.column_dropdown_value || this.selectedColumnForFilter?.column_data || [];\r\n\r\n // Normalize string arrays to object format\r\n if (dropdownData.length > 0 && typeof dropdownData[0] === 'string') {\r\n dropdownData = dropdownData.map((item: string) => ({\r\n _id: item,\r\n value: item,\r\n __typename: 'column_dropdown_value'\r\n }));\r\n }\r\n\r\n // Ensure column_dropdown_value is set for UI to use\r\n this.selectedColumnForFilter.column_dropdown_value = dropdownData;\r\n\r\n this.selectedFilterOptions = dropdownData.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option?.value || option)\r\n );\r\n setTimeout(() => {\r\n this.filterMenueSearchInput.nativeElement.focus();\r\n }, 100);\r\n } else if (['string', 'number', 'date'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || 'contain';\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || 'contain';\r\n this.secondValue = col?.query?.second_value || '';\r\n setTimeout(() => {\r\n this.filterMenueTextchInput.nativeElement.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n isFilterOpen = false\r\n selectedColumnForFilter: any;\r\n showFilters = this.showSideMenu ? false : false;\r\n columnFilter:string='none'\r\n\r\n openFilter(col: any) {\r\n // Prevent filter opening for columns with empty type or image type\r\n if (col.type === '' || col.type === 'image') return;\r\n\r\n this.activeFilterCell = col;\r\n this.activeCol = null\r\n this.isFilterOpen = true;\r\n this.selectedColumnForFilter = col;\r\n\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n // Use column_dropdown_value if available, otherwise fallback to column_data\r\n let dropdownData = this.selectedColumnForFilter?.column_dropdown_value || this.selectedColumnForFilter?.column_data || [];\r\n\r\n // Normalize string arrays to object format\r\n if (dropdownData.length > 0 && typeof dropdownData[0] === 'string') {\r\n dropdownData = dropdownData.map((item: string) => ({\r\n _id: item,\r\n value: item,\r\n __typename: 'column_dropdown_value'\r\n }));\r\n }\r\n\r\n this.selectedFilterOptions = dropdownData.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option?.value || option)\r\n );\r\n } else if (['string', 'number', 'date'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || 'contain';\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || 'contain';\r\n this.secondValue = col?.query?.second_value || '';\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n firstValue: any = '';\r\n firstCondition = '';\r\n secondValue: any = '';\r\n secondCondition = '';\r\n condition = '';\r\n\r\n resetTextFilterChanges() {\r\n this.firstCondition = 'contain';\r\n this.firstValue = '';\r\n this.condition = 'none';\r\n this.secondCondition = '';\r\n this.secondValue = '';\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n }\r\n\r\n\r\n selectedFilterOptions: any[] = []\r\n\r\n currentFilterSelectedIds = new Set<string>();\r\n\r\n toggleSelectionInFilter(option: any) {\r\n const id = option.id || option._id || option?.value || option;\r\n if (this.currentFilterSelectedIds.has(id)) {\r\n this.currentFilterSelectedIds.delete(id);\r\n } else {\r\n this.currentFilterSelectedIds.add(id);\r\n }\r\n // Use column_dropdown_value if available, otherwise fallback to column_data\r\n let dropdownData = this.selectedColumnForFilter?.column_dropdown_value || this.selectedColumnForFilter?.column_data || [];\r\n\r\n // Normalize string arrays to object format\r\n if (dropdownData.length > 0 && typeof dropdownData[0] === 'string') {\r\n dropdownData = dropdownData.map((item: string) => ({\r\n _id: item,\r\n value: item,\r\n __typename: 'column_dropdown_value'\r\n }));\r\n }\r\n\r\n this.selectedFilterOptions = dropdownData.filter((option: any) => this.currentFilterSelectedIds.has(option.id || option._id || option?.value || option))\r\n this.cdr.detectChanges();\r\n }\r\n\r\n resetFilterChanges() {\r\n this.isFilterOpen = false;\r\n this.currentFilterSelectedIds.clear();\r\n this.selectedFilterOptions!.length = 0;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n // const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns);\r\n // console.log(\"Filtered Columns Are: \", filteredColumns);\r\n }\r\n\r\n applyDropdownFilter() {\r\n const findColumn = (columns: any[], field: string): any => {\r\n for (const col of columns) {\r\n if (col.field === field) return col;\r\n if (col.children && col.children.length) {\r\n const found = findColumn(col.children, field);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const column = findColumn(this.columns, this.selectedColumnForFilter.field);\r\n if (column) {\r\n if (column.type === 'dropdown') {\r\n column.query = column.query || {};\r\n column.query._ids = column.query._ids || [];\r\n\r\n // Remove stale IDs (not present in Set)\r\n column.query._ids = column.query._ids.filter(\r\n (id: any) => this.currentFilterSelectedIds.has(id) // <-- use .has()\r\n );\r\n\r\n // Add new ones if missing\r\n this.currentFilterSelectedIds.forEach(id => {\r\n if (!column.query._ids.includes(id)) {\r\n column.query._ids.push(id);\r\n }\r\n });\r\n\r\n } else if (['string', 'number', 'date'].includes(column.type)) {\r\n column.query = {\r\n first_condition: this.firstCondition || 'contain',\r\n first_value: this.firstValue || null,\r\n condition: this.condition || 'none',\r\n second_condition: this.secondCondition || null,\r\n second_value: this.secondValue || null,\r\n };\r\n }\r\n }\r\n\r\n const filter = {\r\n field: column.field,\r\n search: column.search,\r\n query: column.query,\r\n type: column.type,\r\n _ids: column._ids\r\n };\r\n\r\n this.filtersConfig.push(filter);\r\n\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n this.activeFilterCell = null;\r\n this.isThreeDotsFilterOpen = false;\r\n\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n applyFilterFromFilterRow(column: any) {\r\n // Ensure default conditions are set before applying filter\r\n if (column.query) {\r\n if (!column.query.first_condition) {\r\n column.query.first_condition = 'contain';\r\n }\r\n if (!column.query.second_condition) {\r\n column.query.second_condition = 'contain';\r\n }\r\n }\r\n\r\n const filter = {\r\n field: column.field,\r\n search: column.search,\r\n query: column.query,\r\n type: column.type,\r\n _ids: column._ids\r\n };\r\n this.filtersConfig.push(filter);\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n this.activeFilterCell = null;\r\n this.isThreeDotsFilterOpen = false;\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n isFilterAppliedOnColumn(column: any) {\r\n return this.filtersConfig.some(col => col.field === column.field);\r\n }\r\n\r\n // Side Filters Logic is here\r\n\r\n toggleSelectAllSideFilters(col: any, event: Event) {\r\n const checked = (event?.target as HTMLInputElement)?.checked;\r\n\r\n if (checked) {\r\n col.query._ids = col.column_dropdown_value.map(\r\n (opt: any) => opt.id || opt._id || opt\r\n );\r\n } else {\r\n col.query._ids = [];\r\n }\r\n }\r\n\r\n\r\n isAllSideFilterOptionsSelected(col: any): boolean {\r\n if (!col?.query?._ids || !Array.isArray(col.column_dropdown_value)) return false;\r\n return col.query._ids.length === col.column_dropdown_value.length;\r\n }\r\n\r\n onOptionToggle(col: any, option: any) {\r\n const optionId = option.id || option._id || option;\r\n if (!col.query._ids) {\r\n col.query._ids = [];\r\n }\r\n const idx = col.query._ids.indexOf(optionId);\r\n if (idx > -1) {\r\n col.query._ids.splice(idx, 1);\r\n } else {\r\n col.query._ids.push(optionId);\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n resetSideFilter(col: any) {\r\n const resetColumnRecursively = (columns: any[]): boolean => {\r\n for (const column of columns) {\r\n if (column.field === col.field) {\r\n column.query = {\r\n _ids: [],\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: 'contain',\r\n second_value: null\r\n };\r\n return true;\r\n }\r\n if (Array.isArray(column?.children) && column?.children?.length) {\r\n if (resetColumnRecursively(column.children)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n resetColumnRecursively(this.columns);\r\n this.activeFilterCell = null;\r\n this.cdr.detectChanges();\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n\r\n clearAllFilters() {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n const resetAllRecursively = (columns: any[]) => {\r\n for (const column of columns) {\r\n if (column.query) {\r\n column.query = {\r\n _ids: [],\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: 'contain',\r\n second_value: null\r\n };\r\n }\r\n column.filterValue = null; // Clear column filter value\r\n if (Array.isArray(column?.children) && column.children.length) {\r\n resetAllRecursively(column.children);\r\n }\r\n }\r\n };\r\n resetAllRecursively(this.columns);\r\n this.commonSevice.activeFilteredColumns = []; // Clear active filtered columns\r\n this.tableSearch = ''; // Clear global search\r\n this.activeFilterCell = null;\r\n this.filtersConfig = []; // Clear filters config\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns); // Emit updated filters to API\r\n this.filterCleared.emit(true); // Emit filter cleared event with true flag\r\n const event = { eventType: 'reset' };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n\r\n applySideFilter() {\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n\r\n trackByField(index: number, col: any): string {\r\n return col?.field;\r\n }\r\n\r\n get activeFilteredColumns(): any[] {\r\n const collectFiltered = (columns: any[]): any[] => {\r\n let result: any[] = [];\r\n\r\n columns.forEach(col => {\r\n if (col.children && col.children.length) {\r\n result = result.concat(collectFiltered(col.children));\r\n }\r\n\r\n if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0 && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n const hasValueFilter =\r\n col.query.first_value !== null && col.query.first_value !== undefined && col.query.first_value !== '' && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n };\r\n return [...collectFiltered(this.columns)];\r\n }\r\n\r\n\r\n\r\n toggleOpenFilter() {\r\n this.showFilters = !this.showFilters;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n\r\n // Cell Editing Work start here\r\n\r\n editingKey: string | null = null;\r\n activeCell: string | null = null;\r\n\r\n setActiveCell(row: any, column: any) {\r\n this.activeCell = ((row.id || row._id) + '-' + column.field);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n isActiveCell(row: any, col: any): boolean {\r\n return this.activeCell === ((row.id || row._id) + '-' + col.field);\r\n }\r\n\r\n enableEdit(row: any, column: any) {\r\n this.editinDropdownSearch = '';\r\n if (column.type == 'image' || !column?.is_editable) return;\r\n this.editingKey = ((row.id || row._id) + '-' + column.field);\r\n\r\n if (column.type === 'dropdown') {\r\n setTimeout(() => {\r\n const dropdownMenu = document.querySelector('.cell-editing-dropdown-menu') as HTMLElement;\r\n if (dropdownMenu) {\r\n const rect = dropdownMenu.getBoundingClientRect();\r\n const windowHeight = this.dataGridContainer.nativeElement?.offsetHeight;\r\n\r\n if (rect.bottom > windowHeight) {\r\n dropdownMenu.style.top = `-${rect.height}px`;\r\n } else {\r\n dropdownMenu.style.top = '100%';\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n disableEdit(row: any, column: any, controk?: any) {\r\n this.rowSelectedIndexes.clear();\r\n if (!this.editingKey) return\r\n this.checkRowEditAndEmitValue(row, column, null)\r\n this.editingKey = null;\r\n this.cdr.detectChanges();\r\n const current = this.getNestedValue(row, column?.field);\r\n if (!current || (column.type == 'email' && !this.validateEmail(current))) {\r\n const originalRow = this.originalDataSet.find(item => item.id == row.id || item.id == row._id);\r\n const original = this.getNestedValue(originalRow, column?.field);\r\n this.setNestedValue(row, column, original);\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n validateEmail(value: string): boolean {\r\n return this.emailRegex.test(value);\r\n }\r\n allowOnlyNumbers(event: KeyboardEvent) {\r\n const charCode = event.which ? event.which : event.keyCode;\r\n if (charCode < 48 || charCode > 57) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n checkRowEditAndEmitValue(row: any, column: any, value?: any) {\r\n setTimeout(() => {\r\n const originalRow = this.originalDataSet?.find(\r\n (r: any) => r.id === row.id || r._id === row._id\r\n );\r\n if (!originalRow) return;\r\n const clean = (obj: any) => JSON.parse(JSON.stringify(obj));\r\n const currentValue = this.getNestedValue(row, column.field);\r\n const originalValue = this.getNestedValue(originalRow, column.field);\r\n const hasChanged = this.commonSevice.hasFieldChanged(currentValue, originalValue, column.type);\r\n if (!hasChanged) return;\r\n this.setNestedValue(originalRow, column, value);\r\n const sendObj = {\r\n data: { ...row },\r\n eventType: 'onCellEdit',\r\n value: value\r\n };\r\n this.genericEvent.emit(sendObj)\r\n }, 100);\r\n }\r\n\r\n\r\n isEditing(row: any, col: any): boolean {\r\n return this.editingKey === ((row.id || row._id) + '-' + col.field);\r\n }\r\n\r\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n const path = column.field;\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n const parent = keys.reduce((acc: { [x: string]: {}; }, key: string | number) => acc[key] ??= {}, obj);\r\n\r\n if (parent && lastKey) {\r\n if (typeof option === 'object' && option !== null) {\r\n // case: dropdown object {id, value}\r\n // parent.id = option.id;\r\n parent[lastKey] = option;\r\n } else {\r\n // case: plain string or number\r\n parent[lastKey] = option;\r\n }\r\n }\r\n\r\n const sendObj = {\r\n data: { ...obj },\r\n eventType: 'onCellEdit',\r\n };\r\n\r\n if (calledFromInput) {\r\n this.checkRowEditAndEmitValue(obj, column, option);\r\n }\r\n }\r\n\r\n goToPage(page: any) {\r\n if (page < 1 || page > this.paginationConfig.totalPages) return;\r\n this.paginationConfig.page = page;\r\n const event = {\r\n obj: {\r\n limit: this.paginationConfig.limit,\r\n page: page,\r\n },\r\n eventType: 'pageChange',\r\n };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n onPageSizeChange() {\r\n debugger\r\n this.paginationConfig.selectedPageSize\r\n this.paginationConfig.page = 1;\r\n const event = {\r\n obj: {\r\n limit: +this.paginationConfig.selectedPageSize,//this.paginationConfig.limit,\r\n page: this.paginationConfig.page,\r\n },\r\n eventType: 'pageChange',\r\n };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n actionPreset(data: any, type: any) {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n const event = {\r\n obj: {\r\n data: data\r\n },\r\n eventType: type\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n selectFilter(data:any){\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n this.tableView = this.tableView.map(item => ({\r\n ...item,\r\n is_temp: item.id == data?.id\r\n }));\r\n this.tableFilterViewId = data.id;\r\n this.presetName = data.name;\r\n // Emit filter cleared event when preset is applied (assuming filters are reset)\r\n this.filterCleared.emit(true);\r\n if (data?.is_deafult) {\r\n return this.actionPreset(data, 'setPreset')\r\n }\r\n const event = {\r\n obj: {\r\n data: data,\r\n presetId: data?._id || data?.id\r\n },\r\n eventType: 'select'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n selectDefault() {\r\n this.tableView?.forEach((ele) => { ele.is_temp = false });\r\n this.tableFilterViewId = 'default';\r\n this.presetName = '';\r\n const event = {\r\n obj: {\r\n data: { _id: 'default' },\r\n presetId: 'default'\r\n },\r\n eventType: 'select'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n savePreset(control?: any) {\r\n if (control?.invalid) {\r\n control?.control.markAsTouched();\r\n return;\r\n }\r\n this.presetFilter = this.tableFilterViewId ? true : this.presetFilter;\r\n let selectedData: any = this.tableView.find((ele) => ele.id == this.tableFilterViewId);\r\n let config = {\r\n fontFaimly: this.fontFaimly,\r\n bodyTextFontsSize: this.bodyTextFontsSize,\r\n headerTextFontsSize: this.headerTextFontsSize,\r\n oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\r\n showVerticalBorder: this.showVerticalBorder,\r\n selectedTableLayout: this.selectedTableLayout,\r\n globalSearch: this.tableSearch\r\n\r\n }\r\n const cleanedFilters = (this.filtersConfig || []).map(({ query, type, ...rest }) => {\r\n const result = {\r\n ...rest\r\n };\r\n if (result.__typename) {\r\n delete result.__typename;\r\n }\r\n if (query) {\r\n delete query.__typename;\r\n result.query = query;\r\n if (type === \"dropdown\") {\r\n result._ids = [...query._ids];\r\n result.query = null;\r\n } else if (type === 'string') {\r\n delete query._ids;\r\n result.query = query;\r\n }\r\n } else {\r\n result.query = null;\r\n }\r\n return result;\r\n })\r\n const event = {\r\n obj: {\r\n name: (!this.tableFilterViewId || this.tableFilterViewId === 'default') ? this.presetName : selectedData?.name,\r\n activeFilters: this.presetFilter,\r\n columns: this.columns,\r\n filters: this.presetFilter ? cleanedFilters : [],\r\n config: config,\r\n id: this.tableFilterViewId && this.tableFilterViewId !== 'default' ? this.tableFilterViewId : null,\r\n loadingCall: control == 'mouseUp' ? false : true\r\n },\r\n eventType: this.tableFilterViewId && this.tableFilterViewId !== 'default' ? 'updatePreset' : 'createPreset'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n\r\n toggleRowShading() {\r\n this.oddRowsBackgroundColor = this.rowShadingEnabled ? '#f1f1f1' : undefined;\r\n this.onFontChange();\r\n }\r\n\r\n trackByTable(index: number): number {\r\n return index;\r\n }\r\n activeRow: any\r\n activeRowCol: any;\r\n\r\n // Check if column is mandatory (last two columns)\r\n isMandatory(col: any): boolean {\r\n const index = this.columns.indexOf(col);\r\n return index >= this.columns.length - 2;\r\n }\r\n\r\n // Check if all non-mandatory columns are visible\r\n areAllNonMandatoryVisible(): boolean {\r\n return this.columns.slice(0, -2).every(col => col.is_visible);\r\n }\r\n\r\n // Check if all non-mandatory columns are hidden\r\n areAllNonMandatoryHidden(): boolean {\r\n return this.columns.slice(0, -2).every(col => !col.is_visible);\r\n }\r\n\r\n // Toggle all non-mandatory visible columns\r\n toggleAllVisibleColumns(): void {\r\n const allVisible = this.areAllNonMandatoryVisible();\r\n this.columns.slice(0, -2).forEach(col => {\r\n col.is_visible = !allVisible;\r\n });\r\n this.onSideMenuColumnsVisibilityChange();\r\n }\r\n\r\n // Toggle all non-mandatory invisible columns\r\n toggleAllInvisibleColumns(): void {\r\n const allHidden = this.areAllNonMandatoryHidden();\r\n this.columns.slice(0, -2).forEach(col => {\r\n col.is_visible = allHidden;\r\n });\r\n this.onSideMenuColumnsVisibilityChange();\r\n }\r\n\r\n // Track expanded cells as a Set of unique row+col identifiers\r\n\r\n getCellKey(row: any, col: any): string {\r\n return `${this.getRowId(row)}_${col?.field}`;\r\n }\r\n\r\n expandedCells = new Map<string, number>();\r\n private zCounter = 21;\r\n\r\n toggleExpandOfLongCellText(\r\n row: any,\r\n col: any,\r\n columns: any[],\r\n expandWholeRow = false\r\n ) {\r\n const expandCells = (targetRow: any) => {\r\n columns.forEach(c => {\r\n if (c.type === 'image') return;\r\n const text = targetRow[c.field];\r\n if (typeof text === 'string' && text.length > 50) {\r\n const key = this.getRowId(targetRow) + '-' + c.field;\r\n this.zCounter++;\r\n this.expandedCells.set(key, this.zCounter);\r\n }\r\n });\r\n };\r\n\r\n const collectKeysForRow = (targetRow: any) => {\r\n const keys: string[] = [];\r\n columns.forEach(c => {\r\n if (c.type === 'image') return;\r\n\r\n const text = targetRow[c.field];\r\n if (typeof text === 'string' && text.length > 50) {\r\n keys.push(this.getRowId(targetRow) + '-' + c.field);\r\n }\r\n });\r\n return keys;\r\n };\r\n\r\n if (expandWholeRow) {\r\n let rowKeys: string[] = [];\r\n if (Array.isArray(row.children) && row.children.length > 0) {\r\n rowKeys = collectKeysForRow(row);\r\n row.children.forEach((child: any) => {\r\n rowKeys.push(...collectKeysForRow(child));\r\n });\r\n } else {\r\n rowKeys = collectKeysForRow(row);\r\n }\r\n const allExpanded = rowKeys.every(k => this.expandedCells.has(k));\r\n this.expandedCells.clear();\r\n if (!allExpanded) {\r\n if (Array.isArray(row.children) && row.children.length > 0) {\r\n expandCells(row);\r\n row.children.forEach((child: any) => expandCells(child));\r\n } else {\r\n expandCells(row);\r\n }\r\n }\r\n } else {\r\n const key = this.getRowId(row) + '-' + col.field;\r\n if (col.type === 'image') return;\r\n\r\n if (!this.expandedCells.has(key)) {\r\n this.expandedCells.clear();\r\n this.zCounter++;\r\n this.expandedCells.set(key, this.zCounter);\r\n } else {\r\n this.expandedCells.delete(key);\r\n }\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n isExpanded(row: any, col: any): boolean {\r\n return this.expandedCells.has(this.getRowId(row) + '-' + col.field);\r\n }\r\n\r\n getZIndex(row: any, col: any): number {\r\n return this.expandedCells.get(this.getRowId(row) + '-' + col.field) ?? 21;\r\n }\r\n\r\n isOverflowing(element: HTMLElement | null): boolean {\r\n if (!element) return false;\r\n return element.scrollWidth > element.clientWidth;\r\n }\r\n\r\n\r\n // Picture cell Logic\r\n colorCombination = ['pic-comb1', 'pic-comb2', 'pic-comb4'];\r\n getDynamicClass(name: string): string {\r\n if (!name) return this.colorCombination[0];\r\n const hash = Array.from(name).reduce((acc, char) => acc + char.charCodeAt(0), 0);\r\n const index = hash % this.colorCombination?.length;\r\n return this.colorCombination[index];\r\n }\r\n\r\n getInitials(name: string): string {\r\n if (!name) return 'NA';\r\n const parts = name.trim().split(' ');\r\n return (parts[0][0] + (parts[1]?.[0] || '')).toUpperCase();\r\n }\r\n\r\n getFirstTwoWords(name: string): string {\r\n if (!name) return '';\r\n const words = name.trim().split(/\\s+/).filter(word => /^[a-zA-Z]+$/.test(word));\r\n return words.slice(0, 2).map(word => word.charAt(0).toUpperCase()).join('');\r\n }\r\n\r\n onEmployeeClick(row: any): void {\r\n const event = {\r\n data: row,\r\n eventType: 'openEmployeeModal'\r\n };\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n\r\n actionHide: boolean = true;\r\n xPos = 0;\r\n yPos = 0;\r\n isVisible = false;\r\n deatilsList: any;\r\n openExpendIndex: any;\r\n positionedYet = false;\r\n\r\n // @Input() actions: string[] = ['Edit', 'Delete', 'Download', 'Add Leave'];\r\n\r\n // Helper method to check if \"add Leave\" should be hidden based on attendance status\r\n private shouldHideAddLeave(item: any): boolean {\r\n // Only allow \"Add Leave\" when attendanceStatus is 'attended' or 'absent'\r\n const attendanceStatus = (item.attendanceStatus || '').toLowerCase().trim();\r\n return attendanceStatus !== 'attended' && attendanceStatus !== 'absent';\r\n}\r\n\r\nonRightClick(event: MouseEvent | TouchEvent, item: any, context: 'main' | 'accordion-parent' | 'accordion-child' = 'main'): boolean {\r\n event.preventDefault();\r\n\r\n this.xPos = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX;\r\n this.yPos = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY;\r\n this.deatilsList = item;\r\n\r\n // Determine whether to hide \"Add Leave\"\r\n const shouldHideAddLeave = this.shouldHideAddLeave(item);\r\n\r\n // Set context-specific actions\r\n if (context === 'accordion-parent') {\r\n this.actions = ['download'];\r\n } else if (context === 'accordion-child') {\r\n this.actions = ['edit', 'delete', 'download'];\r\n if (!shouldHideAddLeave) {\r\n this.actions.push('add Leave');\r\n }\r\n } else {\r\n // Default: show actions for single day (main context) based on status\r\n this.actions = ['edit', 'delete', 'download'];\r\n if (!shouldHideAddLeave) {\r\n this.actions.push('add Leave');\r\n }\r\n }\r\n\r\n this.isVisible = true;\r\n this.positionedYet = false;\r\n this.cdr.detectChanges();\r\n\r\n // Positioning logic (keep your existing code)\r\n setTimeout(() => {\r\n const menu = document.querySelector('.context-menu') as HTMLElement;\r\n if (!menu) return;\r\n let x = this.xPos, y = this.yPos;\r\n const mw = menu.offsetWidth, mh = menu.offsetHeight;\r\n const vw = window.innerWidth, vh = window.innerHeight;\r\n if (x + mw > vw) x = vw - mw - 10;\r\n if (y + mh > vh) y = vh - mh - 10;\r\n this.xPos = x; this.yPos = y;\r\n this.positionedYet = true;\r\n this.cdr.detectChanges();\r\n }, 0);\r\n\r\n return false;\r\n}\r\n\r\n\r\n onActionClick(action: string) {\r\n const event = {\r\n obj: this.deatilsList,\r\n eventType: action,\r\n };\r\n this.genericEvent.emit(event);\r\n this.isVisible = false;\r\n}\r\n\r\n\r\n onVerifyClick(type: string) {\r\n const idsArray = Array.from(this.selectedRows);\r\n const arrayOfObjectsWithTableType: any[] = [];\r\n this.selectedRows.forEach(id => {\r\n arrayOfObjectsWithTableType.push({\r\n id: id,\r\n listingType: this.listingType,\r\n });\r\n });\r\n const sendObj = {\r\n data: {\r\n obj: idsArray,\r\n tableName: this.tableName,\r\n listingType: this.listingType,\r\n },\r\n eventType: type,\r\n };\r\n this.genericEvent.emit(sendObj)\r\n }\r\n\r\n\r\n\r\n getCellClasses(column: any, value: any): string {\r\n if (!value) return '';\r\n let val: any;\r\n if (typeof value === 'object') {\r\n val = value?.value;\r\n } else {\r\n val = value;\r\n }\r\n const field = column?.field;\r\n const status = val?.toString().toLowerCase();\r\n // Skip badge classes for status and attendanceStatus fields as they're handled separately in template\r\n if (field === 'status' || field === 'attendanceStatus') {\r\n return '';\r\n }\r\n if (field === 'account_status' || field === 'availStatus' || field === 'is_custom_grade') {\r\n return BADGES_MAP[status] || 'badge badge-secondary';\r\n }\r\n return '';\r\n }\r\n\r\n removeColumnFilterFromColumn(column: any) {\r\n if (!column) return\r\n if (column.type === 'dropdown') {\r\n column.query._ids = [];\r\n } else if (['string', 'number', 'date'].includes(column.type)) {\r\n column.query = {\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: null,\r\n second_value: null,\r\n }\r\n }\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n onSideMenuColumnsVisibilityChange() {\r\n this.refreshHeaders();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n downloadCsv(type?: string) {\r\n const event = {\r\n obj: {\r\n columns: this.columns,\r\n filters: [],\r\n type: type || 'csv'\r\n },\r\n eventType: 'downloadCsv'\r\n }\r\n this.genericEvent.emit(event)\r\n\r\n }\r\n\r\n onFontChange() {\r\n this.headerTextFontsSize = this.bodyTextFontsSize;\r\n const config = {\r\n fontFaimly: this.fontFaimly,\r\n bodyTextFontsSize: this.bodyTextFontsSize,\r\n headerTextFontsSize: this.headerTextFontsSize,\r\n oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\r\n showVerticalBorder: this.showVerticalBorder,\r\n selectedTableLayout: this.selectedTableLayout,\r\n globalSearch: this.tableSearch\r\n }\r\n const event = {\r\n obj: {\r\n data: config\r\n },\r\n eventType: 'config'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n onGlobalSearch() {\r\n if (this.tableSearch.trim()) {\r\n // Determine date to send: use selected range if available, otherwise today\r\n let dateData;\r\n if (this.bsRangeValue && this.bsRangeValue.length === 2 && this.bsRangeValue[0] && this.bsRangeValue[1]) {\r\n const isSingleDay = this.bsRangeValue[0].getTime() === this.bsRangeValue[1].getTime();\r\n dateData = {\r\n range: this.bsRangeValue,\r\n isSingleDay: isSingleDay\r\n };\r\n } else {\r\n const today = new Date();\r\n dateData = {\r\n range: [today, today],\r\n isSingleDay: true\r\n };\r\n }\r\n\r\n const event = {\r\n obj: {\r\n tableSearch: this.tableSearch.trim(),\r\n ...dateData\r\n },\r\n eventType: 'search'\r\n };\r\n this.genericEvent.emit(event);\r\n this.searchEvent.emit({\r\n search: this.tableSearch.trim(),\r\n page: 1,\r\n ...dateData\r\n });\r\n\r\n // Clear search after emitting\r\n // this.tableSearch = '';\r\n\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n }\r\n\r\n onSearchReset() {\r\n // Clear the search input\r\n this.tableSearch = '';\r\n\r\n // Determine date to send: use selected range if available, otherwise today\r\n let dateData;\r\n if (this.bsRangeValue && this.bsRangeValue.length === 2 && this.bsRangeValue[0] && this.bsRangeValue[1]) {\r\n const isSingleDay = this.bsRangeValue[0].getTime() === this.bsRangeValue[1].getTime();\r\n dateData = {\r\n range: this.bsRangeValue,\r\n isSingleDay: isSingleDay\r\n };\r\n } else {\r\n const today = new Date();\r\n dateData = {\r\n range: [today, today],\r\n isSingleDay: true\r\n };\r\n }\r\n\r\n // Emit reset search event\r\n const event = {\r\n obj: {\r\n tableSearch: '',\r\n ...dateData\r\n },\r\n eventType: 'search'\r\n };\r\n this.genericEvent.emit(event);\r\n this.searchEvent.emit({\r\n search: '',\r\n page: 1,\r\n ...dateData\r\n });\r\n\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n\r\n checkFilterChangesEffect(): any {\r\n if (!this.tableFilterViewId) return true\r\n const findDefaultFilter = this.tableView?.find((ele: any) => ele?.id == this.tableFilterViewId);\r\n const normalizeFilters = (filters: any[] | undefined): any[] => {\r\n if (!Array.isArray(filters)) return [];\r\n const cloned = filters.map(f => {\r\n const item = JSON.parse(JSON.stringify(f ?? {}));\r\n if (!Array.isArray(item._ids)) item._ids = [];\r\n item._ids = item._ids.slice().sort((a: any, b: any) => {\r\n if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n return ('' + a).localeCompare('' + b);\r\n });\r\n\r\n if (item.query === null) {\r\n } else if (typeof item.query === 'object') {\r\n if (!Array.isArray(item.query._ids)) item.query._ids = [];\r\n item.query._ids = item.query._ids.slice().sort((a: any, b: any) => {\r\n if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n return ('' + a).localeCompare('' + b);\r\n });\r\n }\r\n\r\n return item;\r\n });\r\n cloned.sort((a: any, b: any) => {\r\n const fa = (a.field || '') + '|' + (a.type || '');\r\n const fb = (b.field || '') + '|' + (b.type || '');\r\n return fa.localeCompare(fb);\r\n });\r\n\r\n return cloned;\r\n };\r\n\r\n const deepEqual = (a: any, b: any): boolean => {\r\n if (a === b) return true;\r\n\r\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n return a === b;\r\n }\r\n\r\n if (Array.isArray(a) !== Array.isArray(b)) return false;\r\n\r\n if (Array.isArray(a)) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (!deepEqual(a[i], b[i])) return false;\r\n }\r\n return true;\r\n }\r\n\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n for (const key of keysA) {\r\n if (!keysB.includes(key)) return false;\r\n if (!deepEqual(a[key], b[key])) return false;\r\n }\r\n return true;\r\n };\r\n const normalizedA = normalizeFilters(findDefaultFilter?.filters);\r\n const normalizedB = normalizeFilters(this.filtersConfig);\r\n const isSame = deepEqual(normalizedA, normalizedB);\r\n return isSame;\r\n }\r\n\r\n\r\n\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // Cell Selection Implemented Here Implemented Here\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n\r\n selectedCells: any[] = [];\r\n selectedKeys: Set<string> = new Set();\r\n selectionStart: any = null;\r\n isSelecting = false;\r\n startSelection(\r\n rowIndex: number,\r\n colIndex: number,\r\n subColIndex: number | null,\r\n field: string,\r\n event: MouseEvent,\r\n section: string\r\n ) {\r\n event.preventDefault();\r\n this.rowSelectedIndexes.clear();\r\n const safeSub = subColIndex ?? 0;\r\n const key = `${rowIndex}-${colIndex}-${safeSub}-${field}`;\r\n\r\n this.selectionStart = { rowIndex, colIndex, subColIndex: safeSub, field, key };\r\n this.isSelecting = true;\r\n this.selectedKeys.clear();\r\n this.selectedKeys.add(key);\r\n this.selectedCells = [this.selectionStart];\r\n const mouseUpHandler = () => {\r\n this.endSelection();\r\n document.removeEventListener('mouseup', mouseUpHandler);\r\n };\r\n document.addEventListener('mouseup', mouseUpHandler);\r\n this.updateSelectionBoundaries()\r\n }\r\n\r\n\r\n extendSelection(\r\n rowIndex: number,\r\n colIndex: number,\r\n subColIndex: number | null,\r\n field: string,\r\n event: MouseEvent,\r\n section: string\r\n ) {\r\n if (!this.isSelecting || !this.selectionStart) return;\r\n\r\n const start = this.selectionStart;\r\n const targetSubColIndex = subColIndex ?? 0;\r\n const newKeys: Set<string> = new Set();\r\n const newCells: any[] = [];\r\n const minRow = Math.min(start.rowIndex, rowIndex);\r\n const maxRow = Math.max(start.rowIndex, rowIndex);\r\n const columnsToSelect = this.getColumnSelectionRange(start.colIndex, colIndex, start.subColIndex, targetSubColIndex);\r\n\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (const colInfo of columnsToSelect) {\r\n const k = `${r}-${colInfo.colIndex}-${colInfo.subColIndex}-${section}`;\r\n newKeys.add(k);\r\n newCells.push({\r\n rowIndex: r,\r\n colIndex: colInfo.colIndex,\r\n subColIndex: colInfo.subColIndex,\r\n field,\r\n key: k\r\n });\r\n }\r\n }\r\n\r\n this.selectedKeys = newKeys;\r\n this.selectedCells = newCells;\r\n this.updateSelectionBoundaries();\r\n\r\n // Add auto-scrolling logic\r\n this.handleCellAutoScroll(event);\r\n }\r\n\r\n\r\n\r\n\r\n getColumnSelectionRange(\r\n startCol: number,\r\n endCol: number,\r\n startSub: number,\r\n endSub: number\r\n ): { colIndex: number; subColIndex: number }[] {\r\n const result: { colIndex: number; subColIndex: number }[] = [];\r\n const minCol = Math.min(startCol, endCol);\r\n const maxCol = Math.max(startCol, endCol);\r\n\r\n const isLeftToRight = startCol <= endCol;\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const subColCount = this.getSubColumnCount(c);\r\n\r\n if (c === startCol && c === endCol) {\r\n const minSub = Math.min(startSub, endSub);\r\n const maxSub = Math.max(startSub, endSub);\r\n for (let s = minSub; s <= maxSub && s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n else if (c === startCol) {\r\n if (isLeftToRight) {\r\n for (let s = startSub; s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n } else {\r\n for (let s = 0; s <= startSub && s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n }\r\n else if (c === endCol) {\r\n if (isLeftToRight) {\r\n for (let s = 0; s <= endSub && s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n } else {\r\n for (let s = endSub; s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n }\r\n else {\r\n for (let s = 0; s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n getSubColumnCount(colIndex: number): number {\r\n if (!this.columns || colIndex < 0 || colIndex >= this.columns.length) {\r\n return 1;\r\n }\r\n const column = this.columns[colIndex];\r\n if (column.children && Array.isArray(column.children)) {\r\n return column.children.length;\r\n }\r\n return 1;\r\n }\r\n isGroupColumn(colIndex: number): boolean {\r\n return this.getSubColumnCount(colIndex) > 1;\r\n }\r\n endSelection() {\r\n this.isSelecting = false;\r\n this.stopAutoScroll();\r\n this.updateSelectionBoundaries();\r\n }\r\n isSelected(\r\n rowIndex: number,\r\n colIndex: number,\r\n subColIndex: number | null,\r\n field: string,\r\n section: string\r\n ) {\r\n const safeSub = subColIndex ?? 0;\r\n const key = `${rowIndex}-${colIndex}-${safeSub}-${section}`;\r\n return this.selectedKeys.has(key);\r\n }\r\n\r\n\r\n private selectionBounds: {\r\n top: number | null;\r\n bottom: number | null;\r\n left: { colIndex: number; subColIndex: number } | null;\r\n right: { colIndex: number; subColIndex: number } | null;\r\n } = { top: null, bottom: null, left: null, right: null };\r\n\r\n updateSelectionBoundaries() {\r\n if (this.selectedCells.length === 0) {\r\n this.selectionBounds = { top: null, bottom: null, left: null, right: null };\r\n return;\r\n }\r\n\r\n // Get all unique row indices and find min/max\r\n const rowIndices = [...new Set(this.selectedCells.map(cell => cell.rowIndex))];\r\n this.selectionBounds.top = Math.min(...rowIndices);\r\n this.selectionBounds.bottom = Math.max(...rowIndices);\r\n\r\n // For left/right boundaries, we need to consider both colIndex and subColIndex\r\n const leftMost = this.findLeftMostCell();\r\n const rightMost = this.findRightMostCell();\r\n\r\n this.selectionBounds.left = leftMost;\r\n this.selectionBounds.right = rightMost;\r\n }\r\n findLeftMostCell(): { colIndex: number; subColIndex: number } | null {\r\n if (this.selectedCells.length === 0) return null;\r\n\r\n const minColIndex = Math.min(...this.selectedCells.map(cell => cell.colIndex));\r\n const leftColCells = this.selectedCells.filter(cell => cell.colIndex === minColIndex);\r\n const minSubColIndex = Math.min(...leftColCells.map(cell => cell.subColIndex));\r\n\r\n return { colIndex: minColIndex, subColIndex: minSubColIndex };\r\n }\r\n findRightMostCell(): { colIndex: number; subColIndex: number } | null {\r\n if (this.selectedCells.length === 0) return null;\r\n\r\n const maxColIndex = Math.max(...this.selectedCells.map(cell => cell.colIndex));\r\n const rightColCells = this.selectedCells.filter(cell => cell.colIndex === maxColIndex);\r\n const maxSubColIndex = Math.max(...rightColCells.map(cell => cell.subColIndex));\r\n\r\n return { colIndex: maxColIndex, subColIndex: maxSubColIndex };\r\n }\r\n isTopBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.top !== null && rowIndex === this.selectionBounds.top;\r\n }\r\n isBottomBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.bottom !== null && rowIndex === this.selectionBounds.bottom;\r\n }\r\n isLeftBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.left !== null &&\r\n colIndex === this.selectionBounds.left.colIndex &&\r\n safeSub === this.selectionBounds.left.subColIndex;\r\n }\r\n\r\n isRightBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.right !== null &&\r\n colIndex === this.selectionBounds.right.colIndex &&\r\n safeSub === this.selectionBounds.right.subColIndex;\r\n }\r\n\r\n isTopLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n isTopRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n isBottomLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n isBottomRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n\r\n cellSelectionAutoScrollInterval: any = null;\r\n private scrollSpeed = 100;\r\n private scrollMargin = 150;\r\n handleCellAutoScroll(event: MouseEvent) {\r\n if (this.cellSelectionAutoScrollInterval) {\r\n clearInterval(this.cellSelectionAutoScrollInterval);\r\n this.cellSelectionAutoScrollInterval = null;\r\n }\r\n const horizontalContainer = this.centerScrollableBody.nativeElement;\r\n const verticalContainer = this.mainScroll.nativeElement;\r\n if (!horizontalContainer || !verticalContainer) return;\r\n const horizontalRect = horizontalContainer.getBoundingClientRect();\r\n const mouseX = event.clientX;\r\n const verticalRect = verticalContainer.getBoundingClientRect();\r\n const mouseY = event.clientY;\r\n const nearTop = mouseY - verticalRect.top < this.scrollMargin;\r\n const nearBottom = verticalRect.bottom - mouseY < this.scrollMargin;\r\n const nearLeft = mouseX - horizontalRect.left < this.scrollMargin;\r\n const nearRight = horizontalRect.right - mouseX < this.scrollMargin;\r\n let scrollX = 0;\r\n let scrollY = 0;\r\n if (nearTop) scrollY = -this.scrollSpeed;\r\n if (nearBottom) scrollY = this.scrollSpeed;\r\n if (nearLeft) scrollX = -this.scrollSpeed;\r\n if (nearRight) scrollX = this.scrollSpeed;\r\n if (scrollX !== 0 || scrollY !== 0) {\r\n this.cellSelectionAutoScrollInterval = setInterval(() => {\r\n if (scrollX !== 0) {\r\n horizontalContainer.scrollBy(scrollX, 0);\r\n }\r\n if (scrollY !== 0) {\r\n verticalContainer.scrollBy(0, scrollY);\r\n }\r\n }, 16);\r\n }\r\n }\r\n\r\n stopAutoScroll() {\r\n if (this.cellSelectionAutoScrollInterval) {\r\n clearInterval(this.cellSelectionAutoScrollInterval);\r\n this.cellSelectionAutoScrollInterval = null;\r\n }\r\n }\r\n\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // Row Selection from the Indexing Implemented Here\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n\r\n rowSelectedIndexes: Set<number> = new Set();\r\n rowSelecting = false;\r\n rowSelectionStartIndex: number | null = null;\r\n\r\n get firstSelectedRow(): number | null {\r\n if (this.rowSelectedIndexes.size === 0) return null;\r\n return Math.min(...this.rowSelectedIndexes);\r\n }\r\n\r\n get lastSelectedRow(): number | null {\r\n if (this.rowSelectedIndexes.size === 0) return null;\r\n return Math.max(...this.rowSelectedIndexes);\r\n }\r\n\r\n\r\n onRowMouseDown(index: number, event: MouseEvent) {\r\n event.preventDefault();\r\n this.rowSelecting = true;\r\n this.selectedKeys.clear();\r\n this.rowSelectionStartIndex = index;\r\n this.rowSelectedIndexes.clear();\r\n this.rowSelectedIndexes.add(index);\r\n this.activeCell = '';\r\n this.cdr.detectChanges();\r\n\r\n const mouseMoveHandler = (e: MouseEvent) => this.handleAutoScroll(e);\r\n const mouseUpHandler = () => {\r\n this.onRowMouseUp();\r\n document.removeEventListener('mouseup', mouseUpHandler);\r\n document.removeEventListener('mousemove', mouseMoveHandler);\r\n if (this.autoScrollInterval) {\r\n cancelAnimationFrame(this.autoScrollInterval);\r\n this.autoScrollInterval = null;\r\n }\r\n };\r\n\r\n document.addEventListener('mouseup', mouseUpHandler);\r\n document.addEventListener('mousemove', mouseMoveHandler);\r\n }\r\n\r\n onRowMouseOver(index: number, event: MouseEvent) {\r\n if (!this.rowSelecting || this.rowSelectionStartIndex === null) return;\r\n this.rowSelectedIndexes.clear();\r\n const start = Math.min(this.rowSelectionStartIndex, index);\r\n const end = Math.max(this.rowSelectionStartIndex, index);\r\n for (let i = start; i <= end; i++) {\r\n this.rowSelectedIndexes.add(i);\r\n }\r\n console.log([...this.rowSelectedIndexes]);\r\n }\r\n\r\n onRowMouseUp() {\r\n this.rowSelecting = false;\r\n this.rowSelectionStartIndex = null;\r\n }\r\n handleAutoScroll(e: MouseEvent) {\r\n const container = this.mainScroll?.nativeElement as HTMLElement;\r\n if (!container) return;\r\n\r\n const rect = container.getBoundingClientRect();\r\n const edgeSize = 40\r\n let scrollAmount = 0;\r\n\r\n if (e.clientY < rect.top + edgeSize) {\r\n scrollAmount = -150;\r\n } else if (e.clientY > rect.bottom - edgeSize) {\r\n scrollAmount = 150;\r\n }\r\n\r\n if (scrollAmount !== 0) {\r\n if (!this.autoScrollInterval) {\r\n const step = () => {\r\n container.scrollTop += scrollAmount;\r\n this.autoScrollInterval = requestAnimationFrame(step);\r\n };\r\n this.autoScrollInterval = requestAnimationFrame(step);\r\n }\r\n } else {\r\n if (this.autoScrollInterval) {\r\n cancelAnimationFrame(this.autoScrollInterval);\r\n this.autoScrollInterval = null;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n undoStack: any[][] = [];\r\n redoStack: any[][] = [];\r\n\r\n private cloneData(data: any[]): any[] {\r\n return JSON.parse(JSON.stringify(data));\r\n }\r\n\r\n performCut(selectedData: any[][]) {\r\n // Save current state for undo\r\n this.undoStack.push(this.cloneData(this.visibleRows));\r\n this.redoStack = []; // Clear redo stack on new action\r\n\r\n // Perform cut\r\n this.copyService.cutWithAnimation(selectedData);\r\n const { updatedRows } = this.copyService.cutSelectedSelectedData(\r\n this.visibleRows,\r\n this.rowSelectedIndexes,\r\n this.selectedCells,\r\n this.columns,\r\n this.setNestedValue.bind(this)\r\n );\r\n\r\n console.log('Updated Rows: ', updatedRows);\r\n }\r\n\r\n\r\n\r\n getSelectedDataForCopy(): any[][] {\r\n return this.copyService.getSelectedDataForCopy(\r\n this.visibleRows,\r\n this.columns,\r\n this.rowSelectedIndexes,\r\n this.selectedCells,\r\n this.getNestedValue.bind(this)\r\n );\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent) {\r\n\r\n const focus = this.findFocusedDetailRowAndSection();\r\n if (focus) {\r\n this.handleDetailShortcuts(event, focus.row, focus.section);\r\n return;\r\n }\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\r\n const selectedData = this.getSelectedDataForCopy();\r\n event.preventDefault();\r\n this.copyService.copyToClipboard(selectedData);\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\r\n const selectedData = this.getSelectedDataForCopy();\r\n event.preventDefault();\r\n this.performCut(selectedData);\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\r\n event.preventDefault();\r\n this.undo();\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.redo();\r\n }\r\n }\r\n\r\n undo() {\r\n if (this.undoStack.length > 0) {\r\n const prevState = this.undoStack.pop()!;\r\n this.redoStack.push(this.cloneData(this.visibleRows));\r\n this.visibleRows = this.cloneData(prevState);\r\n }\r\n }\r\n\r\n redo() {\r\n if (this.redoStack.length > 0) {\r\n const nextState = this.redoStack.pop()!;\r\n this.undoStack.push(this.cloneData(this.visibleRows));\r\n this.visibleRows = this.cloneData(nextState);\r\n }\r\n }\r\n\r\n\r\n\r\n @HostListener('document:paste', ['$event'])\r\n async onPaste(event: ClipboardEvent) {\r\n event.preventDefault();\r\n const text = event.clipboardData?.getData('text');\r\n if (!text) return;\r\n\r\n const startCell = this.selectedCells?.[0];\r\n if (!startCell) return;\r\n\r\n const updatedRows = await this.copyService.pasteFromClipboardText(\r\n text,\r\n this.visibleRows,\r\n this.columns,\r\n startCell.rowIndex,\r\n startCell.colIndex,\r\n startCell.subColIndex\r\n );\r\n console.log(\"Updated Rows: \", updatedRows);\r\n if (updatedRows?.length) {\r\n const sendObj = {\r\n data: updatedRows,\r\n eventType: 'onCellEdit',\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n isDate(value: any): boolean {\r\n return !isNaN(new Date(value)?.getTime());\r\n }\r\n\r\n formatLogState(value: any): string {\r\n if (!value) return '-';\r\n if (this.isDate(value)) {\r\n return this.formatTime(value);\r\n }\r\n return value.toString();\r\n }\r\n\r\n// For Detail Row Editing\r\ndetailEditingKey: string | null = null; // e.g., \"rowId-dataIndex-fieldName\"\r\nactiveDetailRow: any = null;\r\nactiveDetailCol: any = null;\r\n\r\n// For Detail Row Filtering\r\ndetailFilterValue: string = '';\r\ndetailFilterCondition: string = 'contain';\r\ndetailFilters: Map<string, { condition: string, value: any }> = new Map(); // key: `${rowId}-${colField}`\r\n\r\n// For Detail Row Drag & Drop\r\ncurrentDetailDraggingColumn: any = null;\r\ncurrentDetailRow: any = null;\r\n// Detail Row - Three Dots Menu\r\nopenDetailThreeDotsMenu(event: MouseEvent, row: any, col: any) {\r\n event.stopPropagation();\r\n this.activeDetailRow = row;\r\n this.activeDetailCol = col;\r\n // Positioning logic can be added here if needed\r\n // For now, it will appear right below the header\r\n}\r\n\r\n// Detail Row - Inline Editing\r\nenableDetailEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\nisDetailEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCell(row: any, dataItem: any, col: any): boolean {\r\n return this.isDetailEditing(row, dataItem, col);\r\n}\r\n\r\n// Detail Row - Drag & Drop\r\n\r\n\r\n\r\n\r\n\r\ngetDetailFilterMenuLeft(row: any, col: any): number {\r\n // Find the header cell and return its left position\r\n const headerCell = document.querySelector(`[field=\"${col.field}\"]`);\r\n if (headerCell) {\r\n const rect = headerCell.getBoundingClientRect();\r\n return rect.left;\r\n }\r\n return 0;\r\n}\r\n\r\n// Detail Row - Filtering\r\napplyDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.set(filterKey, {\r\n condition: this.detailFilterCondition,\r\n value: this.detailFilterValue\r\n });\r\n\r\n // Apply filter to data\r\n this.filterDetailData(row);\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\ntoggleSelectAllDetailFilters(col: any, row: any, event: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n const allOptions = col.column_dropdown_value || [];\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const allSelected = allOptions.every((option: any) =>\r\n filter.value.includes(option._id || option.id || option)\r\n );\r\n\r\n if (allSelected) {\r\n // Deselect all\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n // Select all\r\n filter.value = allOptions.map((option: any) => option._id || option.id || option);\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nonDetailOptionToggle(col: any, option: any, row: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const optionId = option._id || option.id || option;\r\n const index = filter.value.indexOf(optionId);\r\n\r\n if (index > -1) {\r\n filter.value.splice(index, 1);\r\n } else {\r\n filter.value.push(optionId);\r\n }\r\n\r\n if (filter.value.length === 0) {\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nresetDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.delete(filterKey);\r\n this.filterDetailData(row); // Re-filter to show all data\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nfilterDetailData(row: any) {\r\n if (!row.details?.originalData) {\r\n // Store original data on first filter\r\n row.details.originalData = [...row.details.data];\r\n }\r\n\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n let passes = true;\r\n for (let [filterKey, filter] of this.detailFilters.entries()) {\r\n if (filterKey.startsWith(`${row._id || row.id}-`)) {\r\n const colField = filterKey.split('-')[1];\r\n const cellValue = String(item[colField] || '').toLowerCase();\r\n const filterValue = String(filter.value || '').toLowerCase();\r\n\r\n switch (filter.condition) {\r\n case 'contain':\r\n passes = passes && cellValue.includes(filterValue);\r\n break;\r\n case 'equals':\r\n passes = passes && cellValue === filterValue;\r\n break;\r\n case 'startsWith':\r\n passes = passes && cellValue.startsWith(filterValue);\r\n break;\r\n case 'endsWith':\r\n passes = passes && cellValue.endsWith(filterValue);\r\n break;\r\n}\r\n\r\n if (!passes) break;\r\n }\r\n }\r\n return passes;\r\n});\r\n}\r\n\r\n\r\n// For Detail Row Drag & Drop\r\n\r\n\r\nonDetailDragStart(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n}\r\n\r\nonDetailDragMoved(event: CdkDragMove, row: any) {\r\n // Let CDK handle visual preview — no manual DOM manipulation needed\r\n}\r\n\r\nonDetailDragDropped(event: CdkDragDrop<any>, row: any) {\r\n if (!this.currentDetailDraggingColumn || !row.details || !row.details.columns) return;\r\n\r\n const previousIndex = row.details.columns.findIndex((c: any) => c.field === this.currentDetailDraggingColumn.field);\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.cdr.detectChanges();\r\n\r\n\r\n }\r\n\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n}\r\n\r\n\r\n@Input() detailsIconPosition: 'start' | 'end' = 'start';\r\n\r\n@Input() detailsPosition: 'top' | 'bottom' = 'top';\r\n\r\n\r\n\r\ndropColumn(event: CdkDragDrop<any[]>, row: any) {\r\n if (!row?.details?.columns) return;\r\n\r\n moveItemInArray(row.details.columns, event.previousIndex, event.currentIndex);\r\n\r\n // Optional: if you want to also reorder the data inside each row\r\n if (row.details.data?.length) {\r\n row.details.data.forEach((dataRow: any) => {\r\n const values = [...row.details.columns.map((c: any) => dataRow[c.field])];\r\n // reassign values in new order\r\n row.details.columns.forEach((col: any, i: number) => {\r\n dataRow[col.field] = values[i];\r\n });\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\nopenSubMenue(col: any){\r\n this.subMenueOpendField = col.field;\r\n}\r\n\r\ndetailDragState = {\r\n isDragging: false,\r\n sourceRow: null as any,\r\n sourceColumn: null as any,\r\n originalColumns: [] as any[],\r\n originalIndex: -1\r\n};\r\n\r\n\r\n\r\nonDetailDragEnd(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const currentContainer = event.source.dropContainer;\r\n\r\n if (this.detailDragState.originalIndex === event.source.data) {\r\n row.details.columns = [...this.detailDragState.originalColumns];\r\n this.cdr.detectChanges();\r\n }\r\n\r\n event.source.element.nativeElement.style.opacity = '1';\r\n}\r\n\r\nonDetailDragEndSimple(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n event.source.element.nativeElement.style.opacity = '1';\r\n\r\n\r\n}\r\n\r\nreorderDetailData(row: any, oldIndex: number, newIndex: number) {\r\n if (!row.details.data) return;\r\n\r\n row.details.data.forEach((dataRow: any) => {\r\n const keys = row.details.columns.map((col: any) => col.field);\r\n const values = keys.map((key: string) => dataRow[key]);\r\n\r\n const movedValue = values[oldIndex];\r\n\r\n values.splice(oldIndex, 1);\r\n\r\n values.splice(newIndex, 0, movedValue);\r\n\r\n const newData: any = {};\r\n keys.forEach((key: string, index: number) => {\r\n newData[key] = values[index];\r\n });\r\n\r\n Object.assign(dataRow, newData);\r\n });\r\n}\r\n\r\nemitDetailColumnReorderEvent(row: any) {\r\n const eventObj = {\r\n rowId: row._id || row.id,\r\n columns: row.details.columns,\r\n eventType: 'onDetailColumnReorder'\r\n };\r\n this.genericEvent.emit(eventObj);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\noriginalDetailValues: Map<string, any> = new Map(); // Track original detail cell values for compare\r\ndetailAccordionStates: Map<string, boolean> = new Map(); // Track accordion expand states\r\n\r\n// Line ~1620: Update onDetailDragStart (add animation class)\r\nonDetailDragStarts(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n\r\n // NEW: Add real-time drag animation\r\n event.source.element.nativeElement.classList.add('dragging'); // Add class for opacity/transform\r\n requestAnimationFrame(() => {\r\n // Preview move\r\n event.source.element.nativeElement.style.transform = 'translateX(10px)';\r\n });\r\n}\r\n\r\n// Line ~1640: Update onDetailDragDropped (add animation + revert if same position)\r\nonDetailDragDroppeds(event: CdkDragDrop<any[]>, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const previousIndex = event.previousIndex;\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n // NEW: Animate reorder\r\n const headerRow = document.querySelector('.detail-header-row') as HTMLElement;\r\n if (headerRow) {\r\n headerRow.classList.add('dragging'); // Start animation\r\n setTimeout(() => {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.reorderDetailData(row, previousIndex, currentIndex);\r\n this.emitDetailColumnReorderEvent(row);\r\n headerRow.classList.remove('dragging'); // End animation\r\n this.cdr.detectChanges();\r\n }, 300); // Delay for smooth real-time feel\r\n }\r\n } else {\r\n // Revert if same position (with animation)\r\n requestAnimationFrame(() => {\r\n event.item.element.nativeElement.style.transform = 'translateX(0)';\r\n });\r\n }\r\n\r\n // Reset\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n event.item.element.nativeElement.classList.remove('dragging');\r\n}\r\n\r\n// NEW METHOD: Add around line ~1700 (after existing drag methods)\r\nhandleDetailDoubleClick(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${col.field}`;\r\n\r\n // Toggle accordion expand\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n this.detailAccordionStates.set(key, row.isDetailsExpand);\r\n\r\n // Emit generic event for accordion toggle (send to API)\r\n const eventObj = {\r\n data: { row, col, dataItem },\r\n eventType: 'expandAccordion',\r\n isExpanded: row.isDetailsExpand\r\n };\r\n this.genericEvent.emit(eventObj);\r\n\r\n // Removed double-click to edit functionality in accordion data\r\n // If not expanded, stop here; else proceed to edit if applicable\r\n // if (!row.isDetailsExpand) return;\r\n\r\n // Proceed to edit (with compare logic in disable)\r\n // this.enableDetailEdit(row, dataItem, col);\r\n\r\n // NEW: Store original value for compare on save\r\n // const originalValue = dataItem[col.field];\r\n // this.originalDetailValues.set(key, originalValue);\r\n}\r\n\r\n// Line ~1740: Update disableDetailEdit (add compare + emit if changed)\r\ndisableDetailEdit(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Compare and emit if changed\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue },\r\n eventType: 'onDetailCellEdit',\r\n changed: true\r\n };\r\n this.genericEvent.emit(sendObj); // Send to API\r\n }\r\n\r\n // Cleanup\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Enable inline editing for accordion cells\r\nenableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Disable inline editing for accordion cells\r\ndisableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue, rowId: row._id || row.id, field: col.field },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Check if accordion cell is being edited\r\nisDetailCellEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\ntooltipVisible = false;\r\ntooltipEditing = false; // NEW\r\ncurrentTooltipField: string | null = null;\r\ncurrentTooltipData: any = null;\r\n// tooltipPosition = { x: 0, y: 0 };\r\n\r\n\r\nenableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndisableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Check if value changed\r\n if (newValue !== originalValue) {\r\n // Send update to API\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n\r\ntooltipElement: HTMLElement | null = null;\r\n\r\n\r\ngetDisplayValue(dataItem: any, field: string): string {\r\nif (field === 'breaks') {\r\nconst breaks = dataItem[field] || [];\r\nif (!Array.isArray(breaks) || breaks.length === 0) {\r\n return '0';\r\n}\r\nconst totalMinutes = breaks.reduce((sum: number, b: any) => sum + (b.break_duration || 0), 0);\r\nreturn totalMinutes > 0 ? `${totalMinutes}m` : '0';\r\n} else if (field === 'short_breaks') {\r\nconst shortBreak = dataItem[field];\r\nif (!shortBreak || !shortBreak.short_break_duration) {\r\n return '0';\r\n}\r\nreturn `${shortBreak.short_break_duration}m`;\r\n} else if (field === 'short_leave') {\r\nconst shortLeaves = dataItem[field] || [];\r\nif (!Array.isArray(shortLeaves) || shortLeaves.length === 0) {\r\n return '0%';\r\n}\r\nreturn '-';\r\n}\r\nreturn '0';\r\n}\r\ngetFormattedCellValue(row: any, col: any): any {\r\n const value = this.getNestedValue(row, col.field);\r\n if (col.field === 'clock_in_time' || col.field === 'clock_out_time') {\r\n if (value) {\r\n return this.formatTime(value);\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n\r\n\r\nenableDetailEditss(row: any, dataItem: any, col: any, breakItem?: any) {\r\n this.hideCustomTooltip();\r\n\r\n // Special case for breaks / short_breaks\r\n if (col.field === 'breaks' || col.field === 'short_breaks') {\r\n this.currentTooltipData = breakItem || dataItem[col.field];\r\n this.currentTooltipField = 'single_break';\r\n this.enableTooltipEdit(); // reuse tooltip editor\r\n return;\r\n }\r\n\r\n // default editing (strings, numbers, etc.)\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n\r\n setTimeout(() => {\r\n const input = document.querySelector(`input[data-edit-key=\"${key}\"]`) as HTMLInputElement;\r\n if (input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }, 0);\r\n}\r\n\r\n\r\ndisableDetailEditss(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\nisDetailEditings(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCells(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\n\r\n\r\nshowCustomTooltip(event: MouseEvent, dataItem: any, field: string) {\r\n if (this.tooltipEditing) return; // don't override while editing\r\n this.currentTooltipData = dataItem;\r\n this.currentTooltipField = field;\r\n this.tooltipPosition = {\r\n x: event.clientX + 15,\r\n y: event.clientY + 15\r\n };\r\n this.tooltipVisible = true;\r\n}\r\n\r\n\r\n\r\nprivate currentTooltip: HTMLElement | null = null;\r\n\r\ngetEmployeeNameTitle(row: any): string {\r\n let title = row?.User?.full_name || row?.full_name || row?.name || 'N/A';\r\n if (row.manually_logs && row.manually_logs.length > 0) {\r\n title += '\\n\\nManual Logs:';\r\n row.manually_logs.forEach((log: any, index: number) => {\r\n const clockIn = log.clock_in?.time ? new Date(log.clock_in.time).toLocaleTimeString() : 'N/A';\r\n const status = log.clock_in?.status || 'N/A';\r\n title += `\\n${index + 1}. Clock In: ${clockIn} (${status})`;\r\n });\r\n }\r\n return title;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nminuteOptions = Array.from({ length: 60 }, (_, i) => i); // 0–59\r\n\r\n\r\ntooltipMinutes: number = 0;\r\nformattedDuration: string = '0m';\r\n\r\nenableTooltipEdit() {\r\n this.tooltipEditing = true;\r\n this.tooltipMinutes = this.currentTooltipData.duration || 0;\r\n this.updateFormattedDuration();\r\n}\r\n\r\nupdateFormattedDuration() {\r\n const total = this.tooltipMinutes || 0;\r\n const hours = Math.floor(total / 60);\r\n const minutes = total % 60;\r\n\r\n if (hours > 0) {\r\n this.formattedDuration = `${hours}h ${minutes}m`;\r\n } else {\r\n this.formattedDuration = `${minutes}m`;\r\n }\r\n}\r\n\r\nsaveTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.currentTooltipData.duration = this.tooltipMinutes;\r\n\r\n const sendObj = {\r\n data: {\r\n ...this.currentTooltipData,\r\n rowId: this.currentTooltipData?.rowId,\r\n field: this.currentTooltipField\r\n },\r\n eventType: 'onTooltipEdit'\r\n };\r\n\r\n this.genericEvent.emit(sendObj);\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\ncancelTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\nshowRestrictionTooltip(event: MouseEvent, parentRow: any, dataItem: any) {\r\n if (!parentRow.attendance_log_detail?.length) {\r\n return;\r\n }\r\n\r\n this.currentRestrictionLogs = [...parentRow.attendance_log_detail];\r\n this.restrictionTooltipPosition = {\r\n x: event.clientX - 160,\r\n y: event.clientY - 150\r\n };\r\n this.restrictionTooltipVisible = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// Add these for delayed hide\r\nprivate customTooltipHideTimeout: any = null;\r\nprivate restrictionTooltipHideTimeout: any = null;\r\nprivate manualLogsTooltipHideTimeout: any = null;\r\n\r\nshowManualLogsModal: boolean = false;\r\nshowManualLogsTooltipModal: boolean = false;\r\nselectedManualLogs: any[] = [];\r\nselectedManualLogsRow: any = null;\r\nhideTooltipTimeout: any = null;\r\n\r\nopenManualLogsModal(event: MouseEvent, parentRow: any) {\r\n if (!parentRow.manually_logs?.length) {\r\n return;\r\n }\r\n this.selectedManualLogs = parentRow.manually_logs;\r\n this.selectedManualLogsRow = parentRow;\r\n this.manualLogsTooltipPosition = { x: event.clientX - 100, y: event.clientY };\r\n this.manualLogsMoused = true;\r\n this.showManualLogsTooltipModal = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nshowManualLogsTooltip(event: MouseEvent, row: any, d: any) {\r\n if (d?.manually_logs?.length > 0) {\r\n this.selectedManualLogs = d?.manually_logs;\r\n this.selectedManualLogsRow = row;\r\n this.manualLogsTooltipPosition = { x: event.clientX - 400, y: event.clientY };\r\n this.manualLogsMoused = true;\r\n this.showManualLogsTooltipModal = true;\r\n }\r\n}\r\n\r\nhideManualLogsTooltip() {\r\n this.manualLogsMoused = false;\r\n setTimeout(() => {\r\n if (!this.manualLogsMoused) {\r\n this.showManualLogsTooltipModal = false;\r\n this.selectedManualLogs = [];\r\n this.selectedManualLogsRow = null;\r\n }\r\n }, 500);\r\n}\r\n\r\n// Removed hover out functionality - modal stays open until manually closed\r\n\r\n\r\n\r\n\r\nhideRestrictionTooltip() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n }\r\n this.restrictionTooltipHideTimeout = setTimeout(() => {\r\n this.restrictionTooltipVisible = false;\r\n this.currentRestrictionLogs = [];\r\n this.cdr.detectChanges();\r\n }, 200);\r\n}\r\n\r\ncloseManualLogsModal() {\r\n this.showManualLogsModal = false;\r\n this.currentManualLogsRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\npreventRestrictionTooltipHide() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n this.restrictionTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\npreventManualLogsModalHide() {\r\n // Prevent modal from closing when clicking inside\r\n}\r\nhideCustomTooltip() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n }\r\n this.customTooltipHideTimeout = setTimeout(() => {\r\n this.tooltipVisible = false;\r\n this.currentTooltipData = null;\r\n this.currentTooltipField = null;\r\n this.cdr.detectChanges();\r\n }, 200); // 200ms delay\r\n}\r\n\r\npreventCustomTooltipHide() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n this.customTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\n\r\nrestrictionTooltipVisible = false;\r\nrestrictionTooltipPosition = { x: 0, y: 0 };\r\ncurrentRestrictionLogs: any[] = [];\r\n\r\ncurrentManualLogsRow: any = null;\r\n\r\n\r\n\r\n\r\n// New properties for detail column menu\r\n// activeDetailCol: any = null;\r\n// activeDetailRow: any = null;\r\nisDetailMenueHidden = false;\r\n\r\n// Detail column menu methods\r\nopenDetailThreeDotsMenus(event: MouseEvent, col: any, row: any) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.isDetailMenueHidden = true;\r\n this.activeDetailCol = col;\r\n this.activeDetailRow = row;\r\n\r\n setTimeout(() => {\r\n const element = document.querySelector('.detail-column-menu') as HTMLElement | null;\r\n const target = event.currentTarget as HTMLElement | null;\r\n\r\n if (element && target) {\r\n const rect = target.getBoundingClientRect(); // ✅ no error now\r\n element.style.left = `${rect.left}px`;\r\n element.style.top = `${rect.bottom}px`;\r\n }\r\n\r\n this.isDetailMenueHidden = false;\r\n this.cdr.detectChanges();\r\n }, 0);\r\n}\r\n\r\n\r\n// Detail sorting methods\r\nsortDetailAsc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'asc';\r\n this.sortDetailData(row, col.field, 'asc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nsortDetailDesc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'desc';\r\n this.sortDetailData(row, col.field, 'desc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailSort(col: any, row: any) {\r\n col.sortOrder = null;\r\n // Reset to original order - you might need to store original order\r\n if (row.details.originalData) {\r\n row.details.data = [...row.details.originalData];\r\n }\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate sortDetailData(row: any, field: string, order: 'asc' | 'desc') {\r\n if (!row.details?.data) return;\r\n\r\n row.details.data.sort((a: any, b: any) => {\r\n const aValue = this.getNestedValue(a, field);\r\n const bValue = this.getNestedValue(b, field);\r\n\r\n if (order === 'asc') {\r\n return aValue < bValue ? -1 : aValue > bValue ? 1 : 0;\r\n } else {\r\n return aValue > bValue ? -1 : aValue < bValue ? 1 : 0;\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail pinning methods\r\nupdateDetailColumnPin(col: any, row: any, pinned: 'left' | 'right' | null) {\r\n col.pinned = pinned;\r\n this.reorderDetailColumns(row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate reorderDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const leftPinned = row.details.columns.filter((col: any) => col.pinned === 'left');\r\n const rightPinned = row.details.columns.filter((col: any) => col.pinned === 'right');\r\n const centerColumns = row.details.columns.filter((col: any) => !col.pinned);\r\n\r\n row.details.columns = [...leftPinned, ...centerColumns, ...rightPinned];\r\n}\r\n\r\n// Detail autosize methods\r\nautosizeDetailColumn(col: any, row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((c: any) => c.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.floor(containerWidth / visibleColumns.length);\r\n\r\n col.width = Math.max(equalWidth, 80);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nautosizeAllDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((col: any) => col.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.max(Math.floor(containerWidth / visibleColumns.length), 80);\r\n\r\n visibleColumns.forEach((col: any) => {\r\n col.width = equalWidth;\r\n });\r\n\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail column visibility methods\r\nchooseDetailColumns(row: any) {\r\n // Implement choose columns modal for detail table\r\n console.log('Choose detail columns for row:', row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailColumns(row: any) {\r\n if (row.details.originalColumns) {\r\n row.details.columns = JSON.parse(JSON.stringify(row.details.originalColumns));\r\n } else {\r\n // If originalColumns not set, initialize it from current columns\r\n // This prevents falling back to parent table columns\r\n if (!row.details.originalColumns) {\r\n row.details.originalColumns = JSON.parse(JSON.stringify(row.details.columns));\r\n }\r\n // Reset to the original detail columns\r\n row.details.columns = JSON.parse(JSON.stringify(row.details.originalColumns));\r\n }\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nshowDetailColumnPanel = false;\r\ncurrentDetailRowForColumnSelection: any = null;\r\n\r\n\r\nopenDetailChooseColumns(row: any) {\r\n this.currentDetailRowForColumnSelection = row;\r\n this.showDetailColumnPanel = true;\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\ncloseDetailColumnPanel() {\r\n this.showDetailColumnPanel = false;\r\n this.currentDetailRowForColumnSelection = null;\r\n}\r\n\r\ntoggleDetailColumnVisibility(column: any, isVisible: boolean) {\r\n if (!this.currentDetailRowForColumnSelection?.details?.columns) return;\r\n\r\n const col = this.currentDetailRowForColumnSelection.details.columns.find(\r\n (c: any) => c.field === column.field\r\n );\r\n if (col) {\r\n col.is_visible = isVisible;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n\r\nallDetailColumnsSelected(): boolean {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n return cols.every((col: any) => col.is_visible !== false);\r\n}\r\n\r\n// resetDetailColumnsInModal() {\r\n// if (!this.currentDetailRowForColumnSelection?.details?.originalColumns) {\r\n// console.warn('Original detail columns not found');\r\n// return;\r\n// }\r\n// this.currentDetailRowForColumnSelection.details.columns =\r\n// JSON.parse(JSON.stringify(this.currentDetailRowForColumnSelection.details.originalColumns));\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\ntoggleAllDetailColumnsVisibility() {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n const allVisible = this.allDetailColumnsSelected();\r\n cols.forEach((col: any) => col.is_visible = !allVisible);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ngroupByDetailColumn(col: any, row: any) {\r\n if (!col || !row?.details) return;\r\n\r\n // Initialize groupedColumns for detail if not exists\r\n if (!row.details.groupedColumns) {\r\n row.details.groupedColumns = [];\r\n }\r\n\r\n // Avoid duplicate grouping\r\n const exists = row.details.groupedColumns.some((g: any) => g.field === col.field);\r\n if (exists) return;\r\n\r\n // Mark column as grouped\r\n col.isRowGrouped = true;\r\n row.details.groupedColumns.push({ ...col });\r\n\r\n // Perform grouping on detail data\r\n this.groupDetailData(row);\r\n}\r\n\r\ngroupDetailData(row: any) {\r\n const fields = row.details.groupedColumns.map((col: any) => col.field);\r\n const originalData = row.details.originalData || row.details.data;\r\n row.details.data = this.groupData(originalData, fields);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nungroupDetailColumn(col: any, row: any) {\r\n const index = row.details.groupedColumns.findIndex((g: any) => g.field === col.field);\r\n if (index !== -1) {\r\n row.details.groupedColumns.splice(index, 1);\r\n }\r\n\r\n // Find and unmark in columns\r\n const detailCol = row.details.columns.find((c: any) => c.field === col.field);\r\n if (detailCol) detailCol.isRowGrouped = false;\r\n\r\n // Use originalData if exists, else fallback to current data\r\n const sourceData = row.details.originalData || row.details.data;\r\n row.details.data = JSON.parse(JSON.stringify(sourceData));\r\n\r\n // Re-apply remaining groups (if any)\r\n if (row.details.groupedColumns.length > 0) {\r\n this.groupDetailData(row);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// const sm = row.details.sideMenu || (row.details.sideMenu = { visible: true, currentTab: null });\r\n// if (sm.currentTab === tab) {\r\n// sm.visible = !sm.visible;\r\n// } else {\r\n// sm.currentTab = tab;\r\n// sm.visible = true;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// // Optional: emit event or re-render\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// applyDetailRowFilter(row: any) {\r\n// // if (!row.details.originalData) {\r\n// // row.details.originalData = [...row.details.data];\r\n// // }\r\n// // const filters = row.details.filters || {};\r\n// // row.details.data = row.details.originalData.filter(item: => {\r\n// // return Object.keys(filters).every(field => {\r\n// // const term = (filters[field] || '').toLowerCase();\r\n// // if (!term) return true;\r\n// // const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// // return value.includes(term);\r\n// // });\r\n// // });\r\n// }\r\n\r\n\r\n// Initialize side menu when expanding\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand && !row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// // Ensure sideMenu object exists\r\n// if (!row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// // Optional: preserve original data for filtering\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n\r\n// const sm = row.details.sideMenu;\r\n// if (sm.currentTab === tab) {\r\n// sm.currentTab = null; // close panel\r\n// } else {\r\n// sm.currentTab = tab; // open selected tab\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Column visibility change handler\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// // Apply filter to detail data\r\n// applyDetailRowFilter(row: any) {\r\n// const filters = row.details.filters || {};\r\n// row.details.data = row.details.originalData.filter((item: any) => {\r\n// return Object.keys(filters).every(field => {\r\n// const term = (filters[field] || '').toLowerCase();\r\n// if (!term) return true;\r\n// const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// return value.includes(term);\r\n// });\r\n// });\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n\r\n// Initialize detail row + side menu\r\ntoggleExpand(row: any) {\r\n if (row.details) {\r\n // Always ensure originalColumns is set when details exist\r\n if (!row.details.originalColumns) {\r\n row.details.originalColumns = JSON.parse(JSON.stringify(row.details.columns));\r\n }\r\n\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n if (row.isDetailsExpand) {\r\n // ✅ Initialize filters & visibility\r\n if (!row.details.filters) row.details.filters = {};\r\n if (!row.details.originalData) {\r\n row.details.originalData = [...row.details.data];\r\n }\r\n row.details.columns.forEach((col: any) => {\r\n if (col.is_visible === undefined) col.is_visible = true;\r\n });\r\n // ✅ Initialize sideMenu if not exists\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = {\r\n currentTab: null,\r\n columnSearch: ''\r\n };\r\n }\r\n }\r\n } else {\r\n row.isExpand = !row.isExpand;\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\ntoggleDetailSideMenu(row: any, tab: 'cols') { // remove 'filtrs'\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = { currentTab: null, columnSearch: '' };\r\n }\r\n const sm = row.details.sideMenu;\r\n sm.currentTab = sm.currentTab === tab ? null : tab;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Column visibility change\r\nonDetailColumnVisibilityChange(row: any) {\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Apply filter to detail data\r\napplyDetailRowFilter(row: any) {\r\n const filters = row.details.filters || {};\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n return Object.keys(filters).every(field => {\r\n const config = filters[field] || {};\r\n const term = (config.value || '').toLowerCase();\r\n if (!term) return true;\r\n const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n const condition = config.condition || 'contain';\r\n switch (condition) {\r\n case 'equal': return value === term;\r\n case 'start': return value.startsWith(term);\r\n case 'end': return value.endsWith(term);\r\n default: return value.includes(term);\r\n }\r\n });\r\n });\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Apply all side menu filters\r\napplySideMenuFilters() {\r\n // Emit the current filtersConfig to apply all filters\r\n this.filterOptions.emit(this.filtersConfig);\r\n this.cdr.markForCheck();\r\n}\r\n\r\n// Reset all side menu filters\r\nresetSideMenuFilters() {\r\n // Clear all filters in filtersConfig\r\n this.filtersConfig = [];\r\n this.filterOptions.emit(this.filtersConfig);\r\n // Emit filter cleared event with true only if preset is selected\r\n this.filterCleared.emit(this.tableFilterViewId ? true : false);\r\n this.cdr.markForCheck();\r\n}\r\n\r\n\r\n\r\n\r\nonResizeDetailColumn(event: MouseEvent, row: any, col: any): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n const initialWidth = col.width || 150;\r\n\r\n // Find all matching header and data cells in this detail table\r\n const headerCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] th[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n const dataCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] td[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n\r\n const allCells = [...headerCells, ...dataCells];\r\n\r\n // Optional: highlight during resize\r\n allCells.forEach(el => el.classList.add('resizing-highlight'));\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const deltaX = moveEvent.clientX - startX;\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 80) newWidth = 80; // min width\r\n\r\n // Apply to DOM\r\n allCells.forEach(el => {\r\n el.style.width = `${newWidth}px`;\r\n el.style.minWidth = `${newWidth}px`;\r\n });\r\n\r\n // Update model\r\n col.width = newWidth;\r\n };\r\n\r\n const onMouseUp = () => {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n allCells.forEach(el => el.classList.remove('resizing-highlight'));\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n}\r\n\r\n// In your component\r\ngetDetailViewportHeight(row: any): number {\r\n const rowCount = row.details?.data?.length || 0;\r\n const rowHeight = this.nestedTablerowHeight || 40;\r\n const maxHeight = 350;\r\n return Math.min(rowCount * rowHeight, maxHeight);\r\n}\r\n\r\nprivate getAccordionRowHeight(row: any): number {\r\n if (!row.isDetailsExpand) {\r\n return this.rowHeight;\r\n }\r\n\r\n // For expanded rows, measure the actual rendered height\r\n // Use requestAnimationFrame to ensure DOM is updated\r\n const rowId = row._id || row.id;\r\n const accordionElement = document.querySelector(`[data-row-id=\"${rowId}\"] .accordion-details`) as HTMLElement;\r\n\r\n if (accordionElement) {\r\n // Get the actual rendered height including padding and borders\r\n const computedHeight = accordionElement.offsetHeight;\r\n if (computedHeight > 0) {\r\n // Add some buffer for consistency\r\n return this.rowHeight + computedHeight + 10;\r\n }\r\n }\r\n\r\n // Fallback calculation if element not found or not rendered yet\r\n const headerHeight = this.nestedTableHeaderRowHeight || 40;\r\n const detailRowCount = row.details?.data?.length || 0;\r\n const detailRowHeight = this.nestedTablerowHeight || 36;\r\n const detailHeight = detailRowCount * detailRowHeight;\r\n const maxDetailHeight = 350; // Same as CSS max-height\r\n const actualDetailHeight = Math.min(detailHeight, maxDetailHeight);\r\n\r\n // Add padding and borders\r\n const padding = 20;\r\n\r\n return this.rowHeight + headerHeight + actualDetailHeight + padding;\r\n}\r\n\r\n\r\n\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = target.scrollTop;\r\n// if (right) right.scrollTop = target.scrollTop;\r\n// }\r\n\r\nonDetailLeftScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (right) right.scrollTop = target.scrollTop;\r\n}\r\n\r\nonDetailRightScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (left) left.scrollTop = target.scrollTop;\r\n}\r\n\r\n\r\n\r\n\r\n// NEW: Sync vertical scroll from body → header (so header moves down with data)\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n\r\n// // Sync vertical scroll to left/right sections\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = scrollTop;\r\n// if (right) right.scrollTop = scrollTop;\r\n\r\n// // ✅ Sync vertical scroll to HEADER (so it scrolls down with data)\r\n// const headerTable = document.querySelector(`.accordion-center-section table[style*=\"table-layout\"]`) as HTMLElement;\r\n// if (headerTable) {\r\n// headerTable.scrollTop = scrollTop;\r\n// }\r\n// }\r\n\r\n// Optional: Handle header scroll (rarely needed, but safe)\r\n// onDetailHeaderScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n// const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (viewport) viewport.scrollTop = scrollTop;\r\n// }\r\n\r\n\r\n// Sync: Body scroll → Header scroll (vertical)\r\nonDetailCenterScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n // Sync vertical scroll to LEFT/RIGHT sections\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (left) left.scrollTop = scrollTop;\r\n if (right) right.scrollTop = scrollTop;\r\n\r\n // ✅ NEW: Sync vertical scroll to HEADER\r\n const headerScrollContainer = document.querySelector(`.detail-header-scroll-container[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (headerScrollContainer) {\r\n headerScrollContainer.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Sync: Header scroll → Body scroll (in case user scrolls header manually)\r\nonDetailHeaderScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) {\r\n viewport.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n@ViewChild('headerContainer', { static: false }) headerContainer: ElementRef<HTMLDivElement> | null = null;\r\n@ViewChild('dataContainer', { static: false }) dataContainer!: CdkVirtualScrollViewport;\r\n\r\nsyncScroll(event: Event) {\r\n if (!this.headerContainer || !this.dataContainer) return;\r\n\r\n const target = event.target as HTMLElement;\r\n const dataEl = this.dataContainer.elementRef.nativeElement as HTMLElement;\r\n const headerEl = this.headerContainer.nativeElement;\r\n\r\n if (target === headerEl) {\r\n dataEl.scrollLeft = headerEl.scrollLeft;\r\n } else if (target === dataEl) {\r\n headerEl.scrollLeft = dataEl.scrollLeft;\r\n }\r\n }\r\n\r\n\r\n // @ViewChild('dataContainer') dataContainer!: CdkVirtualScrollViewport;\r\n@ViewChild('leftContainer') leftContainer!: ElementRef<HTMLDivElement>;\r\n@ViewChild('rightContainer') rightContainer!: ElementRef<HTMLDivElement>;\r\n\r\nsyncVerticalScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n if (this.leftContainer) {\r\n this.leftContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n if (this.rightContainer) {\r\n this.rightContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Map: detailRowId → selection state\r\n// detailSelectionState = new Map<string, {\r\n// selectedCells: CellPosition[];\r\n// selectedKeys: Set<string>;\r\n// rowSelectedIndexes: Set<number>;\r\n// undoStack: any[][];\r\n// redoStack: any[][];\r\n// }>();\r\n\r\nprivate getDetailRowId(row: any): string {\r\n return row._id || row.id;\r\n}\r\n\r\n\r\nstartDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n event.preventDefault();\r\n this.isDetailDragging = false;\r\n\r\n this.clearOtherDetailSections(detailRow, section);\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n state.selectedCells = [{ rowIndex, colIndex: globalColIndex, subColIndex: 0, field, key }];\r\n state.selectedKeys.clear();\r\n state.selectedKeys.add(key);\r\n\r\n const mouseMove = () => {\r\n this.isDetailDragging = true;\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mousemove', mouseMove);\r\n\r\n const mouseUp = () => {\r\n document.removeEventListener('mouseup', mouseUp);\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mouseup', mouseUp);\r\n}\r\n\r\n\r\nextendDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n if (!this.isDetailDragging) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const start = state.selectedCells[0];\r\n const minRow = Math.min(start.rowIndex, rowIndex);\r\n const maxRow = Math.max(start.rowIndex, rowIndex);\r\n const minCol = Math.min(start.colIndex, globalColIndex);\r\n const maxCol = Math.max(start.colIndex, globalColIndex);\r\n\r\n const newKeys = new Set<string>();\r\n const newCells: CellPosition[] = [];\r\n\r\n // Use FULL columns, but filter by section visibility\r\n const allColumns = detailRow.details.columns;\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const col = allColumns[c];\r\n if (!col) continue;\r\n\r\n // Check if this column belongs to the current section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (inSection && col.is_visible !== false) {\r\n const k = `${r}-${c}-${col.field}`;\r\n newKeys.add(k);\r\n newCells.push({\r\n rowIndex: r,\r\n colIndex: c, // ✅ Keep global index\r\n subColIndex: 0,\r\n field: col.field,\r\n key: k\r\n });\r\n }\r\n }\r\n }\r\n\r\n state.selectedKeys = newKeys;\r\n state.selectedCells = newCells;\r\n}\r\n\r\nprivate getSectionColumns(row: any, section: 'left' | 'center' | 'right') {\r\n if (section === 'left') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'left');\r\n } else if (section === 'right') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'right');\r\n } else {\r\n return row.details.columns.filter((col: any) => !col.pinned);\r\n }\r\n}\r\n\r\nisDetailCellSelected(detailRow: any, rowIndex: number, globalColIndex: number, field: string, section: 'left' | 'center' | 'right'): boolean {\r\n const col = detailRow.details.columns[globalColIndex];\r\n if (!col) return false;\r\n\r\n // Verify column belongs to section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (!inSection || col.is_visible === false) return false;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n return state.selectedKeys.has(key);\r\n}\r\n\r\n\r\ngetSelectedDetailData(detailRow: any, section: 'left' | 'center' | 'right'): any[][] {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return [];\r\n\r\n const dataMap = new Map<number, any[]>();\r\n for (const cell of state.selectedCells) {\r\n if (!dataMap.has(cell.rowIndex)) {\r\n dataMap.set(cell.rowIndex, []);\r\n }\r\n const value = this.getNestedValue(detailRow.details.data[cell.rowIndex], cell.field);\r\n\r\n // Find LOCAL index in section for paste alignment\r\n const allColumns = detailRow.details.columns;\r\n let localIndex = 0;\r\n for (let i = 0; i < cell.colIndex; i++) {\r\n const col = allColumns[i];\r\n if (!col) continue;\r\n let inSection = false;\r\n if (section === 'left') inSection = col.pinned === 'left';\r\n else if (section === 'right') inSection = col.pinned === 'right';\r\n else inSection = !col.pinned;\r\n\r\n if (inSection && col.is_visible !== false) {\r\n localIndex++;\r\n }\r\n }\r\n dataMap.get(cell.rowIndex)![localIndex] = value ?? '';\r\n }\r\n\r\n return Array.from(dataMap.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(entry => entry[1]);\r\n}\r\n\r\n\r\nprivate isAnyDetailFocused(): boolean {\r\n return !!document.querySelector('.detail-virtual-scroll .selected-cell');\r\n}\r\n\r\nprivate handleDetailShortcuts(event: KeyboardEvent, detailRow: any, section: 'left' | 'center' | 'right') {\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n this.performDetailCut(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'v') {\r\n event.preventDefault();\r\n this.performDetailPaste(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\r\n event.preventDefault();\r\n this.detailUndo(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.detailRedo(detailRow, section);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\nperformDetailCut(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n state.redoStack = [];\r\n\r\n for (const cell of state.selectedCells) {\r\n const dataRow = detailRow.details.data[cell.rowIndex];\r\n this.setNestedValue(dataRow, { field: cell.field }, null, false);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\nasync performDetailPaste(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const text = await navigator.clipboard.readText();\r\n if (!text) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const startCell = state.selectedCells[0];\r\n const rows = text.split('\\n').map(r => r.split('\\t'));\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n const rIdx = startCell.rowIndex + i;\r\n if (rIdx >= detailRow.details.data.length) break;\r\n const dataRow = detailRow.details.data[rIdx];\r\n for (let j = 0; j < rows[i].length; j++) {\r\n const cIdx = startCell.colIndex + j;\r\n const columns = this.getSectionColumns(detailRow, section);\r\n if (cIdx >= columns.length) break;\r\n const col = columns[cIdx];\r\n if (col?.is_visible !== false) {\r\n this.setNestedValue(dataRow, { field: col.field }, rows[i][j], false);\r\n }\r\n }\r\n }\r\n\r\n // ✅ Fix breaks/short_breaks after paste\r\n detailRow.details.data.forEach((row: any) => {\r\n if (!Array.isArray(row.breaks)) row.breaks = [];\r\n if (row.short_breaks && typeof row.short_breaks === 'string') {\r\n row.short_breaks = { duration: 0, type: 'none' };\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\ndetailUndo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.undoStack.length === 0) return;\r\n\r\n state.redoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.undoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndetailRedo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.redoStack.length === 0) return;\r\n\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.redoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate isDetailDragging = false;\r\n\r\n\r\n// Map: detailRowId → section → selection state\r\n// Map: detailRowId → section → selection state\r\ndetailSelectionState = new Map<string, Map<string, {\r\n selectedCells: CellPosition[];\r\n selectedKeys: Set<string>;\r\n undoStack: any[][];\r\n redoStack: any[][];\r\n}>>();\r\n\r\nprivate getDetailSelectionState(row: any, section: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(row);\r\n let rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) {\r\n rowMap = new Map();\r\n this.detailSelectionState.set(rowId, rowMap);\r\n }\r\n let state = rowMap.get(section);\r\n if (!state) {\r\n state = {\r\n selectedCells: [],\r\n selectedKeys: new Set(),\r\n undoStack: [],\r\n redoStack: []\r\n };\r\n rowMap.set(section, state);\r\n }\r\n return state;\r\n}\r\n\r\n\r\nprivate findFocusedDetailRowAndSection(): { row: any; section: 'left' | 'center' | 'right' } | null {\r\n const left = document.querySelector('.accordion-left-section .selected-cell');\r\n const center = document.querySelector('.detail-virtual-scroll .selected-cell');\r\n const right = document.querySelector('.accordion-right-section .selected-cell');\r\n\r\n const getRow = (el: Element | null) => {\r\n if (!el) return null;\r\n const rowId = el.closest('[data-detail-row-id]')?.getAttribute('data-detail-row-id');\r\n return this.visibleRows.find((r: any) => (r._id || r.id) === rowId);\r\n };\r\n\r\n if (left) return { row: getRow(left), section: 'left' };\r\n if (center) return { row: getRow(center), section: 'center' };\r\n if (right) return { row: getRow(right), section: 'right' };\r\n return null;\r\n}\r\n\r\nprivate clearOtherDetailSections(currentRow: any, currentSection: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(currentRow);\r\n const rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) return;\r\n\r\n // Clear the two sections that are NOT currentSection\r\n const sections: ('left' | 'center' | 'right')[] = ['left', 'center', 'right'];\r\n for (const section of sections) {\r\n if (section !== currentSection) {\r\n const state = rowMap.get(section);\r\n if (state) {\r\n state.selectedCells = [];\r\n state.selectedKeys.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Getter to check if any accordion is open\r\nget hasOpenAccordion(): boolean {\r\n return this.dataSet.some(row => row.isDetailsExpand);\r\n}\r\n\r\nprivate hasAccordionStateChanged(): boolean {\r\n const currentExpandedRows = new Set(this.dataSet.filter(row => row.isDetailsExpand).map(row => row._id || row.id));\r\n const previousExpandedRows = this.expandedRows;\r\n\r\n if (currentExpandedRows.size !== previousExpandedRows.size) {\r\n this.expandedRows = currentExpandedRows;\r\n return true;\r\n }\r\n\r\n for (const id of currentExpandedRows) {\r\n if (!previousExpandedRows.has(id)) {\r\n this.expandedRows = currentExpandedRows;\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// getFirstTwoWords(name: string): string {\r\n// if (!name) return '';\r\n// const words = name.trim().split(/\\s+/);\r\n// return words.slice(0, 2).join(' ').toUpperCase();\r\n// }\r\n\r\nselectRange(range: Date[], drp: BsDaterangepickerDirective) {\r\n // Prevent future dates\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 999); // End of today\r\n if (range[0] > today || range[1] > today) {\r\n // Reset to current date range\r\n this.bsRangeValue = [new Date(), new Date()];\r\n return;\r\n }\r\n\r\n this.bsRangeValue = range;\r\n this.isDefaultDateRange = false; // User has selected a range, no longer default\r\n // Auto-apply when selecting from predefined ranges\r\n // Determine if it's a single day selection for predefined ranges\r\n const isSingleDaySelected = range.length === 2 &&\r\n range[0] && range[1] &&\r\n range[0].getTime() === range[1].getTime();\r\n\r\n // Emit event with selected range and single day flag\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: range,\r\n isSingleDay: isSingleDaySelected\r\n }\r\n };\r\n console.log('Predefined Range Selected Event:', eventData);\r\n this.genericEvent.emit(eventData);\r\n\r\n drp.hide();\r\n}\r\n\r\n onClear(drp: BsDaterangepickerDirective) {\r\n const currentViewDate = this.bsRangeValue; // Capture current view date\r\n this.bsRangeValue = [];\r\n const event = {\r\n eventType: 'clearDateRange',\r\n data: { dateRange: currentViewDate, applied: this.dataSet }\r\n };\r\n this.genericEvent.emit(event); // Emit event to trigger listing data update API call\r\n drp.hide();\r\n }\r\n\r\n onApply(drp: BsDaterangepickerDirective) {\r\n // Prevent future dates\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 999); // End of today\r\n if (this.bsRangeValue[0] > today || this.bsRangeValue[1] > today) {\r\n // Reset to current date range\r\n this.bsRangeValue = [new Date(), new Date()];\r\n return;\r\n }\r\n\r\n this.isDefaultDateRange = false; // User has applied a range, no longer default\r\n // Determine if it's a single day selection\r\n const isSingleDaySelected = this.bsRangeValue.length === 2 &&\r\n this.bsRangeValue[0] && this.bsRangeValue[1] &&\r\n this.bsRangeValue[0].getTime() === this.bsRangeValue[1].getTime();\r\n\r\n // Emit event with selected range and single day flag\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: this.bsRangeValue,\r\n isSingleDay: isSingleDaySelected\r\n }\r\n };\r\n console.log('Date Range Selected Event:', eventData);\r\n this.genericEvent.emit(eventData);\r\n\r\n drp.hide();\r\n }\r\n\r\n\r\n\r\n\r\n\r\n // @Output() genericEvent = new EventEmitter<any>();\r\n bsRangeValue: Date[] = []; // Empty by default\r\n isDefaultDateRange: boolean = true; // Track if current range is default\r\n showPicker = false;\r\n bsConfig: Partial<BsDaterangepickerConfig> = {\r\n adaptivePosition: true,\r\n rangeInputFormat: 'DD/MM/YYYY',\r\n showWeekNumbers: false,\r\n containerClass: 'theme-default',\r\n ranges: this.getCustomRanges(), // Updated with new range\r\n showClearButton: true, // Attempts to show clear (using external button)\r\n returnFocusToInput: true,\r\n displayMonths: 2, // Show two months\r\n maxDate: new Date() // Prevent selecting future dates\r\n };\r\n\r\n // Define custom ranges including new \"Last 30 Days\"\r\n private getCustomRanges() {\r\n const startDate = new Date()\r\n const endDate = new Date()\r\n const today = new Date();\r\n const yesterday = new Date(today);\r\n yesterday.setDate(today.getDate() - 1);\r\n\r\n const last7DaysStart = new Date(today);\r\n last7DaysStart.setDate(today.getDate() - 7);\r\n\r\n const last30DaysStart = new Date(today);\r\n last30DaysStart.setDate(today.getDate() - 30);\r\n\r\n const thisMonthStart = new Date(today.getFullYear(), today.getMonth(), 1);\r\n const thisMonthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0);\r\n // Ensure this month doesn't include future dates\r\n if (thisMonthEnd > today) {\r\n thisMonthEnd.setTime(today.getTime());\r\n }\r\n\r\n const lastMonthEnd = new Date(today.getFullYear(), today.getMonth(), 0);\r\n const lastMonthStart = new Date(today.getFullYear(), today.getMonth() - 1, 1);\r\n\r\n const last3MonthsStart = new Date(today);\r\n last3MonthsStart.setMonth(today.getMonth() - 3);\r\n\r\n const thisYearStart = new Date(today.getFullYear(), 0, 1);\r\n const thisYearEnd = new Date(today.getFullYear(), 11, 31);\r\n // Ensure this year doesn't include future dates\r\n if (thisYearEnd > today) {\r\n thisYearEnd.setTime(today.getTime());\r\n }\r\n\r\n return [\r\n {\r\n value: [yesterday, yesterday],\r\n label: 'Yesterday'\r\n },\r\n {\r\n value: [last7DaysStart, yesterday],\r\n label: 'Last 7 Days'\r\n },\r\n {\r\n value: [last30DaysStart, yesterday],\r\n label: 'Last 30 Days'\r\n },\r\n {\r\n value: [thisMonthStart, thisMonthEnd],\r\n label: 'This Month'\r\n },\r\n {\r\n value: [lastMonthStart, lastMonthEnd],\r\n label: 'Last Month'\r\n },\r\n {\r\n value: [last3MonthsStart, yesterday],\r\n label: 'Last 3 Months'\r\n },\r\n {\r\n value: [thisYearStart, thisYearEnd],\r\n label: 'This Year'\r\n },\r\n // {\r\n // value: [startDate, endDate],\r\n // label: 'Apply'\r\n // }\r\n ];\r\n }\r\n\r\n \r\n\r\n // Handle range change when Apply is clicked\r\n onRangeChange(value: Date[]) {\r\n this.bsRangeValue = value;\r\n const event = {\r\n obj: { dateRange: value || [] },\r\n eventType: 'dateRangeChange'\r\n };\r\n this.genericEvent.emit(event); // Emit event to trigger updates (e.g., filter)\r\n }\r\n\r\n // Clear the selected range\r\n clearDateRange() {\r\n const currentViewDate = this.bsRangeValue; // Capture current view date\r\n // Reset to default date range (current date)\r\n const today = new Date();\r\n this.bsRangeValue = [today, today];\r\n this.isDefaultDateRange = true; // Reset to default\r\n\r\n const event = {\r\n obj: { dateRange: currentViewDate, listingData: this.dataSet },\r\n eventType: 'clearDateRange'\r\n };\r\n this.genericEvent.emit(event); // Emit event to trigger listing data update API call\r\n }\r\n\r\n // Toggle picker\r\n togglePicker(picker: BsDaterangepickerDirective) {\r\n this.showPicker = !this.showPicker;\r\n this.showPicker ? picker.show() : picker.hide();\r\n }\r\n\r\n // Navigate date range\r\n navigateDate(direction: 'left' | 'right') {\r\n if (!this.bsRangeValue || this.bsRangeValue.length !== 2) return;\r\n\r\n const start = new Date(this.bsRangeValue[0]);\r\n const end = new Date(this.bsRangeValue[1]);\r\n const oneDay = 24 * 60 * 60 * 1000; // 1 day in milliseconds\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 999); // End of today\r\n\r\n let newStart: Date;\r\n let newEnd: Date;\r\n\r\n if (direction === 'left') {\r\n newStart = new Date(start.getTime() - oneDay);\r\n newEnd = new Date(end.getTime() - oneDay);\r\n } else {\r\n // Prevent navigating to future dates\r\n newStart = new Date(start.getTime() + oneDay);\r\n newEnd = new Date(end.getTime() + oneDay);\r\n if (newEnd > today) {\r\n return; // Don't navigate to future\r\n }\r\n }\r\n\r\n this.bsRangeValue = [newStart, newEnd];\r\n this.isDefaultDateRange = false;\r\n\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: this.bsRangeValue,\r\n isSingleDay: this.isSingleDay\r\n }\r\n };\r\n this.genericEvent.emit(eventData);\r\n }\r\n\r\n\r\nonRangeSelected(range: (Date | undefined)[] | undefined, picker: BsDaterangepickerDirective) {\r\n\r\nif (!range || range.length !== 2 || !range[0] || !range[1]) {\r\n\r\nreturn;\r\n}\r\n\r\n// Prevent future dates\r\nconst today = new Date();\r\ntoday.setHours(23, 59, 59, 999); // End of today\r\nif (range[0] > today || range[1] > today) {\r\n // Reset to current date range\r\n this.bsRangeValue = [new Date(), new Date()];\r\n return;\r\n}\r\n\r\nthis.isDefaultDateRange = false; // User has selected a range, no longer default\r\nconst isSingleDay = range[0].getTime() === range[1].getTime();\r\nconst eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: [range[0], range[1]],\r\n isSingleDay\r\n }\r\n};\r\nthis.genericEvent.emit(eventData);\r\npicker.hide();\r\n}\r\n\r\n\r\nonMainScroll(event: Event): void {\r\n // Handle main scroll events for drag grouping and calendar functionality\r\n const scrollTop = (event.target as HTMLElement).scrollTop;\r\n this.updateScrollMetrics(scrollTop);\r\n this.scrollSubject.next(scrollTop);\r\n}\r\n\r\nngOnDestroy(): void {\r\n // Complete all reactive streams\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n // Stop cache cleanup interval\r\n this.stopCacheCleanup();\r\n\r\n // Clear tooltip timeouts\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n this.tooltipShowTimeout = null;\r\n }\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Clear all timers and intervals\r\n if (this.fakeScrollRaf) {\r\n cancelAnimationFrame(this.fakeScrollRaf);\r\n }\r\n if (this.mainScrollRaf) {\r\n cancelAnimationFrame(this.mainScrollRaf);\r\n }\r\n if (this.scrollRaf) {\r\n cancelAnimationFrame(this.scrollRaf);\r\n }\r\n if (this.autoScrollInterval) {\r\n cancelAnimationFrame(this.autoScrollInterval);\r\n }\r\n\r\n // Clear timeouts and intervals\r\n this.timeouts.forEach(id => clearTimeout(id));\r\n this.intervals.forEach(id => clearInterval(id));\r\n this.timeouts.clear();\r\n this.intervals.clear();\r\n\r\n // Remove event listeners\r\n this.eventListeners.forEach((listener, key) => {\r\n // Find the element and remove the listener\r\n const element = this.domCache.get(key);\r\n if (element) {\r\n element.removeEventListener('scroll', listener);\r\n }\r\n });\r\n this.eventListeners.clear();\r\n\r\n // Disconnect resize observers\r\n this.resizeObservers.forEach(observer => observer.disconnect());\r\n this.resizeObservers.clear();\r\n\r\n // Disconnect intersection observer\r\n if (this.intersectionObserver) {\r\n this.intersectionObserver.disconnect();\r\n this.intersectionObserver = null;\r\n }\r\n\r\n // Destroy component references\r\n this.componentRefs.forEach(ref => ref.destroy());\r\n this.componentRefs.clear();\r\n\r\n // Clear all maps and sets to prevent memory leaks\r\n this.selectedRows.clear();\r\n this.expandedRows.clear();\r\n this.expandedCells.clear();\r\n this.detailSelectionState.clear();\r\n this.detailAccordionStates.clear();\r\n this.originalDetailValues.clear();\r\n this.cachedElements.clear();\r\n\r\n // Clear advanced DOM caching\r\n this.domQueryCache.clear();\r\n this.domQueryStats.clear();\r\n\r\n // Clear efficient data structures\r\n this.columnIndex.clear();\r\n this.rowIndex = new WeakMap();\r\n this.visibleColumnCache.clear();\r\n this.dataCache.clear();\r\n this.computationCache.clear();\r\n this.domCache.clear();\r\n this.itemHeightCache.clear();\r\n\r\n // Clear undo/redo stacks\r\n this.undoStack.length = 0;\r\n this.redoStack.length = 0;\r\n\r\n // Clear any pending timeouts\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n }\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n }\r\n if (this.manualLogsTooltipHideTimeout) {\r\n clearTimeout(this.manualLogsTooltipHideTimeout);\r\n }\r\n if (this.elementCacheTimeout) {\r\n clearTimeout(this.elementCacheTimeout);\r\n }\r\n\r\n // Clear ResizeObserver if exists\r\n if (this.cellText?.nativeElement) {\r\n const observer = new ResizeObserver(() => {});\r\n observer.disconnect();\r\n }\r\n}\r\n@Input() buttons: {\r\n name: string;\r\n iconPath: string;\r\n is_showIcon: boolean;\r\n has_permission: boolean | (() => boolean);\r\n condition?: string | null;\r\n}[] = [];\r\n@Output() emailClicked = new EventEmitter<void>();\r\n@Output() addAttendanceClicked = new EventEmitter<void>();\r\n// @Output() searchEvent = new EventEmitter<any>();\r\n\r\n// onEmailClick() {\r\n// this.emailClicked.emit();\r\n// }\r\n\r\n// onAddAttendanceClick() {\r\n// this.addAttendanceClicked.emit();\r\n// }\r\n\r\n// @Input() isSingleDay: boolean = false;\r\n@Input() isStartDateNotEqualToEndDate = () => true; // or pass as boolean\r\nonEmailClick() { this.emailClicked.emit(); }\r\nonAddAttendanceClick() { this.addAttendanceClicked.emit(); }\r\nonBackPayClick() { this.backPayClicked.emit(); }\r\nonGrandTotalClick() { this.grandTotalClicked.emit(); }\r\nonPrintClick() { this.printClicked.emit(); }\r\nonExportClick() { this.exportClicked.emit(); }\r\nonExportDailyClick() { this.exportDailyClicked.emit(); }\r\n\r\n@Output() backPayClicked = new EventEmitter<void>();\r\n@Output() grandTotalClicked = new EventEmitter<void>();\r\n@Output() printClicked = new EventEmitter<void>();\r\n@Output() exportClicked = new EventEmitter<void>();\r\n@Output() exportDailyClicked = new EventEmitter<void>();\r\n@Output() deleteClicked = new EventEmitter<void>();\r\n\r\nonDeleteClick() { this.deleteClicked.emit(); }\r\n\r\nonActionButtonClick(name: string) {\r\n switch (name) {\r\n case 'Email':\r\n this.onEmailClick();\r\n break;\r\n case 'Add Attendance':\r\n this.onAddAttendanceClick();\r\n break;\r\n case 'Back Pay':\r\n this.onBackPayClick();\r\n break;\r\n case 'Grand Total':\r\n this.onGrandTotalClick();\r\n break;\r\n case 'Print':\r\n this.onPrintClick();\r\n break;\r\n case 'Export':\r\n this.onExportClick();\r\n break;\r\n case 'Export Daily Timesheet':\r\n this.onExportDailyClick();\r\n break;\r\n }\r\n}\r\n\r\nget areDatesSelectedAndEqual(): boolean {\r\n if (!this.bsRangeValue || this.bsRangeValue.length < 2) {\r\n return false;\r\n }\r\n\r\n const [start, end] = this.bsRangeValue;\r\n\r\n // Check both exist\r\n if (!start || !end) {\r\n return false;\r\n }\r\n\r\n // Compare only date parts (ignore time)\r\n return (\r\n start.getFullYear() === end.getFullYear() &&\r\n start.getMonth() === end.getMonth() &&\r\n start.getDate() === end.getDate()\r\n );\r\n}\r\n\r\nget hasAccordionDetails(): boolean {\r\n return this.dataSet.some(row => row.details?.data?.length > 0);\r\n}\r\n\r\nisArray(value: any): boolean {\r\n return Array.isArray(value);\r\n}\r\n\r\n// Timeline View Methods\r\ngetTimelineHours(): string[] {\r\n const hours = [];\r\n for (let i = 0; i < 24; i++) {\r\n hours.push(`${i.toString().padStart(2, '0')}:00`);\r\n }\r\n return hours;\r\n}\r\n\r\ngetTimePosition(timeString: string): number {\r\n if (!timeString) return 0;\r\n const date = new Date(timeString);\r\n const hours = date.getHours();\r\n const minutes = date.getMinutes();\r\n return ((hours * 60 + minutes) / 1440) * 100; // 1440 minutes in a day\r\n}\r\n\r\ngetWorkDurationWidth(row: any): number {\r\n if (!row.clock_in_time || !row.clock_out_time) return 0;\r\n const start = new Date(row.clock_in_time);\r\n const end = new Date(row.clock_out_time);\r\n const duration = (end.getTime() - start.getTime()) / (1000 * 60); // minutes\r\n return (duration / 1440) * 100;\r\n}\r\n\r\ngetBreakDurationWidth(breakItem: any): number {\r\n if (!breakItem.break_in_time || !breakItem.break_out_time) return 0;\r\n const start = new Date(breakItem.break_in_time);\r\n const end = new Date(breakItem.break_out_time);\r\n const duration = (end.getTime() - start.getTime()) / (1000 * 60); // minutes\r\n return (duration / 1440) * 100;\r\n}\r\n\r\n// Calendar View Methods\r\ngetCurrentMonthYear(): string {\r\n const now = new Date();\r\n return now.toLocaleDateString('en-US', { year: 'numeric', month: 'long' });\r\n}\r\n\r\ngetCalendarWeeks(): any[][] {\r\n const now = new Date();\r\n const firstDay = new Date(now.getFullYear(), now.getMonth(), 1);\r\n const lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0);\r\n const weeks = [];\r\n\r\n let currentWeek = [];\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - firstDay.getDay()); // Start from Sunday\r\n\r\n for (let i = 0; i < 42; i++) { // 6 weeks * 7 days\r\n const day = new Date(startDate);\r\n day.setDate(startDate.getDate() + i);\r\n\r\n currentWeek.push({\r\n date: day.getDate(),\r\n dateObj: day,\r\n isCurrentMonth: day.getMonth() === now.getMonth(),\r\n isToday: day.toDateString() === new Date().toDateString()\r\n });\r\n\r\n if (currentWeek.length === 7) {\r\n weeks.push(currentWeek);\r\n currentWeek = [];\r\n }\r\n }\r\n\r\n return weeks;\r\n}\r\n\r\ngetEntriesForDate(date: Date): any[] {\r\n return this.dataSet.filter(row => {\r\n const rowDate = new Date(row.attendanceDate);\r\n return rowDate.toDateString() === date.toDateString();\r\n });\r\n}\r\n\r\ngetEntryColor(entry: any): string {\r\n // Color based on attendance status\r\n switch (entry.attendanceStatus?.toLowerCase()) {\r\n case 'present': return '#28a745';\r\n case 'absent': return '#dc3545';\r\n case 'late': return '#ffc107';\r\n default: return '#007bff';\r\n }\r\n}\r\n\r\ngetEntryTooltip(entry: any): string {\r\n return `${entry.User?.full_name || entry.full_name}: ${entry.clock_in_time} - ${entry.clock_out_time}`;\r\n}\r\n\r\ngetEntryTime(entry: any): string {\r\n if (entry.clock_in_time) {\r\n return new Date(entry.clock_in_time).toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'});\r\n }\r\n return '--:--';\r\n}\r\n\r\n// Card View Methods\r\ncalculateTotalHours(row: any): string {\r\n if (!row.clock_in_time || !row.clock_out_time) return '0h 0m';\r\n\r\n const start = new Date(row.clock_in_time);\r\n const end = new Date(row.clock_out_time);\r\n const diffMs = end.getTime() - start.getTime();\r\n const diffMins = Math.floor(diffMs / (1000 * 60));\r\n\r\n // Subtract break time\r\n const breakMins = (row.breaks || []).reduce((sum: number, b: any) => sum + (b.break_duration || 0), 0);\r\n const totalMins = diffMins - breakMins;\r\n\r\n const hours = Math.floor(totalMins / 60);\r\n const minutes = totalMins % 60;\r\n\r\n return `${hours}h ${minutes}m`;\r\n}\r\n\r\ngetAvatarColor(name: string): string {\r\n if (!name) return '#6c757d';\r\n const colors = ['#007bff', '#28a745', '#dc3545', '#ffc107', '#17a2b8', '#6f42c1', '#e83e8c', '#fd7e14'];\r\n const index = name.length % colors.length;\r\n return colors[index];\r\n}\r\n\r\ngetInitialss(name: string): string {\r\n if (!name) return 'NA';\r\n const parts = name.trim().split(' ');\r\n return parts[0][0] + (parts[1]?.[0] || '').toUpperCase();\r\n}\r\n\r\ngetStatusBadgeClass(status: string): string {\r\n const transformed = this.transformStatus(status)?.toLowerCase();\r\n switch (transformed) {\r\n case 'clocked in':\r\n return 'badge-success';\r\n case 'absent':\r\n return 'badge-danger';\r\n case 'on leave':\r\n return 'badge-warning';\r\n case 'holiday':\r\n return 'badge-info';\r\n case 'clocked out':\r\n return 'badge-secondary';\r\n default:\r\n return 'badge-secondary';\r\n }\r\n}\r\n\r\ngetAttendanceStatusBadgeClass(status: string): string {\r\n const transformed = this.transformStatus(status)?.toLowerCase();\r\n switch (transformed) {\r\n case 'absent':\r\n return 'badge-danger';\r\n case 'block':\r\n return 'badge-secondary';\r\n case 'early in':\r\n return 'badge-warning';\r\n case 'late out':\r\n return 'badge-warning';\r\n case 'early out':\r\n return 'badge-warning';\r\n case 'lateness':\r\n return 'badge-warning';\r\n case 'leave':\r\n return 'badge-secondary';\r\n case 'on short leave':\r\n return 'badge-info';\r\n case 'miss punch out':\r\n return 'badge-danger';\r\n case 'on time out':\r\n return 'badge-success';\r\n case 'public holiday':\r\n return 'badge-info';\r\n default:\r\n return 'badge-secondary';\r\n }\r\n}\r\n\r\n// Heatmap View Methods\r\ngetHeatmapMonths(): string[] {\r\n const months = [];\r\n const now = new Date();\r\n for (let i = 11; i >= 0; i--) {\r\n const date = new Date(now.getFullYear(), now.getMonth() - i, 1);\r\n months.push(date.toLocaleDateString('en-US', { month: 'short' }));\r\n }\r\n return months;\r\n}\r\n\r\ngetHeatmapWeeks(): any[][] {\r\n const weeks = [];\r\n const now = new Date();\r\n const startDate = new Date(now.getFullYear(), now.getMonth() - 11, 1);\r\n\r\n for (let week = 0; week < 53; week++) {\r\n const weekData = [];\r\n for (let day = 0; day < 7; day++) {\r\n const date = new Date(startDate);\r\n date.setDate(startDate.getDate() + (week * 7) + day);\r\n\r\n const activity = this.getActivityForDate(date);\r\n weekData.push({\r\n date: date,\r\n activity: activity,\r\n tooltip: `${date.toDateString()}: ${activity} hours`\r\n });\r\n }\r\n weeks.push(weekData);\r\n }\r\n\r\n return weeks;\r\n}\r\n\r\ngetActivityForDate(date: Date): number {\r\n const entries = this.dataSet.filter(row => {\r\n const rowDate = new Date(row.attendanceDate);\r\n return rowDate.toDateString() === date.toDateString();\r\n });\r\n\r\n return entries.reduce((total, entry) => {\r\n if (entry.clock_in_time && entry.clock_out_time) {\r\n const start = new Date(entry.clock_in_time);\r\n const end = new Date(entry.clock_out_time);\r\n const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);\r\n return total + hours;\r\n }\r\n return total;\r\n }, 0);\r\n}\r\n\r\ngetHeatmapColor(activity: number): string {\r\n if (activity === 0) return '#ebedf0';\r\n if (activity < 4) return '#9be9a8';\r\n if (activity < 6) return '#40c463';\r\n if (activity < 8) return '#30a14e';\r\n return '#216e39';\r\n}\r\n\r\ngetHeatmapTooltip(day: any): string {\r\n return `${day.date.toDateString()}: ${day.activity.toFixed(1)} hours`;\r\n}\r\n\r\n// isShortLeavePopoverVisible = false;\r\n// currentShortLeaveData: any[] = [];\r\n// shortLeaveTooltipPosition = { x: 0, y: 0 };\r\n\r\n// showShortLeavePopover(event: MouseEvent, detailRow: any) {\r\n// if (detailRow.short_leave && detailRow.short_leave.length > 0) {\r\n// this.currentShortLeaveData = detailRow.short_leave;\r\n// this.isShortLeavePopoverVisible = true;\r\n// this.shortLeaveTooltipPosition = { x: event.clientX, y: event.clientY };\r\n// }\r\n// event.stopPropagation();\r\n// }\r\n\r\n\r\n\r\n// shortLeaveTooltipPosition = { x: 0, y: 0 };\r\n\r\n// showShortLeavePopover(event: MouseEvent, row: any) {\r\n// this.isShortLeavePopoverVisible = true;\r\n// this.currentShortLeaveRow = row;\r\n// this.shortLeaveTooltipPosition = {\r\n// x: event.clientX,\r\n// y: event.clientY\r\n// };\r\n// event.stopPropagation();\r\n// }\r\n\r\n\r\nformatDate(date: any): string {\r\n if (!date) return '';\r\n return this.datePipe.transform(date, this.prefs.dateFormat, this.prefs.timeZone) || '';\r\n}\r\n\r\ngetTimeValue(value: any): string {\r\n if (!value || value === '-') return '';\r\n\r\n // If object from backend { value: '09:00' }\r\n if (value?.value) return value.value;\r\n\r\n // If object { name: '09:00' }\r\n if (value?.name) return value.name;\r\n\r\n // If datetime like \"2025-11-20T09:00:00Z\"\r\n if (typeof value === 'string' && value.includes('T')) {\r\n return value.split('T')[1].substring(0, 5); // => \"09:00\"\r\n }\r\n\r\n // If plain time \"09:00\"\r\n return value;\r\n}\r\n\r\nformatTime(value: any): string {\r\n if (!value) return '-';\r\n\r\n value = this.getTimeValue(value); // normalize first\r\n\r\n // If getTimeValue returned empty, return dash\r\n if (!value) return '-';\r\n\r\n // When plain \"09:00\" → convert to valid date\r\n if (/^\\d{2}:\\d{2}$/.test(value)) {\r\n value = `1970-01-01T${value}:00Z`; // UTC safe\r\n }\r\n\r\n return this.datePipe.transform(value, this.prefs.timeFormat, this.prefs.timeZone) || '-';\r\n}\r\n\r\n\r\n\r\n\r\n// Tooltip state for Short Leave\r\n// showShortLeaveTooltipModal: boolean = false;\r\n// shortLeaveTooltipPosition = { x: 0, y: 0 };\r\n// currentShortLeaveData: any[] = [];\r\n// shortLeaveTooltipMoused: boolean = false;\r\n\r\nshowShortLeaveTooltip(event: MouseEvent, row: any) {\r\n if (row?.short_leave?.length > 0) {\r\n this.currentShortLeaveData = row?.short_leave;\r\n this.shortLeaveTooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n this.shortLeaveTooltipMoused = true;\r\n this.showShortLeaveTooltipModal = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n\r\nhideShortLeaveTooltip() {\r\n this.shortLeaveTooltipMoused = false;\r\n setTimeout(() => {\r\n if (!this.shortLeaveTooltipMoused) {\r\n this.showShortLeaveTooltipModal = false;\r\n this.currentShortLeaveData = [];\r\n this.cdr.markForCheck();\r\n }\r\n }, 500);\r\n}\r\n\r\npreventShortLeaveTooltipHide() {\r\n this.shortLeaveTooltipMoused = true;\r\n}\r\n\r\nonDetailBadgeOverflowCountClick(col: any, detailRow: any, badgeComponent?: any) {\r\n if (col?.field === 'breaks') {\r\n const currentWidth = col.width || 200;\r\n const newWidth = Math.min(currentWidth + 100, 500);\r\n col.width = newWidth;\r\n\r\n this.cdr.detectChanges();\r\n\r\n // Wait for DOM to apply new width, then refresh badge component\r\n setTimeout(() => {\r\n if (badgeComponent && typeof badgeComponent.refresh === 'function') {\r\n badgeComponent.refresh();\r\n }\r\n }, 50); // 50ms is enough for layout to settle\r\n }\r\n}\r\n\r\n// In badge-overflow.component.ts\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// }\r\n\r\n\r\n\r\n\r\n","<div class=\"position-relative h-100\">\r\n <!-- <h1>abu </h1> -->\r\n <div\r\n class=\"d-flex justify-content-between mb-3 align-items-center position-relative\"\r\n >\r\n <div class=\"col-4 global-search position-relative\">\r\n\r\n <span\r\n\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n style=\"height: 36px\"\r\n class=\"form-control\"\r\n placeholder=\"Search all columns and press Enter\"\r\n [(ngModel)]=\"tableSearch\"\r\n (keydown.enter)=\"onGlobalSearch()\"\r\n\r\n />\r\n <span\r\n *ngIf=\"tableSearch\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"data-grid-svg-icon position-absolute end-0 top-50 translate-middle-y me-2 cursor-pointer\"\r\n (click)=\"onSearchReset()\"\r\n title=\"Clear search\"\r\n ></span>\r\n\r\n </div>\r\n\r\n <!-- Date Picker Buttons -->\r\n <!-- Date Picker Section - Improved Version -->\r\n<div class=\"position-relative d-flex justify-content-center align-items-center ms-2 date-range-container\">\r\n\r\n <!-- Hidden Date Picker Input -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n bsDaterangepicker\r\n #picker=\"bsDaterangepicker\"\r\n [(ngModel)]=\"bsRangeValue\"\r\n [bsConfig]=\"bsConfig\"\r\n (bsValueChange)=\"onRangeSelected($event, picker)\"\r\n style=\"opacity: 0; width: 0; height: 0; position: absolute;\"\r\n />\r\n\r\n <!-- Left Arrow Button -->\r\n <span\r\n class=\"text-primary cursor-pointer me-2 date-range-btn arrow-btn\"\r\n (click)=\"navigateDate('left')\"\r\n title=\"Previous Date Range\"\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0\"\r\n >\r\n <span class=\"bi bi-chevron-left\"></span>\r\n </span>\r\n\r\n <!-- Date Range Label -->\r\n <span\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0\"\r\n class=\"text-primary date-range-label cursor-pointer\"\r\n (click)=\"togglePicker(picker)\"\r\n title=\"Click to open calendar\"\r\n >\r\n {{ formatDate(bsRangeValue[0]) }} - {{ formatDate(bsRangeValue[1]) }}\r\n </span>\r\n\r\n <!-- Right Arrow Button -->\r\n <span\r\n class=\"text-primary cursor-pointer ms-2 date-range-btn arrow-btn\"\r\n (click)=\"navigateDate('right')\"\r\n title=\"Next Date Range\"\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0\"\r\n >\r\n <span class=\"bi bi-chevron-right\"></span>\r\n </span>\r\n\r\n\r\n\r\n</div>\r\n\r\n <div class=\"d-flex gap-2 align-items-center table-right-top-actions\">\r\n\r\n <!-- Pivot Mode Button -->\r\n <!-- <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 header-icon\"\r\n (click)=\"togglePivotMode()\"\r\n [class.active]=\"pivotMode\"\r\n title=\"Toggle Pivot Mode\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pivot.svg'\"\r\n class=\"svg-icon svg-icon-2\"\r\n ></span>\r\n </a> -->\r\n\r\n <div class=\"action-buttons-row d-flex\">\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n (click)=\"togglePicker(picker)\"\r\n title=\"Select Date Range\"\r\n >\r\n <span class=\"bi bi-calendar3 text-primary\"></span>\r\n <span class=\"label-hidden text-white\">Calendar</span>\r\n </a>\r\n <button\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0 && !isDefaultDateRange\"\r\n type=\"button\"\r\n class=\"button button-small btn btn-active-danger border border-danger me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n (click)=\"clearDateRange()\"\r\n title=\"Clear Date Range\"\r\n >\r\n <span class=\"bi bi-x-circle text-danger\"></span>\r\n <span class=\"label-hidden text-white\">Clear</span>\r\n </button>\r\n</div>\r\n<ng-container *ngFor=\"let button of buttons\">\r\n <div\r\n class=\"action-buttons-row\"\r\n *ngIf=\"getButtonPermission(button) && (!button.condition || (button.condition === '!isSingleDay' && !isSingleDay) || (button.condition === 'isSingleDay' && isSingleDay))\"\r\n >\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n (click)=\"onActionButtonClick(button.name)\"\r\n class=\"button\"\r\n [title]=\"button.name\"\r\n >\r\n <span\r\n *ngIf=\"button.is_showIcon\"\r\n [inlineSVG]=\"button.iconPath\"\r\n class=\"svg-icon\"\r\n ></span>\r\n <span\r\n class=\"label-hidden\"\r\n >{{ button.name }}</span\r\n >\r\n </a>\r\n </div>\r\n</ng-container>\r\n\r\n<!-- Calendar Button -->\r\n\r\n\r\n<!-- Existing filter, settings, etc. -->\r\n <div\r\n *ngIf=\"!showFilterRow\"\r\n class=\"cursor-pointer position-relative action-buttons-row\"\r\n (click)=\"toggleOpenFilter()\"\r\n [class.active]=\"showFilters\"\r\n >\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"svg-icon svg-icon-2\"\r\n ></span>\r\n <span class=\"label-hidden text-white\">Filters</span>\r\n </a>\r\n <span\r\n *ngIf=\"activeFilteredColumns?.length\"\r\n style=\"\r\n width: 7px;\r\n height: 7px;\r\n box-shadow: 0px 0px 3px #0022ff;\r\n background-color: rgb(0, 60, 255);\r\n position: absolute;\r\n right: 16px;\r\n top: 10px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"cursor-pointer d-none\"\r\n (click)=\"toggleActions('advance-filter')\"\r\n [class.active]=\"activeTopButton === 'advance-filter'\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/zoom-charge.svg'\"\r\n class=\"data-grid-svg-icon top-icon me-2\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"cursor-pointer action-buttons-row\"\r\n (click)=\"toggleActions('setting')\"\r\n [class.active]=\"\r\n activeTopButton === 'setting' ||\r\n activeTopButton === 'table-layout' ||\r\n activeTopButton === 'table-presets' ||\r\n activeTopButton === 'show-hide-columns'\r\n \"\r\n >\r\n <!-- <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settings-2.svg'\"\r\n class=\"data-grid-svg-icon top-icon me-2\"\r\n ></span> -->\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settings-2.svg'\"\r\n class=\"svg-icon svg-icon-2\"\r\n ></span>\r\n <span class=\"label-hidden text-white\">Setting</span>\r\n </a>\r\n\r\n <div\r\n *ngIf=\"activeTopButton === 'setting'\"\r\n class=\"actions-dropdown mt-1 actions-dropdown-setting\"\r\n style=\"position: absolute\"\r\n >\r\n <div class=\"dropdown-menu show shadow custom-menu\">\r\n <!-- Table Layout -->\r\n <a\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n (click)=\"$event.stopPropagation(); toggleActions('table-layout')\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/table-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Layout</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n <!-- Table Presets -->\r\n <a\r\n (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/list-details.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Presets</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n\r\n <!-- Columns -->\r\n <a\r\n *ngIf=\"!showSideMenu\"\r\n (click)=\"\r\n $event.stopPropagation(); toggleActions('show-hide-columns')\r\n \"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Columns</span\r\n >\r\n <div class=\"d-flex gap-2\">\r\n <span class=\"muted-text\">{{ columnsCount }}</span>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"dropdown-divider\"></div>\r\n\r\n <!-- Filter -->\r\n <a\r\n class=\"dropdown-item cursor-pointer\"\r\n (click)=\"toggleOpenFilter(); activeTopButton = ''\"\r\n *ngIf=\"!showFilterRow\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2 mt-1 cursor-pointer\"\r\n ></span>\r\n Filter\r\n </a>\r\n\r\n <!-- Download -->\r\n <a\r\n class=\"dropdown-item cursor-pointer\"\r\n (click)=\"downloadCsv('csv')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/download.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span>\r\n CSV Export\r\n </a>\r\n <a\r\n *ngIf=\"enableExport\"\r\n class=\"dropdown-item cursor-pointer\"\r\n (click)=\"downloadCsv('xlsx')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/download.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span>\r\n Excel Export\r\n </a>\r\n <!-- Font Family & Font Size -->\r\n <div class=\"px-2 pb-2 pt-2\">\r\n <div class=\"d-flex gap-2\">\r\n <!-- Font Family -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"fontFaimly\"\r\n (change)=\"onFontChange()\"\r\n >\r\n <option *ngFor=\"let font of fontFamilies\" [value]=\"font\">\r\n {{ font }}\r\n </option>\r\n </select>\r\n\r\n <!-- Font Size -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n (change)=\"onFontChange()\"\r\n [(ngModel)]=\"bodyTextFontsSize\"\r\n >\r\n <option *ngFor=\"let size of fontSizes\" [value]=\"size\">\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Table Layout -->\r\n\r\n <ng-container *ngIf=\"activeTopButton === 'table-layout'\">\r\n <div\r\n *ngTemplateOutlet=\"tableLayout\"\r\n class=\"actions-dropdown mt-1\"\r\n style=\"position: absolute\"\r\n ></div>\r\n </ng-container>\r\n\r\n <!-- Table Presets -->\r\n <ng-container *ngIf=\"activeTopButton === 'table-presets'\">\r\n <div\r\n *ngTemplateOutlet=\"tablePreset\"\r\n class=\"actions-dropdown mt-1\"\r\n style=\"position: absolute\"\r\n ></div>\r\n </ng-container>\r\n\r\n <!-- Table Presets -->\r\n <ng-container *ngIf=\"activeTopButton === 'show-hide-columns'\">\r\n <div\r\n *ngTemplateOutlet=\"showHideColumns\"\r\n class=\"actions-dropdown mt-1\"\r\n style=\"position: absolute\"\r\n ></div>\r\n </ng-container>\r\n </div>\r\n <div>\r\n <!-- Example single danger button -->\r\n\r\n <!-- <button\r\n type=\"button\"\r\n class=\"btn btn-primary btn-sm d-flex gap-2 action-button\"\r\n (click)=\"toggleActions('actions')\"\r\n >\r\n Action\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/Vector.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <div\r\n *ngIf=\"activeTopButton === 'actions'\"\r\n class=\"actions-dropdown mt-1\"\r\n >\r\n <div class=\"dropdown-menu show\">\r\n <a class=\"dropdown-item\" href=\"#\">Action</a>\r\n <a class=\"dropdown-item\" href=\"#\">Another action</a>\r\n <a class=\"dropdown-item\" href=\"#\">Something else here</a>\r\n <div class=\"dropdown-divider\"></div>\r\n <a class=\"dropdown-item\" href=\"#\">Separated link</a>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"showFilters && !showFilterRow\"\r\n class=\"top-filter-row border-top py-2 d-flex justify-content-between align-items-center\"\r\n [style.height.px]=\"topFilterRowHeight\"\r\n >\r\n <!-- LEFT SIDE (Filter tags + Filter button) -->\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <ng-container *ngIf=\"activeFilteredColumns?.length\">\r\n <div\r\n *ngFor=\"let col of activeFilteredColumns; trackBy: trackByField\"\r\n class=\"filter-tags\"\r\n >\r\n <div\r\n (click)=\"\r\n isActiveFilterOpen = true;\r\n activeTopButton = 'filter-columns';\r\n openFilter(col)\r\n \"\r\n class=\"d-flex justify-content-center align-items-center muted-text add-filter-button active-filters\"\r\n style=\"white-space: nowrap\"\r\n [class.active]=\"\r\n col?.field == selectedColumnForFilter?.field &&\r\n isActiveFilterOpen &&\r\n activeTopButton == 'filter-columns'\r\n \"\r\n >\r\n <span class=\"header-tag mt-0 d-flex align-items-center\">\r\n <span\r\n *ngIf=\"col?.pinned\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n {{ col.header }}\r\n <span\r\n (click)=\"\r\n $event.stopPropagation(); removeColumnFilterFromColumn(col)\r\n \"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n \"\r\n class=\"data-grid-svg-icon cross-secondary ms-2 mb-1\"\r\n ></span>\r\n </span>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"\r\n activeTopButton === 'filter-columns' &&\r\n col?.field == selectedColumnForFilter?.field &&\r\n isActiveFilterOpen\r\n \"\r\n >\r\n <div\r\n *ngTemplateOutlet=\"filterColumns; context: { column: col }\"\r\n class=\"actions-dropdown mt-1\"\r\n ></div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Filter Button -->\r\n <div class=\"add-filter-button-menu\">\r\n <div\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n class=\"d-flex justify-content-center align-items-center muted-text add-filter-button button-filter\"\r\n style=\"width: 70px\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/plus.svg'\"\r\n class=\"me-2 data-grid-svg-icon\"\r\n ></span>\r\n Filter\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"activeTopButton === 'filter-columns' && !isActiveFilterOpen\"\r\n >\r\n <div\r\n *ngTemplateOutlet=\"filterColumns\"\r\n class=\"actions-dropdown mt-1\"\r\n ></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT SIDE (Update + Reset) -->\r\n <div class=\"d-flex gap-3 align-items-center\">\r\n <div\r\n (click)=\"savePreset()\"\r\n class=\"text-primary cursor-pointer all-filters-reset-button\"\r\n *ngIf=\"!checkFilterChangesEffect()\"\r\n >\r\n Update View\r\n </div>\r\n\r\n <div\r\n class=\"text-primary cursor-pointer all-filters-reset-button\"\r\n *ngIf=\"!tableFilterViewId && activeFilteredColumns?.length\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n Reset\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n [style.height]=\"\r\n showFilters ? 'calc(100% - ' + topFilterRowHeight + 'px)' : '100%'\r\n \"\r\n cdkDropListGroup\r\n class=\"data-grid-table-wrapper overflow-hidden\"\r\n #dataGridContainer\r\n [style.fontFamily]=\"fontFaimly\"\r\n >\r\n <div\r\n *ngIf=\"showRowsGrouping\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [cdkDropListData]=\"columns\"\r\n [style.backgroundColor]=\"\r\n topGroupedBadgesBackgroundColor || headerBackgroundColor\r\n \"\r\n cdkDropList\r\n (cdkDropListEntered)=\"enterToTopRowGrouping($event)\"\r\n (cdkDropListExited)=\"exitedFromTheTopRow($event)\"\r\n (cdkDropListDropped)=\"onDropTopGroup($event)\"\r\n [cdkDropListEnterPredicate]=\"canEnterToRowsGrouping\"\r\n id=\"rows-grouping-top-container\"\r\n class=\"border-below d-flex px-4 align-items-center\"\r\n >\r\n <div class=\"d-flex gap-2 align-items-center me-5\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <div *ngIf=\"!draggingInGroupArea && !groupedColumns?.length\">\r\n Drag here to set row groups\r\n </div>\r\n <ng-container\r\n *ngFor=\"\r\n let child of groupedColumns;\r\n let i = index;\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n groupedColumns.length > 1 && i != groupedColumns.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n\r\n\r\n</div>\r\n<div\r\n class=\"d-flex overflow-hidden\"\r\n [style.height]=\"\r\n 'calc(100% - ' +\r\n (showRowsGrouping\r\n ? headerRowHeight + footerRowHeight\r\n : footerRowHeight) +\r\n 'px)'\r\n \"\r\n>\r\n <div\r\n class=\"h-100\"\r\n [style.width]=\"\r\n !showSideMenu\r\n ? '100%'\r\n : sideMenuVisible\r\n ? 'calc(100% - 280px)'\r\n : 'calc(100% - 30px)'\r\n \"\r\n >\r\n <div class=\"h-100 transition position-relative w-100\">\r\n <!-- ##################################################################################################################################################################################### -->\r\n <!-- ##################################################################################################################################################################################### -->\r\n <!-- Data Grid Header starts here -->\r\n <!-- ##################################################################################################################################################################################### -->\r\n <!-- ##################################################################################################################################################################################### -->\r\n\r\n <div\r\n class=\"data-grid-header-wrapper w-100\"\r\n [style.color]=\"headerTextColor\"\r\n [style.fontSize.px]=\"headerTextFontsSize\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n [class.border-below]=\"!hasAnyVisibleColumn\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n >\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <!-- Data Grid Left Pinned Header starts here -->\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <div class=\"data-grid-header left-pinned\" #leftPinnedHeader>\r\n <div\r\n *ngIf=\"showSerialNumber\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell border-below\"\r\n [style.width.px]=\"65\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n ></div>\r\n <div\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell border-below\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [indeterminate]=\"isIndeterminateState(dataSet)\"\r\n [checked]=\"isAllSelected(dataSet)\"\r\n (change)=\"toggleSelectAll(dataSet)\"\r\n />\r\n </div>\r\n <div\r\n class=\"d-flex\"\r\n cdkDropList\r\n id=\"left-pinned-header\"\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"leftPinnedColumns\"\r\n (cdkDropListEntered)=\"onDropListEnter($event, 'left')\"\r\n (cdkDropListSorted)=\"\r\n onSortGroup($event, 'previewLeftPinnedColumns')\r\n \"\r\n (cdkDropListDropped)=\"onDropGroup()\"\r\n style=\"min-width: 0.2px\"\r\n [style.background-color]=\"headerBackgroundColor\"\r\n >\r\n <div\r\n class=\"dragable-header\"\r\n cdkDrag\r\n [cdkDragData]=\"col\"\r\n *ngFor=\"\r\n let col of leftPinnedColumns;\r\n let i = index;\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'previewLeftPinnedColumns'\r\n }\r\n \"\r\n ></ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: ''\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container\r\n *ngIf=\"col?.children?.length; else singleCol\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <!-- Data Grid Center Pinned Header starts here -->\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <div\r\n class=\"data-grid-header center-scrollable\"\r\n #centerPinnedHeader\r\n (scroll)=\"onCenterHeaderScroll($event)\"\r\n id=\"center-pinned-header\"\r\n cdkDropList\r\n [cdkDropListConnectedTo]=\"\r\n showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n \"\r\n [cdkDropListData]=\"centerColumns\"\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListSortingDisabled]=\"\r\n isDisableColumnGrouping && draggingInGroupArea\r\n \"\r\n (cdkDropListEntered)=\"onDropListEnter($event, 'center')\"\r\n (cdkDropListSorted)=\"onSortGroup($event, 'previewCenterColumns')\"\r\n (cdkDropListDropped)=\"onDropGroup()\"\r\n [style.maxWidth]=\"\r\n 'calc(100% - ' +\r\n (rightPinnedHeader.offsetWidth + leftPinnedHeader.offsetWidth) +\r\n 'px)'\r\n \"\r\n >\r\n <div\r\n *ngIf=\"groupedColumns?.length\"\r\n style=\"min-width: 200px\"\r\n class=\"h-100 align-items-center\"\r\n #columnsGroupedBox\r\n id=\"groupBoxHeaderDiv\"\r\n >\r\n <div\r\n class=\"d-flex w-100 justify-content-between align-items-center border-below\"\r\n [style.height.px]=\"\r\n showFilterRow ? headerRowHeight * 2 : headerRowHeight\r\n \"\r\n >\r\n <div class=\"ps-3\">Group</div>\r\n <div class=\"d-flex\">\r\n <div\r\n class=\"three-dots cursor-pointer\"\r\n (click)=\"openThreeDotsMenu($event, 'group')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div\r\n (mousedown)=\"onResizeGroupBox($event)\"\r\n class=\"resize-handle\"\r\n style=\"margin-right: -2px\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n [style.height.px]=\"headerRowHeight\"\r\n class=\"border-below\"\r\n ></div>\r\n </div>\r\n <!-- <span\r\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n style=\"min-width: 30px; height: 100%;\"\r\n *ngIf=\"gridType === 'TimeSheet' && !areDatesSelectedAndEqual\"\r\n >\r\n </span> -->\r\n <div\r\n class=\"dragable-header\"\r\n (cdkDragStarted)=\"\r\n checkColumnGroupingStatus(col); dragStartOnGroup(col)\r\n \"\r\n cdkDrag\r\n [cdkDragData]=\"col\"\r\n *ngFor=\"\r\n let col of centerColumns;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'previewCenterColumns'\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'centerColumns'\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container *ngIf=\"child?.is_groupable\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container *ngIf=\"col?.is_groupable\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"!areDatesSelectedAndEqual\" class=\"header-cell border-below\" [style.width.px]=\"30\" [style.height.px]=\"headerRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\"></div>\r\n </div>\r\n\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <!-- Data Grid Right Pinned Header starts here -->\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <div\r\n cdkDropList\r\n id=\"right-pinned-header\"\r\n [cdkDropListConnectedTo]=\"\r\n showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n \"\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"data-grid-header right-pinned\"\r\n (cdkDropListSorted)=\"\r\n onSortGroup($event, 'previewRightPinnedColumns')\r\n \"\r\n (cdkDropListEntered)=\"onDropListEnter($event, 'right')\"\r\n (cdkDropListDropped)=\"onDropGroup()\"\r\n #rightPinnedHeader\r\n class=\"right-pinned-header d-flex\"\r\n style=\"min-width: 0.2px\"\r\n >\r\n <div\r\n class=\"dragable-header\"\r\n cdkDrag\r\n [cdkDragData]=\"col\"\r\n *ngFor=\"\r\n let col of rightPinnedColumns;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n pinnedRight: true,\r\n index: i,\r\n section: 'previewRightPinnedColumns'\r\n }\r\n \"\r\n ></ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'centerColumns'\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!-- Data Grid Body starts here -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <div\r\n class=\"h-100 d-flex justify-content-center align-items-center\"\r\n *ngIf=\"!dataSet.length && !loading\"\r\n >\r\n No Record Found\r\n </div>\r\n\r\n <div\r\n class=\"position-absolute w-100 h-100 d-flex justify-content-center align-items-center loading-overlay\"\r\n *ngIf=\"loading\"\r\n style=\"\r\n z-index: 999;\r\n background: rgba(255, 255, 255, 0.8);\r\n backdrop-filter: blur(1px);\r\n \"\r\n >\r\n <div *ngIf=\"loadingMore && enableInfiniteScroll\" class=\"text-center p-2\" [style.height.px]=\"rowHeight\">\r\n <div class=\"spinner-border text-primary\" role=\"status\"></div> Loading more...\r\n</div>\r\n <div *ngIf=\"!(loadingMore && enableInfiniteScroll)\" class=\"text-center p-2\">\r\n <div class=\"spinner-border text-primary\" role=\"status\"></div> Loading...\r\n</div>\r\n </div>\r\n\r\n <!-- Card View -->\r\n \r\n\r\n <!-- Table View -->\r\n <div\r\n class=\"data-grid-body-wrapper position-relative d-flex\"\r\n [style.height]=\"bodyWrapperHeight\"\r\n style=\"overflow-y: auto; overflow-x: hidden\"\r\n #mainScroll\r\n (scroll)=\"onMainScroll($event)\"\r\n *ngIf=\"dataSet.length\"\r\n >\r\n <!-- LEFT PINNED -->\r\n <div [style.height.px]=\"!groupedColumns.length ? originalDataSet.length * rowHeight: 0\"></div>\r\n <div [class.h-100]=\"originalDataSet.length <= 10\">\r\n <div\r\n class=\"data-grid-body left-pinned-body w-100\"\r\n style=\"overflow-y: hidden\"\r\n [class.border-right]=\"hasLeftPinnedColumns\"\r\n [class.transparent-border-right]=\"!hasLeftPinnedColumns\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let row of visibleRows;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: row,\r\n columns: previewLeftPinnedColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n isLeft: true,\r\n section: 'left'\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- CENTER -->\r\n <div\r\n class=\"\"\r\n [style.width.px]=\"centerPinnedHeader.clientWidth\"\r\n >\r\n <div\r\n class=\"data-grid-body center-scrollable\"\r\n\r\n style=\"overflow-y: hidden; overflow-x: auto\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.backgroundColor]=\"bodyBackgroundColor\"\r\n #centerScrollableBody\r\n (scroll)=\"onCenterBodyScroll($event)\"\r\n [style.boxShadow]=\"leftPinnedBoxshadow\"\r\n\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let row of visibleRows;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: row,\r\n columns: previewCenterColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n section: 'center'\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT PINNED -->\r\n <div\r\n class=\"right-pinned-body-wrapper\"\r\n *ngIf=\"hasRightPinnedColumns\"\r\n [class.h-100]=\"originalDataSet.length <= 10\"\r\n [style.max-width.px]=\"isScrollbarVisible ? rightPinnedHeader.offsetWidth - 15: rightPinnedHeader.offsetWidth\"\r\n >\r\n <div\r\n class=\"data-grid-body right-pinned-body w-100\"\r\n style=\"overflow-y: hidden\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.boxShadow]=\"rightPinnedBoxshadow\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let row of visibleRows;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: row,\r\n columns: previewRightPinnedColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n section: 'right'\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Vertical Fake scroll Bar -->\r\n <div\r\n (scroll)=\"onMainFakeScroll($event)\"\r\n class=\"fake-scrollbar fake-scrollbar-vertical d-none\"\r\n [style.scrollbarWidth]=\"verticalScrollbarWidth\"\r\n [style.top.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n #fakeScroll\r\n [style.height]=\"bodyWrapperHeight\"\r\n style=\"\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n width: 17px;\r\n position: absolute;\r\n right: 0;\r\n background-color: f1f2f3;\r\n z-index: 10;\r\n \"\r\n >\r\n <div [style.height.px]=\"rowHeight * (paginationConfig.totalResults || flattenedData.length) + (hasMoreData ? 1000 : 0)\"></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Horizintal Fake Scrollbars -->\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"dataSet.length\">\r\n <div\r\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n class=\"fake-horizintal-scrollbar\"\r\n #fakeScroll\r\n [style.width.px]=\"leftPinnedHeader.offsetWidth\"\r\n style=\"overflow-x: scroll\"\r\n ></div>\r\n <div\r\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n (scroll)=\"onHorizintalFakeScroll($event)\"\r\n class=\"fake-horizintal-scrollbar\"\r\n #horizintalFakeScroll\r\n [style.width.px]=\"centerPinnedHeader.offsetWidth\"\r\n >\r\n <div [style.width.px]=\"centerPinnedHeader.scrollWidth\"></div>\r\n </div>\r\n <div\r\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n class=\"fake-horizintal-scrollbar\"\r\n #fakeScroll\r\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n style=\"overflow-x: scroll\"\r\n ></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Side Menu Implemented Here -->\r\n <div\r\n *ngIf=\"showSideMenu && !hasOpenAccordion\"\r\n [style.width.px]=\"sideMenuVisible ? 280 : 30\"\r\n class=\"right-menu h-100\"\r\n [style.backgroundColor]=\"sidemenuBackgroundColor\"\r\n >\r\n <div class=\"h-100 d-flex flex-row-reverse\">\r\n <div\r\n style=\"width: 30px\"\r\n class=\"d-flex flex-column align-items-center cursor-pointer\"\r\n [class.border-start]=\"sideMenuVisible\"\r\n >\r\n <div\r\n (click)=\"toggleSideMenu('cols')\"\r\n [class.bg-white]=\"\r\n currentOpenedSideMenue == 'cols' && sideMenuVisible\r\n \"\r\n [class.border-below]=\"sideMenuVisible\"\r\n class=\"columns-button d-flex flex-column align-items-center\"\r\n >\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div class=\"side-menue-text\">Columns</div>\r\n </div>\r\n\r\n <div\r\n (click)=\"toggleSideMenu('filtrs')\"\r\n [class.bg-white]=\"\r\n currentOpenedSideMenue == 'filtrs' && sideMenuVisible\r\n \"\r\n [class.border-below]=\"\r\n sideMenuVisible && currentOpenedSideMenue == 'filtrs'\r\n \"\r\n class=\"columns-button d-flex flex-column align-items-center\"\r\n >\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div class=\"side-menue-text\">Filter</div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"h-100\"\r\n *ngIf=\"sideMenuVisible\"\r\n [ngStyle]=\"{ width: sideMenuVisible ? '250px' : '' }\"\r\n >\r\n <div class=\"h-100\">\r\n <ng-container\r\n *ngIf=\"currentOpenedSideMenue == 'cols' && sideMenuVisible\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"columnPannel\"></ng-container>\r\n <!-- Column Items -->\r\n <div class=\"column-panel-body px-3\">\r\n <ng-container\r\n *ngFor=\"let col of columns; trackBy: trackByField\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n <hr />\r\n\r\n <div class=\"side-menu-row-groups\" style=\"height: 30%\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sideMenuRowGroups\"\r\n ></ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"currentOpenedSideMenue == 'filtrs' && sideMenuVisible\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sideFilters\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div [style.height.px]=\"footerRowHeight\" class=\"border-top\">\r\n <!-- Rows: <span class=\"fw-500 ms-1\">{{ dataSet.length }}</span> -->\r\n <div\r\n class=\"pagination-container\"\r\n [style.height.px]=\"footerRowHeight\"\r\n [style.padding.px]=\"footerPadding\"\r\n >\r\n <div class=\"page-size\">\r\n <select\r\n [(ngModel)]=\"paginationConfig.selectedPageSize\"\r\n (change)=\"onPageSizeChange()\"\r\n >\r\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">\r\n {{ size }}\r\n </option>\r\n </select>\r\n <span class=\"\"> per page </span>\r\n </div>\r\n\r\n <div class=\"page-info\">\r\n Results: {{ paginationConfig.page }}-{{\r\n paginationConfig.page * paginationConfig.limit\r\n }}\r\n of\r\n {{ paginationConfig.totalResults }}\r\n </div>\r\n\r\n <div class=\"page-buttons\">\r\n <button\r\n (click)=\"goToPage(paginationConfig.page - 1)\"\r\n [disabled]=\"paginationConfig.page === 1\"\r\n >\r\n ‹\r\n </button>\r\n\r\n <ng-container *ngFor=\"let page of visiblePages\">\r\n <button\r\n *ngIf=\"page !== '...'\"\r\n (click)=\"goToPage(page)\"\r\n [class.active]=\"page === paginationConfig.page\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span *ngIf=\"page === '...'\">...</span>\r\n </ng-container>\r\n\r\n <button\r\n (click)=\"goToPage(paginationConfig.page + 1)\"\r\n [disabled]=\"paginationConfig.page === paginationConfig.totalResults\"\r\n >\r\n ›\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- Header Cell Template -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n\r\n<ng-template\r\n #headerCell\r\n let-col\r\n let-pinnedRight=\"pinnedRight\"\r\n let-i=\"index\"\r\n let-sections=\"section\"\r\n let-calledFromNestedPlaceholder=\"calledFromNestedPlaceholder\"\r\n>\r\n <div>\r\n <!-- Group Header -->\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatHeader\">\r\n <div cdkDroplistGroup class=\"group-column-wrapper\">\r\n <!-- Parent Header -->\r\n <div\r\n *ngIf=\"shouldTheGroupHeaderShow(col)\"\r\n class=\"header-cell group-header\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.gridColumn]=\"'span ' + col.children.length\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n [class.justify-content-end]=\"pinnedRight\"\r\n style=\"grid-row: 1\"\r\n >\r\n <div\r\n class=\"group-header-content\"\r\n [title]=\"col.header\"\r\n [class.ms-2]=\"pinnedRight\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n <div\r\n class=\"resize-handle\"\r\n (dblclick)=\"autosizeColumn(col.children)\"\r\n (mousedown)=\"onResizeGroup($event, col, pinnedRight)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Child Headers and Filters -->\r\n\r\n <div\r\n class=\"d-flex\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"col.children\"\r\n (cdkDropListSorted)=\"onChildDroplistSorted($event, sections)\"\r\n (cdkDropListDropped)=\"onChildDroplistDroped($event)\"\r\n [cdkDropListSortingDisabled]=\"false\"\r\n [cdkDropListConnectedTo]=\"\r\n showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n \"\r\n >\r\n <div\r\n cdkDrag\r\n [cdkDragData]=\"child\"\r\n *ngFor=\"let child of col.children; let i = index\"\r\n >\r\n <!-- Child Header -->\r\n <ng-container *ngIf=\"child.is_visible && !child['isRowGrouped']\">\r\n <div\r\n cdkDragHandle\r\n class=\"header-cell one-row-header-cells cursor-pointer\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [attr.field]=\"child.field\"\r\n [style.width.px]=\"child.width\"\r\n [style.min-width.px]=\"child.width\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n style=\"grid-row: 2\"\r\n [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(child)\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between h-100 align-items-center w-100\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between w-100\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\r\n [title]=\"col.header\"\r\n [class.w-100]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100\"\r\n [class.editable-header]=\"child?.is_editable\"\r\n (click)=\"openThreeDotsMenu($event, child); openFilteronThreeDotsClick(child)\"\r\n >\r\n {{ child.header }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"position-relative d-flex\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n [class.me-2]=\"pinnedRight\"\r\n class=\"d-flex align-items-center\"\r\n *ngIf=\"child.pinned\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"three-dots p-1\"\r\n (click)=\"openThreeDotsMenu($event, child)\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n\r\n <!-- Only show menu if this column is active -->\r\n <div\r\n class=\"position-absolute\"\r\n *ngIf=\"activeCol === child\"\r\n style=\"top: -50%; z-index: 21\"\r\n [style.left.px]=\"\r\n -(!child?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n columnMenu;\r\n context: { col: child }\r\n \"\r\n ></ng-container>\r\n </div>\r\n\r\n <div\r\n class=\"resize-handle\"\r\n (dblclick)=\"autosizeColumn(child)\"\r\n (mousedown)=\"onResizeColumn($event, child)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Filter Cell -->\r\n <div\r\n *ngIf=\"showFilterRow\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n class=\"header-cell filter-cell\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [attr.field]=\"child.field\"\r\n [style.width.px]=\"child.width\"\r\n [style.min-width.px]=\"child.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n style=\"grid-row: 3\"\r\n >\r\n <div\r\n class=\"header-cell filter-cell\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (ngModelChange)=\"onFilterChange(col)\"\r\n />\r\n <span\r\n class=\"filter-icon-wrapper\"\r\n (click)=\"$event.stopPropagation(); openFilter(child)\"\r\n [class.filter-applied]=\"isFilterAppliedOnColumn(child)\"\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span\r\n *ngIf=\"isFilterAppliedOnColumn(child)\"\r\n style=\"\r\n width: 7px;\r\n height: 7px;\r\n box-shadow: 0px 0px 3px #7486ff;\r\n background-color: rgb(0 163 233);\r\n position: absolute;\r\n right: 4px;\r\n top: 12px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span\r\n ></span>\r\n\r\n <div\r\n class=\"position-absolute filter-row-filter-wrapper\"\r\n *ngIf=\"activeFilterCell?.field == child?.field\"\r\n style=\"top: 100%; right: 0; z-index: 99\"\r\n [style.left.px]=\"\r\n child?.pinned ? 0 : -centerPinnedHeader.scrollLeft\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"filterMenu; context: { col: child }\"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div\r\n *ngIf=\"\r\n !draggingInGroupArea ||\r\n (child.is_groupable && draggingInGroupArea)\r\n \"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div *ngIf=\"draggingInGroupArea && !child.is_groupable\">\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/ban.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ child.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\" class=\"position-relative\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n childHeaderPlaceholder;\r\n context: {\r\n $implicit: child,\r\n index: i,\r\n sections: sections,\r\n calledFromNestedPlaceholder: true,\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea && child?.is_groupable\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron: false,\r\n pinnedRight: pinnedRight,\r\n sections: sections,\r\n index: i\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Flat Header || Single Header Cell-->\r\n <ng-template #flatHeader>\r\n <div class=\"group-column-wrapper\">\r\n <!-- Full-height Header Cell (spans 2 rows visually) -->\r\n <div\r\n class=\"header-cell one-row-header-cells\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.min-height.px]=\"\r\n showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\r\n \"\r\n [style.height.px]=\"\r\n showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\r\n \"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n style=\"grid-row: 1 / span 2\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between h-100 align-items-center w-100\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between w-100\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\r\n [title]=\"col.header\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 cursor-pointer\"\r\n [class.editable-header]=\"col?.is_editable\"\r\n [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(col)\"\r\n (click)=\"openThreeDotsMenu($event, col); openFilteronThreeDotsClick(col)\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"position-relative d-flex\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n [class.me-2]=\"pinnedRight\"\r\n class=\"d-flex align-items-center\"\r\n *ngIf=\"col?.pinned\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div\r\n [class.me-2]=\"col.order_by\"\r\n class=\"d-flex align-items-center\"\r\n *ngIf=\"sortingConfig?.field == col.field\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n (sortingConfig?.order_by == 'desc'\r\n ? 'data-grid/icons/sort-desc.svg'\r\n : 'data-grid/icons/sort-asc.svg')\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center mt-1\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"three-dots p-1\"\r\n (click)=\"openThreeDotsMenu($event, col)\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n\r\n <!-- Only show menu if this column is active -->\r\n <div\r\n class=\"position-absolute\"\r\n *ngIf=\"activeCol === col\"\r\n style=\"top: -50%; z-index: 21\"\r\n [style.left.px]=\"\r\n -(!col?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnMenu; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n\r\n <div\r\n class=\"resize-handle\"\r\n [class.w-100]=\"col.pinned == 'right'\"\r\n (dblclick)=\"autosizeColumn(col)\"\r\n (mousedown)=\"onResizeColumn($event, col)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Filter Cell -->\r\n <div\r\n *ngIf=\"showFilterRow\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n class=\"header-cell filter-cell\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (ngModelChange)=\"onFilterChange(col)\"\r\n />\r\n <span\r\n class=\"filter-icon-wrapper\"\r\n (click)=\"$event.stopPropagation(); openFilter(col)\"\r\n [class.filter-applied]=\"isFilterAppliedOnColumn(col)\"\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span\r\n *ngIf=\"isFilterAppliedOnColumn(col)\"\r\n style=\"\r\n width: 7px;\r\n height: 7px;\r\n box-shadow: 0px 0px 3px #7486ff;\r\n background-color: rgb(0 163 233);\r\n position: absolute;\r\n right: 4px;\r\n top: 12px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span\r\n ></span>\r\n\r\n <div\r\n class=\"position-absolute filter-row-filter-wrapper\"\r\n *ngIf=\"activeFilterCell === col\"\r\n style=\"top: 100%; right: 0; z-index: 99\"\r\n [style.left.px]=\"col?.pinned ? 0 : -centerPinnedHeader.scrollLeft\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- Body Cell Template -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n<ng-template\r\n #rowCell\r\n let-row\r\n let-columns=\"columns\"\r\n let-isEven=\"isEven\"\r\n let-isOdd=\"isOdd\"\r\n let-isLeftSection=\"isLeft\"\r\n let-section=\"section\"\r\n let-rowIndex=\"rowIndex\"\r\n>\r\n <!-- Check if row is a group -->\r\n <ng-container\r\n *ngTemplateOutlet=\"groupRowTemplate; context: { $implicit: row, depth: 0 }\"\r\n ></ng-container>\r\n <ng-template #groupRowTemplate let-row let-depth=\"depth\">\r\n <ng-container *ngIf=\"row.isGroup; else regularRow\">\r\n <!-- Group Header -->\r\n <div\r\n class=\"group-header-row border-below d-flex align-items-center\"\r\n [style.height.px]=\"rowHeight\"\r\n [style.width]=\"\r\n section == 'center'\r\n ? centerScrollableBody!.nativeElement?.scrollWidth + 'px'\r\n : '100%'\r\n \"\r\n >\r\n <div\r\n *ngIf=\"section == 'left'\"\r\n class=\"h-100 d-flex\"\r\n [style.width.px]=\"leftPinnedHeader.offsetWidth - 1\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n >\r\n <div\r\n *ngIf=\"showSerialNumber\"\r\n style=\"width: 50px\"\r\n class=\"d-flex align-items-center h-100 border-right justify-content-end pe-2 s-no\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n [style.width.px]=\"65\"\r\n [style.cursor]=\"\r\n 'url(' +\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrow-right.svg), auto'\r\n \"\r\n (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\r\n (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\r\n >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\r\n style=\"width: 50px\"\r\n class=\"d-flex align-items-center justify-content-center h-100 border-right\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.left-selection-border]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n \"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <input style=\"width: 16px; height: 16px\" type=\"checkbox\" />\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'center'\"\r\n [style.width.px]=\"centerPinnedHeader.scrollWidth\"\r\n class=\"d-flex align-items-center ps-2 h-100\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <div\r\n class=\"d-flex align-items-center justify-content-between\"\r\n [style.paddingLeft.px]=\"depth > 0 ? depth * 16 : 0\"\r\n >\r\n <span class=\"me-2 filter-icon-wrapper\" (click)=\"toggleExpand(row)\">\r\n <span\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n <strong (click)=\"toggleExpand(row)\" class=\"cursor-pointer\">\r\n {{ row.groupValue }} ({{ countLeafRows(row) }})\r\n </strong>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'right'\"\r\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n ></div>\r\n </div>\r\n\r\n <!-- Recursive Children -->\r\n <div class=\"group-children\" *ngIf=\"row.isExpand\">\r\n <ng-container\r\n *ngFor=\"let child of row.children; let i = index; trackBy: trackById\"\r\n >\r\n <ng-container *ngIf=\"child.isGroup; else dataRow\">\r\n <!-- Recursive call for nested group -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n groupRowTemplate;\r\n context: { $implicit: child, depth: depth + 1 }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #dataRow>\r\n <!-- Regular data row -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: child,\r\n columns: columns,\r\n isEven: i % 2 === 0,\r\n isOdd: i % 2 !== 0,\r\n isLeft: isLeftSection,\r\n section: section\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Regular row (not a group) -->\r\n <ng-template #regularRow>\r\n <div class=\"d-flex\" [style.height.px]=\"rowHeight\">\r\n <span\r\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n style=\"min-width: 30px; height: 100%;\"\r\n *ngIf=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'start' && !areDatesSelectedAndEqual\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n <div\r\n [style.min-width.px]=\"\r\n section == 'center' && groupedColumns!.length ? groupBoxPadding : 0\r\n \"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n (contextmenu)=\"onRightClick($event, row, row?.details?.data?.length ? 'accordion-parent' : 'main')\"\r\n [style.height.px]=\"rowHeight\"\r\n class=\"data-grid-row h-100\"\r\n [class.even-row]=\"isEven\"\r\n [class.odd-row]=\"isOdd\"\r\n [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\r\n (mouseenter)=\"onRowHover(row)\"\r\n (mouseleave)=\"onRowLeave()\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n ></div>\r\n <div\r\n (contextmenu)=\"onRightClick($event, row, row?.details?.data?.length ? 'accordion-parent' : 'main')\"\r\n [style.height.px]=\"rowHeight\"\r\n class=\"data-grid-row\"\r\n [class.even-row]=\"isEven\"\r\n [class.odd-row]=\"isOdd\"\r\n [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\r\n (mouseenter)=\"onRowHover(row)\"\r\n (mouseleave)=\"onRowLeave()\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <div\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell justify-content-end pe-2 s-no\"\r\n [style.width.px]=\"65\"\r\n *ngIf=\"isLeftSection && showSerialNumber\"\r\n [style.cursor]=\"\r\n 'url(' +\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrow-right.svg), auto'\r\n \"\r\n (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\r\n (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\r\n >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\r\n [style.backgroundColor]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n ? selectedRowsBackgroundColor\r\n : checkboxesBackgroundColor\r\n \"\r\n class=\"select-all-checkbox-cell\"\r\n *ngIf=\"isLeftSection\"\r\n [class.left-selection-border]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n \"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [checked]=\"isRowSelected(row)\"\r\n (change)=\"toggleRowSelection(row)\"\r\n />\r\n </div>\r\n\r\n <!-- Render all columns -->\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns;\r\n trackBy: trackByField;\r\n let colIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatColumn\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n trackBy: trackByField;\r\n let subColIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"child?.is_visible && !child?.isRowGrouped\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellTemplate;\r\n context: {\r\n col: child,\r\n row: row,\r\n rowIndex: rowIndex,\r\n colIndex: colIndex,\r\n subColIndex: subColIndex,\r\n section: section\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #flatColumn>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellTemplate;\r\n context: {\r\n col: col,\r\n row: row,\r\n rowIndex: rowIndex,\r\n colIndex: colIndex,\r\n subColIndex: null,\r\n section: section\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <span\r\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n style=\"min-width: 30px; height: 100%;\"\r\n *ngIf=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'end' && !areDatesSelectedAndEqual\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n </div>\r\n <!-- LEFT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'left' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" [style.color]=\"headerTextColor\" style=\"max-height: 350px; min-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\" [class.show-shadow]=\"rowShadingEnabled\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\" [style.color]=\"headerTextColor\" [style.fontSize.px]=\"headerTextFontsSize\" [style.fontWeight]=\"headerFontWeight\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n<!-- CENTER SECTION: Actual details table -->\r\n\r\n<div *ngIf=\"section === 'center' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details-wrapper data-grid-accordion\" [style.fontFamily]=\"fontFaimly\" [style.fontSize.px]=\"bodyTextFontsSize\" style=\"display: flex; width: 100%; max-height: 350px; min-height: 350px; overflow: hidden;\">\r\n <!-- LEFT SECTION OF ACCORDION -->\r\n <div #leftContainer class=\"accordion-left-section data-pin-body-wrapper data-grid-accordion-section\" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailLeftScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-borders]=\"showVerticalBorder\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\" [style.color]=\"headerTextColor\" [style.fontSize.px]=\"headerTextFontsSize\" [style.fontWeight]=\"headerFontWeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4 border-right\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n <div class=\"resize-handles\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'left')\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n [style.fontSize.px]=\"nestedTablerowFontsize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n <!-- Use the same rendering logic as center section -->\r\n <ng-container [ngSwitch]=\"col.field\">\r\n\r\n <ng-container *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\">\r\n <ng-container *ngIf=\"d.manually_logs?.length > 0; else noManualLogsIcon\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon text-primary\"\r\n style=\"cursor: pointer; font-size: 16px;\"\r\n (mouseenter)=\"showManualLogsTooltip($event, row, d)\"\r\n (mouseleave)=\"hideManualLogsTooltip()\">\r\n </span>\r\n </ng-container>\r\n <ng-template #noManualLogsIcon>–</ng-template>\r\n</ng-container>\r\n <!-- Breaks -->\r\n <ng-container *ngSwitchCase=\"'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaksLeft\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(d[col.field])\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onDetailBadgeOverflowCountClick(col, d)\">\r\n</app-badge-overflow>\r\n </ng-container>\r\n <ng-template #noBreaksLeft>\r\n <div >\r\n -\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Breaks -->\r\n <ng-container *ngSwitchCase=\"'short_breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.duration; else noShortBreakLeft\">\r\n <div class=\"circle-value\"\r\n [ngClass]=\"(d[col.field].type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (d[col.field].type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (d[col.field].type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showShortBreakTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideShortBreakTooltip()\"\r\n (dblclick)=\"onShortBreakClick.emit(d)\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortBreakLeft>\r\n <div >-</div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Leave -->\r\n <!-- Short Leave -->\r\n<ng-container *ngSwitchCase=\"'short_leave'\">\r\n <ng-container *ngIf=\"row.short_leave && row.short_leave.length > 0; else noShortLeaveMain\">\r\n <div class=\"w-100 d-flex main-progress-bar justify-content-center align-items-center\" \r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, row)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <span class=\"d-block\" [style.min-width.%]=\"row.short_leave[0].short_leave_time_percentage\" \r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">\r\n {{ row.short_leave[0].short_leave_time_percentage }}%\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveMain>-</ng-template>\r\n</ng-container>\r\n\r\n<div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n <div *ngSwitchCase=\"'is_payroll_processed'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" >\r\n <span class=\"\" >\r\n {{ d.is_payroll_processed ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n\r\n <!-- Status -->\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noStatus\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noStatus>-</ng-template>\r\n</ng-container>\r\n\r\n<!-- Attendance Status -->\r\n<ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noAttendanceStatus\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noAttendanceStatus>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Default fallback -->\r\n <ng-container *ngSwitchDefault>\r\n {{ getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-' }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- CENTER SECTION OF ACCORDION (WITH VIRTUAL SCROLL) -->\r\n\r\n<div class=\"accordion-center-section data-grid-accordion-section\" style=\"flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden;\">\r\n <!-- Header Section -->\r\n <div class=\"header-container\" style=\"overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none;\" #headerContainer (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-borders]=\"showVerticalBorder\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: 100%;\">\r\n <thead>\r\n <tr\r\n [style.height.px]=\"nestedTableHeaderRowHeight\"\r\n cdkDropList\r\n [cdkDropListData]=\"row?.details.columns\"\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"dropColumn($event, row)\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let i = index\">\r\n <th\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n cdkDrag\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n [style.color]=\"headerTextColor\"\r\n [style.fontSize.px]=\"headerTextFontsSize\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n style=\"cursor: move; position: relative;\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span *ngIf=\"col.pinned\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\" class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span\r\n class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n </div>\r\n <div class=\"resize-handles\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\" [style.top.px]=\"nestedTableHeaderRowHeight\" [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n\r\n <!-- Group Badges (if any) -->\r\n <div *ngIf=\"row.details?.groupedColumns?.length\" class=\"detail-group-badges\">\r\n <span *ngFor=\"let g of row.details.groupedColumns; trackBy: trackByField\" class=\"badge bg-light text-dark me-1\">\r\n {{ g.header }}\r\n <span class=\"ms-1 cursor-pointer\" (click)=\"ungroupDetailColumn(g, row)\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"></span>\r\n </span>\r\n </div>\r\n\r\n <!-- Data Table Section with Virtual Scroll -->\r\n <cdk-virtual-scroll-viewport\r\n itemSize=\"{{ nestedTablerowHeight }}\"\r\n minBufferPx=\"200\"\r\n maxBufferPx=\"400\"\r\n class=\"detail-virtual-scroll\"\r\n [attr.data-detail-row-id]=\"row._id || row.id\"\r\n style=\"flex: 1; overflow: auto;\"\r\n #dataContainer\r\n (scroll)=\"syncVerticalScroll($event)\"\r\n (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-borders]=\"showVerticalBorder\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: 100%;\">\r\n <tbody>\r\n <tr\r\n class=\"cursor-pointer data-grid-accordion-row\"\r\n *cdkVirtualFor=\"let d of row.details.data; trackBy: trackById; let j = index\"\r\n (contextmenu)=\"onRightClick($event, d, 'accordion-child')\"\r\n [style.height.px]=\"nestedTablerowHeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let k = index\">\r\n <td\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, k, col.field, 'center')\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\"\r\n style=\"cursor: pointer; position: relative; overflow: visible; cursor: cell; \">\r\n <div class=\"time-sheet-container\" style=\"overflow: visible; display: flex; gap: 4px; align-items: center; height: 100%; justify-content: center;\">\r\n <ng-container *ngIf=\"col.field === 'breaks' || col.field === 'short_breaks'; else defaultDetailCell\">\r\n <ng-container *ngIf=\"col.field === 'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaks\">\r\n <span *ngFor=\"let breakItem of d[col.field]; let breakIndex = index\"\r\n class=\"circle-value badge-outline break-on text-center\"\r\n [ngClass]=\"(breakItem.break_type?.data_value_name?.toLowerCase() || breakItem.breakType?.toLowerCase()) === 'paid' ? 'break-color-paid' : (breakItem.break_type?.data_value_name?.toLowerCase() || breakItem.breakType?.toLowerCase()) === 'unpaid' ? 'break-color-unpaid' : (breakItem.break_type?.data_value_name?.toLowerCase() || breakItem.breakType?.toLowerCase()) === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showBreakTooltip($event, breakItem)\"\r\n (mouseleave)=\"hideBreakTooltip()\">\r\n {{ breakItem.break_duration }}m\r\n</span>\r\n </ng-container>\r\n <ng-template #noBreaks>\r\n <div\r\n \r\n >\r\n -\r\n</div>\r\n</ng-template>\r\n</ng-container>\r\n <ng-container *ngIf=\"col.field === 'short_breaks' && !isDetailEditing(row, d, col)\">\r\n <div *ngIf=\"d[col.field]?.duration; else noShortBreak\"\r\n class=\"circle-value\"\r\n [ngClass]=\"(d[col.field].type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (d[col.field].type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (d[col.field].type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showShortBreakTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideShortBreakTooltip()\"\r\n (dblclick)=\"onShortBreakClick.emit(d)\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n <ng-template #noShortBreak>\r\n <div >-</div>\r\n </ng-template>\r\n</ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <input #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" [attr.data-edit-key]=\"row._id + '-' + j + '-' + col.field\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto; position: absolute; top: 0; left: 0; z-index: 10;\" />\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultDetailCell>\r\n <span class=\"d-flex align-items-center h-100\">\r\n <ng-container *ngIf=\"!isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n <!-- ✅ SHORT LEAVE: Progress bar in detail rows -->\r\n <div *ngSwitchCase=\"'short_leave'\" class=\"position-relative\" style=\"min-width: 100px; width: 150px;\">\r\n <ng-container *ngIf=\"d.short_leave && d.short_leave.length > 0; else noShortLeaveDetail\">\r\n <div\r\n class=\"w-100 d-flex main-progress-bar\"\r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, d)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\"\r\n >\r\n <span\r\n class=\"d-block\"\r\n [style.min-width.%]=\"d.short_leave[0].short_leave_time_percentage\"\r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"\r\n ></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">{{ d.short_leave[0].short_leave_time_percentage }}%</span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveDetail>\r\n <div >-</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Status -->\r\n<ng-container *ngSwitchCase=\"'status'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noStatus\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noStatus>-</ng-template>\r\n</ng-container>\r\n\r\n<!-- Attendance Status -->\r\n<ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noAttendanceStatus\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noAttendanceStatus>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Existing cases -->\r\n <div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"popover__wrapper\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n <div *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\">\r\n <ng-container *ngIf=\"d.manually_logs?.length > 0; else noManualLogsIcon\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\" class=\"data-grid-svg-icon text-primary\" style=\"cursor: pointer; font-size: 16px;\" (mouseenter)=\"showManualLogsTooltip($event, row, d)\" (mouseleave)=\"hideManualLogsTooltip()\"></span>\r\n </ng-container>\r\n <ng-template #noManualLogsIcon>\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\" class=\"data-grid-svg-icon text-muted\" style=\"font-size: 16px; cursor: not-allowed;\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Default fallback -->\r\n <span *ngSwitchDefault>\r\n {{\r\n col.type === 'date'\r\n ? (getNestedValue(d, col.field) ? formatDate(getNestedValue(d, col.field)) : '-')\r\n : col.type === 'time'\r\n ? formatTime(getTimeValue(getNestedValue(d, col.field)))\r\n : (getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-')\r\n }}\r\n </span>\r\n</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <input *ngSwitchCase=\"'string'\" #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'number'\" #detailInput type=\"number\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'date'\" #detailInput type=\"date\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'time'\" #detailInput type=\"time\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'currency'\" #detailInput type=\"number\" step=\"0.01\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm text-end\" style=\"width: 100%; height: auto;\" />\r\n <select *ngSwitchCase=\"'dropdown'\" #detailInput [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\">\r\n <option *ngFor=\"let option of col.column_dropdown_value\" [ngValue]=\"option?.value || option\">\r\n {{ option?.label || option?.name || option }}\r\n </option>\r\n </select>\r\n <input *ngSwitchDefault #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n\r\n <!-- RIGHT SECTION OF ACCORDION -->\r\n <div #rightContainer class=\"accordion-right-section data-pin-body-wrapper \" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailRightScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\" [style.color]=\"headerTextColor\" [style.fontSize.px]=\"headerTextFontsSize\" [style.fontWeight]=\"headerFontWeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n\r\n <div class=\"resize-handles\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"rowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'right')\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n\r\n <ng-container *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\">\r\n <ng-container *ngIf=\"d.manually_logs?.length > 0; else noManualLogsIcon\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon text-primary\"\r\n style=\"cursor: pointer; font-size: 16px;\"\r\n (mouseenter)=\"showManualLogsTooltip($event, row, d)\"\r\n (mouseleave)=\"hideManualLogsTooltip()\">\r\n </span>\r\n </ng-container>\r\n <ng-template #noManualLogsIcon>–</ng-template>\r\n</ng-container>\r\n <!-- Breaks -->\r\n <ng-container *ngSwitchCase=\"'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaksLeft\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(d[col.field])\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onDetailBadgeOverflowCountClick(col, d)\">\r\n</app-badge-overflow>\r\n </ng-container>\r\n <ng-template #noBreaksLeft>\r\n <div>\r\n -\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n <div *ngSwitchCase=\"'is_payroll_processed'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" >\r\n <span class=\"\" >\r\n {{ d.is_payroll_processed ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n <!-- Short Breaks -->\r\n <ng-container *ngSwitchCase=\"'short_breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.duration; else noShortBreakLeft\">\r\n <div class=\"circle-value\"\r\n [ngClass]=\"(d[col.field].type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (d[col.field].type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (d[col.field].type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showShortBreakTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideShortBreakTooltip()\"\r\n (dblclick)=\"onShortBreakClick.emit(d)\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortBreakLeft>\r\n <div >-</div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Leave -->\r\n <!-- Short Leave -->\r\n<ng-container *ngSwitchCase=\"'short_leave'\">\r\n <ng-container *ngIf=\"row.short_leave && row.short_leave.length > 0; else noShortLeaveMain\">\r\n <div class=\"w-100 d-flex main-progress-bar justify-content-center align-items-center\" \r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, row)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <span class=\"d-block\" [style.min-width.%]=\"row.short_leave[0].short_leave_time_percentage\" \r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">\r\n {{ row.short_leave[0].short_leave_time_percentage }}%\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveMain>-</ng-template>\r\n</ng-container>\r\n\r\n<ng-container *ngSwitchCase=\"'status'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noStatus\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noStatus>-</ng-template>\r\n</ng-container>\r\n\r\n<!-- Attendance Status -->\r\n<ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noAttendanceStatus\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noAttendanceStatus>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Default -->\r\n <ng-container *ngSwitchDefault>\r\n {{ getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-' }}\r\n </ng-container>\r\n</ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n\r\n </div>\r\n\r\n <!-- DETAIL SIDE MENU (Sticky on right end) -->\r\n <div class=\"detail-side-menu-wrapper\" >\r\n <div style=\"width: 30px\" class=\"d-flex flex-column align-items-center \">\r\n <div (click)=\"toggleDetailSideMenu(row, 'cols')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'cols'\" class=\"columns-button d-flex flex-column align-items-center border-below\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Columns</div>\r\n </div>\r\n <!-- <div (click)=\"toggleDetailSideMenu(row, 'filtrs')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'filtrs'\" class=\"columns-button d-flex flex-column align-items-center\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Filter</div>\r\n </div> -->\r\n </div>\r\n\r\n <div *ngIf=\"row.details.sideMenu?.currentTab\" class=\"detail-side-menu-content\" [style.backgroundColor]=\"sidemenuBackgroundColor\" style=\"width: 250px; box-shadow: -2px 0 5px rgba(0,0,0,0.1);\">\r\n <!-- COLUMNS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'cols'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Columns</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"d-flex align-items-center mb-2\">\r\n <input type=\"checkbox\" class=\"form-check-input me-2\" [(ngModel)]=\"col.is_visible\" (change)=\"onDetailColumnVisibilityChange(row)\" />\r\n <span>{{ col.header }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- FILTERS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'filtrs'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Filters</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center cursor-pointer\" (click)=\"col.expandedFilter = !col.expandedFilter\">\r\n <label class=\"mb-0 small\">{{ col.header }}</label>\r\n <span class=\"toggle-icon data-grid-svg-icon\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\" [class.rotate]=\"col.expandedFilter\"></span>\r\n </div>\r\n <div *ngIf=\"col.expandedFilter\" class=\"mt-2 filter-input-container ps-3 pe-3\">\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n row.details.filters[col.field]?._ids?.length == col.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllDetailFilters(col, row, $event)\"\r\n id=\"detail_selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1 ms-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : col.searchValue : 'value';\r\n trackBy: trackById\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [value]=\"option\"\r\n [checked]=\"\r\n row.details.filters[col.field]?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n (change)=\"onDetailOptionToggle(col, option, row)\"\r\n id=\"detail_option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n />\r\n <label\r\n class=\"form-check-label\"\r\n [for]=\"\r\n 'detail_option_' +\r\n col.field +\r\n '_' +\r\n (option?.id || option?._id || option)\r\n \"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #textFilter>\r\n <div class=\"filter-text-section\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"row.details.filters[col.field].first_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : 'text'\"\r\n class=\"form-control form-control-sm mb-3\"\r\n placeholder=\"Value\"\r\n [(ngModel)]=\"row.details.filters[col.field].first_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n />\r\n\r\n <ng-container *ngIf=\"row.details.filters[col.field]?.first_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"and\"\r\n id=\"detail_and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"or\"\r\n id=\"detail_or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"none\"\r\n id=\"detail_none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"row.details.filters[col.field].condition !== 'none'\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : 'text'\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n />\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Side Menu -->\r\n\r\n\r\n\r\n<!-- Popover for Restriction Logs (is_un_restricted) -->\r\n<div\r\n *ngIf=\"restrictionTooltipVisible\"\r\n class=\"popover__content m-l-10 popoverRestriction position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"restrictionTooltipPosition.x\"\r\n [style.top.px]=\"restrictionTooltipPosition.y\"\r\n (mouseenter)=\"preventRestrictionTooltipHide()\"\r\n (mouseleave)=\"hideRestrictionTooltip()\"\r\n style=\"z-index: 1000; min-width: 300px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\">Clock in</th>\r\n <th class=\"center\">Clock out</th>\r\n <th class=\"center\">Log Hr</th>\r\n <th class=\"center\">Log Min</th>\r\n <th class=\"center pe-2\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of currentRestrictionLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\"> {{ item?.clock_in_time | date:'shortTime'}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.clock_out_time | date:'shortTime'}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_hours }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_minutes }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ item?.status ? (item.status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Popover for Manual Logs -->\r\n<div\r\n *ngIf=\"manualLogsTooltipVisible\"\r\n class=\"popover__content position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"manualLogsTooltipPosition.x\"\r\n [style.top.px]=\"manualLogsTooltipPosition.y\"\r\n (mouseenter)=\"preventManualLogsTooltipHide()\"\r\n (mouseleave)=\"hideManualLogsTooltip()\"\r\n style=\"z-index: 1000; min-width: 500px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <ng-container *ngIf=\"currentManualLogs.length > 0; else noManualLogs\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\" style=\"width: 18%;\">Name</th>\r\n <th class=\"center\">Date/Time</th>\r\n <th class=\"center\">Previous Time</th>\r\n <th class=\"center\">Updated Time</th>\r\n <th class=\"center\">Status</th>\r\n <th class=\"center pe-2\">Remarks</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let log of currentManualLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\">{{ log.name }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.date_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.previous_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.updated_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ log.log_status ? (log.log_status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n <td class=\"center pe-2\">\r\n <span class=\"text-primary\">{{ log.remarks }}</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-template #noManualLogs>\r\n <div class=\"text-center p-3\">\r\n <p class=\"text-muted mb-0\">No manual logs available for this record.</p>\r\n </div>\r\n </ng-template>\r\n</div>\r\n\r\n\r\n\r\n\r\n<!-- Existing Custom Tooltip for Breaks -->\r\n\r\n\r\n\r\n\r\n\r\n <!-- RIGHT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'right' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" style=\"max-height: 350px; min-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\" [class.show-shadow]=\"rowShadingEnabled\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\">&nbsp;</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\">&nbsp;</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </ng-template>\r\n</ng-template>\r\n\r\n<!-- Actual Cell is Here -->\r\n<ng-template\r\n #cellTemplate\r\n let-col=\"col\"\r\n let-row=\"row\"\r\n let-section=\"section\"\r\n let-subColIndex=\"subColIndex\"\r\n let-rowIndex=\"rowIndex\"\r\n let-colIndex=\"colIndex\"\r\n>\r\n <div\r\n (click)=\"disableEdit(row, col); setActiveCell(row, col)\"\r\n [style.fontWeight]=\"bodyFontWeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n class=\"cell overflow-visible position-relative\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n [class.active-cell]=\"\r\n isActiveCell(row, col) && !isEditing(row, col) && selectedKeys.size == 1\r\n \"\r\n (dblclick)=\"$event.preventDefault(); enableEdit(row, col)\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"$event.preventDefault(); enableEdit(row, col)\"\r\n (mousedown)=\"\r\n startSelection(\r\n row.__virtualIndex,\r\n colIndex,\r\n subColIndex ?? 0,\r\n col.field,\r\n $event,\r\n section\r\n )\r\n \"\r\n (mouseenter)=\"\r\n extendSelection(\r\n row.__virtualIndex,\r\n colIndex,\r\n subColIndex ?? 0,\r\n col.field,\r\n $event,\r\n section\r\n )\r\n \"\r\n (mouseup)=\"endSelection()\"\r\n [class.selected-cell]=\"\r\n isSelected(\r\n row.__virtualIndex,\r\n colIndex,\r\n subColIndex ?? 0,\r\n col.field,\r\n section\r\n )\r\n \"\r\n [class.top-border]=\"\r\n isTopBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.bottom-border]=\"\r\n isBottomBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.left-border]=\"\r\n isLeftBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.right-border]=\"\r\n isRightBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.top-left-corner]=\"\r\n isTopLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.top-right-corner]=\"\r\n isTopRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.bottom-left-corner]=\"\r\n isBottomLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.bottom-right-corner]=\"\r\n isBottomRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n >\r\n <!-- (mousedown)=\"startSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\r\n (mouseenter)=\"extendSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\r\n (mouseup)=\"endSelection()\"\r\n [class.selected-cell]=\"isSelected(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field)\" -->\r\n <div class=\"table-cell\" [class.active-for-editing]=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50\">\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50; else viewMode\"\r\n >\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <!-- Text Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 10\"\r\n *ngSwitchCase=\"'input'\"\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Number Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'number'\"\r\n #numberInput=\"ngModel\"\r\n #numberRef\r\n (keypress)=\"allowOnlyNumbers($event)\"\r\n type=\"number\"\r\n required\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n (keydown.enter)=\"numberRef.blur()\"\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': numberInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Date Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'date'\"\r\n type=\"date\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n #dateInput=\"ngModel\"\r\n [ngClass]=\"{\r\n 'is-invalid': dateInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Dropdown -->\r\n <!-- ng-select like dropdown -->\r\n <div\r\n *ngSwitchCase=\"'dropdown'\"\r\n class=\"dropdown w-100\"\r\n (blur)=\"disableEdit(row, col)\"\r\n >\r\n <!-- Trigger -->\r\n <button\r\n class=\"form-select form-select-sm text-start w-100 text-ellipsis\"\r\n type=\"button\"\r\n data-bs-toggle=\"dropdown\"\r\n aria-expanded=\"false\"\r\n [style.minHeight.px]=\"rowHeight - 10\"\r\n data-bs-display=\"static\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container>\r\n {{\r\n getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field)\r\n }}\r\n </ng-container>\r\n <ng-template #placeholder> Select options... </ng-template>\r\n </button>\r\n\r\n <!-- Menu -->\r\n <div\r\n class=\"dropdown-menu w-100 p-0 cell-editing-dropdown-menu rounded-3\"\r\n [class.show]=\"isEditing(row, col)\"\r\n >\r\n <!-- Search -->\r\n <div class=\"px-2 py-1\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"editinDropdownSearch\"\r\n />\r\n </div>\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"cell-editin-dropdown\"\r\n style=\"max-height: 200px; overflow: auto\"\r\n >\r\n <div\r\n (click)=\"\r\n setNestedValue(row, col, option, true);\r\n disableEdit(row, col)\r\n \"\r\n class=\"px-2 py-1 d-flex align-items-center item\"\r\n *ngFor=\"\r\n let option of col.column_dropdown_value\r\n | filter : editinDropdownSearch : 'value'\r\n \"\r\n >\r\n <label\r\n class=\"form-check-label d-flex align-items-center mb-0\"\r\n [for]=\"col.field + '-' + option.value || option\"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <input\r\n *ngSwitchCase=\"'email'\"\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #emailModel=\"ngModel\"\r\n #emailInput\r\n type=\"email\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n pattern=\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\r\n (blur)=\"disableEdit(row, col, emailModel)\"\r\n (keydown.enter)=\"\r\n emailModel.control.markAsTouched(); emailInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': emailModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n <!-- Default fallback -->\r\n <input\r\n *ngSwitchDefault\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #textModel=\"ngModel\"\r\n #textInput\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n (blur)=\"disableEdit(row, col, textModel)\"\r\n (keydown.enter)=\"\r\n textModel.control.markAsTouched(); textInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': textModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Display mode -->\r\n <ng-template #viewMode>\r\n <div\r\n class=\"d-flex justify-between items-center w-100\"\r\n [ngClass]=\"getCellClasses(col, getNestedValue(row, col.field))\"\r\n >\r\n <!-- Text cell -->\r\n <div class=\"d-flex align-items-center w-100\">\r\n <div\r\n #cellText\r\n class=\"text-ellipsis flex-grow-1\"\r\n [title]=\"\r\n col.type === 'date'\r\n ? (getNestedValue(row, col.field) | date : dateFormat)\r\n : getNestedValue(row, col.field)\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.type !== 'image'\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n <!-- Breaks -->\r\n <ng-container *ngSwitchCase=\"'breaks'\">\r\n <ng-container *ngIf=\"getNestedValue(row, 'breaks')?.length; else noBreaksMain\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(getNestedValue(row, 'breaks'))\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onBadgeOverflowCountClick(col)\">\r\n </app-badge-overflow>\r\n </ng-container>\r\n <ng-template #noBreaksMain>\r\n <div >\r\n -\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Breaks -->\r\n <ng-container *ngSwitchCase=\"'short_breaks'\">\r\n <ng-container *ngIf=\"row.short_breaks?.duration && row.short_breaks.duration > 0; else noShortBreak\">\r\n <span class=\"popover__wrapper d-flex justify-content-center align-items-center\" style=\"cursor: pointer;\" (dblclick)=\"onShortBreakClick.emit(row)\" (mouseenter)=\"showShortBreakTooltip($event, row.short_breaks)\" (mouseleave)=\"hideShortBreakTooltip()\">\r\n <span class=\"circle-value badge-outline text-center\" [ngClass]=\"(row.short_breaks.type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (row.short_breaks.type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (row.short_breaks.type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\">\r\n {{ row.short_breaks.duration }}m\r\n </span>\r\n </span>\r\n </ng-container>\r\n <ng-template #noShortBreak>\r\n <div >-</div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Leave -->\r\n <!-- Short Leave -->\r\n<ng-container *ngSwitchCase=\"'short_leave'\">\r\n <ng-container *ngIf=\"row.short_leave && row.short_leave.length > 0; else noShortLeaveMain\">\r\n <div class=\"w-100 d-flex main-progress-bar justify-content-center align-items-center\" \r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, row)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <span class=\"d-block\" [style.min-width.%]=\"row.short_leave[0].short_leave_time_percentage\" \r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">\r\n {{ row.short_leave[0].short_leave_time_percentage }}%\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveMain>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Status -->\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(row, col.field))\">\r\n {{ transformStatus(getNestedValue(row, col.field)) || '-' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Attendance Status -->\r\n <ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(row, col.field))\">\r\n {{ transformStatus(getNestedValue(row, col.field)) || '-' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Payroll Processed -->\r\n <ng-container *ngSwitchCase=\"'is_payroll_processed'\">\r\n <span class=\"badge\" [class]=\"getNestedValue(row, col.field) ? 'badge-success' : 'badge-secondary'\">\r\n {{ getNestedValue(row, col.field) ? 'Yes' : 'No' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Restriction -->\r\n <ng-container *ngSwitchCase=\"'is_un_restricted'\">\r\n <span class=\"badge\" [class]=\"getNestedValue(row, col.field) ? 'badge-success' : 'badge-secondary'\">\r\n {{ getNestedValue(row, col.field) ? 'Yes' : 'No' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Default -->\r\n <ng-container *ngSwitchDefault>\r\n {{\r\n !isNestedValueArray(row, col.field)\r\n ? col.type === 'date'\r\n ? (isDate(getNestedValue(row, col.field))\r\n ? formatDate(getNestedValue(row, col.field))\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-'))\r\n : col.type === 'time'\r\n ? formatTime(getTimeValue(getNestedValue(row, col.field)))\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-')\r\n : (getNestedValue(row, col.field)?.[0]?.department_name ||\r\n getNestedValue(row, col.field)?.[0]?.roleName ||\r\n '-')\r\n }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"col.type == 'image'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n defaultImagePlaceholder;\r\n context: {\r\n row: row,\r\n col: col,\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Active dot and eye icon for employee name -->\r\n <span *ngIf=\"col.field === 'User' && hasManualLogs(row) && !row.isDetailsExpand\" class=\"badge badge-dot badge-success ms-1\" (mouseenter)=\"showManualLogsTooltip($event, row, row)\"></span>\r\n <i *ngIf=\"col.field === 'User' && hasManualLogs(row)\" class=\"bi bi-eye ms-1\" (mouseenter)=\"showManualLogsTooltip($event, row, row)\"></i>\r\n </div>\r\n\r\n <!-- Expand / Collapse icon for multiple data showing in one coll-->\r\n\r\n <!-- <span\r\n *ngIf=\"\r\n (isOverflowing(cellText) &&\r\n showCellDetailsBox &&\r\n getNestedValue(row, col.field)?.length > 50) ||\r\n (isNestedValueArray(row, col.field) &&\r\n getNestedValue(row, col.field)?.length > 1)\r\n \"\r\n class=\"toggle-icon data-grid-svg-icon ms-2 cursor-pointer\"\r\n [inlineSVG]=\"\r\n isExpanded(row, col)\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"\r\n $event.stopPropagation();\r\n toggleExpandOfLongCellText(row, col, columns, true)\r\n \"\r\n (dblclick)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n ></span> -->\r\n </div>\r\n\r\n <!-- Expanded text -->\r\n <div\r\n class=\"position-absolute w-100\"\r\n *ngIf=\"isExpanded(row, col)\"\r\n [style.zIndex]=\"getZIndex(row, col)\"\r\n style=\"top: 100%; left: 0\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n fullTextTemplate;\r\n context: {\r\n row: row,\r\n col: col,\r\n isArray: isNestedValueArray(row, col.field)\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n\r\n \r\n\r\n\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div\r\n *ngIf=\"currentBreakTooltip\"\r\n class=\"custom-break-tooltip\"\r\n [style.--tooltip-x.px]=\"tooltipPosition.x\"\r\n [style.--tooltip-y.px]=\"tooltipPosition.y\"\r\n>\r\n <div class=\"break-tooltip-header\">\r\n <strong>{{ currentBreakTooltip.break_type?.data_value_name || 'Break' }}</strong>\r\n <span class=\"text-muted ms-2\">\r\n {{ currentBreakTooltip.breakInstatus === 'breakOut' ? 'Taken' : 'On Break' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"break-tooltip-body\">\r\n <div>\r\n <i class=\"bi bi-play-circle\"></i>\r\n In: {{ formatTime(getTimeValue(currentBreakTooltip.break_in_time)) }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-stop-circle\"></i>\r\n Out: {{ formatTime(getTimeValue(currentBreakTooltip.break_out_time)) }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-clock\"></i>\r\n Duration: {{ currentBreakTooltip.break_duration }} min\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n<!-- Short Break Tooltip -->\r\n<div\r\n *ngIf=\"currentShortBreakTooltip\"\r\n class=\"custom-break-tooltip\"\r\n [style.--tooltip-x.px]=\"tooltipPosition.x\"\r\n [style.--tooltip-y.px]=\"tooltipPosition.y\"\r\n>\r\n <div class=\"break-tooltip-header\">\r\n <strong>{{ currentShortBreakTooltip.short_break_name || 'Short Break' }}</strong>\r\n </div>\r\n\r\n <div class=\"break-tooltip-body\">\r\n <div>\r\n <i class=\"bi bi-play-circle\"></i>\r\n Start: {{ formatTime(getTimeValue(currentShortBreakTooltip.start_time)) }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-stop-circle\"></i>\r\n End: {{ formatTime(getTimeValue(currentShortBreakTooltip.end_time)) }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-clock\"></i>\r\n Duration: {{ currentShortBreakTooltip.short_break_duration }} min\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n<!-- Headers Action List On clicking three dots -->\r\n\r\n<ng-template #columnMenu let-col=\"col\">\r\n <div\r\n class=\"column-menu three-dots-col-menu\"\r\n [class.visually-hidden]=\"isMenueHidden\"\r\n *ngIf=\"activeCol && !isThreeDotsFilterOpen && !loading\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Sort Ascending -->\r\n <div class=\"border-below pb-2\" [class.disable-sorting]=\"!col.is_sortable\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span>\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showAscending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortAsc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-up.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Ascending\r\n </div>\r\n\r\n <!-- Sort Descending -->\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showDescending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'asc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDesc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-down.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Descending\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n sortingConfig?.field === col.field &&\r\n (sortingConfig?.order_by === 'asc' ||\r\n sortingConfig?.order_by === 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"resetSort(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Reset Sort\r\n </div>\r\n </div>\r\n <div class=\"py-2 border-below three-dots-filter\">\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showFilter\"\r\n class=\"column-menu-item three-dots-filter\"\r\n (click)=\"openFilteronThreeDotsClick(col)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Filter\r\n </div>\r\n </div>\r\n\r\n <div class=\"py-2 border-below\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, 'left')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-left.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Left\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showPinright && col?.pinned !== 'right'\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, 'right')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-right.svg'\"\r\n class=\"data-grid-svg-icon data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Right\r\n </div>\r\n\r\n <div\r\n *ngIf=\"col?.pinned\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, null)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/layout-three-columns.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Unpin\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeThisColumn\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeColumn(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-expand-vertical.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Autosize This Column\r\n </div>\r\n\r\n <!-- Autosize All Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeAllColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeAllColumns()\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-angle-expand.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Autosize All Columns\r\n </div>\r\n\r\n <!-- Group By -->\r\n <div\r\n *ngIf=\"showRowsGrouping\"\r\n class=\"column-menu-item\"\r\n (click)=\"groupBy(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/diagram-3.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Group by {{ col.header }}\r\n </div>\r\n\r\n <!-- Choose Columns -->\r\n <!-- <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showChoseColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"chooseColumns()\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Choose Columns\r\n </div> -->\r\n\r\n <!-- Reset Columns -->\r\n <!-- <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showResetColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetColumns()\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Reset Columns\r\n </div> -->\r\n </div>\r\n <div *ngIf=\"isThreeDotsFilterOpen\" class=\"three-dots-col-menu position-relative\" [style.left.px]=\"-140\" [class.visually-hidden]=\"isMenueHidden\">\r\n <ng-container\r\n *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- Filter Menue -->\r\n<ng-template #filterMenu let-col=\"col\">\r\n <div\r\n class=\"filter-menu-container filter-menu\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"filter-dropdown-section p-1\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"addFilterDropdownSearch\"\r\n #filterMenueSearchInput\r\n />\r\n\r\n <div class=\"form-check mb-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isAllSideFilterOptionsSelected(col)\"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'value';\r\n trackBy: trackById\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n [value]=\"option\"\r\n id=\"option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n (change)=\"onOptionToggle(col, option)\"\r\n />\r\n <label\r\n class=\"form-check-label\"\r\n [for]=\"\r\n 'option_' +\r\n col.field +\r\n '_' +\r\n (option?.id || option?._id || option)\r\n \"\r\n >\r\n {{ option?.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Text Filter Section -->\r\n <ng-template #textFilter>\r\n <div class=\"filter-text-section\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col.query.first_condition || 'contain'\"\r\n (ngModelChange)=\"col.query.first_condition = $event\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'string' ? 'text' : col.type\"\r\n class=\"form-control form-control-sm mb-3\"\r\n placeholder=\"Value\"\r\n [(ngModel)]=\"col.query.first_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n #filterMenueTextchInput\r\n />\r\n\r\n <ng-container >\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"condition\"\r\n value=\"and\"\r\n id=\"and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"condition\"\r\n value=\"or\"\r\n id=\"or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"condition\"\r\n value=\"none\"\r\n id=\"none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"col.query?.first_value && condition !== 'none'\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col.query.second_condition || 'contain'\"\r\n (ngModelChange)=\"col.query.second_condition = $event\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'string' ? 'text' : col.type\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"col.query.second_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n />\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Actions -->\r\n <div class=\"d-flex gap-2 mt-2\">\r\n <div\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"applyFilterFromFilterRow(col)\"\r\n >\r\n Apply\r\n </div>\r\n <div\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"resetSideFilter(col)\"\r\n >\r\n Reset\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Side Menue -->\r\n\r\n<!-- Add this new template for accordion detail column menu -->\r\n<ng-template #detailColumnMenu let-col=\"col\" let-row=\"row\">\r\n <div\r\n class=\"column-menu three-dots-col-menu detail-column-menu\"\r\n [class.visually-hidden]=\"isDetailMenueHidden\"\r\n *ngIf=\"activeDetailCol\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Sort Ascending -->\r\n <div class=\"border-below pb-2\" [class.disable-sorting]=\"!col.is_sortable\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAscending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailAsc(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-up.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Ascending\r\n </div>\r\n\r\n <!-- Sort Descending -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showDescending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailDesc(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-down.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Descending\r\n </div>\r\n\r\n <div\r\n *ngIf=\"col?.sortOrder\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetDetailSort(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Reset Sort\r\n </div>\r\n </div>\r\n\r\n <div class=\"py-2 border-below\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateDetailColumnPin(activeDetailCol, row, 'left')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-left.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Left\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showPinright && col?.pinned !== 'right'\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"updateDetailColumnPin(activeDetailCol, row, 'right')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-right.svg'\"\r\n class=\"data-grid-svg-icon data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Right\r\n </div>\r\n\r\n <div\r\n *ngIf=\"col?.pinned\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateDetailColumnPin(activeDetailCol, row, null)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/layout-three-columns.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Unpin\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeThisColumn\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeDetailColumn(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-expand-vertical.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Autosize This Column\r\n </div>\r\n\r\n <!-- Autosize All Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeAllColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeAllDetailColumns(row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-angle-expand.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Autosize All Columns\r\n </div>\r\n\r\n\r\n <!-- Choose Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showChoseColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"openDetailChooseColumns(row)\"\r\n>\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Choose Columns\r\n</div>\r\n\r\n <!-- Reset Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showResetColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetDetailColumns(row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Reset Columns\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Column Pannel / Pivot Mode / Searching -->\r\n\r\n<ng-template #columnPannel>\r\n <div class=\"column-panel-header\">\r\n <!-- Pivot Toggle -->\r\n <div\r\n class=\"form-check form-switch d-flex align-items-center mb-2 pivot-mode px-5 ms-2\"\r\n >\r\n <input\r\n class=\"form-check-input me-2\"\r\n type=\"checkbox\"\r\n id=\"pivotToggle\"\r\n [(ngModel)]=\"pivotMode\"\r\n />\r\n <label class=\"form-check-label\" for=\"pivotToggle\">Pivot Mode</label>\r\n </div>\r\n\r\n <!-- Select All & Search -->\r\n <div class=\"d-flex align-items-center mb-2 px-3\">\r\n <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n accordionState === 'all'\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : accordionState === 'some'\r\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"toggleAllAccordions()\"\r\n ></span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allColumnsSelected()\"\r\n (change)=\"toggleAllColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search columns...\"\r\n [(ngModel)]=\"columnSearch\"\r\n />\r\n </div>\r\n\r\n <!-- Separator -->\r\n <hr class=\"my-2\" />\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Right Columns Menue -->\r\n\r\n<!-- Column Panel Item Template -->\r\n<ng-template #columnPanelItem let-col=\"col\">\r\n <!-- Group Column -->\r\n <ng-container *ngIf=\"col.children?.length\">\r\n <div class=\"column-group d-flex align-items-center mb-2\">\r\n <span class=\"filter-icon-wrapper me-2\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expanded\"\r\n (click)=\"col.expanded = !col.expanded\"\r\n ></span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [id]=\"'group_' + col.header\"\r\n [checked]=\"isColumnVisible(col)\"\r\n (change)=\"toggleGroupVisibility(col)\"\r\n />\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\r\n ></span>\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'group_' + col.header\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span class=\"text-truncate\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"col.expanded\" class=\"ps-4\">\r\n <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\r\n <ng-container\r\n *ngTemplateOutlet=\"columnPanelItem; context: { col: child }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Leaf Column -->\r\n <ng-container *ngIf=\"!col.children?.length\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <span class=\"me-2\" style=\"width: 1.5rem\"></span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [(ngModel)]=\"col.is_visible\"\r\n [id]=\"'col_' + col.field\"\r\n (change)=\"onSideMenuColumnsVisibilityChange()\"\r\n />\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\r\n ></span>\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'col_' + col.field\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span class=\"text-truncate\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<!-- Columns Side Filter -->\r\n<ng-template #sideFilters>\r\n <div class=\"py-3 px-2 pe-3 h-100\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <span class=\"filter-icon-wrapper me-2\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n filterAccordionState === 'all'\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : filterAccordionState === 'some'\r\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"toggleAllFilterAccordions()\"\r\n ></span>\r\n </span>\r\n\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"columnSearch\"\r\n />\r\n </div>\r\n <div\r\n class=\"overflow-auto side-filter-columns-wrapper\"\r\n style=\"height: calc(100% - 120px); scrollbar-width: thin\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : columnSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"filterPannelItem; context: { col: col }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Apply and Reset Buttons -->\r\n <!-- <div class=\"d-flex gap-2 mt-3 px-2\">\r\n <button\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center flex-fill\"\r\n style=\"height: 32px;\"\r\n (click)=\"applySideMenuFilters()\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center flex-fill\"\r\n style=\"height: 32px;\"\r\n (click)=\"resetSideMenuFilters()\"\r\n >\r\n Reset\r\n </button>\r\n </div> -->\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #filterPannelItem let-col=\"col\">\r\n <!-- Group Column -->\r\n <ng-container *ngIf=\"col.children?.length\">\r\n <div class=\"column-group d-flex align-items-center mb-2\">\r\n <!-- Chevron toggle -->\r\n <span class=\"filter-icon-wrapper me-2\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expandedFilter\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n ></span>\r\n </span>\r\n\r\n <!-- Group label toggle -->\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n style=\"cursor: pointer\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span class=\"fw-bold text-truncate\"\r\n >{{ col.header }}\r\n <span\r\n class=\"text-primary ms-1\"\r\n *ngIf=\"col?.query?._ids?.length || col?.query?._first_value\"\r\n >*</span\r\n >\r\n </span>\r\n </label>\r\n </div>\r\n\r\n <!-- Children columns -->\r\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4\">\r\n <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\r\n <ng-container\r\n *ngTemplateOutlet=\"filterPannelItem; context: { col: child }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Leaf Column -->\r\n <ng-container *ngIf=\"!col.children?.length\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <span\r\n class=\"me-2 filter-icon-wrapper me-2\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expandedFilter\"\r\n ></span>\r\n </span>\r\n\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n style=\"cursor: pointer\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span class=\"text-truncate fw-bold\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Show filter when expanded -->\r\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4 pe-3\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sideNestedFilter; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Side Nested Filters -->\r\n<ng-template #sideNestedFilter let-col=\"col\">\r\n <div class=\"\">\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.length == col?.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1 ms-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'header'\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [value]=\"option\"\r\n [checked]=\"\r\n col.query?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n (change)=\"onOptionToggle(col, option)\"\r\n id=\"option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n />\r\n <label\r\n class=\"form-check-label\"\r\n [for]=\"\r\n 'option_' +\r\n col.field +\r\n '_' +\r\n (option?.id || option?._id || option)\r\n \"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <!-- <div class=\"d-flex gap-2 mt-2\">\r\n <div\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center\"\r\n style=\"height: 22px;\"\r\n (click)=\"applySideMenuFilters()\"\r\n >\r\n Apply\r\n </div>\r\n <div\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center\"\r\n style=\"height: 22px;\"\r\n (click)=\"resetSideMenuFilters()\"\r\n >\r\n Reset\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Text Filter Section -->\r\n <ng-template #textFilter>\r\n <div class=\"filter-text-section\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col!.query!.first_condition || 'contain'\"\r\n (ngModelChange)=\"col!.query!.first_condition = $event\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : col.type == 'number' ? 'number' : 'text'\"\r\n class=\"form-control form-control-sm mb-3\"\r\n placeholder=\"Value\"\r\n [(ngModel)]=\"col!.query!.first_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n />\r\n\r\n <ng-container *ngIf=\"col?.query?.first_value && col?.query?.condition !== 'none'\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"col!.query.condition\"\r\n value=\"and\"\r\n id=\"and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"col!.query.condition\"\r\n value=\"or\"\r\n id=\"or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"col!.query.condition\"\r\n value=\"none\"\r\n id=\"none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col!.query.second_condition || 'contain'\"\r\n (ngModelChange)=\"col!.query.second_condition = $event\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : col.type == 'number' ? 'number' : 'text'\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"col!.query.second_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n />\r\n </ng-container>\r\n\r\n <!-- Apply and Reset Buttons -->\r\n <div class=\"d-flex gap-2 mt-2\">\r\n <div\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"applyFilterFromFilterRow(col)\"\r\n >\r\n Apply\r\n </div>\r\n <div\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"resetSideFilter(col)\"\r\n >\r\n Reset\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Centr Overlay for showing the chose columns -->\r\n\r\n<div *ngIf=\"showColumnPanel\" class=\"custom-modal-overlay\" (click)=\"closeModalColumnPanel()\">\r\n <div\r\n class=\"custom-modal-content\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"modalColumnPannel\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- The existing ng-template you provided -->\r\n<ng-template #modalColumnPannel>\r\n <div class=\"column-panel-header\">\r\n <div\r\n class=\"d-flex justify-content-between align-items-center px-2 ps-3 rounded-top-2 moda-header\"\r\n [style.height.px]=\"48\"\r\n >\r\n Choose Columns\r\n <span class=\"filter-icon-wrapper\" (click)=\"closeModalColumnPanel()\"\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span\r\n ></span>\r\n </div>\r\n <hr class=\"my-0\" />\r\n <div>\r\n <div class=\"d-flex align-items-center px-2 pe-3\" [style.height.px]=\"48\">\r\n <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n accordionState === 'all'\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : accordionState === 'some'\r\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"toggleAllAccordions()\"\r\n ></span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allColumnsSelected()\"\r\n (change)=\"toggleAllColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search columns...\"\r\n [(ngModel)]=\"choseColumnsSearch\"\r\n />\r\n </div>\r\n\r\n <hr class=\"mt-0 mb-1\" />\r\n <div class=\"px-2 overlay-scrollable\">\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : choseColumnsSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #sideMenuRowGroups>\r\n <div class=\"d-flex flex-column h-100\">\r\n <div class=\"px-3 h-100\">\r\n <div class=\"d-flex gap-3 mb-4\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span>Row Groups</span>\r\n </div>\r\n <div class=\"h-50\">\r\n <div\r\n class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\r\n style=\"font-size: 14px\"\r\n >\r\n Drag here to set row Groups\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"mt-4\" />\r\n\r\n <div class=\"px-3 h-100\">\r\n <div class=\"d-flex gap-3 mb-4\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span>Values</span>\r\n </div>\r\n <div class=\"h-50 d-flex\">\r\n <div\r\n class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\r\n style=\"font-size: 14px\"\r\n >\r\n Drag here aggregate\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<!-- Drag Preview Template -->\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<ng-template #dragPreview let-col>\r\n <div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Drag Placeholder Template -->\r\n<ng-template\r\n #dragPlaceholder\r\n let-col\r\n let-i=\"index\"\r\n let-section=\"section\"\r\n let-draggingInGroupArea=\"draggingInGroupArea\"\r\n>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: { $implicit: col, index: i, section: section }\r\n \"\r\n ></div>\r\n </div>\r\n <div *ngIf=\"draggingInGroupArea\">New Placeholder</div>\r\n</ng-template>\r\n\r\n<!-- Top Group Row Placeholder -->\r\n<ng-template #topGroupingRowPlaceholder let-col let-showChevron=\"showChevron\">\r\n <div class=\"d-flex gap-2\">\r\n <div\r\n class=\"d-flex gap-2 top-row-grouping-placeholder\"\r\n [style.backgroundColor]=\"topGroupedBadgesBackgroundColor\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span>{{ col.header }}</span>\r\n <span\r\n (click)=\"ungroupColumn(col)\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"cursor-pointer data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showChevron\" style=\"opacity: 0.6; font-size: 14px\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template\r\n #childHeaderPlaceholder\r\n let-col\r\n let-pinnedRight=\"pinnedRight\"\r\n let-i=\"index\"\r\n let-sections=\"sections\"\r\n>\r\n <div\r\n class=\"header-cell one-row-header-cells\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n >\r\n <div class=\"d-flex justify-content-between h-100 align-items-center w-100\">\r\n <div\r\n class=\"d-flex justify-content-between w-100\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 d-flex align-items-center\"\r\n [title]=\"col.header\"\r\n [class.w-100]=\"pinnedRight\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n\r\n <div\r\n class=\"position-relative d-flex\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div class=\"three-dots p-1\" style=\"cursor: pointer\">\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n\r\n <div class=\"resize-handle\">\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"showFilterRow\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n class=\"header-cell filter-cell\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n style=\"grid-row: 3\"\r\n >\r\n <div\r\n class=\"header-cell filter-cell\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter\"\r\n [(ngModel)]=\"col.filterValue\"\r\n />\r\n <span\r\n class=\"filter-icon-wrapper\"\r\n (click)=\"activeFilterCell = col; activeCol = null\"\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span\r\n ></span>\r\n\r\n <div\r\n class=\"position-absolute\"\r\n *ngIf=\"activeFilterCell === col\"\r\n style=\"top: 100%; right: 0; z-index: 10; left: 0\"\r\n ></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tableLayout>\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"p-3 shadow rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 320px\"\r\n >\r\n <div class=\"d-flex align-items-center mb-3\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Layout</h6>\r\n </div>\r\n <hr class=\"my-2\" />\r\n <div class=\"w-100 mb-3 d-flex\" role=\"group\">\r\n <input\r\n type=\"radio\"\r\n class=\"btn-check layout-button-check\"\r\n name=\"layoutSize\"\r\n id=\"small\"\r\n autocomplete=\"off\"\r\n (change)=\"changeTableLayout($event, 'small')\"\r\n [checked]=\"selectedTableLayout == 'small'\"\r\n />\r\n <label\r\n class=\"border d-flex flex-column align-items-center layout-button\"\r\n for=\"small\"\r\n [ngStyle]=\"{\r\n color: selectedTableLayout == 'small' ? '#000' : '#727272'\r\n }\"\r\n >\r\n <div class=\"preview-box border mb-1\" style=\"height: 8px\"></div>\r\n Small\r\n </label>\r\n\r\n <input\r\n type=\"radio\"\r\n class=\"btn-check layout-button-check\"\r\n name=\"layoutSize\"\r\n id=\"medium\"\r\n autocomplete=\"off\"\r\n [checked]=\"selectedTableLayout == 'medium'\"\r\n (change)=\"changeTableLayout($event, 'medium')\"\r\n />\r\n <label\r\n class=\"border mx-3 d-flex flex-column align-items-center layout-button\"\r\n for=\"medium\"\r\n [ngStyle]=\"{\r\n color: selectedTableLayout == 'medium' ? '#000' : '#727272'\r\n }\"\r\n >\r\n <div class=\"preview-box border mb-1\" style=\"height: 12px\"></div>\r\n Medium\r\n </label>\r\n\r\n <input\r\n type=\"radio\"\r\n class=\"btn-check layout-button-check\"\r\n name=\"layoutSize\"\r\n id=\"large\"\r\n autocomplete=\"off\"\r\n (change)=\"changeTableLayout($event, 'large')\"\r\n [checked]=\"selectedTableLayout == 'large'\"\r\n />\r\n <label\r\n class=\"border d-flex flex-column align-items-center layout-button\"\r\n for=\"large\"\r\n [ngStyle]=\"{\r\n color: selectedTableLayout == 'large' ? '#000' : '#727272'\r\n }\"\r\n >\r\n <div class=\"preview-box border mb-1\" style=\"height: 16px\"></div>\r\n Large\r\n </label>\r\n </div>\r\n\r\n <hr class=\"my-2\" />\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <span>Show separators</span>\r\n <div class=\"form-check form-switch m-0\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n id=\"separators\"\r\n [(ngModel)]=\"showVerticalBorder\"\r\n (change)=\"onFontChange()\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <span>Row shading</span>\r\n <div class=\"form-check form-switch m-0\">\r\n <input\r\n class=\"form-check-input\"\r\n [(ngModel)]=\"rowShadingEnabled\"\r\n (change)=\"toggleRowShading()\"\r\n type=\"checkbox\"\r\n id=\"rowShading\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tablePreset>\r\n <div\r\n *ngIf=\"activeSubButton !== 'save-preset'\"\r\n (click)=\"$event.stopPropagation();\"\r\n class=\"p-3 shadow rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 280px\"\r\n >\r\n <!-- Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"d-flex align-items-center\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Presets</h6>\r\n </div>\r\n <!-- Save Preset Button with Dropdown -->\r\n <div>\r\n <a\r\n class=\"text-decoration-none btn btn-link\"\r\n type=\"button\"\r\n id=\"savePresetDropdown\"\r\n (click)=\"$event.stopPropagation(); toggleSubActions('save-preset')\"\r\n >\r\n Save Preset\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"mb-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"searchTextPresetTable\"\r\n type=\"search\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Preset List -->\r\n <ng-container\r\n *ngIf=\"\r\n tableView | filter : searchTextPresetTable : 'name' as filteredList\r\n \"\r\n >\r\n <!-- If filteredList exists and none is default -> show fallback -->\r\n <div class=\"\" (click)=\"selectDefault()\">\r\n <div class=\"fw-semibold\">Default View\r\n <span\r\n *ngIf=\"tableFilterViewId === 'default'\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\"\r\n class=\"me-2\"\r\n ></span>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between\">\r\n <small class=\"text-dark\">Created by system</small>\r\n <span\r\n *ngIf=\"tableFilterViewId === 'default'\"\r\n class=\"badge bg-light text-primary ms-2\"\r\n >Default</span\r\n >\r\n <div\r\n class=\"dropdown d-flex justify-content-end\"\r\n *ngIf=\"tableFilterViewId\"\r\n >\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end\">\r\n <a\r\n (click)=\"actionPreset({ id: 'default' }, 'setPreset')\"\r\n class=\"dropdown-item d-flex align-items-center\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/star.svg'\"\r\n class=\"me-2\"\r\n ></span>\r\n Set as default\r\n </a>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <!-- The list: render each table from filteredList -->\r\n <div\r\n class=\"list-group list-group-flush\"\r\n *ngFor=\"let table of filteredList; trackBy: trackByTable\"\r\n >\r\n <!-- Item -->\r\n <div\r\n class=\"list-group-item px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div (click)=\"selectFilter(table)\">\r\n <div class=\"fw-semibold\" style=\"cursor: pointer;\">\r\n {{ table?.name }}\r\n <!-- {{table?.is_temp}} -->\r\n <span\r\n *ngIf=\"table?.is_temp\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n <span\r\n *ngIf=\"table?.is_deafult\"\r\n class=\"badge bg-light text-primary ms-2\"\r\n >Default</span\r\n >\r\n </div>\r\n <small class=\"text-dark\"\r\n >Created {{ formatDate(table?.createdAt) }}</small\r\n >\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center\">\r\n <span\r\n *ngIf=\"table?.is_deafult\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n\r\n <div class=\"dropdown\" *ngIf=\"!table?.is_deafult\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n id=\"dropdownMenuButton2\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end set-default-preset\" aria-labelledby=\"dropdownMenuButton2\">\r\n <a\r\n [class.d-none]=\"confirmDelete\"\r\n (click)=\"actionPreset(table, 'setPreset')\"\r\n class=\"dropdown-item d-flex align-items-center\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/star.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Set as default\r\n </a>\r\n\r\n <!-- Delete with confirmation -->\r\n <ng-container *ngIf=\"!confirmDelete; else confirmBlock\">\r\n <a\r\n (click)=\"confirmDelete = true\"\r\n class=\"dropdown-item d-flex align-items-center text-danger\"\r\n >\r\n <span\r\n style=\"margin-top: -4px\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Delete\r\n </a>\r\n </ng-container>\r\n\r\n <!-- Confirmation block -->\r\n </ul>\r\n <ng-template #confirmBlock>\r\n <div class=\"dropdown-item\"><b>Delete preset</b></div>\r\n <div class=\"dropdown-item text-center\">\r\n <div class=\"mb-2\">\r\n Are you sure you want to delete the <br />\r\n <b>“{{ table?.name }}”</b> preset?\r\n </div>\r\n <button\r\n class=\"btn btn-sm btn-light me-2\"\r\n (click)=\"confirmDelete = false\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-danger delete-preset\"\r\n (click)=\"actionPreset(table, 'deletePreset')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"confirm-preset-delete\"\r\n ></span>\r\n Delete\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Item End Here -->\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"activeSubButton == 'save-preset'\"\r\n class=\"dropdown-menu p-3 badge mt-4 save-preset-dropdown mt-1\"\r\n aria-labelledby=\"savePresetDropdown\"\r\n style=\"min-width: 250px\"\r\n >\r\n <div class=\"fw-bold fs-14px mb-2\">Save preset</div>\r\n <div class=\"fs-14px mb-2\" style=\"line-height: 20px\">\r\n This will save the current table adjustments as a preset.\r\n </div>\r\n <!-- Input -->\r\n <div class=\"mb-2\">\r\n <label for=\"presetName\" class=\"form-label fs-12px fw-bold\"\r\n >Preset Name</label\r\n >\r\n <div class=\"col-12 global-search\">\r\n <input\r\n #presetNameCtrl=\"ngModel\"\r\n required\r\n [(ngModel)]=\"presetName\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n presetNameCtrl.invalid &&\r\n (presetNameCtrl.dirty || presetNameCtrl.touched)\r\n }\"\r\n class=\"form-control form-control-sm ps-2\"\r\n placeholder=\"Enter preset name\"\r\n type=\"text\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Checkbox -->\r\n <div class=\"form-check mb-2\">\r\n <input\r\n class=\"form-check-input\"\r\n [(ngModel)]=\"presetFilter\"\r\n type=\"checkbox\"\r\n id=\"saveFilters\"\r\n />\r\n <label class=\"form-check-label mt-1\" for=\"saveFilters\">\r\n Save active filters\r\n </label>\r\n </div>\r\n\r\n <!-- Save Button -->\r\n <div class=\"d-flex justify-content-center gap-2\" style=\"height: 32px\">\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn border w-100 d-flex align-items-center justify-content-center btn-light\"\r\n (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n style=\"margin-top: -2px\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n [disabled]=\"closeDropdown.preset.loading\"\r\n (click)=\"savePreset(presetNameCtrl)\"\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center\"\r\n >\r\n <span style=\"margin-top: -2px\">\r\n <ng-container *ngIf=\"!closeDropdown.preset.loading && (!tableFilterViewId || tableFilterViewId === 'default')\"\r\n >Save</ng-container\r\n >\r\n <ng-container *ngIf=\"!closeDropdown.preset.loading && tableFilterViewId && tableFilterViewId !== 'default'\"\r\n >Update</ng-container\r\n >\r\n <ng-container *ngIf=\"closeDropdown.preset.loading\"\r\n ><span class=\"spinner-border spinner-border-sm\"></span\r\n ></ng-container>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #showHideColumns>\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"p-3 shadow rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 280px\"\r\n >\r\n <!-- Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"d-flex align-items-center\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Columns</h6>\r\n </div>\r\n <a\r\n (click)=\"resetColumns()\"\r\n href=\"javascript:void(0)\"\r\n class=\"text-primary text-decoration-none\"\r\n >Reset</a\r\n >\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"mb-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"mx-2 position-absolute icon data-grid-svg-icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search column\"\r\n type=\"search\"\r\n [(ngModel)]=\"topShowHideColumns\"\r\n />\r\n </div>\r\n </div>\r\n <!-- Preset List -->\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"\r\n max-height: calc(100vh - 300px);\r\n overflow: auto;\r\n scrollbar-width: thin;\r\n \"\r\n >\r\n <div class=\"muted-text show-hide-table-label d-flex justify-content-between\" *ngIf=\"hasAnyVisibleColumn\">\r\n Show in table\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"show_hide_all\"\r\n class=\"form-check-input\"\r\n [checked]=\"areAllNonMandatoryVisible()\"\r\n (change)=\"toggleAllVisibleColumns()\"\r\n />\r\n <label for=\"show_hide_all\" class=\"form-check-label fw-semibold\">Show/Hide All</label>\r\n </div>\r\n </div>\r\n <!-- <div class=\"d-flex align-items-center mb-2\" *ngIf=\"hasAnyVisibleColumn\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"areAllNonMandatoryVisible()\"\r\n (change)=\"toggleAllVisibleColumns()\"\r\n />\r\n <label class=\"form-check-label fw-semibold\">Show All</label>\r\n </div> -->\r\n <!-- Item -->\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : topShowHideColumns : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div\r\n *ngIf=\"col.is_visible\"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div>\r\n <span\r\n *ngIf=\"!col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\r\n \"\r\n class=\"cursor-grap data-grid-svg-icon\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n <span\r\n *ngIf=\"col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"cursor-grap data-grid-svg-icon\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n </div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"!col?.query?.first_value && !col?.query?._ids?.length && !isMandatory(col)\"\r\n class=\"d-flex align-items-center cursor-pointer\"\r\n (click)=\"toggleColumnVisibility(col, false)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n <div\r\n *ngIf=\"(!col?.query?.first_value && !col?.query?._ids?.length && isMandatory(col)) || (col?.query?.first_value || col?.query?._ids?.length)\"\r\n class=\"d-flex align-items-center\"\r\n style=\"opacity: 0.5\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Item End Here -->\r\n\r\n <div\r\n class=\"dropdown-divider\"\r\n *ngIf=\"hasAnyVisibleColumn && hasAnyInVisibleColumn\"\r\n ></div>\r\n\r\n <!-- <div\r\n class=\"muted-text show-hide-table-label\"\r\n *ngIf=\"hasAnyInVisibleColumn\"\r\n >\r\n Hide in table\r\n </div>\r\n <div class=\"d-flex align-items-center mb-2\" *ngIf=\"hasAnyInVisibleColumn\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"hide_show_all\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"areAllNonMandatoryHidden()\"\r\n (change)=\"toggleAllInvisibleColumns()\"\r\n />\r\n <label class=\"form-check-label fw-semibold\">Hide All</label>\r\n </div> -->\r\n\r\n \r\n\r\n\r\n\r\n <div class=\"muted-text show-hide-table-label d-flex justify-content-between\" *ngIf=\"hasAnyInVisibleColumn\">\r\n Hide in table\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"hide_show_all\"\r\n class=\"form-check-input\"\r\n [checked]=\"areAllNonMandatoryHidden()\"\r\n (change)=\"toggleAllInvisibleColumns()\"\r\n />\r\n <label for=\"hide_show_all\" class=\"form-check-label fw-semibold\">Hide/Show All</label>\r\n </div>\r\n </div>\r\n <div class=\"list-group list-group-flush\">\r\n <ng-container *ngFor=\"let col of columns; trackBy: trackByField\">\r\n <div\r\n *ngIf=\"!col.is_visible\"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div>\r\n <span\r\n *ngIf=\"!col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon cursor-grap\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n <span\r\n *ngIf=\"col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"data-grid-svg-icon cursor-grap\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n </div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"d-flex align-items-center cursor-pointer\"\r\n (click)=\"toggleColumnVisibility(col, true)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Item End Here -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #filterColumns let-col=\"column\">\r\n <div\r\n @slideToggle\r\n *ngIf=\"!isFilterOpen && activeTopButton == 'filter-columns'\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"mb-2 px-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter by\"\r\n type=\"search\"\r\n [(ngModel)]=\"addFilterColumnInput\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 500px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : addFilterColumnInput : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div\r\n (click)=\"openFilter(col)\"\r\n *ngIf=\"\r\n col.is_visible &&\r\n !col?.query?.first_value &&\r\n !col?.query?._ids?.length\r\n \"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div style=\"margin-top: -3px\"></div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown -->\r\n <div\r\n @slideToggle\r\n *ngIf=\"isFilterOpen && selectedColumnForFilter.type == 'dropdown'\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"px-3 my-2 border-below py-1 pb-2 mb-3 d-flex ps-1\">\r\n <span\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span\r\n ><b>{{ selectedColumnForFilter?.header }}</b>\r\n </div>\r\n <div class=\"mb-2 px-3\">\r\n <div\r\n class=\"col-12 global-search position-relative border rounded d-flex align-items-center flex-wrap px-2 filter-serach-inpt\"\r\n >\r\n <span\r\n *ngFor=\"let selected of selectedFilterOptions\"\r\n class=\"badge d-flex align-items-center gap-1 me-1 mb-1\"\r\n >\r\n {{ selected?.value ? selected.value : selected }}\r\n <span\r\n (click)=\"toggleSelectionInFilter(selected)\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </span>\r\n <input\r\n class=\"form-control form-control-sm border-0 flex-grow-1\"\r\n style=\"padding: 0\"\r\n [placeholder]=\"selectedFilterOptions!.length ? '' : 'Filter by'\"\r\n type=\"search\"\r\n [(ngModel)]=\"searchTextForFilterDropDown\"\r\n (keydown.backspace)=\"handleBackspace($event)\"\r\n (ngModelChange)=\"selectedFilterOptions.length === 0 ? condition = 'none' : null\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 600px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of selectedColumnForFilter.column_dropdown_value\r\n | filter : searchTextForFilterDropDown : 'value';\r\n let i = index\r\n \"\r\n >\r\n <div\r\n class=\"list-group-item border-0 px-2 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"i\"\r\n [checked]=\"currentFilterSelectedIds.has(col.id || col._id || col)\"\r\n (change)=\"toggleSelectionInFilter(col)\"\r\n />\r\n <label class=\"form-check-label fw-semibold\" [for]=\"i\">\r\n {{ col?.value || col?.name || col }}\r\n </label>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div\r\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n style=\"height: 38px\"\r\n >\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n (click)=\"$event.stopPropagation(); resetFilterChanges()\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n (click)=\"applyDropdownFilter()\"\r\n >\r\n <span style=\"margin-top: -2px\">Save</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For Text fields and number fields-->\r\n\r\n <div\r\n @slideToggle\r\n *ngIf=\"\r\n isFilterOpen &&\r\n (selectedColumnForFilter.type == 'string' ||\r\n selectedColumnForFilter.type == 'number' ||\r\n selectedColumnForFilter.type == 'date')\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"px-3 border-below py-1 pb-2 d-flex ps-1\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span\r\n ><b>{{ selectedColumnForFilter?.header }}</b>\r\n </div>\r\n <div class=\"col-12 position-relative p-2 text-filter\">\r\n <div class=\"mb-2\">\r\n <select\r\n class=\"form-select form-select-sm custom-select\"\r\n [(ngModel)]=\"firstCondition\"\r\n >\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n <div class=\"mb-2\">\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Enter first value\"\r\n [type]=\"\r\n selectedColumnForFilter.type == 'string'\r\n ? 'text'\r\n : selectedColumnForFilter.type\r\n \"\r\n [(ngModel)]=\"firstValue\"\r\n [min]=\"selectedColumnForFilter.type == 'number' ? 0 : null\"\r\n [class.number-input]=\"selectedColumnForFilter.type == 'number'\"\r\n (input)=\"selectedColumnForFilter.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (ngModelChange)=\"!firstValue ? condition = 'none' : null\"\r\n (keydown)=\"selectedColumnForFilter.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n />\r\n </div>\r\n <div class=\"d-flex my-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n id=\"logicalAnd\"\r\n name=\"logicalOperator\"\r\n value=\"and\"\r\n [(ngModel)]=\"condition\"\r\n />\r\n <label class=\"form-check-label\" for=\"logicalAnd\">AND</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n id=\"logicalOr\"\r\n name=\"logicalOperator\"\r\n value=\"or\"\r\n [(ngModel)]=\"condition\"\r\n />\r\n <label class=\"form-check-label\" for=\"logicalOr\">OR</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n id=\"logicalNone\"\r\n name=\"logicalOperator\"\r\n value=\"none\"\r\n [(ngModel)]=\"condition\"\r\n />\r\n <label class=\"form-check-label\" for=\"logicalNone\">None</label>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"firstValue && condition !== 'none'\">\r\n <div class=\"my-3\">\r\n <!-- Second condition select -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"secondCondition\"\r\n >\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <!-- Second value input -->\r\n <input\r\n [type]=\"\r\n selectedColumnForFilter.type == 'string'\r\n ? 'text'\r\n : selectedColumnForFilter.type\r\n \"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Enter second value\"\r\n [(ngModel)]=\"secondValue\"\r\n [min]=\"selectedColumnForFilter.type == 'number' ? 0 : null\"\r\n [class.number-input]=\"selectedColumnForFilter.type == 'number'\"\r\n (input)=\"selectedColumnForFilter.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"selectedColumnForFilter.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n style=\"height: 38px\"\r\n >\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n (click)=\"$event.stopPropagation(); resetTextFilterChanges()\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n (click)=\"applyDropdownFilter()\"\r\n >\r\n <span style=\"margin-top: -2px\">Save</span>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Edit dropdown here -->\r\n<ng-template let-col>\r\n <div class=\"drop-down-edit\"></div>\r\n</ng-template>\r\n\r\n<ng-template\r\n #fullTextTemplate\r\n let-row=\"row\"\r\n let-col=\"col\"\r\n let-isArray=\"isArray\"\r\n>\r\n <div\r\n class=\"full-text-box\"\r\n (dblclick)=\"$event.stopPropagation(); $event.preventDefault();\"\r\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\r\n >\r\n <ng-container *ngIf=\"!isEditing(row, col)\">\r\n <div\r\n *ngIf=\"!isArray\"\r\n class=\"full-text-content\"\r\n (dblclick)=\"$event.stopPropagation(); $event.preventDefault(); enableEdit(row, col)\"\r\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\r\n >\r\n {{\r\n getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field)\r\n }}\r\n </div>\r\n <div *ngIf=\"isArray\">\r\n <ul>\r\n <ng-container\r\n *ngFor=\"let item of getNestedValue(row, col.field); let i = index\"\r\n >\r\n <li *ngIf=\"i !== 0\">\r\n <ng-container>\r\n {{ item?.department_name || item?.roleName || \"-\" }}\r\n </ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"isEditing(row, col)\">\r\n <textarea\r\n #textModel=\"ngModel\"\r\n rows=\"4\"\r\n #textAreadInput\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n (blur)=\"disableEdit(row, col, textModel)\"\r\n (keydown.enter)=\"textAreadInput.blur()\"\r\n autofocus\r\n class=\"form-control\"\r\n [ngClass]=\"{\r\n 'is-invalid': textModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n ></textarea>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultImagePlaceholder let-row=\"row\" let-col=\"col\">\r\n <span\r\n class=\"px-2 d-flex align-items-center w-100 cell-content image-placeholder cursor-pointer position-relative\"\r\n [title]=\"getEmployeeNameTitle(row)\"\r\n (click)=\"onEmployeeClick(row)\"\r\n >\r\n <!-- Blue dot for manual logs -->\r\n <span\r\n *ngIf=\"row?.manually_logs && row.manually_logs.length > 0\"\r\n class=\"manual-logs-indicator\"\r\n (mouseenter)=\"openManualLogsModal($event, row)\"\r\n (mouseleave)=\"closeManualLogsModal()\"\r\n ></span>\r\n <ng-container\r\n *ngIf=\"\r\n row?.User?.logo || row?.User?.profile_pictures?.length || row?.logo || row?.profile_pictures?.length || row?.assetImage || row?.invoice?.invoice_image;\r\n else placeholder\r\n \"\r\n >\r\n <span class=\"pic\">\r\n <img\r\n [width]=\"rowHeight - 12\"\r\n [height]=\"rowHeight - 12\"\r\n [src]=\"row?.User?.profile_pictures?.[4]?.path || row?.User?.logo || row?.profile_pictures?.[4]?.path || row?.logo || row?.assetImage || row?.invoice?.invoice_image\"\r\n alt=\"icon\"\r\n />\r\n </span>\r\n </ng-container>\r\n\r\n <ng-template #placeholder>\r\n <span\r\n [ngClass]=\"getDynamicClass(row?.User?.full_name || row?.full_name || row?.name)\"\r\n class=\"pic d-flex align-items-center rounded-circle\"\r\n [style.width.px]=\"rowHeight - 12\"\r\n [style.height.px]=\"rowHeight - 12\"\r\n [style.fontSize.px]=\"rowHeight / 3\"\r\n >\r\n {{ getInitials(row?.User?.full_name || row?.full_name) }}\r\n </span>\r\n </ng-template>\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Cell Content Template for Card View -->\r\n<ng-template #cellContent let-row=\"row\" let-parentRow=\"parentRow\" let-col=\"col\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <!-- String/Text -->\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n\r\n <!-- Number -->\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n\r\n <!-- Date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) ? formatDate(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) : '-' }}\r\n </ng-container>\r\n\r\n <!-- Time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n {{ (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) !== null && (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) !== undefined ? formatTime(getTimeValue(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field))) : '-' }}\r\n </ng-container>\r\n\r\n <!-- Boolean -->\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <span class=\"badge\" [class]=\"(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === true || getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === 'true') ? 'badge-success' : 'badge-secondary'\">\r\n {{ (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === true || getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === 'true') ? 'Yes' : 'No' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- <div *ngSwitchCase=\"'is_payroll_processed'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" >\r\n <span class=\"popover__wrapper\" >none\r\n {{ row.is_payroll_processed ? 'Yes' : 'No' }}\r\n </span>\r\n </div> -->\r\n\r\n <!-- Status -->\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field))\">\r\n {{ transformStatus(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) || '-' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Array -->\r\n <ng-container *ngSwitchCase=\"'array'\">\r\n <ng-container *ngIf=\"isArray(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field))\">\r\n <ng-container *ngIf=\"col.field === 'breaks' || col.header?.toLowerCase().includes('break')\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || [])\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onBadgeOverflowCountClick(col)\">\r\n </app-badge-overflow>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(col.field === 'breaks' || col.header?.toLowerCase().includes('break'))\">\r\n {{ (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || []).length }} items\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!isArray(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field))\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Default -->\r\n <ng-container *ngSwitchDefault>\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Right Click Menue -->\r\n<div\r\n [class.invisible]=\"!positionedYet\"\r\n class=\"context-menu p-2\"\r\n *ngIf=\"actionHide && actions?.length\"\r\n [ngStyle]=\"{ 'top.px': yPos, 'left.px': xPos }\"\r\n [class.show]=\"isVisible\"\r\n appendTo=\"body\"\r\n>\r\n <ul>\r\n <li\r\n *ngFor=\"let action of actions\"\r\n class=\"rounded d-flex align-items-center\"\r\n (click)=\"onActionClick(action)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/' + action + '.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n <span class=\"text-capitalize fw-500\">{{ action }}</span>\r\n </li>\r\n </ul>\r\n</div>\r\n\r\n<!-- Details Toggle from bottom -->\r\n<div\r\n [style.bottom.px]=\"footerRowHeight + 50\"\r\n *ngIf=\"selectedRows.size > 0 && showTaskbar\"\r\n class=\"taskbar\"\r\n>\r\n <div class=\"selected-rows-action-bar\" [@slideUp]>\r\n <span class=\"selected-count\">\r\n {{ selectedRows.size }} selected of\r\n {{ config?.paginationParams?.totalItems }} Total\r\n </span>\r\n <div class=\"action-buttons\">\r\n <ng-container *ngFor=\"let action of taskbarActions; let i = index\">\r\n <span\r\n class=\"action-btn verified btn {{ action }}\"\r\n (click)=\"action === 'Export' ? onExportClick() : action === 'Delete' ? onDeleteClick() : onVerifyClick(action)\"\r\n >{{ action }}</span\r\n >\r\n <span\r\n *ngIf=\"taskbarActions.length > 1 && i !== taskbarActions.length - 1\"\r\n class=\"separator\"\r\n >|</span\r\n >\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Row Choose Columns Modal -->\r\n<div *ngIf=\"showDetailColumnPanel\" class=\"custom-modal-overlay\">\r\n <div\r\n class=\"custom-modal-content\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"detailModalColumnPannel\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Short Leave Tooltip Modal -->\r\n<div *ngIf=\"showShortLeaveTooltipModal\" \r\n class=\"custom-break-tooltips\" \r\n [style.--tooltip-x.px]=\"shortLeaveTooltipPosition.x\" \r\n [style.--tooltip-y.px]=\"shortLeaveTooltipPosition.y\"\r\n (mouseenter)=\"preventShortLeaveTooltipHide()\" \r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-striped text-dark\">\r\n <thead>\r\n <tr>\r\n <th>Leave Type</th>\r\n <th>Start Time</th>\r\n <th>End Time</th>\r\n <th>Duration (min)</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of currentShortLeaveData\">\r\n <td>{{ item.leave_type || 'N/A' }}</td>\r\n <td>{{ item.star_time || 'N/A' }}</td>\r\n <td>{{ item.end_time || 'N/A' }}</td>\r\n <td>{{ item.minutes || 'N/A' }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Tooltip for accordion manual logs -->\r\n<!-- Tooltip for accordion manual logs -->\r\n<div *ngIf=\"showManualLogsTooltipModal\" class=\"custom-break-tooltips\"\r\n [style.--tooltip-x.px]=\"manualLogsTooltipPosition.x\"\r\n [style.--tooltip-y.px]=\"manualLogsTooltipPosition.y\"\r\n (mouseenter)=\"preventManualLogsTooltipHide()\"\r\n (mouseleave)=\"hideManualLogsTooltip()\">\r\n\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-striped text-dark\">\r\n <thead>\r\n <tr>\r\n <th>Name</th>\r\n <th>Date/Time</th>\r\n <th>Previous</th>\r\n <th>Updated</th>\r\n <th>Status</th>\r\n <th>Remarks</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let item of selectedManualLogs; let i = index\">\r\n <tr>\r\n <td>{{ item?.updated_by?.full_name || selectedManualLogsRow?.User?.full_name }}</td>\r\n <td>{{ item?.log_date && item.log_date !== '--' ? formatDate(item.log_date) : (selectedManualLogsRow?.attendanceDate && selectedManualLogsRow.attendanceDate !== '--' ? formatDate(selectedManualLogsRow.attendanceDate) : '-') }}</td>\r\n <td>{{ formatLogState(item?.log_details?.previous_state) }}</td>\r\n <td>{{ formatLogState(item?.log_details?.updated_state) }}</td>\r\n <td>{{ item?.log_details?.status ? transformStatus(item.log_details.status) : (item.log_details?.status || '-') }}</td>\r\n <td>{{ item?.log_details?.remarks || item?.remarks || selectedManualLogsRow?.message || '-' }}</td>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Fallback for empty manual logs -->\r\n <tr *ngIf=\"!selectedManualLogs || selectedManualLogs.length === 0\">\r\n <td colspan=\"6\" class=\"text-center\">No manual logs available</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n<!-- </div> -->\r\n\r\n<ng-template #detailModalColumnPannel>\r\n <div class=\"column-panel-header\">\r\n <div\r\n class=\"d-flex justify-content-between align-items-center px-2 ps-3 rounded-top-2 moda-header\"\r\n [style.height.px]=\"48\"\r\n >\r\n Choose Detail Columns\r\n <span class=\"filter-icon-wrapper\" (click)=\"closeDetailColumnPanel()\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </span>\r\n </div>\r\n <hr class=\"my-0\" />\r\n <div>\r\n <div class=\"d-flex align-items-center px-2 pe-3\" [style.height.px]=\"48\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allDetailColumnsSelected()\"\r\n (change)=\"toggleAllDetailColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search detail columns...\"\r\n [(ngModel)]=\"choseColumnsSearch\"\r\n />\r\n </div>\r\n <hr class=\"mt-0 mb-1\" />\r\n <div class=\"px-2 overlay-scrollable\">\r\n <ng-container\r\n *ngFor=\"\r\n let col of (currentDetailRowForColumnSelection?.details?.columns || [])\r\n | filter : choseColumnsSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"col.is_visible !== false\"\r\n (change)=\"toggleDetailColumnVisibility(col, !col.is_visible)\"\r\n [id]=\"'detail_col_' + col.field\"\r\n />\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'detail_col_' + col.field\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span class=\"text-truncate\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- <div class=\"px-3 py-2 border-top d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link\" (click)=\"resetDetailColumnsInModal()\">Reset</button>\r\n </div> -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/*\r\n * Public API Surface of ms-time-sheet\r\n */\r\n\r\nexport * from './lib/ms-time-sheet.service';\r\nexport * from './lib/ms-time-sheet.component';\r\nexport * from './lib/services/common.service'\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.CommonService"],"mappings":"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"}
1
+ {"version":3,"file":"ms-time-sheet.mjs","sources":["../../../projects/ms-time-sheet/src/lib/ms-time-sheet.service.ts","../../../projects/ms-time-sheet/src/lib/services/split-columns.service.ts","../../../projects/ms-time-sheet/src/lib/services/common.service.ts","../../../projects/ms-time-sheet/src/lib/badges.ts","../../../projects/ms-time-sheet/src/lib/services/copy-service.service.ts","../../../projects/ms-time-sheet/src/lib/pipes/filter.pipe.ts","../../../projects/ms-time-sheet/src/lib/pipes/pinned-columns.pipe.ts","../../../projects/ms-time-sheet/src/lib/pipes/timezone-format.pipe.ts","../../../projects/ms-time-sheet/src/lib/components/badge-overflow/badge-overflow.component.ts","../../../projects/ms-time-sheet/src/lib/components/badge-overflow/badge-overflow.component.html","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.ts","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.html","../../../projects/ms-time-sheet/src/public-api.ts","../../../projects/ms-time-sheet/src/ms-time-sheet.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MsTimeSheetService {\r\n\r\n constructor() { }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SplitColumnsService {\r\n prepareColumns(columns: any[], containerWidth: number): any {\r\n const left: any[] = [];\r\n const center: any[] = [];\r\n const right: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const leftChildren: any[] = [];\r\n const centerChildren: any[] = [];\r\n const rightChildren: any[] = [];\r\n\r\n for (const child of col.children) {\r\n if (child.is_visible === false) continue;\r\n\r\n const pinned = child.pinned ?? col.pinned ?? null;\r\n const childWithPinned = { ...child, pinned };\r\n\r\n if (pinned === 'left') leftChildren.push(childWithPinned);\r\n else if (pinned === 'right') rightChildren.push(childWithPinned);\r\n else centerChildren.push(childWithPinned);\r\n }\r\n\r\n if (leftChildren.length) {\r\n left.push({ header: col.header, children: leftChildren, id: col?.id || col?._id });\r\n }\r\n if (centerChildren.length) {\r\n center.push({\r\n header: col.header,\r\n children: centerChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n if (rightChildren.length) {\r\n right.push({\r\n header: col.header,\r\n children: rightChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n } else if (col.is_visible !== false) {\r\n const pinned = col.pinned ?? null;\r\n if (pinned === 'left') left.push(col);\r\n else if (pinned === 'right') right.push(col);\r\n else center.push(col);\r\n }\r\n }\r\n\r\n return { left, center, right };\r\n }\r\n\r\n setColumnsQuery(columns: any[]) {\r\n for (const col of columns) {\r\n // if (col.children?.length) {\r\n // for (const child of col.children) {\r\n // if (!child?.query?.firt_value && !child?.query?._ids?.length) {\r\n // child['query'] = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n // }\r\n // }\r\n // if (!col?.query?.firt_value && !col?.query?._ids?.length) {\r\n // col.query = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n }\r\n\r\n console.log('Updated Columns: ', columns);\r\n\r\n return columns;\r\n }\r\n\r\n assignDefaultWidths(columns: any[], containerWidth: number): any[] {\r\n const visibleLeafCols = this.getVisibleLeafColumns(columns);\r\n\r\n if (!visibleLeafCols.length) return columns;\r\n\r\n let defaultWidth = Math.floor(containerWidth / visibleLeafCols.length);\r\n if (defaultWidth < 80) defaultWidth = 80;\r\n\r\n const cloneColumns = (cols: any[]): any[] =>\r\n cols.map((col) => {\r\n if (col.children?.length) {\r\n const newChildren = col.children.map((child: any) => {\r\n // If visible → dynamic default width\r\n // If invisible → fixed 150px\r\n if (!child.width) {\r\n if (child.is_visible === false) {\r\n return { ...child, width: 150 };\r\n } else {\r\n return { ...child, width: defaultWidth };\r\n }\r\n }\r\n return { ...child };\r\n });\r\n\r\n return { ...col, children: newChildren };\r\n }\r\n\r\n if (!col.width) {\r\n if (col.is_visible === false) {\r\n return { ...col, width: 150 };\r\n } else {\r\n return { ...col, width: defaultWidth };\r\n }\r\n }\r\n\r\n return { ...col };\r\n });\r\n\r\n return cloneColumns(columns);\r\n}\r\n\r\n\r\n private getVisibleLeafColumns(columns: any[]): any[] {\r\n const result: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const visibleChildren = col.children.filter(\r\n (c: any) => c.is_visible !== false\r\n );\r\n result.push(...visibleChildren);\r\n } else if (col.is_visible !== false) {\r\n result.push(col);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { EventEmitter, Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommonService {\r\n\r\n constructor() { }\r\n gethasVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n gethasInVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (!col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n\r\n getTotalColumnsLength(columns: any[]): number {\r\n let count = 0;\r\n\r\n columns.forEach(col => {\r\n if (col.children && Array.isArray(col.children) && col.children.length) {\r\n count += col.children.length; // count children instead of parent\r\n } else {\r\n count += 1; // count parent directly\r\n }\r\n });\r\n\r\n return count;\r\n }\r\n\r\n gethasRightPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'right' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n gethasLeftPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'left' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n\r\n getExpandedRowCount(data: any[]): number {\r\n let groupCount = 0;\r\n let rowCount = 0;\r\n\r\n data.forEach(group => {\r\n if (group?.isGroup) {\r\n groupCount++;\r\n\r\n if (group?.isExpand && Array.isArray(group?.children)) {\r\n group.children.forEach((child: any) => {\r\n if (child.isGroup) {\r\n if (child.isExpand && Array.isArray(child.children)) {\r\n rowCount += child.children.length;\r\n }\r\n } else {\r\n rowCount++;\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (groupCount === 0) {\r\n return data.length;\r\n }\r\n\r\n return groupCount + rowCount;\r\n }\r\n\r\n\r\ngetFiltersFromColumns(columns: any[], filtersConfig:any []): any[] {\r\n const result: any[] = [];\r\n \r\n const checkColumn = (col: any) => {\r\n const hasFirstValue = col.query?.first_value != null && col.query?.first_value !== \"\" && filtersConfig.some((ele)=> ele.field == col.field);\r\n const hasIds = Array.isArray(col.query?._ids) && col.query._ids.length > 0 && filtersConfig.some((ele)=> ele.field == col.field);\r\n if (hasFirstValue || hasIds) {\r\n result.push({\r\n search: col.search ?? \"\",\r\n field: col.field,\r\n type: col.type,\r\n _ids: col.type == 'dropdown'? col.query?._ids: [],\r\n query: col.type == 'dropdown'? null : (col?.query?.first_value ? col?.query : null)\r\n });\r\n }\r\n \r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n col.children.forEach(checkColumn);\r\n }\r\n };\r\n columns.forEach(checkColumn);\r\n \r\n return result;\r\n}\r\n\r\nasync applyFiltersToColumns(columns: any[], filters: any[]): Promise<any[]> {\r\n \r\n for (const col of columns) {\r\n if (!col.query) {\r\n col.query = {\r\n first_value: null,\r\n second_value: null,\r\n first_condition: 'contain',\r\n second_condition: null,\r\n condition: 'none',\r\n _ids: []\r\n };\r\n }\r\n\r\n const filter = filters.find(f => f.field === col.field);\r\n\r\n if (filter) {\r\n if (col.type === 'dropdown') {\r\n col.filterValue = filter._ids ?? [];\r\n col.search = filter.search ?? '';\r\n col.query._ids = filter._ids ?? [];\r\n } else {\r\n col.filterValue = filter.search ?? null;\r\n col.search = filter.search ?? '';\r\n col.query.first_value = filter.query?.first_value ?? null;\r\n col.query.second_value = filter.query?.second_value ?? null;\r\n col.query.first_condition = filter.query?.first_condition ?? 'contain';\r\n col.query.second_condition = filter.query?.second_condition ?? 'contain';\r\n col.query.condition = filter.query?.condition ?? 'none';\r\n }\r\n }\r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n col.children = await this.applyFiltersToColumns(col.children, filters);\r\n }\r\n }\r\n return columns;\r\n}\r\n\r\n\r\n public globalSearch: EventEmitter<any> = new EventEmitter<any>();\r\n private userData: any = null;\r\n \r\n\r\n \r\n setUserData(user: any) {\r\n this.userData = user;\r\n }\r\n \r\n formatDateTimeWithPrefs() {\r\n let lsUser = this.userData;\r\n let timeZone = lsUser?.business_id?.time_zone ? lsUser?.business_id?.time_zone : 'UTC';\r\n let dateFormat = lsUser?.date_format ? this.convertMomentToAngularDateFormat(lsUser.date_format) : 'MM/dd/yyyy';\r\n let timeFormat = !lsUser?.business_id?.is_24_hour_format ? 'h:mm a' : 'H:mm';\r\n return {timeZone, dateFormat, timeFormat};\r\n }\r\n\r\n private convertMomentToAngularDateFormat(momentFormat: string): string {\r\n // Convert moment.js date format to Angular DatePipe format\r\n return momentFormat\r\n .replace(/DD/g, 'dd') // Day of month: DD -> dd\r\n .replace(/YYYY/g, 'yyyy') // Year: YYYY -> yyyy\r\n .replace(/YY/g, 'yy') // Year: YY -> yy\r\n .replace(/MM/g, 'MM') // Month: MM -> MM (same)\r\n .replace(/M/g, 'M') // Month: M -> M (same)\r\n .replace(/HH/g, 'HH') // Hour 24: HH -> HH (same)\r\n .replace(/H/g, 'H') // Hour 24: H -> H (same)\r\n .replace(/hh/g, 'h') // Hour 12: hh -> h\r\n .replace(/h/g, 'h') // Hour 12: h -> h (same)\r\n .replace(/mm/g, 'mm') // Minute: mm -> mm (same)\r\n .replace(/m/g, 'm') // Minute: m -> m (same)\r\n .replace(/ss/g, 'ss') // Second: ss -> ss (same)\r\n .replace(/s/g, 's') // Second: s -> s (same)\r\n .replace(/A/g, 'a') // AM/PM: A -> a\r\n .replace(/a/g, 'a'); // AM/PM: a -> a (same)\r\n }\r\n \r\n\r\n\r\nactiveFilteredColumns: any[] = [];\r\nupdateActiveFilteredColumns(columns: any[]): any[] {\r\n const collectFiltered = (cols: any[]): any[] => {\r\n let result: any[] = [];\r\n\r\n for (let i = 0; i < cols.length; i++) {\r\n const col = cols[i];\r\n if (col.children && col.children.length > 0) {\r\n result = result.concat(collectFiltered(col.children));\r\n }\r\n\r\n if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0;\r\n\r\n const hasValueFilter =\r\n (col.query.first_value && col.query.first_value !== '') ||\r\n (col.query.second_value && col.query.second_value !== '');\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n }\r\n return result;\r\n };\r\n this.activeFilteredColumns = [...collectFiltered(columns)];\r\n return this.activeFilteredColumns;\r\n}\r\n\r\n\r\n\r\nhasFieldChanged(current: any, original: any, type: string): boolean {\r\n switch (type) {\r\n case 'number':\r\n return Number(current) !== Number(original);\r\n\r\n case 'string':\r\n return String(current || '') !== String(original || '');\r\n\r\n case 'dropdown':\r\n if (typeof current === 'object' && typeof original === 'object') {\r\n return current?.id !== original?.id || current?.value !== original?.value;\r\n }\r\n return current !== original;\r\n\r\n case 'boolean':\r\n return Boolean(current) !== Boolean(original);\r\n\r\n case 'date':\r\n const currentDate = new Date(current).getTime();\r\n const originalDate = new Date(original).getTime();\r\n return isNaN(currentDate) || isNaN(originalDate)\r\n ? current !== original\r\n : currentDate !== originalDate;\r\n\r\n default:\r\n return JSON.stringify(current) !== JSON.stringify(original);\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","export const BADGES_MAP: { [key: string]: string } = {\r\n // Success – Green\r\n 'active': 'badge-success',\r\n 'approved': 'badge-success',\r\n 'accepted': 'badge-success',\r\n 'completed': 'badge-success',\r\n 'evaluated': 'badge-success',\r\n 'assigned': 'badge-success',\r\n 'scrap': 'badge-success',\r\n 'move-available': 'badge-success',\r\n 'move-assigned': 'badge-success',\r\n 'present': 'badge-success',\r\n 'ontime': 'badge-success',\r\n 'ontimeout': 'badge-success',\r\n 'OnTimeOut': 'badge-success',\r\n 'clocked_in': 'badge-success',\r\n 'clocked in': 'badge-success',\r\n\r\n // Warning – Yellow/Amber\r\n 'contract': 'badge-warning',\r\n 'warranty': 'badge-warning',\r\n 'scheduled': 'badge-warning',\r\n 'leased': 'badge-warning',\r\n 'disposed': 'badge-warning',\r\n 'maintenance': 'badge-warning',\r\n 'assigning start': 'badge-warning',\r\n 'evaluation start': 'badge-warning',\r\n 'to be start assigning': 'badge-warning',\r\n 'pending': 'badge-warning',\r\n 'leave': 'badge-info',\r\n 'Leave': 'badge-info',\r\n 'on leave': 'badge-info',\r\n 'earlyin': 'badge-warning',\r\n 'EarlyIn': 'badge-warning',\r\n 'earlyout': 'badge-warning',\r\n 'EarlyOut': 'badge-warning',\r\n 'lateness': 'badge-warning',\r\n 'Lateness': 'badge-warning',\r\n 'onshortleave': 'badge-warning',\r\n 'OnShortLeave': 'badge-warning',\r\n\r\n // Danger – Red\r\n 'inactive': 'badge-danger',\r\n 'rejected': 'badge-danger',\r\n 'unassigned': 'badge-danger',\r\n 'trashed': 'badge-danger',\r\n 'onhold': 'badge-danger',\r\n 'assigning stop': 'badge-danger',\r\n 'evaluation stop': 'badge-danger',\r\n 'unavailable': 'badge-danger',\r\n 'move-error': 'badge-danger',\r\n 'failed': 'badge-danger',\r\n 'absent': 'badge-danger',\r\n 'Absent': 'badge-danger',\r\n 'misspunchout': 'badge-danger',\r\n 'MissPunchOut': 'badge-danger',\r\n 'lateout': 'badge-danger',\r\n 'LateOut': 'badge-danger',\r\n\r\n // Info – Blue\r\n 'insurance': 'badge-info',\r\n 'pastdue': 'badge-info',\r\n 'publicholiday': 'badge-info',\r\n 'publicHoliday': 'badge-info',\r\n 'holiday': 'badge-info',\r\n\r\n // Dark – Neutral/Other\r\n 'expired': 'badge-secondary',\r\n 'draft': 'badge-secondary',\r\n 'clocked_out': 'badge-secondary',\r\n 'clocked out': 'badge-secondary',\r\n 'block': 'badge-secondary',\r\n 'Block': 'badge-secondary'\r\n};\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CopyServiceService {\r\n\r\n constructor() { }\r\n getSelectedDataForCopy(\r\n dataSet: any[],\r\n columns: any[],\r\n rowSelectedIndexes: Set<number>,\r\n selectedCells: any[],\r\n getNestedValue: (obj: any, path: string) => any\r\n ): any[][] {\r\n const copiedRows: any[][] = [];\r\n const findRowByVirtualIndex = (vIndex: number) =>\r\n dataSet.find((r: any) => r.__virtualIndex === vIndex);\r\n if (rowSelectedIndexes && rowSelectedIndexes.size > 0) {\r\n const sortedIndexes = [...rowSelectedIndexes].sort((a, b) => a - b);\r\n for (const vIndex of sortedIndexes) {\r\n const row = findRowByVirtualIndex(vIndex);\r\n if (!row) continue;\r\n const extractValue = (field: string): string => {\r\n const nested = getNestedValue(row, field);\r\n const value =\r\n nested?.value ??\r\n nested?.name ??\r\n nested ??\r\n '-';\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map(v =>\r\n typeof v === 'object'\r\n ? (v.departmentName ?? v.roleName ?? '')\r\n : (v?.toString() ?? '')\r\n )\r\n .join(', ');\r\n }\r\n return value ?? '';\r\n };\r\n const mapped = columns.map(col => {\r\n if (col.children && Array.isArray(col.children)) {\r\n return col.children.map((c: { field: string }) => extractValue(c.field));\r\n }\r\n return [extractValue(col.field)];\r\n });\r\n const rowValues = mapped.reduce<string[]>((acc, curr) => acc.concat(curr), []);\r\n copiedRows.push(rowValues);\r\n }\r\n }\r\n if (selectedCells && selectedCells.length > 0) {\r\n const rowsMap = new Map<number, any[]>();\r\n for (const cell of selectedCells) {\r\n const row = findRowByVirtualIndex(cell.rowIndex);\r\n if (!row) continue;\r\n const col = columns[cell.colIndex];\r\n let fieldName = col?.field;\r\n if (col?.children && col.children[cell.subColIndex]) {\r\n fieldName = col.children[cell.subColIndex].field;\r\n }\r\n let value = getNestedValue(row, fieldName) || getNestedValue(row, fieldName)?.name || getNestedValue(row, fieldName) || '-';\r\n if (Array.isArray(value)) {\r\n value = value\r\n .map(v =>\r\n typeof v === 'object'\r\n ? v.departmentName ?? v.roleName ?? ''\r\n : v?.toString() ?? ''\r\n )\r\n .join(', ');\r\n } else {\r\n value = value ?? '';\r\n }\r\n if (!rowsMap.has(cell.rowIndex)) rowsMap.set(cell.rowIndex, []);\r\n rowsMap.get(cell.rowIndex)!.push(value);\r\n }\r\n const sortedCells = [...rowsMap.entries()]\r\n .sort(([a], [b]) => a - b)\r\n .map(([_, v]) => v);\r\n copiedRows.push(...sortedCells);\r\n }\r\n if (copiedRows.length === 0) {\r\n const activeCell = document.querySelector('.active-cell');\r\n if (activeCell) return [[activeCell.textContent?.trim() || '']];\r\n }\r\n\r\n const maxCols = copiedRows.reduce((max, row) => Math.max(max, row.length), 0);\r\n return copiedRows.map(row => {\r\n const newRow = [...row];\r\n while (newRow.length < maxCols) newRow.push('');\r\n return newRow;\r\n });\r\n }\r\n\r\n\r\n copyToClipboard(\r\n selectedData: any[][],\r\n selector = '.selected-cell, .active-cell, .row-selected'\r\n ): void {\r\n if (!selectedData || selectedData.length === 0) return;\r\n const textToCopy = selectedData\r\n .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\r\n .join('\\n');\r\n navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\r\n const selectedEls = document.querySelectorAll(selector);\r\n selectedEls.forEach(el => el.classList.add('flash-bg'));\r\n setTimeout(() => {\r\n selectedEls.forEach(el => el.classList.remove('flash-bg'));\r\n }, 1000);\r\n }\r\n\r\n\r\n updateRows: any[] = [];\r\n async pasteFromClipboardText(\r\n text: string,\r\n dataSet: any[],\r\n columns: any[],\r\n startRowIndex: number,\r\n startColIndex: number,\r\n startSubColIndex: number = 0\r\n ): Promise<any[]> {\r\n if (!text) return [];\r\n this.updateRows = [];\r\n const rows = text.split(/\\r?\\n/).map(r => r.split('\\t'));\r\n const flattenedColumns: any[] = [];\r\n columns.forEach(col => {\r\n if (col.children?.length) {\r\n col.children.forEach((child: any) => flattenedColumns.push({ parent: col, ...child }));\r\n } else {\r\n flattenedColumns.push(col);\r\n }\r\n });\r\n let startFlattenedIndex = 0;\r\n for (let i = 0; i < startColIndex; i++) {\r\n const col = columns[i];\r\n startFlattenedIndex += col.children?.length || 1;\r\n }\r\n const startCol = columns[startColIndex];\r\n if (startCol?.children?.length) {\r\n startFlattenedIndex += Math.min(startSubColIndex, startCol.children.length - 1);\r\n }\r\n\r\n rows.forEach((rowValues, rOffset) => {\r\n const targetRowIndex = startRowIndex + rOffset;\r\n const row = dataSet.find(r => r?.__virtualIndex === targetRowIndex);\r\n if (!row) return;\r\n\r\n rowValues.forEach((value, cOffset) => {\r\n const targetIndex = startFlattenedIndex + cOffset;\r\n if (targetIndex < 0 || targetIndex >= flattenedColumns.length) return;\r\n\r\n const targetColumn = flattenedColumns[targetIndex];\r\n this.setNestedValue(row, targetColumn, value);\r\n });\r\n });\r\n\r\n return this.updateRows;\r\n }\r\n\r\n\r\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n debugger\r\n if (column.type === 'date' || column.type === 'image') return;\r\n const path = column.field;\r\n if (!path) return;\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n const parent = keys.reduce((acc: any, key: string) => (acc[key] ??= {}), obj);\r\n if (parent && lastKey) {\r\n if (typeof option === 'object' && option !== null) {\r\n parent[lastKey] = {\r\n id: option.id ?? 1,\r\n value: option.value ?? option,\r\n };\r\n } else {\r\n parent[lastKey] = option;\r\n }\r\n }\r\n const sendObj = {\r\n data: { ...obj },\r\n eventType: 'onCellEdit',\r\n };\r\n this.updateRows.push(obj);\r\n }\r\n\r\n\r\n cutSelectedSelectedData(\r\n dataSet: any[],\r\n rowSelectedIndexes: Set<number>,\r\n selectedCells: any[],\r\n columns: any[],\r\n setNestedValue: (obj: any, column: any, value: any) => void\r\n ): any {\r\n let updatedData = [...dataSet];\r\n if (rowSelectedIndexes?.size) {\r\n const indexes = [...rowSelectedIndexes];\r\n updatedData = updatedData.filter(\r\n (row: any) => !indexes.includes(row.__virtualIndex)\r\n );\r\n // rowSelectedIndexes.clear();\r\n }\r\n else if (selectedCells?.length) {\r\n this.updateRows = [];\r\n for (const cell of selectedCells) {\r\n const row = updatedData.find(r => r.__virtualIndex === cell.rowIndex);\r\n if (!row) continue;\r\n let col = columns[cell.colIndex];\r\n if (col?.children && col.children[cell.subColIndex]) {\r\n col = col.children[cell.subColIndex];\r\n }\r\n this.setNestedValue(row, col, '');\r\n }\r\n // selectedCells.length = 0;\r\n }\r\n return {updatedData: updatedData, updatedRows: this.updateRows};\r\n }\r\n\r\n\r\n cutWithAnimation(\r\n selectedData: any[][],\r\n selector = '.selected-cell, .active-cell, .row-selected'\r\n ): void {\r\n if (!selectedData || selectedData.length === 0) return;\r\n\r\n const textToCopy = selectedData\r\n .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\r\n .join('\\n');\r\n\r\n navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\r\n\r\n // Apply red cut animation\r\n const selectedEls = document.querySelectorAll(selector);\r\n selectedEls.forEach(el => el.classList.add('cut-flash-bg'));\r\n setTimeout(() => {\r\n selectedEls.forEach(el => el.classList.remove('cut-flash-bg'));\r\n }, 1000);\r\n }\r\n\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'filter',\r\n standalone: true\r\n})\r\nexport class FilterPipe implements PipeTransform {\r\ntransform(items: any[], searchText: string, key?: string): any[] {\r\n if (!items || !searchText) return items;\r\n\r\n searchText = searchText.toLowerCase();\r\n\r\nreturn items.filter(item => {\r\n const value = key ? item?.[key] : item;\r\n return value?.toString().toLowerCase().includes(searchText);\r\n });\r\n}}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({ name: 'pinnedColumns', pure: true, standalone: true })\r\nexport class PinnedColumnsPipe implements PipeTransform {\r\n transform(columns: any[], pinned: 'left' | 'right' | null): any[] {\r\n if (!columns) return [];\r\n return columns.filter(col => col.is_visible !== false && col.pinned === pinned);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'timezoneFormat',\r\n standalone: true\r\n})\r\nexport class TimezoneFormatPipe implements PipeTransform {\r\n\r\n private formatCache = new Map<string, Intl.DateTimeFormatOptions>();\r\n\r\n transform(\r\n value: string | Date | null | undefined,\r\n prefs?: { timeZone: string, dateFormat: string, timeFormat: string },\r\n formatType: 'date' | 'time' | 'datetime' = 'datetime'\r\n ): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const timeZone = prefs?.timeZone || 'America/New_York';\r\n // Convert Angular DatePipe format to moment.js format for parsing\r\n const dateFormat = this.convertAngularToMomentFormat(prefs?.dateFormat || 'MM/dd/yyyy');\r\n const timeFormat = this.convertAngularToMomentFormat(prefs?.timeFormat || 'HH:mm');\r\n\r\n // Detect if value is time-only (e.g. '09:00', '9:00', '09:00:00' format)\r\n const isTimeOnly = /^\\d{1,2}:\\d{2}(:\\d{2})?$/.test(String(value));\r\n\r\n let finalFormat: string;\r\n if (formatType === 'date') {\r\n finalFormat = dateFormat;\r\n } else if (formatType === 'time') {\r\n finalFormat = timeFormat;\r\n } else {\r\n finalFormat = `${dateFormat} ${timeFormat}`;\r\n }\r\n\r\n let date: Date;\r\n if (isTimeOnly) {\r\n // Combine with today's date for timezone context\r\n const today = new Date().toISOString().split('T')[0];\r\n const timeStr = String(value);\r\n // Ensure time has seconds if not present\r\n const fullTimeStr = timeStr.includes(':') && timeStr.split(':').length === 2 ? `${timeStr}:00` : timeStr;\r\n const dateTimeString = `${today}T${fullTimeStr}`;\r\n date = new Date(dateTimeString);\r\n } else {\r\n // Parse as date\r\n if (value instanceof Date) {\r\n date = value;\r\n } else {\r\n date = new Date(value);\r\n }\r\n if (isNaN(date.getTime())) {\r\n return '';\r\n }\r\n }\r\n\r\n return this.formatDate(date, finalFormat, timeZone);\r\n }\r\n\r\n private formatDate(date: Date, format: string, timeZone: string): string {\r\n const options = this.parseFormatToIntlOptions(format);\r\n options.timeZone = timeZone;\r\n\r\n const formatter = new Intl.DateTimeFormat('en-US', options);\r\n return formatter.format(date);\r\n }\r\n\r\n private parseFormatToIntlOptions(format: string): Intl.DateTimeFormatOptions {\r\n const cacheKey = format;\r\n if (this.formatCache.has(cacheKey)) {\r\n return { ...this.formatCache.get(cacheKey)! };\r\n }\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n\r\n // Parse moment.js style format strings\r\n // Handle year\r\n if (format.includes('YYYY')) {\r\n options.year = 'numeric';\r\n } else if (format.includes('YY')) {\r\n options.year = '2-digit';\r\n }\r\n\r\n // Handle month\r\n if (format.includes('MMMM')) {\r\n options.month = 'long';\r\n } else if (format.includes('MMM')) {\r\n options.month = 'short';\r\n } else if (format.includes('MM')) {\r\n options.month = '2-digit';\r\n } else if (format.includes('M')) {\r\n options.month = 'numeric';\r\n }\r\n\r\n // Handle day\r\n if (format.includes('DD')) {\r\n options.day = '2-digit';\r\n } else if (format.includes('D')) {\r\n options.day = 'numeric';\r\n }\r\n\r\n // Handle weekday\r\n if (format.includes('dddd')) {\r\n options.weekday = 'long';\r\n } else if (format.includes('ddd')) {\r\n options.weekday = 'short';\r\n }\r\n\r\n // Handle hour\r\n if (format.includes('HH') || format.includes('H')) {\r\n options.hour = format.includes('HH') ? '2-digit' : 'numeric';\r\n options.hour12 = false;\r\n } else if (format.includes('hh') || format.includes('h')) {\r\n options.hour = format.includes('hh') ? '2-digit' : 'numeric';\r\n options.hour12 = true;\r\n }\r\n\r\n // Handle minute\r\n if (format.includes('mm')) {\r\n options.minute = '2-digit';\r\n } else if (format.includes('m')) {\r\n options.minute = 'numeric';\r\n }\r\n\r\n // Handle second\r\n if (format.includes('ss')) {\r\n options.second = '2-digit';\r\n } else if (format.includes('s')) {\r\n options.second = 'numeric';\r\n }\r\n\r\n // Handle AM/PM (overrides hour12 if explicitly set)\r\n if (format.includes('A') || format.includes('a')) {\r\n options.hour12 = true;\r\n }\r\n\r\n this.formatCache.set(cacheKey, { ...options });\r\n return options;\r\n }\r\n\r\n private convertAngularToMomentFormat(angularFormat: string): string {\r\n // Convert Angular DatePipe format to moment.js format\r\n return angularFormat\r\n .replace(/dd/g, 'DD') // Day of month: dd -> DD\r\n .replace(/yyyy/g, 'YYYY') // Year: yyyy -> YYYY\r\n .replace(/yy/g, 'YY') // Year: yy -> YY\r\n .replace(/MM/g, 'MM') // Month: MM -> MM (same)\r\n .replace(/M/g, 'M') // Month: M -> M (same)\r\n .replace(/HH/g, 'HH') // Hour 24: HH -> HH (same)\r\n .replace(/H/g, 'H') // Hour 24: H -> H (same)\r\n .replace(/h/g, 'h') // Hour 12: h -> h (same)\r\n .replace(/mm/g, 'mm') // Minute: mm -> mm (same)\r\n .replace(/m/g, 'm') // Minute: m -> m (same)\r\n .replace(/ss/g, 'ss') // Second: ss -> ss (same)\r\n .replace(/s/g, 's') // Second: s -> s (same)\r\n .replace(/a/g, 'a'); // AM/PM: a -> a (same)\r\n }\r\n}","import { Component, Input, Output, EventEmitter, ElementRef, AfterViewInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface BadgeItem {\r\n text: string;\r\n class?: string;\r\n tooltip?: string;\r\n data?: any; // Additional data for callbacks\r\n}\r\n\r\n@Component({\r\n selector: 'app-badge-overflow',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './badge-overflow.component.html',\r\n styles: [`\r\n .badge-overflow-container {\r\n display: flex;\r\n flex-wrap: nowrap;\r\n gap: 4px;\r\n align-items: center;\r\n min-width: 0;\r\n overflow: hidden;\r\n width: 100%;\r\n }\r\n\r\n .badge {\r\n flex-shrink: 0;\r\n white-space: nowrap;\r\n font-size: 12px;\r\n padding: 4px 8px;\r\n border-radius: 50%; /* Make badges circular like circle-value */\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-weight: 600; /* Match circle-value font-weight */\r\n line-height: 1;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); /* Match circle-value transition */\r\n border: 2px solid transparent; /* Match circle-value border style */\r\n width: 32px; /* Fixed circular size */\r\n height: 32px; /* Fixed circular size */\r\n box-sizing: border-box;\r\n cursor: pointer; /* Match circle-value cursor */\r\n transform: translateZ(0); /* Hardware acceleration */\r\n will-change: transform, box-shadow, background-color;\r\n backface-visibility: hidden;\r\n color: white !important;\r\n\r\n &:hover {\r\n transform: scale(1.15) translateY(-2px); /* Match circle-value hover effect */\r\n box-shadow: 0 6px 16px rgba(0, 123, 255, 0.25); /* Match circle-value shadow */\r\n }\r\n\r\n &:active {\r\n transform: scale(1.08) translateY(-1px); /* Match circle-value active effect */\r\n transition-duration: 0.15s;\r\n }\r\n }\r\n\r\n /* Break color classes for proper badge coloring */\r\n .break-color-paid {\r\n background-color: #4CAF50 !important;\r\n border-color: #4CAF50 !important;\r\n }\r\n\r\n .break-color-unpaid {\r\n background-color: #F44336 !important;\r\n border-color: #F44336 !important;\r\n }\r\n\r\n .break-color-lunch {\r\n background-color: #2196F3 !important;\r\n border-color: #2196F3 !important;\r\n }\r\n\r\n .break-color-default {\r\n background-color: #F44336 !important;\r\n border-color: #F44336 !important;\r\n }\r\n\r\n .badge-overflow-count {\r\n background-color: #6c757d !important;\r\n color: white !important;\r\n cursor: pointer;\r\n border: 2px solid #6c757d !important; /* Match circular border style */\r\n flex-shrink: 0;\r\n border-radius: 50%; /* Make count badge circular too */\r\n width: 32px; /* Match size */\r\n height: 32px; /* Match size */\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-weight: 600; /* Match font-weight */\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); /* Match transition */\r\n transform: translateZ(0);\r\n will-change: transform, box-shadow, background-color;\r\n backface-visibility: hidden;\r\n font-size: 12px;\r\n line-height: 1;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n\r\n &:hover {\r\n background-color: #5a6268 !important;\r\n border-color: #5a6268 !important;\r\n transform: scale(1.15) translateY(-2px); /* Match hover effect */\r\n box-shadow: 0 6px 16px rgba(0, 123, 255, 0.25);\r\n }\r\n\r\n &:active {\r\n transform: scale(1.08) translateY(-1px);\r\n transition-duration: 0.15s;\r\n }\r\n }\r\n `]\r\n})\r\nexport class BadgeOverflowComponent implements AfterViewInit, OnDestroy {\r\n @Input() badges: BadgeItem[] = [];\r\n @Input() maxWidth: number = 200;\r\n @Output() badgeMouseEnter = new EventEmitter<{event: MouseEvent, badge: BadgeItem}>();\r\n @Output() badgeMouseLeave = new EventEmitter<{event: MouseEvent, badge: BadgeItem}>();\r\n @Output() overflowCountClick = new EventEmitter<{ event: MouseEvent; overflowBadges: BadgeItem[] }>();\r\n\r\n visibleBadges: BadgeItem[] = [];\r\n overflowBadges: BadgeItem[] = [];\r\n overflowCount = 0;\r\n\r\n private resizeObserver: ResizeObserver | null = null;\r\n private containerElement: HTMLElement | null = null;\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n ngAfterViewInit() {\r\n this.containerElement = this.elementRef.nativeElement.querySelector('.badge-overflow-container');\r\n this.setupResizeObserver();\r\n this.updateBadgeVisibility();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n }\r\n\r\n private setupResizeObserver() {\r\n if (!this.containerElement) return;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.updateBadgeVisibility();\r\n });\r\n\r\n // Observe the parent container for width changes\r\n const parentElement = this.elementRef.nativeElement.parentElement;\r\n if (parentElement) {\r\n this.resizeObserver.observe(parentElement);\r\n }\r\n }\r\n\r\n private updateBadgeVisibility() {\r\n if (!this.containerElement || !this.badges.length) return;\r\n\r\n const containerWidth = this.containerElement.parentElement?.clientWidth || this.maxWidth;\r\n let totalWidth = 0;\r\n const visible: BadgeItem[] = [];\r\n const overflow: BadgeItem[] = [];\r\n\r\n // Calculate width needed for each badge\r\n for (let i = 0; i < this.badges.length; i++) {\r\n const badge = this.badges[i];\r\n const badgeWidth = this.estimateBadgeWidth(badge);\r\n\r\n if (totalWidth + badgeWidth <= containerWidth || visible.length === 0) {\r\n visible.push(badge);\r\n totalWidth += badgeWidth + 4; // +4 for gap\r\n } else {\r\n overflow.push(badge);\r\n }\r\n }\r\n\r\n // If we have overflow, check if we need to show count badge\r\n if (overflow.length > 0) {\r\n const countBadgeWidth = this.estimateCountBadgeWidth(overflow.length);\r\n const lastVisibleIndex = visible.length - 1;\r\n\r\n // If adding count badge would exceed width, remove one more visible badge\r\n if (totalWidth + countBadgeWidth > containerWidth && visible.length > 1) {\r\n const removedBadge = visible.pop();\r\n if (removedBadge) {\r\n overflow.unshift(removedBadge);\r\n }\r\n }\r\n }\r\n\r\n this.visibleBadges = visible;\r\n this.overflowBadges = overflow;\r\n this.overflowCount = overflow.length;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n private estimateBadgeWidth(badge: BadgeItem): number {\r\n // Rough estimation: text length * 8px per character + padding\r\n const textWidth = badge.text.length * 8;\r\n const padding = 16; // 8px left + 8px right\r\n return textWidth + padding;\r\n }\r\n\r\n private estimateCountBadgeWidth(count: number): number {\r\n const text = `+${count}`;\r\n const textWidth = text.length * 8;\r\n const padding = 16;\r\n return textWidth + padding;\r\n }\r\n\r\n getOverflowTooltip(): string {\r\n return this.overflowBadges.map(b => b.text).join(', ');\r\n }\r\n\r\n onBadgeMouseEnter(event: MouseEvent, badge: BadgeItem) {\r\n this.badgeMouseEnter.emit({ event, badge });\r\n }\r\n\r\n onBadgeMouseLeave(event: MouseEvent, badge: BadgeItem) {\r\n this.badgeMouseLeave.emit({ event, badge });\r\n }\r\n\r\n onOverflowCountClick(event: MouseEvent) {\r\n this.overflowCountClick.emit({ event, overflowBadges: this.overflowBadges });\r\n }\r\n // In BadgeOverflowComponent\r\nrefresh() {\r\n this.updateBadgeVisibility();\r\n}\r\n}","<div class=\"badge-overflow-container\" #container>\r\n <span\r\n *ngFor=\"let badge of visibleBadges; let i = index\"\r\n class=\"badge\"\r\n [class]=\"badge.class || 'badge-secondary'\"\r\n \r\n (mouseenter)=\"onBadgeMouseEnter($event, badge)\"\r\n (mouseleave)=\"onBadgeMouseLeave($event, badge)\"\r\n >\r\n {{ badge.text }}\r\n </span>\r\n <span\r\n *ngIf=\"overflowCount > 0\"\r\n class=\"badge badge-overflow-count\"\r\n [title]=\"getOverflowTooltip()\"\r\n (click)=\"onOverflowCountClick($event)\"\r\n >\r\n +{{ overflowCount }}\r\n </span>\r\n</div>","\r\nimport {\r\n Component,\r\n OnInit,\r\n Input,\r\n Output,\r\n OnChanges,\r\n SimpleChanges,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit,\r\n HostListener,\r\n ChangeDetectorRef,\r\n EventEmitter,\r\n NgZone,\r\n ChangeDetectionStrategy,\r\n OnDestroy,\r\n inject,\r\n ViewContainerRef,\r\n ComponentRef,\r\n Injector,\r\n} from '@angular/core';\r\nimport { SplitColumnsService } from './services/split-columns.service';\r\nimport { CommonService } from './services/common.service';\r\n// import { SwapColumnsService } from './services/swap-columns.service';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { BsDatepickerModule, BsDaterangepickerDirective, BsDaterangepickerConfig } from 'ngx-bootstrap/datepicker';\r\nimport {\r\n CdkDrag,\r\n CdkDragDrop,\r\n CdkDragEnd,\r\n CdkDragEnter,\r\n CdkDragExit,\r\n CdkDragMove,\r\n CdkDragSortEvent,\r\n CdkDragStart,\r\n DragDrop,\r\n moveItemInArray,\r\n} from '@angular/cdk/drag-drop';\r\nimport {\r\n trigger,\r\n state,\r\n style,\r\n transition,\r\n animate,\r\n} from '@angular/animations';\r\nimport { CdkDropList } from '@angular/cdk/drag-drop';\r\nimport { BADGES_MAP } from './badges';\r\nimport { CopyServiceService } from './services/copy-service.service';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { InlineSVGModule } from 'ng-inline-svg';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { CommonModule, formatDate } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { FilterPipe } from './pipes/filter.pipe';\r\n// import { DraggableHeaderDirective } from './directives/draggable-header.directive';\r\nimport { PinnedColumnsPipe } from './pipes/pinned-columns.pipe';\r\nimport { DatePipe } from '@angular/common';\r\nimport { TimezoneFormatPipe } from './pipes/timezone-format.pipe';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\n// import moment from 'moment';\r\n// import 'moment-timezone';\r\nimport { BehaviorSubject, Observable, Subject, debounceTime, throttleTime, distinctUntilChanged } from 'rxjs';\r\nimport { BadgeOverflowComponent } from './components/badge-overflow/badge-overflow.component';\r\n\r\n// Advanced caching imports for service worker - using native APIs\r\n\r\n// Lazy-loaded imports for better tree shaking\r\nlet VirtualScrollModule: any = null;\r\nlet DragDropModuleLazy: any = null;\r\nlet DatePickerModule: any = null;\r\n\r\n\r\n\r\n\r\n\r\nexport interface DateTimePrefs {\r\n timeZone: string;\r\n dateFormat: string;\r\n timeFormat: string;\r\n}\r\n\r\ninterface CellPosition {\r\n rowIndex: number;\r\n colIndex: number;\r\n subColIndex: number;\r\n field: string;\r\n key: string;\r\n}\r\n\r\ninterface PerformanceMetrics {\r\n renderTime: number;\r\n scrollTime: number;\r\n filterTime: number;\r\n sortTime: number;\r\n lastRenderStart: number;\r\n renderCount: number;\r\n}\r\n\r\n\r\n\r\n@Component({\r\n selector: 'time-sheet',\r\n templateUrl: './ms-time-sheet.component.html',\r\n styleUrls: ['./ms-time-sheet.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, InlineSVGModule, FilterPipe, PinnedColumnsPipe, DragDropModule, BsDatepickerModule, ScrollingModule, BadgeOverflowComponent, DatePipe, TimezoneFormatPipe],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('accordionToggle', [\r\n state(\r\n 'collapsed',\r\n style({ height: '0px', overflow: 'hidden' })\r\n ),\r\n state('expanded', style({ height: '*', overflow: 'visible' })),\r\n transition('collapsed <=> expanded', animate('300ms ease-in')),\r\n ]),\r\n trigger('slideToggle', [\r\n transition(':enter', [\r\n style({ height: '0px', opacity: 0, overflow: 'hidden' }),\r\n animate('300ms ease-out', style({ height: '*', opacity: 1 }))\r\n ]),\r\n transition(':leave', [\r\n style({ height: '*', opacity: 1, overflow: 'hidden' }),\r\n animate('300ms ease-in', style({ height: '0px', opacity: 0 }))\r\n ])\r\n ]),\r\n trigger('slideUp', [\r\n state('void', style({ transform: 'translateY(100%)', opacity: 0 })),\r\n state('*', style({ transform: 'translateY(0)', opacity: 1 })),\r\n transition('void => *', animate('300ms ease-out')),\r\n transition('* => void', animate('300ms ease-in')),\r\n ])\r\n ],\r\n})\r\n\r\nexport class TimeSheetComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\r\n\r\n // **************************************//\r\n // ********** Input Goes Here *********** //\r\n // **************************************//\r\n // **************************************//\r\n // Add a new property to track expanded rows\r\n expandedRows: Set<string> = new Set();\r\n@Output() onShortBreakClick = new EventEmitter<any>();\r\n@Output() searchEvent = new EventEmitter<any>();\r\n// Advanced Performance Optimizations\r\nprivate scrollSubject = new Subject<number>();\r\nprivate filterSubject = new Subject<any[]>();\r\nprivate dataSubject = new BehaviorSubject<any[]>([]);\r\nprivate viewportResizeSubject = new Subject<void>();\r\nprivate destroy$ = new Subject<void>();\r\n\r\n// Prevent multiple initial API calls\r\nprivate hasEmittedInitialDate = false;\r\n\r\n // Enhanced caching system\r\n private dataCache = new Map<string, { data: any; timestamp: number; ttl: number }>();\r\n private computationCache = new Map<string, { result: any; timestamp: number }>();\r\n private domCache = new Map<string, HTMLElement>();\r\n\r\n // Advanced Virtual scrolling optimizations\r\n private virtualScrollBuffer = 20;\r\n private maxRenderedItems = 100;\r\n private itemHeightCache = new Map<string, number>();\r\n private dynamicItemHeights = new Map<number, number>();\r\n private averageItemHeight = 44; // Default row height\r\n private heightCalculationSamples = 10;\r\n private viewportHeight = 0;\r\n private scrollDirection: 'up' | 'down' | 'none' = 'none';\r\n private lastScrollTop = 0;\r\n private scrollVelocity = 0;\r\n private scrollAcceleration = 0;\r\n\r\n\r\n // Memory management\r\n private componentRefs = new Set<ComponentRef<any>>();\r\n private eventListeners = new Map<string, EventListener>();\r\n private resizeObservers = new Set<ResizeObserver>();\r\n private timeouts = new Set<number>();\r\n private intervals = new Set<number>();\r\n// For Short Break Tooltip\r\nhideShortBreakTooltip() {\r\n this.currentShortBreakTooltip = null;\r\n}\r\n // Viewport-based lazy loading\r\n private intersectionObserver: IntersectionObserver | null = null;\r\n private lazyLoadCallbacks = new Map<string, () => void>();\r\n private viewportElements = new WeakMap<Element, boolean>();\r\n\r\n // Pagination Config Store Here\r\n @Input() paginationConfig: any = {};\r\n\r\n // The dataset store here;\r\n @Input() dataSet: any[] = [];\r\n // The columns Store Here\r\n @Input() columns: any[] = [];\r\n\r\n // Row Height;\r\n @Input() rowHeight: number = 44;\r\n\r\n // Header Row Height;\r\n @Input() headerRowHeight: number = 44;\r\n\r\n // Show Vertical Borders;\r\n @Input() showVerticalBorder: boolean = true;\r\n\r\n // Even Rows Background Color;\r\n @Input() evenRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Even Rows Background Color;\r\n @Input() oddRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Header Rows Background Color;\r\n @Input() headerBackgroundColor: string = '#eaeaea';\r\n\r\n // Header Rows Background Color;\r\n @Input() checkboxesBackgroundColor: string = '#eaeaea';\r\n\r\n // Show Columns Grouping;\r\n @Input() showColumnsGrouping: boolean = false;\r\n\r\n // Row Hovered Background color;\r\n @Input() rowHoverColor: string | undefined = 'rgba(0, 123, 255, 0.1)';\r\n\r\n // Left PinnedBackground color;\r\n @Input() leftPinnedBackgroundColor: string | undefined = '#000';\r\n\r\n // Body Background color;\r\n @Input() bodyBackgroundColor: string | undefined = '#fff';\r\n\r\n // Right Pinned Background color;\r\n @Input() rightPinnedBackgroundColor: string | undefined = '#000';\r\n\r\n // Side Menu Background color;\r\n @Input() sidemenuBackgroundColor: string | undefined = '#000';\r\n\r\n // Body text color;\r\n @Input() bodyTextColor: string | undefined = '#000';\r\n\r\n // Header text color;\r\n @Input() headerTextColor: string | undefined = '#000';\r\n\r\n // Header text size;\r\n @Input() headerTextFontsSize: number | undefined = 16;\r\n\r\n // Body text color;\r\n @Input() bodyTextFontsSize: number | undefined = 16;\r\n\r\n // Header font weight;\r\n @Input() headerFontWeight: number | undefined = 500;\r\n\r\n // Body Font Weight;\r\n @Input() bodyFontWeight: number | undefined = 400;\r\n\r\n // Checked Row Background Color;\r\n @Input() checkedRowBackgroundColor: string | undefined = '';\r\n\r\n // dropdowns Background Color;\r\n @Input() dropdownsBackgroundColor: string | undefined = '';\r\n\r\n // Footer row Height;\r\n @Input() footerRowHeight: number = 46;\r\n\r\n // Footer row Height;\r\n @Input() topGroupedBadgesBackgroundColor: string | undefined = '';\r\n\r\n // Show Row wise grouping;\r\n @Input() showRowsGrouping: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() showFilterRow: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() fontFaimly: string | undefined = 'sans-serif';\r\n\r\n // Show SideColumn;\r\n @Input() showSideMenu: boolean = false;\r\n\r\n // Footer Padding\r\n @Input() footerPadding: number = 3\r\n\r\n\r\n // Footer Padding\r\n @Input() topFilterRowHeight: number = 50;\r\n\r\n // Show Rows shading\r\n @Input() rowShadingEnabled: boolean = false;\r\n\r\n // Show Rows shading\r\n @Input() showSerialNumber: boolean = false;\r\n\r\n // Enable export functionality\r\n @Input() enableExport: boolean = false;\r\n\r\n // Single Spa Url Attach to icons\r\n @Input() singleSpaAssetsPath: string = 'assets/';\r\n\r\n\r\n // Applied Filters\r\n @Input() filtersConfig: any[] = [];\r\n\r\n\r\n // Applied Filters\r\n @Input() loading: boolean = false;\r\n\r\n //Vertical Scrollbar style\r\n @Input() verticalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n //Horizintal Scrollbar style\r\n @Input() horizintalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n // Show Cell details box\r\n @Input() showCellDetailsBox: boolean = false;\r\n\r\n //Date format\r\n\r\n @Input() dateFormat: string = 'dd/MM/yyyy'\r\n\r\n //Date format\r\n @Input() tableSearch: string = '';\r\n\r\n\r\n //Date format\r\n @Input() actions: any[] = [];\r\n\r\n\r\n // Table Config for paginations is here\r\n @Input() config: any;\r\n\r\n\r\n // Selection task bar\r\n @Input() showTaskbar = false\r\n\r\n // Table Name for state manage\r\n @Input() tableName = true\r\n\r\n\r\n // Listing type\r\n @Input() listingType: string | boolean = '';\r\n\r\n // Listing type\r\n\r\n @Input() checkboxState: { reset: boolean } = {\r\n reset: true\r\n }\r\n\r\n // Taskbar actions\r\n @Input() taskbarActions: any[] = []\r\n\r\n\r\n // Sorting Config to show sort icons\r\n @Input() sortingConfig: { field: string, order_by: string } | null = null;\r\n\r\n\r\n @Input() set tableFilterViewId(value: any) {\r\n this._tableFilterViewId = value;\r\n this.cdr.markForCheck();\r\n }\r\n get tableFilterViewId(): any {\r\n return this._tableFilterViewId;\r\n }\r\n private _tableFilterViewId: any = '';\r\n\r\n\r\n @Input() selectedTableLayout: any = 'medium'\r\n\r\n @Input() selectedPresetId: any;\r\n\r\n @Input() closeDropdown: { preset: { closed: boolean, loading: boolean } } = { preset: { closed: false, loading: false } };\r\n\r\n // Table View\r\n\r\n // GlobalSearch\r\n @Input() globalSearchText: string = '';\r\n\r\n// Nested Table Row Fontsize\r\n @Input() nestedTablerowFontsize = 14;\r\n\r\n // Nested table row Header row Height\r\n @Input() nestedTableHeaderRowHeight = 40;\r\n\r\n // Nested Table row height\r\n @Input() nestedTablerowHeight = 36;\r\n\r\n\r\n @Input() gridType: string = 'TimeSheet';\r\n\r\n @Input() isSingleDay: boolean = false;\r\n\r\n @Input() leftPinnedBoxshadow: string = '#4b4b4b 1px 1px 5px 0px';\r\n\r\n @Input() rightPinnedBoxshadow: string = '#4b4b4b 4px 1px 6px 0px';\r\n\r\n // Conditional styling inputs\r\n @Input() enableAccordionShadow: boolean = false;\r\n @Input() enableAccordionSeparators: boolean = false;\r\n @Input() enableRowShading: boolean = false;\r\n\r\n // GlobalSearch\r\n @Input() selectedRowsBackgroundColor: string = '#8ac5ff';\r\n\r\n // GlobalSearch\r\n @Input() nestedTableHeaderBAckgroundColor: string = '#eaeaea';\r\n\r\n @Input() tableView: any[] = [];\r\n\r\n\r\n @Input() columnThreedotsMunuConfig = {\r\n showPinleft: true,\r\n showPinright: true,\r\n showAscending: true,\r\n showDescending: true,\r\n showFilter: true,\r\n showRowsGrouping: this.showRowsGrouping,\r\n showAutosizeAllColumns: true,\r\n showAutosizeThisColumn: true,\r\n showChoseColumns: true,\r\n showResetColumns: true,\r\n\r\n\r\n };\r\n\r\n @Input() timezonePrefs: any;\r\n prefs!: DateTimePrefs\r\n\r\n // Action buttons configuration\r\n // buttons: any[] = [];\r\n shouldShowButton(condition: string | null): boolean {\r\n if (!condition) return true;\r\n if (condition === 'isSingleDay') return this.isSingleDay;\r\n if (condition === '!isSingleDay') return !this.isSingleDay;\r\n return true;\r\n}\r\n\r\n getButtonPermission(button: any): boolean {\r\n if (typeof button.has_permission === 'function') {\r\n return button.has_permission();\r\n }\r\n return button.has_permission;\r\n }\r\n\r\n // Progressive loading for large datasets\r\n @Input() enableProgressiveLoading = false;\r\n @Input() progressiveChunkSize = 100;\r\n @Input() progressiveDelay = 50; // ms between chunks\r\n private progressiveLoadingChunks: any[][] = [];\r\n private progressiveLoadingIndex = 0;\r\n private isProgressiveLoading = false;\r\n\r\n\r\n\r\n\r\n\r\n\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n // Out Put Events\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n // ///////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n //Change Table Layout\r\n @Output() public changeLayout = new EventEmitter<any>();\r\n\r\n // Filter Apply event;\r\n @Output() public filterOptions = new EventEmitter<any>();\r\n\r\n // Filter cleared event with flag\r\n @Output() public filterCleared = new EventEmitter<boolean>();\r\n\r\n @Output() genericEvent: EventEmitter<any> = new EventEmitter();\r\n\r\n @Output() tablePresetConfig: EventEmitter<any> = new EventEmitter();\r\n\r\n @Output() sortingOrderOptions: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n @Output() createUpdateConfigListing: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n\r\n\r\n// Tooltip state\r\ncurrentBreakTooltip: any = null;\r\ncurrentShortBreakTooltip: any = null;\r\ncurrentOverflowBreakTooltip: any[] = [];\r\ntooltipPosition = { x: 0, y: 0 };\r\nmanualLogsTooltipVisible: boolean = false;\r\nmanualLogsTooltipPosition = { x: 0, y: 0 };\r\ncurrentManualLogs: any[] = [];\r\nnoShortLeaveDetail: any = null;\r\nnoShortLeaveLeft: any = null;\r\nmanualLogsMoused: boolean = false;\r\nshowShortLeaveTooltipModal: boolean = false;\r\nshortLeaveTooltipPosition = { x: 0, y: 0 };\r\ncurrentShortLeaveData: any[] = [];\r\nshortLeaveTooltipMoused: boolean = false;\r\noverflowBreakTooltipVisible: boolean = false;\r\noverflowBreakTooltipPosition = { x: 0, y: 0 };\r\n\r\n// Tooltip performance optimization\r\nprivate tooltipShowTimeout: any = null;\r\nprivate tooltipHideTimeout: any = null;\r\n\r\nshowBreakTooltip(event: MouseEvent, breakItem: any) {\r\n // Clear any pending hide timeout\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Debounce show tooltip to prevent rapid firing\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n }\r\n\r\n this.tooltipShowTimeout = setTimeout(() => {\r\n this.currentBreakTooltip = breakItem;\r\n this.currentShortBreakTooltip = null;\r\n this.setPosition(event);\r\n this.tooltipShowTimeout = null;\r\n }, 50); // Small delay for smooth experience\r\n}\r\n\r\nshowShortBreakTooltip(event: MouseEvent, shortBreak: any, type?: string) {\r\n // Clear any pending hide timeout\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Debounce show tooltip to prevent rapid firing\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n }\r\n\r\n this.tooltipShowTimeout = setTimeout(() => {\r\n this.currentShortBreakTooltip = shortBreak;\r\n this.currentBreakTooltip = null;\r\n this.setPosition(event);\r\n this.tooltipShowTimeout = null;\r\n }, 50); // Small delay for smooth experience\r\n}\r\n\r\nsetPosition(event: MouseEvent) {\r\n this.tooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n}\r\n\r\nhideBreakTooltip() {\r\n // Clear any pending show timeout\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n this.tooltipShowTimeout = null;\r\n }\r\n\r\n // Debounce hide tooltip to prevent flickering\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n }\r\n\r\n this.tooltipHideTimeout = setTimeout(() => {\r\n this.currentBreakTooltip = null;\r\n this.tooltipHideTimeout = null;\r\n }, 150); // Longer delay to prevent accidental hiding\r\n}\r\n\r\nshowOverflowBreakTooltip(event: MouseEvent, overflowBadges: any[]) {\r\n // Clear any pending hide timeout\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Debounce show tooltip to prevent rapid firing\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n }\r\n\r\n this.tooltipShowTimeout = setTimeout(() => {\r\n this.currentOverflowBreakTooltip = overflowBadges;\r\n this.overflowBreakTooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n this.overflowBreakTooltipVisible = true;\r\n this.tooltipShowTimeout = null;\r\n }, 50); // Small delay for smooth experience\r\n}\r\n\r\nhideOverflowBreakTooltip() {\r\n // Clear any pending show timeout\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n this.tooltipShowTimeout = null;\r\n }\r\n\r\n // Debounce hide tooltip to prevent flickering\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n }\r\n\r\n this.tooltipHideTimeout = setTimeout(() => {\r\n this.overflowBreakTooltipVisible = false;\r\n this.currentOverflowBreakTooltip = [];\r\n this.tooltipHideTimeout = null;\r\n }, 150); // Longer delay to prevent accidental hiding\r\n}\r\n\r\ngetBreakTooltip(breakItem: any): string {\r\n if (!breakItem) return '';\r\n return `Break: ${breakItem.break_duration || 0} minutes`;\r\n}\r\n\r\nhasManualLogs(row: any): boolean {\r\n return row && row.manually_logs && Array.isArray(row.manually_logs) && row.manually_logs.length > 0;\r\n}\r\n\r\npreventManualLogsTooltipHide() {\r\n this.manualLogsMoused = true;\r\n}\r\n\r\n// showShortLeaveTooltip(event: MouseEvent, row: any) {\r\n// if (row?.short_leave?.length > 0) {\r\n// this.currentShortLeaveData = row?.short_leave;\r\n// this.shortLeaveTooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n// this.shortLeaveTooltipMoused = true;\r\n// this.showShortLeaveTooltipModal = true;\r\n// this.cdr.markForCheck();\r\n// }\r\n// }\r\n\r\n// hideShortLeaveTooltip() {\r\n// this.shortLeaveTooltipMoused = false;\r\n// setTimeout(() => {\r\n// if (!this.shortLeaveTooltipMoused) {\r\n// this.showShortLeaveTooltipModal = false;\r\n// this.currentShortLeaveData = [];\r\n// this.cdr.markForCheck();\r\n// }\r\n// }, 500);\r\n// }\r\n\r\n// preventShortLeaveTooltipHide() {\r\n// this.shortLeaveTooltipMoused = true;\r\n// }\r\n\r\ngetBreakColor(type: string): string {\r\n switch (type?.toLowerCase()) {\r\n case 'paid': return '#4CAF50';\r\n case 'unpaid': return '#F44336';\r\n case 'lunch': return '#2196F3';\r\n default: return '#F44336';\r\n }\r\n}\r\n\r\ngetBreakColorClass(type: string): string {\r\n switch (type?.toLowerCase()) {\r\n case 'paid': return 'break-color-paid';\r\n case 'unpaid': return 'break-color-unpaid';\r\n case 'lunch': return 'break-color-lunch';\r\n default: return 'break-color-default';\r\n }\r\n}\r\n\r\ngetBreakBadges(breaks: any[]): any[] {\r\n if (!Array.isArray(breaks)) return [];\r\n return breaks.map(breakItem => ({\r\n text: `${breakItem.break_duration}m`,\r\n class: this.getBreakColorClass(breakItem.break_type?.data_value_name || breakItem.breakType),\r\n tooltip: `Break: ${breakItem.break_duration || 0} minutes`,\r\n data: breakItem // Include full break item data for tooltip\r\n }));\r\n}\r\n\r\n\r\n\r\n groupedColumns: any[] = [];\r\n activeCol: any = null;\r\n activeFilterCell: any = null;\r\n showActionsDropDown = false;\r\n sideMenuVisible = false;\r\n pivotMode: boolean = false;\r\n\r\n columnSearch: string = '';\r\n expandAllAccordians = true;\r\n currentOpenedSideMenue: 'cols' | 'filtrs' | null = null;\r\n\r\n // Global detail sort properties\r\n detailSortField: string | null = null;\r\n detailSortOrder: 'asc' | 'desc' | null = null;\r\n\r\n originalColumns: any[] = [];\r\n originalDataSet: any[] = [];\r\n activeTopButton: string | null = '';\r\n filterColumnsList: any[] = [];\r\n groupBoxPadding = 200;\r\n presetName: string = '';\r\n presetFilter: any = '';\r\n searchTextPresetTable = '';\r\n addFilterColumnInput = '';\r\n searchInDropdown = '';\r\n addFilterDropdownSearch = ''\r\n topShowHideColumns = '';\r\n choseColumnsSearch = ''\r\n editinDropdownSearch = '';\r\n isThreeDotsFilterOpen = false;\r\n confirmDelete = false;\r\n subMenueOpendField = ''\r\n openDropdownId: string | null = null;\r\n fontFamilies: string[] = [\r\n // Common Excel fonts\r\n 'Arial',\r\n 'Arial Black',\r\n 'Bahnschrift',\r\n 'Calibri',\r\n 'Cambria',\r\n 'Cambria Math',\r\n 'math',\r\n 'Candara',\r\n 'Comic Sans MS',\r\n 'Consolas',\r\n 'Constantia',\r\n 'Corbel',\r\n 'Courier New',\r\n 'Ebrima',\r\n 'Franklin Gothic Medium',\r\n 'Gabriola',\r\n 'Gadugi',\r\n 'Georgia',\r\n 'Impact',\r\n 'Ink Free',\r\n 'Javanese Text',\r\n 'Leelawadee UI',\r\n 'Lucida Console',\r\n 'Lucida Sans Unicode',\r\n 'Malgun Gothic',\r\n 'Microsoft Himalaya',\r\n 'Microsoft JhengHei',\r\n 'Microsoft New Tai Lue',\r\n 'Microsoft PhagsPa',\r\n 'Microsoft Sans Serif',\r\n 'Microsoft Tai Le',\r\n 'Microsoft YaHei',\r\n 'Microsoft Yi Baiti',\r\n 'Mongolian Baiti',\r\n 'MS Gothic',\r\n 'MS PGothic',\r\n 'MS UI Gothic',\r\n 'MV Boli',\r\n 'Nirmala UI',\r\n 'Palatino Linotype',\r\n 'Segoe Print',\r\n 'Segoe Script',\r\n 'Segoe UI',\r\n 'Segoe UI Historic',\r\n 'Segoe UI Emoji',\r\n 'Segoe UI Symbol',\r\n 'SimSun',\r\n 'Sitka Small',\r\n 'Sylfaen',\r\n 'Symbol',\r\n 'Tahoma',\r\n 'Times New Roman',\r\n 'Trebuchet MS',\r\n 'Verdana',\r\n 'Webdings',\r\n 'Wingdings',\r\n 'Yu Gothic',\r\n 'sans-serif',\r\n 'serif',\r\n 'monospace',\r\n 'Inter'\r\n ];\r\n\r\n fontSizes: string[] = [\r\n '8', '9', '10', '11', '12', '14', '16', '18', '20', '24', '28', '32'\r\n ];\r\n\r\n\r\n\r\n\r\n // Use Angular's inject function for better tree shaking\r\n private columnService = inject(SplitColumnsService);\r\n private cdr = inject(ChangeDetectorRef);\r\n public commonSevice = inject(CommonService);\r\n private elementRef = inject(ElementRef);\r\n private ngZone = inject(NgZone);\r\n private copyService = inject(CopyServiceService);\r\n // private timeSheetService = inject(MsTimeSheetService);\r\n\r\n // Remove characters array for status transformation\r\n removeCharacters = [\r\n {\r\n find: '_',\r\n replace: ' '\r\n },\r\n {\r\n find: '-',\r\n replace: ' '\r\n }\r\n ];\r\n\r\n\r\n // Method to transform status strings\r\n transformStatus(status: string): string {\r\n if (!status) return status;\r\n let result = status;\r\n this.removeCharacters.forEach(item => {\r\n result = result.replace(new RegExp(item.find, 'g'), item.replace);\r\n });\r\n // Insert spaces before capital letters (for camelCase)\r\n result = result.replace(/([a-z])([A-Z])/g, '$1 $2');\r\n // Capitalize first letter of each word\r\n result = result.replace(/\\b\\w/g, l => l.toUpperCase());\r\n // Special case for \"Miss Punch Out\" to become \"Missed Punch Out\"\r\n if (result === 'Miss Punch Out') {\r\n return 'Missed Punch Out';\r\n }\r\n return result;\r\n }\r\n\r\n constructor(private injector: Injector, private vcr: ViewContainerRef, private commonService : CommonService ) {\r\n // Constructor is now empty - dependencies injected above\r\n // This enables better tree shaking as the injector can eliminate unused dependencies\r\n\r\n // Initialize reactive streams for performance optimization\r\n this.initializeReactiveStreams();\r\n\r\n // Lazy load heavy modules based on usage\r\n this.initializeLazyModules();\r\n }\r\n\r\n // Inject DatePipe for formatting\r\n private datePipe = inject(DatePipe);\r\n\r\n\r\n ngOnInit(): void {\r\n this.prefs = this.commonService.formatDateTimeWithPrefs();\r\n this.tableFilterViewId = this.selectedPresetId;\r\n // Initialize action buttons\r\n // this.initializeButtons();\r\n\r\n // Prevent multiple initial API calls on refresh/navigation\r\n if (this.hasEmittedInitialDate) {\r\n return;\r\n }\r\n\r\n // Set default date range to current date\r\n const today = new Date();\r\n this.bsRangeValue = [today, today];\r\n this.isDefaultDateRange = true; // Mark as default\r\n\r\n // Emit default date event to send to API\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: this.bsRangeValue,\r\n isSingleDay: true\r\n }\r\n };\r\n this.genericEvent.emit(eventData);\r\n\r\n // Mark as emitted to prevent duplicate calls\r\n this.hasEmittedInitialDate = true;\r\n\r\n // Modify actions to include calendar and clear buttons\r\n if (this.actions) {\r\n const emailIndex = this.actions.findIndex(button => button.name === 'Email');\r\n if (emailIndex !== -1) {\r\n this.actions[emailIndex] = {\r\n name: 'Calendar',\r\n iconPath: '',\r\n has_permission: true,\r\n is_showIcon: true,\r\n condition: null\r\n };\r\n this.actions.splice(emailIndex + 1, 0, {\r\n name: 'Clear',\r\n iconPath: '',\r\n has_permission: true,\r\n is_showIcon: true,\r\n condition: null\r\n });\r\n }\r\n }\r\n\r\n // Apply theme from backend config if provided, otherwise use default theme\r\n // Theme functionality removed\r\n\r\n // // Subscribe to loading state from service\r\n // this.timeSheetService.loading$.subscribe(loading => {\r\n // this.loading = loading;\r\n // this.cdr.markForCheck();\r\n // });\r\n }\r\n\r\n // private initializeButtons(): void {\r\n // this.buttons = [\r\n // {\r\n // name: 'Email',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/New/smsIcon.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Add Attendance',\r\n // iconPath: this.singleSpaAssetsPath + 'data-grid/icons/plus.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Back Pay',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/back pay.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Grand Total',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/grandtotal.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Print',\r\n // iconPath: '../../../../assets/media/icons/techbar/svg/New/printIcon.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: null\r\n // },\r\n // {\r\n // name: 'Export',\r\n // iconPath: '../../../../assets/media/icons/techbar/general/export.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: '!isSingleDay'\r\n // },\r\n // {\r\n // name: 'Export Daily Timesheet',\r\n // iconPath: '../../../../assets/media/icons/techbar/general/export.svg',\r\n // has_permission: true,\r\n // is_showIcon: true,\r\n // condition: 'isSingleDay'\r\n // }\r\n // ];\r\n // }\r\n\r\n private async initializeLazyModules(): Promise<void> {\r\n // Lazy load virtual scrolling module only when needed\r\n if (this.dataSet.length > 100) {\r\n if (!VirtualScrollModule) {\r\n VirtualScrollModule = await import('@angular/cdk/scrolling');\r\n }\r\n }\r\n\r\n // Lazy load drag-drop module only when drag operations are enabled\r\n if (this.columns.some(col => col.is_draggable)) {\r\n if (!DragDropModuleLazy) {\r\n DragDropModuleLazy = await import('@angular/cdk/drag-drop');\r\n }\r\n }\r\n\r\n // Lazy load date picker module only when date columns exist\r\n if (this.columns.some(col => col.type === 'date')) {\r\n if (!DatePickerModule) {\r\n DatePickerModule = await import('ngx-bootstrap/datepicker');\r\n }\r\n }\r\n }\r\n\r\n private initializeReactiveStreams(): void {\r\n // Throttled scroll handling\r\n this.scrollSubject.pipe(\r\n throttleTime(16), // ~60fps\r\n distinctUntilChanged()\r\n ).subscribe(scrollTop => {\r\n this.handleOptimizedScroll(scrollTop);\r\n });\r\n\r\n // Debounced filter handling\r\n this.filterSubject.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged()\r\n ).subscribe(filters => {\r\n this.handleOptimizedFilter(filters);\r\n });\r\n\r\n // Viewport resize handling\r\n this.viewportResizeSubject.pipe(\r\n throttleTime(100)\r\n ).subscribe(() => {\r\n this.handleViewportResize();\r\n });\r\n }\r\n\r\n @ViewChild('cellText', { static: false }) cellText!: ElementRef;\r\n async ngAfterViewInit() {\r\n this.startPerformanceTimer('renderTime');\r\n\r\n // Use requestAnimationFrame for better performance\r\n requestAnimationFrame(async () => {\r\n // Initialize efficient data structures\r\n this.initializeDataStructures();\r\n\r\n await this.SetColumnsDefaultWidth();\r\n await this.refreshHeaders();\r\n this.updateFlattenedData();\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n\r\n // Setup optimized resize observer\r\n if (this.cellText) {\r\n const observer = new ResizeObserver(() => {\r\n this.ngZone.run(() => {\r\n this.viewportResizeSubject.next();\r\n });\r\n });\r\n observer.observe(this.cellText.nativeElement);\r\n this.resizeObservers.add(observer);\r\n }\r\n\r\n // Setup scroll listeners with optimization\r\n this.setupOptimizedScrollListeners();\r\n \r\n // Initialize viewport-based lazy loading\r\n this.initializeViewportLazyLoading();\r\n \r\n // Initialize advanced service worker caching\r\n this.initializeServiceWorkerCaching();\r\n \r\n this.endPerformanceTimer('renderTime');\r\n });\r\n }\r\n\r\n private setupOptimizedScrollListeners(): void {\r\n if (this.mainScroll?.nativeElement) {\r\n const scrollHandler = (event: Event) => {\r\n const scrollTop = (event.target as HTMLElement).scrollTop;\r\n this.updateScrollMetrics(scrollTop);\r\n this.scrollSubject.next(scrollTop);\r\n };\r\n\r\n this.mainScroll.nativeElement.addEventListener('scroll', scrollHandler, { passive: true });\r\n this.eventListeners.set('mainScroll', scrollHandler);\r\n }\r\n }\r\n\r\n private updateScrollMetrics(scrollTop: number): void {\r\n const now = performance.now();\r\n const deltaTime = now - (this.lastScrollTime || now);\r\n this.lastScrollTime = now;\r\n\r\n const deltaScroll = scrollTop - this.lastScrollTop;\r\n this.scrollVelocity = deltaScroll / deltaTime;\r\n this.scrollAcceleration = (this.scrollVelocity - (this.previousVelocity || 0)) / deltaTime;\r\n this.previousVelocity = this.scrollVelocity;\r\n\r\n // Determine scroll direction\r\n if (deltaScroll > 5) {\r\n this.scrollDirection = 'down';\r\n } else if (deltaScroll < -5) {\r\n this.scrollDirection = 'up';\r\n } else {\r\n this.scrollDirection = 'none';\r\n }\r\n\r\n this.lastScrollTop = scrollTop;\r\n }\r\n\r\n private lastScrollTime = 0;\r\n private previousVelocity = 0;\r\n\r\n private handleOptimizedScroll(scrollTop: number): void {\r\n this.expandedCells.clear();\r\n\r\n if (this.groupedColumns?.length > 0) {\r\n this.startIndex = 0;\r\n this.scheduleAnimationFrame(() => this.cdr.markForCheck());\r\n return;\r\n }\r\n\r\n // If dataset is small (<=1000 items), show all data without virtual scrolling\r\n if (this.flattenedData.length <= 1000) {\r\n this.visibleRows = this.flattenedData.slice();\r\n this.translateY = 0;\r\n this.startIndex = 0;\r\n this.scheduleAnimationFrame(() => this.cdr.markForCheck());\r\n return;\r\n }\r\n\r\n // Dynamic item height estimation with caching\r\n this.updateItemHeightEstimations();\r\n\r\n // Adaptive overscan based on scroll velocity\r\n const adaptiveOverscan = this.calculateAdaptiveOverscan();\r\n const newStartIndex = this.calculateStartIndex(scrollTop);\r\n const start = Math.max(0, newStartIndex - adaptiveOverscan);\r\n const end = Math.min(this.flattenedData.length, newStartIndex + this.viewportRows + adaptiveOverscan);\r\n\r\n // Only update if there's a significant change or direction change\r\n if (Math.abs(this.startIndex - start) > 3 || this.scrollDirection !== this.previousScrollDirection) {\r\n this.translateY = this.calculateTranslateY(start);\r\n this.startIndex = start;\r\n this.visibleRows = this.flattenedData.slice(start, end);\r\n this.previousScrollDirection = this.scrollDirection;\r\n\r\n // Use animation frame for smooth updates\r\n this.scheduleAnimationFrame(() => this.cdr.markForCheck());\r\n }\r\n\r\n\r\n // Force recalculation when accordion state changes\r\n if (this.hasAccordionStateChanged()) {\r\n this.updateVisibleRowsOptimized(scrollTop);\r\n }\r\n }\r\n\r\n private updateItemHeightEstimations(): void {\r\n if (this.dynamicItemHeights.size < this.heightCalculationSamples) {\r\n // Sample actual heights from rendered items\r\n const rows = this.mainScroll?.nativeElement?.querySelectorAll('.data-row');\r\n if (rows) {\r\n rows.forEach((row, index) => {\r\n const height = (row as HTMLElement).offsetHeight;\r\n if (height > 0) {\r\n this.dynamicItemHeights.set(this.startIndex + index, height);\r\n }\r\n });\r\n }\r\n\r\n // Calculate average height\r\n if (this.dynamicItemHeights.size > 0) {\r\n const heights = Array.from(this.dynamicItemHeights.values());\r\n this.averageItemHeight = heights.reduce((sum, h) => sum + h, 0) / heights.length;\r\n }\r\n }\r\n }\r\n\r\n private calculateAdaptiveOverscan(): number {\r\n // Increase overscan during fast scrolling\r\n const baseOverscan = this.virtualScrollBuffer;\r\n const velocityMultiplier = Math.min(Math.abs(this.scrollVelocity) * 100, 2);\r\n return Math.floor(baseOverscan * (1 + velocityMultiplier));\r\n }\r\n\r\n private calculateStartIndex(scrollTop: number): number {\r\n // Use dynamic height estimation for more accurate positioning\r\n let totalHeight = 0;\r\n let index = 0;\r\n\r\n for (let i = 0; i < this.flattenedData.length; i++) {\r\n const row = this.flattenedData[i];\r\n let itemHeight: number;\r\n\r\n if (row && row.isDetailsExpand) {\r\n // For expanded rows, use the actual accordion height\r\n itemHeight = this.getAccordionRowHeight(row);\r\n } else {\r\n itemHeight = this.dynamicItemHeights.get(i) || this.averageItemHeight;\r\n }\r\n\r\n if (totalHeight + itemHeight > scrollTop) {\r\n index = i;\r\n break;\r\n }\r\n totalHeight += itemHeight;\r\n }\r\n\r\n return index;\r\n }\r\n\r\n private calculateTranslateY(startIndex: number): number {\r\n let translateY = 0;\r\n for (let i = 0; i < startIndex; i++) {\r\n const row = this.flattenedData[i];\r\n if (row && row.isDetailsExpand) {\r\n // For expanded rows, use the actual accordion height\r\n const accordionHeight = this.getAccordionRowHeight(row);\r\n translateY += accordionHeight;\r\n } else {\r\n translateY += this.dynamicItemHeights.get(i) || this.averageItemHeight;\r\n }\r\n }\r\n return translateY;\r\n }\r\n\r\n private previousScrollDirection: 'up' | 'down' | 'none' = 'none';\r\n\r\n\r\n\r\n private handleOptimizedFilter(filters: any[]): void {\r\n this.startPerformanceTimer('filterTime');\r\n\r\n // Use worker for heavy filtering operations\r\n if (this.dataSet.length > 500) {\r\n this.processHeavyComputationsWithWorker(this.dataSet, 'filter')\r\n .then(filteredData => {\r\n // Apply filtered data\r\n this.dataSet = filteredData;\r\n this.updateFlattenedData();\r\n this.updateVisibleRowsOptimized(0);\r\n this.endPerformanceTimer('filterTime');\r\n this.cdr.markForCheck();\r\n })\r\n .catch(error => {\r\n console.warn('Worker filtering failed, falling back to main thread:', error);\r\n this.applyFilteroptionList().then(() => {\r\n this.endPerformanceTimer('filterTime');\r\n });\r\n });\r\n } else {\r\n this.applyFilteroptionList().then(() => {\r\n this.endPerformanceTimer('filterTime');\r\n });\r\n }\r\n }\r\n\r\n private handleViewportResize(): void {\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n // Batch change detection updates\r\n let needsUpdate = false;\r\n\r\n if (changes['selectedPresetId'] && changes['selectedPresetId'].currentValue) {\r\n this.tableFilterViewId = changes['selectedPresetId'].currentValue;\r\n const selectedPreset = this.tableView?.find(preset => preset.id === this.tableFilterViewId);\r\n if (selectedPreset) {\r\n this.presetName = selectedPreset.name;\r\n }\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['filtersConfig']) {\r\n this.filterSubject.next(this.filtersConfig);\r\n this.checkFilterChangesEffect();\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['columns']?.currentValue?.length) {\r\n await this.commonSevice.applyFiltersToColumns(this.columns, this.filtersConfig)\r\n // Use immutable data patterns for better performance\r\n this.originalColumns = [...this.columns.map(col => ({ ...col }))];\r\n this.buildColumnIndex();\r\n\r\n if (this.dataGridContainer?.nativeElement?.offsetWidth) {\r\n await Promise.all([\r\n this.SetColumnsDefaultWidth(),\r\n this.updateColumnWidthsAndGroups(),\r\n this.refreshPreviewColumns()\r\n ]);\r\n this.setSectionsWidth();\r\n needsUpdate = true;\r\n }\r\n this.generateDropListIds();\r\n }\r\n\r\n if (changes['dataSet']) {\r\n // Check if progressive loading should be used\r\n if (this.enableProgressiveLoading && this.dataSet && this.dataSet.length > this.progressiveChunkSize) {\r\n this.initializeProgressiveLoading();\r\n } else {\r\n this.processDataSetDirectly();\r\n }\r\n\r\n\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['checkboxState']?.currentValue?.reset) {\r\n this.selectedRows.clear();\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['closeDropdown']) {\r\n if (this.closeDropdown.preset.closed) {\r\n this.activeTopButton = null;\r\n }\r\n }\r\n\r\n if (changes['oddRowsBackgroundColor']) {\r\n this.rowShadingEnabled = this.oddRowsBackgroundColor ? true : false;\r\n needsUpdate = true;\r\n }\r\n\r\n if (changes['isSingleDay']?.currentValue === true) {\r\n // Use immutable update pattern\r\n this.dataSet = this.dataSet.map(row => ({\r\n ...row,\r\n isDetailsExpand: false\r\n }));\r\n needsUpdate = true;\r\n }\r\n\r\n // Handle theme-related input changes - theme functionality removed\r\n\r\n if (needsUpdate) {\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n\r\n\r\n\r\n async applyFilteroptionList() {\r\n this.startPerformanceTimer('filterTime');\r\n\r\n const updatedColumns = await this.commonSevice.applyFiltersToColumns(this.columns, this.filtersConfig);\r\n this.columns = [...updatedColumns];\r\n this.cdr.markForCheck();\r\n\r\n this.endPerformanceTimer('filterTime');\r\n }\r\n leftPinnedColumns: any[] = [];\r\n centerColumns: any[] = [];\r\n rightPinnedColumns: any[] = [];\r\n\r\n previewLeftPinnedColumns: any[] = [];\r\n previewCenterColumns: any[] = [];\r\n previewRightPinnedColumns: any[] = [];\r\n\r\n // Main Container Template References\r\n @ViewChild('dataGridContainer')\r\n dataGridContainer!: ElementRef<HTMLDivElement>;\r\n\r\n // Body Template References\r\n @ViewChild('leftPinnedBody')\r\n leftPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedBody')\r\n centerPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedBody')\r\n rightPinnedBody!: ElementRef<HTMLDivElement>;\r\n\r\n // Headers Template References\r\n @ViewChild('leftPinnedHeader')\r\n leftPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedHeader')\r\n centerPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedHeader')\r\n rightPinnedHeader!: ElementRef<HTMLDivElement>;\r\n\r\n @ViewChild('columnsGroupedBox')\r\n columnsGroupedBox!: ElementRef<HTMLDivElement>;\r\n\r\n // Cached DOM elements for performance\r\n private cachedElements = new Map<string, HTMLElement[]>();\r\n private resizeObserver: ResizeObserver | null = null;\r\n private elementCacheTimeout: any;\r\n\r\n // Efficient data structures for performance\r\n private columnIndex = new Map<string, any>(); // field -> column mapping\r\n private rowIndex = new WeakMap<any, number>(); // row object -> index mapping\r\n private visibleColumnCache = new Map<string, any[]>(); // cache for visible columns\r\n\r\n // Advanced DOM query optimization and caching\r\n private domQueryCache = new Map<string, { elements: HTMLElement[]; timestamp: number; ttl: number }>();\r\n private domQueryStats = new Map<string, { hits: number; misses: number; lastAccess: number }>();\r\n private cacheCleanupInterval: number | null = null;\r\n private readonly CACHE_TTL = 10000; // 10 seconds\r\n private readonly MAX_CACHE_SIZE = 100;\r\n\r\n private getOptimizedElements(selector: string, context?: Element): HTMLElement[] {\r\n const cacheKey = context ? `${selector}:${context.tagName}[${context.className}]` : selector;\r\n const now = Date.now();\r\n\r\n // Check cache first\r\n const cached = this.domQueryCache.get(cacheKey);\r\n if (cached && (now - cached.timestamp) < cached.ttl) {\r\n // Update stats\r\n const stats = this.domQueryStats.get(cacheKey) || { hits: 0, misses: 0, lastAccess: 0 };\r\n stats.hits++;\r\n stats.lastAccess = now;\r\n this.domQueryStats.set(cacheKey, stats);\r\n return cached.elements;\r\n }\r\n\r\n // Cache miss - perform query\r\n const stats = this.domQueryStats.get(cacheKey) || { hits: 0, misses: 0, lastAccess: 0 };\r\n stats.misses++;\r\n stats.lastAccess = now;\r\n this.domQueryStats.set(cacheKey, stats);\r\n\r\n // Perform optimized query\r\n let elements: HTMLElement[];\r\n if (context) {\r\n elements = Array.from(context.querySelectorAll(selector)) as HTMLElement[];\r\n } else {\r\n elements = Array.from(document.querySelectorAll(selector)) as HTMLElement[];\r\n }\r\n\r\n // Cache the result with TTL\r\n this.domQueryCache.set(cacheKey, {\r\n elements: [...elements], // Clone to prevent external mutations\r\n timestamp: now,\r\n ttl: this.CACHE_TTL\r\n });\r\n\r\n // Implement LRU eviction if cache is too large\r\n if (this.domQueryCache.size > this.MAX_CACHE_SIZE) {\r\n this.evictOldestCacheEntries();\r\n }\r\n\r\n return elements;\r\n }\r\n\r\n private evictOldestCacheEntries(): void {\r\n const entries = Array.from(this.domQueryCache.entries())\r\n .sort((a, b) => a[1].timestamp - b[1].timestamp);\r\n\r\n const toRemove = Math.floor(this.MAX_CACHE_SIZE * 0.2); // Remove 20% oldest\r\n for (let i = 0; i < toRemove && entries.length > 0; i++) {\r\n this.domQueryCache.delete(entries[i][0]);\r\n }\r\n }\r\n\r\n private getOptimizedElement(selector: string, context?: Element): HTMLElement | null {\r\n const elements = this.getOptimizedElements(selector, context);\r\n return elements.length > 0 ? elements[0] : null;\r\n }\r\n\r\n private invalidateDomCache(pattern?: string): void {\r\n if (pattern) {\r\n // Invalidate cache entries matching pattern\r\n for (const key of this.domQueryCache.keys()) {\r\n if (key.includes(pattern)) {\r\n this.domQueryCache.delete(key);\r\n }\r\n }\r\n } else {\r\n // Clear all cache\r\n this.domQueryCache.clear();\r\n this.domQueryStats.clear();\r\n }\r\n }\r\n\r\n private startCacheCleanup(): void {\r\n if (this.cacheCleanupInterval) return;\r\n\r\n this.cacheCleanupInterval = window.setInterval(() => {\r\n const now = Date.now();\r\n const toDelete: string[] = [];\r\n\r\n for (const [key, cached] of this.domQueryCache.entries()) {\r\n if (now - cached.timestamp > cached.ttl) {\r\n toDelete.push(key);\r\n }\r\n }\r\n\r\n toDelete.forEach(key => this.domQueryCache.delete(key));\r\n }, 5000); // Clean every 5 seconds\r\n }\r\n\r\n private stopCacheCleanup(): void {\r\n if (this.cacheCleanupInterval) {\r\n clearInterval(this.cacheCleanupInterval);\r\n this.cacheCleanupInterval = null;\r\n }\r\n }\r\n\r\n // Legacy methods for backward compatibility\r\n private getCachedElements(selector: string): HTMLElement[] {\r\n return this.getOptimizedElements(selector);\r\n }\r\n\r\n private clearElementCache(): void {\r\n this.invalidateDomCache();\r\n }\r\n\r\n // Efficient data structure methods\r\n private buildColumnIndex(): void {\r\n this.columnIndex.clear();\r\n this.columns.forEach((col, index) => {\r\n this.columnIndex.set(col.field, { ...col, globalIndex: index });\r\n if (col.children) {\r\n col.children.forEach((child, childIndex) => {\r\n this.columnIndex.set(child.field, { ...child, globalIndex: index, childIndex });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private buildRowIndex(): void {\r\n this.rowIndex = new WeakMap();\r\n this.dataSet.forEach((row, index) => {\r\n this.rowIndex.set(row, index);\r\n });\r\n }\r\n\r\n private getColumnByField(field: string): any {\r\n return this.columnIndex.get(field);\r\n }\r\n\r\n private getRowIndex(row: any): number {\r\n return this.rowIndex.get(row) ?? -1;\r\n }\r\n\r\n // Enhanced caching methods\r\n private setDataCache(key: string, data: any, ttl: number = 5000): void {\r\n this.dataCache.set(key, { data, timestamp: Date.now(), ttl });\r\n }\r\n\r\n private getDataCache(key: string): any {\r\n const item = this.dataCache.get(key);\r\n if (item && Date.now() - item.timestamp < item.ttl) {\r\n return item.data;\r\n }\r\n this.dataCache.delete(key);\r\n return null;\r\n }\r\n\r\n private setComputationCache(key: string, result: any): void {\r\n this.computationCache.set(key, { result, timestamp: Date.now() });\r\n }\r\n\r\n private getComputationCache(key: string): any {\r\n const cached = this.computationCache.get(key);\r\n if (cached && Date.now() - cached.timestamp < 1000) { // 1 second TTL\r\n return cached.result;\r\n }\r\n return null;\r\n }\r\n\r\n // Advanced template expression memoization\r\n private templateExpressionCache = new Map<string, { value: any; timestamp: number; ttl: number }>();\r\n\r\n // Memoize expensive template expressions with TTL\r\n memoizeTemplateExpression(key: string, expression: () => any, ttl: number = 1000): any {\r\n const cached = this.templateExpressionCache.get(key);\r\n const now = performance.now();\r\n\r\n if (cached && (now - cached.timestamp) < cached.ttl) {\r\n return cached.value;\r\n }\r\n\r\n const result = expression();\r\n this.templateExpressionCache.set(key, { value: result, timestamp: now, ttl });\r\n return result;\r\n }\r\n\r\n // Clear template cache when data changes\r\n clearTemplateCache(): void {\r\n this.templateExpressionCache.clear();\r\n }\r\n\r\n // Advanced Zone.js optimizations for ultra-fast change detection\r\n private zoneOptimizationEnabled = true;\r\n private microtaskQueue: (() => void)[] = [];\r\n private isProcessingMicrotasks = false;\r\n private animationFrameQueue: (() => void)[] = [];\r\n private isProcessingAnimationFrames = false;\r\n\r\n // Advanced memory management with object pooling\r\n private objectPool = new Map<string, any[]>();\r\n private maxPoolSize = 100;\r\n\r\n // Get object from pool or create new one\r\n private getPooledObject<T>(type: string, factory: () => T): T {\r\n const pool = this.objectPool.get(type) || [];\r\n if (pool.length > 0) {\r\n return pool.pop() as T;\r\n }\r\n return factory();\r\n }\r\n\r\n // Return object to pool\r\n private returnToPool(type: string, obj: any): void {\r\n const pool = this.objectPool.get(type) || [];\r\n if (pool.length < this.maxPoolSize) {\r\n pool.push(obj);\r\n this.objectPool.set(type, pool);\r\n }\r\n }\r\n\r\n // Ultra-fast change detection with batched microtasks\r\n private scheduleMicrotask(callback: () => void): void {\r\n if (!this.zoneOptimizationEnabled) {\r\n callback();\r\n return;\r\n }\r\n\r\n this.microtaskQueue.push(callback);\r\n\r\n if (!this.isProcessingMicrotasks) {\r\n this.isProcessingMicrotasks = true;\r\n queueMicrotask(() => this.processMicrotaskQueue());\r\n }\r\n }\r\n\r\n private processMicrotaskQueue(): void {\r\n const queue = [...this.microtaskQueue];\r\n this.microtaskQueue.length = 0;\r\n this.isProcessingMicrotasks = false;\r\n\r\n // Process in batches to prevent stack overflow\r\n const batchSize = 10;\r\n for (let i = 0; i < queue.length; i += batchSize) {\r\n const batch = queue.slice(i, i + batchSize);\r\n batch.forEach(callback => callback());\r\n }\r\n }\r\n\r\n // Animation frame scheduling for smooth DOM updates\r\n private scheduleAnimationFrame(callback: () => void): void {\r\n this.animationFrameQueue.push(callback);\r\n\r\n if (!this.isProcessingAnimationFrames) {\r\n this.isProcessingAnimationFrames = true;\r\n requestAnimationFrame(() => this.processAnimationFrameQueue());\r\n }\r\n }\r\n\r\n private processAnimationFrameQueue(): void {\r\n const queue = [...this.animationFrameQueue];\r\n this.animationFrameQueue.length = 0;\r\n this.isProcessingAnimationFrames = false;\r\n\r\n queue.forEach(callback => callback());\r\n }\r\n\r\n // Advanced memory leak prevention with WeakRefs\r\n private weakRefRegistry = new WeakMap<object, Set<() => void>>();\r\n\r\n // Register object for advanced cleanup\r\n registerForAdvancedCleanup(obj: object, cleanup: () => void): void {\r\n if (!this.weakRefRegistry.has(obj)) {\r\n this.weakRefRegistry.set(obj, new Set());\r\n }\r\n this.weakRefRegistry.get(obj)!.add(cleanup);\r\n }\r\n\r\n // Cleanup WeakRef registered objects\r\n cleanupWeakRefs(): void {\r\n // Note: WeakRefs are automatically cleaned up, but we can manually trigger cleanup\r\n this.weakRefRegistry = new WeakMap();\r\n }\r\n\r\n // Progressive hydration for better initial load\r\n private hydrationQueue: { callback: () => void; priority: number }[] = [];\r\n private isHydrating = false;\r\n\r\n // Add component to hydration queue with priority\r\n queueForHydration(callback: () => void, priority: number = 0): void {\r\n this.hydrationQueue.push({ callback, priority });\r\n this.hydrationQueue.sort((a, b) => a.priority - b.priority);\r\n\r\n if (!this.isHydrating) {\r\n this.startProgressiveHydration();\r\n }\r\n }\r\n\r\n private startProgressiveHydration(): void {\r\n this.isHydrating = true;\r\n\r\n const hydrateNext = () => {\r\n if (this.hydrationQueue.length === 0) {\r\n this.isHydrating = false;\r\n return;\r\n }\r\n\r\n const item = this.hydrationQueue.shift()!;\r\n item.callback();\r\n\r\n // Schedule next hydration with requestIdleCallback for better performance\r\n if (typeof requestIdleCallback !== 'undefined') {\r\n requestIdleCallback(hydrateNext);\r\n } else {\r\n setTimeout(hydrateNext, 0);\r\n }\r\n };\r\n\r\n hydrateNext();\r\n }\r\n\r\n // Center Fake scrollbard\r\n @ViewChild('centerFakeScrollbar')\r\n centerFakeScrollbar!: ElementRef<HTMLDivElement>;\r\n async updateColumnWidthsAndGroups(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap in a promise so we can await\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.leftPinnedColumns = left;\r\n this.centerColumns = center;\r\n this.rightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 0));\r\n this.cdr.markForCheck();\r\n }\r\n\r\n async refreshPreviewColumns(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap prepareColumns in a Promise to make it awaitable\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.previewLeftPinnedColumns = left;\r\n this.previewCenterColumns = center;\r\n this.previewRightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.cdr.markForCheck();\r\n }\r\n\r\n\r\n async SetColumnsDefaultWidth() {\r\n const containerWidth = this.dataGridContainer?.nativeElement.offsetWidth;\r\n this.columns = this.columnService.assignDefaultWidths(\r\n this.columns,\r\n containerWidth\r\n );\r\n await new Promise(resolve => setTimeout(resolve, 0));\r\n this.cdr.markForCheck();\r\n }\r\n\r\n\r\n setSectionsWidth() {\r\n const left = this.getCachedElement('.left-pinned-body');\r\n const center = this.getCachedElement('.center-scrollable-body');\r\n const right = this.getCachedElement('.right-pinned-body');\r\n\r\n if (left && this.leftPinnedHeader) {\r\n left.style.minWidth = `${this.leftPinnedHeader.nativeElement.offsetWidth}px`;\r\n }\r\n if (center && this.centerPinnedHeader) {\r\n center.style.minWidth = `${this.centerPinnedHeader.nativeElement.offsetWidth}px`;\r\n }\r\n if (right && this.rightPinnedHeader) {\r\n right.style.minWidth = `${this.rightPinnedHeader.nativeElement.offsetWidth}px`;\r\n }\r\n\r\n // Invalidate DOM cache after width changes to ensure fresh queries\r\n this.invalidateDomCache('.left-pinned-body');\r\n this.invalidateDomCache('.center-scrollable-body');\r\n this.invalidateDomCache('.right-pinned-body');\r\n }\r\n\r\n // Optimized DOM query with advanced caching\r\n private getCachedElement(selector: string, context?: Element): HTMLElement | null {\r\n return this.getOptimizedElement(selector, context);\r\n }\r\n\r\n // Performance monitoring utilities\r\n private performanceMetrics: PerformanceMetrics = {\r\n renderTime: 0,\r\n scrollTime: 0,\r\n filterTime: 0,\r\n sortTime: 0,\r\n lastRenderStart: 0,\r\n renderCount: 0\r\n };\r\n\r\n private startPerformanceTimer(metric: keyof typeof this.performanceMetrics): void {\r\n if (typeof performance !== 'undefined') {\r\n this.performanceMetrics.lastRenderStart = performance.now();\r\n }\r\n }\r\n\r\n private endPerformanceTimer(metric: keyof typeof this.performanceMetrics): void {\r\n if (typeof performance !== 'undefined' && this.performanceMetrics.lastRenderStart > 0) {\r\n const duration = performance.now() - this.performanceMetrics.lastRenderStart;\r\n this.performanceMetrics[metric] += duration;\r\n if (metric === 'renderTime') {\r\n this.performanceMetrics.renderCount++;\r\n }\r\n this.performanceMetrics.lastRenderStart = 0;\r\n\r\n // Log performance warnings for slow operations\r\n if (duration > 16.67) { // More than one frame at 60fps\r\n console.warn(`Performance warning: ${metric} took ${duration.toFixed(2)}ms`);\r\n }\r\n }\r\n }\r\n\r\n // Progressive loading implementation\r\n private initializeProgressiveLoading(): void {\r\n this.progressiveLoadingChunks = [];\r\n this.progressiveLoadingIndex = 0;\r\n this.isProgressiveLoading = true;\r\n\r\n // Split data into chunks\r\n for (let i = 0; i < this.dataSet.length; i += this.progressiveChunkSize) {\r\n this.progressiveLoadingChunks.push(this.dataSet.slice(i, i + this.progressiveChunkSize));\r\n }\r\n\r\n // Start with empty dataset\r\n this.dataSet = [];\r\n this.originalDataSet = [];\r\n this.flattenedData = [];\r\n\r\n // Start progressive loading\r\n this.loadNextProgressiveChunk();\r\n }\r\n\r\n private loadNextProgressiveChunk(): void {\r\n if (this.progressiveLoadingIndex >= this.progressiveLoadingChunks.length) {\r\n this.isProgressiveLoading = false;\r\n this.finalizeProgressiveLoading();\r\n return;\r\n }\r\n\r\n const chunk = this.progressiveLoadingChunks[this.progressiveLoadingIndex];\r\n const processedChunk = chunk.map((row, i) => ({\r\n ...row,\r\n __virtualIndex: (this.progressiveLoadingIndex * this.progressiveChunkSize) + i + 1\r\n }));\r\n\r\n // Add chunk to dataset\r\n this.dataSet = [...this.dataSet, ...processedChunk];\r\n this.originalDataSet = [...this.originalDataSet, ...processedChunk.map(row => ({ ...row }))];\r\n\r\n this.progressiveLoadingIndex++;\r\n\r\n // Update UI progressively\r\n this.updateFlattenedData();\r\n this.buildRowIndex();\r\n this.expandedCells.clear();\r\n\r\n // Schedule next chunk\r\n if (this.progressiveLoadingIndex < this.progressiveLoadingChunks.length) {\r\n setTimeout(() => this.loadNextProgressiveChunk(), this.progressiveDelay);\r\n } else {\r\n this.finalizeProgressiveLoading();\r\n }\r\n\r\n // Trigger change detection\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private finalizeProgressiveLoading(): void {\r\n this.isProgressiveLoading = false;\r\n\r\n // Final updates\r\n requestAnimationFrame(() => {\r\n if (this.mainScroll?.nativeElement) {\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n }\r\n });\r\n\r\n if (this.centerPinnedHeader?.nativeElement) {\r\n void this.centerPinnedHeader.nativeElement.offsetWidth;\r\n if (this.centerScrollableBody?.nativeElement) {\r\n this.centerScrollableBody.nativeElement.scrollLeft = this.centerPinnedHeader.nativeElement.scrollLeft;\r\n }\r\n }\r\n }\r\n\r\n private processDataSetDirectly(): void {\r\n // Optimize data processing with immutable patterns\r\n const processedData = this.dataSet?.map((row, i) => ({\r\n ...row,\r\n __virtualIndex: i + 1\r\n })) || [];\r\n\r\n // Create immutable copies\r\n this.dataSet = [...processedData];\r\n this.originalDataSet = [...processedData.map(row => ({ ...row }))];\r\n this.buildRowIndex();\r\n this.expandedCells.clear();\r\n\r\n // Reapply grouping if columns are grouped\r\n if (this.groupedColumns?.length > 0) {\r\n this.reapplyGroupingAfterDataChange();\r\n } else {\r\n this.updateFlattenedData();\r\n }\r\n\r\n // Clear template cache when data changes\r\n this.clearTemplateCache();\r\n\r\n // Use requestAnimationFrame for smooth updates\r\n requestAnimationFrame(() => {\r\n if (this.mainScroll?.nativeElement) {\r\n this.computeViewportRows();\r\n this.updateVisibleRowsOptimized(0);\r\n }\r\n });\r\n\r\n if (this.centerPinnedHeader?.nativeElement) {\r\n void this.centerPinnedHeader.nativeElement.offsetWidth;\r\n if (this.centerScrollableBody?.nativeElement) {\r\n this.centerScrollableBody.nativeElement.scrollLeft = this.centerPinnedHeader.nativeElement.scrollLeft;\r\n }\r\n }\r\n }\r\n\r\n private reapplyGroupingAfterDataChange(): void {\r\n if (!this.groupedColumns?.length) return;\r\n\r\n const fields = this.groupedColumns.map((col) => col.field);\r\n this.dataSet = this.groupData(this.originalDataSet, fields);\r\n this.updateFlattenedData();\r\n }\r\n\r\n // Advanced performance profiling and optimization metrics\r\n private profilerMarks = new Map<string, number>();\r\n private profilerMeasures = new Map<string, { start: number; end: number; duration: number }>();\r\n private performanceThresholds = {\r\n renderTime: 16.67, // 60fps\r\n scrollTime: 8.33, // 120fps for smooth scrolling\r\n filterTime: 100, // 100ms for acceptable filter response\r\n };\r\n\r\n // Performance metrics interface\r\n metrics: PerformanceMetrics = {} as PerformanceMetrics;\r\n\r\n // Start performance profiling\r\n startProfiling(markName: string): void {\r\n if (typeof performance !== 'undefined' && performance.mark) {\r\n const mark = `${markName}_${Date.now()}`;\r\n performance.mark(mark);\r\n this.profilerMarks.set(markName, performance.now());\r\n }\r\n }\r\n\r\n // End performance profiling and measure\r\n endProfiling(markName: string): number {\r\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\r\n const startMark = `${markName}_${Date.now() - 1000}`; // Look back 1 second\r\n const endMark = `${markName}_${Date.now()}`;\r\n\r\n try {\r\n performance.mark(endMark);\r\n const measureName = `${markName}_measure`;\r\n performance.measure(measureName, startMark, endMark);\r\n\r\n const measure = performance.getEntriesByName(measureName)[0];\r\n const duration = measure ? measure.duration : 0;\r\n\r\n this.profilerMeasures.set(markName, {\r\n start: this.profilerMarks.get(markName) || 0,\r\n end: performance.now(),\r\n duration\r\n });\r\n\r\n // Log warnings for performance issues\r\n this.checkPerformanceThresholds(markName, duration);\r\n\r\n // Cleanup\r\n performance.clearMarks(startMark);\r\n performance.clearMarks(endMark);\r\n performance.clearMeasures(measureName);\r\n\r\n return duration;\r\n } catch (error) {\r\n // Fallback to basic timing\r\n const startTime = this.profilerMarks.get(markName);\r\n if (startTime) {\r\n const duration = performance.now() - startTime;\r\n this.checkPerformanceThresholds(markName, duration);\r\n return duration;\r\n }\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n private checkPerformanceThresholds(operation: string, duration: number): void {\r\n const threshold = this.performanceThresholds[operation as keyof typeof this.performanceThresholds];\r\n if (threshold && duration > threshold) {\r\n console.warn(`Performance warning: ${operation} took ${duration.toFixed(2)}ms (threshold: ${threshold}ms)`);\r\n\r\n // Log additional context for debugging\r\n if (operation === 'renderTime') {\r\n console.warn('Consider optimizing change detection or reducing DOM complexity');\r\n } else if (operation === 'scrollTime') {\r\n console.warn('Consider reducing scroll event handlers or optimizing virtual scrolling');\r\n } else if (operation === 'filterTime') {\r\n console.warn('Consider using web workers for heavy filtering operations');\r\n }\r\n }\r\n }\r\n\r\n // Get detailed performance report\r\n getDetailedPerformanceReport(): {\r\n metrics: PerformanceMetrics;\r\n measures: Map<string, { start: number; end: number; duration: number }>;\r\n domCacheStats: { size: number; hitRate: number; totalQueries: number };\r\n memoryUsage: any;\r\n } {\r\n const totalQueries = Array.from(this.domQueryStats.values()).reduce((sum, stat) => sum + stat.hits + stat.misses, 0);\r\n const totalHits = Array.from(this.domQueryStats.values()).reduce((sum, stat) => sum + stat.hits, 0);\r\n const hitRate = totalQueries > 0 ? (totalHits / totalQueries) * 100 : 0;\r\n\r\n return {\r\n metrics: { ...this.performanceMetrics },\r\n measures: new Map(this.profilerMeasures),\r\n domCacheStats: {\r\n size: this.domQueryCache.size,\r\n hitRate,\r\n totalQueries\r\n },\r\n memoryUsage: this.getMemoryUsage()\r\n };\r\n }\r\n\r\n private getMemoryUsage(): any {\r\n if (typeof performance !== 'undefined' && (performance as any).memory) {\r\n const mem = (performance as any).memory;\r\n return {\r\n used: Math.round(mem.usedJSHeapSize / 1024 / 1024), // MB\r\n total: Math.round(mem.totalJSHeapSize / 1024 / 1024), // MB\r\n limit: Math.round(mem.jsHeapSizeLimit / 1024 / 1024), // MB\r\n usagePercent: Math.round((mem.usedJSHeapSize / mem.jsHeapSizeLimit) * 100)\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n // Performance optimization suggestions\r\n getOptimizationSuggestions(): string[] {\r\n const suggestions: string[] = [];\r\n const report = this.getDetailedPerformanceReport();\r\n\r\n // Check render performance\r\n if (report.metrics.renderTime > this.performanceThresholds.renderTime * 2) {\r\n suggestions.push('Consider implementing OnPush change detection strategy');\r\n suggestions.push('Use trackBy functions in *ngFor directives');\r\n suggestions.push('Implement lazy loading for heavy components');\r\n }\r\n\r\n // Check scroll performance\r\n if (report.metrics.scrollTime > this.performanceThresholds.scrollTime * 2) {\r\n suggestions.push('Optimize virtual scrolling implementation');\r\n suggestions.push('Reduce scroll event listeners or throttle them');\r\n suggestions.push('Use passive event listeners for scroll events');\r\n }\r\n\r\n // Check DOM cache efficiency\r\n if (report.domCacheStats.hitRate < 70) {\r\n suggestions.push('Optimize DOM query patterns to improve cache hit rate');\r\n suggestions.push('Consider using more specific selectors for DOM queries');\r\n }\r\n\r\n // Check memory usage\r\n if (report.memoryUsage && report.memoryUsage.usagePercent > 80) {\r\n suggestions.push('High memory usage detected - consider implementing data windowing');\r\n suggestions.push('Clear unused caches and event listeners');\r\n suggestions.push('Use WeakMap/WeakSet for temporary object references');\r\n }\r\n\r\n return suggestions;\r\n }\r\n\r\n // Get performance metrics for debugging\r\n getPerformanceMetrics(): PerformanceMetrics {\r\n return { ...this.performanceMetrics };\r\n }\r\n\r\n // Reset performance metrics\r\n resetPerformanceMetrics(): void {\r\n Object.keys(this.performanceMetrics).forEach(key => {\r\n if (key !== 'renderCount') {\r\n (this.performanceMetrics as any)[key] = 0;\r\n }\r\n });\r\n\r\n // Clear profiling data\r\n this.profilerMarks.clear();\r\n this.profilerMeasures.clear();\r\n this.domQueryStats.clear();\r\n }\r\n\r\n // Initialize efficient data structures\r\n private initializeDataStructures(): void {\r\n this.buildColumnIndex();\r\n this.buildRowIndex();\r\n\r\n // Clear caches on initialization\r\n this.dataCache.clear();\r\n this.computationCache.clear();\r\n this.domCache.clear();\r\n this.itemHeightCache.clear();\r\n\r\n // Initialize advanced DOM caching\r\n this.startCacheCleanup();\r\n }\r\n\r\n // Initialize viewport-based lazy loading\r\n private initializeViewportLazyLoading(): void {\r\n if (typeof IntersectionObserver === 'undefined') return;\r\n\r\n this.intersectionObserver = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n const element = entry.target as Element;\r\n const callback = this.lazyLoadCallbacks.get(element.id);\r\n if (callback) {\r\n callback();\r\n this.lazyLoadCallbacks.delete(element.id);\r\n this.intersectionObserver?.unobserve(element);\r\n }\r\n }\r\n });\r\n },\r\n {\r\n root: this.mainScroll?.nativeElement,\r\n rootMargin: '50px', // Load 50px before entering viewport\r\n threshold: 0.1\r\n }\r\n );\r\n }\r\n\r\n // Advanced Service Worker Caching for Static Assets\r\n private initializeServiceWorkerCaching(): void {\r\n if ('serviceWorker' in navigator && 'caches' in window) {\r\n // Register service worker for advanced caching\r\n navigator.serviceWorker.register('/sw.js').then(registration => {\r\n console.log('Service Worker registered for advanced caching');\r\n\r\n // Implement advanced caching strategies\r\n this.setupAdvancedCaching();\r\n }).catch(error => {\r\n console.warn('Service Worker registration failed:', error);\r\n });\r\n }\r\n }\r\n\r\n private setupAdvancedCaching(): void {\r\n // Implement advanced caching strategies using native Cache API\r\n if ('caches' in window) {\r\n // Create different cache strategies manually\r\n this.createCacheStrategy('ms-time-sheet-static-v1', 'cache-first');\r\n this.createCacheStrategy('ms-time-sheet-dynamic-v1', 'network-first');\r\n this.createCacheStrategy('ms-time-sheet-swr-v1', 'stale-while-revalidate');\r\n }\r\n\r\n // Pre-cache critical assets\r\n this.precacheCriticalAssets();\r\n }\r\n\r\n private createCacheStrategy(cacheName: string, strategy: string): void {\r\n // Manual implementation of caching strategies using native APIs\r\n caches.open(cacheName).then(cache => {\r\n // Cache is ready for use\r\n console.log(`${strategy} cache '${cacheName}' initialized`);\r\n }).catch(error => {\r\n console.warn(`Failed to create ${strategy} cache:`, error);\r\n });\r\n }\r\n\r\n private precacheCriticalAssets(): void {\r\n const criticalAssets = [\r\n '/assets/icons/',\r\n '/assets/images/',\r\n '/assets/fonts/',\r\n // Add other critical assets\r\n ];\r\n\r\n caches.open('ms-time-sheet-critical-v1').then(cache => {\r\n return cache.addAll(criticalAssets);\r\n }).catch(error => {\r\n console.warn('Critical assets pre-caching failed:', error);\r\n });\r\n }\r\n\r\n // Register element for viewport-based lazy loading\r\n registerForLazyLoading(elementId: string, callback: () => void): void {\r\n this.lazyLoadCallbacks.set(elementId, callback);\r\n const element = document.getElementById(elementId);\r\n if (element && this.intersectionObserver) {\r\n this.intersectionObserver.observe(element);\r\n }\r\n }\r\n\r\n // Check if element is in viewport\r\n isElementInViewport(element: Element): boolean {\r\n if (this.viewportElements.has(element)) {\r\n return this.viewportElements.get(element)!;\r\n }\r\n\r\n const rect = element.getBoundingClientRect();\r\n const containerRect = this.mainScroll?.nativeElement?.getBoundingClientRect();\r\n\r\n if (!containerRect) return false;\r\n\r\n const isVisible = (\r\n rect.top >= containerRect.top &&\r\n rect.left >= containerRect.left &&\r\n rect.bottom <= containerRect.bottom &&\r\n rect.right <= containerRect.right\r\n );\r\n\r\n this.viewportElements.set(element, isVisible);\r\n return isVisible;\r\n }\r\n\r\n // onCenterBodyScroll(): void {\r\n // const scrollTop = this.centerPinnedBody.nativeElement.scrollTop;\r\n // const scrollLeft = this.centerPinnedBody.nativeElement.scrollLeft;\r\n\r\n // // Sync vertical scroll with left & right pinned bodies\r\n // this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\r\n // this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\r\n\r\n // // Sync horizontal scroll with center header\r\n // this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n // this.centerFakeScrollbar.nativeElement.scrollLeft = scrollLeft;\r\n // }\r\n\r\n onLeftBodyScroll(): void {\r\n const scrollTop = this.leftPinnedBody.nativeElement.scrollTop;\r\n this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\r\n this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\r\n }\r\n onRightBodyScroll(): void {\r\n const scrollTop = this.rightPinnedBody.nativeElement.scrollTop;\r\n this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\r\n this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\r\n }\r\n\r\n fakeScrollbarScrollLeft = 0;\r\n onFakeScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n this.fakeScrollbarScrollLeft = target.scrollLeft;\r\n this.centerPinnedBody.nativeElement.scrollLeft = target.scrollLeft;\r\n this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n\r\n\r\n\r\n\r\n getNestedValue(obj: any, field: string): any {\r\n return field.split('.').reduce((acc, part) => acc && acc[part], obj);\r\n }\r\n\r\n isNestedValueArray(obj: any, field: string): boolean {\r\n if (!obj || !field) return false;\r\n const value = field\r\n .split('.')\r\n .reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\r\n return Array.isArray(value);\r\n }\r\n\r\n onResizeGroup(event: MouseEvent, col: any, isRightPinned?: boolean): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n const children = col.children || [];\r\n if (!children.length) return;\r\n\r\n // Cache DOM elements for better performance\r\n const childElements = children.map((child: any) => ({\r\n field: child.field,\r\n elements: Array.from(document.querySelectorAll(`[field=\"${child.field}\"]`)) as HTMLElement[],\r\n initialWidth: (document.querySelector(`[field=\"${child.field}\"]`) as HTMLElement)?.offsetWidth || 0\r\n }));\r\n\r\n const totalInitialWidth = childElements.reduce((sum, child) => sum + child.initialWidth, 0);\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n let deltaX = moveEvent.clientX - startX;\r\n\r\n if (isRightPinned) {\r\n deltaX = -deltaX;\r\n }\r\n\r\n // Prevent shrinking too small\r\n if (totalInitialWidth + deltaX < children.length * 80) return;\r\n\r\n let totalNewWidth = 0;\r\n\r\n childElements.forEach((child) => {\r\n const ratio = child.initialWidth / totalInitialWidth;\r\n const newWidth = Math.max(child.initialWidth + deltaX * ratio, 80);\r\n totalNewWidth += newWidth;\r\n\r\n // Batch DOM updates\r\n child.elements.forEach((el) => {\r\n el.style.minWidth = `${newWidth}px`;\r\n el.style.width = `${newWidth}px`;\r\n });\r\n\r\n this.updateColumnWidthInSourceByField(child.field, newWidth);\r\n });\r\n\r\n // ✅ Update group header width in DOM\r\n const groupHeaderEl = this.getCachedElement(`[group=\"${col.header}\"]`);\r\n if (groupHeaderEl) {\r\n groupHeaderEl.style.width = `${totalNewWidth}px`;\r\n this.cdr.markForCheck();\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n this.refreshHeaders();\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n private updateColumnWidthInSourceByField(field: string, width: number): void {\r\n const update = (columns: any[]) => {\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n update(col.children);\r\n } else if (col.field === field) {\r\n col.width = width;\r\n }\r\n }\r\n };\r\n\r\n update(this.columns);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onResizeColumn(event: MouseEvent, col: any): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n\r\n const targetEl = document.querySelector(`[field=\"${col.field}\"]`) as HTMLElement;\r\n const initialWidth = targetEl?.offsetWidth || 150;\r\n\r\n const matchingEls = Array.from(document.querySelectorAll(`[field=\"${col.field}\"]`)) as HTMLElement[];\r\n\r\n // 👉 Add highlight while resizing (batch operation)\r\n const highlightClass = col?.pinned === 'right' ? 'resizing-highlight-right' : 'resizing-highlight';\r\n matchingEls.forEach((el) => el.classList.add(highlightClass));\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n let deltaX = moveEvent.clientX - startX;\r\n\r\n // 👉 Reverse if the column is pinned to the right\r\n if (col.pinned === 'right') {\r\n deltaX = -deltaX;\r\n }\r\n\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 80) return;\r\n\r\n // Batch DOM updates\r\n matchingEls.forEach((el) => {\r\n el.style.minWidth = `${newWidth}px`;\r\n el.style.width = `${newWidth}px`;\r\n });\r\n\r\n this.updateColumnWidthInSourceByField(col.field, newWidth);\r\n };\r\n\r\n const onMouseUp = () => {\r\n this.refreshHeaders();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n // Remove highlights (batch operation)\r\n matchingEls.forEach((el) => {\r\n el.classList.remove('resizing-highlight');\r\n el.classList.remove('resizing-highlight-right');\r\n });\r\n\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n this.cdr.markForCheck();\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n\r\n\r\n onResizeGroupBox(event: MouseEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n\r\n const targetEl = document.getElementById('groupBoxHeaderDiv');\r\n const initialWidth = targetEl?.offsetWidth || 150;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const deltaX = moveEvent.clientX - startX;\r\n\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 100) newWidth = 100;\r\n\r\n if (targetEl) {\r\n targetEl.style.width = `${newWidth}px`;\r\n targetEl.style.minWidth = `${newWidth}px`;\r\n this.groupBoxPadding = newWidth;\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n }\r\n\r\n\r\n onFilterChange(col: any): void {\r\n const filterValue = col.filterValue?.toLowerCase() || '';\r\n }\r\n\r\n // Get Body Height\r\n get bodyWrapperHeight(): string {\r\n const rows = this.showColumnsGrouping && this.showFilterRow ? 3 : (this.showColumnsGrouping || this.showFilterRow ? 2 : 1);\r\n const offset = this.headerRowHeight * rows + 17;\r\n return `calc(100% - ${offset}px)`;\r\n }\r\n\r\n // Row Hover Logic Here\r\n hoveredRowId: string | number | null = null;\r\n onRowHover(row: any): void {\r\n this.hoveredRowId = row._id || row.id;\r\n }\r\n\r\n onRowLeave(): void {\r\n this.hoveredRowId = null;\r\n }\r\n\r\n isBreaksArray(value: any): boolean {\r\n return Array.isArray(value);\r\n}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n const target = event.target as HTMLElement;\r\n this.isVisible = false;\r\n if (\r\n !this.hasParentWithClass(target, [\r\n 'three-dots',\r\n 'filter-icon-wrapper',\r\n 'column-menu',\r\n 'filter-menu',\r\n ])\r\n ) {\r\n this.activeCol = null;\r\n this.activeFilterCell = null;\r\n }\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.showActionsDropDown = false;\r\n }\r\n const insideTopFilterRow = target.closest('.filter-tags') || target.closest('.add-filter-button-menu') ||\r\n target.closest('.table-right-top-actions') || target.closest('.table-layout') || target.closest('.filter-row-filter-wrapper');\r\n const isClickedInsideThreeDotsFilter = target.closest('.three-dots-filter') || target.closest('.filter-menu-container');\r\n if (!isClickedInsideThreeDotsFilter) {\r\n this.closeThreeDotsMenuFilter();\r\n }\r\n if (!insideTopFilterRow) {\r\n this.closeFilterDropdowns(event);\r\n }\r\n if(!target.closest('.set-default-preset')){\r\n document.querySelector('.set-default-preset')?.classList?.remove('show');\r\n }\r\n\r\n // if (!target.closest('.custom-tooltip') && !target.closest('.circle-value')) {\r\n // this.tooltipVisible = false;\r\n // }\r\n\r\n// if (!target.closest('.popover__content') && !target.closest('[class*=\"popover__wrapper\"]')) {\r\n// this.restrictionTooltipVisible = false;\r\n// this.closeManualLogsModal();\r\n// }\r\n\r\n // Close detail column menu when clicking outside\r\n if (!this.hasParentWithClass(event.target as HTMLElement, ['detail-column-menu', 'three-dots'])) {\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n }\r\n\r\n\r\n const insideDetailTable = target.closest('.accordion-details-wrapper');\r\n if (!insideDetailTable) {\r\n this.detailSelectionState.clear();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n }\r\n\r\n\r\n closeThreeDotsMenuFilter() {\r\n this.isThreeDotsFilterOpen = false;\r\n }\r\n\r\n\r\n closeFilterDropdowns(event: MouseEvent) {\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n this.activeFilterCell = null;\r\n }\r\n\r\n private hasParentWithClass(\r\n element: HTMLElement,\r\n classList: string[]\r\n ): boolean {\r\n let el: HTMLElement | null = element;\r\n\r\n while (el !== null) {\r\n if (\r\n el.classList &&\r\n classList.some((className) => el!.classList.contains(className))\r\n ) {\r\n return true;\r\n }\r\n el = el.parentElement;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isMenueHidden = false;\r\nopenThreeDotsMenu(event: MouseEvent, child: any, keepOriginalPosition = false) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.isMenueHidden = true;\r\n this.activeCol = child;\r\n this.activeFilterCell = null;\r\n\r\n // Open filter menu if clicked on column header (not three-dots icon itself)\r\n const target = event.target as HTMLElement;\r\n const isThreeDotsIcon = target.closest('.three-dots');\r\n if (!isThreeDotsIcon) {\r\n this.openFilteronThreeDotsClick(child); // This opens the filter menu\r\n }\r\n\r\n const menuWidth = 240; // same as CSS\r\n const containerWidth = this.dataGridContainer?.nativeElement?.offsetWidth || window.innerWidth;\r\n const clickX = event.clientX;\r\n\r\n requestAnimationFrame(() => {\r\n const element = document.querySelector('.column-menu') as HTMLElement;\r\n if (!element) return;\r\n\r\n let leftPos = clickX;\r\n\r\n // If menu overflows right → move left\r\n if (clickX + menuWidth > containerWidth) {\r\n leftPos = containerWidth - menuWidth - 10; // 10px padding\r\n }\r\n\r\n // If menu overflows left → push to 0\r\n if (leftPos < 0) leftPos = 0;\r\n\r\n element.style.left = `${leftPos}px`;\r\n // Top position is handled by CSS or naturally by Angular position\r\n\r\n this.isMenueHidden = false;\r\n this.cdr.detectChanges();\r\n });\r\n}\r\n\r\n\r\n\r\n // ////////////////////////////////////////////////////////////////////////////////////////\r\n // ////////////////////////////////////////////////////////////////////////////////////////\r\n // Column Three Dots Actions\r\n // //////////////////////////////////////////////////////////////////////////////////////\r\n // //////////////////////////////////////////////////////////////////////////////////////\r\n sortAsc(col: any) {\r\n this.startPerformanceTimer('sortTime');\r\n\r\n if (!col.is_sortable) return;\r\n col!.order_by = 'asc';\r\n this.sortingConfig = { field: col.field, order_by: 'asc' };\r\n const event = {\r\n order: 'asc',\r\n column: col\r\n }\r\n this.cdr.detectChanges();\r\n this.sortingOrderOptions.emit(event);\r\n\r\n // Emit generic event to trigger API call with sorting\r\n const apiEvent = {\r\n obj: {\r\n sortingConfig: this.sortingConfig\r\n },\r\n eventType: 'sort'\r\n };\r\n this.genericEvent.emit(apiEvent);\r\n\r\n this.endPerformanceTimer('sortTime');\r\n }\r\n\r\n sortDesc(col: any) {\r\n this.startPerformanceTimer('sortTime');\r\n\r\n if (!col.is_sortable) return;\r\n col!.order_by = 'desc';\r\n this.sortingConfig = { field: col.field, order_by: 'desc' };\r\n const event = {\r\n order: 'desc',\r\n column: col\r\n }\r\n this.cdr.detectChanges();\r\n this.sortingOrderOptions.emit(event);\r\n\r\n // Emit generic event to trigger API call with sorting\r\n const apiEvent = {\r\n obj: {\r\n sortingConfig: this.sortingConfig\r\n },\r\n eventType: 'sort'\r\n };\r\n this.genericEvent.emit(apiEvent);\r\n\r\n this.endPerformanceTimer('sortTime');\r\n }\r\n\r\n resetSort(col: any) {\r\n this.sortingConfig = { field: '', order_by: '' };\r\n const event = { field: null, order_by: null }\r\n this.cdr.detectChanges();\r\n this.sortingOrderOptions.emit(event);\r\n\r\n // Emit generic event to trigger API call with reset sorting\r\n const apiEvent = {\r\n obj: {\r\n sortingConfig: this.sortingConfig\r\n },\r\n eventType: 'sort'\r\n };\r\n this.genericEvent.emit(apiEvent);\r\n }\r\n\r\n\r\n async updateColumnPinInSourceByField(\r\n column: any,\r\n pinned: 'left' | 'right' | null\r\n ) {\r\n const update = (columns: any[]) => {\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n update(col.children);\r\n } else if (col.field === column.field) {\r\n col.pinned = pinned;\r\n }\r\n }\r\n };\r\n this.activeCol = null;\r\n update(this.columns);\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n autosizeColumn(cols: any | any[]): void {\r\n this.activeCol = null;\r\n\r\n // Normalize input to an array\r\n const columnsToResize = Array.isArray(cols) ? cols : [cols];\r\n\r\n // Helper: Flatten all visible leaf columns\r\n const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n const result: any[] = [];\r\n for (const column of columns) {\r\n if (column.children && Array.isArray(column.children)) {\r\n result.push(...getVisibleLeafColumns(column.children));\r\n } else if (column.is_visible) {\r\n result.push(column);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n const visibleColumns = getVisibleLeafColumns(this.columns);\r\n const visibleCount = visibleColumns.length;\r\n\r\n if (visibleCount === 0) return;\r\n\r\n const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\r\n const equalWidth = Math.floor(containerWidth / visibleCount);\r\n\r\n // Resize each passed column\r\n for (const col of columnsToResize) {\r\n if (col && col.field) {\r\n col.width = equalWidth;\r\n this.updateColumnWidthInSourceByField(col.field, equalWidth);\r\n }\r\n }\r\n\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n }\r\n\r\n getGroupWidth(group: any): number {\r\n return (\r\n group?.children\r\n ?.filter((col: any) => col?.is_visible)\r\n ?.reduce((acc: number, col: any) => acc + (col?.width || 0), 0) || 0\r\n );\r\n }\r\n\r\n autosizeAllColumns(): void {\r\n this.activeCol = null;\r\n\r\n const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n const result: any[] = [];\r\n\r\n for (const column of columns) {\r\n if (column.children && Array.isArray(column.children)) {\r\n result.push(...getVisibleLeafColumns(column.children));\r\n } else if (column.is_visible !== false) {\r\n result.push(column);\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const visibleColumns = getVisibleLeafColumns(this.columns);\r\n const visibleCount = visibleColumns.length;\r\n\r\n if (visibleCount === 0) return;\r\n\r\n const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\r\n const equalWidth = Math.max(Math.floor(containerWidth / visibleCount), 150);\r\n\r\n // Update widths for all visible columns\r\n visibleColumns.forEach((col) => {\r\n col.width = equalWidth;\r\n this.updateColumnWidthInSourceByField(col.field, equalWidth);\r\n });\r\n\r\n this.refreshHeaders();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n private markColumnAsGrouped(columns: any[], field: string): void {\r\n for (const col of columns) {\r\n if (col.field === field) {\r\n col.isRowGrouped = true;\r\n return;\r\n }\r\n if (col.children?.length) {\r\n this.markColumnAsGrouped(col.children, field);\r\n }\r\n }\r\n }\r\n\r\n async groupBy(col: any) {\r\n this.activeCol = null;\r\n if (!col) return;\r\n\r\n // Check if column is already grouped - implement toggle behavior\r\n const isAlreadyGrouped = this.groupedColumns.some(groupedCol => groupedCol.field === col.field);\r\n\r\n if (isAlreadyGrouped) {\r\n // Ungroup the column\r\n await this.ungroupColumn(col);\r\n return;\r\n }\r\n\r\n // Group the column (existing logic)\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n\r\n if (col?.is_groupable) {\r\n this.groupedColumns.push(col);\r\n this.markColumnAsGrouped(this.columns, col.field);\r\n }\r\n\r\n const fields = this.groupedColumns.map((item) => item.field);\r\n\r\n // Use worker for heavy grouping operations\r\n if (this.originalDataSet.length > 1000) {\r\n try {\r\n const groupedData = await this.processHeavyComputationsWithWorker(this.originalDataSet, 'group');\r\n this.dataSet = groupedData.map((group: any) => ({\r\n isGroup: true,\r\n groupField: fields[0], // Primary grouping field\r\n groupValue: group.key,\r\n children: group.items,\r\n isExpand: false\r\n }));\r\n } catch (error) {\r\n console.warn('Worker grouping failed, falling back to main thread:', error);\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n }\r\n } else {\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateFlattenedData();\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.updateVisibleRows(0);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }, 100);\r\n\r\n setTimeout(() => {\r\n this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\r\n this.cdr.detectChanges()\r\n }, 10);\r\n }\r\n\r\n async groupDataAsync(data: any[], groupFields: string[]): Promise<any[]> {\r\n // Use web worker for heavy grouping operations if available\r\n if (typeof Worker !== 'undefined' && data.length > 1000) {\r\n return this.groupDataWithWorker(data, groupFields);\r\n }\r\n\r\n // For smaller datasets, use optimized synchronous grouping\r\n return new Promise(resolve => {\r\n // Use requestAnimationFrame for better performance than setTimeout\r\n requestAnimationFrame(() => {\r\n const result = this.groupData(data, groupFields);\r\n resolve(result);\r\n });\r\n });\r\n }\r\n\r\n private async processHeavyComputationsWithWorker(data: any[], operation: string): Promise<any> {\r\n if (typeof Worker === 'undefined') {\r\n // Fallback to main thread processing\r\n return this.processHeavyComputations(data, operation);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const workerCode = `\r\n self.onmessage = function(e) {\r\n const { data, operation } = e.data;\r\n\r\n function processData(data, operation) {\r\n try {\r\n switch(operation) {\r\n case 'filter':\r\n // Heavy filtering logic\r\n return data.filter(item => {\r\n // Complex filtering conditions\r\n return item && typeof item === 'object';\r\n });\r\n\r\n case 'sort':\r\n // Heavy sorting logic\r\n return data.sort((a, b) => {\r\n // Complex sorting logic\r\n return 0;\r\n });\r\n\r\n case 'group':\r\n // Heavy grouping logic\r\n const groups = new Map();\r\n for (const item of data) {\r\n const key = item.id || item._id || 'unknown';\r\n if (!groups.has(key)) groups.set(key, []);\r\n groups.get(key).push(item);\r\n }\r\n return Array.from(groups.entries()).map(([key, items]) => ({\r\n key,\r\n items,\r\n count: items.length\r\n }));\r\n\r\n case 'aggregate':\r\n // Heavy aggregation logic\r\n const result = {\r\n total: data.length,\r\n averages: {},\r\n sums: {}\r\n };\r\n return result;\r\n\r\n default:\r\n return data;\r\n }\r\n } catch (error) {\r\n throw new Error('Processing failed: ' + error.message);\r\n }\r\n }\r\n\r\n try {\r\n const result = processData(data, operation);\r\n self.postMessage({ success: true, result });\r\n } catch (error) {\r\n self.postMessage({ success: false, error: error.message });\r\n }\r\n };\r\n `;\r\n\r\n const blob = new Blob([workerCode], { type: 'application/javascript' });\r\n const worker = new Worker(URL.createObjectURL(blob));\r\n\r\n worker.postMessage({ data, operation });\r\n\r\n worker.onmessage = (e) => {\r\n const { success, result, error } = e.data;\r\n worker.terminate();\r\n if (success) {\r\n resolve(result);\r\n } else {\r\n reject(new Error(error));\r\n }\r\n };\r\n\r\n worker.onerror = (error) => {\r\n worker.terminate();\r\n reject(error);\r\n };\r\n\r\n // Timeout for long-running operations\r\n setTimeout(() => {\r\n worker.terminate();\r\n reject(new Error('Worker timeout'));\r\n }, 30000); // 30 second timeout\r\n });\r\n }\r\n\r\n private processHeavyComputations(data: any[], operation: string): any {\r\n // Fallback processing on main thread\r\n switch(operation) {\r\n case 'filter':\r\n return data.filter(item => item && typeof item === 'object');\r\n case 'sort':\r\n return [...data].sort();\r\n case 'group':\r\n const groups = new Map();\r\n for (const item of data) {\r\n const key = item.id || item._id || 'unknown';\r\n if (!groups.has(key)) groups.set(key, []);\r\n groups.get(key).push(item);\r\n }\r\n return Array.from(groups.entries()).map(([key, items]) => ({\r\n key,\r\n items,\r\n count: items.length\r\n }));\r\n case 'aggregate':\r\n return {\r\n total: data.length,\r\n averages: {},\r\n sums: {}\r\n };\r\n default:\r\n return data;\r\n }\r\n }\r\n\r\n private async groupDataWithWorker(data: any[], groupFields: string[]): Promise<any[]> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const workerCode = `\r\n self.onmessage = function(e) {\r\n const { data, groupFields } = e.data;\r\n\r\n function groupData(data, groupFields) {\r\n if (!groupFields.length) return data;\r\n const [currentField, ...restFields] = groupFields;\r\n const groupedMap = new Map();\r\n\r\n for (const item of data) {\r\n let keyValue = currentField.split('.').reduce((obj, k) => obj?.[k], item);\r\n let groupKey = keyValue ?? \"_Blank\";\r\n if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\r\n groupedMap.get(groupKey).push(item);\r\n }\r\n\r\n return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\r\n isGroup: true,\r\n groupField: currentField,\r\n groupValue,\r\n children: groupData(groupItems, restFields),\r\n isExpand: false,\r\n }));\r\n }\r\n\r\n const result = groupData(data, groupFields);\r\n self.postMessage(result);\r\n };\r\n `;\r\n\r\n const blob = new Blob([workerCode], { type: 'application/javascript' });\r\n const worker = new Worker(URL.createObjectURL(blob));\r\n\r\n worker.postMessage({ data, groupFields });\r\n\r\n worker.onmessage = (e) => {\r\n resolve(e.data);\r\n worker.terminate();\r\n };\r\n\r\n worker.onerror = (error) => {\r\n reject(error);\r\n worker.terminate();\r\n };\r\n\r\n // Timeout fallback\r\n setTimeout(() => {\r\n worker.terminate();\r\n reject(new Error('Grouping timeout'));\r\n }, 10000);\r\n\r\n } catch (error) {\r\n // Fallback to main thread if worker fails\r\n resolve(this.groupData(data, groupFields));\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n chooseColumns() {\r\n this.activeCol = null;\r\n this.showColumnPanel = true;\r\n }\r\n\r\n resetColumns() {\r\n this.activeCol = null;\r\n\r\n this.columns = structuredClone(this.originalColumns);\r\n this.SetColumnsDefaultWidth();\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }\r\n\r\n clearFilter(col: any) {\r\n col.firstValue = '';\r\n col.secondValue = '';\r\n col.firstCondition = (col.type === 'date' || col.type === 'time') ? 'equal' : 'contain';\r\n col.secondCondition = (col.type === 'date' || col.type === 'time') ? 'equal' : 'contain';\r\n col.logic = 'AND';\r\n col.selectAll = false;\r\n col.selectedOptions = {};\r\n col.searchValue = '';\r\n\r\n }\r\n\r\n\r\n applyFilter(col: any) {\r\n this.filterColumnsList.push(col);\r\n }\r\n\r\n // Rows Selection Logic Goes Here\r\n\r\n selectedRows: Set<string> = new Set();\r\n\r\n /**\r\n * Get normalized ID from row.\r\n */\r\n private getRowId(row: any): string {\r\n return row.id ?? row._id;\r\n }\r\n\r\n /**\r\n * Toggle a single row selection.\r\n */\r\n toggleRowSelection(row: any): void {\r\n const id = this.getRowId(row);\r\n if (this.selectedRows.has(id)) {\r\n this.selectedRows.delete(id);\r\n } else {\r\n this.selectedRows.add(id);\r\n }\r\n\r\n const ids = Array.from(this.selectedRows);\r\n const event = {\r\n data: {\r\n listingType: this.listingType,\r\n obj: ids\r\n },\r\n eventType: \"onSelectRow\",\r\n }\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n\r\n toggleSelectAll(data: any[]): void {\r\n const allIds = this.originalDataSet.map((row) => this.getRowId(row));\r\n const allSelected = allIds.every((id) => this.selectedRows.has(id));\r\n\r\n if (allSelected) {\r\n allIds.forEach((id) => this.selectedRows.delete(id));\r\n } else {\r\n allIds.forEach((id) => this.selectedRows.add(id));\r\n }\r\n this.cdr.detectChanges();\r\n const ids = Array.from(this.selectedRows);\r\n const event = {\r\n data: {\r\n listingType: this.listingType,\r\n obj: ids\r\n },\r\n eventType: \"onSelectRow\",\r\n }\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n isRowSelected(row: any): boolean {\r\n return this.selectedRows.has(this.getRowId(row));\r\n }\r\n\r\n isAllSelected(data: any[]): boolean {\r\n return (data?.every((row) => this.selectedRows.has(this.getRowId(row))) && (this.dataSet?.length > 0));\r\n }\r\n\r\n isIndeterminateState(data: any[]): boolean {\r\n if (!data || data.length === 0) return false;\r\n const selectedCount = data.filter(row => this.selectedRows.has(this.getRowId(row))).length;\r\n return selectedCount > 0 && selectedCount < data.length;\r\n }\r\n\r\n // Side Menu Working Goes Here\r\n toggleSideMenu(clickedOn: 'cols' | 'filtrs') {\r\n if (this.currentOpenedSideMenue == clickedOn) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n } else if (\r\n this.sideMenuVisible &&\r\n clickedOn != this.currentOpenedSideMenue\r\n ) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n return;\r\n } else {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n }\r\n }\r\n\r\n toggleGroupVisibility(col: any) {\r\n const allVisible = col.children.every((child: any) => child.is_visible);\r\n col.children.forEach((child: any) => (child.is_visible = !allVisible));\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.SetColumnsDefaultWidth();\r\n this.cdr.detectChanges();\r\n }, 10);\r\n }\r\n\r\n isColumnVisible(columns: any) {\r\n if (columns?.children) {\r\n return columns.children.every((element: any) => element.is_visible);\r\n }\r\n\r\n return columns?.is_visible;\r\n }\r\n\r\n allColumnsSelected(): boolean {\r\n const flatten = this.flattenColumns(this.columns);\r\n return flatten.every((col) => col.is_visible);\r\n }\r\n\r\n\r\n private findColumnByField(field: string, cols: any[]): any | null {\r\n for (const col of cols) {\r\n if (col.field === field) {\r\n return col;\r\n }\r\n if (col.children && Array.isArray(col.children)) {\r\n const found = this.findColumnByField(field, col.children);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n\r\n\r\n async toggleColumnVisibility(column: any, isVisible: boolean) {\r\n const col = this.findColumnByField(column.field, this.columns);\r\n if (col) {\r\n col.is_visible = isVisible;\r\n }\r\n await this.refreshHeaders();\r\n this.cdr.detectChanges();\r\n\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n };\r\n this.createUpdateConfigListing.emit(event);\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n\r\n\r\n toggleAllColumnsVisibility(): void {\r\n const flatten = this.flattenColumns(this.columns);\r\n const allSelected = flatten.every((col: any) => col.is_visible);\r\n flatten.forEach((col: any) => (col.is_visible = !allSelected));\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n setTimeout(() => {\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }, 100);\r\n }\r\n\r\n flattenColumns(cols: any[]): any[] {\r\n return cols.reduce((acc: any[], col: any) => {\r\n if (col?.children && col.children.length) {\r\n // recursively flatten children\r\n return acc.concat(this.flattenColumns(col.children));\r\n } else {\r\n // leaf column\r\n return acc.concat(col);\r\n }\r\n }, []);\r\n }\r\n\r\n\r\n filteredColumns(cols: any[]): any[] {\r\n const search = this.columnSearch.toLowerCase();\r\n return cols\r\n .map((col) => {\r\n if (col.children) {\r\n const filteredChildren = this.filteredColumns(col.children);\r\n if (\r\n col.header.toLowerCase().includes(search) ||\r\n filteredChildren.length\r\n ) {\r\n return { ...col, children: filteredChildren };\r\n }\r\n return null;\r\n } else {\r\n return col.header.toLowerCase().includes(search) ? col : null;\r\n }\r\n })\r\n .filter(Boolean);\r\n }\r\n\r\n get accordionState(): 'all' | 'none' | 'some' {\r\n const groups = this.getAllGroupColumns(this.columns);\r\n const expandedCount = groups.filter((col) => col.expanded).length;\r\n\r\n if (expandedCount === 0) return 'none';\r\n if (expandedCount === groups.length) return 'all';\r\n return 'some';\r\n }\r\n\r\n get filterAccordionState(): 'all' | 'none' | 'some' {\r\n const groups = this.getAllGroupColumns(this.columns);\r\n const expandedCount = groups.filter((col) => col.expandedFilter).length;\r\n\r\n if (expandedCount === 0) return 'none';\r\n if (expandedCount === groups.length) return 'all';\r\n return 'some';\r\n }\r\n\r\n // Recursively collect all group columns\r\n private getAllGroupColumns(cols: any[]): any[] {\r\n let groups: any[] = [];\r\n for (const col of cols) {\r\n if (col.children?.length) {\r\n groups.push(col);\r\n groups = groups.concat(this.getAllGroupColumns(col.children));\r\n }\r\n }\r\n return groups;\r\n }\r\n\r\n // Toggle based on current state\r\n toggleAllAccordions(): void {\r\n const nextState = this.accordionState === 'all' ? false : true;\r\n this.setAccordionState(this.columns, nextState);\r\n }\r\n\r\n toggleAllFilterAccordions(): void {\r\n const nextState = this.filterAccordionState === 'all' ? false : true;\r\n this.setFilterAccordionState(this.columns, nextState);\r\n }\r\n\r\n private setAccordionState(cols: any[], state: boolean): void {\r\n for (let col of cols) {\r\n if (col.children?.length) {\r\n col.expanded = state;\r\n this.setAccordionState(col.children, state); // Recursively handle nested\r\n }\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n private setFilterAccordionState(cols: any[], state: boolean): void {\r\n for (let col of cols) {\r\n if (col.children?.length) {\r\n col.expandedFilter = state;\r\n this.setFilterAccordionState(col.children, state); // Recursively handle nested\r\n }\r\n }\r\n }\r\n\r\n showColumnPanel = false;\r\n\r\n closeModalColumnPanel() {\r\n this.showColumnPanel = false;\r\n }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n onEscape(event: KeyboardEvent) {\r\n this.closeModalColumnPanel();\r\n }\r\n\r\n // Check If Any column have right pinned\r\n get hasRightPinnedColumns() {\r\n return this.commonSevice.gethasRightPinnedColumns(this.columns);\r\n }\r\n\r\n get hasLeftPinnedColumns() {\r\n return this.commonSevice.gethasLeftPinnedColumns(this.columns);\r\n }\r\n\r\n get dataSetLength() {\r\n return this.commonSevice.getExpandedRowCount(this.dataSet);\r\n }\r\n\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: UIEvent) {\r\n // Trigger viewport resize handling through reactive stream\r\n // this.viewportResizeSubject.next();\r\n }\r\n\r\n async refreshHeaders() {\r\n this.ngZone.runOutsideAngular(async () => {\r\n await new Promise(r => setTimeout(r, 0));\r\n await this.updateColumnWidthsAndGroups();\r\n await this.refreshPreviewColumns();\r\n\r\n this.ngZone.run(() => this.cdr.detectChanges());\r\n });\r\n }\r\n\r\n async onBadgeOverflowCountClick(col: any) {\r\n // Increase the width of the breaks column when overflow count is clicked\r\n if (col && col.field === 'breaks') {\r\n const currentWidth = col.width || 200;\r\n const newWidth = Math.min(currentWidth + 100, 500); // Increase by 100px, max 500px\r\n col.width = newWidth;\r\n\r\n // Update the column width in the source\r\n this.updateColumnWidthInSourceByField(col.field, newWidth);\r\n\r\n // Refresh headers to apply changes\r\n await this.refreshHeaders();\r\n }\r\n }\r\n\r\n get hasAnyVisibleColumn() {\r\n return this.commonSevice.gethasVisibleColumns(this.columns);\r\n }\r\n\r\n get hasAnyInVisibleColumn() {\r\n return this.commonSevice.gethasInVisibleColumns(this.columns);\r\n }\r\n\r\n get columnsCount() {\r\n return this.commonSevice.getTotalColumnsLength(this.columns);\r\n }\r\n\r\n tableHeaderAndBodyHeight() {\r\n return `calc(100% - ${this.footerRowHeight})`;\r\n }\r\n\r\n draggingInGroupArea = false;\r\n\r\n @ViewChild('centerScroll') centerScroll!: ElementRef<HTMLDivElement>;\r\n visibleRowCount = 25;\r\n startIndex = 0;\r\n visibleRows: any[] = [];\r\n\r\nprivate flattenGroupedRows(\r\n rows: any[] = [],\r\n level = 0,\r\n result: any[] = []\r\n): any[] {\r\n for (const row of rows) {\r\n result.push({ ...row, __depth: level });\r\n if (row.isGroup && row.isExpand && row.children?.length) {\r\n this.flattenGroupedRows(row.children, level + 1, []);\r\n }\r\n }\r\n this.assignVirtualIndexes(this.visibleRows);\r\n return result;\r\n}\r\n\r\n assignVirtualIndexes(data: any[]): any[] {\r\n let currentIndex = 1;\r\n const walk = (items: any[]): void => {\r\n for (const item of items) {\r\n item.__virtualIndex = currentIndex++;\r\n if (item?.isGroup) {\r\n const group = item;\r\n if (group.isExpand && Array.isArray(group.children)) {\r\n walk(group.children);\r\n }\r\n }\r\n }\r\n };\r\n walk(data);\r\n console.log('This dataset: ', this.visibleRows)\r\n return data;\r\n }\r\n\r\n\r\n updateVisibleRows(scrollTop: number) {\r\n this.updateVisibleRowsOptimized(scrollTop);\r\n }\r\n\r\n private updateVisibleRowsOptimized(scrollTop: number): void {\r\n const cacheKey = `visibleRows_${scrollTop}_${this.dataSet.length}`;\r\n const cached = this.getComputationCache(cacheKey);\r\n if (cached) {\r\n this.visibleRows = cached;\r\n return;\r\n }\r\n\r\n const flatData = this.flattenGroupedRows(this.dataSet);\r\n // Show all data instead of virtual scrolling to display all items\r\n this.visibleRows = [...flatData]; // Immutable copy\r\n this.firstIndex = 0;\r\n this.startIndex = 0;\r\n this.renderStart = 0;\r\n this.assignVirtualIndexes(this.visibleRows);\r\n\r\n this.setComputationCache(cacheKey, this.visibleRows);\r\n}\r\n\r\n\r\n trackByRenderedIndex = (i: number, _row: any) => this.renderStart + i;\r\n\r\n private isSyncingFromMain = false;\r\n private isSyncingFromFake = false;\r\n private mainScrollRaf: number | null = null;\r\n\r\n trackById(index: number, item: any) {\r\n return item.id || item._id || item.__virtualIndex || index;\r\n }\r\n\r\n // Enhanced trackBy functions for better performance\r\n trackByColumnField(index: number, item: any) {\r\n return item?.field || index;\r\n }\r\n\r\n trackByColumn(index: number, item: any) {\r\n return item?.field || item?.header || index;\r\n }\r\n\r\n trackByRow(index: number, item: any) {\r\n return item?.id || item?._id || item?.__virtualIndex || index;\r\n }\r\n\r\n trackByGroupedRow(index: number, item: any) {\r\n return item?.groupValue || item?.id || item?._id || index;\r\n }\r\n\r\n flattenedData: any[] = [];\r\n\r\n updateFlattenedData(): void {\r\n setTimeout(() => {\r\n this.flattenedData = [...this.flattenGroupedRows(this.dataSet)]; // Immutable copy\r\n this.cdr.markForCheck(); // Use markForCheck instead of detectChanges for better performance\r\n }, 10);\r\n}\r\n\r\n // requestAnimationFrame IDs\r\n private fakeScrollRaf: number | null = null;\r\n private autoScrollInterval: number | null = null;\r\n\r\n\r\n translateY = 0;\r\n\r\n @Output() loadMore = new EventEmitter<void>();\r\n\r\n // Remove the old onMainScroll method as it's now handled by the reactive stream\r\n\r\n\r\n get isScrollbarVisible(): boolean {\r\n if (!this.mainScroll) return false;\r\n const el = this.mainScroll.nativeElement;\r\n return el.scrollHeight > el.clientHeight;\r\n }\r\n\r\n // toggleExpand(row: any) {\r\n // if (row.details) {\r\n // row.isDetailsExpand = !row.isDetailsExpand;\r\n // } else {\r\n // row.isExpand = !row.isExpand;\r\n // }\r\n\r\n // // setTimeout(() => {\r\n // // this.cdr.detectChanges();\r\n // // }, 100);\r\n // }\r\n\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand) {\r\n// if (!row.details.originalColumns) {\r\n// row.details.originalColumns = structuredClone(row.details.columns);\r\n// }\r\n// // 👇 Prefer originalFlatData, fallback to current data only if needed\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = structuredClone(\r\n// row.details.originalFlatData || row.details.data\r\n// );\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\nonMainFakeScroll(event: Event) {\r\n if (this.isSyncingFromMain) {\r\n this.isSyncingFromMain = false;\r\n return;\r\n }\r\n if (this.groupedColumns?.length > 0) {\r\n this.startIndex = 0;\r\n this.cdr.detectChanges();\r\n return;\r\n }\r\n const scrollTop = (event.target as HTMLElement).scrollTop;\r\n if (this.mainScrollRaf) cancelAnimationFrame(this.mainScrollRaf);\r\n this.mainScrollRaf = requestAnimationFrame(() => {\r\n this.isSyncingFromFake = true;\r\n this.mainScroll.nativeElement.scrollTop = scrollTop;\r\n const overscan = this.overscan ?? 0;\r\n this.startIndex = Math.floor(scrollTop / this.rowHeight);\r\n const start = Math.max(0, this.startIndex - overscan);\r\n const end = Math.min(\r\n this.flattenedData.length,\r\n this.startIndex + this.viewportRows + overscan\r\n );\r\n this.visibleRows = this.flattenedData.slice(start, end);\r\n this.cdr.detectChanges();\r\n });\r\n}\r\n\r\n\r\n\r\n\r\n\r\n viewportRows = 0; // how many rows fit in viewport (computed)\r\n firstIndex = 0; // index of the first visible row (clamped)\r\n renderStart = 0; // where the slice actually starts (firstIndex - overscan, clamped)\r\n\r\n private scrollRaf: number | null = null;\r\n private pendingScrollTop = 0;\r\n\r\n @ViewChild('mainScroll') mainScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('fakeScroll') fakeScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('horizintalFakeScroll')\r\n horizintalFakeScroll!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerScrollableBody')\r\n centerScrollableBody!: ElementRef<any>;\r\n private overscan = 10; // buffer rows above and below\r\n\r\n computeViewportRows() {\r\n if (this.fakeScroll?.nativeElement) {\r\n this.fakeScroll.nativeElement.scrollTop = 0;\r\n }\r\n\r\n if (this.mainScroll?.nativeElement) {\r\n this.mainScroll.nativeElement.scrollTop = 0;\r\n const h = this.mainScroll.nativeElement.clientHeight ?? 0;\r\n\r\n // rows visible in viewport\r\n const rowsInViewport = Math.max(1, Math.ceil(h / this.rowHeight));\r\n\r\n // add buffer rows (overscan)\r\n this.viewportRows = rowsInViewport + this.overscan * 2;\r\n\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n\r\n onHorizintalFakeScroll(event: Event) {\r\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n this.centerScrollableBody.nativeElement.scrollLeft = scrollLeft;\r\n }\r\n\r\n onCenterBodyScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n if (this.centerPinnedHeader) {\r\n this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n }\r\n\r\n onCenterHeaderScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n if (this.horizintalFakeScroll?.nativeElement) {\r\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n if (this.centerScrollableBody?.nativeElement) {\r\n this.centerScrollableBody.nativeElement.scrollLeft = target.scrollLeft;\r\n }\r\n }\r\n\r\n // Dragging Logic is implemented here\r\n // private initialIndex: number | null = null;\r\n\r\n draggingColumn: any;\r\n dragStartIndex: any = 0;\r\n // onDragStart(data: any, index: number) {\r\n // this.draggingColumn = data.column;\r\n // this.dragStartIndex = index;\r\n // }\r\n // onDragMove(data: any) {\r\n // const { clientX, clientY } = data.event;\r\n // const headers = Array.from(\r\n // document.querySelectorAll('.one-row-header-cells')\r\n // ) as HTMLElement[];\r\n\r\n // headers.forEach((headerEl, idx) => {\r\n // const rect = headerEl.getBoundingClientRect();\r\n // if (\r\n // idx !== this.dragStartIndex &&\r\n // clientX > rect.left &&\r\n // clientX < rect.right &&\r\n // clientY > rect.top &&\r\n // clientY < rect.bottom\r\n // ) {\r\n // const otherIndex = idx;\r\n // console.log(`${this.dragStartIndex} --> ${otherIndex}`);\r\n // this.swapColumn(this.dragStartIndex, otherIndex);\r\n // console.log('Updated Columns: ', this.columns);\r\n // this.dragStartIndex = otherIndex; // update index\r\n // }\r\n // });\r\n // }\r\n\r\n // swapColumn(previusIndex: number, currentIndex: number) {\r\n // const columns = structuredClone(this.columns);\r\n // const flattenColumns = this.flattenColumns(columns);\r\n\r\n // const visibleFlattenColumns = flattenColumns.filter(\r\n // (col) => col.is_visible\r\n // );\r\n // const previusColumn = visibleFlattenColumns[previusIndex];\r\n // const currentColumn = visibleFlattenColumns[currentIndex];\r\n\r\n // console.log('Previus Column: ', previusColumn);\r\n // console.log('current clumn: ', currentColumn);\r\n // }\r\n\r\n // onDragEnd(data: any) {\r\n // this.draggingColumn = null;\r\n // this.dragStartIndex = null;\r\n // }\r\n\r\n // CDK DRAG DROP LOGIC GOES HERE\r\n\r\n\r\n canEnterToRowsGrouping = (drag: CdkDrag<any>, drop: CdkDropList<any>) => {\r\n // Example: Block if already pinned left\r\n const data = drag.data;\r\n if (data?.children && data?.children.length) {\r\n return data.children.some(\r\n (col: any) => col.is_visible && col.is_groupable\r\n );\r\n }\r\n return data.is_visible && data.is_groupable;\r\n };\r\n\r\n onDragMoved(event: CdkDragMove<any>) {\r\n const pointerX = event.pointerPosition.x;\r\n const pointerY = event.pointerPosition.y;\r\n\r\n const targetElement = document.getElementById(\r\n 'rows-grouping-top-container'\r\n );\r\n\r\n if (targetElement) {\r\n const rect = targetElement.getBoundingClientRect();\r\n\r\n const isOverTarget =\r\n pointerX >= rect.left &&\r\n pointerX <= rect.right &&\r\n pointerY >= rect.top &&\r\n pointerY <= rect.bottom;\r\n\r\n if (isOverTarget) {\r\n this.draggingInGroupArea = true;\r\n } else {\r\n this.draggingInGroupArea = false;\r\n }\r\n }\r\n }\r\n\r\n enterToTopRowGrouping(dropList: CdkDragEnter<any>) {\r\n const draggingData = dropList.item.data;\r\n this.draggingInGroupArea = true;\r\n\r\n if (Array.isArray(draggingData?.children)) {\r\n const targetGroup = this.columns.find(\r\n (col) => col.header === draggingData.header\r\n );\r\n if (targetGroup) {\r\n draggingData.children.forEach((draggedChild: any) => {\r\n const matchingChild = targetGroup.children.find(\r\n (child: any) => child.field === draggedChild.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = !!matchingChild.is_groupable;\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n // Try finding it in top-level columns first\r\n let targetColumn = this.columns.find(\r\n (col: any) => col.field === draggingData.field\r\n );\r\n\r\n if (targetColumn) {\r\n targetColumn.isRowGrouped = !!targetColumn.is_groupable;\r\n } else {\r\n for (let group of this.columns) {\r\n if (Array.isArray(group.children)) {\r\n const matchingChild = group.children.find(\r\n (child: any) => child.field === draggingData.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = !!matchingChild.is_groupable;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ✅ Refresh UI\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n onDropListEnter(\r\n dropList: CdkDragEnter<any>,\r\n section: 'left' | 'center' | 'right'\r\n ) {\r\n const draggingData = dropList.item.data;\r\n\r\n const targetColumn: any = this.columns.find(\r\n (col) => col.header == draggingData.header\r\n );\r\n\r\n if (!targetColumn) return;\r\n\r\n if (\r\n Array.isArray(draggingData?.children) &&\r\n Array.isArray(targetColumn?.children)\r\n ) {\r\n draggingData.children.forEach((draggedChild: any) => {\r\n const matchingChild = targetColumn.children.find(\r\n (child: any) => child.field === draggedChild.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.pinned = section === 'center' ? null : section;\r\n matchingChild['isRowGrouped'] = false;\r\n }\r\n });\r\n } else {\r\n targetColumn.pinned = section === 'center' ? null : section;\r\n targetColumn['isRowGrouped'] = false;\r\n }\r\n\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n enterToTopGroupingRow(dropList: CdkDragEnter<any>) {\r\n this.shouldDisableDroplistSorting = this.isDisableColumnGrouping;\r\n this.draggingInGroupArea = true;\r\n // const index = this.groupedColumns.findIndex(\r\n // (col) => col.field === column.field\r\n // );\r\n // if (index !== -1) {\r\n // this.groupedColumns.splice(index, 1);\r\n // }\r\n\r\n // // 2. Traverse this.columns to find and update the matching column\r\n // this.columns.forEach((group) => {\r\n // if (group?.children && Array.isArray(group.children)) {\r\n // group.children.forEach((child) => {\r\n // if (child.field === column.field) {\r\n // child.isRowGrouped = false;\r\n // }\r\n // });\r\n // } else if (group.field === column.field) {\r\n // group.isRowGrouped = false;\r\n // }\r\n // });\r\n this.cdr.detectChanges();\r\n }\r\n\r\n exitedFromTheTopRow(dropList: CdkDragExit<any>) {\r\n this.draggingInGroupArea = false;\r\n this.isDisableColumnGrouping = false;\r\n this.shouldDisableDroplistSorting = false;\r\n const draggingData = dropList.item.data;\r\n if (Array.isArray(draggingData?.children)) {\r\n const targetGroup = this.columns.find(\r\n (col) => col.header === draggingData.header\r\n );\r\n if (targetGroup) {\r\n draggingData.children.forEach((draggedChild: any) => {\r\n const matchingChild = targetGroup.children.find(\r\n (child: any) => child.field === draggedChild.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = false;\r\n }\r\n });\r\n }\r\n } else {\r\n let targetColumn = this.columns.find(\r\n (col: any) => col.field === draggingData.field\r\n );\r\n\r\n if (targetColumn) {\r\n targetColumn.isRowGrouped = false;\r\n } else {\r\n for (let group of this.columns) {\r\n if (Array.isArray(group.children)) {\r\n const matchingChild = group.children.find(\r\n (child: any) => child.field === draggingData.field\r\n );\r\n if (matchingChild) {\r\n matchingChild.isRowGrouped = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n shouldDisableDroplistSorting = false;\r\n isDisableColumnGrouping = false;\r\n checkColumnGroupingStatus(col: any) {\r\n if (col?.children && Array.isArray(col.children)) {\r\n const allChildrenDisabled = col.children.every(\r\n (child: any) => child.is_groupable === false\r\n );\r\n this.isDisableColumnGrouping = allChildrenDisabled;\r\n } else {\r\n this.isDisableColumnGrouping = col.is_groupable === false;\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n currentDraggingColumn: any = null;\r\n dragStartOnGroup(col: any) {\r\n this.currentDraggingColumn = col;\r\n }\r\n\r\n onSortGroup = async (event: CdkDragSortEvent<any>, section: string) => {\r\n const columns = (this as any)[section];\r\n if (event.previousIndex === event.currentIndex) return;\r\n const visibleColumns = columns.filter((col: any) => {\r\n if (col?.children && Array.isArray(col.children)) {\r\n return col.children.some((child: any) => child.is_visible);\r\n }\r\n return col.is_visible;\r\n });\r\n const previousHeader = visibleColumns[event.previousIndex].header;\r\n const currentHeader = visibleColumns[event.currentIndex].header;\r\n const visiblePrevIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === previousHeader\r\n );\r\n const visibleCurrIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === currentHeader\r\n );\r\n const getFields = (item: any): string[] => {\r\n if (item?.children && Array.isArray(item.children)) {\r\n return item.children.map((child: any) => child.field);\r\n }\r\n return [item.field];\r\n };\r\n const prevFields = getFields(visibleColumns[visiblePrevIndex]);\r\n const currFields = getFields(visibleColumns[visibleCurrIndex]);\r\n const allFields = [...prevFields, ...currFields];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n console.log(\"this .coluns\", this.columns);\r\n moveItemInArray((this as any)[section], visiblePrevIndex, visibleCurrIndex);\r\n\r\n const prevColIndexInColumns = this.columns.findIndex(item => item.header === previousHeader);\r\n const currColIndexInColumns = this.columns.findIndex(item => item.header === currentHeader);\r\n moveItemInArray(this.columns, prevColIndexInColumns, currColIndexInColumns);\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n updatedCells.forEach((el) => {\r\n const newLeft = el.getBoundingClientRect().left;\r\n const oldLeft = firstPositions.get(el)!;\r\n const deltaX = oldLeft - newLeft;\r\n if (deltaX !== 0) {\r\n el.style.willChange = 'transform';\r\n el.style.transition = 'none';\r\n el.style.transform = `translateX(${deltaX}px)`;\r\n void el.offsetWidth;\r\n el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n el.style.transform = 'translateX(0)';\r\n const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n onDropGroup() {\r\n this.leftPinnedColumns = structuredClone(this.previewLeftPinnedColumns);\r\n this.centerColumns = structuredClone(this.previewCenterColumns);\r\n this.rightPinnedColumns = structuredClone(this.previewRightPinnedColumns);\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n async onDropTopGroup(event: CdkDragDrop<any>) {\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n const draggedData = event.item.data;\r\n if (draggedData?.children && Array.isArray(draggedData.children)) {\r\n draggedData.children.forEach((col: any) => {\r\n if (col.is_visible && col.is_groupable) {\r\n this.groupedColumns.push(col);\r\n }\r\n });\r\n } else {\r\n if (draggedData.is_visible && draggedData.is_groupable) {\r\n this.groupedColumns.push(draggedData);\r\n }\r\n }\r\n this.draggingInGroupArea = false;\r\n const fields = this.groupedColumns.map((item) => item.field);\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.updateVisibleRows(0);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }\r\n\r\n async ungroupColumn(column: any) {\r\n try {\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n const index = this.groupedColumns.findIndex(\r\n (col) => col.field === column.field\r\n );\r\n if (index !== -1) {\r\n this.groupedColumns.splice(index, 1);\r\n }\r\n const fields = this.groupedColumns.map((item) => item.field);\r\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n this.columns.forEach((group) => {\r\n if (group?.children && Array.isArray(group.children)) {\r\n group.children.forEach((child: any) => {\r\n if (child.field === column.field) {\r\n child.isRowGrouped = false;\r\n }\r\n });\r\n } else if (group.field === column.field) {\r\n group.isRowGrouped = false;\r\n }\r\n });\r\n setTimeout(() => {\r\n this.updateFlattenedData();\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.updateVisibleRows(0);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }, 100);\r\n\r\n } catch (err) {\r\n console.error(\"Error in ungroupColumn:\", err);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n\r\n shouldTheGroupHeaderShow(group: any) {\r\n if (group?.children && group.children.length) {\r\n return group.children.some(\r\n (col: any) => col.is_visible && !col?.isRowGrouped\r\n );\r\n }\r\n return group?.is_visible && !group?.isRowGrouped;\r\n }\r\n\r\n\r\n onChildDragStart() {\r\n debugger;\r\n }\r\n\r\n dropListIds: string[] = [];\r\n\r\n generateDropListIds() {\r\n this.dropListIds = [];\r\n\r\n const sectionKeys = [\r\n 'leftPinnedColumns',\r\n 'centerColumns',\r\n 'rightPinnedColumns',\r\n ];\r\n\r\n sectionKeys.forEach((sectionKey) => {\r\n const sectionCols = (this as any)[sectionKey];\r\n\r\n this.columns.forEach((col: any, i: number) => {\r\n if (col?.children?.length > 0) {\r\n col.children.forEach((child: any, childIndex: number) => {\r\n if (child?.is_visible && !child.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n } else if (col?.is_visible && !col.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n });\r\n }\r\n\r\n onChildDroplistSorted = async (event: CdkDragSortEvent<any>, section: string) => {\r\n if (event.previousIndex === event.currentIndex) return;\r\n\r\n const pinned =\r\n section == 'previewLeftPinnedColumns'\r\n ? 'left'\r\n : section == 'previewRightPinnedColumns'\r\n ? 'right'\r\n : \"\";\r\n\r\n const column = event.item.data;\r\n let group = this.columns.find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n const groupIndex = this.columns.findIndex(\r\n (col) => col.header === group.header\r\n );\r\n const filteredGroup = group?.children.filter((col: any) => {\r\n const isPinnedMatch =\r\n (pinned === \"\" && (!col?.pinned || col?.pinned === \"\")) || col?.pinned === pinned;\r\n return isPinnedMatch && col?.is_visible;\r\n });\r\n\r\n const previousField = filteredGroup[event.previousIndex].field;\r\n const currentField = filteredGroup[event.currentIndex].field;\r\n const visiblePrevIndex = group.children.findIndex(\r\n (col: any) => col.field == previousField\r\n );\r\n const visibleCurrIndex = group.children.findIndex(\r\n (col: any) => col.field == currentField\r\n );\r\n const allFields = [previousField, currentField];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n\r\n const groupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const filterGroupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const groupInSectionIndex = (this as any)[section].findIndex(\r\n (col: any) => col.header === groupInSection.header\r\n );\r\n\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n moveItemInArray(\r\n this.columns[groupIndex]?.children,\r\n visiblePrevIndex,\r\n visibleCurrIndex\r\n );\r\n\r\n moveItemInArray(\r\n (this as any)[section]?.[groupInSectionIndex].children,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n updatedCells.forEach((el) => {\r\n const newLeft = el.getBoundingClientRect().left;\r\n const oldLeft = firstPositions.get(el)!;\r\n const deltaX = oldLeft - newLeft;\r\n if (deltaX !== 0) {\r\n el.style.willChange = 'transform';\r\n el.style.transition = 'none';\r\n el.style.transform = `translateX(${deltaX}px)`;\r\n void el.offsetWidth;\r\n el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n el.style.transform = 'translateX(0)';\r\n\r\n const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n console.group('Group: ', group);\r\n }\r\n\r\n\r\n onChildDroplistDroped(cdkDragDropevent: CdkDragDrop<any>) {\r\n this.updateColumnWidthsAndGroups();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n setTimeout(() => {\r\n this.cdr.detectChanges();\r\n }, 2);\r\n }\r\n\r\n // Rows Grouping Logic Goes Here\r\n\r\n groupData(data: any[], groupFields: string[]): any[] {\r\n let dataSet = structuredClone(data);\r\n if (!groupFields.length) return data;\r\n const [currentField, ...restFields] = groupFields;\r\n const groupedMap = new Map<string, any[]>();\r\n for (const item of dataSet) {\r\n let keyValue = currentField.split('.').reduce((obj, k) => obj?.[k], item);\r\n let groupKey: string;\r\n if (Array.isArray(keyValue)) {\r\n if (keyValue.length === 0) {\r\n groupKey = \"_Blank\";\r\n } else if (typeof keyValue[0] === \"object\") {\r\n groupKey = keyValue\r\n .map(obj => (obj?.department_name || obj.roleName) ?? \"_Blank\")\r\n .join(\",\");\r\n } else {\r\n groupKey = keyValue\r\n .map(val => val ?? \"_Blank\")\r\n .join(\",\");\r\n }\r\n } else {\r\n groupKey = keyValue ?? \"_Blank\";\r\n }\r\n if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\r\n groupedMap.get(groupKey)!.push(item);\r\n }\r\n return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\r\n isGroup: true,\r\n groupField: currentField,\r\n groupValue,\r\n children: this.groupData(groupItems, restFields),\r\n isExpand: false,\r\n }));\r\n }\r\n\r\n\r\n countLeafRows(group: any): number {\r\n if (!group.children || !group.children.length) return 0;\r\n\r\n return group.children.reduce((count: number, child: any) => {\r\n return count + (child.isGroup ? this.countLeafRows(child) : 1);\r\n }, 0);\r\n }\r\n\r\n isActiveFilterOpen = false;\r\n toggleActiveFilter() {\r\n this.isActiveFilterOpen = !this.isActiveFilterOpen;\r\n }\r\n\r\n toggleActions(type: string) {\r\n if (type === this.activeTopButton) this.activeTopButton = type;\r\n else this.activeTopButton = type;\r\n this.activeSubButton = '';\r\n this.isFilterOpen = false;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n activeSubButton = '';\r\n toggleSubActions(type: string) {\r\n if (type === this.activeSubButton) this.activeSubButton = '';\r\n else this.activeSubButton = type;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n toggleActionsDropdown() {\r\n this.showActionsDropDown = !this.showActionsDropDown;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n async changeTableLayout(event: Event, layoutType: string) {\r\n let target = event.target as HTMLInputElement;\r\n\r\n if (target.checked) {\r\n this.selectedTableLayout = layoutType;\r\n if (layoutType === 'small') {\r\n this.rowHeight = 36;\r\n this.headerRowHeight = 40;\r\n this.bodyTextFontsSize = 10;\r\n this.headerTextFontsSize = 10;\r\n\r\n } else if (layoutType === 'medium') {\r\n this.rowHeight = 44;\r\n this.headerRowHeight = 44;\r\n this.bodyTextFontsSize = 14;\r\n this.headerTextFontsSize = 14;\r\n\r\n } else {\r\n this.rowHeight = 60;\r\n this.headerRowHeight = 52;\r\n this.bodyTextFontsSize = 16;\r\n this.headerTextFontsSize = 16;\r\n }\r\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n await this.refreshHeaders();\r\n }\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n this.onFontChange()\r\n }\r\n\r\n\r\n pageSizeOptions = [10, 25, 50, 75, 100, 150, 200, 250, 300, 500];\r\n get startIndexData() {\r\n return (this.paginationConfig.page - 1) * this.paginationConfig.limit;\r\n }\r\n\r\n get endIndex() {\r\n return Math.min(this.startIndex + this.paginationConfig.limit, this.paginationConfig.totalResults);\r\n }\r\n\r\n get visiblePages(): (number | string)[] {\r\n const pages: (number | string)[] = [];\r\n\r\n if (this.paginationConfig.totalPages <= 7) {\r\n for (let i = 1; i <= this.paginationConfig.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push(1);\r\n if (this.paginationConfig.page > 3) {\r\n pages.push('...');\r\n }\r\n let start = Math.max(2, this.paginationConfig.page - 1);\r\n let end = Math.min(this.paginationConfig.totalPages - 1, this.paginationConfig.page + 1);\r\n\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n if (this.paginationConfig.page < this.paginationConfig.totalPages - 2) {\r\n pages.push('...');\r\n }\r\n pages.push(this.paginationConfig.totalPages);\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n\r\n searchTextForFilterDropDown = '';\r\n toggleColumnInFilterDropdown(col: any) {\r\n\r\n }\r\n\r\n removeColumnFromFilter(option: any) {\r\n\r\n }\r\n\r\n handleBackspace(event: Event) {\r\n // If search is empty, remove last tag\r\n if (!this.searchTextForFilterDropDown && this.selectedFilterOptions.length) {\r\n const last = this.selectedFilterOptions[this.selectedFilterOptions.length - 1];\r\n this.toggleSelectionInFilter(last);\r\n }\r\n }\r\n\r\n @ViewChild('filterMenueSearchInput') filterMenueSearchInput!: ElementRef<HTMLInputElement>\r\n @ViewChild('filterMenueTextchInput') filterMenueTextchInput!: ElementRef<HTMLInputElement>\r\n\r\n openFilteronThreeDotsClick(col: any) {\r\n if(col.type == 'image' || col.type === '') return;\r\n this.selectedColumnForFilter = col;\r\n this.isThreeDotsFilterOpen = true;\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n // Use column_dropdown_value if available, otherwise fallback to column_data\r\n let dropdownData = this.selectedColumnForFilter?.column_dropdown_value || this.selectedColumnForFilter?.column_data || [];\r\n\r\n // Normalize string arrays to object format\r\n if (dropdownData.length > 0 && typeof dropdownData[0] === 'string') {\r\n dropdownData = dropdownData.map((item: string) => ({\r\n _id: item,\r\n value: item,\r\n __typename: 'column_dropdown_value'\r\n }));\r\n }\r\n\r\n // Ensure column_dropdown_value is set for UI to use\r\n this.selectedColumnForFilter.column_dropdown_value = dropdownData;\r\n\r\n this.selectedFilterOptions = dropdownData.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option?.value || option)\r\n );\r\n setTimeout(() => {\r\n this.filterMenueSearchInput.nativeElement.focus();\r\n }, 100);\r\n } else if (['string', 'number', 'date', 'time'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || ((col.type === 'date' || col.type === 'time') ? 'equal' : 'contain');\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || ((col.type === 'date' || col.type === 'time') ? 'equal' : 'contain');\r\n this.secondValue = col?.query?.second_value || '';\r\n setTimeout(() => {\r\n this.filterMenueTextchInput.nativeElement.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n isFilterOpen = false\r\n selectedColumnForFilter: any;\r\n showFilters = this.showSideMenu ? false : false;\r\n columnFilter:string='none'\r\n\r\n openFilter(col: any) {\r\n // Prevent filter opening for columns with empty type or image type\r\n if (col.type === '' || col.type === 'image') return;\r\n\r\n this.activeFilterCell = col;\r\n this.activeCol = null\r\n this.isFilterOpen = true;\r\n this.selectedColumnForFilter = col;\r\n\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n // Use column_dropdown_value if available, otherwise fallback to column_data\r\n let dropdownData = this.selectedColumnForFilter?.column_dropdown_value || this.selectedColumnForFilter?.column_data || [];\r\n\r\n // Normalize string arrays to object format\r\n if (dropdownData.length > 0 && typeof dropdownData[0] === 'string') {\r\n dropdownData = dropdownData.map((item: string) => ({\r\n _id: item,\r\n value: item,\r\n __typename: 'column_dropdown_value'\r\n }));\r\n }\r\n\r\n this.selectedFilterOptions = dropdownData.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option?.value || option)\r\n );\r\n } else if (['string', 'number', 'date'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || 'contain';\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || 'contain';\r\n this.secondValue = col?.query?.second_value || '';\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n firstValue: any = '';\r\n firstCondition = '';\r\n secondValue: any = '';\r\n secondCondition = '';\r\n condition = '';\r\n\r\n resetTextFilterChanges() {\r\n this.firstCondition = 'contain';\r\n this.firstValue = '';\r\n this.condition = 'none';\r\n this.secondCondition = '';\r\n this.secondValue = '';\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n }\r\n\r\n\r\n selectedFilterOptions: any[] = []\r\n\r\n currentFilterSelectedIds = new Set<string>();\r\n\r\n toggleSelectionInFilter(option: any) {\r\n const id = option.id || option._id || option?.value || option;\r\n if (this.currentFilterSelectedIds.has(id)) {\r\n this.currentFilterSelectedIds.delete(id);\r\n } else {\r\n this.currentFilterSelectedIds.add(id);\r\n }\r\n // Use column_dropdown_value if available, otherwise fallback to column_data\r\n let dropdownData = this.selectedColumnForFilter?.column_dropdown_value || this.selectedColumnForFilter?.column_data || [];\r\n\r\n // Normalize string arrays to object format\r\n if (dropdownData.length > 0 && typeof dropdownData[0] === 'string') {\r\n dropdownData = dropdownData.map((item: string) => ({\r\n _id: item,\r\n value: item,\r\n __typename: 'column_dropdown_value'\r\n }));\r\n }\r\n\r\n this.selectedFilterOptions = dropdownData.filter((option: any) => this.currentFilterSelectedIds.has(option.id || option._id || option?.value || option))\r\n this.cdr.detectChanges();\r\n }\r\n\r\n resetFilterChanges() {\r\n this.isFilterOpen = false;\r\n this.currentFilterSelectedIds.clear();\r\n this.selectedFilterOptions!.length = 0;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n // const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns);\r\n // console.log(\"Filtered Columns Are: \", filteredColumns);\r\n }\r\n\r\n applyDropdownFilter() {\r\n const findColumn = (columns: any[], field: string): any => {\r\n for (const col of columns) {\r\n if (col.field === field) return col;\r\n if (col.children && col.children.length) {\r\n const found = findColumn(col.children, field);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const column = findColumn(this.columns, this.selectedColumnForFilter.field);\r\n if (column) {\r\n if (column.type === 'dropdown') {\r\n column.query = column.query || {};\r\n column.query._ids = column.query._ids || [];\r\n\r\n // Remove stale IDs (not present in Set)\r\n column.query._ids = column.query._ids.filter(\r\n (id: any) => this.currentFilterSelectedIds.has(id) // <-- use .has()\r\n );\r\n\r\n // Add new ones if missing\r\n this.currentFilterSelectedIds.forEach(id => {\r\n if (!column.query._ids.includes(id)) {\r\n column.query._ids.push(id);\r\n }\r\n });\r\n\r\n } else if (['string', 'number', 'date', 'time'].includes(column.type)) {\r\n column.query = {\r\n first_condition: this.firstCondition || ((column.type === 'date' || column.type === 'time') ? 'equal' : 'contain'),\r\n first_value: this.firstValue || null,\r\n condition: this.condition || 'none',\r\n ...(this.condition !== 'none' && {\r\n second_condition: this.secondCondition || ((column.type === 'date' || column.type === 'time') ? 'equal' : 'contain'),\r\n second_value: this.secondValue || null,\r\n }),\r\n };\r\n }\r\n }\r\n\r\n const filter = {\r\n field: column.field,\r\n search: column.search,\r\n query: column.query,\r\n type: column.type,\r\n _ids: column._ids\r\n };\r\n\r\n this.filtersConfig.push(filter);\r\n\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n this.activeFilterCell = null;\r\n this.isThreeDotsFilterOpen = false;\r\n\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n applyFilterFromFilterRow(column: any) {\r\n // Ensure default conditions are set before applying filter\r\n if (column.query) {\r\n if (!column.query.first_condition) {\r\n column.query.first_condition = (column.type === 'date' || column.type === 'time') ? 'equal' : 'contain';\r\n }\r\n if (!column.query.second_condition && column.query.condition !== 'none') {\r\n column.query.second_condition = (column.type === 'date' || column.type === 'time') ? 'equal' : 'contain';\r\n }\r\n }\r\n\r\n const filter = {\r\n field: column.field,\r\n search: column.search,\r\n query: column.query,\r\n type: column.type,\r\n _ids: column._ids\r\n };\r\n this.filtersConfig.push(filter);\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\r\n this.activeFilterCell = null;\r\n this.isThreeDotsFilterOpen = false;\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n isFilterAppliedOnColumn(column: any) {\r\n return this.filtersConfig.some(col => col.field === column.field);\r\n }\r\n\r\n // Side Filters Logic is here\r\n\r\n toggleSelectAllSideFilters(col: any, event: Event) {\r\n const checked = (event?.target as HTMLInputElement)?.checked;\r\n\r\n if (checked) {\r\n col.query._ids = col.column_dropdown_value.map(\r\n (opt: any) => opt.id || opt._id || opt\r\n );\r\n } else {\r\n col.query._ids = [];\r\n }\r\n }\r\n\r\n\r\n isAllSideFilterOptionsSelected(col: any): boolean {\r\n if (!col?.query?._ids || !Array.isArray(col.column_dropdown_value)) return false;\r\n return col.query._ids.length === col.column_dropdown_value.length;\r\n }\r\n\r\n onOptionToggle(col: any, option: any) {\r\n const optionId = option.id || option._id || option;\r\n if (!col.query._ids) {\r\n col.query._ids = [];\r\n }\r\n const idx = col.query._ids.indexOf(optionId);\r\n if (idx > -1) {\r\n col.query._ids.splice(idx, 1);\r\n } else {\r\n col.query._ids.push(optionId);\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n resetSideFilter(col: any) {\r\n const resetColumnRecursively = (columns: any[]): boolean => {\r\n for (const column of columns) {\r\n if (column.field === col.field) {\r\n column.query = {\r\n _ids: [],\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: 'contain',\r\n second_value: null\r\n };\r\n return true;\r\n }\r\n if (Array.isArray(column?.children) && column?.children?.length) {\r\n if (resetColumnRecursively(column.children)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n resetColumnRecursively(this.columns);\r\n this.activeFilterCell = null;\r\n this.cdr.detectChanges();\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n\r\n clearAllFilters() {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n const resetAllRecursively = (columns: any[]) => {\r\n for (const column of columns) {\r\n if (column.query) {\r\n column.query = {\r\n _ids: [],\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: 'contain',\r\n second_value: null\r\n };\r\n }\r\n column.filterValue = null; // Clear column filter value\r\n if (Array.isArray(column?.children) && column.children.length) {\r\n resetAllRecursively(column.children);\r\n }\r\n }\r\n };\r\n resetAllRecursively(this.columns);\r\n this.commonSevice.activeFilteredColumns = []; // Clear active filtered columns\r\n this.tableSearch = ''; // Clear global search\r\n this.activeFilterCell = null;\r\n this.filtersConfig = []; // Clear filters config\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns); // Emit updated filters to API\r\n this.filterCleared.emit(true); // Emit filter cleared event with true flag\r\n const event = { eventType: 'reset' };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n\r\n applySideFilter() {\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n\r\n trackByField(index: number, col: any): string {\r\n return col?.field;\r\n }\r\n\r\n get activeFilteredColumns(): any[] {\r\n const collectFiltered = (columns: any[]): any[] => {\r\n let result: any[] = [];\r\n\r\n columns.forEach(col => {\r\n if (col.children && col.children.length) {\r\n result = result.concat(collectFiltered(col.children));\r\n }\r\n\r\n if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0 && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n const hasValueFilter =\r\n col.query.first_value !== null && col.query.first_value !== undefined && col.query.first_value !== '' && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n };\r\n return [...collectFiltered(this.columns)];\r\n }\r\n\r\n\r\n\r\n toggleOpenFilter() {\r\n this.showFilters = !this.showFilters;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n\r\n // Cell Editing Work start here\r\n\r\n editingKey: string | null = null;\r\n activeCell: string | null = null;\r\n\r\n setActiveCell(row: any, column: any) {\r\n this.activeCell = ((row.id || row._id) + '-' + column.field);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n isActiveCell(row: any, col: any): boolean {\r\n return this.activeCell === ((row.id || row._id) + '-' + col.field);\r\n }\r\n\r\n enableEdit(row: any, column: any) {\r\n this.editinDropdownSearch = '';\r\n if (column.type == 'image' || !column?.is_editable) return;\r\n this.editingKey = ((row.id || row._id) + '-' + column.field);\r\n\r\n if (column.type === 'dropdown') {\r\n setTimeout(() => {\r\n const dropdownMenu = document.querySelector('.cell-editing-dropdown-menu') as HTMLElement;\r\n if (dropdownMenu) {\r\n const rect = dropdownMenu.getBoundingClientRect();\r\n const windowHeight = this.dataGridContainer.nativeElement?.offsetHeight;\r\n\r\n if (rect.bottom > windowHeight) {\r\n dropdownMenu.style.top = `-${rect.height}px`;\r\n } else {\r\n dropdownMenu.style.top = '100%';\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n disableEdit(row: any, column: any, controk?: any) {\r\n this.rowSelectedIndexes.clear();\r\n if (!this.editingKey) return\r\n this.checkRowEditAndEmitValue(row, column, null)\r\n this.editingKey = null;\r\n this.cdr.detectChanges();\r\n const current = this.getNestedValue(row, column?.field);\r\n if (!current || (column.type == 'email' && !this.validateEmail(current))) {\r\n const originalRow = this.originalDataSet.find(item => item.id == row.id || item.id == row._id);\r\n const original = this.getNestedValue(originalRow, column?.field);\r\n this.setNestedValue(row, column, original);\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n validateEmail(value: string): boolean {\r\n return this.emailRegex.test(value);\r\n }\r\n allowOnlyNumbers(event: KeyboardEvent) {\r\n const charCode = event.which ? event.which : event.keyCode;\r\n if (charCode < 48 || charCode > 57) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n checkRowEditAndEmitValue(row: any, column: any, value?: any) {\r\n setTimeout(() => {\r\n const originalRow = this.originalDataSet?.find(\r\n (r: any) => r.id === row.id || r._id === row._id\r\n );\r\n if (!originalRow) return;\r\n const clean = (obj: any) => JSON.parse(JSON.stringify(obj));\r\n const currentValue = this.getNestedValue(row, column.field);\r\n const originalValue = this.getNestedValue(originalRow, column.field);\r\n const hasChanged = this.commonSevice.hasFieldChanged(currentValue, originalValue, column.type);\r\n if (!hasChanged) return;\r\n this.setNestedValue(originalRow, column, value);\r\n const sendObj = {\r\n data: { ...row },\r\n eventType: 'onCellEdit',\r\n value: value\r\n };\r\n this.genericEvent.emit(sendObj)\r\n }, 100);\r\n }\r\n\r\n\r\n isEditing(row: any, col: any): boolean {\r\n return this.editingKey === ((row.id || row._id) + '-' + col.field);\r\n }\r\n\r\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n const path = column.field;\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n const parent = keys.reduce((acc: { [x: string]: {}; }, key: string | number) => acc[key] ??= {}, obj);\r\n\r\n if (parent && lastKey) {\r\n if (typeof option === 'object' && option !== null) {\r\n // case: dropdown object {id, value}\r\n // parent.id = option.id;\r\n parent[lastKey] = option;\r\n } else {\r\n // case: plain string or number\r\n parent[lastKey] = option;\r\n }\r\n }\r\n\r\n const sendObj = {\r\n data: { ...obj },\r\n eventType: 'onCellEdit',\r\n };\r\n\r\n if (calledFromInput) {\r\n this.checkRowEditAndEmitValue(obj, column, option);\r\n }\r\n }\r\n\r\n goToPage(page: any) {\r\n if (page < 1 || page > this.paginationConfig.totalPages) return;\r\n this.paginationConfig.page = page;\r\n const event = {\r\n obj: {\r\n limit: this.paginationConfig.limit,\r\n page: page,\r\n },\r\n eventType: 'pageChange',\r\n };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n onPageSizeChange() {\r\n debugger\r\n this.paginationConfig.selectedPageSize\r\n this.paginationConfig.page = 1;\r\n const event = {\r\n obj: {\r\n limit: +this.paginationConfig.selectedPageSize,//this.paginationConfig.limit,\r\n page: this.paginationConfig.page,\r\n },\r\n eventType: 'pageChange',\r\n };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n actionPreset(data: any, type: any) {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n const event = {\r\n obj: {\r\n data: data\r\n },\r\n eventType: type\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n selectFilter(data:any){\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n this.tableView = this.tableView.map(item => ({\r\n ...item,\r\n is_temp: item.id == data?.id\r\n }));\r\n this.tableFilterViewId = data.id;\r\n this.presetName = data.name;\r\n // Emit filter cleared event when preset is applied (assuming filters are reset)\r\n this.filterCleared.emit(true);\r\n if (data?.is_deafult) {\r\n return this.actionPreset(data, 'setPreset')\r\n }\r\n const event = {\r\n obj: {\r\n data: data,\r\n presetId: data?._id || data?.id\r\n },\r\n eventType: 'select'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n selectDefault() {\r\n this.tableView?.forEach((ele) => { ele.is_temp = false });\r\n this.tableFilterViewId = 'default';\r\n this.presetName = '';\r\n const event = {\r\n obj: {\r\n data: { _id: 'default' },\r\n presetId: 'default'\r\n },\r\n eventType: 'select'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n savePreset(control?: any) {\r\n if (control?.invalid) {\r\n control?.control.markAsTouched();\r\n return;\r\n }\r\n this.presetFilter = this.tableFilterViewId ? true : this.presetFilter;\r\n let selectedData: any = this.tableView.find((ele) => ele.id == this.tableFilterViewId);\r\n let config = {\r\n fontFaimly: this.fontFaimly,\r\n bodyTextFontsSize: this.bodyTextFontsSize,\r\n headerTextFontsSize: this.headerTextFontsSize,\r\n oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\r\n showVerticalBorder: this.showVerticalBorder,\r\n selectedTableLayout: this.selectedTableLayout,\r\n globalSearch: this.tableSearch\r\n\r\n }\r\n const cleanedFilters = (this.filtersConfig || []).map(({ query, type, ...rest }) => {\r\n const result = {\r\n ...rest\r\n };\r\n if (result.__typename) {\r\n delete result.__typename;\r\n }\r\n if (query) {\r\n delete query.__typename;\r\n result.query = query;\r\n if (type === \"dropdown\") {\r\n result._ids = [...query._ids];\r\n result.query = null;\r\n } else if (type === 'string') {\r\n delete query._ids;\r\n result.query = query;\r\n }\r\n } else {\r\n result.query = null;\r\n }\r\n return result;\r\n })\r\n const event = {\r\n obj: {\r\n name: (!this.tableFilterViewId || this.tableFilterViewId === 'default') ? this.presetName : selectedData?.name,\r\n activeFilters: this.presetFilter,\r\n columns: this.columns,\r\n filters: this.presetFilter ? cleanedFilters : [],\r\n config: config,\r\n id: this.tableFilterViewId && this.tableFilterViewId !== 'default' ? this.tableFilterViewId : null,\r\n loadingCall: control == 'mouseUp' ? false : true\r\n },\r\n eventType: this.tableFilterViewId && this.tableFilterViewId !== 'default' ? 'updatePreset' : 'createPreset'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n\r\n toggleRowShading() {\r\n this.oddRowsBackgroundColor = this.rowShadingEnabled ? '#f1f1f1' : undefined;\r\n this.onFontChange();\r\n }\r\n\r\n trackByTable(index: number): number {\r\n return index;\r\n }\r\n activeRow: any\r\n activeRowCol: any;\r\n\r\n // Check if column is mandatory (last two columns)\r\n isMandatory(col: any): boolean {\r\n const index = this.columns.indexOf(col);\r\n return index >= this.columns.length - 2;\r\n }\r\n\r\n // Check if all non-mandatory columns are visible\r\n areAllNonMandatoryVisible(): boolean {\r\n return this.columns.slice(0, -2).every(col => col.is_visible);\r\n }\r\n\r\n // Check if all non-mandatory columns are hidden\r\n areAllNonMandatoryHidden(): boolean {\r\n return this.columns.slice(0, -2).every(col => !col.is_visible);\r\n }\r\n\r\n // Toggle all non-mandatory visible columns\r\n toggleAllVisibleColumns(): void {\r\n const allVisible = this.areAllNonMandatoryVisible();\r\n this.columns.slice(0, -2).forEach(col => {\r\n col.is_visible = !allVisible;\r\n });\r\n this.onSideMenuColumnsVisibilityChange();\r\n }\r\n\r\n // Toggle all non-mandatory invisible columns\r\n toggleAllInvisibleColumns(): void {\r\n const allHidden = this.areAllNonMandatoryHidden();\r\n this.columns.slice(0, -2).forEach(col => {\r\n col.is_visible = allHidden;\r\n });\r\n this.onSideMenuColumnsVisibilityChange();\r\n }\r\n\r\n // Track expanded cells as a Set of unique row+col identifiers\r\n\r\n getCellKey(row: any, col: any): string {\r\n return `${this.getRowId(row)}_${col?.field}`;\r\n }\r\n\r\n expandedCells = new Map<string, number>();\r\n private zCounter = 21;\r\n\r\n toggleExpandOfLongCellText(\r\n row: any,\r\n col: any,\r\n columns: any[],\r\n expandWholeRow = false\r\n ) {\r\n const expandCells = (targetRow: any) => {\r\n columns.forEach(c => {\r\n if (c.type === 'image') return;\r\n const text = targetRow[c.field];\r\n if (typeof text === 'string' && text.length > 50) {\r\n const key = this.getRowId(targetRow) + '-' + c.field;\r\n this.zCounter++;\r\n this.expandedCells.set(key, this.zCounter);\r\n }\r\n });\r\n };\r\n\r\n const collectKeysForRow = (targetRow: any) => {\r\n const keys: string[] = [];\r\n columns.forEach(c => {\r\n if (c.type === 'image') return;\r\n\r\n const text = targetRow[c.field];\r\n if (typeof text === 'string' && text.length > 50) {\r\n keys.push(this.getRowId(targetRow) + '-' + c.field);\r\n }\r\n });\r\n return keys;\r\n };\r\n\r\n if (expandWholeRow) {\r\n let rowKeys: string[] = [];\r\n if (Array.isArray(row.children) && row.children.length > 0) {\r\n rowKeys = collectKeysForRow(row);\r\n row.children.forEach((child: any) => {\r\n rowKeys.push(...collectKeysForRow(child));\r\n });\r\n } else {\r\n rowKeys = collectKeysForRow(row);\r\n }\r\n const allExpanded = rowKeys.every(k => this.expandedCells.has(k));\r\n this.expandedCells.clear();\r\n if (!allExpanded) {\r\n if (Array.isArray(row.children) && row.children.length > 0) {\r\n expandCells(row);\r\n row.children.forEach((child: any) => expandCells(child));\r\n } else {\r\n expandCells(row);\r\n }\r\n }\r\n } else {\r\n const key = this.getRowId(row) + '-' + col.field;\r\n if (col.type === 'image') return;\r\n\r\n if (!this.expandedCells.has(key)) {\r\n this.expandedCells.clear();\r\n this.zCounter++;\r\n this.expandedCells.set(key, this.zCounter);\r\n } else {\r\n this.expandedCells.delete(key);\r\n }\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n isExpanded(row: any, col: any): boolean {\r\n return this.expandedCells.has(this.getRowId(row) + '-' + col.field);\r\n }\r\n\r\n getZIndex(row: any, col: any): number {\r\n return this.expandedCells.get(this.getRowId(row) + '-' + col.field) ?? 21;\r\n }\r\n\r\n isOverflowing(element: HTMLElement | null): boolean {\r\n if (!element) return false;\r\n return element.scrollWidth > element.clientWidth;\r\n }\r\n\r\n\r\n // Picture cell Logic\r\n colorCombination = ['pic-comb1', 'pic-comb2', 'pic-comb4'];\r\n getDynamicClass(name: string): string {\r\n if (!name) return this.colorCombination[0];\r\n const hash = Array.from(name).reduce((acc, char) => acc + char.charCodeAt(0), 0);\r\n const index = hash % this.colorCombination?.length;\r\n return this.colorCombination[index];\r\n }\r\n\r\n getInitials(name: string): string {\r\n if (!name) return 'NA';\r\n const parts = name.trim().split(' ');\r\n return (parts[0][0] + (parts[1]?.[0] || '')).toUpperCase();\r\n }\r\n\r\n getFirstTwoWords(name: string): string {\r\n if (!name) return '';\r\n const words = name.trim().split(/\\s+/).filter(word => /^[a-zA-Z]+$/.test(word));\r\n return words.slice(0, 2).map(word => word.charAt(0).toUpperCase()).join('');\r\n }\r\n\r\n onEmployeeClick(row: any): void {\r\n const event = {\r\n data: row,\r\n eventType: 'openEmployeeModal'\r\n };\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n\r\n actionHide: boolean = true;\r\n xPos = 0;\r\n yPos = 0;\r\n isVisible = false;\r\n deatilsList: any;\r\n openExpendIndex: any;\r\n positionedYet = false;\r\n\r\n // @Input() actions: string[] = ['Edit', 'Delete', 'Download', 'Add Leave'];\r\n\r\n // Helper method to check if \"add Leave\" should be hidden based on attendance status\r\n private shouldHideAddLeave(item: any): boolean {\r\n // Only allow \"Add Leave\" when attendanceStatus is 'attended' or 'absent'\r\n const attendanceStatus = (item.attendanceStatus || '').toLowerCase().trim();\r\n return attendanceStatus !== 'attended' && attendanceStatus !== 'absent';\r\n}\r\n\r\nonRightClick(event: MouseEvent | TouchEvent, item: any, context: 'main' | 'accordion-parent' | 'accordion-child' = 'main'): boolean {\r\n event.preventDefault();\r\n\r\n this.xPos = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX;\r\n this.yPos = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY;\r\n this.deatilsList = item;\r\n\r\n // Determine whether to hide \"Add Leave\"\r\n const shouldHideAddLeave = this.shouldHideAddLeave(item);\r\n\r\n // Set context-specific actions\r\n if (context === 'accordion-parent') {\r\n this.actions = ['download'];\r\n } else if (context === 'accordion-child') {\r\n this.actions = ['edit', 'delete', 'download'];\r\n if (!shouldHideAddLeave) {\r\n this.actions.push('add Leave');\r\n }\r\n } else {\r\n // Default: show actions for single day (main context) based on status\r\n this.actions = ['edit', 'delete', 'download'];\r\n if (!shouldHideAddLeave) {\r\n this.actions.push('add Leave');\r\n }\r\n }\r\n\r\n this.isVisible = true;\r\n this.positionedYet = false;\r\n this.cdr.detectChanges();\r\n\r\n // Positioning logic (keep your existing code)\r\n setTimeout(() => {\r\n const menu = document.querySelector('.context-menu') as HTMLElement;\r\n if (!menu) return;\r\n let x = this.xPos, y = this.yPos;\r\n const mw = menu.offsetWidth, mh = menu.offsetHeight;\r\n const vw = window.innerWidth, vh = window.innerHeight;\r\n if (x + mw > vw) x = vw - mw - 10;\r\n if (y + mh > vh) y = vh - mh - 10;\r\n this.xPos = x; this.yPos = y;\r\n this.positionedYet = true;\r\n this.cdr.detectChanges();\r\n }, 0);\r\n\r\n return false;\r\n}\r\n\r\n\r\n onActionClick(action: string) {\r\n const event = {\r\n obj: this.deatilsList,\r\n eventType: action,\r\n };\r\n this.genericEvent.emit(event);\r\n this.isVisible = false;\r\n}\r\n\r\n\r\n onVerifyClick(type: string) {\r\n const idsArray = Array.from(this.selectedRows);\r\n const arrayOfObjectsWithTableType: any[] = [];\r\n this.selectedRows.forEach(id => {\r\n arrayOfObjectsWithTableType.push({\r\n id: id,\r\n listingType: this.listingType,\r\n });\r\n });\r\n const sendObj = {\r\n data: {\r\n obj: idsArray,\r\n tableName: this.tableName,\r\n listingType: this.listingType,\r\n },\r\n eventType: type,\r\n };\r\n this.genericEvent.emit(sendObj)\r\n }\r\n\r\n\r\n\r\n getCellClasses(column: any, value: any): string {\r\n if (!value) return '';\r\n let val: any;\r\n if (typeof value === 'object') {\r\n val = value?.value;\r\n } else {\r\n val = value;\r\n }\r\n const field = column?.field;\r\n const status = val?.toString().toLowerCase();\r\n // Skip badge classes for status and attendanceStatus fields as they're handled separately in template\r\n if (field === 'status' || field === 'attendanceStatus') {\r\n return '';\r\n }\r\n if (field === 'account_status' || field === 'availStatus' || field === 'is_custom_grade') {\r\n return BADGES_MAP[status] || 'badge badge-secondary';\r\n }\r\n return '';\r\n }\r\n\r\n removeColumnFilterFromColumn(column: any) {\r\n if (!column) return\r\n if (column.type === 'dropdown') {\r\n column.query._ids = [];\r\n } else if (['string', 'number', 'date'].includes(column.type)) {\r\n column.query = {\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: null,\r\n second_value: null,\r\n }\r\n }\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n onSideMenuColumnsVisibilityChange() {\r\n this.refreshHeaders();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n downloadCsv(type?: string) {\r\n const event = {\r\n obj: {\r\n columns: this.columns,\r\n filters: [],\r\n type: type || 'csv'\r\n },\r\n eventType: 'downloadCsv'\r\n }\r\n this.genericEvent.emit(event)\r\n\r\n }\r\n\r\n onFontChange() {\r\n this.headerTextFontsSize = this.bodyTextFontsSize;\r\n const config = {\r\n fontFaimly: this.fontFaimly,\r\n bodyTextFontsSize: this.bodyTextFontsSize,\r\n headerTextFontsSize: this.headerTextFontsSize,\r\n oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\r\n showVerticalBorder: this.showVerticalBorder,\r\n selectedTableLayout: this.selectedTableLayout,\r\n globalSearch: this.tableSearch\r\n }\r\n const event = {\r\n obj: {\r\n data: config\r\n },\r\n eventType: 'config'\r\n }\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n onGlobalSearch() {\r\n if (this.tableSearch.trim()) {\r\n // Determine date to send: use selected range if available, otherwise today\r\n let dateData;\r\n if (this.bsRangeValue && this.bsRangeValue.length === 2 && this.bsRangeValue[0] && this.bsRangeValue[1]) {\r\n const isSingleDay = this.bsRangeValue[0].getTime() === this.bsRangeValue[1].getTime();\r\n dateData = {\r\n range: this.bsRangeValue,\r\n isSingleDay: isSingleDay\r\n };\r\n } else {\r\n const today = new Date();\r\n dateData = {\r\n range: [today, today],\r\n isSingleDay: true\r\n };\r\n }\r\n\r\n const event = {\r\n obj: {\r\n tableSearch: this.tableSearch.trim(),\r\n ...dateData\r\n },\r\n eventType: 'search'\r\n };\r\n this.genericEvent.emit(event);\r\n this.searchEvent.emit({\r\n search: this.tableSearch.trim(),\r\n page: 1,\r\n ...dateData\r\n });\r\n\r\n // Clear search after emitting\r\n // this.tableSearch = '';\r\n\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n }\r\n\r\n onSearchReset() {\r\n // Clear the search input\r\n this.tableSearch = '';\r\n\r\n // Determine date to send: use selected range if available, otherwise today\r\n let dateData;\r\n if (this.bsRangeValue && this.bsRangeValue.length === 2 && this.bsRangeValue[0] && this.bsRangeValue[1]) {\r\n const isSingleDay = this.bsRangeValue[0].getTime() === this.bsRangeValue[1].getTime();\r\n dateData = {\r\n range: this.bsRangeValue,\r\n isSingleDay: isSingleDay\r\n };\r\n } else {\r\n const today = new Date();\r\n dateData = {\r\n range: [today, today],\r\n isSingleDay: true\r\n };\r\n }\r\n\r\n // Emit reset search event\r\n const event = {\r\n obj: {\r\n tableSearch: '',\r\n ...dateData\r\n },\r\n eventType: 'search'\r\n };\r\n this.genericEvent.emit(event);\r\n this.searchEvent.emit({\r\n search: '',\r\n page: 1,\r\n ...dateData\r\n });\r\n\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n\r\n checkFilterChangesEffect(): any {\r\n if (!this.tableFilterViewId) return true\r\n const findDefaultFilter = this.tableView?.find((ele: any) => ele?.id == this.tableFilterViewId);\r\n const normalizeFilters = (filters: any[] | undefined): any[] => {\r\n if (!Array.isArray(filters)) return [];\r\n const cloned = filters.map(f => {\r\n const item = JSON.parse(JSON.stringify(f ?? {}));\r\n if (!Array.isArray(item._ids)) item._ids = [];\r\n item._ids = item._ids.slice().sort((a: any, b: any) => {\r\n if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n return ('' + a).localeCompare('' + b);\r\n });\r\n\r\n if (item.query === null) {\r\n } else if (typeof item.query === 'object') {\r\n if (!Array.isArray(item.query._ids)) item.query._ids = [];\r\n item.query._ids = item.query._ids.slice().sort((a: any, b: any) => {\r\n if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n return ('' + a).localeCompare('' + b);\r\n });\r\n }\r\n\r\n return item;\r\n });\r\n cloned.sort((a: any, b: any) => {\r\n const fa = (a.field || '') + '|' + (a.type || '');\r\n const fb = (b.field || '') + '|' + (b.type || '');\r\n return fa.localeCompare(fb);\r\n });\r\n\r\n return cloned;\r\n };\r\n\r\n const deepEqual = (a: any, b: any): boolean => {\r\n if (a === b) return true;\r\n\r\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n return a === b;\r\n }\r\n\r\n if (Array.isArray(a) !== Array.isArray(b)) return false;\r\n\r\n if (Array.isArray(a)) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (!deepEqual(a[i], b[i])) return false;\r\n }\r\n return true;\r\n }\r\n\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n for (const key of keysA) {\r\n if (!keysB.includes(key)) return false;\r\n if (!deepEqual(a[key], b[key])) return false;\r\n }\r\n return true;\r\n };\r\n const normalizedA = normalizeFilters(findDefaultFilter?.filters);\r\n const normalizedB = normalizeFilters(this.filtersConfig);\r\n const isSame = deepEqual(normalizedA, normalizedB);\r\n return isSame;\r\n }\r\n\r\n\r\n\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // Cell Selection Implemented Here Implemented Here\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n\r\n selectedCells: any[] = [];\r\n selectedKeys: Set<string> = new Set();\r\n selectionStart: any = null;\r\n isSelecting = false;\r\n startSelection(\r\n rowIndex: number,\r\n colIndex: number,\r\n subColIndex: number | null,\r\n field: string,\r\n event: MouseEvent,\r\n section: string\r\n ) {\r\n event.preventDefault();\r\n this.rowSelectedIndexes.clear();\r\n const safeSub = subColIndex ?? 0;\r\n const key = `${rowIndex}-${colIndex}-${safeSub}-${field}`;\r\n\r\n this.selectionStart = { rowIndex, colIndex, subColIndex: safeSub, field, key };\r\n this.isSelecting = true;\r\n this.selectedKeys.clear();\r\n this.selectedKeys.add(key);\r\n this.selectedCells = [this.selectionStart];\r\n const mouseUpHandler = () => {\r\n this.endSelection();\r\n document.removeEventListener('mouseup', mouseUpHandler);\r\n };\r\n document.addEventListener('mouseup', mouseUpHandler);\r\n this.updateSelectionBoundaries()\r\n }\r\n\r\n\r\n extendSelection(\r\n rowIndex: number,\r\n colIndex: number,\r\n subColIndex: number | null,\r\n field: string,\r\n event: MouseEvent,\r\n section: string\r\n ) {\r\n if (!this.isSelecting || !this.selectionStart) return;\r\n\r\n const start = this.selectionStart;\r\n const targetSubColIndex = subColIndex ?? 0;\r\n const newKeys: Set<string> = new Set();\r\n const newCells: any[] = [];\r\n const minRow = Math.min(start.rowIndex, rowIndex);\r\n const maxRow = Math.max(start.rowIndex, rowIndex);\r\n const columnsToSelect = this.getColumnSelectionRange(start.colIndex, colIndex, start.subColIndex, targetSubColIndex);\r\n\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (const colInfo of columnsToSelect) {\r\n const k = `${r}-${colInfo.colIndex}-${colInfo.subColIndex}-${section}`;\r\n newKeys.add(k);\r\n newCells.push({\r\n rowIndex: r,\r\n colIndex: colInfo.colIndex,\r\n subColIndex: colInfo.subColIndex,\r\n field,\r\n key: k\r\n });\r\n }\r\n }\r\n\r\n this.selectedKeys = newKeys;\r\n this.selectedCells = newCells;\r\n this.updateSelectionBoundaries();\r\n\r\n // Add auto-scrolling logic\r\n this.handleCellAutoScroll(event);\r\n }\r\n\r\n\r\n\r\n\r\n getColumnSelectionRange(\r\n startCol: number,\r\n endCol: number,\r\n startSub: number,\r\n endSub: number\r\n ): { colIndex: number; subColIndex: number }[] {\r\n const result: { colIndex: number; subColIndex: number }[] = [];\r\n const minCol = Math.min(startCol, endCol);\r\n const maxCol = Math.max(startCol, endCol);\r\n\r\n const isLeftToRight = startCol <= endCol;\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const subColCount = this.getSubColumnCount(c);\r\n\r\n if (c === startCol && c === endCol) {\r\n const minSub = Math.min(startSub, endSub);\r\n const maxSub = Math.max(startSub, endSub);\r\n for (let s = minSub; s <= maxSub && s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n else if (c === startCol) {\r\n if (isLeftToRight) {\r\n for (let s = startSub; s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n } else {\r\n for (let s = 0; s <= startSub && s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n }\r\n else if (c === endCol) {\r\n if (isLeftToRight) {\r\n for (let s = 0; s <= endSub && s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n } else {\r\n for (let s = endSub; s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n }\r\n else {\r\n for (let s = 0; s < subColCount; s++) {\r\n result.push({ colIndex: c, subColIndex: s });\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n getSubColumnCount(colIndex: number): number {\r\n if (!this.columns || colIndex < 0 || colIndex >= this.columns.length) {\r\n return 1;\r\n }\r\n const column = this.columns[colIndex];\r\n if (column.children && Array.isArray(column.children)) {\r\n return column.children.length;\r\n }\r\n return 1;\r\n }\r\n isGroupColumn(colIndex: number): boolean {\r\n return this.getSubColumnCount(colIndex) > 1;\r\n }\r\n endSelection() {\r\n this.isSelecting = false;\r\n this.stopAutoScroll();\r\n this.updateSelectionBoundaries();\r\n }\r\n isSelected(\r\n rowIndex: number,\r\n colIndex: number,\r\n subColIndex: number | null,\r\n field: string,\r\n section: string\r\n ) {\r\n const safeSub = subColIndex ?? 0;\r\n const key = `${rowIndex}-${colIndex}-${safeSub}-${section}`;\r\n return this.selectedKeys.has(key);\r\n }\r\n\r\n\r\n private selectionBounds: {\r\n top: number | null;\r\n bottom: number | null;\r\n left: { colIndex: number; subColIndex: number } | null;\r\n right: { colIndex: number; subColIndex: number } | null;\r\n } = { top: null, bottom: null, left: null, right: null };\r\n\r\n updateSelectionBoundaries() {\r\n if (this.selectedCells.length === 0) {\r\n this.selectionBounds = { top: null, bottom: null, left: null, right: null };\r\n return;\r\n }\r\n\r\n // Get all unique row indices and find min/max\r\n const rowIndices = [...new Set(this.selectedCells.map(cell => cell.rowIndex))];\r\n this.selectionBounds.top = Math.min(...rowIndices);\r\n this.selectionBounds.bottom = Math.max(...rowIndices);\r\n\r\n // For left/right boundaries, we need to consider both colIndex and subColIndex\r\n const leftMost = this.findLeftMostCell();\r\n const rightMost = this.findRightMostCell();\r\n\r\n this.selectionBounds.left = leftMost;\r\n this.selectionBounds.right = rightMost;\r\n }\r\n findLeftMostCell(): { colIndex: number; subColIndex: number } | null {\r\n if (this.selectedCells.length === 0) return null;\r\n\r\n const minColIndex = Math.min(...this.selectedCells.map(cell => cell.colIndex));\r\n const leftColCells = this.selectedCells.filter(cell => cell.colIndex === minColIndex);\r\n const minSubColIndex = Math.min(...leftColCells.map(cell => cell.subColIndex));\r\n\r\n return { colIndex: minColIndex, subColIndex: minSubColIndex };\r\n }\r\n findRightMostCell(): { colIndex: number; subColIndex: number } | null {\r\n if (this.selectedCells.length === 0) return null;\r\n\r\n const maxColIndex = Math.max(...this.selectedCells.map(cell => cell.colIndex));\r\n const rightColCells = this.selectedCells.filter(cell => cell.colIndex === maxColIndex);\r\n const maxSubColIndex = Math.max(...rightColCells.map(cell => cell.subColIndex));\r\n\r\n return { colIndex: maxColIndex, subColIndex: maxSubColIndex };\r\n }\r\n isTopBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.top !== null && rowIndex === this.selectionBounds.top;\r\n }\r\n isBottomBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.bottom !== null && rowIndex === this.selectionBounds.bottom;\r\n }\r\n isLeftBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.left !== null &&\r\n colIndex === this.selectionBounds.left.colIndex &&\r\n safeSub === this.selectionBounds.left.subColIndex;\r\n }\r\n\r\n isRightBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n const safeSub = subColIndex ?? 0;\r\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n return isSelected && this.selectionBounds.right !== null &&\r\n colIndex === this.selectionBounds.right.colIndex &&\r\n safeSub === this.selectionBounds.right.subColIndex;\r\n }\r\n\r\n isTopLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n isTopRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n isBottomLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n isBottomRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\r\n }\r\n\r\n\r\n cellSelectionAutoScrollInterval: any = null;\r\n private scrollSpeed = 100;\r\n private scrollMargin = 150;\r\n handleCellAutoScroll(event: MouseEvent) {\r\n if (this.cellSelectionAutoScrollInterval) {\r\n clearInterval(this.cellSelectionAutoScrollInterval);\r\n this.cellSelectionAutoScrollInterval = null;\r\n }\r\n const horizontalContainer = this.centerScrollableBody.nativeElement;\r\n const verticalContainer = this.mainScroll.nativeElement;\r\n if (!horizontalContainer || !verticalContainer) return;\r\n const horizontalRect = horizontalContainer.getBoundingClientRect();\r\n const mouseX = event.clientX;\r\n const verticalRect = verticalContainer.getBoundingClientRect();\r\n const mouseY = event.clientY;\r\n const nearTop = mouseY - verticalRect.top < this.scrollMargin;\r\n const nearBottom = verticalRect.bottom - mouseY < this.scrollMargin;\r\n const nearLeft = mouseX - horizontalRect.left < this.scrollMargin;\r\n const nearRight = horizontalRect.right - mouseX < this.scrollMargin;\r\n let scrollX = 0;\r\n let scrollY = 0;\r\n if (nearTop) scrollY = -this.scrollSpeed;\r\n if (nearBottom) scrollY = this.scrollSpeed;\r\n if (nearLeft) scrollX = -this.scrollSpeed;\r\n if (nearRight) scrollX = this.scrollSpeed;\r\n if (scrollX !== 0 || scrollY !== 0) {\r\n this.cellSelectionAutoScrollInterval = setInterval(() => {\r\n if (scrollX !== 0) {\r\n horizontalContainer.scrollBy(scrollX, 0);\r\n }\r\n if (scrollY !== 0) {\r\n verticalContainer.scrollBy(0, scrollY);\r\n }\r\n }, 16);\r\n }\r\n }\r\n\r\n stopAutoScroll() {\r\n if (this.cellSelectionAutoScrollInterval) {\r\n clearInterval(this.cellSelectionAutoScrollInterval);\r\n this.cellSelectionAutoScrollInterval = null;\r\n }\r\n }\r\n\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // Row Selection from the Indexing Implemented Here\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n // *************************************************************************\r\n\r\n rowSelectedIndexes: Set<number> = new Set();\r\n rowSelecting = false;\r\n rowSelectionStartIndex: number | null = null;\r\n\r\n get firstSelectedRow(): number | null {\r\n if (this.rowSelectedIndexes.size === 0) return null;\r\n return Math.min(...this.rowSelectedIndexes);\r\n }\r\n\r\n get lastSelectedRow(): number | null {\r\n if (this.rowSelectedIndexes.size === 0) return null;\r\n return Math.max(...this.rowSelectedIndexes);\r\n }\r\n\r\n\r\n onRowMouseDown(index: number, event: MouseEvent) {\r\n event.preventDefault();\r\n this.rowSelecting = true;\r\n this.selectedKeys.clear();\r\n this.rowSelectionStartIndex = index;\r\n this.rowSelectedIndexes.clear();\r\n this.rowSelectedIndexes.add(index);\r\n this.activeCell = '';\r\n this.cdr.detectChanges();\r\n\r\n const mouseMoveHandler = (e: MouseEvent) => this.handleAutoScroll(e);\r\n const mouseUpHandler = () => {\r\n this.onRowMouseUp();\r\n document.removeEventListener('mouseup', mouseUpHandler);\r\n document.removeEventListener('mousemove', mouseMoveHandler);\r\n if (this.autoScrollInterval) {\r\n cancelAnimationFrame(this.autoScrollInterval);\r\n this.autoScrollInterval = null;\r\n }\r\n };\r\n\r\n document.addEventListener('mouseup', mouseUpHandler);\r\n document.addEventListener('mousemove', mouseMoveHandler);\r\n }\r\n\r\n onRowMouseOver(index: number, event: MouseEvent) {\r\n if (!this.rowSelecting || this.rowSelectionStartIndex === null) return;\r\n this.rowSelectedIndexes.clear();\r\n const start = Math.min(this.rowSelectionStartIndex, index);\r\n const end = Math.max(this.rowSelectionStartIndex, index);\r\n for (let i = start; i <= end; i++) {\r\n this.rowSelectedIndexes.add(i);\r\n }\r\n console.log([...this.rowSelectedIndexes]);\r\n }\r\n\r\n onRowMouseUp() {\r\n this.rowSelecting = false;\r\n this.rowSelectionStartIndex = null;\r\n }\r\n handleAutoScroll(e: MouseEvent) {\r\n const container = this.mainScroll?.nativeElement as HTMLElement;\r\n if (!container) return;\r\n\r\n const rect = container.getBoundingClientRect();\r\n const edgeSize = 40\r\n let scrollAmount = 0;\r\n\r\n if (e.clientY < rect.top + edgeSize) {\r\n scrollAmount = -150;\r\n } else if (e.clientY > rect.bottom - edgeSize) {\r\n scrollAmount = 150;\r\n }\r\n\r\n if (scrollAmount !== 0) {\r\n if (!this.autoScrollInterval) {\r\n const step = () => {\r\n container.scrollTop += scrollAmount;\r\n this.autoScrollInterval = requestAnimationFrame(step);\r\n };\r\n this.autoScrollInterval = requestAnimationFrame(step);\r\n }\r\n } else {\r\n if (this.autoScrollInterval) {\r\n cancelAnimationFrame(this.autoScrollInterval);\r\n this.autoScrollInterval = null;\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n undoStack: any[][] = [];\r\n redoStack: any[][] = [];\r\n\r\n private cloneData(data: any[]): any[] {\r\n return JSON.parse(JSON.stringify(data));\r\n }\r\n\r\n performCut(selectedData: any[][]) {\r\n // Save current state for undo\r\n this.undoStack.push(this.cloneData(this.visibleRows));\r\n this.redoStack = []; // Clear redo stack on new action\r\n\r\n // Perform cut\r\n this.copyService.cutWithAnimation(selectedData);\r\n const { updatedRows } = this.copyService.cutSelectedSelectedData(\r\n this.visibleRows,\r\n this.rowSelectedIndexes,\r\n this.selectedCells,\r\n this.columns,\r\n this.setNestedValue.bind(this)\r\n );\r\n\r\n console.log('Updated Rows: ', updatedRows);\r\n }\r\n\r\n\r\n\r\n getSelectedDataForCopy(): any[][] {\r\n return this.copyService.getSelectedDataForCopy(\r\n this.visibleRows,\r\n this.columns,\r\n this.rowSelectedIndexes,\r\n this.selectedCells,\r\n this.getNestedValue.bind(this)\r\n );\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent) {\r\n\r\n const focus = this.findFocusedDetailRowAndSection();\r\n if (focus) {\r\n this.handleDetailShortcuts(event, focus.row, focus.section);\r\n return;\r\n }\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\r\n const selectedData = this.getSelectedDataForCopy();\r\n event.preventDefault();\r\n this.copyService.copyToClipboard(selectedData);\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\r\n const selectedData = this.getSelectedDataForCopy();\r\n event.preventDefault();\r\n this.performCut(selectedData);\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\r\n event.preventDefault();\r\n this.undo();\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.redo();\r\n }\r\n }\r\n\r\n undo() {\r\n if (this.undoStack.length > 0) {\r\n const prevState = this.undoStack.pop()!;\r\n this.redoStack.push(this.cloneData(this.visibleRows));\r\n this.visibleRows = this.cloneData(prevState);\r\n }\r\n }\r\n\r\n redo() {\r\n if (this.redoStack.length > 0) {\r\n const nextState = this.redoStack.pop()!;\r\n this.undoStack.push(this.cloneData(this.visibleRows));\r\n this.visibleRows = this.cloneData(nextState);\r\n }\r\n }\r\n\r\n\r\n\r\n @HostListener('document:paste', ['$event'])\r\n async onPaste(event: ClipboardEvent) {\r\n event.preventDefault();\r\n const text = event.clipboardData?.getData('text');\r\n if (!text) return;\r\n\r\n const startCell = this.selectedCells?.[0];\r\n if (!startCell) return;\r\n\r\n const updatedRows = await this.copyService.pasteFromClipboardText(\r\n text,\r\n this.visibleRows,\r\n this.columns,\r\n startCell.rowIndex,\r\n startCell.colIndex,\r\n startCell.subColIndex\r\n );\r\n console.log(\"Updated Rows: \", updatedRows);\r\n if (updatedRows?.length) {\r\n const sendObj = {\r\n data: updatedRows,\r\n eventType: 'onCellEdit',\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n isDate(value: any): boolean {\r\n return !isNaN(new Date(value)?.getTime());\r\n }\r\n\r\n formatLogState(value: any): string {\r\n if (!value) return '-';\r\n if (this.isDate(value)) {\r\n return this.formatTime(value);\r\n }\r\n return value.toString();\r\n }\r\n\r\n// For Detail Row Editing\r\ndetailEditingKey: string | null = null; // e.g., \"rowId-dataIndex-fieldName\"\r\nactiveDetailRow: any = null;\r\nactiveDetailCol: any = null;\r\n\r\n// For Detail Row Filtering\r\ndetailFilterValue: string = '';\r\ndetailFilterCondition: string = 'contain';\r\ndetailFilters: Map<string, { condition: string, value: any }> = new Map(); // key: `${rowId}-${colField}`\r\n\r\n// For Detail Row Drag & Drop\r\ncurrentDetailDraggingColumn: any = null;\r\ncurrentDetailRow: any = null;\r\n// Detail Row - Three Dots Menu\r\nopenDetailThreeDotsMenu(event: MouseEvent, row: any, col: any) {\r\n event.stopPropagation();\r\n this.activeDetailRow = row;\r\n this.activeDetailCol = col;\r\n // Positioning logic can be added here if needed\r\n // For now, it will appear right below the header\r\n}\r\n\r\n// Detail Row - Inline Editing\r\nenableDetailEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\nisDetailEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCell(row: any, dataItem: any, col: any): boolean {\r\n return this.isDetailEditing(row, dataItem, col);\r\n}\r\n\r\n// Detail Row - Drag & Drop\r\n\r\n\r\n\r\n\r\n\r\ngetDetailFilterMenuLeft(row: any, col: any): number {\r\n // Find the header cell and return its left position\r\n const headerCell = document.querySelector(`[field=\"${col.field}\"]`);\r\n if (headerCell) {\r\n const rect = headerCell.getBoundingClientRect();\r\n return rect.left;\r\n }\r\n return 0;\r\n}\r\n\r\n// Detail Row - Filtering\r\napplyDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.set(filterKey, {\r\n condition: this.detailFilterCondition,\r\n value: this.detailFilterValue\r\n });\r\n\r\n // Apply filter to data\r\n this.filterDetailData(row);\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\ntoggleSelectAllDetailFilters(col: any, row: any, event: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n const allOptions = col.column_dropdown_value || [];\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const allSelected = allOptions.every((option: any) =>\r\n filter.value.includes(option._id || option.id || option)\r\n );\r\n\r\n if (allSelected) {\r\n // Deselect all\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n // Select all\r\n filter.value = allOptions.map((option: any) => option._id || option.id || option);\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nonDetailOptionToggle(col: any, option: any, row: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const optionId = option._id || option.id || option;\r\n const index = filter.value.indexOf(optionId);\r\n\r\n if (index > -1) {\r\n filter.value.splice(index, 1);\r\n } else {\r\n filter.value.push(optionId);\r\n }\r\n\r\n if (filter.value.length === 0) {\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nresetDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.delete(filterKey);\r\n this.filterDetailData(row); // Re-filter to show all data\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nfilterDetailData(row: any) {\r\n if (!row.details?.originalData) {\r\n // Store original data on first filter\r\n row.details.originalData = [...row.details.data];\r\n }\r\n\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n let passes = true;\r\n for (let [filterKey, filter] of this.detailFilters.entries()) {\r\n if (filterKey.startsWith(`${row._id || row.id}-`)) {\r\n const colField = filterKey.split('-')[1];\r\n const cellValue = String(item[colField] || '').toLowerCase();\r\n const filterValue = String(filter.value || '').toLowerCase();\r\n\r\n switch (filter.condition) {\r\n case 'contain':\r\n passes = passes && cellValue.includes(filterValue);\r\n break;\r\n case 'equals':\r\n passes = passes && cellValue === filterValue;\r\n break;\r\n case 'startsWith':\r\n passes = passes && cellValue.startsWith(filterValue);\r\n break;\r\n case 'endsWith':\r\n passes = passes && cellValue.endsWith(filterValue);\r\n break;\r\n}\r\n\r\n if (!passes) break;\r\n }\r\n }\r\n return passes;\r\n});\r\n}\r\n\r\n\r\n// For Detail Row Drag & Drop\r\n\r\n\r\nonDetailDragStart(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n}\r\n\r\nonDetailDragMoved(event: CdkDragMove, row: any) {\r\n // Let CDK handle visual preview — no manual DOM manipulation needed\r\n}\r\n\r\nonDetailDragDropped(event: CdkDragDrop<any>, row: any) {\r\n if (!this.currentDetailDraggingColumn || !row.details || !row.details.columns) return;\r\n\r\n const previousIndex = row.details.columns.findIndex((c: any) => c.field === this.currentDetailDraggingColumn.field);\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.cdr.detectChanges();\r\n\r\n\r\n }\r\n\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n}\r\n\r\n\r\n@Input() detailsIconPosition: 'start' | 'end' = 'start';\r\n\r\n@Input() detailsPosition: 'top' | 'bottom' = 'top';\r\n\r\n\r\n\r\ndropColumn(event: CdkDragDrop<any[]>, row: any) {\r\n if (!row?.details?.columns) return;\r\n\r\n moveItemInArray(row.details.columns, event.previousIndex, event.currentIndex);\r\n\r\n // Optional: if you want to also reorder the data inside each row\r\n if (row.details.data?.length) {\r\n row.details.data.forEach((dataRow: any) => {\r\n const values = [...row.details.columns.map((c: any) => dataRow[c.field])];\r\n // reassign values in new order\r\n row.details.columns.forEach((col: any, i: number) => {\r\n dataRow[col.field] = values[i];\r\n });\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\nopenSubMenue(col: any){\r\n this.subMenueOpendField = col.field;\r\n}\r\n\r\ndetailDragState = {\r\n isDragging: false,\r\n sourceRow: null as any,\r\n sourceColumn: null as any,\r\n originalColumns: [] as any[],\r\n originalIndex: -1\r\n};\r\n\r\n\r\n\r\nonDetailDragEnd(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const currentContainer = event.source.dropContainer;\r\n\r\n if (this.detailDragState.originalIndex === event.source.data) {\r\n row.details.columns = [...this.detailDragState.originalColumns];\r\n this.cdr.detectChanges();\r\n }\r\n\r\n event.source.element.nativeElement.style.opacity = '1';\r\n}\r\n\r\nonDetailDragEndSimple(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n event.source.element.nativeElement.style.opacity = '1';\r\n\r\n\r\n}\r\n\r\nreorderDetailData(row: any, oldIndex: number, newIndex: number) {\r\n if (!row.details.data) return;\r\n\r\n row.details.data.forEach((dataRow: any) => {\r\n const keys = row.details.columns.map((col: any) => col.field);\r\n const values = keys.map((key: string) => dataRow[key]);\r\n\r\n const movedValue = values[oldIndex];\r\n\r\n values.splice(oldIndex, 1);\r\n\r\n values.splice(newIndex, 0, movedValue);\r\n\r\n const newData: any = {};\r\n keys.forEach((key: string, index: number) => {\r\n newData[key] = values[index];\r\n });\r\n\r\n Object.assign(dataRow, newData);\r\n });\r\n}\r\n\r\nemitDetailColumnReorderEvent(row: any) {\r\n const eventObj = {\r\n rowId: row._id || row.id,\r\n columns: row.details.columns,\r\n eventType: 'onDetailColumnReorder'\r\n };\r\n this.genericEvent.emit(eventObj);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\noriginalDetailValues: Map<string, any> = new Map(); // Track original detail cell values for compare\r\ndetailAccordionStates: Map<string, boolean> = new Map(); // Track accordion expand states\r\n\r\n// Line ~1620: Update onDetailDragStart (add animation class)\r\nonDetailDragStarts(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n\r\n // NEW: Add real-time drag animation\r\n event.source.element.nativeElement.classList.add('dragging'); // Add class for opacity/transform\r\n requestAnimationFrame(() => {\r\n // Preview move\r\n event.source.element.nativeElement.style.transform = 'translateX(10px)';\r\n });\r\n}\r\n\r\n// Line ~1640: Update onDetailDragDropped (add animation + revert if same position)\r\nonDetailDragDroppeds(event: CdkDragDrop<any[]>, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const previousIndex = event.previousIndex;\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n // NEW: Animate reorder\r\n const headerRow = document.querySelector('.detail-header-row') as HTMLElement;\r\n if (headerRow) {\r\n headerRow.classList.add('dragging'); // Start animation\r\n setTimeout(() => {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.reorderDetailData(row, previousIndex, currentIndex);\r\n this.emitDetailColumnReorderEvent(row);\r\n headerRow.classList.remove('dragging'); // End animation\r\n this.cdr.detectChanges();\r\n }, 300); // Delay for smooth real-time feel\r\n }\r\n } else {\r\n // Revert if same position (with animation)\r\n requestAnimationFrame(() => {\r\n event.item.element.nativeElement.style.transform = 'translateX(0)';\r\n });\r\n }\r\n\r\n // Reset\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n event.item.element.nativeElement.classList.remove('dragging');\r\n}\r\n\r\n// NEW METHOD: Add around line ~1700 (after existing drag methods)\r\nhandleDetailDoubleClick(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${col.field}`;\r\n\r\n // Toggle accordion expand\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n this.detailAccordionStates.set(key, row.isDetailsExpand);\r\n\r\n // Emit generic event for accordion toggle (send to API)\r\n const eventObj = {\r\n data: { row, col, dataItem },\r\n eventType: 'expandAccordion',\r\n isExpanded: row.isDetailsExpand\r\n };\r\n this.genericEvent.emit(eventObj);\r\n\r\n // Removed double-click to edit functionality in accordion data\r\n // If not expanded, stop here; else proceed to edit if applicable\r\n // if (!row.isDetailsExpand) return;\r\n\r\n // Proceed to edit (with compare logic in disable)\r\n // this.enableDetailEdit(row, dataItem, col);\r\n\r\n // NEW: Store original value for compare on save\r\n // const originalValue = dataItem[col.field];\r\n // this.originalDetailValues.set(key, originalValue);\r\n}\r\n\r\n// Line ~1740: Update disableDetailEdit (add compare + emit if changed)\r\ndisableDetailEdit(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Compare and emit if changed\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue },\r\n eventType: 'onDetailCellEdit',\r\n changed: true\r\n };\r\n this.genericEvent.emit(sendObj); // Send to API\r\n }\r\n\r\n // Cleanup\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Enable inline editing for accordion cells\r\nenableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Disable inline editing for accordion cells\r\ndisableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue, rowId: row._id || row.id, field: col.field },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Check if accordion cell is being edited\r\nisDetailCellEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\ntooltipVisible = false;\r\ntooltipEditing = false; // NEW\r\ncurrentTooltipField: string | null = null;\r\ncurrentTooltipData: any = null;\r\n// tooltipPosition = { x: 0, y: 0 };\r\n\r\n\r\nenableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndisableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Check if value changed\r\n if (newValue !== originalValue) {\r\n // Send update to API\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n\r\ntooltipElement: HTMLElement | null = null;\r\n\r\n\r\ngetDisplayValue(dataItem: any, field: string): string {\r\nif (field === 'breaks') {\r\nconst breaks = dataItem[field] || [];\r\nif (!Array.isArray(breaks) || breaks.length === 0) {\r\n return '0';\r\n}\r\nconst totalMinutes = breaks.reduce((sum: number, b: any) => sum + (b.break_duration || 0), 0);\r\nreturn totalMinutes > 0 ? `${totalMinutes}m` : '0';\r\n} else if (field === 'short_breaks') {\r\nconst shortBreak = dataItem[field];\r\nif (!shortBreak || !shortBreak.short_break_duration) {\r\n return '0';\r\n}\r\nreturn `${shortBreak.short_break_duration}m`;\r\n} else if (field === 'short_leave') {\r\nconst shortLeaves = dataItem[field] || [];\r\nif (!Array.isArray(shortLeaves) || shortLeaves.length === 0) {\r\n return '0%';\r\n}\r\nreturn '-';\r\n}\r\nreturn '0';\r\n}\r\ngetFormattedCellValue(row: any, col: any): any {\r\n const value = this.getNestedValue(row, col.field);\r\n if (col.field === 'clock_in_time' || col.field === 'clock_out_time') {\r\n if (value) {\r\n return this.formatTime(value);\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n\r\n\r\nenableDetailEditss(row: any, dataItem: any, col: any, breakItem?: any) {\r\n this.hideCustomTooltip();\r\n\r\n // Special case for breaks / short_breaks\r\n if (col.field === 'breaks' || col.field === 'short_breaks') {\r\n this.currentTooltipData = breakItem || dataItem[col.field];\r\n this.currentTooltipField = 'single_break';\r\n this.enableTooltipEdit(); // reuse tooltip editor\r\n return;\r\n }\r\n\r\n // default editing (strings, numbers, etc.)\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n\r\n setTimeout(() => {\r\n const input = document.querySelector(`input[data-edit-key=\"${key}\"]`) as HTMLInputElement;\r\n if (input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }, 0);\r\n}\r\n\r\n\r\ndisableDetailEditss(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\nisDetailEditings(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCells(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\n\r\n\r\nshowCustomTooltip(event: MouseEvent, dataItem: any, field: string) {\r\n if (this.tooltipEditing) return; // don't override while editing\r\n this.currentTooltipData = dataItem;\r\n this.currentTooltipField = field;\r\n this.tooltipPosition = {\r\n x: event.clientX + 15,\r\n y: event.clientY + 15\r\n };\r\n this.tooltipVisible = true;\r\n}\r\n\r\n\r\n\r\nprivate currentTooltip: HTMLElement | null = null;\r\n\r\ngetEmployeeNameTitle(row: any): string {\r\n let title = row?.User?.full_name || row?.full_name || row?.name || 'N/A';\r\n if (row.manually_logs && row.manually_logs.length > 0) {\r\n title += '\\n\\nManual Logs:';\r\n row.manually_logs.forEach((log: any, index: number) => {\r\n const clockIn = log.clock_in?.time ? new Date(log.clock_in.time).toLocaleTimeString() : 'N/A';\r\n const status = log.clock_in?.status || 'N/A';\r\n title += `\\n${index + 1}. Clock In: ${clockIn} (${status})`;\r\n });\r\n }\r\n return title;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nminuteOptions = Array.from({ length: 60 }, (_, i) => i); // 0–59\r\n\r\n\r\ntooltipMinutes: number = 0;\r\nformattedDuration: string = '0m';\r\n\r\nenableTooltipEdit() {\r\n this.tooltipEditing = true;\r\n this.tooltipMinutes = this.currentTooltipData.duration || 0;\r\n this.updateFormattedDuration();\r\n}\r\n\r\nupdateFormattedDuration() {\r\n const total = this.tooltipMinutes || 0;\r\n const hours = Math.floor(total / 60);\r\n const minutes = total % 60;\r\n\r\n if (hours > 0) {\r\n this.formattedDuration = `${hours}h ${minutes}m`;\r\n } else {\r\n this.formattedDuration = `${minutes}m`;\r\n }\r\n}\r\n\r\nsaveTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.currentTooltipData.duration = this.tooltipMinutes;\r\n\r\n const sendObj = {\r\n data: {\r\n ...this.currentTooltipData,\r\n rowId: this.currentTooltipData?.rowId,\r\n field: this.currentTooltipField\r\n },\r\n eventType: 'onTooltipEdit'\r\n };\r\n\r\n this.genericEvent.emit(sendObj);\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\ncancelTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\nshowRestrictionTooltip(event: MouseEvent, parentRow: any, dataItem: any) {\r\n if (!parentRow.attendance_log_detail?.length) {\r\n return;\r\n }\r\n\r\n this.currentRestrictionLogs = [...parentRow.attendance_log_detail];\r\n this.restrictionTooltipPosition = {\r\n x: event.clientX - 160,\r\n y: event.clientY - 150\r\n };\r\n this.restrictionTooltipVisible = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// Add these for delayed hide\r\nprivate customTooltipHideTimeout: any = null;\r\nprivate restrictionTooltipHideTimeout: any = null;\r\nprivate manualLogsTooltipHideTimeout: any = null;\r\n\r\nshowManualLogsModal: boolean = false;\r\nshowManualLogsTooltipModal: boolean = false;\r\nselectedManualLogs: any[] = [];\r\nselectedManualLogsRow: any = null;\r\nhideTooltipTimeout: any = null;\r\n\r\nopenManualLogsModal(event: MouseEvent, parentRow: any) {\r\n if (!parentRow.manually_logs?.length) {\r\n return;\r\n }\r\n this.selectedManualLogs = parentRow.manually_logs;\r\n this.selectedManualLogsRow = parentRow;\r\n this.manualLogsTooltipPosition = { x: event.clientX - 100, y: event.clientY };\r\n this.manualLogsMoused = true;\r\n this.showManualLogsTooltipModal = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nshowManualLogsTooltip(event: MouseEvent, row: any, d: any) {\r\n if (d?.manually_logs?.length > 0) {\r\n this.selectedManualLogs = d?.manually_logs;\r\n this.selectedManualLogsRow = row;\r\n this.manualLogsTooltipPosition = { x: event.clientX - 400, y: event.clientY };\r\n this.manualLogsMoused = true;\r\n this.showManualLogsTooltipModal = true;\r\n }\r\n}\r\n\r\nhideManualLogsTooltip() {\r\n this.manualLogsMoused = false;\r\n setTimeout(() => {\r\n if (!this.manualLogsMoused) {\r\n this.showManualLogsTooltipModal = false;\r\n this.selectedManualLogs = [];\r\n this.selectedManualLogsRow = null;\r\n }\r\n }, 500);\r\n}\r\n\r\n// Removed hover out functionality - modal stays open until manually closed\r\n\r\n\r\n\r\n\r\nhideRestrictionTooltip() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n }\r\n this.restrictionTooltipHideTimeout = setTimeout(() => {\r\n this.restrictionTooltipVisible = false;\r\n this.currentRestrictionLogs = [];\r\n this.cdr.detectChanges();\r\n }, 200);\r\n}\r\n\r\ncloseManualLogsModal() {\r\n this.showManualLogsModal = false;\r\n this.currentManualLogsRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\npreventRestrictionTooltipHide() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n this.restrictionTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\npreventManualLogsModalHide() {\r\n // Prevent modal from closing when clicking inside\r\n}\r\nhideCustomTooltip() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n }\r\n this.customTooltipHideTimeout = setTimeout(() => {\r\n this.tooltipVisible = false;\r\n this.currentTooltipData = null;\r\n this.currentTooltipField = null;\r\n this.cdr.detectChanges();\r\n }, 200); // 200ms delay\r\n}\r\n\r\npreventCustomTooltipHide() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n this.customTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\n\r\nrestrictionTooltipVisible = false;\r\nrestrictionTooltipPosition = { x: 0, y: 0 };\r\ncurrentRestrictionLogs: any[] = [];\r\n\r\ncurrentManualLogsRow: any = null;\r\n\r\n\r\n\r\n\r\n// New properties for detail column menu\r\n// activeDetailCol: any = null;\r\n// activeDetailRow: any = null;\r\nisDetailMenueHidden = false;\r\n\r\n// Detail column menu methods\r\nopenDetailThreeDotsMenus(event: MouseEvent, col: any, row: any) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.isDetailMenueHidden = true;\r\n this.activeDetailCol = col;\r\n this.activeDetailRow = row;\r\n\r\n setTimeout(() => {\r\n const element = document.querySelector('.detail-column-menu') as HTMLElement | null;\r\n const target = event.currentTarget as HTMLElement | null;\r\n\r\n if (element && target) {\r\n const rect = target.getBoundingClientRect(); // ✅ no error now\r\n element.style.left = `${rect.left}px`;\r\n element.style.top = `${rect.bottom}px`;\r\n }\r\n\r\n this.isDetailMenueHidden = false;\r\n this.cdr.detectChanges();\r\n }, 0);\r\n}\r\n\r\n\r\n// Detail sorting methods\r\nsortDetailAsc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'asc';\r\n this.sortDetailData(row, col.field, 'asc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nsortDetailDesc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'desc';\r\n this.sortDetailData(row, col.field, 'desc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailSort(col: any, row: any) {\r\n col.sortOrder = null;\r\n // Reset to original order - you might need to store original order\r\n if (row.details.originalData) {\r\n row.details.data = [...row.details.originalData];\r\n }\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate sortDetailData(row: any, field: string, order: 'asc' | 'desc') {\r\n if (!row.details?.data) return;\r\n\r\n row.details.data.sort((a: any, b: any) => {\r\n const aValue = this.getNestedValue(a, field);\r\n const bValue = this.getNestedValue(b, field);\r\n\r\n if (order === 'asc') {\r\n return aValue < bValue ? -1 : aValue > bValue ? 1 : 0;\r\n } else {\r\n return aValue > bValue ? -1 : aValue < bValue ? 1 : 0;\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail pinning methods\r\nupdateDetailColumnPin(col: any, row: any, pinned: 'left' | 'right' | null) {\r\n col.pinned = pinned;\r\n this.reorderDetailColumns(row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate reorderDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const leftPinned = row.details.columns.filter((col: any) => col.pinned === 'left');\r\n const rightPinned = row.details.columns.filter((col: any) => col.pinned === 'right');\r\n const centerColumns = row.details.columns.filter((col: any) => !col.pinned);\r\n\r\n row.details.columns = [...leftPinned, ...centerColumns, ...rightPinned];\r\n}\r\n\r\n// Detail autosize methods\r\nautosizeDetailColumn(col: any, row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((c: any) => c.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.floor(containerWidth / visibleColumns.length);\r\n\r\n col.width = Math.max(equalWidth, 80);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nautosizeAllDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((col: any) => col.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.max(Math.floor(containerWidth / visibleColumns.length), 80);\r\n\r\n visibleColumns.forEach((col: any) => {\r\n col.width = equalWidth;\r\n });\r\n\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail column visibility methods\r\nchooseDetailColumns(row: any) {\r\n // Implement choose columns modal for detail table\r\n console.log('Choose detail columns for row:', row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailColumns(row: any) {\r\n if (row.details.originalColumns) {\r\n row.details.columns = JSON.parse(JSON.stringify(row.details.originalColumns));\r\n } else {\r\n // If originalColumns not set, initialize it from current columns\r\n // This prevents falling back to parent table columns\r\n if (!row.details.originalColumns) {\r\n row.details.originalColumns = JSON.parse(JSON.stringify(row.details.columns));\r\n }\r\n // Reset to the original detail columns\r\n row.details.columns = JSON.parse(JSON.stringify(row.details.originalColumns));\r\n }\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nshowDetailColumnPanel = false;\r\ncurrentDetailRowForColumnSelection: any = null;\r\n\r\n\r\nopenDetailChooseColumns(row: any) {\r\n this.currentDetailRowForColumnSelection = row;\r\n this.showDetailColumnPanel = true;\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\ncloseDetailColumnPanel() {\r\n this.showDetailColumnPanel = false;\r\n this.currentDetailRowForColumnSelection = null;\r\n}\r\n\r\ntoggleDetailColumnVisibility(column: any, isVisible: boolean) {\r\n if (!this.currentDetailRowForColumnSelection?.details?.columns) return;\r\n\r\n const col = this.currentDetailRowForColumnSelection.details.columns.find(\r\n (c: any) => c.field === column.field\r\n );\r\n if (col) {\r\n col.is_visible = isVisible;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n\r\nallDetailColumnsSelected(): boolean {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n return cols.every((col: any) => col.is_visible !== false);\r\n}\r\n\r\n// resetDetailColumnsInModal() {\r\n// if (!this.currentDetailRowForColumnSelection?.details?.originalColumns) {\r\n// console.warn('Original detail columns not found');\r\n// return;\r\n// }\r\n// this.currentDetailRowForColumnSelection.details.columns =\r\n// JSON.parse(JSON.stringify(this.currentDetailRowForColumnSelection.details.originalColumns));\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\ntoggleAllDetailColumnsVisibility() {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n const allVisible = this.allDetailColumnsSelected();\r\n cols.forEach((col: any) => col.is_visible = !allVisible);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ngroupByDetailColumn(col: any, row: any) {\r\n if (!col || !row?.details) return;\r\n\r\n // Initialize groupedColumns for detail if not exists\r\n if (!row.details.groupedColumns) {\r\n row.details.groupedColumns = [];\r\n }\r\n\r\n // Avoid duplicate grouping\r\n const exists = row.details.groupedColumns.some((g: any) => g.field === col.field);\r\n if (exists) return;\r\n\r\n // Mark column as grouped\r\n col.isRowGrouped = true;\r\n row.details.groupedColumns.push({ ...col });\r\n\r\n // Perform grouping on detail data\r\n this.groupDetailData(row);\r\n}\r\n\r\ngroupDetailData(row: any) {\r\n const fields = row.details.groupedColumns.map((col: any) => col.field);\r\n const originalData = row.details.originalData || row.details.data;\r\n row.details.data = this.groupData(originalData, fields);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nungroupDetailColumn(col: any, row: any) {\r\n const index = row.details.groupedColumns.findIndex((g: any) => g.field === col.field);\r\n if (index !== -1) {\r\n row.details.groupedColumns.splice(index, 1);\r\n }\r\n\r\n // Find and unmark in columns\r\n const detailCol = row.details.columns.find((c: any) => c.field === col.field);\r\n if (detailCol) detailCol.isRowGrouped = false;\r\n\r\n // Use originalData if exists, else fallback to current data\r\n const sourceData = row.details.originalData || row.details.data;\r\n row.details.data = JSON.parse(JSON.stringify(sourceData));\r\n\r\n // Re-apply remaining groups (if any)\r\n if (row.details.groupedColumns.length > 0) {\r\n this.groupDetailData(row);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// const sm = row.details.sideMenu || (row.details.sideMenu = { visible: true, currentTab: null });\r\n// if (sm.currentTab === tab) {\r\n// sm.visible = !sm.visible;\r\n// } else {\r\n// sm.currentTab = tab;\r\n// sm.visible = true;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// // Optional: emit event or re-render\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// applyDetailRowFilter(row: any) {\r\n// // if (!row.details.originalData) {\r\n// // row.details.originalData = [...row.details.data];\r\n// // }\r\n// // const filters = row.details.filters || {};\r\n// // row.details.data = row.details.originalData.filter(item: => {\r\n// // return Object.keys(filters).every(field => {\r\n// // const term = (filters[field] || '').toLowerCase();\r\n// // if (!term) return true;\r\n// // const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// // return value.includes(term);\r\n// // });\r\n// // });\r\n// }\r\n\r\n\r\n// Initialize side menu when expanding\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand && !row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// // Ensure sideMenu object exists\r\n// if (!row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// // Optional: preserve original data for filtering\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n\r\n// const sm = row.details.sideMenu;\r\n// if (sm.currentTab === tab) {\r\n// sm.currentTab = null; // close panel\r\n// } else {\r\n// sm.currentTab = tab; // open selected tab\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Column visibility change handler\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// // Apply filter to detail data\r\n// applyDetailRowFilter(row: any) {\r\n// const filters = row.details.filters || {};\r\n// row.details.data = row.details.originalData.filter((item: any) => {\r\n// return Object.keys(filters).every(field => {\r\n// const term = (filters[field] || '').toLowerCase();\r\n// if (!term) return true;\r\n// const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// return value.includes(term);\r\n// });\r\n// });\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n\r\n// Initialize detail row + side menu\r\ntoggleExpand(row: any) {\r\n if (row.details) {\r\n // Always ensure originalColumns is set when details exist\r\n if (!row.details.originalColumns) {\r\n row.details.originalColumns = JSON.parse(JSON.stringify(row.details.columns));\r\n }\r\n\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n if (row.isDetailsExpand) {\r\n // ✅ Initialize filters & visibility\r\n if (!row.details.filters) row.details.filters = {};\r\n if (!row.details.originalData) {\r\n row.details.originalData = [...row.details.data];\r\n }\r\n row.details.columns.forEach((col: any) => {\r\n if (col.is_visible === undefined) col.is_visible = true;\r\n });\r\n // ✅ Initialize sideMenu if not exists\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = {\r\n currentTab: null,\r\n columnSearch: ''\r\n };\r\n }\r\n }\r\n } else {\r\n row.isExpand = !row.isExpand;\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\ntoggleDetailSideMenu(row: any, tab: 'cols') { // remove 'filtrs'\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = { currentTab: null, columnSearch: '' };\r\n }\r\n const sm = row.details.sideMenu;\r\n sm.currentTab = sm.currentTab === tab ? null : tab;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Column visibility change\r\nonDetailColumnVisibilityChange(row: any) {\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Apply filter to detail data\r\napplyDetailRowFilter(row: any) {\r\n const filters = row.details.filters || {};\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n return Object.keys(filters).every(field => {\r\n const config = filters[field] || {};\r\n const term = config.value;\r\n if (!term) return true;\r\n const rawValue = this.getNestedValue(item, field);\r\n const condition = config.condition || 'contain';\r\n\r\n // Find the column to check its type\r\n const col = row.details.columns.find((c: any) => c.field === field);\r\n const isDateTime = col && (col.type === 'date' || col.type === 'time');\r\n\r\n if (isDateTime) {\r\n // Handle date/time comparisons\r\n const value = new Date(rawValue);\r\n const filterValue = new Date(term);\r\n if (isNaN(value.getTime()) || isNaN(filterValue.getTime())) return false;\r\n\r\n switch (condition) {\r\n case 'equal': return value.getTime() === filterValue.getTime();\r\n case 'not_equal': return value.getTime() !== filterValue.getTime();\r\n case 'after': return value.getTime() > filterValue.getTime();\r\n case 'before': return value.getTime() < filterValue.getTime();\r\n default: return false;\r\n }\r\n } else {\r\n // Handle text comparisons\r\n const value = String(rawValue || '').toLowerCase();\r\n const filterTerm = String(term).toLowerCase();\r\n switch (condition) {\r\n case 'equal': return value === filterTerm;\r\n case 'not_equal': return value !== filterTerm;\r\n case 'start': return value.startsWith(filterTerm);\r\n case 'end': return value.endsWith(filterTerm);\r\n case 'after': return value > filterTerm;\r\n case 'before': return value < filterTerm;\r\n default: return value.includes(filterTerm);\r\n }\r\n }\r\n });\r\n });\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Apply all side menu filters\r\napplySideMenuFilters() {\r\n // Emit the current filtersConfig to apply all filters\r\n this.filterOptions.emit(this.filtersConfig);\r\n this.cdr.markForCheck();\r\n}\r\n\r\n// Reset all side menu filters\r\nresetSideMenuFilters() {\r\n // Clear all filters in filtersConfig\r\n this.filtersConfig = [];\r\n this.filterOptions.emit(this.filtersConfig);\r\n // Emit filter cleared event with true only if preset is selected\r\n this.filterCleared.emit(this.tableFilterViewId ? true : false);\r\n this.cdr.markForCheck();\r\n}\r\n\r\n\r\n\r\n\r\nonResizeDetailColumn(event: MouseEvent, row: any, col: any): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n const initialWidth = col.width || 150;\r\n\r\n // Find all matching header and data cells in this detail table\r\n const headerCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] th[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n const dataCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] td[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n\r\n const allCells = [...headerCells, ...dataCells];\r\n\r\n // Optional: highlight during resize\r\n allCells.forEach(el => el.classList.add('resizing-highlight'));\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const deltaX = moveEvent.clientX - startX;\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 80) newWidth = 80; // min width\r\n\r\n // Apply to DOM\r\n allCells.forEach(el => {\r\n el.style.width = `${newWidth}px`;\r\n el.style.minWidth = `${newWidth}px`;\r\n });\r\n\r\n // Update model\r\n col.width = newWidth;\r\n };\r\n\r\n const onMouseUp = () => {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n allCells.forEach(el => el.classList.remove('resizing-highlight'));\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n}\r\n\r\n// In your component\r\ngetDetailViewportHeight(row: any): number {\r\n const rowCount = row.details?.data?.length || 0;\r\n const rowHeight = this.nestedTablerowHeight || 40;\r\n const maxHeight = 350;\r\n return Math.min(rowCount * rowHeight, maxHeight);\r\n}\r\n\r\nprivate getAccordionRowHeight(row: any): number {\r\n if (!row.isDetailsExpand) {\r\n return this.rowHeight;\r\n }\r\n\r\n // For expanded rows, measure the actual rendered height\r\n // Use requestAnimationFrame to ensure DOM is updated\r\n const rowId = row._id || row.id;\r\n const accordionElement = document.querySelector(`[data-row-id=\"${rowId}\"] .accordion-details`) as HTMLElement;\r\n\r\n if (accordionElement) {\r\n // Get the actual rendered height including padding and borders\r\n const computedHeight = accordionElement.offsetHeight;\r\n if (computedHeight > 0) {\r\n // Add some buffer for consistency\r\n return this.rowHeight + computedHeight + 10;\r\n }\r\n }\r\n\r\n // Fallback calculation if element not found or not rendered yet\r\n const headerHeight = this.nestedTableHeaderRowHeight || 40;\r\n const detailRowCount = row.details?.data?.length || 0;\r\n const detailRowHeight = this.nestedTablerowHeight || 36;\r\n const detailHeight = detailRowCount * detailRowHeight;\r\n const maxDetailHeight = 350; // Same as CSS max-height\r\n const actualDetailHeight = Math.min(detailHeight, maxDetailHeight);\r\n\r\n // Add padding and borders\r\n const padding = 20;\r\n\r\n return this.rowHeight + headerHeight + actualDetailHeight + padding;\r\n}\r\n\r\n\r\n\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = target.scrollTop;\r\n// if (right) right.scrollTop = target.scrollTop;\r\n// }\r\n\r\nonDetailLeftScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (right) right.scrollTop = target.scrollTop;\r\n}\r\n\r\nonDetailRightScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (left) left.scrollTop = target.scrollTop;\r\n}\r\n\r\n\r\n\r\n\r\n// NEW: Sync vertical scroll from body → header (so header moves down with data)\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n\r\n// // Sync vertical scroll to left/right sections\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = scrollTop;\r\n// if (right) right.scrollTop = scrollTop;\r\n\r\n// // ✅ Sync vertical scroll to HEADER (so it scrolls down with data)\r\n// const headerTable = document.querySelector(`.accordion-center-section table[style*=\"table-layout\"]`) as HTMLElement;\r\n// if (headerTable) {\r\n// headerTable.scrollTop = scrollTop;\r\n// }\r\n// }\r\n\r\n// Optional: Handle header scroll (rarely needed, but safe)\r\n// onDetailHeaderScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n// const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (viewport) viewport.scrollTop = scrollTop;\r\n// }\r\n\r\n\r\n// Sync: Body scroll → Header scroll (vertical)\r\nonDetailCenterScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n // Sync vertical scroll to LEFT/RIGHT sections\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (left) left.scrollTop = scrollTop;\r\n if (right) right.scrollTop = scrollTop;\r\n\r\n // ✅ NEW: Sync vertical scroll to HEADER\r\n const headerScrollContainer = document.querySelector(`.detail-header-scroll-container[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (headerScrollContainer) {\r\n headerScrollContainer.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Sync: Header scroll → Body scroll (in case user scrolls header manually)\r\nonDetailHeaderScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) {\r\n viewport.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n@ViewChild('headerContainer', { static: false }) headerContainer: ElementRef<HTMLDivElement> | null = null;\r\n@ViewChild('dataContainer', { static: false }) dataContainer!: CdkVirtualScrollViewport;\r\n\r\nsyncScroll(event: Event) {\r\n if (!this.headerContainer || !this.dataContainer) return;\r\n\r\n const target = event.target as HTMLElement;\r\n const dataEl = this.dataContainer.elementRef.nativeElement as HTMLElement;\r\n const headerEl = this.headerContainer.nativeElement;\r\n\r\n if (target === headerEl) {\r\n dataEl.scrollLeft = headerEl.scrollLeft;\r\n } else if (target === dataEl) {\r\n headerEl.scrollLeft = dataEl.scrollLeft;\r\n }\r\n }\r\n\r\n\r\n // @ViewChild('dataContainer') dataContainer!: CdkVirtualScrollViewport;\r\n@ViewChild('leftContainer') leftContainer!: ElementRef<HTMLDivElement>;\r\n@ViewChild('rightContainer') rightContainer!: ElementRef<HTMLDivElement>;\r\n\r\nsyncVerticalScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n if (this.leftContainer) {\r\n this.leftContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n if (this.rightContainer) {\r\n this.rightContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Map: detailRowId → selection state\r\n// detailSelectionState = new Map<string, {\r\n// selectedCells: CellPosition[];\r\n// selectedKeys: Set<string>;\r\n// rowSelectedIndexes: Set<number>;\r\n// undoStack: any[][];\r\n// redoStack: any[][];\r\n// }>();\r\n\r\nprivate getDetailRowId(row: any): string {\r\n return row._id || row.id;\r\n}\r\n\r\n\r\nstartDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n event.preventDefault();\r\n this.isDetailDragging = false;\r\n\r\n this.clearOtherDetailSections(detailRow, section);\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n state.selectedCells = [{ rowIndex, colIndex: globalColIndex, subColIndex: 0, field, key }];\r\n state.selectedKeys.clear();\r\n state.selectedKeys.add(key);\r\n\r\n const mouseMove = () => {\r\n this.isDetailDragging = true;\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mousemove', mouseMove);\r\n\r\n const mouseUp = () => {\r\n document.removeEventListener('mouseup', mouseUp);\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mouseup', mouseUp);\r\n}\r\n\r\n\r\nextendDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n if (!this.isDetailDragging) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const start = state.selectedCells[0];\r\n const minRow = Math.min(start.rowIndex, rowIndex);\r\n const maxRow = Math.max(start.rowIndex, rowIndex);\r\n const minCol = Math.min(start.colIndex, globalColIndex);\r\n const maxCol = Math.max(start.colIndex, globalColIndex);\r\n\r\n const newKeys = new Set<string>();\r\n const newCells: CellPosition[] = [];\r\n\r\n // Use FULL columns, but filter by section visibility\r\n const allColumns = detailRow.details.columns;\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const col = allColumns[c];\r\n if (!col) continue;\r\n\r\n // Check if this column belongs to the current section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (inSection && col.is_visible !== false) {\r\n const k = `${r}-${c}-${col.field}`;\r\n newKeys.add(k);\r\n newCells.push({\r\n rowIndex: r,\r\n colIndex: c, // ✅ Keep global index\r\n subColIndex: 0,\r\n field: col.field,\r\n key: k\r\n });\r\n }\r\n }\r\n }\r\n\r\n state.selectedKeys = newKeys;\r\n state.selectedCells = newCells;\r\n}\r\n\r\nprivate getSectionColumns(row: any, section: 'left' | 'center' | 'right') {\r\n if (section === 'left') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'left');\r\n } else if (section === 'right') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'right');\r\n } else {\r\n return row.details.columns.filter((col: any) => !col.pinned);\r\n }\r\n}\r\n\r\nisDetailCellSelected(detailRow: any, rowIndex: number, globalColIndex: number, field: string, section: 'left' | 'center' | 'right'): boolean {\r\n const col = detailRow.details.columns[globalColIndex];\r\n if (!col) return false;\r\n\r\n // Verify column belongs to section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (!inSection || col.is_visible === false) return false;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n return state.selectedKeys.has(key);\r\n}\r\n\r\n\r\ngetSelectedDetailData(detailRow: any, section: 'left' | 'center' | 'right'): any[][] {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return [];\r\n\r\n const dataMap = new Map<number, any[]>();\r\n for (const cell of state.selectedCells) {\r\n if (!dataMap.has(cell.rowIndex)) {\r\n dataMap.set(cell.rowIndex, []);\r\n }\r\n const value = this.getNestedValue(detailRow.details.data[cell.rowIndex], cell.field);\r\n\r\n // Find LOCAL index in section for paste alignment\r\n const allColumns = detailRow.details.columns;\r\n let localIndex = 0;\r\n for (let i = 0; i < cell.colIndex; i++) {\r\n const col = allColumns[i];\r\n if (!col) continue;\r\n let inSection = false;\r\n if (section === 'left') inSection = col.pinned === 'left';\r\n else if (section === 'right') inSection = col.pinned === 'right';\r\n else inSection = !col.pinned;\r\n\r\n if (inSection && col.is_visible !== false) {\r\n localIndex++;\r\n }\r\n }\r\n dataMap.get(cell.rowIndex)![localIndex] = value ?? '';\r\n }\r\n\r\n return Array.from(dataMap.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(entry => entry[1]);\r\n}\r\n\r\n\r\nprivate isAnyDetailFocused(): boolean {\r\n return !!document.querySelector('.detail-virtual-scroll .selected-cell');\r\n}\r\n\r\nprivate handleDetailShortcuts(event: KeyboardEvent, detailRow: any, section: 'left' | 'center' | 'right') {\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n this.performDetailCut(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'v') {\r\n event.preventDefault();\r\n this.performDetailPaste(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\r\n event.preventDefault();\r\n this.detailUndo(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.detailRedo(detailRow, section);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\nperformDetailCut(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n state.redoStack = [];\r\n\r\n for (const cell of state.selectedCells) {\r\n const dataRow = detailRow.details.data[cell.rowIndex];\r\n this.setNestedValue(dataRow, { field: cell.field }, null, false);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\nasync performDetailPaste(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const text = await navigator.clipboard.readText();\r\n if (!text) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const startCell = state.selectedCells[0];\r\n const rows = text.split('\\n').map(r => r.split('\\t'));\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n const rIdx = startCell.rowIndex + i;\r\n if (rIdx >= detailRow.details.data.length) break;\r\n const dataRow = detailRow.details.data[rIdx];\r\n for (let j = 0; j < rows[i].length; j++) {\r\n const cIdx = startCell.colIndex + j;\r\n const columns = this.getSectionColumns(detailRow, section);\r\n if (cIdx >= columns.length) break;\r\n const col = columns[cIdx];\r\n if (col?.is_visible !== false) {\r\n this.setNestedValue(dataRow, { field: col.field }, rows[i][j], false);\r\n }\r\n }\r\n }\r\n\r\n // ✅ Fix breaks/short_breaks after paste\r\n detailRow.details.data.forEach((row: any) => {\r\n if (!Array.isArray(row.breaks)) row.breaks = [];\r\n if (row.short_breaks && typeof row.short_breaks === 'string') {\r\n row.short_breaks = { duration: 0, type: 'none' };\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\ndetailUndo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.undoStack.length === 0) return;\r\n\r\n state.redoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.undoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndetailRedo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.redoStack.length === 0) return;\r\n\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.redoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate isDetailDragging = false;\r\n\r\n\r\n// Map: detailRowId → section → selection state\r\n// Map: detailRowId → section → selection state\r\ndetailSelectionState = new Map<string, Map<string, {\r\n selectedCells: CellPosition[];\r\n selectedKeys: Set<string>;\r\n undoStack: any[][];\r\n redoStack: any[][];\r\n}>>();\r\n\r\nprivate getDetailSelectionState(row: any, section: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(row);\r\n let rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) {\r\n rowMap = new Map();\r\n this.detailSelectionState.set(rowId, rowMap);\r\n }\r\n let state = rowMap.get(section);\r\n if (!state) {\r\n state = {\r\n selectedCells: [],\r\n selectedKeys: new Set(),\r\n undoStack: [],\r\n redoStack: []\r\n };\r\n rowMap.set(section, state);\r\n }\r\n return state;\r\n}\r\n\r\n\r\nprivate findFocusedDetailRowAndSection(): { row: any; section: 'left' | 'center' | 'right' } | null {\r\n const left = document.querySelector('.accordion-left-section .selected-cell');\r\n const center = document.querySelector('.detail-virtual-scroll .selected-cell');\r\n const right = document.querySelector('.accordion-right-section .selected-cell');\r\n\r\n const getRow = (el: Element | null) => {\r\n if (!el) return null;\r\n const rowId = el.closest('[data-detail-row-id]')?.getAttribute('data-detail-row-id');\r\n return this.visibleRows.find((r: any) => (r._id || r.id) === rowId);\r\n };\r\n\r\n if (left) return { row: getRow(left), section: 'left' };\r\n if (center) return { row: getRow(center), section: 'center' };\r\n if (right) return { row: getRow(right), section: 'right' };\r\n return null;\r\n}\r\n\r\nprivate clearOtherDetailSections(currentRow: any, currentSection: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(currentRow);\r\n const rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) return;\r\n\r\n // Clear the two sections that are NOT currentSection\r\n const sections: ('left' | 'center' | 'right')[] = ['left', 'center', 'right'];\r\n for (const section of sections) {\r\n if (section !== currentSection) {\r\n const state = rowMap.get(section);\r\n if (state) {\r\n state.selectedCells = [];\r\n state.selectedKeys.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Getter to check if any accordion is open\r\nget hasOpenAccordion(): boolean {\r\n return this.dataSet.some(row => row.isDetailsExpand);\r\n}\r\n\r\nprivate hasAccordionStateChanged(): boolean {\r\n const currentExpandedRows = new Set(this.dataSet.filter(row => row.isDetailsExpand).map(row => row._id || row.id));\r\n const previousExpandedRows = this.expandedRows;\r\n\r\n if (currentExpandedRows.size !== previousExpandedRows.size) {\r\n this.expandedRows = currentExpandedRows;\r\n return true;\r\n }\r\n\r\n for (const id of currentExpandedRows) {\r\n if (!previousExpandedRows.has(id)) {\r\n this.expandedRows = currentExpandedRows;\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// getFirstTwoWords(name: string): string {\r\n// if (!name) return '';\r\n// const words = name.trim().split(/\\s+/);\r\n// return words.slice(0, 2).join(' ').toUpperCase();\r\n// }\r\n\r\nselectRange(range: Date[], drp: BsDaterangepickerDirective) {\r\n // Prevent future dates\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 999); // End of today\r\n if (range[0] > today || range[1] > today) {\r\n // Reset to current date range\r\n this.bsRangeValue = [new Date(), new Date()];\r\n return;\r\n }\r\n\r\n this.bsRangeValue = range;\r\n this.isDefaultDateRange = false; // User has selected a range, no longer default\r\n // Auto-apply when selecting from predefined ranges\r\n // Determine if it's a single day selection for predefined ranges\r\n const isSingleDaySelected = range.length === 2 &&\r\n range[0] && range[1] &&\r\n range[0].getTime() === range[1].getTime();\r\n\r\n // Emit event with selected range and single day flag\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: range,\r\n isSingleDay: isSingleDaySelected\r\n }\r\n };\r\n console.log('Predefined Range Selected Event:', eventData);\r\n this.genericEvent.emit(eventData);\r\n\r\n drp.hide();\r\n}\r\n\r\n onClear(drp: BsDaterangepickerDirective) {\r\n const currentViewDate = this.bsRangeValue; // Capture current view date\r\n this.bsRangeValue = [];\r\n const event = {\r\n eventType: 'clearDateRange',\r\n data: { dateRange: currentViewDate, applied: this.dataSet }\r\n };\r\n this.genericEvent.emit(event); // Emit event to trigger listing data update API call\r\n drp.hide();\r\n }\r\n\r\n onApply(drp: BsDaterangepickerDirective) {\r\n // Prevent future dates\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 999); // End of today\r\n if (this.bsRangeValue[0] > today || this.bsRangeValue[1] > today) {\r\n // Reset to current date range\r\n this.bsRangeValue = [new Date(), new Date()];\r\n return;\r\n }\r\n\r\n this.isDefaultDateRange = false; // User has applied a range, no longer default\r\n // Determine if it's a single day selection\r\n const isSingleDaySelected = this.bsRangeValue.length === 2 &&\r\n this.bsRangeValue[0] && this.bsRangeValue[1] &&\r\n this.bsRangeValue[0].getTime() === this.bsRangeValue[1].getTime();\r\n\r\n // Emit event with selected range and single day flag\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: this.bsRangeValue,\r\n isSingleDay: isSingleDaySelected\r\n }\r\n };\r\n console.log('Date Range Selected Event:', eventData);\r\n this.genericEvent.emit(eventData);\r\n\r\n drp.hide();\r\n }\r\n\r\n\r\n\r\n\r\n\r\n // @Output() genericEvent = new EventEmitter<any>();\r\n bsRangeValue: Date[] = []; // Empty by default\r\n isDefaultDateRange: boolean = true; // Track if current range is default\r\n showPicker = false;\r\n bsConfig: Partial<BsDaterangepickerConfig> = {\r\n adaptivePosition: true,\r\n rangeInputFormat: 'DD/MM/YYYY',\r\n showWeekNumbers: false,\r\n containerClass: 'theme-default',\r\n ranges: this.getCustomRanges(), // Updated with new range\r\n showClearButton: true, // Attempts to show clear (using external button)\r\n returnFocusToInput: true,\r\n displayMonths: 2, // Show two months\r\n maxDate: new Date() // Prevent selecting future dates\r\n };\r\n\r\n // Define custom ranges including new \"Last 30 Days\"\r\n private getCustomRanges() {\r\n const startDate = new Date()\r\n const endDate = new Date()\r\n const today = new Date();\r\n const yesterday = new Date(today);\r\n yesterday.setDate(today.getDate() - 1);\r\n\r\n const last7DaysStart = new Date(today);\r\n last7DaysStart.setDate(today.getDate() - 7);\r\n\r\n const last30DaysStart = new Date(today);\r\n last30DaysStart.setDate(today.getDate() - 30);\r\n\r\n const thisMonthStart = new Date(today.getFullYear(), today.getMonth(), 1);\r\n const thisMonthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0);\r\n // Ensure this month doesn't include future dates\r\n if (thisMonthEnd > today) {\r\n thisMonthEnd.setTime(today.getTime());\r\n }\r\n\r\n const lastMonthEnd = new Date(today.getFullYear(), today.getMonth(), 0);\r\n const lastMonthStart = new Date(today.getFullYear(), today.getMonth() - 1, 1);\r\n\r\n const last3MonthsStart = new Date(today);\r\n last3MonthsStart.setMonth(today.getMonth() - 3);\r\n\r\n const thisYearStart = new Date(today.getFullYear(), 0, 1);\r\n const thisYearEnd = new Date(today.getFullYear(), 11, 31);\r\n // Ensure this year doesn't include future dates\r\n if (thisYearEnd > today) {\r\n thisYearEnd.setTime(today.getTime());\r\n }\r\n\r\n return [\r\n {\r\n value: [yesterday, yesterday],\r\n label: 'Yesterday'\r\n },\r\n {\r\n value: [last7DaysStart, yesterday],\r\n label: 'Last 7 Days'\r\n },\r\n {\r\n value: [last30DaysStart, yesterday],\r\n label: 'Last 30 Days'\r\n },\r\n {\r\n value: [thisMonthStart, thisMonthEnd],\r\n label: 'This Month'\r\n },\r\n {\r\n value: [lastMonthStart, lastMonthEnd],\r\n label: 'Last Month'\r\n },\r\n {\r\n value: [last3MonthsStart, yesterday],\r\n label: 'Last 3 Months'\r\n },\r\n {\r\n value: [thisYearStart, thisYearEnd],\r\n label: 'This Year'\r\n },\r\n // {\r\n // value: [startDate, endDate],\r\n // label: 'Apply'\r\n // }\r\n ];\r\n }\r\n\r\n\r\n \r\n\r\n // Handle range change when Apply is clicked\r\n onRangeChange(value: Date[]) {\r\n this.bsRangeValue = value;\r\n const event = {\r\n obj: { dateRange: value || [] },\r\n eventType: 'dateRangeChange'\r\n };\r\n this.genericEvent.emit(event); // Emit event to trigger updates (e.g., filter)\r\n }\r\n\r\n // Clear the selected range\r\n clearDateRange() {\r\n const currentViewDate = this.bsRangeValue; // Capture current view date\r\n // Reset to default date range (current date)\r\n const today = new Date();\r\n this.bsRangeValue = [today, today];\r\n this.isDefaultDateRange = true; // Reset to default\r\n\r\n const event = {\r\n obj: { dateRange: currentViewDate, listingData: this.dataSet },\r\n eventType: 'clearDateRange'\r\n };\r\n this.genericEvent.emit(event); // Emit event to trigger listing data update API call\r\n }\r\n\r\n // Toggle picker\r\n togglePicker(picker: BsDaterangepickerDirective) {\r\n this.showPicker = !this.showPicker;\r\n this.showPicker ? picker.show() : picker.hide();\r\n }\r\n\r\n // Navigate date range\r\n navigateDate(direction: 'left' | 'right') {\r\n if (!this.bsRangeValue || this.bsRangeValue.length !== 2) return;\r\n\r\n const start = new Date(this.bsRangeValue[0]);\r\n const end = new Date(this.bsRangeValue[1]);\r\n const oneDay = 24 * 60 * 60 * 1000; // 1 day in milliseconds\r\n const today = new Date();\r\n today.setHours(23, 59, 59, 999); // End of today\r\n\r\n let newStart: Date;\r\n let newEnd: Date;\r\n\r\n if (direction === 'left') {\r\n newStart = new Date(start.getTime() - oneDay);\r\n newEnd = new Date(end.getTime() - oneDay);\r\n } else {\r\n // Prevent navigating to future dates\r\n newStart = new Date(start.getTime() + oneDay);\r\n newEnd = new Date(end.getTime() + oneDay);\r\n if (newEnd > today) {\r\n return; // Don't navigate to future\r\n }\r\n }\r\n\r\n this.bsRangeValue = [newStart, newEnd];\r\n this.isDefaultDateRange = false;\r\n\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: this.bsRangeValue,\r\n isSingleDay: this.isSingleDay\r\n }\r\n };\r\n this.genericEvent.emit(eventData);\r\n }\r\n\r\n\r\nonRangeSelected(range: (Date | undefined)[] | undefined, picker: BsDaterangepickerDirective) {\r\n\r\nif (!range || range.length !== 2 || !range[0] || !range[1]) {\r\n\r\nreturn;\r\n}\r\n\r\n// Prevent future dates\r\nconst today = new Date();\r\ntoday.setHours(23, 59, 59, 999); // End of today\r\nif (range[0] > today || range[1] > today) {\r\n // Reset to current date range\r\n this.bsRangeValue = [new Date(), new Date()];\r\n return;\r\n}\r\n\r\nthis.isDefaultDateRange = false; // User has selected a range, no longer default\r\nconst isSingleDay = range[0].getTime() === range[1].getTime();\r\nconst eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: [range[0], range[1]],\r\n isSingleDay\r\n }\r\n};\r\nthis.genericEvent.emit(eventData);\r\npicker.hide();\r\n}\r\n\r\n\r\nonMainScroll(event: Event): void {\r\n // Handle main scroll events for drag grouping and calendar functionality\r\n const scrollTop = (event.target as HTMLElement).scrollTop;\r\n this.updateScrollMetrics(scrollTop);\r\n this.scrollSubject.next(scrollTop);\r\n}\r\n\r\nngOnDestroy(): void {\r\n // Complete all reactive streams\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n // Stop cache cleanup interval\r\n this.stopCacheCleanup();\r\n\r\n // Clear tooltip timeouts\r\n if (this.tooltipShowTimeout) {\r\n clearTimeout(this.tooltipShowTimeout);\r\n this.tooltipShowTimeout = null;\r\n }\r\n if (this.tooltipHideTimeout) {\r\n clearTimeout(this.tooltipHideTimeout);\r\n this.tooltipHideTimeout = null;\r\n }\r\n\r\n // Clear all timers and intervals\r\n if (this.fakeScrollRaf) {\r\n cancelAnimationFrame(this.fakeScrollRaf);\r\n }\r\n if (this.mainScrollRaf) {\r\n cancelAnimationFrame(this.mainScrollRaf);\r\n }\r\n if (this.scrollRaf) {\r\n cancelAnimationFrame(this.scrollRaf);\r\n }\r\n if (this.autoScrollInterval) {\r\n cancelAnimationFrame(this.autoScrollInterval);\r\n }\r\n\r\n // Clear timeouts and intervals\r\n this.timeouts.forEach(id => clearTimeout(id));\r\n this.intervals.forEach(id => clearInterval(id));\r\n this.timeouts.clear();\r\n this.intervals.clear();\r\n\r\n // Remove event listeners\r\n this.eventListeners.forEach((listener, key) => {\r\n // Find the element and remove the listener\r\n const element = this.domCache.get(key);\r\n if (element) {\r\n element.removeEventListener('scroll', listener);\r\n }\r\n });\r\n this.eventListeners.clear();\r\n\r\n // Disconnect resize observers\r\n this.resizeObservers.forEach(observer => observer.disconnect());\r\n this.resizeObservers.clear();\r\n\r\n // Disconnect intersection observer\r\n if (this.intersectionObserver) {\r\n this.intersectionObserver.disconnect();\r\n this.intersectionObserver = null;\r\n }\r\n\r\n // Destroy component references\r\n this.componentRefs.forEach(ref => ref.destroy());\r\n this.componentRefs.clear();\r\n\r\n // Clear all maps and sets to prevent memory leaks\r\n this.selectedRows.clear();\r\n this.expandedRows.clear();\r\n this.expandedCells.clear();\r\n this.detailSelectionState.clear();\r\n this.detailAccordionStates.clear();\r\n this.originalDetailValues.clear();\r\n this.cachedElements.clear();\r\n\r\n // Clear advanced DOM caching\r\n this.domQueryCache.clear();\r\n this.domQueryStats.clear();\r\n\r\n // Clear efficient data structures\r\n this.columnIndex.clear();\r\n this.rowIndex = new WeakMap();\r\n this.visibleColumnCache.clear();\r\n this.dataCache.clear();\r\n this.computationCache.clear();\r\n this.domCache.clear();\r\n this.itemHeightCache.clear();\r\n\r\n // Clear undo/redo stacks\r\n this.undoStack.length = 0;\r\n this.redoStack.length = 0;\r\n\r\n // Clear any pending timeouts\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n }\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n }\r\n if (this.manualLogsTooltipHideTimeout) {\r\n clearTimeout(this.manualLogsTooltipHideTimeout);\r\n }\r\n if (this.elementCacheTimeout) {\r\n clearTimeout(this.elementCacheTimeout);\r\n }\r\n\r\n // Clear ResizeObserver if exists\r\n if (this.cellText?.nativeElement) {\r\n const observer = new ResizeObserver(() => {});\r\n observer.disconnect();\r\n }\r\n}\r\n@Input() buttons: {\r\n name: string;\r\n iconPath: string;\r\n is_showIcon: boolean;\r\n has_permission: boolean | (() => boolean);\r\n condition?: string | null;\r\n}[] = [];\r\n@Output() emailClicked = new EventEmitter<void>();\r\n@Output() addAttendanceClicked = new EventEmitter<void>();\r\n// @Output() searchEvent = new EventEmitter<any>();\r\n\r\n// onEmailClick() {\r\n// this.emailClicked.emit();\r\n// }\r\n\r\n// onAddAttendanceClick() {\r\n// this.addAttendanceClicked.emit();\r\n// }\r\n\r\n// @Input() isSingleDay: boolean = false;\r\n@Input() isStartDateNotEqualToEndDate = () => true; // or pass as boolean\r\nonEmailClick() { this.emailClicked.emit(); }\r\nonAddAttendanceClick() { this.addAttendanceClicked.emit(); }\r\nonBackPayClick() { this.backPayClicked.emit(); }\r\nonGrandTotalClick() { this.grandTotalClicked.emit(); }\r\nonPrintClick() { this.printClicked.emit(); }\r\nonExportClick() { this.exportClicked.emit(); }\r\nonExportDailyClick() { this.exportDailyClicked.emit(); }\r\n\r\n@Output() backPayClicked = new EventEmitter<void>();\r\n@Output() grandTotalClicked = new EventEmitter<void>();\r\n@Output() printClicked = new EventEmitter<void>();\r\n@Output() exportClicked = new EventEmitter<void>();\r\n@Output() exportDailyClicked = new EventEmitter<void>();\r\n@Output() deleteClicked = new EventEmitter<void>();\r\n\r\nonDeleteClick() { this.deleteClicked.emit(); }\r\n\r\nonActionButtonClick(name: string) {\r\n switch (name) {\r\n case 'Email':\r\n this.onEmailClick();\r\n break;\r\n case 'Add Attendance':\r\n this.onAddAttendanceClick();\r\n break;\r\n case 'Back Pay':\r\n this.onBackPayClick();\r\n break;\r\n case 'Grand Total':\r\n this.onGrandTotalClick();\r\n break;\r\n case 'Print':\r\n this.onPrintClick();\r\n break;\r\n case 'Export':\r\n this.onExportClick();\r\n break;\r\n case 'Export Daily Timesheet':\r\n this.onExportDailyClick();\r\n break;\r\n }\r\n}\r\n\r\nget areDatesSelectedAndEqual(): boolean {\r\n if (!this.bsRangeValue || this.bsRangeValue.length < 2) {\r\n return false;\r\n }\r\n\r\n const [start, end] = this.bsRangeValue;\r\n\r\n // Check both exist\r\n if (!start || !end) {\r\n return false;\r\n }\r\n\r\n // Compare only date parts (ignore time)\r\n return (\r\n start.getFullYear() === end.getFullYear() &&\r\n start.getMonth() === end.getMonth() &&\r\n start.getDate() === end.getDate()\r\n );\r\n}\r\n\r\nget hasAccordionDetails(): boolean {\r\n return this.dataSet.some(row => row.details?.data?.length > 0);\r\n}\r\n\r\nisArray(value: any): boolean {\r\n return Array.isArray(value);\r\n}\r\n\r\n// Timeline View Methods\r\ngetTimelineHours(): string[] {\r\n const hours = [];\r\n for (let i = 0; i < 24; i++) {\r\n hours.push(`${i.toString().padStart(2, '0')}:00`);\r\n }\r\n return hours;\r\n}\r\n\r\ngetTimePosition(timeString: string): number {\r\n if (!timeString) return 0;\r\n const date = new Date(timeString);\r\n const hours = date.getHours();\r\n const minutes = date.getMinutes();\r\n return ((hours * 60 + minutes) / 1440) * 100; // 1440 minutes in a day\r\n}\r\n\r\ngetWorkDurationWidth(row: any): number {\r\n if (!row.clock_in_time || !row.clock_out_time) return 0;\r\n const start = new Date(row.clock_in_time);\r\n const end = new Date(row.clock_out_time);\r\n const duration = (end.getTime() - start.getTime()) / (1000 * 60); // minutes\r\n return (duration / 1440) * 100;\r\n}\r\n\r\ngetBreakDurationWidth(breakItem: any): number {\r\n if (!breakItem.break_in_time || !breakItem.break_out_time) return 0;\r\n const start = new Date(breakItem.break_in_time);\r\n const end = new Date(breakItem.break_out_time);\r\n const duration = (end.getTime() - start.getTime()) / (1000 * 60); // minutes\r\n return (duration / 1440) * 100;\r\n}\r\n\r\n// Calendar View Methods\r\ngetCurrentMonthYear(): string {\r\n const now = new Date();\r\n return now.toLocaleDateString('en-US', { year: 'numeric', month: 'long' });\r\n}\r\n\r\ngetCalendarWeeks(): any[][] {\r\n const now = new Date();\r\n const firstDay = new Date(now.getFullYear(), now.getMonth(), 1);\r\n const lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0);\r\n const weeks = [];\r\n\r\n let currentWeek = [];\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - firstDay.getDay()); // Start from Sunday\r\n\r\n for (let i = 0; i < 42; i++) { // 6 weeks * 7 days\r\n const day = new Date(startDate);\r\n day.setDate(startDate.getDate() + i);\r\n\r\n currentWeek.push({\r\n date: day.getDate(),\r\n dateObj: day,\r\n isCurrentMonth: day.getMonth() === now.getMonth(),\r\n isToday: day.toDateString() === new Date().toDateString()\r\n });\r\n\r\n if (currentWeek.length === 7) {\r\n weeks.push(currentWeek);\r\n currentWeek = [];\r\n }\r\n }\r\n\r\n return weeks;\r\n}\r\n\r\ngetEntriesForDate(date: Date): any[] {\r\n return this.dataSet.filter(row => {\r\n const rowDate = new Date(row.attendance_date);\r\n return rowDate.toDateString() === date.toDateString();\r\n });\r\n}\r\n\r\ngetEntryColor(entry: any): string {\r\n // Color based on attendance status\r\n switch (entry.attendanceStatus?.toLowerCase()) {\r\n case 'present': return '#28a745';\r\n case 'absent': return '#dc3545';\r\n case 'late': return '#ffc107';\r\n default: return '#007bff';\r\n }\r\n}\r\n\r\ngetEntryTooltip(entry: any): string {\r\n return `${entry.User?.full_name || entry.full_name}: ${entry.clock_in_time} - ${entry.clock_out_time}`;\r\n}\r\n\r\ngetEntryTime(entry: any): string {\r\n if (entry.clock_in_time) {\r\n return new Date(entry.clock_in_time).toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'});\r\n }\r\n return '--:--';\r\n}\r\n\r\n// Card View Methods\r\ncalculateTotalHours(row: any): string {\r\n if (!row.clock_in_time || !row.clock_out_time) return '0h 0m';\r\n\r\n const start = new Date(row.clock_in_time);\r\n const end = new Date(row.clock_out_time);\r\n const diffMs = end.getTime() - start.getTime();\r\n const diffMins = Math.floor(diffMs / (1000 * 60));\r\n\r\n // Subtract break time\r\n const breakMins = (row.breaks || []).reduce((sum: number, b: any) => sum + (b.break_duration || 0), 0);\r\n const totalMins = diffMins - breakMins;\r\n\r\n const hours = Math.floor(totalMins / 60);\r\n const minutes = totalMins % 60;\r\n\r\n return `${hours}h ${minutes}m`;\r\n}\r\n\r\ngetAvatarColor(name: string): string {\r\n if (!name) return '#6c757d';\r\n const colors = ['#007bff', '#28a745', '#dc3545', '#ffc107', '#17a2b8', '#6f42c1', '#e83e8c', '#fd7e14'];\r\n const index = name.length % colors.length;\r\n return colors[index];\r\n}\r\n\r\ngetInitialss(name: string): string {\r\n if (!name) return 'NA';\r\n const parts = name.trim().split(' ');\r\n return parts[0][0] + (parts[1]?.[0] || '').toUpperCase();\r\n}\r\n\r\ngetStatusBadgeClass(status: string): string {\r\n const transformed = this.transformStatus(status)?.toLowerCase();\r\n switch (transformed) {\r\n case 'clocked in':\r\n return 'badge-success';\r\n case 'absent':\r\n return 'badge-danger';\r\n case 'on leave':\r\n return 'badge-warning';\r\n case 'holiday':\r\n return 'badge-info';\r\n case 'clocked out':\r\n return 'badge-secondary';\r\n default:\r\n return 'badge-secondary';\r\n }\r\n}\r\n\r\ngetAttendanceStatusBadgeClass(status: string): string {\r\n const transformed = this.transformStatus(status)?.toLowerCase();\r\n switch (transformed) {\r\n case 'absent':\r\n return 'badge-danger';\r\n case 'block':\r\n return 'badge-secondary';\r\n case 'early in':\r\n return 'badge-warning';\r\n case 'late out':\r\n return 'badge-warning';\r\n case 'early out':\r\n return 'badge-warning';\r\n case 'lateness':\r\n return 'badge-warning';\r\n case 'leave':\r\n return 'badge-secondary';\r\n case 'on short leave':\r\n return 'badge-info';\r\n case 'miss punch out':\r\n return 'badge-danger';\r\n case 'on time out':\r\n return 'badge-success';\r\n case 'public holiday':\r\n return 'badge-info';\r\n default:\r\n return 'badge-secondary';\r\n }\r\n}\r\n\r\n// Heatmap View Methods\r\ngetHeatmapMonths(): string[] {\r\n const months = [];\r\n const now = new Date();\r\n for (let i = 11; i >= 0; i--) {\r\n const date = new Date(now.getFullYear(), now.getMonth() - i, 1);\r\n months.push(date.toLocaleDateString('en-US', { month: 'short' }));\r\n }\r\n return months;\r\n}\r\n\r\ngetHeatmapWeeks(): any[][] {\r\n const weeks = [];\r\n const now = new Date();\r\n const startDate = new Date(now.getFullYear(), now.getMonth() - 11, 1);\r\n\r\n for (let week = 0; week < 53; week++) {\r\n const weekData = [];\r\n for (let day = 0; day < 7; day++) {\r\n const date = new Date(startDate);\r\n date.setDate(startDate.getDate() + (week * 7) + day);\r\n\r\n const activity = this.getActivityForDate(date);\r\n weekData.push({\r\n date: date,\r\n activity: activity,\r\n tooltip: `${date.toDateString()}: ${activity} hours`\r\n });\r\n }\r\n weeks.push(weekData);\r\n }\r\n\r\n return weeks;\r\n}\r\n\r\ngetActivityForDate(date: Date): number {\r\n const entries = this.dataSet.filter(row => {\r\n const rowDate = new Date(row.attendance_date);\r\n return rowDate.toDateString() === date.toDateString();\r\n });\r\n\r\n return entries.reduce((total, entry) => {\r\n if (entry.clock_in_time && entry.clock_out_time) {\r\n const start = new Date(entry.clock_in_time);\r\n const end = new Date(entry.clock_out_time);\r\n const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60);\r\n return total + hours;\r\n }\r\n return total;\r\n }, 0);\r\n}\r\n\r\ngetHeatmapColor(activity: number): string {\r\n if (activity === 0) return '#ebedf0';\r\n if (activity < 4) return '#9be9a8';\r\n if (activity < 6) return '#40c463';\r\n if (activity < 8) return '#30a14e';\r\n return '#216e39';\r\n}\r\n\r\ngetHeatmapTooltip(day: any): string {\r\n return `${day.date.toDateString()}: ${day.activity.toFixed(1)} hours`;\r\n}\r\n\r\n// isShortLeavePopoverVisible = false;\r\n// currentShortLeaveData: any[] = [];\r\n// shortLeaveTooltipPosition = { x: 0, y: 0 };\r\n\r\n// showShortLeavePopover(event: MouseEvent, detailRow: any) {\r\n// if (detailRow.short_leave && detailRow.short_leave.length > 0) {\r\n// this.currentShortLeaveData = detailRow.short_leave;\r\n// this.isShortLeavePopoverVisible = true;\r\n// this.shortLeaveTooltipPosition = { x: event.clientX, y: event.clientY };\r\n// }\r\n// event.stopPropagation();\r\n// }\r\n\r\n\r\n\r\n// shortLeaveTooltipPosition = { x: 0, y: 0 };\r\n\r\n// showShortLeavePopover(event: MouseEvent, row: any) {\r\n// this.isShortLeavePopoverVisible = true;\r\n// this.currentShortLeaveRow = row;\r\n// this.shortLeaveTooltipPosition = {\r\n// x: event.clientX,\r\n// y: event.clientY\r\n// };\r\n// event.stopPropagation();\r\n// }\r\n\r\n\r\n// formatDate(date: any): string {\r\n// if (!date) return '';\r\n// return this.datePipe.transform(date, this.prefs.dateFormat, this.prefs.timeZone) || '';\r\n// }\r\n\r\ngetTimeValue(value: any): string {\r\n if (!value || value === '-') return '';\r\n\r\n // If object from backend { value: '09:00' }\r\n if (value?.value) return value.value;\r\n\r\n // If object { name: '09:00' }\r\n if (value?.name) return value.name;\r\n\r\n // If datetime like \"2025-11-20T09:00:00Z\"\r\n if (typeof value === 'string' && value.includes('T')) {\r\n return value.split('T')[1].substring(0, 5); // => \"09:00\"\r\n }\r\n\r\n // If plain time \"09:00\"\r\n return value;\r\n}\r\n\r\nformatTime(value: any): string {\r\n debugger\r\n if (!value) return '-';\r\n\r\n value = this.getTimeValue(value); // normalize first\r\n\r\n // If getTimeValue returned empty, return dash\r\n if (!value) return '-';\r\n\r\n // When plain \"09:00\" → convert to valid date\r\n if (/^\\d{2}:\\d{2}$/.test(value)) {\r\n value = `1970-01-01T${value}:00Z`; // UTC safe\r\n }\r\n\r\n return this.datePipe.transform(value, this.prefs.timeFormat, this.prefs.timeZone) || '-';\r\n }\r\n\r\n\r\n\r\n\r\n// Tooltip state for Short Leave\r\n// showShortLeaveTooltipModal: boolean = false;\r\n// shortLeaveTooltipPosition = { x: 0, y: 0 };\r\n// currentShortLeaveData: any[] = [];\r\n// shortLeaveTooltipMoused: boolean = false;\r\n\r\nshowShortLeaveTooltip(event: MouseEvent, row: any) {\r\n if (row?.short_leave?.length > 0) {\r\n this.currentShortLeaveData = row?.short_leave;\r\n this.shortLeaveTooltipPosition = { x: event.clientX + 10, y: event.clientY + 10 };\r\n this.shortLeaveTooltipMoused = true;\r\n this.showShortLeaveTooltipModal = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n\r\nhideShortLeaveTooltip() {\r\n this.shortLeaveTooltipMoused = false;\r\n setTimeout(() => {\r\n if (!this.shortLeaveTooltipMoused) {\r\n this.showShortLeaveTooltipModal = false;\r\n this.currentShortLeaveData = [];\r\n this.cdr.markForCheck();\r\n }\r\n }, 500);\r\n}\r\n\r\npreventShortLeaveTooltipHide() {\r\n this.shortLeaveTooltipMoused = true;\r\n}\r\n\r\nonDetailBadgeOverflowCountClick(col: any, detailRow: any, badgeComponent?: any) {\r\n if (col?.field === 'breaks') {\r\n const currentWidth = col.width || 200;\r\n const newWidth = Math.min(currentWidth + 100, 500);\r\n col.width = newWidth;\r\n\r\n this.cdr.detectChanges();\r\n\r\n // Wait for DOM to apply new width, then refresh badge component\r\n setTimeout(() => {\r\n if (badgeComponent && typeof badgeComponent.refresh === 'function') {\r\n badgeComponent.refresh();\r\n }\r\n }, 50); // 50ms is enough for layout to settle\r\n }\r\n}\r\n\r\n// In badge-overflow.component.ts\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// }\r\n\r\n\r\n\r\n\r\n","<div class=\"position-relative h-100\">\r\n <!-- <h1>abu </h1> -->\r\n <div\r\n class=\"d-flex justify-content-between mb-3 align-items-center position-relative\"\r\n >\r\n <div class=\"col-4 global-search position-relative\">\r\n\r\n <span\r\n\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n style=\"height: 36px\"\r\n class=\"form-control\"\r\n placeholder=\"Search all columns and press Enter\"\r\n [(ngModel)]=\"tableSearch\"\r\n (keydown.enter)=\"onGlobalSearch()\"\r\n\r\n />\r\n <span\r\n *ngIf=\"tableSearch\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"data-grid-svg-icon position-absolute end-0 top-50 translate-middle-y me-2 cursor-pointer\"\r\n (click)=\"onSearchReset()\"\r\n title=\"Clear search\"\r\n ></span>\r\n\r\n </div>\r\n\r\n <!-- Date Picker Buttons -->\r\n <!-- Date Picker Section - Improved Version -->\r\n<div class=\"position-relative d-flex justify-content-center align-items-center ms-2 date-range-container\">\r\n\r\n <!-- Hidden Date Picker Input -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n bsDaterangepicker\r\n #picker=\"bsDaterangepicker\"\r\n [(ngModel)]=\"bsRangeValue\"\r\n [bsConfig]=\"bsConfig\"\r\n (bsValueChange)=\"onRangeSelected($event, picker)\"\r\n style=\"opacity: 0; width: 0; height: 0; position: absolute;\"\r\n />\r\n\r\n <!-- Left Arrow Button -->\r\n <span\r\n class=\"text-primary cursor-pointer me-2 date-range-btn arrow-btn\"\r\n (click)=\"navigateDate('left')\"\r\n title=\"Previous Date Range\"\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0\"\r\n >\r\n <span class=\"bi bi-chevron-left\"></span>\r\n </span>\r\n\r\n <!-- Date Range Label -->\r\n <span\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0\"\r\n class=\"text-primary date-range-label cursor-pointer\"\r\n (click)=\"togglePicker(picker)\"\r\n title=\"Click to open calendar\"\r\n >\r\n {{ bsRangeValue[0] | timezoneFormat:prefs:'date' }} - {{ bsRangeValue[1] | timezoneFormat:prefs:'date' }}\r\n </span>\r\n\r\n <!-- Right Arrow Button -->\r\n <span\r\n class=\"text-primary cursor-pointer ms-2 date-range-btn arrow-btn\"\r\n (click)=\"navigateDate('right')\"\r\n title=\"Next Date Range\"\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0\"\r\n >\r\n <span class=\"bi bi-chevron-right\"></span>\r\n </span>\r\n\r\n\r\n\r\n</div>\r\n\r\n <div class=\"d-flex gap-2 align-items-center table-right-top-actions\">\r\n\r\n <!-- Pivot Mode Button -->\r\n <!-- <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 header-icon\"\r\n (click)=\"togglePivotMode()\"\r\n [class.active]=\"pivotMode\"\r\n title=\"Toggle Pivot Mode\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pivot.svg'\"\r\n class=\"svg-icon svg-icon-2\"\r\n ></span>\r\n </a> -->\r\n\r\n <div class=\"action-buttons-row d-flex\">\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n (click)=\"togglePicker(picker)\"\r\n title=\"Select Date Range\"\r\n >\r\n <span class=\"bi bi-calendar3 text-primary\"></span>\r\n <span class=\"label-hidden text-white\">Calendar</span>\r\n </a>\r\n <button\r\n *ngIf=\"bsRangeValue && bsRangeValue.length > 0 && !isDefaultDateRange\"\r\n type=\"button\"\r\n class=\"button button-small btn btn-active-danger border border-danger me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n (click)=\"clearDateRange()\"\r\n title=\"Clear Date Range\"\r\n >\r\n <span class=\"bi bi-x-circle text-danger\"></span>\r\n <span class=\"label-hidden text-white\">Clear</span>\r\n </button>\r\n</div>\r\n<ng-container *ngFor=\"let button of buttons\">\r\n <div\r\n class=\"action-buttons-row\"\r\n *ngIf=\"getButtonPermission(button) && (!button.condition || (button.condition === '!isSingleDay' && !isSingleDay) || (button.condition === 'isSingleDay' && isSingleDay))\"\r\n >\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n (click)=\"onActionButtonClick(button.name)\"\r\n class=\"button\"\r\n [title]=\"button.name\"\r\n >\r\n <span\r\n *ngIf=\"button.is_showIcon\"\r\n [inlineSVG]=\"button.iconPath\"\r\n class=\"svg-icon\"\r\n ></span>\r\n <span\r\n class=\"label-hidden\"\r\n >{{ button.name }}</span\r\n >\r\n </a>\r\n </div>\r\n</ng-container>\r\n\r\n<!-- Calendar Button -->\r\n\r\n\r\n<!-- Existing filter, settings, etc. -->\r\n <div\r\n *ngIf=\"!showFilterRow\"\r\n class=\"cursor-pointer position-relative action-buttons-row\"\r\n (click)=\"toggleOpenFilter()\"\r\n [class.active]=\"showFilters\"\r\n >\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"svg-icon svg-icon-2\"\r\n ></span>\r\n <span class=\"label-hidden text-white\">Filters</span>\r\n </a>\r\n <span\r\n *ngIf=\"activeFilteredColumns?.length\"\r\n style=\"\r\n width: 7px;\r\n height: 7px;\r\n box-shadow: 0px 0px 3px #0022ff;\r\n background-color: rgb(0, 60, 255);\r\n position: absolute;\r\n right: 16px;\r\n top: 10px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"cursor-pointer d-none\"\r\n (click)=\"toggleActions('advance-filter')\"\r\n [class.active]=\"activeTopButton === 'advance-filter'\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/zoom-charge.svg'\"\r\n class=\"data-grid-svg-icon top-icon me-2\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"cursor-pointer action-buttons-row\"\r\n (click)=\"toggleActions('setting')\"\r\n [class.active]=\"\r\n activeTopButton === 'setting' ||\r\n activeTopButton === 'table-layout' ||\r\n activeTopButton === 'table-presets' ||\r\n activeTopButton === 'show-hide-columns'\r\n \"\r\n >\r\n <!-- <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settings-2.svg'\"\r\n class=\"data-grid-svg-icon top-icon me-2\"\r\n ></span> -->\r\n <a\r\n href=\"JavaScript:void(0)\"\r\n class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settings-2.svg'\"\r\n class=\"svg-icon svg-icon-2\"\r\n ></span>\r\n <span class=\"label-hidden text-white\">Setting</span>\r\n </a>\r\n\r\n <div\r\n *ngIf=\"activeTopButton === 'setting'\"\r\n class=\"actions-dropdown mt-1 actions-dropdown-setting\"\r\n style=\"position: absolute\"\r\n >\r\n <div class=\"dropdown-menu show shadow custom-menu\">\r\n <!-- Table Layout -->\r\n <a\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n (click)=\"$event.stopPropagation(); toggleActions('table-layout')\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/table-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Layout</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n <!-- Table Presets -->\r\n <a\r\n (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/list-details.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Presets</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n\r\n <!-- Columns -->\r\n <a\r\n *ngIf=\"!showSideMenu\"\r\n (click)=\"\r\n $event.stopPropagation(); toggleActions('show-hide-columns')\r\n \"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Columns</span\r\n >\r\n <div class=\"d-flex gap-2\">\r\n <span class=\"muted-text\">{{ columnsCount }}</span>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"dropdown-divider\"></div>\r\n\r\n <!-- Filter -->\r\n <a\r\n class=\"dropdown-item cursor-pointer\"\r\n (click)=\"toggleOpenFilter(); activeTopButton = ''\"\r\n *ngIf=\"!showFilterRow\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2 mt-1 cursor-pointer\"\r\n ></span>\r\n Filter\r\n </a>\r\n\r\n <!-- Download -->\r\n <a\r\n class=\"dropdown-item cursor-pointer\"\r\n (click)=\"downloadCsv('csv')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/download.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span>\r\n CSV Export\r\n </a>\r\n <a\r\n *ngIf=\"enableExport\"\r\n class=\"dropdown-item cursor-pointer\"\r\n (click)=\"downloadCsv('xlsx')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/download.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span>\r\n Excel Export\r\n </a>\r\n <!-- Font Family & Font Size -->\r\n <div class=\"px-2 pb-2 pt-2\">\r\n <div class=\"d-flex gap-2\">\r\n <!-- Font Family -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"fontFaimly\"\r\n (change)=\"onFontChange()\"\r\n >\r\n <option *ngFor=\"let font of fontFamilies\" [value]=\"font\">\r\n {{ font }}\r\n </option>\r\n </select>\r\n\r\n <!-- Font Size -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n (change)=\"onFontChange()\"\r\n [(ngModel)]=\"bodyTextFontsSize\"\r\n >\r\n <option *ngFor=\"let size of fontSizes\" [value]=\"size\">\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Table Layout -->\r\n\r\n <ng-container *ngIf=\"activeTopButton === 'table-layout'\">\r\n <div\r\n *ngTemplateOutlet=\"tableLayout\"\r\n class=\"actions-dropdown mt-1\"\r\n style=\"position: absolute\"\r\n ></div>\r\n </ng-container>\r\n\r\n <!-- Table Presets -->\r\n <ng-container *ngIf=\"activeTopButton === 'table-presets'\">\r\n <div\r\n *ngTemplateOutlet=\"tablePreset\"\r\n class=\"actions-dropdown mt-1\"\r\n style=\"position: absolute\"\r\n ></div>\r\n </ng-container>\r\n\r\n <!-- Table Presets -->\r\n <ng-container *ngIf=\"activeTopButton === 'show-hide-columns'\">\r\n <div\r\n *ngTemplateOutlet=\"showHideColumns\"\r\n class=\"actions-dropdown mt-1\"\r\n style=\"position: absolute\"\r\n ></div>\r\n </ng-container>\r\n </div>\r\n <div>\r\n <!-- Example single danger button -->\r\n\r\n <!-- <button\r\n type=\"button\"\r\n class=\"btn btn-primary btn-sm d-flex gap-2 action-button\"\r\n (click)=\"toggleActions('actions')\"\r\n >\r\n Action\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/Vector.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <div\r\n *ngIf=\"activeTopButton === 'actions'\"\r\n class=\"actions-dropdown mt-1\"\r\n >\r\n <div class=\"dropdown-menu show\">\r\n <a class=\"dropdown-item\" href=\"#\">Action</a>\r\n <a class=\"dropdown-item\" href=\"#\">Another action</a>\r\n <a class=\"dropdown-item\" href=\"#\">Something else here</a>\r\n <div class=\"dropdown-divider\"></div>\r\n <a class=\"dropdown-item\" href=\"#\">Separated link</a>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"showFilters && !showFilterRow\"\r\n class=\"top-filter-row border-top py-2 d-flex justify-content-between align-items-center\"\r\n [style.height.px]=\"topFilterRowHeight\"\r\n >\r\n <!-- LEFT SIDE (Filter tags + Filter button) -->\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <ng-container *ngIf=\"activeFilteredColumns?.length\">\r\n <div\r\n *ngFor=\"let col of activeFilteredColumns; trackBy: trackByField\"\r\n class=\"filter-tags\"\r\n >\r\n <div\r\n (click)=\"\r\n isActiveFilterOpen = true;\r\n activeTopButton = 'filter-columns';\r\n openFilter(col)\r\n \"\r\n class=\"d-flex justify-content-center align-items-center muted-text add-filter-button active-filters\"\r\n style=\"white-space: nowrap\"\r\n [class.active]=\"\r\n col?.field == selectedColumnForFilter?.field &&\r\n isActiveFilterOpen &&\r\n activeTopButton == 'filter-columns'\r\n \"\r\n >\r\n <span class=\"header-tag mt-0 d-flex align-items-center\">\r\n <span\r\n *ngIf=\"col?.pinned\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n {{ col.header }}\r\n <span\r\n (click)=\"\r\n $event.stopPropagation(); removeColumnFilterFromColumn(col)\r\n \"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n \"\r\n class=\"data-grid-svg-icon cross-secondary ms-2 mb-1\"\r\n ></span>\r\n </span>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"\r\n activeTopButton === 'filter-columns' &&\r\n col?.field == selectedColumnForFilter?.field &&\r\n isActiveFilterOpen\r\n \"\r\n >\r\n <div\r\n *ngTemplateOutlet=\"filterColumns; context: { column: col }\"\r\n class=\"actions-dropdown mt-1\"\r\n ></div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Filter Button -->\r\n <div class=\"add-filter-button-menu\">\r\n <div\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n class=\"d-flex justify-content-center align-items-center muted-text add-filter-button button-filter\"\r\n style=\"width: 70px\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/plus.svg'\"\r\n class=\"me-2 data-grid-svg-icon\"\r\n ></span>\r\n Filter\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"activeTopButton === 'filter-columns' && !isActiveFilterOpen\"\r\n >\r\n <div\r\n *ngTemplateOutlet=\"filterColumns\"\r\n class=\"actions-dropdown mt-1\"\r\n ></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT SIDE (Update + Reset) -->\r\n <div class=\"d-flex gap-3 align-items-center\">\r\n <div\r\n (click)=\"savePreset()\"\r\n class=\"text-primary cursor-pointer all-filters-reset-button\"\r\n *ngIf=\"!checkFilterChangesEffect()\"\r\n >\r\n Update View\r\n </div>\r\n\r\n <div\r\n class=\"text-primary cursor-pointer all-filters-reset-button\"\r\n *ngIf=\"!tableFilterViewId && activeFilteredColumns?.length\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n Reset\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n [style.height]=\"\r\n showFilters ? 'calc(100% - ' + topFilterRowHeight + 'px)' : '100%'\r\n \"\r\n cdkDropListGroup\r\n class=\"data-grid-table-wrapper overflow-hidden\"\r\n #dataGridContainer\r\n [style.fontFamily]=\"fontFaimly\"\r\n >\r\n <div\r\n *ngIf=\"showRowsGrouping\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [cdkDropListData]=\"columns\"\r\n [style.backgroundColor]=\"\r\n topGroupedBadgesBackgroundColor || headerBackgroundColor\r\n \"\r\n cdkDropList\r\n (cdkDropListEntered)=\"enterToTopRowGrouping($event)\"\r\n (cdkDropListExited)=\"exitedFromTheTopRow($event)\"\r\n (cdkDropListDropped)=\"onDropTopGroup($event)\"\r\n [cdkDropListEnterPredicate]=\"canEnterToRowsGrouping\"\r\n id=\"rows-grouping-top-container\"\r\n class=\"border-below d-flex px-4 align-items-center\"\r\n >\r\n <div class=\"d-flex gap-2 align-items-center me-5\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <div *ngIf=\"!draggingInGroupArea && !groupedColumns?.length\">\r\n Drag here to set row groups\r\n </div>\r\n <ng-container\r\n *ngFor=\"\r\n let child of groupedColumns;\r\n let i = index;\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n groupedColumns.length > 1 && i != groupedColumns.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n\r\n\r\n</div>\r\n<div\r\n class=\"d-flex overflow-hidden\"\r\n [style.height]=\"\r\n 'calc(100% - ' +\r\n (showRowsGrouping\r\n ? headerRowHeight + footerRowHeight\r\n : footerRowHeight) +\r\n 'px)'\r\n \"\r\n>\r\n <div\r\n class=\"h-100\"\r\n [style.width]=\"\r\n !showSideMenu\r\n ? '100%'\r\n : sideMenuVisible\r\n ? 'calc(100% - 280px)'\r\n : 'calc(100% - 30px)'\r\n \"\r\n >\r\n <div class=\"h-100 transition position-relative w-100\">\r\n <!-- ##################################################################################################################################################################################### -->\r\n <!-- ##################################################################################################################################################################################### -->\r\n <!-- Data Grid Header starts here -->\r\n <!-- ##################################################################################################################################################################################### -->\r\n <!-- ##################################################################################################################################################################################### -->\r\n\r\n <div\r\n class=\"data-grid-header-wrapper w-100\"\r\n [style.color]=\"headerTextColor\"\r\n [style.fontSize.px]=\"headerTextFontsSize\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n [class.border-below]=\"!hasAnyVisibleColumn\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n >\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <!-- Data Grid Left Pinned Header starts here -->\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <div class=\"data-grid-header left-pinned\" #leftPinnedHeader>\r\n <div\r\n *ngIf=\"showSerialNumber\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell border-below\"\r\n [style.width.px]=\"65\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n >\r\n S.No</div>\r\n <div\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell border-below\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [indeterminate]=\"isIndeterminateState(dataSet)\"\r\n [checked]=\"isAllSelected(dataSet)\"\r\n (change)=\"toggleSelectAll(dataSet)\"\r\n />\r\n </div>\r\n <div\r\n class=\"d-flex\"\r\n cdkDropList\r\n id=\"left-pinned-header\"\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"leftPinnedColumns\"\r\n (cdkDropListEntered)=\"onDropListEnter($event, 'left')\"\r\n (cdkDropListSorted)=\"\r\n onSortGroup($event, 'previewLeftPinnedColumns')\r\n \"\r\n (cdkDropListDropped)=\"onDropGroup()\"\r\n style=\"min-width: 0.2px\"\r\n [style.background-color]=\"headerBackgroundColor\"\r\n >\r\n <div\r\n class=\"dragable-header\"\r\n cdkDrag\r\n [cdkDragData]=\"col\"\r\n *ngFor=\"\r\n let col of leftPinnedColumns;\r\n let i = index;\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'previewLeftPinnedColumns'\r\n }\r\n \"\r\n ></ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: ''\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container\r\n *ngIf=\"col?.children?.length; else singleCol\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <!-- Data Grid Center Pinned Header starts here -->\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <div\r\n class=\"data-grid-header center-scrollable\"\r\n #centerPinnedHeader\r\n (scroll)=\"onCenterHeaderScroll($event)\"\r\n id=\"center-pinned-header\"\r\n cdkDropList\r\n [cdkDropListConnectedTo]=\"\r\n showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n \"\r\n [cdkDropListData]=\"centerColumns\"\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListSortingDisabled]=\"\r\n isDisableColumnGrouping && draggingInGroupArea\r\n \"\r\n (cdkDropListEntered)=\"onDropListEnter($event, 'center')\"\r\n (cdkDropListSorted)=\"onSortGroup($event, 'previewCenterColumns')\"\r\n (cdkDropListDropped)=\"onDropGroup()\"\r\n [style.maxWidth]=\"\r\n 'calc(100% - ' +\r\n (rightPinnedHeader.offsetWidth + leftPinnedHeader.offsetWidth) +\r\n 'px)'\r\n \"\r\n >\r\n <div\r\n *ngIf=\"groupedColumns?.length\"\r\n style=\"min-width: 200px\"\r\n class=\"h-100 align-items-center\"\r\n #columnsGroupedBox\r\n id=\"groupBoxHeaderDiv\"\r\n >\r\n <div\r\n class=\"d-flex w-100 justify-content-between align-items-center border-below\"\r\n [style.height.px]=\"\r\n showFilterRow ? headerRowHeight * 2 : headerRowHeight\r\n \"\r\n >\r\n <div class=\"ps-3\">Group</div>\r\n <div class=\"d-flex\">\r\n <div\r\n class=\"three-dots cursor-pointer\"\r\n (click)=\"openThreeDotsMenu($event, 'group')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div\r\n (mousedown)=\"onResizeGroupBox($event)\"\r\n class=\"resize-handle\"\r\n style=\"margin-right: -2px\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n [style.height.px]=\"headerRowHeight\"\r\n class=\"border-below\"\r\n ></div>\r\n </div>\r\n <!-- <span\r\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n style=\"min-width: 30px; height: 100%;\"\r\n *ngIf=\"gridType === 'TimeSheet' && !areDatesSelectedAndEqual\"\r\n >\r\n </span> -->\r\n <div\r\n class=\"dragable-header\"\r\n (cdkDragStarted)=\"\r\n checkColumnGroupingStatus(col); dragStartOnGroup(col)\r\n \"\r\n cdkDrag\r\n [cdkDragData]=\"col\"\r\n *ngFor=\"\r\n let col of centerColumns;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'previewCenterColumns'\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'centerColumns'\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container *ngIf=\"child?.is_groupable\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container *ngIf=\"col?.is_groupable\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"!areDatesSelectedAndEqual\" class=\"header-cell border-below\" [style.width.px]=\"30\" [style.height.px]=\"headerRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\"></div>\r\n </div>\r\n\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <!-- Data Grid Right Pinned Header starts here -->\r\n <!-- ********************************************************************************* -->\r\n <!-- ********************************************************************************* -->\r\n <div\r\n cdkDropList\r\n id=\"right-pinned-header\"\r\n [cdkDropListConnectedTo]=\"\r\n showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n \"\r\n cdkDropListOrientation=\"horizontal\"\r\n class=\"data-grid-header right-pinned\"\r\n (cdkDropListSorted)=\"\r\n onSortGroup($event, 'previewRightPinnedColumns')\r\n \"\r\n (cdkDropListEntered)=\"onDropListEnter($event, 'right')\"\r\n (cdkDropListDropped)=\"onDropGroup()\"\r\n #rightPinnedHeader\r\n class=\"right-pinned-header d-flex\"\r\n style=\"min-width: 0.2px\"\r\n >\r\n <div\r\n class=\"dragable-header\"\r\n cdkDrag\r\n [cdkDragData]=\"col\"\r\n *ngFor=\"\r\n let col of rightPinnedColumns;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n pinnedRight: true,\r\n index: i,\r\n section: 'previewRightPinnedColumns'\r\n }\r\n \"\r\n ></ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: {\r\n $implicit: col,\r\n index: i,\r\n section: 'centerColumns'\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!-- Data Grid Body starts here -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <div\r\n class=\"h-100 d-flex justify-content-center align-items-center\"\r\n *ngIf=\"!dataSet.length && !loading\"\r\n >\r\n No Record Found\r\n </div>\r\n\r\n <div\r\n class=\"position-absolute w-100 h-100 d-flex justify-content-center align-items-center loading-overlay\"\r\n *ngIf=\"loading\"\r\n style=\"\r\n z-index: 999;\r\n background: rgba(255, 255, 255, 0.8);\r\n backdrop-filter: blur(1px);\r\n \"\r\n >\r\n <div class=\"text-center p-2\">\r\n <div class=\"spinner-border text-primary\" role=\"status\"></div> Loading...\r\n</div>\r\n </div>\r\n\r\n <!-- Card View -->\r\n \r\n\r\n <!-- Table View -->\r\n <div\r\n class=\"data-grid-body-wrapper position-relative d-flex\"\r\n [style.height]=\"bodyWrapperHeight\"\r\n style=\"overflow-y: auto; overflow-x: hidden\"\r\n #mainScroll\r\n (scroll)=\"onMainScroll($event)\"\r\n *ngIf=\"dataSet.length\"\r\n >\r\n <!-- LEFT PINNED -->\r\n <div [style.height.px]=\"!groupedColumns.length ? originalDataSet.length * rowHeight: 0\"></div>\r\n <div [class.h-100]=\"originalDataSet.length <= 10\">\r\n <div\r\n class=\"data-grid-body left-pinned-body w-100\"\r\n style=\"overflow-y: hidden\"\r\n [class.border-right]=\"hasLeftPinnedColumns\"\r\n [class.transparent-border-right]=\"!hasLeftPinnedColumns\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let row of visibleRows;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: row,\r\n columns: previewLeftPinnedColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n isLeft: true,\r\n section: 'left'\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- CENTER -->\r\n <div\r\n class=\"\"\r\n [style.width.px]=\"centerPinnedHeader.clientWidth\"\r\n >\r\n <div\r\n class=\"data-grid-body center-scrollable\"\r\n\r\n style=\"overflow-y: hidden; overflow-x: auto\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.backgroundColor]=\"bodyBackgroundColor\"\r\n #centerScrollableBody\r\n (scroll)=\"onCenterBodyScroll($event)\"\r\n [style.boxShadow]=\"leftPinnedBoxshadow\"\r\n\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let row of visibleRows;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: row,\r\n columns: previewCenterColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n section: 'center'\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT PINNED -->\r\n <div\r\n class=\"right-pinned-body-wrapper\"\r\n *ngIf=\"hasRightPinnedColumns\"\r\n [class.h-100]=\"originalDataSet.length <= 10\"\r\n [style.max-width.px]=\"isScrollbarVisible ? rightPinnedHeader.offsetWidth - 15: rightPinnedHeader.offsetWidth\"\r\n >\r\n <div\r\n class=\"data-grid-body right-pinned-body w-100\"\r\n style=\"overflow-y: hidden\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.boxShadow]=\"rightPinnedBoxshadow\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let row of visibleRows;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: row,\r\n columns: previewRightPinnedColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n section: 'right'\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Vertical Fake scroll Bar -->\r\n <div\r\n (scroll)=\"onMainFakeScroll($event)\"\r\n class=\"fake-scrollbar fake-scrollbar-vertical d-none\"\r\n [style.scrollbarWidth]=\"verticalScrollbarWidth\"\r\n [style.top.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n #fakeScroll\r\n [style.height]=\"bodyWrapperHeight\"\r\n style=\"\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n width: 17px;\r\n position: absolute;\r\n right: 0;\r\n background-color: f1f2f3;\r\n z-index: 10;\r\n \"\r\n >\r\n <div [style.height.px]=\"rowHeight * (paginationConfig.totalResults || flattenedData.length)\"></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Horizintal Fake Scrollbars -->\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"dataSet.length\">\r\n <div\r\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n class=\"fake-horizintal-scrollbar\"\r\n #fakeScroll\r\n [style.width.px]=\"leftPinnedHeader.offsetWidth\"\r\n style=\"overflow-x: scroll\"\r\n ></div>\r\n <div\r\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n (scroll)=\"onHorizintalFakeScroll($event)\"\r\n class=\"fake-horizintal-scrollbar\"\r\n #horizintalFakeScroll\r\n [style.width.px]=\"centerPinnedHeader.offsetWidth\"\r\n >\r\n <div [style.width.px]=\"centerPinnedHeader.scrollWidth\"></div>\r\n </div>\r\n <div\r\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n class=\"fake-horizintal-scrollbar\"\r\n #fakeScroll\r\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n style=\"overflow-x: scroll\"\r\n ></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Side Menu Implemented Here -->\r\n <div\r\n *ngIf=\"showSideMenu && !hasOpenAccordion\"\r\n [style.width.px]=\"sideMenuVisible ? 280 : 30\"\r\n class=\"right-menu h-100\"\r\n [style.backgroundColor]=\"sidemenuBackgroundColor\"\r\n >\r\n <div class=\"h-100 d-flex flex-row-reverse\">\r\n <div\r\n style=\"width: 30px\"\r\n class=\"d-flex flex-column align-items-center cursor-pointer\"\r\n [class.border-start]=\"sideMenuVisible\"\r\n >\r\n <div\r\n (click)=\"toggleSideMenu('cols')\"\r\n [class.bg-white]=\"\r\n currentOpenedSideMenue == 'cols' && sideMenuVisible\r\n \"\r\n [class.border-below]=\"sideMenuVisible\"\r\n class=\"columns-button d-flex flex-column align-items-center\"\r\n >\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div class=\"side-menue-text\">Columns</div>\r\n </div>\r\n\r\n <div\r\n (click)=\"toggleSideMenu('filtrs')\"\r\n [class.bg-white]=\"\r\n currentOpenedSideMenue == 'filtrs' && sideMenuVisible\r\n \"\r\n [class.border-below]=\"\r\n sideMenuVisible && currentOpenedSideMenue == 'filtrs'\r\n \"\r\n class=\"columns-button d-flex flex-column align-items-center\"\r\n >\r\n <div>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div class=\"side-menue-text\">Filter</div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"h-100\"\r\n *ngIf=\"sideMenuVisible\"\r\n [ngStyle]=\"{ width: sideMenuVisible ? '250px' : '' }\"\r\n >\r\n <div class=\"h-100\">\r\n <ng-container\r\n *ngIf=\"currentOpenedSideMenue == 'cols' && sideMenuVisible\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"columnPannel\"></ng-container>\r\n <!-- Column Items -->\r\n <div class=\"column-panel-body px-3\">\r\n <ng-container\r\n *ngFor=\"let col of columns; trackBy: trackByField\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n <hr />\r\n\r\n <div class=\"side-menu-row-groups\" style=\"height: 30%\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sideMenuRowGroups\"\r\n ></ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"currentOpenedSideMenue == 'filtrs' && sideMenuVisible\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sideFilters\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div [style.height.px]=\"footerRowHeight\" class=\"border-top\">\r\n <!-- Rows: <span class=\"fw-500 ms-1\">{{ dataSet.length }}</span> -->\r\n <div\r\n class=\"pagination-container\"\r\n [style.height.px]=\"footerRowHeight\"\r\n [style.padding.px]=\"footerPadding\"\r\n >\r\n <div class=\"page-size\">\r\n <select\r\n [(ngModel)]=\"paginationConfig.selectedPageSize\"\r\n (change)=\"onPageSizeChange()\"\r\n >\r\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">\r\n {{ size }}\r\n </option>\r\n </select>\r\n <span class=\"\"> per page </span>\r\n </div>\r\n\r\n <div class=\"page-info\">\r\n Results: {{ paginationConfig.page }}-{{\r\n paginationConfig.page * paginationConfig.limit\r\n }}\r\n of\r\n {{ paginationConfig.totalResults }}\r\n </div>\r\n\r\n <div class=\"page-buttons\">\r\n <button\r\n (click)=\"goToPage(paginationConfig.page - 1)\"\r\n [disabled]=\"paginationConfig.page === 1\"\r\n >\r\n ‹\r\n </button>\r\n\r\n <ng-container *ngFor=\"let page of visiblePages\">\r\n <button\r\n *ngIf=\"page !== '...'\"\r\n (click)=\"goToPage(page)\"\r\n [class.active]=\"page === paginationConfig.page\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span *ngIf=\"page === '...'\">...</span>\r\n </ng-container>\r\n\r\n <button\r\n (click)=\"goToPage(paginationConfig.page + 1)\"\r\n [disabled]=\"paginationConfig.page === paginationConfig.totalResults\"\r\n >\r\n ›\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- Header Cell Template -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n\r\n<ng-template\r\n #headerCell\r\n let-col\r\n let-pinnedRight=\"pinnedRight\"\r\n let-i=\"index\"\r\n let-sections=\"section\"\r\n let-calledFromNestedPlaceholder=\"calledFromNestedPlaceholder\"\r\n>\r\n <div>\r\n <!-- Group Header -->\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatHeader\">\r\n <div cdkDroplistGroup class=\"group-column-wrapper\">\r\n <!-- Parent Header -->\r\n <div\r\n *ngIf=\"shouldTheGroupHeaderShow(col)\"\r\n class=\"header-cell group-header\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.gridColumn]=\"'span ' + col.children.length\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n [class.justify-content-end]=\"pinnedRight\"\r\n style=\"grid-row: 1\"\r\n >\r\n <div\r\n class=\"group-header-content\"\r\n [title]=\"col.header\"\r\n [class.ms-2]=\"pinnedRight\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n <div\r\n class=\"resize-handle\"\r\n (dblclick)=\"autosizeColumn(col.children)\"\r\n (mousedown)=\"onResizeGroup($event, col, pinnedRight)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Child Headers and Filters -->\r\n\r\n <div\r\n class=\"d-flex\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"col.children\"\r\n (cdkDropListSorted)=\"onChildDroplistSorted($event, sections)\"\r\n (cdkDropListDropped)=\"onChildDroplistDroped($event)\"\r\n [cdkDropListSortingDisabled]=\"false\"\r\n [cdkDropListConnectedTo]=\"\r\n showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n \"\r\n >\r\n <div\r\n cdkDrag\r\n [cdkDragData]=\"child\"\r\n *ngFor=\"let child of col.children; let i = index\"\r\n >\r\n <!-- Child Header -->\r\n <ng-container *ngIf=\"child.is_visible && !child['isRowGrouped']\">\r\n <div\r\n cdkDragHandle\r\n class=\"header-cell one-row-header-cells cursor-pointer\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [attr.field]=\"child.field\"\r\n [style.width.px]=\"child.width\"\r\n [style.min-width.px]=\"child.width\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n style=\"grid-row: 2\"\r\n [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(child)\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between h-100 align-items-center w-100\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between w-100\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\r\n [title]=\"col.header\"\r\n [class.w-100]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100\"\r\n [class.editable-header]=\"child?.is_editable\"\r\n (click)=\"openThreeDotsMenu($event, child); openFilteronThreeDotsClick(child)\"\r\n >\r\n {{ child.header }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"position-relative d-flex\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n [class.me-2]=\"pinnedRight\"\r\n class=\"d-flex align-items-center\"\r\n *ngIf=\"child.pinned\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"three-dots p-1\"\r\n (click)=\"openThreeDotsMenu($event, child)\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n\r\n <!-- Only show menu if this column is active -->\r\n <div\r\n class=\"position-absolute\"\r\n *ngIf=\"activeCol === child\"\r\n style=\"top: -50%; z-index: 21\"\r\n [style.left.px]=\"\r\n -(!child?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n columnMenu;\r\n context: { col: child }\r\n \"\r\n ></ng-container>\r\n </div>\r\n\r\n <div\r\n class=\"resize-handle\"\r\n (dblclick)=\"autosizeColumn(child)\"\r\n (mousedown)=\"onResizeColumn($event, child)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Filter Cell -->\r\n <div\r\n *ngIf=\"showFilterRow\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n class=\"header-cell filter-cell\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [attr.field]=\"child.field\"\r\n [style.width.px]=\"child.width\"\r\n [style.min-width.px]=\"child.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n style=\"grid-row: 3\"\r\n >\r\n <div\r\n class=\"header-cell filter-cell\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (ngModelChange)=\"onFilterChange(col)\"\r\n />\r\n <span\r\n class=\"filter-icon-wrapper\"\r\n (click)=\"$event.stopPropagation(); openFilter(child)\"\r\n [class.filter-applied]=\"isFilterAppliedOnColumn(child)\"\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span\r\n *ngIf=\"isFilterAppliedOnColumn(child)\"\r\n style=\"\r\n width: 7px;\r\n height: 7px;\r\n box-shadow: 0px 0px 3px #7486ff;\r\n background-color: rgb(0 163 233);\r\n position: absolute;\r\n right: 4px;\r\n top: 12px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span\r\n ></span>\r\n\r\n <div\r\n class=\"position-absolute filter-row-filter-wrapper\"\r\n *ngIf=\"activeFilterCell?.field == child?.field\"\r\n style=\"top: 100%; right: 0; z-index: 99\"\r\n [style.left.px]=\"\r\n child?.pinned ? 0 : -centerPinnedHeader.scrollLeft\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"filterMenu; context: { col: child }\"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template cdkDragPreview\r\n ><div class=\"p-2 border d-flex gap-2\">\r\n <div\r\n *ngIf=\"\r\n !draggingInGroupArea ||\r\n (child.is_groupable && draggingInGroupArea)\r\n \"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div *ngIf=\"draggingInGroupArea && !child.is_groupable\">\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/ban.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ child.header }}</div>\r\n </div>\r\n </ng-template>\r\n <ng-template cdkDragPlaceholder>\r\n <div *ngIf=\"!draggingInGroupArea\" class=\"position-relative\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n childHeaderPlaceholder;\r\n context: {\r\n $implicit: child,\r\n index: i,\r\n sections: sections,\r\n calledFromNestedPlaceholder: true,\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea && child?.is_groupable\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron: false,\r\n pinnedRight: pinnedRight,\r\n sections: sections,\r\n index: i\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Flat Header || Single Header Cell-->\r\n <ng-template #flatHeader>\r\n <div class=\"group-column-wrapper\">\r\n <!-- Full-height Header Cell (spans 2 rows visually) -->\r\n <div\r\n class=\"header-cell one-row-header-cells\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.min-height.px]=\"\r\n showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\r\n \"\r\n [style.height.px]=\"\r\n showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\r\n \"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n style=\"grid-row: 1 / span 2\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between h-100 align-items-center w-100\"\r\n >\r\n <div\r\n class=\"d-flex justify-content-between w-100\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\r\n [title]=\"col.header\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 cursor-pointer\"\r\n [class.editable-header]=\"col?.is_editable\"\r\n [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(col)\"\r\n (click)=\"openThreeDotsMenu($event, col); openFilteronThreeDotsClick(col)\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"position-relative d-flex\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n [class.me-2]=\"pinnedRight\"\r\n class=\"d-flex align-items-center\"\r\n *ngIf=\"col?.pinned\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div\r\n [class.me-2]=\"col.order_by\"\r\n class=\"d-flex align-items-center\"\r\n *ngIf=\"sortingConfig?.field == col.field\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n (sortingConfig?.order_by == 'desc'\r\n ? 'data-grid/icons/sort-desc.svg'\r\n : 'data-grid/icons/sort-asc.svg')\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center mt-1\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"three-dots p-1\"\r\n (click)=\"openThreeDotsMenu($event, col)\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n\r\n <!-- Only show menu if this column is active -->\r\n <div\r\n class=\"position-absolute\"\r\n *ngIf=\"activeCol === col\"\r\n style=\"top: -50%; z-index: 21\"\r\n [style.left.px]=\"\r\n -(!col?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnMenu; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n\r\n <div\r\n class=\"resize-handle\"\r\n [class.w-100]=\"col.pinned == 'right'\"\r\n (dblclick)=\"autosizeColumn(col)\"\r\n (mousedown)=\"onResizeColumn($event, col)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Filter Cell -->\r\n <div\r\n *ngIf=\"showFilterRow\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n class=\"header-cell filter-cell\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (ngModelChange)=\"onFilterChange(col)\"\r\n />\r\n <span\r\n class=\"filter-icon-wrapper\"\r\n (click)=\"$event.stopPropagation(); openFilter(col)\"\r\n [class.filter-applied]=\"isFilterAppliedOnColumn(col)\"\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span\r\n *ngIf=\"isFilterAppliedOnColumn(col)\"\r\n style=\"\r\n width: 7px;\r\n height: 7px;\r\n box-shadow: 0px 0px 3px #7486ff;\r\n background-color: rgb(0 163 233);\r\n position: absolute;\r\n right: 4px;\r\n top: 12px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span\r\n ></span>\r\n\r\n <div\r\n class=\"position-absolute filter-row-filter-wrapper\"\r\n *ngIf=\"activeFilterCell === col\"\r\n style=\"top: 100%; right: 0; z-index: 99\"\r\n [style.left.px]=\"col?.pinned ? 0 : -centerPinnedHeader.scrollLeft\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- Body Cell Template -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n<ng-template\r\n #rowCell\r\n let-row\r\n let-columns=\"columns\"\r\n let-isEven=\"isEven\"\r\n let-isOdd=\"isOdd\"\r\n let-isLeftSection=\"isLeft\"\r\n let-section=\"section\"\r\n let-rowIndex=\"rowIndex\"\r\n>\r\n <!-- Check if row is a group -->\r\n <ng-container\r\n *ngTemplateOutlet=\"groupRowTemplate; context: { $implicit: row, depth: 0 }\"\r\n ></ng-container>\r\n <ng-template #groupRowTemplate let-row let-depth=\"depth\">\r\n <ng-container *ngIf=\"row.isGroup; else regularRow\">\r\n <!-- Group Header -->\r\n <div\r\n class=\"group-header-row border-below d-flex align-items-center\"\r\n [style.height.px]=\"rowHeight\"\r\n [style.width]=\"\r\n section == 'center'\r\n ? centerScrollableBody!.nativeElement?.scrollWidth + 'px'\r\n : '100%'\r\n \"\r\n >\r\n <div\r\n *ngIf=\"section == 'left'\"\r\n class=\"h-100 d-flex\"\r\n [style.width.px]=\"leftPinnedHeader.offsetWidth - 1\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n >\r\n <div\r\n *ngIf=\"showSerialNumber\"\r\n style=\"width: 50px\"\r\n class=\"d-flex align-items-center h-100 border-right justify-content-end pe-2 s-no\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n [style.width.px]=\"65\"\r\n [style.cursor]=\"\r\n 'url(' +\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrow-right.svg), auto'\r\n \"\r\n (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\r\n (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\r\n >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\r\n style=\"width: 50px\"\r\n class=\"d-flex align-items-center justify-content-center h-100 border-right\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.left-selection-border]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n \"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <input style=\"width: 16px; height: 16px\" type=\"checkbox\" />\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'center'\"\r\n [style.width.px]=\"centerPinnedHeader.scrollWidth\"\r\n class=\"d-flex align-items-center ps-2 h-100\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <div\r\n class=\"d-flex align-items-center justify-content-between\"\r\n [style.paddingLeft.px]=\"depth > 0 ? depth * 16 : 0\"\r\n >\r\n <span class=\"me-2 filter-icon-wrapper\" (click)=\"toggleExpand(row)\">\r\n <span\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n <strong (click)=\"toggleExpand(row)\" class=\"cursor-pointer\">\r\n {{ row.groupValue }} ({{ countLeafRows(row) }})\r\n </strong>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'right'\"\r\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n ></div>\r\n </div>\r\n\r\n <!-- Recursive Children -->\r\n <div class=\"group-children\" *ngIf=\"row.isExpand\">\r\n <ng-container\r\n *ngFor=\"let child of row.children; let i = index; trackBy: trackById\"\r\n >\r\n <ng-container *ngIf=\"child.isGroup; else dataRow\">\r\n <!-- Recursive call for nested group -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n groupRowTemplate;\r\n context: { $implicit: child, depth: depth + 1 }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #dataRow>\r\n <!-- Regular data row -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n rowCell;\r\n context: {\r\n $implicit: child,\r\n columns: columns,\r\n isEven: i % 2 === 0,\r\n isOdd: i % 2 !== 0,\r\n isLeft: isLeftSection,\r\n section: section\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Regular row (not a group) -->\r\n <ng-template #regularRow>\r\n <div class=\"d-flex\" [style.height.px]=\"rowHeight\">\r\n <span\r\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n style=\"min-width: 30px; height: 100%;\"\r\n *ngIf=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'start' && !areDatesSelectedAndEqual\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n <div\r\n [style.min-width.px]=\"\r\n section == 'center' && groupedColumns!.length ? groupBoxPadding : 0\r\n \"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n (contextmenu)=\"onRightClick($event, row, row?.details?.data?.length ? 'accordion-parent' : 'main')\"\r\n [style.height.px]=\"rowHeight\"\r\n class=\"data-grid-row h-100\"\r\n [class.even-row]=\"isEven\"\r\n [class.odd-row]=\"isOdd\"\r\n [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\r\n (mouseenter)=\"onRowHover(row)\"\r\n (mouseleave)=\"onRowLeave()\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n ></div>\r\n <div\r\n (contextmenu)=\"onRightClick($event, row, row?.details?.data?.length ? 'accordion-parent' : 'main')\"\r\n [style.height.px]=\"rowHeight\"\r\n class=\"data-grid-row\"\r\n [class.even-row]=\"isEven\"\r\n [class.odd-row]=\"isOdd\"\r\n [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\r\n (mouseenter)=\"onRowHover(row)\"\r\n (mouseleave)=\"onRowLeave()\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <div\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell justify-content-end pe-2 s-no\"\r\n [style.width.px]=\"65\"\r\n *ngIf=\"isLeftSection && showSerialNumber\"\r\n [style.cursor]=\"\r\n 'url(' +\r\n singleSpaAssetsPath +\r\n 'data-grid/icons/arrow-right.svg), auto'\r\n \"\r\n (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\r\n (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\r\n >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\r\n [style.backgroundColor]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n ? selectedRowsBackgroundColor\r\n : checkboxesBackgroundColor\r\n \"\r\n class=\"select-all-checkbox-cell\"\r\n *ngIf=\"isLeftSection\"\r\n [class.left-selection-border]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n \"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [checked]=\"isRowSelected(row)\"\r\n (change)=\"toggleRowSelection(row)\"\r\n />\r\n </div>\r\n\r\n <!-- Render all columns -->\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns;\r\n trackBy: trackByField;\r\n let colIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatColumn\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n trackBy: trackByField;\r\n let subColIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"child?.is_visible && !child?.isRowGrouped\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellTemplate;\r\n context: {\r\n col: child,\r\n row: row,\r\n rowIndex: rowIndex,\r\n colIndex: colIndex,\r\n subColIndex: subColIndex,\r\n section: section\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #flatColumn>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellTemplate;\r\n context: {\r\n col: col,\r\n row: row,\r\n rowIndex: rowIndex,\r\n colIndex: colIndex,\r\n subColIndex: null,\r\n section: section\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <span\r\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n style=\"min-width: 30px; height: 100%;\"\r\n *ngIf=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'end' && !areDatesSelectedAndEqual\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n </div>\r\n <!-- LEFT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'left' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" [style.color]=\"headerTextColor\" style=\"max-height: 350px; min-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\" [class.show-shadow]=\"rowShadingEnabled\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\" [style.color]=\"headerTextColor\" [style.fontSize.px]=\"headerTextFontsSize\" [style.fontWeight]=\"headerFontWeight\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n<!-- CENTER SECTION: Actual details table -->\r\n\r\n<div *ngIf=\"section === 'center' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details-wrapper data-grid-accordion\" [style.fontFamily]=\"fontFaimly\" [style.fontSize.px]=\"bodyTextFontsSize\" style=\"display: flex; width: 100%; max-height: 350px; min-height: 350px; overflow: hidden;\">\r\n <!-- LEFT SECTION OF ACCORDION -->\r\n <div #leftContainer class=\"accordion-left-section data-pin-body-wrapper data-grid-accordion-section\" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailLeftScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-borders]=\"showVerticalBorder\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\" [style.color]=\"headerTextColor\" [style.fontSize.px]=\"headerTextFontsSize\" [style.fontWeight]=\"headerFontWeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4 border-right\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n <div class=\"resize-handles\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'left')\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n [style.fontSize.px]=\"nestedTablerowFontsize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n <!-- Use the same rendering logic as center section -->\r\n <ng-container [ngSwitch]=\"col.field\">\r\n\r\n <ng-container *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\">\r\n <ng-container *ngIf=\"d.manually_logs?.length > 0; else noManualLogsIcon\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon text-primary\"\r\n style=\"cursor: pointer; font-size: 16px;\"\r\n (mouseenter)=\"showManualLogsTooltip($event, row, d)\"\r\n (mouseleave)=\"hideManualLogsTooltip()\">\r\n </span>\r\n </ng-container>\r\n <ng-template #noManualLogsIcon>–</ng-template>\r\n</ng-container>\r\n <!-- Breaks -->\r\n <ng-container *ngSwitchCase=\"'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaksLeft\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(d[col.field])\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onDetailBadgeOverflowCountClick(col, d)\">\r\n</app-badge-overflow>\r\n </ng-container>\r\n <ng-template #noBreaksLeft>\r\n <div >\r\n -\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Breaks -->\r\n <ng-container *ngSwitchCase=\"'short_breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.duration; else noShortBreakLeft\">\r\n <div class=\"circle-value\"\r\n [ngClass]=\"(d[col.field].type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (d[col.field].type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (d[col.field].type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showShortBreakTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideShortBreakTooltip()\"\r\n (dblclick)=\"onShortBreakClick.emit(d)\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortBreakLeft>\r\n <div >-</div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Leave -->\r\n <!-- Short Leave -->\r\n<ng-container *ngSwitchCase=\"'short_leave'\">\r\n <ng-container *ngIf=\"row.short_leave && row.short_leave.length > 0; else noShortLeaveMain\">\r\n <div class=\"w-100 d-flex main-progress-bar justify-content-center align-items-center\" \r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, row)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <span class=\"d-block\" [style.min-width.%]=\"row.short_leave[0].short_leave_time_percentage\" \r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">\r\n {{ row.short_leave[0].short_leave_time_percentage }}%\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveMain>-</ng-template>\r\n</ng-container>\r\n\r\n<div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n <div *ngSwitchCase=\"'is_payroll_processed'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" >\r\n <span class=\"\" >\r\n {{ d.is_payroll_processed ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n\r\n <!-- Status -->\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noStatus\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noStatus>-</ng-template>\r\n</ng-container>\r\n\r\n<!-- Attendance Status -->\r\n<ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noAttendanceStatus\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noAttendanceStatus>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Default fallback -->\r\n <ng-container *ngSwitchDefault>\r\n {{ getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-' }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- CENTER SECTION OF ACCORDION (WITH VIRTUAL SCROLL) -->\r\n\r\n<div class=\"accordion-center-section data-grid-accordion-section\" style=\"flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden;\">\r\n <!-- Header Section -->\r\n <div class=\"header-container\" style=\"overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none;\" #headerContainer (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-borders]=\"showVerticalBorder\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: 100%;\">\r\n <thead>\r\n <tr\r\n [style.height.px]=\"nestedTableHeaderRowHeight\"\r\n cdkDropList\r\n [cdkDropListData]=\"row?.details.columns\"\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"dropColumn($event, row)\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let i = index\">\r\n <th\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n cdkDrag\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n [style.color]=\"headerTextColor\"\r\n [style.fontSize.px]=\"headerTextFontsSize\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n style=\"cursor: move; position: relative;\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span *ngIf=\"col.pinned\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\" class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span\r\n class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n </div>\r\n <div class=\"resize-handles\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\" [style.top.px]=\"nestedTableHeaderRowHeight\" [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n\r\n <!-- Group Badges (if any) -->\r\n <div *ngIf=\"row.details?.groupedColumns?.length\" class=\"detail-group-badges\">\r\n <span *ngFor=\"let g of row.details.groupedColumns; trackBy: trackByField\" class=\"badge bg-light text-dark me-1\">\r\n {{ g.header }}\r\n <span class=\"ms-1 cursor-pointer\" (click)=\"ungroupDetailColumn(g, row)\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"></span>\r\n </span>\r\n </div>\r\n\r\n <!-- Data Table Section with Virtual Scroll -->\r\n <cdk-virtual-scroll-viewport\r\n itemSize=\"{{ nestedTablerowHeight }}\"\r\n minBufferPx=\"200\"\r\n maxBufferPx=\"400\"\r\n class=\"detail-virtual-scroll\"\r\n [attr.data-detail-row-id]=\"row._id || row.id\"\r\n style=\"flex: 1; overflow: auto;\"\r\n #dataContainer\r\n (scroll)=\"syncVerticalScroll($event)\"\r\n (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-borders]=\"showVerticalBorder\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: 100%;\">\r\n <tbody>\r\n <tr\r\n class=\"cursor-pointer data-grid-accordion-row\"\r\n *cdkVirtualFor=\"let d of row.details.data; trackBy: trackById; let j = index\"\r\n (contextmenu)=\"onRightClick($event, d, 'accordion-child')\"\r\n [style.height.px]=\"nestedTablerowHeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let k = index\">\r\n <td\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, k, col.field, 'center')\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\"\r\n style=\"cursor: pointer; position: relative; overflow: visible; cursor: cell; \">\r\n <div class=\"time-sheet-container\" style=\"overflow: visible; display: flex; gap: 4px; align-items: center; height: 100%; justify-content: center;\">\r\n <ng-container *ngIf=\"col.field === 'breaks' || col.field === 'short_breaks'; else defaultDetailCell\">\r\n <ng-container *ngIf=\"col.field === 'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaks\">\r\n <span *ngFor=\"let breakItem of d[col.field]; let breakIndex = index\"\r\n class=\"circle-value badge-outline break-on text-center\"\r\n [ngClass]=\"(breakItem.break_type?.data_value_name?.toLowerCase() || breakItem.breakType?.toLowerCase()) === 'paid' ? 'break-color-paid' : (breakItem.break_type?.data_value_name?.toLowerCase() || breakItem.breakType?.toLowerCase()) === 'unpaid' ? 'break-color-unpaid' : (breakItem.break_type?.data_value_name?.toLowerCase() || breakItem.breakType?.toLowerCase()) === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showBreakTooltip($event, breakItem)\"\r\n (mouseleave)=\"hideBreakTooltip()\">\r\n {{ breakItem.break_duration }}m\r\n</span>\r\n </ng-container>\r\n <ng-template #noBreaks>\r\n <div\r\n \r\n >\r\n -\r\n</div>\r\n</ng-template>\r\n</ng-container>\r\n <ng-container *ngIf=\"col.field === 'short_breaks' && !isDetailEditing(row, d, col)\">\r\n <div *ngIf=\"d[col.field]?.duration; else noShortBreak\"\r\n class=\"circle-value\"\r\n [ngClass]=\"(d[col.field].type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (d[col.field].type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (d[col.field].type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showShortBreakTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideShortBreakTooltip()\"\r\n (dblclick)=\"onShortBreakClick.emit(d)\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n <ng-template #noShortBreak>\r\n <div >-</div>\r\n </ng-template>\r\n</ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <input #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" [attr.data-edit-key]=\"row._id + '-' + j + '-' + col.field\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto; position: absolute; top: 0; left: 0; z-index: 10;\" />\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultDetailCell>\r\n <span class=\"d-flex align-items-center h-100\">\r\n <ng-container *ngIf=\"!isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n <!-- ✅ SHORT LEAVE: Progress bar in detail rows -->\r\n <div *ngSwitchCase=\"'short_leave'\" class=\"position-relative\" style=\"min-width: 100px; width: 150px;\">\r\n <ng-container *ngIf=\"d.short_leave && d.short_leave.length > 0; else noShortLeaveDetail\">\r\n <div\r\n class=\"w-100 d-flex main-progress-bar\"\r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, d)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\"\r\n >\r\n <span\r\n class=\"d-block\"\r\n [style.min-width.%]=\"d.short_leave[0].short_leave_time_percentage\"\r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"\r\n ></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">{{ d.short_leave[0].short_leave_time_percentage }}%</span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveDetail>\r\n <div >-</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Status -->\r\n<ng-container *ngSwitchCase=\"'status'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noStatus\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noStatus>-</ng-template>\r\n</ng-container>\r\n\r\n<!-- Attendance Status -->\r\n<ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noAttendanceStatus\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noAttendanceStatus>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Existing cases -->\r\n <div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"popover__wrapper\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n <div *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\">\r\n <ng-container *ngIf=\"d.manually_logs?.length > 0; else noManualLogsIcon\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\" class=\"data-grid-svg-icon text-primary\" style=\"cursor: pointer; font-size: 16px;\" (mouseenter)=\"showManualLogsTooltip($event, row, d)\" (mouseleave)=\"hideManualLogsTooltip()\"></span>\r\n </ng-container>\r\n <ng-template #noManualLogsIcon>\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\" class=\"data-grid-svg-icon text-muted\" style=\"font-size: 16px; cursor: not-allowed;\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Default fallback -->\r\n <span *ngSwitchDefault>\r\n {{\r\n col.type === 'date'\r\n ? (getNestedValue(d, col.field) ? (getNestedValue(d, col.field) | timezoneFormat:prefs:'date') : '-')\r\n : col.type === 'time'\r\n ? ((getTimeValue(getNestedValue(d, col.field)) | timezoneFormat:prefs:'time'))\r\n : (getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-')\r\n }}\r\n </span>\r\n</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <input *ngSwitchCase=\"'string'\" #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'number'\" #detailInput type=\"number\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'date'\" #detailInput type=\"date\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'time'\" #detailInput type=\"time\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'currency'\" #detailInput type=\"number\" step=\"0.01\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm text-end\" style=\"width: 100%; height: auto;\" />\r\n <select *ngSwitchCase=\"'dropdown'\" #detailInput [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\">\r\n <option *ngFor=\"let option of col.column_dropdown_value\" [ngValue]=\"option?.value || option\">\r\n {{ option?.label || option?.name || option }}\r\n </option>\r\n </select>\r\n <input *ngSwitchDefault #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n\r\n <!-- RIGHT SECTION OF ACCORDION -->\r\n <div #rightContainer class=\"accordion-right-section data-pin-body-wrapper \" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailRightScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table-sm mb-0 data-grid-accordion-table\" [class.show-shadow]=\"rowShadingEnabled\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\" [style.color]=\"headerTextColor\" [style.fontSize.px]=\"headerTextFontsSize\" [style.fontWeight]=\"headerFontWeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n\r\n <div class=\"resize-handles\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"rowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'right')\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n\r\n <ng-container *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\">\r\n <ng-container *ngIf=\"d.manually_logs?.length > 0; else noManualLogsIcon\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon text-primary\"\r\n style=\"cursor: pointer; font-size: 16px;\"\r\n (mouseenter)=\"showManualLogsTooltip($event, row, d)\"\r\n (mouseleave)=\"hideManualLogsTooltip()\">\r\n </span>\r\n </ng-container>\r\n <ng-template #noManualLogsIcon>–</ng-template>\r\n</ng-container>\r\n <!-- Breaks -->\r\n <ng-container *ngSwitchCase=\"'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaksLeft\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(d[col.field])\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onDetailBadgeOverflowCountClick(col, d)\">\r\n</app-badge-overflow>\r\n </ng-container>\r\n <ng-template #noBreaksLeft>\r\n <div>\r\n -\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n <div *ngSwitchCase=\"'is_payroll_processed'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" >\r\n <span class=\"\" >\r\n {{ d.is_payroll_processed ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n\r\n <!-- Short Breaks -->\r\n <ng-container *ngSwitchCase=\"'short_breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.duration; else noShortBreakLeft\">\r\n <div class=\"circle-value\"\r\n [ngClass]=\"(d[col.field].type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (d[col.field].type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (d[col.field].type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\"\r\n (mouseenter)=\"showShortBreakTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideShortBreakTooltip()\"\r\n (dblclick)=\"onShortBreakClick.emit(d)\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortBreakLeft>\r\n <div >-</div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Leave -->\r\n <!-- Short Leave -->\r\n<ng-container *ngSwitchCase=\"'short_leave'\">\r\n <ng-container *ngIf=\"row.short_leave && row.short_leave.length > 0; else noShortLeaveMain\">\r\n <div class=\"w-100 d-flex main-progress-bar justify-content-center align-items-center\" \r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, row)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <span class=\"d-block\" [style.min-width.%]=\"row.short_leave[0].short_leave_time_percentage\" \r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">\r\n {{ row.short_leave[0].short_leave_time_percentage }}%\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveMain>-</ng-template>\r\n</ng-container>\r\n\r\n<ng-container *ngSwitchCase=\"'status'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noStatus\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noStatus>-</ng-template>\r\n</ng-container>\r\n\r\n<!-- Attendance Status -->\r\n<ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <ng-container *ngIf=\"getNestedValue(d, col.field); else noAttendanceStatus\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(d, col.field))\">\r\n {{ transformStatus(getNestedValue(d, col.field)) }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noAttendanceStatus>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Default -->\r\n <ng-container *ngSwitchDefault>\r\n {{ getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-' }}\r\n </ng-container>\r\n</ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n\r\n </div>\r\n\r\n <!-- DETAIL SIDE MENU (Sticky on right end) -->\r\n <div class=\"detail-side-menu-wrapper\" >\r\n <div style=\"width: 30px\" class=\"d-flex flex-column align-items-center \">\r\n <div (click)=\"toggleDetailSideMenu(row, 'cols')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'cols'\" class=\"columns-button d-flex flex-column align-items-center border-below\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Columns</div>\r\n </div>\r\n <!-- <div (click)=\"toggleDetailSideMenu(row, 'filtrs')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'filtrs'\" class=\"columns-button d-flex flex-column align-items-center\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Filter</div>\r\n </div> -->\r\n </div>\r\n\r\n <div *ngIf=\"row.details.sideMenu?.currentTab\" class=\"detail-side-menu-content\" [style.backgroundColor]=\"sidemenuBackgroundColor\" style=\"width: 250px; box-shadow: -2px 0 5px rgba(0,0,0,0.1);\">\r\n <!-- COLUMNS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'cols'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Columns</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"d-flex align-items-center mb-2\">\r\n <input type=\"checkbox\" class=\"form-check-input me-2\" [(ngModel)]=\"col.is_visible\" (change)=\"onDetailColumnVisibilityChange(row)\" />\r\n <span>{{ col.header }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- FILTERS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'filtrs'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Filters</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center cursor-pointer\" (click)=\"col.expandedFilter = !col.expandedFilter\">\r\n <label class=\"mb-0 small\">{{ col.header }}</label>\r\n <span class=\"toggle-icon data-grid-svg-icon\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\" [class.rotate]=\"col.expandedFilter\"></span>\r\n </div>\r\n <div *ngIf=\"col.expandedFilter\" class=\"mt-2 filter-input-container ps-3 pe-3\">\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n row.details.filters[col.field]?._ids?.length == col.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllDetailFilters(col, row, $event)\"\r\n id=\"detail_selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1 ms-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : col.searchValue : 'value';\r\n trackBy: trackById\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [value]=\"option\"\r\n [checked]=\"\r\n row.details.filters[col.field]?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n (change)=\"onDetailOptionToggle(col, option, row)\"\r\n id=\"detail_option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n />\r\n <label\r\n class=\"form-check-label\"\r\n [for]=\"\r\n 'detail_option_' +\r\n col.field +\r\n '_' +\r\n (option?.id || option?._id || option)\r\n \"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #textFilter>\r\n <div class=\"filter-text-section\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"row.details.filters[col.field].first_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : 'text'\"\r\n class=\"form-control form-control-sm mb-3\"\r\n placeholder=\"Value\"\r\n [(ngModel)]=\"row.details.filters[col.field].first_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n />\r\n\r\n <ng-container *ngIf=\"row.details.filters[col.field]?.first_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"and\"\r\n id=\"detail_and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"or\"\r\n id=\"detail_or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"none\"\r\n id=\"detail_none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"row.details.filters[col.field].condition !== 'none'\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : 'text'\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n />\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Side Menu -->\r\n\r\n\r\n\r\n<!-- Popover for Restriction Logs (is_un_restricted) -->\r\n<div\r\n *ngIf=\"restrictionTooltipVisible\"\r\n class=\"popover__content m-l-10 popoverRestriction position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"restrictionTooltipPosition.x\"\r\n [style.top.px]=\"restrictionTooltipPosition.y\"\r\n (mouseenter)=\"preventRestrictionTooltipHide()\"\r\n (mouseleave)=\"hideRestrictionTooltip()\"\r\n style=\"z-index: 1000; min-width: 300px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\">Clock in</th>\r\n <th class=\"center\">Clock out</th>\r\n <th class=\"center\">Log Hr</th>\r\n <th class=\"center\">Log Min</th>\r\n <th class=\"center pe-2\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of currentRestrictionLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\"> {{ item?.clock_in_time | date:'shortTime'}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.clock_out_time | date:'shortTime'}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_hours }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_minutes }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ item?.status ? (item.status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Popover for Manual Logs -->\r\n<div\r\n *ngIf=\"manualLogsTooltipVisible\"\r\n class=\"popover__content position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"manualLogsTooltipPosition.x\"\r\n [style.top.px]=\"manualLogsTooltipPosition.y\"\r\n (mouseenter)=\"preventManualLogsTooltipHide()\"\r\n (mouseleave)=\"hideManualLogsTooltip()\"\r\n style=\"z-index: 1000; min-width: 500px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <ng-container *ngIf=\"currentManualLogs.length > 0; else noManualLogs\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\" style=\"width: 18%;\">Name</th>\r\n <th class=\"center\">Date/Time</th>\r\n <th class=\"center\">Previous Time</th>\r\n <th class=\"center\">Updated Time</th>\r\n <th class=\"center\">Status</th>\r\n <th class=\"center pe-2\">Remarks</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let log of currentManualLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\">{{ log.name }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.date_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.previous_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.updated_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ log.log_status ? (log.log_status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n <td class=\"center pe-2\">\r\n <span class=\"text-primary\">{{ log.remarks }}</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-template #noManualLogs>\r\n <div class=\"text-center p-3\">\r\n <p class=\"text-muted mb-0\">No manual logs available for this record.</p>\r\n </div>\r\n </ng-template>\r\n</div>\r\n\r\n\r\n\r\n\r\n<!-- Existing Custom Tooltip for Breaks -->\r\n\r\n\r\n\r\n\r\n\r\n <!-- RIGHT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'right' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" style=\"max-height: 350px; min-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\" [class.show-shadow]=\"rowShadingEnabled\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\">&nbsp;</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\">&nbsp;</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </ng-template>\r\n</ng-template>\r\n\r\n<!-- Actual Cell is Here -->\r\n<ng-template\r\n #cellTemplate\r\n let-col=\"col\"\r\n let-row=\"row\"\r\n let-section=\"section\"\r\n let-subColIndex=\"subColIndex\"\r\n let-rowIndex=\"rowIndex\"\r\n let-colIndex=\"colIndex\"\r\n>\r\n <div\r\n (click)=\"disableEdit(row, col); setActiveCell(row, col)\"\r\n [style.fontWeight]=\"bodyFontWeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n class=\"cell overflow-visible position-relative\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n [class.active-cell]=\"\r\n isActiveCell(row, col) && !isEditing(row, col) && selectedKeys.size == 1\r\n \"\r\n (dblclick)=\"$event.preventDefault(); enableEdit(row, col)\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"$event.preventDefault(); enableEdit(row, col)\"\r\n (mousedown)=\"\r\n startSelection(\r\n row.__virtualIndex,\r\n colIndex,\r\n subColIndex ?? 0,\r\n col.field,\r\n $event,\r\n section\r\n )\r\n \"\r\n (mouseenter)=\"\r\n extendSelection(\r\n row.__virtualIndex,\r\n colIndex,\r\n subColIndex ?? 0,\r\n col.field,\r\n $event,\r\n section\r\n )\r\n \"\r\n (mouseup)=\"endSelection()\"\r\n [class.selected-cell]=\"\r\n isSelected(\r\n row.__virtualIndex,\r\n colIndex,\r\n subColIndex ?? 0,\r\n col.field,\r\n section\r\n )\r\n \"\r\n [class.top-border]=\"\r\n isTopBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.bottom-border]=\"\r\n isBottomBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.left-border]=\"\r\n isLeftBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.right-border]=\"\r\n isRightBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.top-left-corner]=\"\r\n isTopLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.top-right-corner]=\"\r\n isTopRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.bottom-left-corner]=\"\r\n isBottomLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n [class.bottom-right-corner]=\"\r\n isBottomRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n \"\r\n >\r\n <!-- (mousedown)=\"startSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\r\n (mouseenter)=\"extendSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\r\n (mouseup)=\"endSelection()\"\r\n [class.selected-cell]=\"isSelected(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field)\" -->\r\n <div class=\"table-cell\" [class.active-for-editing]=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50\">\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50; else viewMode\"\r\n >\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <!-- Text Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 10\"\r\n *ngSwitchCase=\"'input'\"\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Number Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'number'\"\r\n #numberInput=\"ngModel\"\r\n #numberRef\r\n (keypress)=\"allowOnlyNumbers($event)\"\r\n type=\"number\"\r\n required\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n (keydown.enter)=\"numberRef.blur()\"\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': numberInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Date Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'date'\"\r\n type=\"date\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n #dateInput=\"ngModel\"\r\n [ngClass]=\"{\r\n 'is-invalid': dateInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Dropdown -->\r\n <!-- ng-select like dropdown -->\r\n <div\r\n *ngSwitchCase=\"'dropdown'\"\r\n class=\"dropdown w-100\"\r\n (blur)=\"disableEdit(row, col)\"\r\n >\r\n <!-- Trigger -->\r\n <button\r\n class=\"form-select form-select-sm text-start w-100 text-ellipsis\"\r\n type=\"button\"\r\n data-bs-toggle=\"dropdown\"\r\n aria-expanded=\"false\"\r\n [style.minHeight.px]=\"rowHeight - 10\"\r\n data-bs-display=\"static\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container>\r\n {{\r\n getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field)\r\n }}\r\n </ng-container>\r\n <ng-template #placeholder> Select options... </ng-template>\r\n </button>\r\n\r\n <!-- Menu -->\r\n <div\r\n class=\"dropdown-menu w-100 p-0 cell-editing-dropdown-menu rounded-3\"\r\n [class.show]=\"isEditing(row, col)\"\r\n >\r\n <!-- Search -->\r\n <div class=\"px-2 py-1\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"editinDropdownSearch\"\r\n />\r\n </div>\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"cell-editin-dropdown\"\r\n style=\"max-height: 200px; overflow: auto\"\r\n >\r\n <div\r\n (click)=\"\r\n setNestedValue(row, col, option, true);\r\n disableEdit(row, col)\r\n \"\r\n class=\"px-2 py-1 d-flex align-items-center item\"\r\n *ngFor=\"\r\n let option of col.column_dropdown_value\r\n | filter : editinDropdownSearch : 'value'\r\n \"\r\n >\r\n <label\r\n class=\"form-check-label d-flex align-items-center mb-0\"\r\n [for]=\"col.field + '-' + option.value || option\"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <input\r\n *ngSwitchCase=\"'email'\"\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #emailModel=\"ngModel\"\r\n #emailInput\r\n type=\"email\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n pattern=\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\r\n (blur)=\"disableEdit(row, col, emailModel)\"\r\n (keydown.enter)=\"\r\n emailModel.control.markAsTouched(); emailInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': emailModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n <!-- Default fallback -->\r\n <input\r\n *ngSwitchDefault\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #textModel=\"ngModel\"\r\n #textInput\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n (blur)=\"disableEdit(row, col, textModel)\"\r\n (keydown.enter)=\"\r\n textModel.control.markAsTouched(); textInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': textModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Display mode -->\r\n <ng-template #viewMode>\r\n <div\r\n class=\"d-flex justify-between items-center w-100\"\r\n [ngClass]=\"getCellClasses(col, getNestedValue(row, col.field))\"\r\n >\r\n <!-- Text cell -->\r\n <div class=\"d-flex align-items-center w-100\">\r\n <div\r\n #cellText\r\n class=\"text-ellipsis flex-grow-1\"\r\n [title]=\"\r\n col.type === 'date'\r\n ? (getNestedValue(row, col.field) | date : dateFormat)\r\n : getNestedValue(row, col.field)\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.type !== 'image'\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n <!-- Breaks -->\r\n <ng-container *ngSwitchCase=\"'breaks'\">\r\n <ng-container *ngIf=\"getNestedValue(row, 'breaks')?.length; else noBreaksMain\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(getNestedValue(row, 'breaks'))\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onBadgeOverflowCountClick(col)\">\r\n </app-badge-overflow>\r\n </ng-container>\r\n <ng-template #noBreaksMain>\r\n <div >\r\n -\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Breaks -->\r\n <ng-container *ngSwitchCase=\"'short_breaks'\">\r\n <ng-container *ngIf=\"row.short_breaks?.duration && row.short_breaks.duration > 0; else noShortBreak\">\r\n <span class=\"popover__wrapper d-flex justify-content-center align-items-center\" style=\"cursor: pointer;\" (dblclick)=\"onShortBreakClick.emit(row)\" (mouseenter)=\"showShortBreakTooltip($event, row.short_breaks)\" (mouseleave)=\"hideShortBreakTooltip()\">\r\n <span class=\"circle-value badge-outline text-center\" [ngClass]=\"(row.short_breaks.type || '').toLowerCase() === 'paid' ? 'break-color-paid' : (row.short_breaks.type || '').toLowerCase() === 'unpaid' ? 'break-color-unpaid' : (row.short_breaks.type || '').toLowerCase() === 'lunch' ? 'break-color-lunch' : 'break-color-default'\">\r\n {{ row.short_breaks.duration }}m\r\n </span>\r\n </span>\r\n </ng-container>\r\n <ng-template #noShortBreak>\r\n <div >-</div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Short Leave -->\r\n <!-- Short Leave -->\r\n<ng-container *ngSwitchCase=\"'short_leave'\">\r\n <ng-container *ngIf=\"row.short_leave && row.short_leave.length > 0; else noShortLeaveMain\">\r\n <div class=\"w-100 d-flex main-progress-bar justify-content-center align-items-center\" \r\n style=\"background-color: rgb(111, 97, 207); height: 20px; border-radius: 4px; position: relative;\"\r\n (mouseenter)=\"showShortLeaveTooltip($event, row)\"\r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <span class=\"d-block\" [style.min-width.%]=\"row.short_leave[0].short_leave_time_percentage\" \r\n style=\"background-color: rgb(238, 99, 82); height: 100%; border-radius: 4px;\"></span>\r\n <span style=\"position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: bold;\">\r\n {{ row.short_leave[0].short_leave_time_percentage }}%\r\n </span>\r\n </div>\r\n </ng-container>\r\n <ng-template #noShortLeaveMain>-</ng-template>\r\n</ng-container>\r\n\r\n <!-- Status -->\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(row, col.field))\">\r\n {{ transformStatus(getNestedValue(row, col.field)) || '-' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Attendance Status -->\r\n <ng-container *ngSwitchCase=\"'attendanceStatus'\">\r\n <span class=\"badge\" [class]=\"getAttendanceStatusBadgeClass(getNestedValue(row, col.field))\">\r\n {{ transformStatus(getNestedValue(row, col.field)) || '-' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Payroll Processed -->\r\n <ng-container *ngSwitchCase=\"'is_payroll_processed'\">\r\n <span class=\"badge\" [class]=\"getNestedValue(row, col.field) ? 'badge-success' : 'badge-secondary'\">\r\n {{ getNestedValue(row, col.field) ? 'Yes' : 'No' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Restriction -->\r\n <ng-container *ngSwitchCase=\"'is_un_restricted'\">\r\n <span class=\"badge\" [class]=\"getNestedValue(row, col.field) ? 'badge-success' : 'badge-secondary'\">\r\n {{ getNestedValue(row, col.field) ? 'Yes' : 'No' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Default -->\r\n <ng-container *ngSwitchDefault>\r\n {{\r\n !isNestedValueArray(row, col.field)\r\n ? col.type === 'date'\r\n ? (isDate(getNestedValue(row, col.field))\r\n ? ((getNestedValue(row, col.field)) | timezoneFormat:prefs:'date' )\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-'))\r\n : col.type === 'time'\r\n ? ((getTimeValue(getNestedValue(row, col.field)) | timezoneFormat:prefs:'time'))\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-')\r\n : (getNestedValue(row, col.field)?.[0]?.department_name ||\r\n getNestedValue(row, col.field)?.[0]?.roleName ||\r\n '-')\r\n }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"col.type == 'image'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n defaultImagePlaceholder;\r\n context: {\r\n row: row,\r\n col: col,\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Active dot and eye icon for employee name -->\r\n <span *ngIf=\"col.field === 'User' && hasManualLogs(row) && !row.isDetailsExpand\" class=\"badge badge-dot badge-success ms-1\" (mouseenter)=\"showManualLogsTooltip($event, row, row)\"></span>\r\n <i *ngIf=\"col.field === 'User' && hasManualLogs(row)\" class=\"bi bi-eye ms-1\" (mouseenter)=\"showManualLogsTooltip($event, row, row)\"></i>\r\n </div>\r\n\r\n <!-- Expand / Collapse icon for multiple data showing in one coll-->\r\n\r\n <!-- <span\r\n *ngIf=\"\r\n (isOverflowing(cellText) &&\r\n showCellDetailsBox &&\r\n getNestedValue(row, col.field)?.length > 50) ||\r\n (isNestedValueArray(row, col.field) &&\r\n getNestedValue(row, col.field)?.length > 1)\r\n \"\r\n class=\"toggle-icon data-grid-svg-icon ms-2 cursor-pointer\"\r\n [inlineSVG]=\"\r\n isExpanded(row, col)\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"\r\n $event.stopPropagation();\r\n toggleExpandOfLongCellText(row, col, columns, true)\r\n \"\r\n (dblclick)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n ></span> -->\r\n </div>\r\n\r\n <!-- Expanded text -->\r\n <div\r\n class=\"position-absolute w-100\"\r\n *ngIf=\"isExpanded(row, col)\"\r\n [style.zIndex]=\"getZIndex(row, col)\"\r\n style=\"top: 100%; left: 0\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n fullTextTemplate;\r\n context: {\r\n row: row,\r\n col: col,\r\n isArray: isNestedValueArray(row, col.field)\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n\r\n \r\n\r\n\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div\r\n *ngIf=\"currentBreakTooltip\"\r\n class=\"custom-break-tooltip\"\r\n [style.--tooltip-x.px]=\"tooltipPosition.x\"\r\n [style.--tooltip-y.px]=\"tooltipPosition.y\"\r\n>\r\n <div class=\"break-tooltip-header\">\r\n <strong>{{ currentBreakTooltip.break_type?.data_value_name || 'Break' }}</strong>\r\n <span class=\"text-muted ms-2\">\r\n {{ currentBreakTooltip.breakInstatus === 'breakOut' ? 'Taken' : 'On Break' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"break-tooltip-body\">\r\n <div>\r\n <i class=\"bi bi-play-circle\"></i>\r\n In: {{ getTimeValue(currentBreakTooltip.break_in_time) | timezoneFormat:prefs:'time' }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-stop-circle\"></i>\r\n Out: {{ getTimeValue(currentBreakTooltip.break_out_time) | timezoneFormat:prefs:'time' }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-clock\"></i>\r\n Duration: {{ currentBreakTooltip.break_duration }} min\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n<!-- Short Break Tooltip -->\r\n<div\r\n *ngIf=\"currentShortBreakTooltip\"\r\n class=\"custom-break-tooltip\"\r\n [style.--tooltip-x.px]=\"tooltipPosition.x\"\r\n [style.--tooltip-y.px]=\"tooltipPosition.y\"\r\n>\r\n <div class=\"break-tooltip-header\">\r\n <strong>{{ currentShortBreakTooltip.short_break_name || 'Short Break' }}</strong>\r\n </div>\r\n\r\n <div class=\"break-tooltip-body\">\r\n <div>\r\n <i class=\"bi bi-play-circle\"></i>\r\n Start: {{ getTimeValue(currentShortBreakTooltip.start_time) | timezoneFormat:prefs:'time' }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-stop-circle\"></i>\r\n End: {{ getTimeValue(currentShortBreakTooltip.end_time) | timezoneFormat:prefs:'time' }}\r\n </div>\r\n\r\n <div>\r\n <i class=\"bi bi-clock\"></i>\r\n Duration: {{ currentShortBreakTooltip.short_break_duration }} min\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n<!-- Headers Action List On clicking three dots -->\r\n\r\n<ng-template #columnMenu let-col=\"col\">\r\n <div\r\n class=\"column-menu three-dots-col-menu\"\r\n [class.visually-hidden]=\"isMenueHidden\"\r\n *ngIf=\"activeCol && !isThreeDotsFilterOpen && !loading\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Sort Ascending -->\r\n <div class=\"border-below pb-2\" [class.disable-sorting]=\"!col.is_sortable\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span>\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showAscending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortAsc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-up.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Ascending\r\n </div>\r\n\r\n <!-- Sort Descending -->\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showDescending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'asc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDesc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-down.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Descending\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n sortingConfig?.field === col.field &&\r\n (sortingConfig?.order_by === 'asc' ||\r\n sortingConfig?.order_by === 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"resetSort(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Reset Sort\r\n </div>\r\n </div>\r\n <div class=\"py-2 border-below three-dots-filter\">\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showFilter && !(col.is_search_able === false )\"\r\n class=\"column-menu-item three-dots-filter\"\r\n (click)=\"openFilteronThreeDotsClick(col)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Filter\r\n </div>\r\n </div>\r\n\r\n <div class=\"py-2 border-below\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, 'left')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-left.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Left\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showPinright && col?.pinned !== 'right'\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, 'right')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-right.svg'\"\r\n class=\"data-grid-svg-icon data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Right\r\n </div>\r\n\r\n <div\r\n *ngIf=\"col?.pinned\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, null)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/layout-three-columns.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Unpin\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeThisColumn\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeColumn(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-expand-vertical.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Autosize This Column\r\n </div>\r\n\r\n <!-- Autosize All Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeAllColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeAllColumns()\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-angle-expand.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Autosize All Columns\r\n </div>\r\n\r\n <!-- Group By -->\r\n <div\r\n *ngIf=\"showRowsGrouping && !(col.is_groupable === false)\"\r\n class=\"column-menu-item\"\r\n (click)=\"groupBy(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/diagram-3.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Group by {{ col.header }}\r\n </div>\r\n\r\n <!-- Choose Columns -->\r\n <!-- <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showChoseColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"chooseColumns()\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Choose Columns\r\n </div> -->\r\n\r\n <!-- Reset Columns -->\r\n <!-- <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showResetColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetColumns()\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Reset Columns\r\n </div> -->\r\n </div>\r\n <div *ngIf=\"isThreeDotsFilterOpen\" class=\"three-dots-col-menu position-relative\" [style.left.px]=\"-140\" >\r\n <ng-container\r\n *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<!-- Filter Menue -->\r\n<ng-template #filterMenu let-col=\"col\">\r\n <div\r\n class=\"filter-menu-container filter-menu\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"filter-dropdown-section p-1\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"addFilterDropdownSearch\"\r\n #filterMenueSearchInput\r\n />\r\n\r\n <div class=\"form-check mb-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isAllSideFilterOptionsSelected(col)\"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'value';\r\n trackBy: trackById\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n [value]=\"option\"\r\n id=\"option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n (change)=\"onOptionToggle(col, option)\"\r\n />\r\n <label\r\n class=\"form-check-label\"\r\n [for]=\"\r\n 'option_' +\r\n col.field +\r\n '_' +\r\n (option?.id || option?._id || option)\r\n \"\r\n >\r\n {{ option?.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Text Filter Section -->\r\n <ng-template #textFilter>\r\n <div class=\"filter-text-section\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col.query.first_condition || (col.type === 'date' || col.type === 'time' ? 'equal' : 'contain')\"\r\n (ngModelChange)=\"col.query.first_condition = $event\"\r\n >\r\n <ng-container *ngIf=\"col.type === 'date' || col.type === 'time'; else textOptions\">\r\n <option value=\"equal\">Equal to</option>\r\n <option value=\"not_equal\">Not Equal</option>\r\n <option value=\"after\">After</option>\r\n <option value=\"before\">Before</option>\r\n </ng-container>\r\n <ng-template #textOptions>\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </ng-template>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'string' ? 'text' : col.type\"\r\n class=\"form-control form-control-sm mb-3\"\r\n placeholder=\"Value\"\r\n [(ngModel)]=\"col.query.first_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n #filterMenueTextchInput\r\n />\r\n\r\n <ng-container >\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"condition\"\r\n value=\"and\"\r\n id=\"and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"condition\"\r\n value=\"or\"\r\n id=\"or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"condition\"\r\n value=\"none\"\r\n id=\"none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"col.query?.first_value && condition !== 'none'\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col.query.second_condition || (col.type === 'date' || col.type === 'time' ? 'equal' : 'contain')\"\r\n (ngModelChange)=\"col.query.second_condition = $event\"\r\n >\r\n <ng-container *ngIf=\"col.type === 'date' || col.type === 'time'; else textOptionsSecond\">\r\n <option value=\"equal\">Equal to</option>\r\n <option value=\"not_equal\">Not Equal</option>\r\n <option value=\"after\">After</option>\r\n <option value=\"before\">Before</option>\r\n </ng-container>\r\n <ng-template #textOptionsSecond>\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </ng-template>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'string' ? 'text' : col.type\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"col.query.second_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n />\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Actions -->\r\n <div class=\"d-flex gap-2 mt-2\">\r\n <div\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"applyFilterFromFilterRow(col)\"\r\n >\r\n Apply\r\n </div>\r\n <div\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"resetSideFilter(col)\"\r\n >\r\n Reset\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Side Menue -->\r\n\r\n<!-- Add this new template for accordion detail column menu -->\r\n<ng-template #detailColumnMenu let-col=\"col\" let-row=\"row\">\r\n <div\r\n class=\"column-menu three-dots-col-menu detail-column-menu\"\r\n [class.visually-hidden]=\"isDetailMenueHidden\"\r\n *ngIf=\"activeDetailCol\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Sort Ascending -->\r\n <div class=\"border-below pb-2\" [class.disable-sorting]=\"!col.is_sortable\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAscending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailAsc(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-up.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Ascending\r\n </div>\r\n\r\n <!-- Sort Descending -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showDescending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailDesc(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-down.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Descending\r\n </div>\r\n\r\n <div\r\n *ngIf=\"col?.sortOrder\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetDetailSort(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Reset Sort\r\n </div>\r\n </div>\r\n\r\n <div class=\"py-2 border-below\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateDetailColumnPin(activeDetailCol, row, 'left')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-left.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Left\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showPinright && col?.pinned !== 'right'\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"updateDetailColumnPin(activeDetailCol, row, 'right')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-right.svg'\"\r\n class=\"data-grid-svg-icon data-grid-svg-icon me-2\"\r\n ></span\r\n >Pin Right\r\n </div>\r\n\r\n <div\r\n *ngIf=\"col?.pinned\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateDetailColumnPin(activeDetailCol, row, null)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/layout-three-columns.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Unpin\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeThisColumn\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeDetailColumn(activeDetailCol, row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-expand-vertical.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Autosize This Column\r\n </div>\r\n\r\n <!-- Autosize All Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeAllColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"autosizeAllDetailColumns(row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrows-angle-expand.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Autosize All Columns\r\n </div>\r\n\r\n\r\n <!-- Choose Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showChoseColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"openDetailChooseColumns(row)\"\r\n>\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Choose Columns\r\n</div>\r\n\r\n <!-- Reset Columns -->\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showResetColumns\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetDetailColumns(row)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span\r\n >Reset Columns\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Column Pannel / Pivot Mode / Searching -->\r\n\r\n<ng-template #columnPannel>\r\n <div class=\"column-panel-header\">\r\n <!-- Pivot Toggle -->\r\n <div\r\n class=\"form-check form-switch d-flex align-items-center mb-2 pivot-mode px-5 ms-2\"\r\n >\r\n <input\r\n class=\"form-check-input me-2\"\r\n type=\"checkbox\"\r\n id=\"pivotToggle\"\r\n [(ngModel)]=\"pivotMode\"\r\n />\r\n <label class=\"form-check-label\" for=\"pivotToggle\">Pivot Mode</label>\r\n </div>\r\n\r\n <!-- Select All & Search -->\r\n <div class=\"d-flex align-items-center mb-2 px-3\">\r\n <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n accordionState === 'all'\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : accordionState === 'some'\r\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"toggleAllAccordions()\"\r\n ></span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allColumnsSelected()\"\r\n (change)=\"toggleAllColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search columns...\"\r\n [(ngModel)]=\"columnSearch\"\r\n />\r\n </div>\r\n\r\n <!-- Separator -->\r\n <hr class=\"my-2\" />\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Right Columns Menue -->\r\n\r\n<!-- Column Panel Item Template -->\r\n<ng-template #columnPanelItem let-col=\"col\">\r\n <!-- Group Column -->\r\n <ng-container *ngIf=\"col.children?.length\">\r\n <div class=\"column-group d-flex align-items-center mb-2\">\r\n <span class=\"filter-icon-wrapper me-2\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expanded\"\r\n (click)=\"col.expanded = !col.expanded\"\r\n ></span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [id]=\"'group_' + col.header\"\r\n [checked]=\"isColumnVisible(col)\"\r\n (change)=\"toggleGroupVisibility(col)\"\r\n />\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\r\n ></span>\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'group_' + col.header\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span class=\"text-truncate\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n <div *ngIf=\"col.expanded\" class=\"ps-4\">\r\n <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\r\n <ng-container\r\n *ngTemplateOutlet=\"columnPanelItem; context: { col: child }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Leaf Column -->\r\n <ng-container *ngIf=\"!col.children?.length\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <span class=\"me-2\" style=\"width: 1.5rem\"></span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [(ngModel)]=\"col.is_visible\"\r\n [id]=\"'col_' + col.field\"\r\n (change)=\"onSideMenuColumnsVisibilityChange()\"\r\n />\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\r\n ></span>\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'col_' + col.field\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span class=\"text-truncate\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<!-- Columns Side Filter -->\r\n<ng-template #sideFilters>\r\n <div class=\"py-3 px-2 pe-3 h-100\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <span class=\"filter-icon-wrapper me-2\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n filterAccordionState === 'all'\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : filterAccordionState === 'some'\r\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"toggleAllFilterAccordions()\"\r\n ></span>\r\n </span>\r\n\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"columnSearch\"\r\n />\r\n </div>\r\n <div\r\n class=\"overflow-auto side-filter-columns-wrapper\"\r\n style=\"height: calc(100% - 120px); scrollbar-width: thin\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : columnSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"filterPannelItem; context: { col: col }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Apply and Reset Buttons -->\r\n <!-- <div class=\"d-flex gap-2 mt-3 px-2\">\r\n <button\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center flex-fill\"\r\n style=\"height: 32px;\"\r\n (click)=\"applySideMenuFilters()\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center flex-fill\"\r\n style=\"height: 32px;\"\r\n (click)=\"resetSideMenuFilters()\"\r\n >\r\n Reset\r\n </button>\r\n </div> -->\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #filterPannelItem let-col=\"col\">\r\n <!-- Group Column -->\r\n <ng-container *ngIf=\"col.children?.length\">\r\n <div class=\"column-group d-flex align-items-center mb-2\">\r\n <!-- Chevron toggle -->\r\n <span class=\"filter-icon-wrapper me-2\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expandedFilter\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n ></span>\r\n </span>\r\n\r\n <!-- Group label toggle -->\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n style=\"cursor: pointer\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span class=\"fw-bold text-truncate\"\r\n >{{ col.header }}\r\n <span\r\n class=\"text-primary ms-1\"\r\n *ngIf=\"col?.query?._ids?.length || col?.query?._first_value\"\r\n >*</span\r\n >\r\n </span>\r\n </label>\r\n </div>\r\n\r\n <!-- Children columns -->\r\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4\">\r\n <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\r\n <ng-container\r\n *ngTemplateOutlet=\"filterPannelItem; context: { col: child }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Leaf Column -->\r\n <ng-container *ngIf=\"!col.children?.length\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <span\r\n class=\"me-2 filter-icon-wrapper me-2\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expandedFilter\"\r\n ></span>\r\n </span>\r\n\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n style=\"cursor: pointer\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span class=\"text-truncate fw-bold\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Show filter when expanded -->\r\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4 pe-3\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sideNestedFilter; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Side Nested Filters -->\r\n<ng-template #sideNestedFilter let-col=\"col\">\r\n <div class=\"\">\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.length == col?.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1 ms-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'header'\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [value]=\"option\"\r\n [checked]=\"\r\n col.query?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n (change)=\"onOptionToggle(col, option)\"\r\n id=\"option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n />\r\n <label\r\n class=\"form-check-label\"\r\n [for]=\"\r\n 'option_' +\r\n col.field +\r\n '_' +\r\n (option?.id || option?._id || option)\r\n \"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <!-- <div class=\"d-flex gap-2 mt-2\">\r\n <div\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center\"\r\n style=\"height: 22px;\"\r\n (click)=\"applySideMenuFilters()\"\r\n >\r\n Apply\r\n </div>\r\n <div\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center\"\r\n style=\"height: 22px;\"\r\n (click)=\"resetSideMenuFilters()\"\r\n >\r\n Reset\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Text Filter Section -->\r\n <ng-template #textFilter>\r\n <div class=\"filter-text-section\">\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col!.query!.first_condition || (col.type === 'date' || col.type === 'time' ? 'equal' : 'contain')\"\r\n (ngModelChange)=\"col!.query!.first_condition = $event\"\r\n >\r\n <ng-container *ngIf=\"col.type === 'date' || col.type === 'time'; else textOptions\">\r\n <option value=\"equal\">Equal to</option>\r\n <option value=\"not_equal\">Not Equal</option>\r\n <option value=\"after\">After</option>\r\n <option value=\"before\">Before</option>\r\n </ng-container>\r\n <ng-template #textOptions>\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </ng-template>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : col.type == 'number' ? 'number' : 'text'\"\r\n class=\"form-control form-control-sm mb-3\"\r\n placeholder=\"Value\"\r\n [(ngModel)]=\"col!.query!.first_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n />\r\n\r\n <ng-container *ngIf=\"col?.query?.first_value && col?.query?.condition !== 'none'\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"col!.query.condition\"\r\n value=\"and\"\r\n id=\"and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"col!.query.condition\"\r\n value=\"or\"\r\n id=\"or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"condition\"\r\n [(ngModel)]=\"col!.query.condition\"\r\n value=\"none\"\r\n id=\"none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [ngModel]=\"col!.query.second_condition || (col.type === 'date' || col.type === 'time' ? 'equal' : 'contain')\"\r\n (ngModelChange)=\"col!.query.second_condition = $event\"\r\n >\r\n <ng-container *ngIf=\"col.type === 'date' || col.type === 'time'; else textOptionsSecond\">\r\n <option value=\"equal\">Equal to</option>\r\n <option value=\"not_equal\">Not Equal</option>\r\n <option value=\"after\">After</option>\r\n <option value=\"before\">Before</option>\r\n </ng-container>\r\n <ng-template #textOptionsSecond>\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equal\">Equals</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </ng-template>\r\n </select>\r\n </div>\r\n\r\n <input\r\n [type]=\"col.type == 'date' ? 'date' : col.type == 'number' ? 'number' : 'text'\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"col!.query.second_value\"\r\n [min]=\"col.type == 'number' ? 0 : null\"\r\n (input)=\"col.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"col.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n [class.number-input]=\"col.type == 'number'\"\r\n />\r\n </ng-container>\r\n\r\n <!-- Apply and Reset Buttons -->\r\n <div class=\"d-flex gap-2 mt-2\">\r\n <div\r\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"applyFilterFromFilterRow(col)\"\r\n >\r\n Apply\r\n </div>\r\n <div\r\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center w-100\"\r\n style=\"height: 22px\"\r\n (click)=\"resetSideFilter(col)\"\r\n >\r\n Reset\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Centr Overlay for showing the chose columns -->\r\n\r\n<div *ngIf=\"showColumnPanel\" class=\"custom-modal-overlay\" (click)=\"closeModalColumnPanel()\">\r\n <div\r\n class=\"custom-modal-content\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"modalColumnPannel\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- The existing ng-template you provided -->\r\n<ng-template #modalColumnPannel>\r\n <div class=\"column-panel-header\">\r\n <div\r\n class=\"d-flex justify-content-between align-items-center px-2 ps-3 rounded-top-2 moda-header\"\r\n [style.height.px]=\"48\"\r\n >\r\n Choose Columns\r\n <span class=\"filter-icon-wrapper\" (click)=\"closeModalColumnPanel()\"\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span\r\n ></span>\r\n </div>\r\n <hr class=\"my-0\" />\r\n <div>\r\n <div class=\"d-flex align-items-center px-2 pe-3\" [style.height.px]=\"48\">\r\n <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n accordionState === 'all'\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : accordionState === 'some'\r\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n (click)=\"toggleAllAccordions()\"\r\n ></span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allColumnsSelected()\"\r\n (change)=\"toggleAllColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search columns...\"\r\n [(ngModel)]=\"choseColumnsSearch\"\r\n />\r\n </div>\r\n\r\n <hr class=\"mt-0 mb-1\" />\r\n <div class=\"px-2 overlay-scrollable\">\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : choseColumnsSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #sideMenuRowGroups>\r\n <div class=\"d-flex flex-column h-100\">\r\n <div class=\"px-3 h-100\">\r\n <div class=\"d-flex gap-3 mb-4\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span>Row Groups</span>\r\n </div>\r\n <div class=\"h-50\">\r\n <div\r\n class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\r\n style=\"font-size: 14px\"\r\n >\r\n Drag here to set row Groups\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"mt-4\" />\r\n\r\n <div class=\"px-3 h-100\">\r\n <div class=\"d-flex gap-3 mb-4\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span>Values</span>\r\n </div>\r\n <div class=\"h-50 d-flex\">\r\n <div\r\n class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\r\n style=\"font-size: 14px\"\r\n >\r\n Drag here aggregate\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<!-- Drag Preview Template -->\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<ng-template #dragPreview let-col>\r\n <div class=\"p-2 border d-flex gap-2\">\r\n <div>\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n <div>{{ col.header }}</div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Drag Placeholder Template -->\r\n<ng-template\r\n #dragPlaceholder\r\n let-col\r\n let-i=\"index\"\r\n let-section=\"section\"\r\n let-draggingInGroupArea=\"draggingInGroupArea\"\r\n>\r\n <div *ngIf=\"!draggingInGroupArea\">\r\n <div\r\n *ngTemplateOutlet=\"\r\n headerCell;\r\n context: { $implicit: col, index: i, section: section }\r\n \"\r\n ></div>\r\n </div>\r\n <div *ngIf=\"draggingInGroupArea\">New Placeholder</div>\r\n</ng-template>\r\n\r\n<!-- Top Group Row Placeholder -->\r\n<ng-template #topGroupingRowPlaceholder let-col let-showChevron=\"showChevron\">\r\n <div class=\"d-flex gap-2\">\r\n <div\r\n class=\"d-flex gap-2 top-row-grouping-placeholder\"\r\n [style.backgroundColor]=\"topGroupedBadgesBackgroundColor\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n <span>{{ col.header }}</span>\r\n <span\r\n (click)=\"ungroupColumn(col)\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"cursor-pointer data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showChevron\" style=\"opacity: 0.6; font-size: 14px\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template\r\n #childHeaderPlaceholder\r\n let-col\r\n let-pinnedRight=\"pinnedRight\"\r\n let-i=\"index\"\r\n let-sections=\"sections\"\r\n>\r\n <div\r\n class=\"header-cell one-row-header-cells\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n >\r\n <div class=\"d-flex justify-content-between h-100 align-items-center w-100\">\r\n <div\r\n class=\"d-flex justify-content-between w-100\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div\r\n class=\"text-ellipsis h-100 d-flex align-items-center\"\r\n [title]=\"col.header\"\r\n [class.w-100]=\"pinnedRight\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n\r\n <div\r\n class=\"position-relative d-flex\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n >\r\n <div class=\"three-dots p-1\" style=\"cursor: pointer\">\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n\r\n <div class=\"resize-handle\">\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n \"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"showFilterRow\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n class=\"header-cell filter-cell\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n style=\"grid-row: 3\"\r\n >\r\n <div\r\n class=\"header-cell filter-cell\"\r\n [style.backgroundColor]=\"headerBackgroundColor\"\r\n [style.width.px]=\"col.width\"\r\n [style.min-width.px]=\"col.width\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n >\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter\"\r\n [(ngModel)]=\"col.filterValue\"\r\n />\r\n <span\r\n class=\"filter-icon-wrapper\"\r\n (click)=\"activeFilterCell = col; activeCol = null\"\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span\r\n ></span>\r\n\r\n <div\r\n class=\"position-absolute\"\r\n *ngIf=\"activeFilterCell === col\"\r\n style=\"top: 100%; right: 0; z-index: 10; left: 0\"\r\n ></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tableLayout>\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"p-3 shadow rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 320px\"\r\n >\r\n <div class=\"d-flex align-items-center mb-3\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Layout</h6>\r\n </div>\r\n <hr class=\"my-2\" />\r\n <div class=\"w-100 mb-3 d-flex\" role=\"group\">\r\n <input\r\n type=\"radio\"\r\n class=\"btn-check layout-button-check\"\r\n name=\"layoutSize\"\r\n id=\"small\"\r\n autocomplete=\"off\"\r\n (change)=\"changeTableLayout($event, 'small')\"\r\n [checked]=\"selectedTableLayout == 'small'\"\r\n />\r\n <label\r\n class=\"border d-flex flex-column align-items-center layout-button\"\r\n for=\"small\"\r\n [ngStyle]=\"{\r\n color: selectedTableLayout == 'small' ? '#000' : '#727272'\r\n }\"\r\n >\r\n <div class=\"preview-box border mb-1\" style=\"height: 8px\"></div>\r\n Small\r\n </label>\r\n\r\n <input\r\n type=\"radio\"\r\n class=\"btn-check layout-button-check\"\r\n name=\"layoutSize\"\r\n id=\"medium\"\r\n autocomplete=\"off\"\r\n [checked]=\"selectedTableLayout == 'medium'\"\r\n (change)=\"changeTableLayout($event, 'medium')\"\r\n />\r\n <label\r\n class=\"border mx-3 d-flex flex-column align-items-center layout-button\"\r\n for=\"medium\"\r\n [ngStyle]=\"{\r\n color: selectedTableLayout == 'medium' ? '#000' : '#727272'\r\n }\"\r\n >\r\n <div class=\"preview-box border mb-1\" style=\"height: 12px\"></div>\r\n Medium\r\n </label>\r\n\r\n <input\r\n type=\"radio\"\r\n class=\"btn-check layout-button-check\"\r\n name=\"layoutSize\"\r\n id=\"large\"\r\n autocomplete=\"off\"\r\n (change)=\"changeTableLayout($event, 'large')\"\r\n [checked]=\"selectedTableLayout == 'large'\"\r\n />\r\n <label\r\n class=\"border d-flex flex-column align-items-center layout-button\"\r\n for=\"large\"\r\n [ngStyle]=\"{\r\n color: selectedTableLayout == 'large' ? '#000' : '#727272'\r\n }\"\r\n >\r\n <div class=\"preview-box border mb-1\" style=\"height: 16px\"></div>\r\n Large\r\n </label>\r\n </div>\r\n\r\n <hr class=\"my-2\" />\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <span>Show separators</span>\r\n <div class=\"form-check form-switch m-0\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n id=\"separators\"\r\n [(ngModel)]=\"showVerticalBorder\"\r\n (change)=\"onFontChange()\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <span>Row shading</span>\r\n <div class=\"form-check form-switch m-0\">\r\n <input\r\n class=\"form-check-input\"\r\n [(ngModel)]=\"rowShadingEnabled\"\r\n (change)=\"toggleRowShading()\"\r\n type=\"checkbox\"\r\n id=\"rowShading\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #tablePreset>\r\n <div\r\n *ngIf=\"activeSubButton !== 'save-preset'\"\r\n (click)=\"$event.stopPropagation();\"\r\n class=\"p-3 shadow rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 280px\"\r\n >\r\n <!-- Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"d-flex align-items-center\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Presets</h6>\r\n </div>\r\n <!-- Save Preset Button with Dropdown -->\r\n <div>\r\n <a\r\n class=\"text-decoration-none btn btn-link\"\r\n type=\"button\"\r\n id=\"savePresetDropdown\"\r\n (click)=\"$event.stopPropagation(); toggleSubActions('save-preset')\"\r\n >\r\n Save Preset\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"mb-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"searchTextPresetTable\"\r\n type=\"search\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Preset List -->\r\n <ng-container\r\n *ngIf=\"\r\n tableView | filter : searchTextPresetTable : 'name' as filteredList\r\n \"\r\n >\r\n <!-- If filteredList exists and none is default -> show fallback -->\r\n <div class=\"\" (click)=\"selectDefault()\">\r\n <div class=\"fw-semibold\">Default View\r\n <span\r\n *ngIf=\"tableFilterViewId === 'default'\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\"\r\n class=\"me-2\"\r\n ></span>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between\">\r\n <small class=\"text-dark\">Created by system</small>\r\n <span\r\n *ngIf=\"tableFilterViewId === 'default'\"\r\n class=\"badge bg-light text-primary ms-2\"\r\n >Default</span\r\n >\r\n <div\r\n class=\"dropdown d-flex justify-content-end\"\r\n *ngIf=\"tableFilterViewId\"\r\n >\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end\">\r\n <a\r\n (click)=\"actionPreset({ id: 'default' }, 'setPreset')\"\r\n class=\"dropdown-item d-flex align-items-center\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/star.svg'\"\r\n class=\"me-2\"\r\n ></span>\r\n Set as default\r\n </a>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <!-- The list: render each table from filteredList -->\r\n <div\r\n class=\"list-group list-group-flush\"\r\n *ngFor=\"let table of filteredList; trackBy: trackByTable\"\r\n >\r\n <!-- Item -->\r\n <div\r\n class=\"list-group-item px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div (click)=\"selectFilter(table)\">\r\n <div class=\"fw-semibold\" style=\"cursor: pointer;\">\r\n {{ table?.name }}\r\n <!-- {{table?.is_temp}} -->\r\n <span\r\n *ngIf=\"table?.is_temp\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n <span\r\n *ngIf=\"table?.is_deafult\"\r\n class=\"badge bg-light text-primary ms-2\"\r\n >Default</span\r\n >\r\n </div>\r\n <small class=\"text-dark\"\r\n >Created {{ table?.createdAt | timezoneFormat:prefs:'date' }}</small\r\n >\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center\">\r\n <span\r\n *ngIf=\"table?.is_deafult\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n\r\n <div class=\"dropdown\" *ngIf=\"!table?.is_deafult\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n id=\"dropdownMenuButton2\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end set-default-preset\" aria-labelledby=\"dropdownMenuButton2\">\r\n <a\r\n [class.d-none]=\"confirmDelete\"\r\n (click)=\"actionPreset(table, 'setPreset')\"\r\n class=\"dropdown-item d-flex align-items-center\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/star.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Set as default\r\n </a>\r\n\r\n <!-- Delete with confirmation -->\r\n <ng-container *ngIf=\"!confirmDelete; else confirmBlock\">\r\n <a\r\n (click)=\"confirmDelete = true\"\r\n class=\"dropdown-item d-flex align-items-center text-danger\"\r\n >\r\n <span\r\n style=\"margin-top: -4px\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Delete\r\n </a>\r\n </ng-container>\r\n\r\n <!-- Confirmation block -->\r\n </ul>\r\n <ng-template #confirmBlock>\r\n <div class=\"dropdown-item\"><b>Delete preset</b></div>\r\n <div class=\"dropdown-item text-center\">\r\n <div class=\"mb-2\">\r\n Are you sure you want to delete the <br />\r\n <b>“{{ table?.name }}”</b> preset?\r\n </div>\r\n <button\r\n class=\"btn btn-sm btn-light me-2\"\r\n (click)=\"confirmDelete = false\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-danger delete-preset\"\r\n (click)=\"actionPreset(table, 'deletePreset')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"confirm-preset-delete\"\r\n ></span>\r\n Delete\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Item End Here -->\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"activeSubButton == 'save-preset'\"\r\n class=\"dropdown-menu p-3 badge mt-4 save-preset-dropdown mt-1\"\r\n aria-labelledby=\"savePresetDropdown\"\r\n style=\"min-width: 250px\"\r\n >\r\n <div class=\"fw-bold fs-14px mb-2\">Save preset</div>\r\n <div class=\"fs-14px mb-2\" style=\"line-height: 20px\">\r\n This will save the current table adjustments as a preset.\r\n </div>\r\n <!-- Input -->\r\n <div class=\"mb-2\">\r\n <label for=\"presetName\" class=\"form-label fs-12px fw-bold\"\r\n >Preset Name</label\r\n >\r\n <div class=\"col-12 global-search\">\r\n <input\r\n #presetNameCtrl=\"ngModel\"\r\n required\r\n [(ngModel)]=\"presetName\"\r\n [ngClass]=\"{\r\n 'is-invalid':\r\n presetNameCtrl.invalid &&\r\n (presetNameCtrl.dirty || presetNameCtrl.touched)\r\n }\"\r\n class=\"form-control form-control-sm ps-2\"\r\n placeholder=\"Enter preset name\"\r\n type=\"text\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Checkbox -->\r\n <div class=\"form-check mb-2\">\r\n <input\r\n class=\"form-check-input\"\r\n [(ngModel)]=\"presetFilter\"\r\n type=\"checkbox\"\r\n id=\"saveFilters\"\r\n />\r\n <label class=\"form-check-label mt-1\" for=\"saveFilters\">\r\n Save active filters\r\n </label>\r\n </div>\r\n\r\n <!-- Save Button -->\r\n <div class=\"d-flex justify-content-center gap-2\" style=\"height: 32px\">\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn border w-100 d-flex align-items-center justify-content-center btn-light\"\r\n (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n style=\"margin-top: -2px\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n [disabled]=\"closeDropdown.preset.loading\"\r\n (click)=\"savePreset(presetNameCtrl)\"\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center\"\r\n >\r\n <span style=\"margin-top: -2px\">\r\n <ng-container *ngIf=\"!closeDropdown.preset.loading && (!tableFilterViewId || tableFilterViewId === 'default')\"\r\n >Save</ng-container\r\n >\r\n <ng-container *ngIf=\"!closeDropdown.preset.loading && tableFilterViewId && tableFilterViewId !== 'default'\"\r\n >Update</ng-container\r\n >\r\n <ng-container *ngIf=\"closeDropdown.preset.loading\"\r\n ><span class=\"spinner-border spinner-border-sm\"></span\r\n ></ng-container>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #showHideColumns>\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"p-3 shadow rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 280px\"\r\n >\r\n <!-- Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"d-flex align-items-center\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Columns</h6>\r\n </div>\r\n <a\r\n (click)=\"resetColumns()\"\r\n href=\"javascript:void(0)\"\r\n class=\"text-primary text-decoration-none\"\r\n >Reset</a\r\n >\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"mb-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"mx-2 position-absolute icon data-grid-svg-icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search column\"\r\n type=\"search\"\r\n [(ngModel)]=\"topShowHideColumns\"\r\n />\r\n </div>\r\n </div>\r\n <!-- Preset List -->\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"\r\n max-height: calc(100vh - 300px);\r\n overflow: auto;\r\n scrollbar-width: thin;\r\n \"\r\n >\r\n <div class=\"muted-text show-hide-table-label d-flex justify-content-between\" *ngIf=\"hasAnyVisibleColumn\">\r\n Show in table\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"show_hide_all\"\r\n class=\"form-check-input\"\r\n [checked]=\"areAllNonMandatoryVisible()\"\r\n (change)=\"toggleAllVisibleColumns()\"\r\n />\r\n <label for=\"show_hide_all\" class=\"form-check-label fw-semibold\">Show/Hide All</label>\r\n </div>\r\n </div>\r\n <!-- <div class=\"d-flex align-items-center mb-2\" *ngIf=\"hasAnyVisibleColumn\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"areAllNonMandatoryVisible()\"\r\n (change)=\"toggleAllVisibleColumns()\"\r\n />\r\n <label class=\"form-check-label fw-semibold\">Show All</label>\r\n </div> -->\r\n <!-- Item -->\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : topShowHideColumns : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div\r\n *ngIf=\"col.is_visible\"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div>\r\n <span\r\n *ngIf=\"!col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\r\n \"\r\n class=\"cursor-grap data-grid-svg-icon\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n <span\r\n *ngIf=\"col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"cursor-grap data-grid-svg-icon\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n </div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"!col?.query?.first_value && !col?.query?._ids?.length && !isMandatory(col)\"\r\n class=\"d-flex align-items-center cursor-pointer\"\r\n (click)=\"toggleColumnVisibility(col, false)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n <div\r\n *ngIf=\"(!col?.query?.first_value && !col?.query?._ids?.length && isMandatory(col)) || (col?.query?.first_value || col?.query?._ids?.length)\"\r\n class=\"d-flex align-items-center\"\r\n style=\"opacity: 0.5\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Item End Here -->\r\n\r\n <div\r\n class=\"dropdown-divider\"\r\n *ngIf=\"hasAnyVisibleColumn && hasAnyInVisibleColumn\"\r\n ></div>\r\n\r\n <!-- <div\r\n class=\"muted-text show-hide-table-label\"\r\n *ngIf=\"hasAnyInVisibleColumn\"\r\n >\r\n Hide in table\r\n </div>\r\n <div class=\"d-flex align-items-center mb-2\" *ngIf=\"hasAnyInVisibleColumn\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"hide_show_all\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"areAllNonMandatoryHidden()\"\r\n (change)=\"toggleAllInvisibleColumns()\"\r\n />\r\n <label class=\"form-check-label fw-semibold\">Hide All</label>\r\n </div> -->\r\n\r\n \r\n\r\n\r\n\r\n <div class=\"muted-text show-hide-table-label d-flex justify-content-between\" *ngIf=\"hasAnyInVisibleColumn\">\r\n Hide in table\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"hide_show_all\"\r\n class=\"form-check-input\"\r\n [checked]=\"areAllNonMandatoryHidden()\"\r\n (change)=\"toggleAllInvisibleColumns()\"\r\n />\r\n <label for=\"hide_show_all\" class=\"form-check-label fw-semibold\">Hide/Show All</label>\r\n </div>\r\n </div>\r\n <div class=\"list-group list-group-flush\">\r\n <ng-container *ngFor=\"let col of columns; trackBy: trackByField\">\r\n <div\r\n *ngIf=\"!col.is_visible\"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div>\r\n <span\r\n *ngIf=\"!col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\r\n \"\r\n class=\"data-grid-svg-icon cursor-grap\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n <span\r\n *ngIf=\"col?.pinned\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n \"\r\n class=\"data-grid-svg-icon cursor-grap\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n ></span>\r\n </div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"d-flex align-items-center cursor-pointer\"\r\n (click)=\"toggleColumnVisibility(col, true)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Item End Here -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #filterColumns let-col=\"column\">\r\n <div\r\n @slideToggle\r\n *ngIf=\"!isFilterOpen && activeTopButton == 'filter-columns'\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"mb-2 px-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter by\"\r\n type=\"search\"\r\n [(ngModel)]=\"addFilterColumnInput\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 500px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : addFilterColumnInput : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div\r\n (click)=\"openFilter(col)\"\r\n *ngIf=\"\r\n col.is_visible &&\r\n !col?.query?.first_value &&\r\n !col?.query?._ids?.length\r\n \"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div style=\"margin-top: -3px\"></div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown -->\r\n <div\r\n @slideToggle\r\n *ngIf=\"isFilterOpen && selectedColumnForFilter.type == 'dropdown'\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"px-3 my-2 border-below py-1 pb-2 mb-3 d-flex ps-1\">\r\n <span\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span\r\n ><b>{{ selectedColumnForFilter?.header }}</b>\r\n </div>\r\n <div class=\"mb-2 px-3\">\r\n <div\r\n class=\"col-12 global-search position-relative border rounded d-flex align-items-center flex-wrap px-2 filter-serach-inpt\"\r\n >\r\n <span\r\n *ngFor=\"let selected of selectedFilterOptions\"\r\n class=\"badge d-flex align-items-center gap-1 me-1 mb-1\"\r\n >\r\n {{ selected?.value ? selected.value : selected }}\r\n <span\r\n (click)=\"toggleSelectionInFilter(selected)\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </span>\r\n <input\r\n class=\"form-control form-control-sm border-0 flex-grow-1\"\r\n style=\"padding: 0\"\r\n [placeholder]=\"selectedFilterOptions!.length ? '' : 'Filter by'\"\r\n type=\"search\"\r\n [(ngModel)]=\"searchTextForFilterDropDown\"\r\n (keydown.backspace)=\"handleBackspace($event)\"\r\n (ngModelChange)=\"selectedFilterOptions.length === 0 ? condition = 'none' : null\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 600px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of selectedColumnForFilter.column_dropdown_value\r\n | filter : searchTextForFilterDropDown : 'value';\r\n let i = index\r\n \"\r\n >\r\n <div\r\n class=\"list-group-item border-0 px-2 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"i\"\r\n [checked]=\"currentFilterSelectedIds.has(col.id || col._id || col)\"\r\n (change)=\"toggleSelectionInFilter(col)\"\r\n />\r\n <label class=\"form-check-label fw-semibold\" [for]=\"i\">\r\n {{ col?.value || col?.name || col }}\r\n </label>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div\r\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n style=\"height: 38px\"\r\n >\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n (click)=\"$event.stopPropagation(); resetFilterChanges()\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n (click)=\"applyDropdownFilter()\"\r\n >\r\n <span style=\"margin-top: -2px\">Save</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For Text fields and number fields-->\r\n\r\n <div\r\n @slideToggle\r\n *ngIf=\"\r\n isFilterOpen &&\r\n (selectedColumnForFilter.type == 'string' ||\r\n selectedColumnForFilter.type == 'number' ||\r\n selectedColumnForFilter.type == 'date')\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"px-3 border-below py-1 pb-2 d-flex ps-1\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span\r\n ><b>{{ selectedColumnForFilter?.header }}</b>\r\n </div>\r\n <div class=\"col-12 position-relative p-2 text-filter\">\r\n <div class=\"mb-2\">\r\n <select\r\n class=\"form-select form-select-sm custom-select\"\r\n [(ngModel)]=\"firstCondition\"\r\n >\r\n <ng-container *ngIf=\"selectedColumnForFilter.type === 'date' || selectedColumnForFilter.type === 'time'; else textOptions\">\r\n <option value=\"equal\">Equal to</option>\r\n <option value=\"not_equal\">Not Equal</option>\r\n <option value=\"after\">After</option>\r\n <option value=\"before\">Before</option>\r\n </ng-container>\r\n <ng-template #textOptions>\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </ng-template>\r\n </select>\r\n </div>\r\n <div class=\"mb-2\">\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Enter first value\"\r\n [type]=\"\r\n selectedColumnForFilter.type == 'string'\r\n ? 'text'\r\n : selectedColumnForFilter.type\r\n \"\r\n [(ngModel)]=\"firstValue\"\r\n [min]=\"selectedColumnForFilter.type == 'number' ? 0 : null\"\r\n [class.number-input]=\"selectedColumnForFilter.type == 'number'\"\r\n (input)=\"selectedColumnForFilter.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (ngModelChange)=\"!firstValue ? condition = 'none' : null\"\r\n (keydown)=\"selectedColumnForFilter.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n />\r\n </div>\r\n <div class=\"d-flex my-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n id=\"logicalAnd\"\r\n name=\"logicalOperator\"\r\n value=\"and\"\r\n [(ngModel)]=\"condition\"\r\n />\r\n <label class=\"form-check-label\" for=\"logicalAnd\">AND</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n id=\"logicalOr\"\r\n name=\"logicalOperator\"\r\n value=\"or\"\r\n [(ngModel)]=\"condition\"\r\n />\r\n <label class=\"form-check-label\" for=\"logicalOr\">OR</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n id=\"logicalNone\"\r\n name=\"logicalOperator\"\r\n value=\"none\"\r\n [(ngModel)]=\"condition\"\r\n />\r\n <label class=\"form-check-label\" for=\"logicalNone\">None</label>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"firstValue && condition !== 'none'\">\r\n <div class=\"my-3\">\r\n <!-- Second condition select -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"secondCondition\"\r\n >\r\n <ng-container *ngIf=\"selectedColumnForFilter.type === 'date' || selectedColumnForFilter.type === 'time'; else textOptionsSecond\">\r\n <option value=\"equal\">Equal to</option>\r\n <option value=\"not_equal\">Not Equal</option>\r\n <option value=\"after\">After</option>\r\n <option value=\"before\">Before</option>\r\n </ng-container>\r\n <ng-template #textOptionsSecond>\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Begins With</option>\r\n <option value=\"after\">Ends With</option>\r\n </ng-template>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <!-- Second value input -->\r\n <input\r\n [type]=\"\r\n selectedColumnForFilter.type == 'string'\r\n ? 'text'\r\n : selectedColumnForFilter.type\r\n \"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Enter second value\"\r\n [(ngModel)]=\"secondValue\"\r\n [min]=\"selectedColumnForFilter.type == 'number' ? 0 : null\"\r\n [class.number-input]=\"selectedColumnForFilter.type == 'number'\"\r\n (input)=\"selectedColumnForFilter.type == 'number' && $any($event.target).value < 0 ? $any($event.target).value = 0 : null\"\r\n (keydown)=\"selectedColumnForFilter.type == 'number' && $event.key === '-' ? $event.preventDefault() : null\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n style=\"height: 38px\"\r\n >\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n (click)=\"$event.stopPropagation(); resetTextFilterChanges()\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n (click)=\"applyDropdownFilter()\"\r\n >\r\n <span style=\"margin-top: -2px\">Save</span>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Edit dropdown here -->\r\n<ng-template let-col>\r\n <div class=\"drop-down-edit\"></div>\r\n</ng-template>\r\n\r\n<ng-template\r\n #fullTextTemplate\r\n let-row=\"row\"\r\n let-col=\"col\"\r\n let-isArray=\"isArray\"\r\n>\r\n <div\r\n class=\"full-text-box\"\r\n (dblclick)=\"$event.stopPropagation(); $event.preventDefault();\"\r\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\r\n >\r\n <ng-container *ngIf=\"!isEditing(row, col)\">\r\n <div\r\n *ngIf=\"!isArray\"\r\n class=\"full-text-content\"\r\n (dblclick)=\"$event.stopPropagation(); $event.preventDefault(); enableEdit(row, col)\"\r\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\r\n >\r\n {{\r\n getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field)\r\n }}\r\n </div>\r\n <div *ngIf=\"isArray\">\r\n <ul>\r\n <ng-container\r\n *ngFor=\"let item of getNestedValue(row, col.field); let i = index\"\r\n >\r\n <li *ngIf=\"i !== 0\">\r\n <ng-container>\r\n {{ item?.department_name || item?.roleName || \"-\" }}\r\n </ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"isEditing(row, col)\">\r\n <textarea\r\n #textModel=\"ngModel\"\r\n rows=\"4\"\r\n #textAreadInput\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n (blur)=\"disableEdit(row, col, textModel)\"\r\n (keydown.enter)=\"textAreadInput.blur()\"\r\n autofocus\r\n class=\"form-control\"\r\n [ngClass]=\"{\r\n 'is-invalid': textModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n ></textarea>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultImagePlaceholder let-row=\"row\" let-col=\"col\">\r\n <span\r\n class=\"px-2 d-flex align-items-center w-100 cell-content image-placeholder cursor-pointer position-relative\"\r\n [title]=\"getEmployeeNameTitle(row)\"\r\n (click)=\"onEmployeeClick(row)\"\r\n >\r\n <!-- Blue dot for manual logs -->\r\n <span\r\n *ngIf=\"row?.manually_logs && row.manually_logs.length > 0\"\r\n class=\"manual-logs-indicator\"\r\n (mouseenter)=\"openManualLogsModal($event, row)\"\r\n (mouseleave)=\"closeManualLogsModal()\"\r\n ></span>\r\n <ng-container\r\n *ngIf=\"\r\n row?.User?.logo || row?.User?.profile_pictures?.length || row?.logo || row?.profile_pictures?.length || row?.assetImage || row?.invoice?.invoice_image;\r\n else placeholder\r\n \"\r\n >\r\n <span class=\"pic\">\r\n <img\r\n [width]=\"rowHeight - 12\"\r\n [height]=\"rowHeight - 12\"\r\n [src]=\"row?.User?.profile_pictures?.[4]?.path || row?.User?.logo || row?.profile_pictures?.[4]?.path || row?.logo || row?.assetImage || row?.invoice?.invoice_image\"\r\n alt=\"icon\"\r\n />\r\n </span>\r\n </ng-container>\r\n\r\n <ng-template #placeholder>\r\n <span\r\n [ngClass]=\"getDynamicClass(row?.User?.full_name || row?.full_name || row?.name)\"\r\n class=\"pic d-flex align-items-center rounded-circle\"\r\n [style.width.px]=\"rowHeight - 12\"\r\n [style.height.px]=\"rowHeight - 12\"\r\n [style.fontSize.px]=\"rowHeight / 3\"\r\n >\r\n {{ getInitials(row?.User?.full_name || row?.full_name) }}\r\n </span>\r\n </ng-template>\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Cell Content Template for Card View -->\r\n<ng-template #cellContent let-row=\"row\" let-parentRow=\"parentRow\" let-col=\"col\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <!-- String/Text -->\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n\r\n <!-- Number -->\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n\r\n <!-- Date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) ? (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) | timezoneFormat:prefs:'date') : '-' }}\r\n </ng-container>\r\n\r\n <!-- Time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n {{ (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) !== null && (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) !== undefined ? ((getTimeValue(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) | timezoneFormat:prefs:'time')) : '-' }}\r\n </ng-container>\r\n\r\n <!-- Boolean -->\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <span class=\"badge\" [class]=\"(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === true || getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === 'true') ? 'badge-success' : 'badge-secondary'\">\r\n {{ (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === true || getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) === 'true') ? 'Yes' : 'No' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- <div *ngSwitchCase=\"'is_payroll_processed'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" >\r\n <span class=\"popover__wrapper\" >none\r\n {{ row.is_payroll_processed ? 'Yes' : 'No' }}\r\n </span>\r\n </div> -->\r\n\r\n <!-- Status -->\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span class=\"badge\" [class]=\"getStatusBadgeClass(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field))\">\r\n {{ transformStatus(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field)) || '-' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Array -->\r\n <ng-container *ngSwitchCase=\"'array'\">\r\n <ng-container *ngIf=\"isArray(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field))\">\r\n <ng-container *ngIf=\"col.field === 'breaks' || col.header?.toLowerCase().includes('break')\">\r\n <app-badge-overflow\r\n [badges]=\"getBreakBadges(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || [])\"\r\n [maxWidth]=\"col.width || 200\"\r\n (badgeMouseEnter)=\"showBreakTooltip($event.event, $event.badge.data)\"\r\n (badgeMouseLeave)=\"hideBreakTooltip()\"\r\n (overflowCountClick)=\"onBadgeOverflowCountClick(col)\">\r\n </app-badge-overflow>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(col.field === 'breaks' || col.header?.toLowerCase().includes('break'))\">\r\n {{ (getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || []).length }} items\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!isArray(getNestedValue(row, col.field) || getNestedValue(parentRow, col.field))\">\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Default -->\r\n <ng-container *ngSwitchDefault>\r\n {{ getNestedValue(row, col.field) || getNestedValue(parentRow, col.field) || '-' }}\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Right Click Menue -->\r\n<div\r\n [class.invisible]=\"!positionedYet\"\r\n class=\"context-menu p-2\"\r\n *ngIf=\"actionHide && actions?.length\"\r\n [ngStyle]=\"{ 'top.px': yPos, 'left.px': xPos }\"\r\n [class.show]=\"isVisible\"\r\n appendTo=\"body\"\r\n>\r\n <ul>\r\n <li\r\n *ngFor=\"let action of actions\"\r\n class=\"rounded d-flex align-items-center\"\r\n (click)=\"onActionClick(action)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/' + action + '.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n <span class=\"text-capitalize fw-500\">{{ action }}</span>\r\n </li>\r\n </ul>\r\n</div>\r\n\r\n<!-- Details Toggle from bottom -->\r\n<div\r\n [style.bottom.px]=\"footerRowHeight + 50\"\r\n *ngIf=\"selectedRows.size > 0 && showTaskbar\"\r\n class=\"taskbar\"\r\n>\r\n <div class=\"selected-rows-action-bar\" [@slideUp]>\r\n <span class=\"selected-count\">\r\n {{ selectedRows.size }} selected of\r\n {{ config?.paginationParams?.totalItems }} Total\r\n </span>\r\n <div class=\"action-buttons\">\r\n <ng-container *ngFor=\"let action of taskbarActions; let i = index\">\r\n <span\r\n class=\"action-btn verified btn {{ action }}\"\r\n (click)=\"action === 'Export' ? onExportClick() : action === 'Delete' ? onDeleteClick() : onVerifyClick(action)\"\r\n >{{ action }}</span\r\n >\r\n <span\r\n *ngIf=\"taskbarActions.length > 1 && i !== taskbarActions.length - 1\"\r\n class=\"separator\"\r\n >|</span\r\n >\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Row Choose Columns Modal -->\r\n<div *ngIf=\"showDetailColumnPanel\" class=\"custom-modal-overlay\">\r\n <div\r\n class=\"custom-modal-content\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"detailModalColumnPannel\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Short Leave Tooltip Modal -->\r\n<div *ngIf=\"showShortLeaveTooltipModal\" \r\n class=\"custom-break-tooltips\" \r\n [style.--tooltip-x.px]=\"shortLeaveTooltipPosition.x\" \r\n [style.--tooltip-y.px]=\"shortLeaveTooltipPosition.y\"\r\n (mouseenter)=\"preventShortLeaveTooltipHide()\" \r\n (mouseleave)=\"hideShortLeaveTooltip()\">\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-striped text-dark\">\r\n <thead>\r\n <tr>\r\n <th>Leave Type</th>\r\n <th>Start Time</th>\r\n <th>End Time</th>\r\n <th>Duration (min)</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of currentShortLeaveData\">\r\n <td>{{ item.leave_type || 'N/A' }}</td>\r\n <td>{{ item.star_time || 'N/A' }}</td>\r\n <td>{{ item.end_time || 'N/A' }}</td>\r\n <td>{{ item.minutes || 'N/A' }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Tooltip for accordion manual logs -->\r\n<!-- Tooltip for accordion manual logs -->\r\n<div *ngIf=\"showManualLogsTooltipModal\" class=\"custom-break-tooltips\"\r\n [style.--tooltip-x.px]=\"manualLogsTooltipPosition.x\"\r\n [style.--tooltip-y.px]=\"manualLogsTooltipPosition.y\"\r\n (mouseenter)=\"preventManualLogsTooltipHide()\"\r\n (mouseleave)=\"hideManualLogsTooltip()\">\r\n\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-striped text-dark\">\r\n <thead>\r\n <tr>\r\n <th>Name</th>\r\n <th>Date/Time</th>\r\n <th>Previous</th>\r\n <th>Updated</th>\r\n <th>Status</th>\r\n <th>Remarks</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let item of selectedManualLogs; let i = index\">\r\n <tr>\r\n <td>{{ item?.updated_by?.full_name || selectedManualLogsRow?.User?.full_name }}</td>\r\n <td>{{ item?.log_date && item.log_date !== '--' ? (item.log_date | timezoneFormat:prefs:'date') : (selectedManualLogsRow?.attendanceDate && selectedManualLogsRow?.attendanceDate !== '--' ? (selectedManualLogsRow?.attendanceDate | timezoneFormat:prefs:'date') : '-') }}</td>\r\n <td>{{ formatLogState(item?.log_details?.previous_state) }}</td>\r\n <td>{{ formatLogState(item?.log_details?.updated_state) }}</td>\r\n <td>{{ item?.log_details?.status ? transformStatus(item.log_details.status) : (item.log_details?.status || '-') }}</td>\r\n <td>{{ item?.log_details?.remarks || item?.remarks || selectedManualLogsRow?.message || '-' }}</td>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Fallback for empty manual logs -->\r\n <tr *ngIf=\"!selectedManualLogs || selectedManualLogs.length === 0\">\r\n <td colspan=\"6\" class=\"text-center\">No manual logs available</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n<!-- </div> -->\r\n\r\n<ng-template #detailModalColumnPannel>\r\n <div class=\"column-panel-header\">\r\n <div\r\n class=\"d-flex justify-content-between align-items-center px-2 ps-3 rounded-top-2 moda-header\"\r\n [style.height.px]=\"48\"\r\n >\r\n Choose Detail Columns\r\n <span class=\"filter-icon-wrapper\" (click)=\"closeDetailColumnPanel()\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n ></span>\r\n </span>\r\n </div>\r\n <hr class=\"my-0\" />\r\n <div>\r\n <div class=\"d-flex align-items-center px-2 pe-3\" [style.height.px]=\"48\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allDetailColumnsSelected()\"\r\n (change)=\"toggleAllDetailColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search detail columns...\"\r\n [(ngModel)]=\"choseColumnsSearch\"\r\n />\r\n </div>\r\n <hr class=\"mt-0 mb-1\" />\r\n <div class=\"px-2 overlay-scrollable\">\r\n <ng-container\r\n *ngFor=\"\r\n let col of (currentDetailRowForColumnSelection?.details?.columns || [])\r\n | filter : choseColumnsSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"col.is_visible !== false\"\r\n (change)=\"toggleDetailColumnVisibility(col, !col.is_visible)\"\r\n [id]=\"'detail_col_' + col.field\"\r\n />\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'detail_col_' + col.field\"\r\n style=\"cursor: pointer\"\r\n >\r\n <span class=\"text-truncate\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- <div class=\"px-3 py-2 border-top d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link\" (click)=\"resetDetailColumnsInModal()\">Reset</button>\r\n </div> -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/*\r\n * Public API Surface of ms-time-sheet\r\n */\r\n\r\nexport * from './lib/ms-time-sheet.service';\r\nexport * from './lib/ms-time-sheet.component';\r\nexport * from './lib/services/common.service';\r\nexport * from './lib/pipes/timezone-format.pipe';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.CommonService"],"mappings":";;;;;;;;;;;;;;;;;MAKa,kBAAkB,CAAA;AAE7B,IAAA,WAAA,GAAA,EAAgB;+GAFL,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCCY,mBAAmB,CAAA;IAC9B,cAAc,CAAC,OAAc,EAAE,cAAsB,EAAA;QACnD,MAAM,IAAI,GAAU,EAAE;QACtB,MAAM,MAAM,GAAU,EAAE;QACxB,MAAM,KAAK,GAAU,EAAE;AAEvB,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,MAAM,YAAY,GAAU,EAAE;gBAC9B,MAAM,cAAc,GAAU,EAAE;gBAChC,MAAM,aAAa,GAAU,EAAE;AAE/B,gBAAA,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE;AAChC,oBAAA,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK;wBAAE;oBAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI;oBACjD,MAAM,eAAe,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE;oBAE5C,IAAI,MAAM,KAAK,MAAM;AAAE,wBAAA,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;yBACpD,IAAI,MAAM,KAAK,OAAO;AAAE,wBAAA,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;;AAC3D,wBAAA,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;gBAC3C;AAEA,gBAAA,IAAI,YAAY,CAAC,MAAM,EAAE;oBACvB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;gBACpF;AACA,gBAAA,IAAI,cAAc,CAAC,MAAM,EAAE;oBACzB,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,GAAG,CAAC,MAAM;AAClB,wBAAA,QAAQ,EAAE,cAAc;AACxB,wBAAA,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG;AACtB,qBAAA,CAAC;gBACJ;AACA,gBAAA,IAAI,aAAa,CAAC,MAAM,EAAE;oBACxB,KAAK,CAAC,IAAI,CAAC;wBACT,MAAM,EAAE,GAAG,CAAC,MAAM;AAClB,wBAAA,QAAQ,EAAE,aAAa;AACvB,wBAAA,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG;AACtB,qBAAA,CAAC;gBACJ;YACF;AAAO,iBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;AACnC,gBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI;gBACjC,IAAI,MAAM,KAAK,MAAM;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;qBAChC,IAAI,MAAM,KAAK,OAAO;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;AACvC,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB;QACF;AAEA,QAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAChC;AAEA,IAAA,eAAe,CAAC,OAAc,EAAA;AAC5B,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;QAyB3B;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC;AAEzC,QAAA,OAAO,OAAO;IAChB;IAEC,mBAAmB,CAAC,OAAc,EAAE,cAAsB,EAAA;QAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAE3D,IAAI,CAAC,eAAe,CAAC,MAAM;AAAE,YAAA,OAAO,OAAO;AAE3C,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;QACtE,IAAI,YAAY,GAAG,EAAE;YAAE,YAAY,GAAG,EAAE;AAExC,QAAA,MAAM,YAAY,GAAG,CAAC,IAAW,KAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AACf,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAU,KAAI;;;AAGlD,oBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAChB,wBAAA,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,EAAE;4BAC9B,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE;wBACjC;6BAAO;4BACL,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE;wBAC1C;oBACF;AACA,oBAAA,OAAO,EAAE,GAAG,KAAK,EAAE;AACrB,gBAAA,CAAC,CAAC;gBAEF,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE;YAC1C;AAEA,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AACd,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;oBAC5B,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC/B;qBAAO;oBACL,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE;gBACxC;YACF;AAEA,YAAA,OAAO,EAAE,GAAG,GAAG,EAAE;AACnB,QAAA,CAAC,CAAC;AAEJ,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;AAGU,IAAA,qBAAqB,CAAC,OAAc,EAAA;QAC1C,MAAM,MAAM,GAAU,EAAE;AAExB,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CACzC,CAAC,CAAM,KAAK,CAAC,CAAC,UAAU,KAAK,KAAK,CACnC;AACD,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;YACjC;AAAO,iBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;AACnC,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAClB;QACF;AAEA,QAAA,OAAO,MAAM;IACf;+GA7IW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCCY,aAAa,CAAA;AAExB,IAAA,WAAA,GAAA;AAmKO,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAO;QACxD,IAAA,CAAA,QAAQ,GAAQ,IAAI;QAsC9B,IAAA,CAAA,qBAAqB,GAAU,EAAE;IA1Mf;AAChB,IAAA,oBAAoB,CAAC,OAAc,EAAA;AACjC,QAAA,MAAM,YAAY,GAAG,CAAC,OAAc,KAAa;AAC/C,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AAChC,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACnC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;AAEA,IAAA,sBAAsB,CAAC,OAAc,EAAA;AACnC,QAAA,MAAM,YAAY,GAAG,CAAC,OAAc,KAAa;AAC/C,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,CAAC,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AACjC,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACnC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;AAGA,IAAA,qBAAqB,CAAC,OAAc,EAAA;QAClC,IAAI,KAAK,GAAG,CAAC;AAEb,QAAA,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;gBACtE,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/B;iBAAO;AACL,gBAAA,KAAK,IAAI,CAAC,CAAC;YACb;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,wBAAwB,CAAC,OAAc,EAAA;AACrC,QAAA,MAAM,gBAAgB,GAAG,CAAC,OAAc,KAAa;AACnD,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,GAAG,EAAE,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AAC3D,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACvC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,gBAAgB,CAAC,OAAO,CAAC;IAClC;AAEA,IAAA,uBAAuB,CAAC,OAAc,EAAA;AACpC,QAAA,MAAM,gBAAgB,GAAG,CAAC,OAAc,KAAa;AACnD,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,GAAG,EAAE,MAAM,KAAK,MAAM,IAAI,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AAC1D,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACvC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,gBAAgB,CAAC,OAAO,CAAC;IAClC;AAGA,IAAA,mBAAmB,CAAC,IAAW,EAAA;QAC7B,IAAI,UAAU,GAAG,CAAC;QAClB,IAAI,QAAQ,GAAG,CAAC;AAEhB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAG;AACnB,YAAA,IAAI,KAAK,EAAE,OAAO,EAAE;AAClB,gBAAA,UAAU,EAAE;AAEZ,gBAAA,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE;oBACrD,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AACpC,wBAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,4BAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACnD,gCAAA,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM;4BACnC;wBACF;6BAAO;AACL,4BAAA,QAAQ,EAAE;wBACZ;AACF,oBAAA,CAAC,CAAC;gBACJ;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,UAAU,KAAK,CAAC,EAAE;YACpB,OAAO,IAAI,CAAC,MAAM;QACpB;QAEA,OAAO,UAAU,GAAG,QAAQ;IAC9B;IAGF,qBAAqB,CAAC,OAAc,EAAE,aAAoB,EAAA;QACxD,MAAM,MAAM,GAAU,EAAE;AAExB,QAAA,MAAM,WAAW,GAAG,CAAC,GAAQ,KAAI;AAC/B,YAAA,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,EAAE,WAAW,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AAC3I,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AAChI,YAAA,IAAI,aAAa,IAAI,MAAM,EAAE;gBAC3B,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;oBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,oBAAA,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU,GAAE,GAAG,CAAC,KAAK,EAAE,IAAI,GAAE,EAAE;AACjD,oBAAA,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU,GAAE,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI;AACnF,iBAAA,CAAC;YACJ;AAEA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;YACnC;AACF,QAAA,CAAC;AACD,QAAA,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;AAE5B,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,MAAM,qBAAqB,CAAC,OAAc,EAAE,OAAc,EAAA;AAExD,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;gBACd,GAAG,CAAC,KAAK,GAAG;AACV,oBAAA,WAAW,EAAE,IAAI;AACjB,oBAAA,YAAY,EAAE,IAAI;AAClB,oBAAA,eAAe,EAAE,SAAS;AAC1B,oBAAA,gBAAgB,EAAE,IAAI;AACtB,oBAAA,SAAS,EAAE,MAAM;AACjB,oBAAA,IAAI,EAAE;iBACP;YACH;AAEA,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;YAEvD,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;oBAC3B,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE;oBACnC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE;oBAChC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE;gBACpC;qBAAO;oBACL,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI;oBACvC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE;AAChC,oBAAA,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,IAAI;AACzD,oBAAA,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,IAAI;AAC3D,oBAAA,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,EAAE,eAAe,IAAI,SAAS;AACtE,oBAAA,GAAG,CAAC,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK,EAAE,gBAAgB,IAAI,SAAS;AACxE,oBAAA,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,IAAI,MAAM;gBACzD;YACF;AACA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,GAAG,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;YACxE;QACF;AACA,QAAA,OAAO,OAAO;IAChB;AAQE,IAAA,WAAW,CAAC,IAAS,EAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEA,uBAAuB,GAAA;AACrB,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ;AAC1B,QAAA,IAAI,QAAQ,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS,GAAG,KAAK;QACtF,IAAI,UAAU,GAAG,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,YAAY;AAC/G,QAAA,IAAI,UAAU,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,QAAQ,GAAG,MAAM;AAC5E,QAAA,OAAO,EAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAC;IAC3C;AAEQ,IAAA,gCAAgC,CAAC,YAAoB,EAAA;;AAE3D,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;AACxB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxB;AAKF,IAAA,2BAA2B,CAAC,OAAc,EAAA;AACxC,QAAA,MAAM,eAAe,GAAG,CAAC,IAAW,KAAW;YAC7C,IAAI,MAAM,GAAU,EAAE;AAEtB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,gBAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvD;AAEA,gBAAA,IAAI,GAAG,CAAC,KAAK,EAAE;oBACb,MAAM,iBAAiB,GACrB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;AAE5D,oBAAA,MAAM,cAAc,GAClB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,EAAE;AACtD,yBAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,EAAE,CAAC;AAE3D,oBAAA,IAAI,iBAAiB,IAAI,cAAc,EAAE;AACvC,wBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAClB;gBACF;YACF;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QACD,IAAI,CAAC,qBAAqB,GAAG,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,qBAAqB;IACnC;AAIA,IAAA,eAAe,CAAC,OAAY,EAAE,QAAa,EAAE,IAAY,EAAA;QACrD,QAAQ,IAAI;AACV,YAAA,KAAK,QAAQ;gBACX,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC;AAE7C,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAEzD,YAAA,KAAK,UAAU;gBACb,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAC/D,oBAAA,OAAO,OAAO,EAAE,EAAE,KAAK,QAAQ,EAAE,EAAE,IAAI,OAAO,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK;gBAC3E;gBACA,OAAO,OAAO,KAAK,QAAQ;AAE7B,YAAA,KAAK,SAAS;gBACZ,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC;AAE/C,YAAA,KAAK,MAAM;gBACT,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;gBAC/C,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;gBACjD,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,YAAY;sBAC3C,OAAO,KAAK;AACd,sBAAE,WAAW,KAAK,YAAY;AAElC,YAAA;AACE,gBAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;IAEjE;+GAvQW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACJM,MAAM,UAAU,GAA8B;;AAEnD,IAAA,QAAQ,EAAE,eAAe;AACzB,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,OAAO,EAAE,eAAe;AACxB,IAAA,gBAAgB,EAAE,eAAe;AACjC,IAAA,eAAe,EAAE,eAAe;AAChC,IAAA,SAAS,EAAE,eAAe;AAC1B,IAAA,QAAQ,EAAE,eAAe;AACzB,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,YAAY,EAAE,eAAe;;AAG7B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,QAAQ,EAAE,eAAe;AACzB,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,aAAa,EAAE,eAAe;AAC9B,IAAA,iBAAiB,EAAE,eAAe;AAClC,IAAA,kBAAkB,EAAE,eAAe;AACnC,IAAA,uBAAuB,EAAE,eAAe;AACxC,IAAA,SAAS,EAAE,eAAe;AAC1B,IAAA,OAAO,EAAE,YAAY;AACrB,IAAA,OAAO,EAAE,YAAY;AACrB,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,SAAS,EAAE,eAAe;AAC1B,IAAA,SAAS,EAAE,eAAe;AAC1B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,cAAc,EAAE,eAAe;AAC/B,IAAA,cAAc,EAAE,eAAe;;AAG/B,IAAA,UAAU,EAAE,cAAc;AAC1B,IAAA,UAAU,EAAE,cAAc;AAC1B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,SAAS,EAAE,cAAc;AACzB,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,gBAAgB,EAAE,cAAc;AAChC,IAAA,iBAAiB,EAAE,cAAc;AACjC,IAAA,aAAa,EAAE,cAAc;AAC7B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,cAAc,EAAE,cAAc;AAC9B,IAAA,cAAc,EAAE,cAAc;AAC9B,IAAA,SAAS,EAAE,cAAc;AACzB,IAAA,SAAS,EAAE,cAAc;;AAGzB,IAAA,WAAW,EAAE,YAAY;AACzB,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,eAAe,EAAE,YAAY;AAC7B,IAAA,eAAe,EAAE,YAAY;AAC7B,IAAA,SAAS,EAAE,YAAY;;AAGvB,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,aAAa,EAAE,iBAAiB;AAChC,IAAA,aAAa,EAAE,iBAAiB;AAChC,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,OAAO,EAAE;CACV;;MCpEY,kBAAkB,CAAA;AAE7B,IAAA,WAAA,GAAA;QA0GA,IAAA,CAAA,UAAU,GAAU,EAAE;IA1GN;IAChB,sBAAsB,CACpB,OAAc,EACd,OAAc,EACd,kBAA+B,EAC/B,aAAoB,EACpB,cAA+C,EAAA;QAE/C,MAAM,UAAU,GAAY,EAAE;QAC9B,MAAM,qBAAqB,GAAG,CAAC,MAAc,KAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,cAAc,KAAK,MAAM,CAAC;QACvD,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE;YACrD,MAAM,aAAa,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnE,YAAA,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE;AAClC,gBAAA,MAAM,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC;AACzC,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,YAAY,GAAG,CAAC,KAAa,KAAY;oBAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;AACzC,oBAAA,MAAM,KAAK,GACT,MAAM,EAAE,KAAK;AACb,wBAAA,MAAM,EAAE,IAAI;wBACZ,MAAM;AACN,wBAAA,GAAG;AAEL,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,wBAAA,OAAO;6BACJ,GAAG,CAAC,CAAC,IACJ,OAAO,CAAC,KAAK;+BACR,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE;+BACpC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;6BAE1B,IAAI,CAAC,IAAI,CAAC;oBACf;oBACA,OAAO,KAAK,IAAI,EAAE;AACpB,gBAAA,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAG;AAC/B,oBAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC/C,wBAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAoB,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC1E;oBACA,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClC,gBAAA,CAAC,CAAC;gBACF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAW,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AAC9E,gBAAA,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5B;QACF;QACA,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB;AACxC,YAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;gBAChC,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChD,gBAAA,IAAI,CAAC,GAAG;oBAAE;gBACV,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClC,gBAAA,IAAI,SAAS,GAAG,GAAG,EAAE,KAAK;AAC1B,gBAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;oBACnD,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK;gBAClD;gBACA,IAAI,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,GAAG;AAC3H,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,oBAAA,KAAK,GAAG;yBACL,GAAG,CAAC,CAAC,IACJ,OAAO,CAAC,KAAK;0BACT,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,QAAQ,IAAI;AACpC,0BAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;yBAExB,IAAI,CAAC,IAAI,CAAC;gBACf;qBAAO;AACL,oBAAA,KAAK,GAAG,KAAK,IAAI,EAAE;gBACrB;gBACA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC/D,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACzC;YACA,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE;AACtC,iBAAA,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACxB,iBAAA,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AACrB,YAAA,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;QACjC;AACA,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC;AACzD,YAAA,IAAI,UAAU;AAAE,gBAAA,OAAO,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE;QAEA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC7E,QAAA,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,IAAG;AAC1B,YAAA,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC;AACvB,YAAA,OAAO,MAAM,CAAC,MAAM,GAAG,OAAO;AAAE,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/C,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,CAAC;IACJ;AAGA,IAAA,eAAe,CACb,YAAqB,EACrB,QAAQ,GAAG,6CAA6C,EAAA;AAExD,QAAA,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;QAChD,MAAM,UAAU,GAAG;aAChB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC9D,IAAI,CAAC,IAAI,CAAC;QACb,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACvD,QAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,UAAU,CAAC,MAAK;AACd,YAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC,EAAE,IAAI,CAAC;IACV;AAIA,IAAA,MAAM,sBAAsB,CAC1B,IAAY,EACZ,OAAc,EACd,OAAc,EACd,aAAqB,EACrB,aAAqB,EACrB,mBAA2B,CAAC,EAAA;AAE5B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACpB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,gBAAgB,GAAU,EAAE;AAClC,QAAA,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAK,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACxF;iBAAO;AACL,gBAAA,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;QACF,IAAI,mBAAmB,GAAG,CAAC;AAC3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;YACtB,mBAAmB,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;QAClD;AACA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC9B,YAAA,mBAAmB,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACjF;QAEA,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,OAAO,KAAI;AAClC,YAAA,MAAM,cAAc,GAAG,aAAa,GAAG,OAAO;AAC9C,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,cAAc,KAAK,cAAc,CAAC;AACnE,YAAA,IAAI,CAAC,GAAG;gBAAE;YAEV,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,KAAI;AACnC,gBAAA,MAAM,WAAW,GAAG,mBAAmB,GAAG,OAAO;gBACjD,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,gBAAgB,CAAC,MAAM;oBAAE;AAE/D,gBAAA,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC;gBAClD,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC;AAC/C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,OAAO,IAAI,CAAC,UAAU;IACxB;IAGA,cAAc,CAAC,GAAQ,EAAE,MAAW,EAAE,MAAW,EAAE,eAAe,GAAG,KAAK,EAAA;AACxE,QAAA;QACA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;YAAE;AACvD,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;AACzB,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,GAAW,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC;AAC7E,QAAA,IAAI,MAAM,IAAI,OAAO,EAAE;YACrB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;gBACjD,MAAM,CAAC,OAAO,CAAC,GAAG;AAChB,oBAAA,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;AAClB,oBAAA,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM;iBAC9B;YACH;iBAAO;AACL,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM;YAC1B;QACF;AACA,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE;AAChB,YAAA,SAAS,EAAE,YAAY;SACxB;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B;IAGA,uBAAuB,CACrB,OAAc,EACd,kBAA+B,EAC/B,aAAoB,EACpB,OAAc,EACd,cAA2D,EAAA;AAE3D,QAAA,IAAI,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC;AAC9B,QAAA,IAAI,kBAAkB,EAAE,IAAI,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,kBAAkB,CAAC;YACvC,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,GAAQ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CACpD;;QAEH;AACK,aAAA,IAAI,aAAa,EAAE,MAAM,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,YAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;AAChC,gBAAA,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,QAAQ,CAAC;AACrE,gBAAA,IAAI,CAAC,GAAG;oBAAE;gBACV,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChC,gBAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;oBACnD,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtC;gBACA,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;YACnC;;QAEF;QACA,OAAO,EAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAC;IACjE;AAGA,IAAA,gBAAgB,CACd,YAAqB,EACrB,QAAQ,GAAG,6CAA6C,EAAA;AAExD,QAAA,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;QAEhD,MAAM,UAAU,GAAG;aAChB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC9D,IAAI,CAAC,IAAI,CAAC;QAEb,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;QAG1E,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACvD,QAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3D,UAAU,CAAC,MAAK;AACd,YAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC,EAAE,IAAI,CAAC;IACV;+GAxOW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCEY,UAAU,CAAA;AACvB,IAAA,SAAS,CAAC,KAAY,EAAE,UAAkB,EAAG,GAAY,EAAA;AACvD,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAEvC,QAAA,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE;AAEvC,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,IAAG;AACvB,YAAA,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI;AACtC,YAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC7D,QAAA,CAAC,CAAC;IACJ;+GAVa,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,CAAA;;4FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAJtB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCFY,iBAAiB,CAAA;IAC5B,SAAS,CAAC,OAAc,EAAE,MAA+B,EAAA;AACvD,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;IACjF;+GAJW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,IAAI;mBAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAI,UAAU,EAAE,IAAI,EAAE;;;MCIlD,kBAAkB,CAAA;AAJ/B,IAAA,WAAA,GAAA;AAMU,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAsC;AAsJpE,IAAA;AApJC,IAAA,SAAS,CACP,KAAuC,EACvC,KAAoE,EACpE,aAA2C,UAAU,EAAA;QAErD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,kBAAkB;;AAEtD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,UAAU,IAAI,YAAY,CAAC;AACvF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,UAAU,IAAI,OAAO,CAAC;;QAGlF,MAAM,UAAU,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEjE,QAAA,IAAI,WAAmB;AACvB,QAAA,IAAI,UAAU,KAAK,MAAM,EAAE;YACzB,WAAW,GAAG,UAAU;QAC1B;AAAO,aAAA,IAAI,UAAU,KAAK,MAAM,EAAE;YAChC,WAAW,GAAG,UAAU;QAC1B;aAAO;AACL,YAAA,WAAW,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,UAAU,EAAE;QAC7C;AAEA,QAAA,IAAI,IAAU;QACd,IAAI,UAAU,EAAE;;AAEd,YAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;;AAE7B,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAA,EAAG,OAAO,CAAA,GAAA,CAAK,GAAG,OAAO;AACxG,YAAA,MAAM,cAAc,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,WAAW,EAAE;AAChD,YAAA,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC;QACjC;aAAO;;AAEL,YAAA,IAAI,KAAK,YAAY,IAAI,EAAE;gBACzB,IAAI,GAAG,KAAK;YACd;iBAAO;AACL,gBAAA,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;YACxB;YACA,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE;AACzB,gBAAA,OAAO,EAAE;YACX;QACF;QAEA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC;IACrD;AAEQ,IAAA,UAAU,CAAC,IAAU,EAAE,MAAc,EAAE,QAAgB,EAAA;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;AACrD,QAAA,OAAO,CAAC,QAAQ,GAAG,QAAQ;QAE3B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC;AAC3D,QAAA,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;IAC/B;AAEQ,IAAA,wBAAwB,CAAC,MAAc,EAAA;QAC7C,MAAM,QAAQ,GAAG,MAAM;QACvB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAClC,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,EAAE;QAC/C;QAEA,MAAM,OAAO,GAA+B,EAAE;;;AAI9C,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,IAAI,GAAG,SAAS;QAC1B;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAChC,YAAA,OAAO,CAAC,IAAI,GAAG,SAAS;QAC1B;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,KAAK,GAAG,MAAM;QACxB;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,KAAK,GAAG,OAAO;QACzB;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAChC,YAAA,OAAO,CAAC,KAAK,GAAG,SAAS;QAC3B;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,CAAC,KAAK,GAAG,SAAS;QAC3B;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACzB,YAAA,OAAO,CAAC,GAAG,GAAG,SAAS;QACzB;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,CAAC,GAAG,GAAG,SAAS;QACzB;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,OAAO,GAAG,MAAM;QAC1B;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,OAAO,GAAG,OAAO;QAC3B;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACjD,YAAA,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,SAAS;AAC5D,YAAA,OAAO,CAAC,MAAM,GAAG,KAAK;QACxB;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxD,YAAA,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,SAAS;AAC5D,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI;QACvB;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACzB,YAAA,OAAO,CAAC,MAAM,GAAG,SAAS;QAC5B;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,CAAC,MAAM,GAAG,SAAS;QAC5B;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACzB,YAAA,OAAO,CAAC,MAAM,GAAG,SAAS;QAC5B;AAAO,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,CAAC,MAAM,GAAG,SAAS;QAC5B;;AAGA,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAChD,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI;QACvB;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC;AAC9C,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,4BAA4B,CAAC,aAAqB,EAAA;;AAExD,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;AACxB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAClB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxB;+GAvJW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCiHY,sBAAsB,CAAA;IAcjC,WAAA,CACU,UAAsB,EACtB,GAAsB,EAAA;QADtB,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,GAAG,GAAH,GAAG;QAfJ,IAAA,CAAA,MAAM,GAAgB,EAAE;QACxB,IAAA,CAAA,QAAQ,GAAW,GAAG;AACrB,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAyC;AAC3E,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAyC;AAC3E,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAsD;QAErG,IAAA,CAAA,aAAa,GAAgB,EAAE;QAC/B,IAAA,CAAA,cAAc,GAAgB,EAAE;QAChC,IAAA,CAAA,aAAa,GAAG,CAAC;QAET,IAAA,CAAA,cAAc,GAA0B,IAAI;QAC5C,IAAA,CAAA,gBAAgB,GAAuB,IAAI;IAKhD;IAEH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,2BAA2B,CAAC;QAChG,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,qBAAqB,EAAE;IAC9B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;QAClC;IACF;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE;AAE5B,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MAAK;YAC5C,IAAI,CAAC,qBAAqB,EAAE;AAC9B,QAAA,CAAC,CAAC;;QAGF,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa;QACjE,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC;QAC5C;IACF;IAEQ,qBAAqB,GAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE;AAEnD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ;QACxF,IAAI,UAAU,GAAG,CAAC;QAClB,MAAM,OAAO,GAAgB,EAAE;QAC/B,MAAM,QAAQ,GAAgB,EAAE;;AAGhC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAEjD,YAAA,IAAI,UAAU,GAAG,UAAU,IAAI,cAAc,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACrE,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACnB,gBAAA,UAAU,IAAI,UAAU,GAAG,CAAC,CAAC;YAC/B;iBAAO;AACL,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACtB;QACF;;AAGA,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC;AACrE,YAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;;AAG3C,YAAA,IAAI,UAAU,GAAG,eAAe,GAAG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,gBAAA,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;gBAClC,IAAI,YAAY,EAAE;AAChB,oBAAA,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;gBAChC;YACF;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO;AAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEQ,IAAA,kBAAkB,CAAC,KAAgB,EAAA;;QAEzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;AACvC,QAAA,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,OAAO,SAAS,GAAG,OAAO;IAC5B;AAEQ,IAAA,uBAAuB,CAAC,KAAa,EAAA;AAC3C,QAAA,MAAM,IAAI,GAAG,CAAA,CAAA,EAAI,KAAK,EAAE;AACxB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE;QAClB,OAAO,SAAS,GAAG,OAAO;IAC5B;IAEA,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD;IAEA,iBAAiB,CAAC,KAAiB,EAAE,KAAgB,EAAA;QACnD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7C;IAEA,iBAAiB,CAAC,KAAiB,EAAE,KAAgB,EAAA;QACnD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7C;AAEA,IAAA,oBAAoB,CAAC,KAAiB,EAAA;AACpC,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9E;;IAEF,OAAO,GAAA;QACL,IAAI,CAAC,qBAAqB,EAAE;IAC9B;+GAtHa,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtHnC,ylBAmBM,EAAA,MAAA,EAAA,CAAA,uwDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDNM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAyGX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA5GlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,ylBAAA,EAAA,MAAA,EAAA,CAAA,uwDAAA,CAAA,EAAA;+GA0Gd,MAAM,EAAA,CAAA;sBAAd;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACS,eAAe,EAAA,CAAA;sBAAxB;gBACS,eAAe,EAAA,CAAA;sBAAxB;gBACS,kBAAkB,EAAA,CAAA;sBAA3B;;;AE1DH;AAEA;AACA,IAAI,mBAAmB,GAAQ,IAAI;AACnC,IAAI,kBAAkB,GAAQ,IAAI;AAClC,IAAI,gBAAgB,GAAQ,IAAI;MAkEnB,kBAAkB,CAAA;;IA8C/B,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;IACtC;IA2KE,IAAa,iBAAiB,CAAC,KAAU,EAAA;AACvC,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AACA,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,kBAAkB;IAChC;;;AAmEA,IAAA,gBAAgB,CAAC,SAAwB,EAAA;AACzC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;QAC3B,IAAI,SAAS,KAAK,aAAa;YAAE,OAAO,IAAI,CAAC,WAAW;QACxD,IAAI,SAAS,KAAK,cAAc;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,WAAW;AAC1D,QAAA,OAAO,IAAI;IACb;AAEE,IAAA,mBAAmB,CAAC,MAAW,EAAA;AAC7B,QAAA,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,UAAU,EAAE;AAC/C,YAAA,OAAO,MAAM,CAAC,cAAc,EAAE;QAChC;QACA,OAAO,MAAM,CAAC,cAAc;IAC9B;IAgEF,gBAAgB,CAAC,KAAiB,EAAE,SAAc,EAAA;;AAEhD,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;;AAGA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,mBAAmB,GAAG,SAAS;AACpC,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;AACpC,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAChC,QAAA,CAAC,EAAE,EAAE,CAAC,CAAC;IACT;AAEA,IAAA,qBAAqB,CAAC,KAAiB,EAAE,UAAe,EAAE,IAAa,EAAA;;AAErE,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;;AAGA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,wBAAwB,GAAG,UAAU;AAC1C,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAChC,QAAA,CAAC,EAAE,EAAE,CAAC,CAAC;IACT;AAEA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE;IACzE;IAEA,gBAAgB,GAAA;;AAEd,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;;AAGA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAChC,QAAA,CAAC,EAAE,GAAG,CAAC,CAAC;IACV;IAEA,wBAAwB,CAAC,KAAiB,EAAE,cAAqB,EAAA;;AAE/D,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;;AAGA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,2BAA2B,GAAG,cAAc;YACjD,IAAI,CAAC,4BAA4B,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE;AACpF,YAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;AACvC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAChC,QAAA,CAAC,EAAE,EAAE,CAAC,CAAC;IACT;IAEA,wBAAwB,GAAA;;AAEtB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;;AAGA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,2BAA2B,GAAG,KAAK;AACxC,YAAA,IAAI,CAAC,2BAA2B,GAAG,EAAE;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAChC,QAAA,CAAC,EAAE,GAAG,CAAC,CAAC;IACV;AAEA,IAAA,eAAe,CAAC,SAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,EAAE;AACzB,QAAA,OAAO,UAAU,SAAS,CAAC,cAAc,IAAI,CAAC,UAAU;IAC1D;AAEA,IAAA,aAAa,CAAC,GAAQ,EAAA;QACpB,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;IACrG;IAEA,4BAA4B,GAAA;AAC1B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;;;;;;;;;;;;;;;;;;;;;;;AA2BA,IAAA,aAAa,CAAC,IAAY,EAAA;AACxB,QAAA,QAAQ,IAAI,EAAE,WAAW,EAAE;AACzB,YAAA,KAAK,MAAM,EAAE,OAAO,SAAS;AAC7B,YAAA,KAAK,QAAQ,EAAE,OAAO,SAAS;AAC/B,YAAA,KAAK,OAAO,EAAE,OAAO,SAAS;AAC9B,YAAA,SAAS,OAAO,SAAS;;IAE7B;AAEA,IAAA,kBAAkB,CAAC,IAAY,EAAA;AAC7B,QAAA,QAAQ,IAAI,EAAE,WAAW,EAAE;AACzB,YAAA,KAAK,MAAM,EAAE,OAAO,kBAAkB;AACtC,YAAA,KAAK,QAAQ,EAAE,OAAO,oBAAoB;AAC1C,YAAA,KAAK,OAAO,EAAE,OAAO,mBAAmB;AACxC,YAAA,SAAS,OAAO,qBAAqB;;IAEzC;AAEA,IAAA,cAAc,CAAC,MAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,EAAE;QACrC,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,KAAK;AAC9B,YAAA,IAAI,EAAE,CAAA,EAAG,SAAS,CAAC,cAAc,CAAA,CAAA,CAAG;AACpC,YAAA,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,UAAU,EAAE,eAAe,IAAI,SAAS,CAAC,SAAS,CAAC;AAC5F,YAAA,OAAO,EAAE,CAAA,OAAA,EAAU,SAAS,CAAC,cAAc,IAAI,CAAC,CAAA,QAAA,CAAU;YAC1D,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC,CAAC;IACL;;AAoIE,IAAA,eAAe,CAAC,MAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,MAAM;QAC1B,IAAI,MAAM,GAAG,MAAM;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;AACnC,YAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;AACnE,QAAA,CAAC,CAAC;;QAEF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;;AAEnD,QAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;;AAEtD,QAAA,IAAI,MAAM,KAAK,gBAAgB,EAAE;AAC/B,YAAA,OAAO,kBAAkB;QAC3B;AACA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,WAAA,CAAoB,QAAkB,EAAU,GAAqB,EAAU,aAA6B,EAAA;;;QAAxF,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAAoB,IAAA,CAAA,GAAG,GAAH,GAAG;QAA4B,IAAA,CAAA,aAAa,GAAb,aAAa;;;;;;AAnqB5F,QAAA,IAAA,CAAA,YAAY,GAAgB,IAAI,GAAG,EAAE;AAC7B,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAO;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAO;;AAEvC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAU;AACrC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAS;AACpC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,eAAe,CAAQ,EAAE,CAAC;AAC5C,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,OAAO,EAAQ;AAC3C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;;QAG9B,IAAA,CAAA,qBAAqB,GAAG,KAAK;;AAG3B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAyD;AAC5E,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,GAAG,EAA8C;AACxE,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,GAAG,EAAuB;;QAGzC,IAAA,CAAA,mBAAmB,GAAG,EAAE;QACxB,IAAA,CAAA,gBAAgB,GAAG,GAAG;AACtB,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,GAAG,EAAkB;AAC3C,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,GAAG,EAAkB;AAC9C,QAAA,IAAA,CAAA,iBAAiB,GAAG,EAAE,CAAC;QACvB,IAAA,CAAA,wBAAwB,GAAG,EAAE;QAC7B,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,eAAe,GAA2B,MAAM;QAChD,IAAA,CAAA,aAAa,GAAG,CAAC;QACjB,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,kBAAkB,GAAG,CAAC;;AAItB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAqB;AAC5C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,GAAG,EAAyB;AACjD,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,GAAG,EAAkB;AAC3C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,GAAG,EAAU;AAC5B,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAU;;QAM7B,IAAA,CAAA,oBAAoB,GAAgC,IAAI;AACxD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,GAAG,EAAsB;AACjD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAoB;;QAGjD,IAAA,CAAA,gBAAgB,GAAQ,EAAE;;QAG1B,IAAA,CAAA,OAAO,GAAU,EAAE;;QAEnB,IAAA,CAAA,OAAO,GAAU,EAAE;;QAGnB,IAAA,CAAA,SAAS,GAAW,EAAE;;QAGtB,IAAA,CAAA,eAAe,GAAW,EAAE;;QAG5B,IAAA,CAAA,kBAAkB,GAAY,IAAI;;QAGlC,IAAA,CAAA,uBAAuB,GAAuB,SAAS;;QAGvD,IAAA,CAAA,sBAAsB,GAAuB,SAAS;;QAGtD,IAAA,CAAA,qBAAqB,GAAW,SAAS;;QAGzC,IAAA,CAAA,yBAAyB,GAAW,SAAS;;QAG7C,IAAA,CAAA,mBAAmB,GAAY,KAAK;;QAGpC,IAAA,CAAA,aAAa,GAAuB,wBAAwB;;QAG5D,IAAA,CAAA,yBAAyB,GAAuB,MAAM;;QAGtD,IAAA,CAAA,mBAAmB,GAAuB,MAAM;;QAGhD,IAAA,CAAA,0BAA0B,GAAuB,MAAM;;QAGvD,IAAA,CAAA,uBAAuB,GAAuB,MAAM;;QAGpD,IAAA,CAAA,aAAa,GAAuB,MAAM;;QAG1C,IAAA,CAAA,eAAe,GAAuB,MAAM;;QAG5C,IAAA,CAAA,mBAAmB,GAAuB,EAAE;;QAG5C,IAAA,CAAA,iBAAiB,GAAuB,EAAE;;QAG1C,IAAA,CAAA,gBAAgB,GAAuB,GAAG;;QAG1C,IAAA,CAAA,cAAc,GAAuB,GAAG;;QAGxC,IAAA,CAAA,yBAAyB,GAAuB,EAAE;;QAGlD,IAAA,CAAA,wBAAwB,GAAuB,EAAE;;QAGjD,IAAA,CAAA,eAAe,GAAW,EAAE;;QAG5B,IAAA,CAAA,+BAA+B,GAAuB,EAAE;;QAGxD,IAAA,CAAA,gBAAgB,GAAwB,KAAK;;QAG7C,IAAA,CAAA,aAAa,GAAwB,KAAK;;QAG1C,IAAA,CAAA,UAAU,GAAuB,YAAY;;QAG7C,IAAA,CAAA,YAAY,GAAY,KAAK;;QAG7B,IAAA,CAAA,aAAa,GAAW,CAAC;;QAIzB,IAAA,CAAA,kBAAkB,GAAW,EAAE;;QAG/B,IAAA,CAAA,iBAAiB,GAAY,KAAK;;QAGlC,IAAA,CAAA,gBAAgB,GAAY,KAAK;;QAGjC,IAAA,CAAA,YAAY,GAAY,KAAK;;QAG7B,IAAA,CAAA,mBAAmB,GAAW,SAAS;;QAIvC,IAAA,CAAA,aAAa,GAAU,EAAE;;QAIzB,IAAA,CAAA,OAAO,GAAY,KAAK;;QAGxB,IAAA,CAAA,sBAAsB,GAAoB,MAAM;;QAGhD,IAAA,CAAA,wBAAwB,GAAoB,MAAM;;QAGlD,IAAA,CAAA,kBAAkB,GAAY,KAAK;;QAInC,IAAA,CAAA,UAAU,GAAW,YAAY;;QAGjC,IAAA,CAAA,WAAW,GAAW,EAAE;;QAIxB,IAAA,CAAA,OAAO,GAAU,EAAE;;QAQnB,IAAA,CAAA,WAAW,GAAG,KAAK;;QAGnB,IAAA,CAAA,SAAS,GAAG,IAAI;;QAIhB,IAAA,CAAA,WAAW,GAAqB,EAAE;;AAIlC,QAAA,IAAA,CAAA,aAAa,GAAuB;AAC3C,YAAA,KAAK,EAAE;SACR;;QAGQ,IAAA,CAAA,cAAc,GAAU,EAAE;;QAI1B,IAAA,CAAA,aAAa,GAA+C,IAAI;QAUjE,IAAA,CAAA,kBAAkB,GAAQ,EAAE;QAG3B,IAAA,CAAA,mBAAmB,GAAQ,QAAQ;AAInC,QAAA,IAAA,CAAA,aAAa,GAAsD,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;;;QAKhH,IAAA,CAAA,gBAAgB,GAAW,EAAE;;QAG7B,IAAA,CAAA,sBAAsB,GAAG,EAAE;;QAG3B,IAAA,CAAA,0BAA0B,GAAG,EAAE;;QAG/B,IAAA,CAAA,oBAAoB,GAAG,EAAE;QAGzB,IAAA,CAAA,QAAQ,GAAW,WAAW;QAE9B,IAAA,CAAA,WAAW,GAAY,KAAK;QAE5B,IAAA,CAAA,mBAAmB,GAAW,yBAAyB;QAEvD,IAAA,CAAA,oBAAoB,GAAW,yBAAyB;;QAGxD,IAAA,CAAA,qBAAqB,GAAY,KAAK;QACtC,IAAA,CAAA,yBAAyB,GAAY,KAAK;QAC1C,IAAA,CAAA,gBAAgB,GAAY,KAAK;;QAGjC,IAAA,CAAA,2BAA2B,GAAW,SAAS;;QAG/C,IAAA,CAAA,gCAAgC,GAAW,SAAS;QAEpD,IAAA,CAAA,SAAS,GAAU,EAAE;AAGrB,QAAA,IAAA,CAAA,yBAAyB,GAAG;AACnC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,YAAA,sBAAsB,EAAE,IAAI;AAC5B,YAAA,sBAAsB,EAAE,IAAI;AAC5B,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,gBAAgB,EAAE,IAAI;SAGvB;;QAsBQ,IAAA,CAAA,wBAAwB,GAAG,KAAK;QAChC,IAAA,CAAA,oBAAoB,GAAG,GAAG;AAC1B,QAAA,IAAA,CAAA,gBAAgB,GAAG,EAAE,CAAC;QACvB,IAAA,CAAA,wBAAwB,GAAY,EAAE;QACtC,IAAA,CAAA,uBAAuB,GAAG,CAAC;QAC3B,IAAA,CAAA,oBAAoB,GAAG,KAAK;;;;;;;AAgBnB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAO;;AAGtC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAO;;AAGvC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAW;AAElD,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAE;AAEpD,QAAA,IAAA,CAAA,iBAAiB,GAAsB,IAAI,YAAY,EAAE;AAEzD,QAAA,IAAA,CAAA,mBAAmB,GAAsB,IAAI,YAAY,EAAO;AAEhE,QAAA,IAAA,CAAA,yBAAyB,GAAsB,IAAI,YAAY,EAAO;;QAKlF,IAAA,CAAA,mBAAmB,GAAQ,IAAI;QAC/B,IAAA,CAAA,wBAAwB,GAAQ,IAAI;QACpC,IAAA,CAAA,2BAA2B,GAAU,EAAE;QACvC,IAAA,CAAA,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAChC,IAAA,CAAA,wBAAwB,GAAY,KAAK;QACzC,IAAA,CAAA,yBAAyB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC1C,IAAA,CAAA,iBAAiB,GAAU,EAAE;QAC7B,IAAA,CAAA,kBAAkB,GAAQ,IAAI;QAC9B,IAAA,CAAA,gBAAgB,GAAQ,IAAI;QAC5B,IAAA,CAAA,gBAAgB,GAAY,KAAK;QACjC,IAAA,CAAA,0BAA0B,GAAY,KAAK;QAC3C,IAAA,CAAA,yBAAyB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC1C,IAAA,CAAA,qBAAqB,GAAU,EAAE;QACjC,IAAA,CAAA,uBAAuB,GAAY,KAAK;QACxC,IAAA,CAAA,2BAA2B,GAAY,KAAK;QAC5C,IAAA,CAAA,4BAA4B,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;;QAGrC,IAAA,CAAA,kBAAkB,GAAQ,IAAI;QAC9B,IAAA,CAAA,kBAAkB,GAAQ,IAAI;QA2KpC,IAAA,CAAA,cAAc,GAAU,EAAE;QAC1B,IAAA,CAAA,SAAS,GAAQ,IAAI;QACrB,IAAA,CAAA,gBAAgB,GAAQ,IAAI;QAC5B,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAC3B,IAAA,CAAA,eAAe,GAAG,KAAK;QACvB,IAAA,CAAA,SAAS,GAAY,KAAK;QAE1B,IAAA,CAAA,YAAY,GAAW,EAAE;QACzB,IAAA,CAAA,mBAAmB,GAAG,IAAI;QAC1B,IAAA,CAAA,sBAAsB,GAA6B,IAAI;;QAGvD,IAAA,CAAA,eAAe,GAAkB,IAAI;QACrC,IAAA,CAAA,eAAe,GAA0B,IAAI;QAE7C,IAAA,CAAA,eAAe,GAAU,EAAE;QAC3B,IAAA,CAAA,eAAe,GAAU,EAAE;QAC3B,IAAA,CAAA,eAAe,GAAkB,EAAE;QACnC,IAAA,CAAA,iBAAiB,GAAU,EAAE;QAC7B,IAAA,CAAA,eAAe,GAAG,GAAG;QACrB,IAAA,CAAA,UAAU,GAAW,EAAE;QACvB,IAAA,CAAA,YAAY,GAAQ,EAAE;QACtB,IAAA,CAAA,qBAAqB,GAAG,EAAE;QAC1B,IAAA,CAAA,oBAAoB,GAAG,EAAE;QACzB,IAAA,CAAA,gBAAgB,GAAG,EAAE;QACrB,IAAA,CAAA,uBAAuB,GAAG,EAAE;QAC5B,IAAA,CAAA,kBAAkB,GAAG,EAAE;QACvB,IAAA,CAAA,kBAAkB,GAAG,EAAE;QACvB,IAAA,CAAA,oBAAoB,GAAG,EAAE;QACzB,IAAA,CAAA,qBAAqB,GAAG,KAAK;QAC7B,IAAA,CAAA,aAAa,GAAG,KAAK;QACrB,IAAA,CAAA,kBAAkB,GAAG,EAAE;QACvB,IAAA,CAAA,cAAc,GAAkB,IAAI;AACrC,QAAA,IAAA,CAAA,YAAY,GAAa;;YAEtB,OAAO;YACP,aAAa;YACb,aAAa;YACb,SAAS;YACT,SAAS;YACT,cAAc;YACd,MAAM;YACN,SAAS;YACT,eAAe;YACf,UAAU;YACV,YAAY;YACZ,QAAQ;YACR,aAAa;YACb,QAAQ;YACR,wBAAwB;YACxB,UAAU;YACV,QAAQ;YACR,SAAS;YACT,QAAQ;YACR,UAAU;YACV,eAAe;YACf,eAAe;YACf,gBAAgB;YAChB,qBAAqB;YACrB,eAAe;YACf,oBAAoB;YACpB,oBAAoB;YACpB,uBAAuB;YACvB,mBAAmB;YACnB,sBAAsB;YACtB,kBAAkB;YAClB,iBAAiB;YACjB,oBAAoB;YACpB,iBAAiB;YACjB,WAAW;YACX,YAAY;YACZ,cAAc;YACd,SAAS;YACT,YAAY;YACZ,mBAAmB;YACnB,aAAa;YACb,cAAc;YACd,UAAU;YACV,mBAAmB;YACnB,gBAAgB;YAChB,iBAAiB;YACjB,QAAQ;YACR,aAAa;YACb,SAAS;YACT,QAAQ;YACR,QAAQ;YACR,iBAAiB;YACjB,cAAc;YACd,SAAS;YACT,UAAU;YACV,WAAW;YACX,WAAW;YACX,YAAY;YACZ,OAAO;YACP,WAAW;YACX;SACD;AAED,QAAA,IAAA,CAAA,SAAS,GAAa;YACpB,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;SACjE;;AAMO,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;;;AAIhD,QAAA,IAAA,CAAA,gBAAgB,GAAG;AACjB,YAAA;AACE,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,OAAO,EAAE;AACV,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,OAAO,EAAE;AACV;SACF;;AAiCO,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QA+O3B,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,gBAAgB,GAAG,CAAC;QAoHpB,IAAA,CAAA,uBAAuB,GAA2B,MAAM;QAmIhE,IAAA,CAAA,iBAAiB,GAAU,EAAE;QAC7B,IAAA,CAAA,aAAa,GAAU,EAAE;QACzB,IAAA,CAAA,kBAAkB,GAAU,EAAE;QAE9B,IAAA,CAAA,wBAAwB,GAAU,EAAE;QACpC,IAAA,CAAA,oBAAoB,GAAU,EAAE;QAChC,IAAA,CAAA,yBAAyB,GAAU,EAAE;;AA0B7B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,GAAG,EAAyB;QACjD,IAAA,CAAA,cAAc,GAA0B,IAAI;;AAI5C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAe,CAAC;AACrC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAe,CAAC;AACtC,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,GAAG,EAAiB,CAAC;;AAG9C,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAuE;AAC9F,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAgE;QACvF,IAAA,CAAA,oBAAoB,GAAkB,IAAI;AACjC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC;QAClB,IAAA,CAAA,cAAc,GAAG,GAAG;;AAoK7B,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,GAAG,EAA0D;;QAsB3F,IAAA,CAAA,uBAAuB,GAAG,IAAI;QAC9B,IAAA,CAAA,cAAc,GAAmB,EAAE;QACnC,IAAA,CAAA,sBAAsB,GAAG,KAAK;QAC9B,IAAA,CAAA,mBAAmB,GAAmB,EAAE;QACxC,IAAA,CAAA,2BAA2B,GAAG,KAAK;;AAGnC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,GAAG,EAAiB;QACrC,IAAA,CAAA,WAAW,GAAG,GAAG;;AAmEjB,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAA2B;;QAiBxD,IAAA,CAAA,cAAc,GAAiD,EAAE;QACjE,IAAA,CAAA,WAAW,GAAG,KAAK;;AAuHnB,QAAA,IAAA,CAAA,kBAAkB,GAAuB;AAC/C,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,eAAe,EAAE,CAAC;AAClB,YAAA,WAAW,EAAE;SACd;;AAkJO,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAkB;AACzC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,GAAG,EAA4D;AACtF,QAAA,IAAA,CAAA,qBAAqB,GAAG;YAC9B,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,GAAG;SAChB;;QAGD,IAAA,CAAA,OAAO,GAAuB,EAAwB;QAoTtD,IAAA,CAAA,uBAAuB,GAAG,CAAC;;QAmN3B,IAAA,CAAA,YAAY,GAA2B,IAAI;QAoG3C,IAAA,CAAA,aAAa,GAAG,KAAK;;AAyhBrB,QAAA,IAAA,CAAA,YAAY,GAAgB,IAAI,GAAG,EAAE;QA6PrC,IAAA,CAAA,eAAe,GAAG,KAAK;QAyEvB,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAG3B,IAAA,CAAA,eAAe,GAAG,EAAE;QACpB,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,WAAW,GAAU,EAAE;AA4DvB,QAAA,IAAA,CAAA,oBAAoB,GAAG,CAAC,CAAS,EAAE,IAAS,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC;QAE7D,IAAA,CAAA,iBAAiB,GAAG,KAAK;QACzB,IAAA,CAAA,iBAAiB,GAAG,KAAK;QACzB,IAAA,CAAA,aAAa,GAAkB,IAAI;QAuB3C,IAAA,CAAA,aAAa,GAAU,EAAE;;QAUjB,IAAA,CAAA,aAAa,GAAkB,IAAI;QACnC,IAAA,CAAA,kBAAkB,GAAkB,IAAI;QAGhD,IAAA,CAAA,UAAU,GAAG,CAAC;AAEJ,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AA0E7C,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,IAAA,CAAA,UAAU,GAAG,CAAC,CAAC;AACf,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,CAAC;QAER,IAAA,CAAA,SAAS,GAAkB,IAAI;QAC/B,IAAA,CAAA,gBAAgB,GAAG,CAAC;AAQpB,QAAA,IAAA,CAAA,QAAQ,GAAG,EAAE,CAAC;QAkDtB,IAAA,CAAA,cAAc,GAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDvB,QAAA,IAAA,CAAA,sBAAsB,GAAG,CAAC,IAAkB,EAAE,IAAsB,KAAI;;AAEtE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;YACtB,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE;AAC3C,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,YAAY,CACjD;YACH;AACA,YAAA,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY;AAC7C,QAAA,CAAC;QAiLD,IAAA,CAAA,4BAA4B,GAAG,KAAK;QACpC,IAAA,CAAA,uBAAuB,GAAG,KAAK;QAa/B,IAAA,CAAA,qBAAqB,GAAQ,IAAI;AAKjC,QAAA,IAAA,CAAA,WAAW,GAAG,OAAO,KAA4B,EAAE,OAAe,KAAI;AACpE,YAAA,MAAM,OAAO,GAAI,IAAY,CAAC,OAAO,CAAC;AACtC,YAAA,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,YAAY;gBAAE;YAChD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAI;AACjD,gBAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAChD,oBAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,CAAC,UAAU,CAAC;gBAC5D;gBACA,OAAO,GAAG,CAAC,UAAU;AACvB,YAAA,CAAC,CAAC;YACF,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM;YACjE,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM;AAC/D,YAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,cAAc,CAC5C;AACD,YAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,aAAa,CAC3C;AACD,YAAA,MAAM,SAAS,GAAG,CAAC,IAAS,KAAc;AACxC,gBAAA,IAAI,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AAClD,oBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,CAAC;gBACvD;AACA,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACrB,YAAA,CAAC;YACD,MAAM,UAAU,GAAG,SAAS,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC;AAChD,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC;AACtB,kBAAG,EAAoB,CAAC,MAAM,CAC5B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAAkB,CAC7E;kBAED,EAAE;AACN,YAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB;YACrD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC;YACzC,eAAe,CAAE,IAAY,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;AAE3E,YAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC;AAC5F,YAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC;YAC3F,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,CAAC;;AAE3E,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAC7B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAC/B;AAClB,gBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;oBAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI;oBAC/C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAE;AACvC,oBAAA,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO;AAChC,oBAAA,IAAI,MAAM,KAAK,CAAC,EAAE;AAChB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACjC,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;wBAC5B,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,WAAA,EAAc,MAAM,KAAK;wBAC9C,KAAK,EAAE,CAAC,WAAW;AACnB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,8CAA8C;AACpE,wBAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe;wBACpC,MAAM,MAAM,GAAG,MAAK;AAClB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AACvB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC;AACjD,wBAAA,CAAC;AACD,wBAAA,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC;oBAC9C;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;QAiGD,IAAA,CAAA,WAAW,GAAa,EAAE;AA8B1B,QAAA,IAAA,CAAA,qBAAqB,GAAG,OAAO,KAA4B,EAAE,OAAe,KAAI;AAC9E,YAAA,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,YAAY;gBAAE;AAEhD,YAAA,MAAM,MAAM,GACV,OAAO,IAAI;AACT,kBAAE;kBACA,OAAO,IAAI;AACX,sBAAE;sBACA,EAAE;AAEV,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI;YAC9B,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAC3B,CAAC,GAAQ,KACP,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,gBAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,CACpE;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CACvC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CACrC;YACD,MAAM,aAAa,GAAG,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAI;gBACxD,MAAM,aAAa,GACjB,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,KAAK,EAAE,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,MAAM;AACnF,gBAAA,OAAO,aAAa,IAAI,GAAG,EAAE,UAAU;AACzC,YAAA,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK;YAC9D,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK;AAC5D,YAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,IAAI,aAAa,CACzC;AACD,YAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,IAAI,YAAY,CACxC;AACD,YAAA,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC;AAC/C,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC;AACtB,kBAAG,EAAoB,CAAC,MAAM,CAC5B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAAkB,CAC7E;kBAED,EAAE;YAEN,MAAM,cAAc,GAAI,IAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAChD,CAAC,GAAQ,KACP,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,gBAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,CACpE;YAED,MAAM,oBAAoB,GAAI,IAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CACtD,CAAC,GAAQ,KACP,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,gBAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,CACpE;YAED,MAAM,mBAAmB,GAAI,IAAY,CAAC,OAAO,CAAC,CAAC,SAAS,CAC1D,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,CACnD;AAED,YAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB;YACrD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC;AAC9E,YAAA,eAAe,CACb,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAClC,gBAAgB,EAChB,gBAAgB,CACjB;YAED,eAAe,CACZ,IAAY,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC,CAAC,QAAQ,EACtD,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CACnB;;AAGD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAC7B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAC/B;AAClB,gBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;oBAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI;oBAC/C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAE;AACvC,oBAAA,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO;AAChC,oBAAA,IAAI,MAAM,KAAK,CAAC,EAAE;AAChB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACjC,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;wBAC5B,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,WAAA,EAAc,MAAM,KAAK;wBAC9C,KAAK,EAAE,CAAC,WAAW;AACnB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,8CAA8C;AACpE,wBAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe;wBAEpC,MAAM,MAAM,GAAG,MAAK;AAClB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AACvB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC;AACjD,wBAAA,CAAC;AACD,wBAAA,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC;oBAC9C;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;AACjC,QAAA,CAAC;QA8DD,IAAA,CAAA,kBAAkB,GAAG,KAAK;QAa1B,IAAA,CAAA,eAAe,GAAG,EAAE;QA+CpB,IAAA,CAAA,eAAe,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAsChE,IAAA,CAAA,2BAA2B,GAAG,EAAE;QA8DhC,IAAA,CAAA,YAAY,GAAG,KAAK;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,KAAK;QAC/C,IAAA,CAAA,YAAY,GAAQ,MAAM;QA0C1B,IAAA,CAAA,UAAU,GAAQ,EAAE;QACpB,IAAA,CAAA,cAAc,GAAG,EAAE;QACnB,IAAA,CAAA,WAAW,GAAQ,EAAE;QACrB,IAAA,CAAA,eAAe,GAAG,EAAE;QACpB,IAAA,CAAA,SAAS,GAAG,EAAE;QAcd,IAAA,CAAA,qBAAqB,GAAU,EAAE;AAEjC,QAAA,IAAA,CAAA,wBAAwB,GAAG,IAAI,GAAG,EAAU;;QA2R5C,IAAA,CAAA,UAAU,GAAkB,IAAI;QAChC,IAAA,CAAA,UAAU,GAAkB,IAAI;QAmDhC,IAAA,CAAA,UAAU,GAAG,kDAAkD;AAqP/D,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAkB;QACjC,IAAA,CAAA,QAAQ,GAAG,EAAE;;QAqFrB,IAAA,CAAA,gBAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;QA6B1D,IAAA,CAAA,UAAU,GAAY,IAAI;QAC1B,IAAA,CAAA,IAAI,GAAG,CAAC;QACR,IAAA,CAAA,IAAI,GAAG,CAAC;QACR,IAAA,CAAA,SAAS,GAAG,KAAK;QAGjB,IAAA,CAAA,aAAa,GAAG,KAAK;;;;;;;;;;QAyUrB,IAAA,CAAA,aAAa,GAAU,EAAE;AACzB,QAAA,IAAA,CAAA,YAAY,GAAgB,IAAI,GAAG,EAAE;QACrC,IAAA,CAAA,cAAc,GAAQ,IAAI;QAC1B,IAAA,CAAA,WAAW,GAAG,KAAK;AA2JX,QAAA,IAAA,CAAA,eAAe,GAKnB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAiFxD,IAAA,CAAA,+BAA+B,GAAQ,IAAI;QACnC,IAAA,CAAA,WAAW,GAAG,GAAG;QACjB,IAAA,CAAA,YAAY,GAAG,GAAG;;;;;;;;;;AAoD1B,QAAA,IAAA,CAAA,kBAAkB,GAAgB,IAAI,GAAG,EAAE;QAC3C,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,sBAAsB,GAAkB,IAAI;QAqF5C,IAAA,CAAA,SAAS,GAAY,EAAE;QACvB,IAAA,CAAA,SAAS,GAAY,EAAE;;AA4HzB,QAAA,IAAA,CAAA,gBAAgB,GAAkB,IAAI,CAAC;QACvC,IAAA,CAAA,eAAe,GAAQ,IAAI;QAC3B,IAAA,CAAA,eAAe,GAAQ,IAAI;;QAG3B,IAAA,CAAA,iBAAiB,GAAW,EAAE;QAC9B,IAAA,CAAA,qBAAqB,GAAW,SAAS;AACzC,QAAA,IAAA,CAAA,aAAa,GAAmD,IAAI,GAAG,EAAE,CAAC;;QAG1E,IAAA,CAAA,2BAA2B,GAAQ,IAAI;QACvC,IAAA,CAAA,gBAAgB,GAAQ,IAAI;QA6LnB,IAAA,CAAA,mBAAmB,GAAoB,OAAO;QAE9C,IAAA,CAAA,eAAe,GAAqB,KAAK;AA2BlD,QAAA,IAAA,CAAA,eAAe,GAAG;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,SAAS,EAAE,IAAW;AACtB,YAAA,YAAY,EAAE,IAAW;AACzB,YAAA,eAAe,EAAE,EAAW;YAC5B,aAAa,EAAE,CAAC;SACjB;AA6DD,QAAA,IAAA,CAAA,oBAAoB,GAAqB,IAAI,GAAG,EAAE,CAAC;AACnD,QAAA,IAAA,CAAA,qBAAqB,GAAyB,IAAI,GAAG,EAAE,CAAC;QA4IxD,IAAA,CAAA,cAAc,GAAG,KAAK;AACtB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC;QACvB,IAAA,CAAA,mBAAmB,GAAkB,IAAI;QACzC,IAAA,CAAA,kBAAkB,GAAQ,IAAI;QA2C9B,IAAA,CAAA,cAAc,GAAuB,IAAI;QAwHjC,IAAA,CAAA,cAAc,GAAuB,IAAI;QAmBjD,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAGxD,IAAA,CAAA,cAAc,GAAW,CAAC;QAC1B,IAAA,CAAA,iBAAiB,GAAW,IAAI;;QA8DxB,IAAA,CAAA,wBAAwB,GAAQ,IAAI;QACpC,IAAA,CAAA,6BAA6B,GAAQ,IAAI;QACzC,IAAA,CAAA,4BAA4B,GAAQ,IAAI;QAEhD,IAAA,CAAA,mBAAmB,GAAY,KAAK;QACpC,IAAA,CAAA,0BAA0B,GAAY,KAAK;QAC3C,IAAA,CAAA,kBAAkB,GAAU,EAAE;QAC9B,IAAA,CAAA,qBAAqB,GAAQ,IAAI;QACjC,IAAA,CAAA,kBAAkB,GAAQ,IAAI;QAyF9B,IAAA,CAAA,yBAAyB,GAAG,KAAK;QACjC,IAAA,CAAA,0BAA0B,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC3C,IAAA,CAAA,sBAAsB,GAAU,EAAE;QAElC,IAAA,CAAA,oBAAoB,GAAQ,IAAI;;;;QAQhC,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAqJ3B,IAAA,CAAA,qBAAqB,GAAG,KAAK;QAC7B,IAAA,CAAA,kCAAkC,GAAQ,IAAI;QA4dG,IAAA,CAAA,eAAe,GAAsC,IAAI;QAiTlG,IAAA,CAAA,gBAAgB,GAAG,KAAK;;;AAKhC,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,GAAG,EAKzB;;AAsKH,QAAA,IAAA,CAAA,YAAY,GAAW,EAAE,CAAC;AAC1B,QAAA,IAAA,CAAA,kBAAkB,GAAY,IAAI,CAAC;QACnC,IAAA,CAAA,UAAU,GAAG,KAAK;AAClB,QAAA,IAAA,CAAA,QAAQ,GAAqC;AAC3C,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,gBAAgB,EAAE,YAAY;AAC9B,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,cAAc,EAAE,eAAe;AAC/B,YAAA,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE;YAC9B,eAAe,EAAE,IAAI;AACrB,YAAA,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAE,CAAC;AAChB,YAAA,OAAO,EAAE,IAAI,IAAI,EAAE;SACpB;QAkSM,IAAA,CAAA,OAAO,GAMV,EAAE;AACE,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAQ;AACvC,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,YAAY,EAAQ;;;;;;;;;AAYhD,QAAA,IAAA,CAAA,4BAA4B,GAAG,MAAM,IAAI,CAAC;AASzC,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAQ;AACzC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAQ;AAC5C,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAQ;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAQ;AACxC,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAQ;AAC7C,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAQ;;QAvxO9C,IAAI,CAAC,yBAAyB,EAAE;;QAGhC,IAAI,CAAC,qBAAqB,EAAE;IAC9B;IAMA,QAAQ,GAAA;QACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAAE;AACzD,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB;;;;AAK9C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B;QACF;;AAGA,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;;AAG/B,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,YAAY;AACxB,gBAAA,WAAW,EAAE;AACd;SACF;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGjC,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;;AAGjC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;AAC5E,YAAA,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;AACrB,gBAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG;AACzB,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,cAAc,EAAE,IAAI;AACpB,oBAAA,WAAW,EAAE,IAAI;AACjB,oBAAA,SAAS,EAAE;iBACZ;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE;AACrC,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,cAAc,EAAE,IAAI;AACpB,oBAAA,WAAW,EAAE,IAAI;AACjB,oBAAA,SAAS,EAAE;AACZ,iBAAA,CAAC;YACJ;QACF;;;;;;;;IAUF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDQ,IAAA,MAAM,qBAAqB,GAAA;;QAEjC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE;YAC7B,IAAI,CAAC,mBAAmB,EAAE;AACxB,gBAAA,mBAAmB,GAAG,MAAM,OAAO,wBAAwB,CAAC;YAC9D;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE;YAC9C,IAAI,CAAC,kBAAkB,EAAE;AACvB,gBAAA,kBAAkB,GAAG,MAAM,OAAO,wBAAwB,CAAC;YAC7D;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;YACjD,IAAI,CAAC,gBAAgB,EAAE;AACrB,gBAAA,gBAAgB,GAAG,MAAM,OAAO,0BAA0B,CAAC;YAC7D;QACF;IACF;IAEQ,yBAAyB,GAAA;;QAE/B,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,YAAY,CAAC,EAAE,CAAC;AAChB,QAAA,oBAAoB,EAAE,CACvB,CAAC,SAAS,CAAC,SAAS,IAAG;AACtB,YAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;AACvC,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,YAAY,CAAC,GAAG,CAAC,EACjB,oBAAoB,EAAE,CACvB,CAAC,SAAS,CAAC,OAAO,IAAG;AACpB,YAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;AACrC,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAC7B,YAAY,CAAC,GAAG,CAAC,CAClB,CAAC,SAAS,CAAC,MAAK;YACf,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;IACJ;AAGA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;;QAGxC,qBAAqB,CAAC,YAAW;;YAE/B,IAAI,CAAC,wBAAwB,EAAE;AAE/B,YAAA,MAAM,IAAI,CAAC,sBAAsB,EAAE;AACnC,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;;AAGlC,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAK;AACvC,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;AACnB,wBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;AACnC,oBAAA,CAAC,CAAC;AACJ,gBAAA,CAAC,CAAC;gBACF,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC7C,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;YACpC;;YAGA,IAAI,CAAC,6BAA6B,EAAE;;YAGpC,IAAI,CAAC,6BAA6B,EAAE;;YAGpC,IAAI,CAAC,8BAA8B,EAAE;AAErC,YAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;AACxC,QAAA,CAAC,CAAC;IACJ;IAEQ,6BAA6B,GAAA;AACnC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;AAClC,YAAA,MAAM,aAAa,GAAG,CAAC,KAAY,KAAI;AACrC,gBAAA,MAAM,SAAS,GAAI,KAAK,CAAC,MAAsB,CAAC,SAAS;AACzD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;AACnC,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;AACpC,YAAA,CAAC;AAED,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC;QACtD;IACF;AAEQ,IAAA,mBAAmB,CAAC,SAAiB,EAAA;AAC3C,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;AACpD,QAAA,IAAI,CAAC,cAAc,GAAG,GAAG;AAEzB,QAAA,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,aAAa;AAClD,QAAA,IAAI,CAAC,cAAc,GAAG,WAAW,GAAG,SAAS;AAC7C,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,SAAS;AAC1F,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,cAAc;;AAG3C,QAAA,IAAI,WAAW,GAAG,CAAC,EAAE;AACnB,YAAA,IAAI,CAAC,eAAe,GAAG,MAAM;QAC/B;AAAO,aAAA,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,MAAM;QAC/B;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;IAChC;AAKQ,IAAA,qBAAqB,CAAC,SAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAE1B,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE;AACnC,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1D;QACF;;QAGA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,IAAI,EAAE;YACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC7C,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1D;QACF;;QAGA,IAAI,CAAC,2BAA2B,EAAE;;AAGlC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,EAAE;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;AACzD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC;;QAGrG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,uBAAuB,EAAE;YAClG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AACjD,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AACvD,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,eAAe;;AAGnD,YAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5D;;AAIA,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE,EAAE;AACnC,YAAA,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC;QAC5C;IACF;IAEQ,2BAA2B,GAAA;QACjC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE;;AAEhE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,gBAAgB,CAAC,WAAW,CAAC;YAC1E,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;AAC1B,oBAAA,MAAM,MAAM,GAAI,GAAmB,CAAC,YAAY;AAChD,oBAAA,IAAI,MAAM,GAAG,CAAC,EAAE;AACd,wBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,EAAE,MAAM,CAAC;oBAC9D;AACF,gBAAA,CAAC,CAAC;YACJ;;YAGA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE;AACpC,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;gBAC5D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM;YAClF;QACF;IACF;IAEQ,yBAAyB,GAAA;;AAE/B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB;AAC7C,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AAC3E,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;IAC5D;AAEQ,IAAA,mBAAmB,CAAC,SAAiB,EAAA;;QAE3C,IAAI,WAAW,GAAG,CAAC;QACnB,IAAI,KAAK,GAAG,CAAC;AAEb,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACjC,YAAA,IAAI,UAAkB;AAEtB,YAAA,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE;;AAE9B,gBAAA,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC;YAC9C;iBAAO;AACL,gBAAA,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB;YACvE;AAEA,YAAA,IAAI,WAAW,GAAG,UAAU,GAAG,SAAS,EAAE;gBACxC,KAAK,GAAG,CAAC;gBACT;YACF;YACA,WAAW,IAAI,UAAU;QAC3B;AAEA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,mBAAmB,CAAC,UAAkB,EAAA;QAC5C,IAAI,UAAU,GAAG,CAAC;AAClB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACjC,YAAA,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE;;gBAE9B,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC;gBACvD,UAAU,IAAI,eAAe;YAC/B;iBAAO;AACL,gBAAA,UAAU,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB;YACxE;QACF;AACA,QAAA,OAAO,UAAU;IACnB;AAMQ,IAAA,qBAAqB,CAAC,OAAc,EAAA;AAC1C,QAAA,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;;QAGxC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE;YAC7B,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ;iBAC3D,IAAI,CAAC,YAAY,IAAG;;AAEnB,gBAAA,IAAI,CAAC,OAAO,GAAG,YAAY;gBAC3B,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAClC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;AACtC,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC;iBACA,KAAK,CAAC,KAAK,IAAG;AACb,gBAAA,OAAO,CAAC,IAAI,CAAC,uDAAuD,EAAE,KAAK,CAAC;AAC5E,gBAAA,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,MAAK;AACrC,oBAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;AACxC,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACN;aAAO;AACL,YAAA,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,MAAK;AACrC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;AACxC,YAAA,CAAC,CAAC;QACJ;IACF;IAEQ,oBAAoB,GAAA;QAC1B,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAIA,MAAM,WAAW,CAAC,OAAsB,EAAA;;QAExC,IAAI,WAAW,GAAG,KAAK;AAEvB,QAAA,IAAI,OAAO,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC,YAAY,EAAE;YAC3E,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,YAAY;YACjE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,iBAAiB,CAAC;YAC3F,IAAI,cAAc,EAAE;AAClB,gBAAA,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC,IAAI;YACvC;YACA,WAAW,GAAG,IAAI;QACpB;AAEA,QAAA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;YAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;YAC3C,IAAI,CAAC,wBAAwB,EAAE;YAC/B,WAAW,GAAG,IAAI;QACpB;QAEA,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE;AAC1C,YAAA,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;;YAEjF,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,gBAAgB,EAAE;YAEvB,IAAI,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE;gBACtD,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChB,IAAI,CAAC,sBAAsB,EAAE;oBAC7B,IAAI,CAAC,2BAA2B,EAAE;oBAClC,IAAI,CAAC,qBAAqB;AAC3B,iBAAA,CAAC;gBACF,IAAI,CAAC,gBAAgB,EAAE;gBACvB,WAAW,GAAG,IAAI;YACpB;YACA,IAAI,CAAC,mBAAmB,EAAE;QAC5B;AAEA,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE;;AAEtB,YAAA,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE;gBACpG,IAAI,CAAC,4BAA4B,EAAE;YACrC;iBAAO;gBACL,IAAI,CAAC,sBAAsB,EAAE;YAC/B;YAGA,WAAW,GAAG,IAAI;QACpB;QAEA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE;AACjD,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;YACzB,WAAW,GAAG,IAAI;QACpB;AAEA,QAAA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;YAC5B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE;AACpC,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;YAC7B;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,wBAAwB,CAAC,EAAE;AACnC,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,KAAK;YACrE,WAAW,GAAG,IAAI;QACpB;QAEA,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE,YAAY,KAAK,IAAI,EAAE;;AAE/C,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;AACtC,gBAAA,GAAG,GAAG;AACN,gBAAA,eAAe,EAAE;AAClB,aAAA,CAAC,CAAC;YACL,WAAW,GAAG,IAAI;QACpB;;QAIA,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;AAIE,IAAA,MAAM,qBAAqB,GAAA;AACzB,QAAA,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;AAExC,QAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACtG,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AAEvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;IACxC;IAiDQ,oBAAoB,CAAC,QAAgB,EAAE,OAAiB,EAAA;QAC9D,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAC,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,SAAS,GAAG,GAAG,QAAQ;AAC5F,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;;QAGtB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/C,QAAA,IAAI,MAAM,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE;;YAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;YACvF,KAAK,CAAC,IAAI,EAAE;AACZ,YAAA,KAAK,CAAC,UAAU,GAAG,GAAG;YACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;YACvC,OAAO,MAAM,CAAC,QAAQ;QACxB;;QAGA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;QACvF,KAAK,CAAC,MAAM,EAAE;AACd,QAAA,KAAK,CAAC,UAAU,GAAG,GAAG;QACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;;AAGvC,QAAA,IAAI,QAAuB;QAC3B,IAAI,OAAO,EAAE;AACX,YAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAkB;QAC5E;aAAO;AACL,YAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAkB;QAC7E;;AAGA,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;AAC/B,YAAA,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;AACvB,YAAA,SAAS,EAAE,GAAG;YACd,GAAG,EAAE,IAAI,CAAC;AACX,SAAA,CAAC;;QAGF,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;YACjD,IAAI,CAAC,uBAAuB,EAAE;QAChC;AAEA,QAAA,OAAO,QAAQ;IACjB;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;aACpD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAElD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;AACvD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACvD,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C;IACF;IAEQ,mBAAmB,CAAC,QAAgB,EAAE,OAAiB,EAAA;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC7D,QAAA,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IACjD;AAEQ,IAAA,kBAAkB,CAAC,OAAgB,EAAA;QACzC,IAAI,OAAO,EAAE;;YAEX,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE;AAC3C,gBAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACzB,oBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;gBAChC;YACF;QACF;aAAO;;AAEL,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAC5B;IACF;IAEQ,iBAAiB,GAAA;QACvB,IAAI,IAAI,CAAC,oBAAoB;YAAE;QAE/B,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;AAClD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;YACtB,MAAM,QAAQ,GAAa,EAAE;AAE7B,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;gBACxD,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE;AACvC,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpB;YACF;AAEA,YAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzD,QAAA,CAAC,EAAE,IAAI,CAAC,CAAC;IACX;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACxC,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QAClC;IACF;;AAGQ,IAAA,iBAAiB,CAAC,QAAgB,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC;IAC5C;IAEQ,iBAAiB,GAAA;QACvB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;;IAGQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QACxB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;AAClC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC/D,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;gBAChB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,KAAI;oBACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACjF,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,EAAE;QAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IACpC;AAEQ,IAAA,WAAW,CAAC,GAAQ,EAAA;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC;;AAGQ,IAAA,YAAY,CAAC,GAAW,EAAE,IAAS,EAAE,MAAc,IAAI,EAAA;QAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC;IAC/D;AAEQ,IAAA,YAAY,CAAC,GAAW,EAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACpC,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;YAClD,OAAO,IAAI,CAAC,IAAI;QAClB;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;AAC1B,QAAA,OAAO,IAAI;IACb;IAEQ,mBAAmB,CAAC,GAAW,EAAE,MAAW,EAAA;AAClD,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACnE;AAEQ,IAAA,mBAAmB,CAAC,GAAW,EAAA;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7C,QAAA,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE;YAClD,OAAO,MAAM,CAAC,MAAM;QACtB;AACA,QAAA,OAAO,IAAI;IACb;;AAMA,IAAA,yBAAyB,CAAC,GAAW,EAAE,UAAqB,EAAE,MAAc,IAAI,EAAA;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC;AACpD,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAE7B,QAAA,IAAI,MAAM,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE;YACnD,OAAO,MAAM,CAAC,KAAK;QACrB;AAEA,QAAA,MAAM,MAAM,GAAG,UAAU,EAAE;AAC3B,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC7E,QAAA,OAAO,MAAM;IACf;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE;IACtC;;IAcQ,eAAe,CAAI,IAAY,EAAE,OAAgB,EAAA;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;AAC5C,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,GAAG,EAAO;QACxB;QACA,OAAO,OAAO,EAAE;IAClB;;IAGQ,YAAY,CAAC,IAAY,EAAE,GAAQ,EAAA;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;QAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;QACjC;IACF;;AAGQ,IAAA,iBAAiB,CAAC,QAAoB,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;AACjC,YAAA,QAAQ,EAAE;YACV;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAElC,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;AAChC,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;YAClC,cAAc,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACpD;IACF;IAEQ,qBAAqB,GAAA;QAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;AACtC,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;;QAGnC,MAAM,SAAS,GAAG,EAAE;AACpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE;AAChD,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;YAC3C,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACvC;IACF;;AAGQ,IAAA,sBAAsB,CAAC,QAAoB,EAAA;AACjD,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEvC,QAAA,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE;AACrC,YAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;YACvC,qBAAqB,CAAC,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAChE;IACF;IAEQ,0BAA0B,GAAA;QAChC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC;AAC3C,QAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;AACnC,QAAA,IAAI,CAAC,2BAA2B,GAAG,KAAK;QAExC,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;IACvC;;IAMA,0BAA0B,CAAC,GAAW,EAAE,OAAmB,EAAA;QACzD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;QAC1C;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7C;;IAGA,eAAe,GAAA;;AAEb,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,EAAE;IACtC;;AAOA,IAAA,iBAAiB,CAAC,QAAoB,EAAE,QAAA,GAAmB,CAAC,EAAA;QAC1D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;AAE3D,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,yBAAyB,EAAE;QAClC;IACF;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QAEvB,MAAM,WAAW,GAAG,MAAK;YACvB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;gBACxB;YACF;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAG;YACzC,IAAI,CAAC,QAAQ,EAAE;;AAGf,YAAA,IAAI,OAAO,mBAAmB,KAAK,WAAW,EAAE;gBAC9C,mBAAmB,CAAC,WAAW,CAAC;YAClC;iBAAO;AACL,gBAAA,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5B;AACF,QAAA,CAAC;AAED,QAAA,WAAW,EAAE;IACf;AAKA,IAAA,MAAM,2BAA2B,CAAC,OAAA,GAAe,IAAI,EAAA;QACnD,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;QAE7B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW;;AAGvE,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAQ,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAChD,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,EAChC,cAAc,CACf;YACD,OAAO,CAAC,QAAQ,CAAC;AACnB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM;AAC3B,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,MAAM,qBAAqB,CAAC,OAAA,GAAe,IAAI,EAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;QAE7B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW;;AAGvE,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAQ,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAChD,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,EAChC,cAAc,CACf;YACD,OAAO,CAAC,QAAQ,CAAC;AACnB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM;AAClC,QAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;AACtC,QAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAGA,IAAA,MAAM,sBAAsB,GAAA;QAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,WAAW;AACxE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CACnD,IAAI,CAAC,OAAO,EACZ,cAAc,CACf;AACD,QAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAGA,gBAAgB,GAAA;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC;AAEzD,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACjC,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,WAAW,IAAI;QAC9E;AACA,QAAA,IAAI,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACrC,YAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,WAAW,IAAI;QAClF;AACA,QAAA,IAAI,KAAK,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACnC,YAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW,IAAI;QAChF;;AAGA,QAAA,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;AAC5C,QAAA,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC;AAClD,QAAA,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;IAC/C;;IAGQ,gBAAgB,CAAC,QAAgB,EAAE,OAAiB,EAAA;QAC1D,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC;IACpD;AAYQ,IAAA,qBAAqB,CAAC,MAA4C,EAAA;AACxE,QAAA,IAAI,OAAO,WAAW,KAAK,WAAW,EAAE;YACtC,IAAI,CAAC,kBAAkB,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7D;IACF;AAEQ,IAAA,mBAAmB,CAAC,MAA4C,EAAA;AACtE,QAAA,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,GAAG,CAAC,EAAE;AACrF,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe;AAC5E,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,QAAQ;AAC3C,YAAA,IAAI,MAAM,KAAK,YAAY,EAAE;AAC3B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;YACvC;AACA,YAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,GAAG,CAAC;;AAG3C,YAAA,IAAI,QAAQ,GAAG,KAAK,EAAE;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,qBAAA,EAAwB,MAAM,CAAA,MAAA,EAAS,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI,CAAC;YAC9E;QACF;IACF;;IAGQ,4BAA4B,GAAA;AAClC,QAAA,IAAI,CAAC,wBAAwB,GAAG,EAAE;AAClC,QAAA,IAAI,CAAC,uBAAuB,GAAG,CAAC;AAChC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;;AAGhC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE;YACvE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC1F;;AAGA,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;;QAGvB,IAAI,CAAC,wBAAwB,EAAE;IACjC;IAEQ,wBAAwB,GAAA;QAC9B,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE;AACxE,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;YACjC,IAAI,CAAC,0BAA0B,EAAE;YACjC;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,uBAAuB,CAAC;AACzE,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM;AAC5C,YAAA,GAAG,GAAG;AACN,YAAA,cAAc,EAAE,CAAC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,oBAAoB,IAAI,CAAC,GAAG;AAClF,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAE5F,IAAI,CAAC,uBAAuB,EAAE;;QAG9B,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;QAG1B,IAAI,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE;AACvE,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC;QAC1E;aAAO;YACL,IAAI,CAAC,0BAA0B,EAAE;QACnC;;AAGA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEQ,0BAA0B,GAAA;AAChC,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;;QAGjC,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;gBAClC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE;AAC1C,YAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,WAAW;AACtD,YAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAE;AAC5C,gBAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU;YACvG;QACF;IACF;IAEQ,sBAAsB,GAAA;;AAE5B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM;AACnD,YAAA,GAAG,GAAG;YACN,cAAc,EAAE,CAAC,GAAG;SACrB,CAAC,CAAC,IAAI,EAAE;;AAGT,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,aAAa,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;QAG1B,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE;YACnC,IAAI,CAAC,8BAA8B,EAAE;QACvC;aAAO;YACL,IAAI,CAAC,mBAAmB,EAAE;QAC5B;;QAGA,IAAI,CAAC,kBAAkB,EAAE;;QAGzB,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;gBAClC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE;AAC1C,YAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,WAAW;AACtD,YAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAE;AAC5C,gBAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU;YACvG;QACF;IACF;IAEQ,8BAA8B,GAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM;YAAE;AAElC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AAC1D,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;QAC3D,IAAI,CAAC,mBAAmB,EAAE;IAC5B;;AAeA,IAAA,cAAc,CAAC,QAAgB,EAAA;QAC7B,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE;YAC1D,MAAM,IAAI,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE;AACxC,YAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC;QACrD;IACF;;AAGA,IAAA,YAAY,CAAC,QAAgB,EAAA;AAC3B,QAAA,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE;AACjF,YAAA,MAAM,SAAS,GAAG,CAAA,EAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAE,CAAC;YACrD,MAAM,OAAO,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE;AAE3C,YAAA,IAAI;AACF,gBAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;AACzB,gBAAA,MAAM,WAAW,GAAG,CAAA,EAAG,QAAQ,UAAU;gBACzC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;gBAEpD,MAAM,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAC5D,gBAAA,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC;AAE/C,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAClC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5C,oBAAA,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE;oBACtB;AACD,iBAAA,CAAC;;AAGF,gBAAA,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC;;AAGnD,gBAAA,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;AACjC,gBAAA,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;AAC/B,gBAAA,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC;AAEtC,gBAAA,OAAO,QAAQ;YACjB;YAAE,OAAO,KAAK,EAAE;;gBAEd,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClD,IAAI,SAAS,EAAE;oBACb,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;AAC9C,oBAAA,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACnD,oBAAA,OAAO,QAAQ;gBACjB;YACF;QACF;AACA,QAAA,OAAO,CAAC;IACV;IAEQ,0BAA0B,CAAC,SAAiB,EAAE,QAAgB,EAAA;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAoD,CAAC;AAClG,QAAA,IAAI,SAAS,IAAI,QAAQ,GAAG,SAAS,EAAE;AACrC,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,qBAAA,EAAwB,SAAS,SAAS,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,eAAA,EAAkB,SAAS,CAAA,GAAA,CAAK,CAAC;;AAG3G,YAAA,IAAI,SAAS,KAAK,YAAY,EAAE;AAC9B,gBAAA,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC;YACjF;AAAO,iBAAA,IAAI,SAAS,KAAK,YAAY,EAAE;AACrC,gBAAA,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC;YACzF;AAAO,iBAAA,IAAI,SAAS,KAAK,YAAY,EAAE;AACrC,gBAAA,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC;YAC3E;QACF;IACF;;IAGA,4BAA4B,GAAA;AAM1B,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACpH,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACnG,QAAA,MAAM,OAAO,GAAG,YAAY,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,YAAY,IAAI,GAAG,GAAG,CAAC;QAEvE,OAAO;AACL,YAAA,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACvC,YAAA,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACxC,YAAA,aAAa,EAAE;AACb,gBAAA,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;gBAC7B,OAAO;gBACP;AACD,aAAA;AACD,YAAA,WAAW,EAAE,IAAI,CAAC,cAAc;SACjC;IACH;IAEQ,cAAc,GAAA;QACpB,IAAI,OAAO,WAAW,KAAK,WAAW,IAAK,WAAmB,CAAC,MAAM,EAAE;AACrE,YAAA,MAAM,GAAG,GAAI,WAAmB,CAAC,MAAM;YACvC,OAAO;AACL,gBAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;AAClD,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,gBAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,eAAe,IAAI,GAAG;aAC1E;QACH;AACA,QAAA,OAAO,IAAI;IACb;;IAGA,0BAA0B,GAAA;QACxB,MAAM,WAAW,GAAa,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,4BAA4B,EAAE;;AAGlD,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,GAAG,CAAC,EAAE;AACzE,YAAA,WAAW,CAAC,IAAI,CAAC,wDAAwD,CAAC;AAC1E,YAAA,WAAW,CAAC,IAAI,CAAC,4CAA4C,CAAC;AAC9D,YAAA,WAAW,CAAC,IAAI,CAAC,6CAA6C,CAAC;QACjE;;AAGA,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,GAAG,CAAC,EAAE;AACzE,YAAA,WAAW,CAAC,IAAI,CAAC,2CAA2C,CAAC;AAC7D,YAAA,WAAW,CAAC,IAAI,CAAC,gDAAgD,CAAC;AAClE,YAAA,WAAW,CAAC,IAAI,CAAC,+CAA+C,CAAC;QACnE;;QAGA,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,GAAG,EAAE,EAAE;AACrC,YAAA,WAAW,CAAC,IAAI,CAAC,uDAAuD,CAAC;AACzE,YAAA,WAAW,CAAC,IAAI,CAAC,wDAAwD,CAAC;QAC5E;;AAGA,QAAA,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,YAAY,GAAG,EAAE,EAAE;AAC9D,YAAA,WAAW,CAAC,IAAI,CAAC,mEAAmE,CAAC;AACrF,YAAA,WAAW,CAAC,IAAI,CAAC,yCAAyC,CAAC;AAC3D,YAAA,WAAW,CAAC,IAAI,CAAC,qDAAqD,CAAC;QACzE;AAEA,QAAA,OAAO,WAAW;IACpB;;IAGA,qBAAqB,GAAA;AACnB,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;IACvC;;IAGA,uBAAuB,GAAA;AACrB,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AACjD,YAAA,IAAI,GAAG,KAAK,aAAa,EAAE;AACxB,gBAAA,IAAI,CAAC,kBAA0B,CAAC,GAAG,CAAC,GAAG,CAAC;YAC3C;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;IAC5B;;IAGQ,wBAAwB,GAAA;QAC9B,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,aAAa,EAAE;;AAGpB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;;QAG5B,IAAI,CAAC,iBAAiB,EAAE;IAC1B;;IAGQ,6BAA6B,GAAA;QACnC,IAAI,OAAO,oBAAoB,KAAK,WAAW;YAAE;QAEjD,IAAI,CAAC,oBAAoB,GAAG,IAAI,oBAAoB,CAClD,CAAC,OAAO,KAAI;AACV,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,IAAG;AACtB,gBAAA,IAAI,KAAK,CAAC,cAAc,EAAE;AACxB,oBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAiB;AACvC,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvD,IAAI,QAAQ,EAAE;AACZ,wBAAA,QAAQ,EAAE;wBACV,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AACzC,wBAAA,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,OAAO,CAAC;oBAC/C;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,EACD;AACE,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa;YACpC,UAAU,EAAE,MAAM;AAClB,YAAA,SAAS,EAAE;AACZ,SAAA,CACF;IACH;;IAGQ,8BAA8B,GAAA;QACpC,IAAI,eAAe,IAAI,SAAS,IAAI,QAAQ,IAAI,MAAM,EAAE;;AAEtD,YAAA,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,IAAG;AAC7D,gBAAA,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC;;gBAG7D,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;AACf,gBAAA,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC;AAC5D,YAAA,CAAC,CAAC;QACJ;IACF;IAEQ,oBAAoB,GAAA;;AAE1B,QAAA,IAAI,QAAQ,IAAI,MAAM,EAAE;;AAEtB,YAAA,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,aAAa,CAAC;AAClE,YAAA,IAAI,CAAC,mBAAmB,CAAC,0BAA0B,EAAE,eAAe,CAAC;AACrE,YAAA,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;QAC5E;;QAGA,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,mBAAmB,CAAC,SAAiB,EAAE,QAAgB,EAAA;;QAE7D,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,IAAG;;YAElC,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,QAAA,EAAW,SAAS,CAAA,aAAA,CAAe,CAAC;AAC7D,QAAA,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;YACf,OAAO,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,QAAQ,CAAA,OAAA,CAAS,EAAE,KAAK,CAAC;AAC5D,QAAA,CAAC,CAAC;IACJ;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,cAAc,GAAG;YACrB,gBAAgB;YAChB,iBAAiB;YACjB,gBAAgB;;SAEjB;QAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,KAAK,IAAG;AACpD,YAAA,OAAO,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;AACrC,QAAA,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC;AAC5D,QAAA,CAAC,CAAC;IACJ;;IAGA,sBAAsB,CAAC,SAAiB,EAAE,QAAoB,EAAA;QAC5D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC;AAClD,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,oBAAoB,EAAE;AACxC,YAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5C;IACF;;AAGA,IAAA,mBAAmB,CAAC,OAAgB,EAAA;QAClC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACtC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAE;QAC5C;AAEA,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,qBAAqB,EAAE;AAE7E,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,KAAK;QAEhC,MAAM,SAAS,IACb,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG;AAC7B,YAAA,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI;AAC/B,YAAA,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM;AACnC,YAAA,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,CAClC;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;AAC7C,QAAA,OAAO,SAAS;IAClB;;;;;;;;;;;IAeA,gBAAgB,GAAA;QACd,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS;QAC7D,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACzD,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;IAC1D;IACA,iBAAiB,GAAA;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS;QAC9D,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACzD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;IACzD;AAGA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,UAAU;QAChD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QAClE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;IACtE;IAKA,cAAc,CAAC,GAAQ,EAAE,KAAa,EAAA;QACpC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IACtE;IAEA,kBAAkB,CAAC,GAAQ,EAAE,KAAa,EAAA;AACxC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QAChC,MAAM,KAAK,GAAG;aACX,KAAK,CAAC,GAAG;AACT,aAAA,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC;AACvF,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7B;AAEA,IAAA,aAAa,CAAC,KAAiB,EAAE,GAAQ,EAAE,aAAuB,EAAA;QAChE,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE;QACnC,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE;;QAGtB,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAU,MAAM;YAClD,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,YAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,KAAK,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC,CAAkB;AAC5F,YAAA,YAAY,EAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,QAAA,EAAW,KAAK,CAAC,KAAK,CAAA,EAAA,CAAI,CAAiB,EAAE,WAAW,IAAI;AACnG,SAAA,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;AAE3F,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,IAAI,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;YAEvC,IAAI,aAAa,EAAE;gBACjB,MAAM,GAAG,CAAC,MAAM;YAClB;;YAGA,IAAI,iBAAiB,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE;gBAAE;YAEvD,IAAI,aAAa,GAAG,CAAC;AAErB,YAAA,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC9B,gBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,GAAG,iBAAiB;AACpD,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,GAAG,KAAK,EAAE,EAAE,CAAC;gBAClE,aAAa,IAAI,QAAQ;;gBAGzB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;oBAC5B,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;oBACnC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;AAClC,gBAAA,CAAC,CAAC;gBAEF,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;AAC9D,YAAA,CAAC,CAAC;;AAGF,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,GAAG,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;YACtE,IAAI,aAAa,EAAE;gBACjB,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,aAAa,IAAI;AAChD,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB;AACF,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAC5B;YACA,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAChD,YAAA,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,IAAI,EAAE,2BAA2B;aAClC;AACD,YAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAC5C,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;IAEQ,gCAAgC,CAAC,KAAa,EAAE,KAAa,EAAA;AACnE,QAAA,MAAM,MAAM,GAAG,CAAC,OAAc,KAAI;AAChC,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,oBAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACtB;AAAO,qBAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE;AAC9B,oBAAA,GAAG,CAAC,KAAK,GAAG,KAAK;gBACnB;YACF;AACF,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AACpB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,cAAc,CAAC,KAAiB,EAAE,GAAQ,EAAA;QACxC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAE5B,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,QAAA,EAAW,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAgB;AAChF,QAAA,MAAM,YAAY,GAAG,QAAQ,EAAE,WAAW,IAAI,GAAG;AAEjD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC,CAAkB;;AAGpG,QAAA,MAAM,cAAc,GAAG,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,0BAA0B,GAAG,oBAAoB;AAClG,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAE7D,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,IAAI,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;;AAGvC,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE;gBAC1B,MAAM,GAAG,CAAC,MAAM;YAClB;AAEA,YAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,MAAM;YACpC,IAAI,QAAQ,GAAG,EAAE;gBAAE;;AAGnB,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;gBACzB,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;gBACnC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;AAClC,YAAA,CAAC,CAAC;YAEF,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;AAC5D,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;YACrB,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,IAAI,EAAE,2BAA2B;aAClC;AACD,YAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;;AAG1C,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AACzB,gBAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;AACzC,gBAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC;AACjD,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAChD,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;AAIA,IAAA,gBAAgB,CAAC,KAAiB,EAAA;QAChC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;QAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC;AAC7D,QAAA,MAAM,YAAY,GAAG,QAAQ,EAAE,WAAW,IAAI,GAAG;AAEjD,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;AAEzC,YAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,MAAM;YACpC,IAAI,QAAQ,GAAG,GAAG;gBAAE,QAAQ,GAAG,GAAG;YAElC,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;gBACtC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;AACzC,gBAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;YACjC;AACF,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAClD,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;AAGA,IAAA,cAAc,CAAC,GAAQ,EAAA;QACrB,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE;IAC1D;;AAGA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1H,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE;QAC/C,OAAO,CAAA,YAAA,EAAe,MAAM,CAAA,GAAA,CAAK;IACnC;AAIA,IAAA,UAAU,CAAC,GAAQ,EAAA;QACjB,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;IACvC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;AAEA,IAAA,aAAa,CAAC,KAAU,EAAA;AACxB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7B;AAGE,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IACE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC/B,YAAY;YACZ,qBAAqB;YACrB,aAAa;YACb,aAAa;AACd,SAAA,CAAC,EACF;AACA,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACzD,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;QAClC;AACA,QAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC;AACtG,YAAA,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC;AAC7H,QAAA,MAAM,8BAA8B,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;QACvH,IAAI,CAAC,8BAA8B,EAAE;YACnC,IAAI,CAAC,wBAAwB,EAAE;QACjC;QACA,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAClC;QACA,IAAG,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAC;AACxC,YAAA,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;QAC1E;;;;;;;;;AAYF,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAqB,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,EAAE;AAC/F,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;QAGC,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC;QACvE,IAAI,CAAC,iBAAiB,EAAE;AACtB,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;AACjC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IAEA;IAGA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;IACpC;AAGA,IAAA,oBAAoB,CAAC,KAAiB,EAAA;AACpC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;IAEQ,kBAAkB,CACxB,OAAoB,EACpB,SAAmB,EAAA;QAEnB,IAAI,EAAE,GAAuB,OAAO;AAEpC,QAAA,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IACE,EAAE,CAAC,SAAS;AACZ,gBAAA,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,EAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAChE;AACA,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,EAAE,GAAG,EAAE,CAAC,aAAa;QACvB;AAEA,QAAA,OAAO,KAAK;IACd;AAGF,IAAA,iBAAiB,CAAC,KAAiB,EAAE,KAAU,EAAE,oBAAoB,GAAG,KAAK,EAAA;QAC3E,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;;AAG5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;QACrD,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACzC;AAEA,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,IAAI,MAAM,CAAC,UAAU;AAC9F,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;QAE5B,qBAAqB,CAAC,MAAK;YACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAgB;AACrE,YAAA,IAAI,CAAC,OAAO;gBAAE;YAEd,IAAI,OAAO,GAAG,MAAM;;AAGpB,YAAA,IAAI,MAAM,GAAG,SAAS,GAAG,cAAc,EAAE;gBACvC,OAAO,GAAG,cAAc,GAAG,SAAS,GAAG,EAAE,CAAC;YAC5C;;YAGA,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;YAE5B,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,OAAO,IAAI;;AAGnC,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;;;;;;AASE,IAAA,OAAO,CAAC,GAAQ,EAAA;AACd,QAAA,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;QAEtC,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AACtB,QAAA,GAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC1D,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE;SACT;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGpC,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,GAAG,EAAE;gBACH,aAAa,EAAE,IAAI,CAAC;AACrB,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEhC,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,QAAQ,CAAC,GAAQ,EAAA;AACf,QAAA,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;QAEtC,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AACtB,QAAA,GAAI,CAAC,QAAQ,GAAG,MAAM;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC3D,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,MAAM,EAAE;SACT;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGpC,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,GAAG,EAAE;gBACH,aAAa,EAAE,IAAI,CAAC;AACrB,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEhC,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC7C,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGpC,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,GAAG,EAAE;gBACH,aAAa,EAAE,IAAI,CAAC;AACrB,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC;AAGA,IAAA,MAAM,8BAA8B,CAClC,MAAW,EACX,MAA+B,EAAA;AAE/B,QAAA,MAAM,MAAM,GAAG,CAAC,OAAc,KAAI;AAChC,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,oBAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACtB;qBAAO,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AACrC,oBAAA,GAAG,CAAC,MAAM,GAAG,MAAM;gBACrB;YACF;AACF,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QACpB,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5C;AAEA,IAAA,cAAc,CAAC,IAAiB,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;AAGrB,QAAA,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;;AAG3D,QAAA,MAAM,qBAAqB,GAAG,CAAC,OAAc,KAAW;YACtD,MAAM,MAAM,GAAU,EAAE;AACxB,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxD;AAAO,qBAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AAC5B,oBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrB;YACF;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1D,QAAA,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM;QAE1C,IAAI,YAAY,KAAK,CAAC;YAAE;QAExB,MAAM,cAAc,GAClB,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC;;AAG5D,QAAA,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE;AACjC,YAAA,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE;AACpB,gBAAA,GAAG,CAAC,KAAK,GAAG,UAAU;gBACtB,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC;YAC9D;QACF;QAEA,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,qBAAqB,EAAE;IAC9B;AAEA,IAAA,aAAa,CAAC,KAAU,EAAA;QACtB,QACE,KAAK,EAAE;cACH,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,EAAE,UAAU;cACpC,MAAM,CAAC,CAAC,GAAW,EAAE,GAAQ,KAAK,GAAG,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;IAE1E;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AAErB,QAAA,MAAM,qBAAqB,GAAG,CAAC,OAAc,KAAW;YACtD,MAAM,MAAM,GAAU,EAAE;AAExB,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxD;AAAO,qBAAA,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE;AACtC,oBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrB;YACF;AAEA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1D,QAAA,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM;QAE1C,IAAI,YAAY,KAAK,CAAC;YAAE;QAExB,MAAM,cAAc,GAClB,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC;AACzD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC,EAAE,GAAG,CAAC;;AAG3E,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC7B,YAAA,GAAG,CAAC,KAAK,GAAG,UAAU;YACtB,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC;AAC9D,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEQ,mBAAmB,CAAC,OAAc,EAAE,KAAa,EAAA;AACvD,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE;AACvB,gBAAA,GAAG,CAAC,YAAY,GAAG,IAAI;gBACvB;YACF;AACA,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC/C;QACF;IACF;IAEA,MAAM,OAAO,CAAC,GAAQ,EAAA;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,GAAG;YAAE;;QAGV,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;QAE/F,IAAI,gBAAgB,EAAE;;AAEpB,YAAA,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAC7B;QACF;;AAGA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,IAAI,GAAG,EAAE,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC;QACnD;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;;QAG5D,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,EAAE;AACtC,YAAA,IAAI;AACF,gBAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC;AAChG,gBAAA,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAU,MAAM;AAC9C,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;oBACrB,UAAU,EAAE,KAAK,CAAC,GAAG;oBACrB,QAAQ,EAAE,KAAK,CAAC,KAAK;AACrB,oBAAA,QAAQ,EAAE;AACX,iBAAA,CAAC,CAAC;YACL;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,KAAK,CAAC;AAC3E,gBAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;YACxE;QACF;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;QACxE;QAEA,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;QAEP,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,WAAW;AACxE,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,EAAE,CAAC;IACR;AAEA,IAAA,MAAM,cAAc,CAAC,IAAW,EAAE,WAAqB,EAAA;;QAErD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE;YACvD,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC;QACpD;;AAGA,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAG;;YAE3B,qBAAqB,CAAC,MAAK;gBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC;gBAChD,OAAO,CAAC,MAAM,CAAC;AACjB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,MAAM,kCAAkC,CAAC,IAAW,EAAE,SAAiB,EAAA;AAC7E,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;;YAEjC,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC;QACvD;QAEA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,UAAU,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2DlB;AAED,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;AACvE,YAAA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEpD,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAEvC,YAAA,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,KAAI;gBACvB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI;gBACzC,MAAM,CAAC,SAAS,EAAE;gBAClB,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,MAAM,CAAC;gBACjB;qBAAO;AACL,oBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B;AACF,YAAA,CAAC;AAED,YAAA,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;gBACzB,MAAM,CAAC,SAAS,EAAE;gBAClB,MAAM,CAAC,KAAK,CAAC;AACf,YAAA,CAAC;;YAGD,UAAU,CAAC,MAAK;gBACd,MAAM,CAAC,SAAS,EAAE;AAClB,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACrC,YAAA,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,QAAA,CAAC,CAAC;IACJ;IAEQ,wBAAwB,CAAC,IAAW,EAAE,SAAiB,EAAA;;QAE7D,QAAO,SAAS;AACd,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;AAC9D,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE;AACzB,YAAA,KAAK,OAAO;AACV,gBAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAE;AACxB,gBAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;oBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,SAAS;AAC5C,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,wBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;oBACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5B;gBACA,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM;oBACzD,GAAG;oBACH,KAAK;oBACL,KAAK,EAAE,KAAK,CAAC;AACd,iBAAA,CAAC,CAAC;AACL,YAAA,KAAK,WAAW;gBACd,OAAO;oBACL,KAAK,EAAE,IAAI,CAAC,MAAM;AAClB,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,IAAI,EAAE;iBACP;AACH,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;AAEQ,IAAA,MAAM,mBAAmB,CAAC,IAAW,EAAE,WAAqB,EAAA;QAClE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,IAAI;AACF,gBAAA,MAAM,UAAU,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA4BlB;AAED,gBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;AACvE,gBAAA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAEpD,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAEzC,gBAAA,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,KAAI;AACvB,oBAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;oBACf,MAAM,CAAC,SAAS,EAAE;AACpB,gBAAA,CAAC;AAED,gBAAA,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;oBACzB,MAAM,CAAC,KAAK,CAAC;oBACb,MAAM,CAAC,SAAS,EAAE;AACpB,gBAAA,CAAC;;gBAGD,UAAU,CAAC,MAAK;oBACd,MAAM,CAAC,SAAS,EAAE;AAClB,oBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACvC,CAAC,EAAE,KAAK,CAAC;YAEX;YAAE,OAAO,KAAK,EAAE;;gBAEd,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC5C;AACF,QAAA,CAAC,CAAC;IACJ;IAKA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QAErB,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;QACpD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;AAEA,IAAA,WAAW,CAAC,GAAQ,EAAA;AAClB,QAAA,GAAG,CAAC,UAAU,GAAG,EAAE;AACnB,QAAA,GAAG,CAAC,WAAW,GAAG,EAAE;QACpB,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS;QACvF,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS;AACxF,QAAA,GAAG,CAAC,KAAK,GAAG,KAAK;AACjB,QAAA,GAAG,CAAC,SAAS,GAAG,KAAK;AACrB,QAAA,GAAG,CAAC,eAAe,GAAG,EAAE;AACxB,QAAA,GAAG,CAAC,WAAW,GAAG,EAAE;IAEtB;AAGA,IAAA,WAAW,CAAC,GAAQ,EAAA;AAClB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;IAClC;AAMA;;AAEG;AACK,IAAA,QAAQ,CAAC,GAAQ,EAAA;AACvB,QAAA,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG;IAC1B;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,GAAQ,EAAA;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B;QAEA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACzC,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE;gBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,GAAG,EAAE;AACN,aAAA;AACD,YAAA,SAAS,EAAE,aAAa;SACzB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAGA,IAAA,eAAe,CAAC,IAAW,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnE,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD;aAAO;AACL,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACzC,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE;gBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,GAAG,EAAE;AACN,aAAA;AACD,YAAA,SAAS,EAAE,aAAa;SACzB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,aAAa,CAAC,GAAQ,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD;AAEA,IAAA,aAAa,CAAC,IAAW,EAAA;AACvB,QAAA,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;IACvG;AAEA,IAAA,oBAAoB,CAAC,IAAW,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;QAC1F,OAAO,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM;IACzD;;AAGA,IAAA,cAAc,CAAC,SAA4B,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,sBAAsB,IAAI,SAAS,EAAE;AAC5C,YAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS;AACvC,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe;QAC9C;aAAO,IACL,IAAI,CAAC,eAAe;AACpB,YAAA,SAAS,IAAI,IAAI,CAAC,sBAAsB,EACxC;AACA,YAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS;YACvC;QACF;aAAO;AACL,YAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS;AACvC,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe;QAC9C;IACF;AAEA,IAAA,qBAAqB,CAAC,GAAQ,EAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAU,KAAK,KAAK,CAAC,UAAU,CAAC;AACvE,QAAA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC,CAAC;AACtE,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1C,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,sBAAsB,EAAE;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,EAAE,CAAC;IACR;AAEA,IAAA,eAAe,CAAC,OAAY,EAAA;AAC1B,QAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;AACrB,YAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAY,KAAK,OAAO,CAAC,UAAU,CAAC;QACrE;QAEA,OAAO,OAAO,EAAE,UAAU;IAC5B;IAEA,kBAAkB,GAAA;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACjD,QAAA,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,UAAU,CAAC;IAC/C;IAGQ,iBAAiB,CAAC,KAAa,EAAE,IAAW,EAAA;AAClD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE;AACvB,gBAAA,OAAO,GAAG;YACZ;AACA,YAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC/C,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC;AACzD,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAIA,IAAA,MAAM,sBAAsB,CAAC,MAAW,EAAE,SAAkB,EAAA;AAC1D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;QAC9D,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,UAAU,GAAG,SAAS;QAC5B;AACA,QAAA,MAAM,IAAI,CAAC,cAAc,EAAE;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC5B;IACF;IAGA,0BAA0B,GAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACjD,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,CAAC;AAC/D,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,MAAM,GAAG,CAAC,UAAU,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9D,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,qBAAqB,EAAE;AAC5B,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B,CAAC,EAAE,GAAG,CAAC;QACT,CAAC,EAAE,GAAG,CAAC;IACT;AAEA,IAAA,cAAc,CAAC,IAAW,EAAA;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAU,EAAE,GAAQ,KAAI;YAC1C,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;;AAExC,gBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD;iBAAO;;AAEL,gBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;YACxB;QACF,CAAC,EAAE,EAAE,CAAC;IACR;AAGA,IAAA,eAAe,CAAC,IAAW,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC9C,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,GAAG,KAAI;AACX,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;gBAChB,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC3D,IACE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACzC,gBAAgB,CAAC,MAAM,EACvB;oBACA,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE;gBAC/C;AACA,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI;YAC/D;AACF,QAAA,CAAC;aACA,MAAM,CAAC,OAAO,CAAC;IACpB;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;AACpD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM;QAEjE,IAAI,aAAa,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,IAAI,aAAa,KAAK,MAAM,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,oBAAoB,GAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;AACpD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM;QAEvE,IAAI,aAAa,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,IAAI,aAAa,KAAK,MAAM,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,OAAO,MAAM;IACf;;AAGQ,IAAA,kBAAkB,CAAC,IAAW,EAAA;QACpC,IAAI,MAAM,GAAU,EAAE;AACtB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAChB,gBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/D;QACF;AACA,QAAA,OAAO,MAAM;IACf;;IAGA,mBAAmB,GAAA;AACjB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI;QAC9D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;IACjD;IAEA,yBAAyB,GAAA;AACvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI;QACpE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;IACvD;IAEQ,iBAAiB,CAAC,IAAW,EAAE,KAAc,EAAA;AACnD,QAAA,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,GAAG,CAAC,QAAQ,GAAG,KAAK;gBACpB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC9C;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IACQ,uBAAuB,CAAC,IAAW,EAAE,KAAc,EAAA;AACzD,QAAA,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,GAAG,CAAC,cAAc,GAAG,KAAK;gBAC1B,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpD;QACF;IACF;IAIA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;IAC9B;AAGA,IAAA,QAAQ,CAAC,KAAoB,EAAA;QAC3B,IAAI,CAAC,qBAAqB,EAAE;IAC9B;;AAGA,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;IACjE;AAEA,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;IAChE;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5D;AAKA,IAAA,QAAQ,CAAC,KAAc,EAAA;;;IAGvB;AAEA,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAW;AACvC,YAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,YAAA,MAAM,IAAI,CAAC,2BAA2B,EAAE;AACxC,YAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE;AAElC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AACjD,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,yBAAyB,CAAC,GAAQ,EAAA;;QAEtC,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE;AACjC,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG;AACrC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;AACnD,YAAA,GAAG,CAAC,KAAK,GAAG,QAAQ;;YAGpB,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;;AAG1D,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;QAC7B;IACF;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7D;AAEA,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/D;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9D;IAEA,wBAAwB,GAAA;AACtB,QAAA,OAAO,CAAA,YAAA,EAAe,IAAI,CAAC,eAAe,GAAG;IAC/C;IASM,kBAAkB,CACxB,OAAc,EAAE,EAChB,KAAK,GAAG,CAAC,EACT,MAAA,GAAgB,EAAE,EAAA;AAElB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACvC,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACrD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;YACxD;QACF;AACE,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC;AAC7C,QAAA,OAAO,MAAM;IACf;AAEE,IAAA,oBAAoB,CAAC,IAAW,EAAA;QAC9B,IAAI,YAAY,GAAG,CAAC;AACpB,QAAA,MAAM,IAAI,GAAG,CAAC,KAAY,KAAU;AAClC,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,IAAI,CAAC,cAAc,GAAG,YAAY,EAAE;AACpC,gBAAA,IAAI,IAAI,EAAE,OAAO,EAAE;oBACjB,MAAM,KAAK,GAAG,IAAI;AAClB,oBAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACnD,wBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;oBACtB;gBACF;YACF;AACF,QAAA,CAAC;QACD,IAAI,CAAC,IAAI,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC;AAC/C,QAAA,OAAO,IAAI;IACb;AAGA,IAAA,iBAAiB,CAAC,SAAiB,EAAA;AACjC,QAAA,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC;IAC5C;AAEO,IAAA,0BAA0B,CAAC,SAAiB,EAAA;QACjD,MAAM,QAAQ,GAAG,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA,CAAE;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;QACjD,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM;YAC3B;QACF;QAEE,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;;QAEtD,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC;QAE3C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;IACxD;IASE,SAAS,CAAC,KAAa,EAAE,IAAS,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,IAAI,KAAK;IAC5D;;IAGA,kBAAkB,CAAC,KAAa,EAAE,IAAS,EAAA;AACzC,QAAA,OAAO,IAAI,EAAE,KAAK,IAAI,KAAK;IAC7B;IAEA,aAAa,CAAC,KAAa,EAAE,IAAS,EAAA;QACpC,OAAO,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,IAAI,KAAK;IAC7C;IAEA,UAAU,CAAC,KAAa,EAAE,IAAS,EAAA;AACjC,QAAA,OAAO,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,cAAc,IAAI,KAAK;IAC/D;IAEA,iBAAiB,CAAC,KAAa,EAAE,IAAS,EAAA;AACxC,QAAA,OAAO,IAAI,EAAE,UAAU,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,KAAK;IAC3D;IAIA,mBAAmB,GAAA;QACjB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,EAAE,EAAE,CAAC;IACV;;AAcE,IAAA,IAAI,kBAAkB,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAClC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AACxC,QAAA,OAAO,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY;IAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCF,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;YAC9B;QACF;QACA,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE;AACnC,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB;QACF;AACA,QAAA,MAAM,SAAS,GAAI,KAAK,CAAC,MAAsB,CAAC,SAAS;QACzD,IAAI,IAAI,CAAC,aAAa;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;AAChE,QAAA,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;YAC7B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;AACjD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AACxD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,aAAa,CAAC,MAAM,EACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,GAAG,QAAQ,CAC/C;AACD,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AACzD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;IAqBE,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YAClC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC;QAC7C;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YAClC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,IAAI,CAAC;;AAGzD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;;YAGjE,IAAI,CAAC,YAAY,GAAG,cAAc,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;AAEtD,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;AAGA,IAAA,sBAAsB,CAAC,KAAY,EAAA;AACjC,QAAA,MAAM,UAAU,GAAI,KAAK,CAAC,MAAsB,CAAC,UAAU;QACzD,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU;QAC7D,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU;IACjE;AAEF,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;AACtE,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACtE;IACF;AAEA,IAAA,oBAAoB,CAAC,KAAY,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAE;YAC5C,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACxE;AACA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAE;YAC5C,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACxE;IACF;AAoEA,IAAA,WAAW,CAAC,KAAuB,EAAA;AACjC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AACxC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;QAExC,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAC3C,6BAA6B,CAC9B;QAED,IAAI,aAAa,EAAE;AACjB,YAAA,MAAM,IAAI,GAAG,aAAa,CAAC,qBAAqB,EAAE;AAElD,YAAA,MAAM,YAAY,GAChB,QAAQ,IAAI,IAAI,CAAC,IAAI;gBACrB,QAAQ,IAAI,IAAI,CAAC,KAAK;gBACtB,QAAQ,IAAI,IAAI,CAAC,GAAG;AACpB,gBAAA,QAAQ,IAAI,IAAI,CAAC,MAAM;YAEzB,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;YACjC;iBAAO;AACL,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;YAClC;QACF;IACF;AAEA,IAAA,qBAAqB,CAAC,QAA2B,EAAA;AAC/C,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI;AACvC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QAE/B,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACnC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC5C;YACD,IAAI,WAAW,EAAE;gBACf,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAiB,KAAI;oBAClD,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAC7C,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;oBACD,IAAI,aAAa,EAAE;wBACjB,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC,aAAa,CAAC,YAAY;oBAC3D;AACF,gBAAA,CAAC,CAAC;YACJ;QACF;aACK;;YAEH,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAClC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAC/C;YAED,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,YAAY;YACzD;iBAAO;AACL,gBAAA,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;oBAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;wBACjC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACvC,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;wBACD,IAAI,aAAa,EAAE;4BACjB,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC,aAAa,CAAC,YAAY;4BACzD;wBACF;oBACF;gBACF;YACF;QACF;;QAGA,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,eAAe,CACb,QAA2B,EAC3B,OAAoC,EAAA;AAEpC,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI;QAEvC,MAAM,YAAY,GAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CACzC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAC3C;AAED,QAAA,IAAI,CAAC,YAAY;YAAE;AAEnB,QAAA,IACE,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EACrC;YACA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAiB,KAAI;gBAClD,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAC9C,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;gBACD,IAAI,aAAa,EAAE;AACjB,oBAAA,aAAa,CAAC,MAAM,GAAG,OAAO,KAAK,QAAQ,GAAG,IAAI,GAAG,OAAO;AAC5D,oBAAA,aAAa,CAAC,cAAc,CAAC,GAAG,KAAK;gBACvC;AACF,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,YAAY,CAAC,MAAM,GAAG,OAAO,KAAK,QAAQ,GAAG,IAAI,GAAG,OAAO;AAC3D,YAAA,YAAY,CAAC,cAAc,CAAC,GAAG,KAAK;QACtC;QAEA,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,qBAAqB,CAAC,QAA2B,EAAA;AAC/C,QAAA,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,uBAAuB;AAChE,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;;;;;;;;;;;;;;;;;;;AAoB/B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,mBAAmB,CAAC,QAA0B,EAAA;AAC5C,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK;AACpC,QAAA,IAAI,CAAC,4BAA4B,GAAG,KAAK;AACzC,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACnC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC5C;YACD,IAAI,WAAW,EAAE;gBACf,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAiB,KAAI;oBAClD,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAC7C,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;oBACD,IAAI,aAAa,EAAE;AACjB,wBAAA,aAAa,CAAC,YAAY,GAAG,KAAK;oBACpC;AACF,gBAAA,CAAC,CAAC;YACJ;QACF;aAAO;YACL,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAClC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAC/C;YAED,IAAI,YAAY,EAAE;AAChB,gBAAA,YAAY,CAAC,YAAY,GAAG,KAAK;YACnC;iBAAO;AACL,gBAAA,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;oBAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;wBACjC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACvC,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;wBACD,IAAI,aAAa,EAAE;AACjB,4BAAA,aAAa,CAAC,YAAY,GAAG,KAAK;4BAClC;wBACF;oBACF;gBACF;YACF;QACF;QACA,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAIA,IAAA,yBAAyB,CAAC,GAAQ,EAAA;AAChC,QAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAChD,YAAA,MAAM,mBAAmB,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAC5C,CAAC,KAAU,KAAK,KAAK,CAAC,YAAY,KAAK,KAAK,CAC7C;AACD,YAAA,IAAI,CAAC,uBAAuB,GAAG,mBAAmB;QACpD;aAAO;YACL,IAAI,CAAC,uBAAuB,GAAG,GAAG,CAAC,YAAY,KAAK,KAAK;QAC3D;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,gBAAgB,CAAC,GAAQ,EAAA;AACvB,QAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG;IAClC;IAyEA,WAAW,GAAA;QACT,IAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,wBAAwB,CAAC;QACvE,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAC/D,IAAI,CAAC,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,yBAAyB,CAAC;AACzE,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAE1C,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,MAAM,cAAc,CAAC,KAAuB,EAAA;AAC1C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI;AACnC,QAAA,IAAI,WAAW,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE;YAChE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;gBACxC,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,YAAY,EAAE;AACtC,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC/B;AACF,YAAA,CAAC,CAAC;QACJ;aAAO;YACL,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,YAAY,EAAE;AACtD,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YACvC;QACF;AACA,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;QACtE,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,MAAM,aAAa,CAAC,MAAW,EAAA;AAC7B,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CACzC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CACpC;AACD,YAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBAChB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC;AACA,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;AAC5D,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;YACtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC7B,gBAAA,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACpD,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;wBACpC,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AAChC,4BAAA,KAAK,CAAC,YAAY,GAAG,KAAK;wBAC5B;AACF,oBAAA,CAAC,CAAC;gBACJ;qBAAO,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AACvC,oBAAA,KAAK,CAAC,YAAY,GAAG,KAAK;gBAC5B;AACF,YAAA,CAAC,CAAC;YACF,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,mBAAmB,EAAE;gBAC1B,IAAI,CAAC,2BAA2B,EAAE;gBAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B,CAAC,EAAE,GAAG,CAAC;QAET;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC;AAC7C,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;AAGA,IAAA,wBAAwB,CAAC,KAAU,EAAA;QACjC,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CACxB,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,YAAY,CACnD;QACH;QACA,OAAO,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,YAAY;IAClD;IAGA,gBAAgB,GAAA;AACd,QAAA;IACF;IAIA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AAErB,QAAA,MAAM,WAAW,GAAG;YAClB,mBAAmB;YACnB,eAAe;YACf,oBAAoB;SACrB;AAED,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;AACjC,YAAA,MAAM,WAAW,GAAI,IAAY,CAAC,UAAU,CAAC;YAE7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,CAAS,KAAI;gBAC3C,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE;oBAC7B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,UAAkB,KAAI;wBACtD,IAAI,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC5C,4BAAA,MAAM,EAAE,GAAG,CAAA,EAAG,UAAU,CAAA,EAAG,CAAC,EAAE;AAC9B,4BAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3B;AACF,oBAAA,CAAC,CAAC;gBACJ;qBAAO,IAAI,GAAG,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AAC/C,oBAAA,MAAM,EAAE,GAAG,CAAA,EAAG,UAAU,CAAA,EAAG,CAAC,EAAE;AAC9B,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AA0GA,IAAA,qBAAqB,CAAC,gBAAkC,EAAA;QACtD,IAAI,CAAC,2BAA2B,EAAE;AAClC,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAE1C,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,CAAC,CAAC;IACP;;IAIA,SAAS,CAAC,IAAW,EAAE,WAAqB,EAAA;AAC1C,QAAA,IAAI,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACpC,MAAM,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC,GAAG,WAAW;AACjD,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiB;AAC3C,QAAA,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;YAC1B,IAAI,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;AACzE,YAAA,IAAI,QAAgB;AACpB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3B,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;oBACzB,QAAQ,GAAG,QAAQ;gBACrB;qBAAO,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AAC1C,oBAAA,QAAQ,GAAG;AACR,yBAAA,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;yBAC7D,IAAI,CAAC,GAAG,CAAC;gBACd;qBAAO;AACL,oBAAA,QAAQ,GAAG;yBACR,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,QAAQ;yBAC1B,IAAI,CAAC,GAAG,CAAC;gBACd;YACF;iBAAO;AACL,gBAAA,QAAQ,GAAG,QAAQ,IAAI,QAAQ;YACjC;AACA,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAAE,gBAAA,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3D,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC;QACA,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM;AACzE,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,UAAU,EAAE,YAAY;YACxB,UAAU;YACV,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;AAChD,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC,CAAC;IACL;AAGA,IAAA,aAAa,CAAC,KAAU,EAAA;QACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;AAAE,YAAA,OAAO,CAAC;QAEvD,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAa,EAAE,KAAU,KAAI;YACzD,OAAO,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC,EAAE,CAAC,CAAC;IACP;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB;IACpD;AAEA,IAAA,aAAa,CAAC,IAAY,EAAA;AACxB,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,eAAe;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AACzD,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,gBAAgB,CAAC,IAAY,EAAA;AAC3B,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,eAAe;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;;AACvD,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,mBAAmB;AACpD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAIA,IAAA,MAAM,iBAAiB,CAAC,KAAY,EAAE,UAAkB,EAAA;AACtD,QAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAA0B;AAE7C,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU;AACrC,YAAA,IAAI,UAAU,KAAK,OAAO,EAAE;AAC1B,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;YAE/B;AAAO,iBAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;AAClC,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;YAE/B;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;YAC/B;YACA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,CAAC;AACjE,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;QAC7B;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC5B;QACA,IAAI,CAAC,YAAY,EAAE;IACrB;AAIA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK;IACvE;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IACpG;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,MAAM,KAAK,GAAwB,EAAE;QAErC,IAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,IAAI,CAAC,EAAE;AACzC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AAC1D,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;QACF;aAAO;AACL,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACb,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE;AAClC,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACnB;AACA,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;YACvD,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;AAExF,YAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AACjC,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;AAEA,YAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,EAAE;AACrE,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACnB;YACA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC9C;AAEA,QAAA,OAAO,KAAK;IACd;AAIA,IAAA,4BAA4B,CAAC,GAAQ,EAAA;IAErC;AAEA,IAAA,sBAAsB,CAAC,MAAW,EAAA;IAElC;AAEA,IAAA,eAAe,CAAC,KAAY,EAAA;;QAE1B,IAAI,CAAC,IAAI,CAAC,2BAA2B,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE;AAC1E,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9E,YAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;QACpC;IACF;AAKA,IAAA,0BAA0B,CAAC,GAAQ,EAAA;QACjC,IAAG,GAAG,CAAC,IAAI,IAAI,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE;YAAE;AAC3C,QAAA,IAAI,CAAC,uBAAuB,GAAG,GAAG;AAClC,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;AAC3B,YAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;YACrC,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE;AACvC,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAU,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;AAGvE,YAAA,IAAI,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,IAAI,IAAI,CAAC,uBAAuB,EAAE,WAAW,IAAI,EAAE;;AAGzH,YAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;gBAClE,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAY,MAAM;AACjD,oBAAA,GAAG,EAAE,IAAI;AACT,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,UAAU,EAAE;AACb,iBAAA,CAAC,CAAC;YACL;;AAGA,YAAA,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,GAAG,YAAY;AAEjE,YAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY,CAAC,MAAM,CAC9C,CAAC,MAAW,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,CACzG;YACD,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,KAAK,EAAE;YACnD,CAAC,EAAE,GAAG,CAAC;QACT;AAAO,aAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAClE,YAAA,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS,CAAC;YACzH,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE;YAC/C,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,IAAI,MAAM;AAChD,YAAA,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,KAAK,EAAE,gBAAgB,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS,CAAC;YAC3H,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;YAChD,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,KAAK,EAAE;YACnD,CAAC,EAAE,GAAG,CAAC;QACV;IACF;AAOA,IAAA,UAAU,CAAC,GAAQ,EAAA;;QAEjB,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;YAAE;AAE7C,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,uBAAuB,GAAG,GAAG;AAElC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;AAC3B,YAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;YACrC,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE;AACvC,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAU,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;AAGvE,YAAA,IAAI,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,IAAI,IAAI,CAAC,uBAAuB,EAAE,WAAW,IAAI,EAAE;;AAGzH,YAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;gBAClE,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAY,MAAM;AACjD,oBAAA,GAAG,EAAE,IAAI;AACT,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,UAAU,EAAE;AACb,iBAAA,CAAC,CAAC;YACL;AAEA,YAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY,CAAC,MAAM,CAC9C,CAAC,MAAW,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,CACzG;QACH;AAAO,aAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1D,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,KAAK,EAAE,eAAe,IAAI,SAAS;YAC9D,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE;YAC/C,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,IAAI,MAAM;YAChD,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,KAAK,EAAE,gBAAgB,IAAI,SAAS;YAChE,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;QACnD;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IASA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC3B;AAOA,IAAA,uBAAuB,CAAC,MAAW,EAAA;AACjC,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM;QAC7D,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C;aAAO;AACL,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC;;AAEA,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,IAAI,IAAI,CAAC,uBAAuB,EAAE,WAAW,IAAI,EAAE;;AAGzH,QAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;YAClE,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAY,MAAM;AACjD,gBAAA,GAAG,EAAE,IAAI;AACT,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,UAAU,EAAE;AACb,aAAA,CAAC,CAAC;QACL;AAEA,QAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,MAAW,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC;AACxJ,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;AACrC,QAAA,IAAI,CAAC,qBAAsB,CAAC,MAAM,GAAG,CAAC;AACtC,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;;;IAG3B;IAEA,mBAAmB,GAAA;AACjB,QAAA,MAAM,UAAU,GAAG,CAAC,OAAc,EAAE,KAAa,KAAS;AACxD,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK;AAAE,oBAAA,OAAO,GAAG;gBACnC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;oBACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;AAC7C,oBAAA,IAAI,KAAK;AAAE,wBAAA,OAAO,KAAK;gBACzB;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;AAED,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;QAC3E,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC9B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;AACjC,gBAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;;gBAG3C,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAC1C,CAAC,EAAO,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;iBACnD;;AAGD,gBAAA,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,IAAG;AACzC,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;wBACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B;AACF,gBAAA,CAAC,CAAC;YAEJ;AAAO,iBAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACrE,MAAM,CAAC,KAAK,GAAG;oBACb,eAAe,EAAE,IAAI,CAAC,cAAc,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS,CAAC;AAClH,oBAAA,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;AACpC,oBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM;AACnC,oBAAA,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI;wBAC/B,gBAAgB,EAAE,IAAI,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS,CAAC;AACpH,wBAAA,YAAY,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;qBACvC,CAAC;iBACH;YACH;QACF;AAEA,QAAA,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;SACd;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AAE/B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAElC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;AAEA,IAAA,wBAAwB,CAAC,MAAW,EAAA;;AAElC,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE;gBACjC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS;YACzG;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBACvE,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS;YAC1G;QACF;AAEA,QAAA,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;SACd;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAClC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;AAEA,IAAA,uBAAuB,CAAC,MAAW,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;IACnE;;IAIA,0BAA0B,CAAC,GAAQ,EAAE,KAAY,EAAA;AAC/C,QAAA,MAAM,OAAO,GAAI,KAAK,EAAE,MAA2B,EAAE,OAAO;QAE5D,IAAI,OAAO,EAAE;YACX,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAC5C,CAAC,GAAQ,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CACvC;QACH;aAAO;AACL,YAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;QACrB;IACF;AAGA,IAAA,8BAA8B,CAAC,GAAQ,EAAA;AACrC,QAAA,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AAAE,YAAA,OAAO,KAAK;AAChF,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,qBAAqB,CAAC,MAAM;IACnE;IAEA,cAAc,CAAC,GAAQ,EAAE,MAAW,EAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM;AAClD,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;AACnB,YAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;QACrB;AACA,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5C,QAAA,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;YACZ,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B;aAAO;YACL,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAOA,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,MAAM,sBAAsB,GAAG,CAAC,OAAc,KAAa;AACzD,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,IAAI,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE;oBAC9B,MAAM,CAAC,KAAK,GAAG;AACb,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,eAAe,EAAE,SAAS;AAC1B,wBAAA,WAAW,EAAE,IAAI;AACjB,wBAAA,SAAS,EAAE,MAAM;AACjB,wBAAA,gBAAgB,EAAE,SAAS;AAC3B,wBAAA,YAAY,EAAE;qBACf;AACD,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC/D,oBAAA,IAAI,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAC3C,wBAAA,OAAO,IAAI;oBACb;gBACF;YACF;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC;AACD,QAAA,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;IAGA,eAAe,GAAA;AACf,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,OAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA,CAAA,CAAC,CAAC;AACnD,QAAA,MAAM,mBAAmB,GAAG,CAAC,OAAc,KAAI;AAC7C,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;oBAChB,MAAM,CAAC,KAAK,GAAG;AACb,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,eAAe,EAAE,SAAS;AAC1B,wBAAA,WAAW,EAAE,IAAI;AACjB,wBAAA,SAAS,EAAE,MAAM;AACjB,wBAAA,gBAAgB,EAAE,SAAS;AAC3B,wBAAA,YAAY,EAAE;qBACf;gBACH;AACA,gBAAA,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;AAC1B,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;AAC7D,oBAAA,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACtC;YACF;AACF,QAAA,CAAC;AACD,QAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,qBAAqB,GAAG,EAAE,CAAC;AAC7C,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;QACjG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,QAAA,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAGA,eAAe,GAAA;AACb,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;IAGA,YAAY,CAAC,KAAa,EAAE,GAAQ,EAAA;QAClC,OAAO,GAAG,EAAE,KAAK;IACnB;AAEA,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,MAAM,eAAe,GAAG,CAAC,OAAc,KAAW;YAChD,IAAI,MAAM,GAAU,EAAE;AAEtB,YAAA,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;gBACpB,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;AACvC,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvD;AAEA,gBAAA,IAAI,GAAG,CAAC,KAAK,EAAE;AACb,oBAAA,MAAM,iBAAiB,GACrB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;oBAExH,MAAM,cAAc,GAClB,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AAEnK,oBAAA,IAAI,iBAAiB,IAAI,cAAc,EAAE;AACvC,wBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAClB;gBACF;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QACD,OAAO,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C;IAIA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAUA,aAAa,CAAC,GAAQ,EAAE,MAAW,EAAA;QACjC,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,YAAY,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC7B,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACpE;IAEA,UAAU,CAAC,GAAQ,EAAE,MAAW,EAAA;AAC9B,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;QAC9B,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW;YAAE;QACpD,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;AAE5D,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;YAC9B,UAAU,CAAC,MAAK;gBACd,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,6BAA6B,CAAgB;gBACzF,IAAI,YAAY,EAAE;AAChB,oBAAA,MAAM,IAAI,GAAG,YAAY,CAAC,qBAAqB,EAAE;oBACjD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,YAAY;AAEvE,oBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE;wBAC9B,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI;oBAC9C;yBAAO;AACL,wBAAA,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM;oBACjC;gBACF;AACF,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,WAAW,CAAC,GAAQ,EAAE,MAAW,EAAE,OAAa,EAAA;AAC9C,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC;AAChD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE;AACxE,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC;AAC9F,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;YAChE,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC;AAC1C,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC;AACA,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO;QAC1D,IAAI,QAAQ,GAAG,EAAE,IAAI,QAAQ,GAAG,EAAE,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;AAEA,IAAA,wBAAwB,CAAC,GAAQ,EAAE,MAAW,EAAE,KAAW,EAAA;QACzD,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAC5C,CAAC,CAAM,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CACjD;AACD,YAAA,IAAI,CAAC,WAAW;gBAAE;AAClB,YAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC3D,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;AAC3D,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC;AACpE,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;AAC9F,YAAA,IAAI,CAAC,UAAU;gBAAE;YACjB,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;AAC/C,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE;AAChB,gBAAA,SAAS,EAAE,YAAY;AACvB,gBAAA,KAAK,EAAE;aACR;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,EAAE,GAAG,CAAC;IACT;IAGA,SAAS,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC1B,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACpE;IAEA,cAAc,CAAC,GAAQ,EAAE,MAAW,EAAE,MAAW,EAAE,eAAe,GAAG,KAAK,EAAA;AACxE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAyB,EAAE,GAAoB,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC;AAErG,QAAA,IAAI,MAAM,IAAI,OAAO,EAAE;YACrB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;;;AAGjD,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM;YAC1B;iBAAO;;AAEL,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM;YAC1B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE;AAChB,YAAA,SAAS,EAAE,YAAY;SACxB;QAED,IAAI,eAAe,EAAE;YACnB,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC;QACpD;IACF;AAEA,IAAA,QAAQ,CAAC,IAAS,EAAA;QAChB,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU;YAAE;AACzD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,IAAI;AACjC,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK;AAClC,gBAAA,IAAI,EAAE,IAAI;AACX,aAAA;AACD,YAAA,SAAS,EAAE,YAAY;SACxB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,gBAAgB,GAAA;AACd,QAAA;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,gBAAgB;AACtC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC;AAC9B,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;gBACH,KAAK,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB;AAC9C,gBAAA,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI;AACjC,aAAA;AACD,YAAA,SAAS,EAAE,YAAY;SACxB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,YAAY,CAAC,IAAS,EAAE,IAAS,EAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,OAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA,CAAA,CAAC,CAAC;AACrD,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE;AACP,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEC,IAAA,YAAY,CAAC,IAAQ,EAAA;AACnB,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,OAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA,CAAA,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,KAAK;AAC3C,YAAA,GAAG,IAAI;AACP,YAAA,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;AAC3B,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI;;AAE3B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;YACpB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC;QAC7C;AACA,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE;AAC9B,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,aAAa,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA,CAAC,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;AACxB,gBAAA,QAAQ,EAAE;AACX,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEF,IAAA,UAAU,CAAC,OAAa,EAAA;AACtB,QAAA,IAAI,OAAO,EAAE,OAAO,EAAE;AACpB,YAAA,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;YAChC;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC,YAAY;QACrE,IAAI,YAAY,GAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC;AACtF,QAAA,IAAI,MAAM,GAAG;YACX,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC7C,YAAA,sBAAsB,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,GAAG,SAAS;YACxF,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,YAAY,EAAE,IAAI,CAAC;SAEpB;QACD,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,KAAI;AACjF,YAAA,MAAM,MAAM,GAAG;AACb,gBAAA,GAAG;aACJ;AACD,YAAA,IAAI,MAAM,CAAC,UAAU,EAAE;gBACrB,OAAO,MAAM,CAAC,UAAU;YAC1B;YACA,IAAI,KAAK,EAAE;gBACT,OAAO,KAAK,CAAC,UAAU;AACvB,gBAAA,MAAM,CAAC,KAAK,GAAG,KAAK;AACpB,gBAAA,IAAI,IAAI,KAAK,UAAU,EAAE;oBACvB,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;AAC7B,oBAAA,MAAM,CAAC,KAAK,GAAG,IAAI;gBACrB;AAAO,qBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;oBAC5B,OAAO,KAAK,CAAC,IAAI;AACjB,oBAAA,MAAM,CAAC,KAAK,GAAG,KAAK;gBACtB;YACF;iBAAO;AACL,gBAAA,MAAM,CAAC,KAAK,GAAG,IAAI;YACrB;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,GAAG,YAAY,EAAE,IAAI;gBAC9G,aAAa,EAAE,IAAI,CAAC,YAAY;gBAChC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,YAAY,GAAG,cAAc,GAAG,EAAE;AAChD,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI;gBAClG,WAAW,EAAE,OAAO,IAAI,SAAS,GAAG,KAAK,GAAG;AAC7C,aAAA;AACD,YAAA,SAAS,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,GAAG,cAAc,GAAG;SAC9F;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,GAAG,SAAS,GAAG,SAAS;QAC5E,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,KAAK;IACd;;AAKA,IAAA,WAAW,CAAC,GAAQ,EAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QACvC,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;IACzC;;IAGA,yBAAyB,GAAA;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC;IAC/D;;IAGA,wBAAwB,GAAA;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;IAChE;;IAGA,uBAAuB,GAAA;AACrB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,EAAE;AACnD,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AACtC,YAAA,GAAG,CAAC,UAAU,GAAG,CAAC,UAAU;AAC9B,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,iCAAiC,EAAE;IAC1C;;IAGA,yBAAyB,GAAA;AACvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,EAAE;AACjD,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;AACtC,YAAA,GAAG,CAAC,UAAU,GAAG,SAAS;AAC5B,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,iCAAiC,EAAE;IAC1C;;IAIA,UAAU,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAC3B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,GAAG,EAAE,KAAK,CAAA,CAAE;IAC9C;IAKA,0BAA0B,CACxB,GAAQ,EACR,GAAQ,EACR,OAAc,EACd,cAAc,GAAG,KAAK,EAAA;AAEtB,QAAA,MAAM,WAAW,GAAG,CAAC,SAAc,KAAI;AACrC,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,gBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE;gBACxB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;AAChD,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK;oBACpD,IAAI,CAAC,QAAQ,EAAE;oBACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;gBAC5C;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,iBAAiB,GAAG,CAAC,SAAc,KAAI;YAC3C,MAAM,IAAI,GAAa,EAAE;AACzB,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,gBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE;gBAExB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;AAChD,oBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;gBACrD;AACF,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;QAED,IAAI,cAAc,EAAE;YAClB,IAAI,OAAO,GAAa,EAAE;AAC1B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC;gBAChC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;oBAClC,OAAO,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC3C,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC;YAClC;AACA,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YAC1B,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1D,WAAW,CAAC,GAAG,CAAC;AAChB,oBAAA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC1D;qBAAO;oBACL,WAAW,CAAC,GAAG,CAAC;gBAClB;YACF;QACF;aAAO;AACL,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK;AAChD,YAAA,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;gBAAE;YAE1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAChC,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;gBAC1B,IAAI,CAAC,QAAQ,EAAE;gBACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC5C;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YAChC;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAIA,UAAU,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACrE;IAEA,SAAS,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;IAC3E;AAEA,IAAA,aAAa,CAAC,OAA2B,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;AAC1B,QAAA,OAAO,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;IAClD;AAKA,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC1C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM;AAClD,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IACrC;AAEA,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE;IAC5D;AAEA,IAAA,gBAAgB,CAAC,IAAY,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/E,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7E;AAEA,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;;;AAcQ,IAAA,kBAAkB,CAAC,IAAS,EAAA;;AAEpC,QAAA,MAAM,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE;AAC3E,QAAA,OAAO,gBAAgB,KAAK,UAAU,IAAI,gBAAgB,KAAK,QAAQ;IACzE;AAEA,IAAA,YAAY,CAAC,KAA8B,EAAE,IAAS,EAAE,UAA2D,MAAM,EAAA;QACvH,KAAK,CAAC,cAAc,EAAE;QAEtB,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;QACpF,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AACpF,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;QAGvB,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;;AAGxD,QAAA,IAAI,OAAO,KAAK,kBAAkB,EAAE;AAClC,YAAA,IAAI,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC;QAC7B;AAAO,aAAA,IAAI,OAAO,KAAK,iBAAiB,EAAE;YACxC,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;YAC7C,IAAI,CAAC,kBAAkB,EAAE;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC;QACF;aAAO;;YAEL,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;YAC7C,IAAI,CAAC,kBAAkB,EAAE;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;QAGxB,UAAU,CAAC,MAAK;YACd,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAgB;AACnE,YAAA,IAAI,CAAC,IAAI;gBAAE;YACX,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI;YAChC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY;YACnD,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW;AACrD,YAAA,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;AAAE,gBAAA,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACjC,YAAA,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;AAAE,gBAAA,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AAC5B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,CAAC,CAAC;AAEL,QAAA,OAAO,KAAK;IACd;AAGE,IAAA,aAAa,CAAC,MAAc,EAAA;AAC5B,QAAA,MAAM,KAAK,GAAG;YACZ,GAAG,EAAE,IAAI,CAAC,WAAW;AACrB,YAAA,SAAS,EAAE,MAAM;SAClB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;IACxB;AAGE,IAAA,aAAa,CAAC,IAAY,EAAA;QACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAC9C,MAAM,2BAA2B,GAAU,EAAE;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAG;YAC7B,2BAA2B,CAAC,IAAI,CAAC;AAC/B,gBAAA,EAAE,EAAE,EAAE;gBACN,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,GAAG,EAAE,QAAQ;gBACb,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA;AACD,YAAA,SAAS,EAAE,IAAI;SAChB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;IACjC;IAIA,cAAc,CAAC,MAAW,EAAE,KAAU,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,IAAI,GAAQ;AACZ,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,GAAG,GAAG,KAAK,EAAE,KAAK;QACpB;aAAO;YACL,GAAG,GAAG,KAAK;QACb;AACA,QAAA,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK;QAC3B,MAAM,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE;;QAE5C,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,kBAAkB,EAAE;AACtD,YAAA,OAAO,EAAE;QACX;AACA,QAAA,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,iBAAiB,EAAE;AACxF,YAAA,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,uBAAuB;QACtD;AACA,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,4BAA4B,CAAC,MAAW,EAAA;AACtC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;AAC9B,YAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;QACxB;AAAO,aAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC7D,MAAM,CAAC,KAAK,GAAG;AACb,gBAAA,eAAe,EAAE,SAAS;AAC1B,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,SAAS,EAAE,MAAM;AACjB,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,YAAY,EAAE,IAAI;aACnB;QACH;AACA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;IAEA,iCAAiC,GAAA;QAC/B,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5C;AAEA,IAAA,WAAW,CAAC,IAAa,EAAA;AACvB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;gBACH,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,IAAI,IAAI;AACf,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAE/B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,iBAAiB;AACjD,QAAA,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC7C,YAAA,sBAAsB,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,GAAG,SAAS;YACxF,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,YAAY,EAAE,IAAI,CAAC;SACpB;AACC,QAAA,MAAM,KAAK,GAAG;AACd,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE;AACP,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE;;AAE3B,YAAA,IAAI,QAAQ;YACZ,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;gBACvG,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AACrF,gBAAA,QAAQ,GAAG;oBACT,KAAK,EAAE,IAAI,CAAC,YAAY;AACxB,oBAAA,WAAW,EAAE;iBACd;YACH;iBAAO;AACL,gBAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,gBAAA,QAAQ,GAAG;AACT,oBAAA,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;AACrB,oBAAA,WAAW,EAAE;iBACd;YACH;AAEA,YAAA,MAAM,KAAK,GAAG;AACZ,gBAAA,GAAG,EAAE;AACH,oBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACpC,oBAAA,GAAG;AACJ,iBAAA;AACD,gBAAA,SAAS,EAAE;aACZ;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,gBAAA,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAC/B,gBAAA,IAAI,EAAE,CAAC;AACP,gBAAA,GAAG;AACJ,aAAA,CAAC;;;AAKF,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAC5B;QACF;IACF;IAEA,aAAa,GAAA;;AAEX,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;;AAGrB,QAAA,IAAI,QAAQ;QACZ,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YACvG,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AACrF,YAAA,QAAQ,GAAG;gBACT,KAAK,EAAE,IAAI,CAAC,YAAY;AACxB,gBAAA,WAAW,EAAE;aACd;QACH;aAAO;AACL,YAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,YAAA,QAAQ,GAAG;AACT,gBAAA,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;AACrB,gBAAA,WAAW,EAAE;aACd;QACH;;AAGA,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,WAAW,EAAE,EAAE;AACf,gBAAA,GAAG;AACJ,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,CAAC;AACP,YAAA,GAAG;AACJ,SAAA,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC5B;IACF;IAEA,wBAAwB,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB;AAAE,YAAA,OAAO,IAAI;QACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAQ,KAAK,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC;AAC/F,QAAA,MAAM,gBAAgB,GAAG,CAAC,OAA0B,KAAW;AAC7D,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;AAAE,gBAAA,OAAO,EAAE;YACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;AAC7B,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,oBAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AAC7C,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;oBACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,OAAO,CAAC,GAAG,CAAC;AAChE,oBAAA,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;AACvC,gBAAA,CAAC,CAAC;AAEF,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;gBACzB;AAAO,qBAAA,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;oBACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAAE,wBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;oBACzD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;wBAChE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;4BAAE,OAAO,CAAC,GAAG,CAAC;AAChE,wBAAA,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;AACvC,oBAAA,CAAC,CAAC;gBACJ;AAEA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;AAC7B,gBAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACjD,gBAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACjD,gBAAA,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;AAC7B,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;AAED,QAAA,MAAM,SAAS,GAAG,CAAC,CAAM,EAAE,CAAM,KAAa;YAC5C,IAAI,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AAExB,YAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE;gBAC9E,OAAO,CAAC,KAAK,CAAC;YAChB;AAEA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;AAEvD,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACpB,gBAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,oBAAA,OAAO,KAAK;AACvC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,oBAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,wBAAA,OAAO,KAAK;gBAC1C;AACA,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,gBAAA,OAAO,KAAK;AAE/C,YAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,oBAAA,OAAO,KAAK;AACtC,gBAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAAE,oBAAA,OAAO,KAAK;YAC9C;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;QACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAChE,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC;QACxD,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;AAClD,QAAA,OAAO,MAAM;IACf;IAkBA,cAAc,CACZ,QAAgB,EAChB,QAAgB,EAChB,WAA0B,EAC1B,KAAa,EACb,KAAiB,EACjB,OAAe,EAAA;QAEf,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;QAChC,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;AAEzD,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;AAC9E,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;QAC1C,MAAM,cAAc,GAAG,MAAK;YAC1B,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;AACzD,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;QACpD,IAAI,CAAC,yBAAyB,EAAE;IAClC;IAGA,eAAe,CACb,QAAgB,EAChB,QAAgB,EAChB,WAA0B,EAC1B,KAAa,EACb,KAAiB,EACjB,OAAe,EAAA;QAEf,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;AACjC,QAAA,MAAM,iBAAiB,GAAG,WAAW,IAAI,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAU,EAAE;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,iBAAiB,CAAC;AAEpH,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE;AACrC,gBAAA,MAAM,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAC,WAAW,CAAA,CAAA,EAAI,OAAO,EAAE;AACtE,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC;AACZ,oBAAA,QAAQ,EAAE,CAAC;oBACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,KAAK;AACL,oBAAA,GAAG,EAAE;AACN,iBAAA,CAAC;YACJ;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;QAC7B,IAAI,CAAC,yBAAyB,EAAE;;AAGhC,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAClC;AAKA,IAAA,uBAAuB,CACrB,QAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,MAAc,EAAA;QAEd,MAAM,MAAM,GAAgD,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;AAEzC,QAAA,MAAM,aAAa,GAAG,QAAQ,IAAI,MAAM;AACxC,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAE7C,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM,EAAE;gBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;AACzC,gBAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACxD,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C;YACF;AACK,iBAAA,IAAI,CAAC,KAAK,QAAQ,EAAE;gBACvB,IAAI,aAAa,EAAE;AACjB,oBAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AAC3C,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;qBAAO;AACL,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACrD,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;YACF;AACK,iBAAA,IAAI,CAAC,KAAK,MAAM,EAAE;gBACrB,IAAI,aAAa,EAAE;AACjB,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACnD,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;qBAAO;AACL,oBAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACzC,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;YACF;iBACK;AACH,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C;YACF;QACF;AAEA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,iBAAiB,CAAC,QAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACpE,YAAA,OAAO,CAAC;QACV;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AACrC,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AACrD,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM;QAC/B;AACA,QAAA,OAAO,CAAC;IACV;AACA,IAAA,aAAa,CAAC,QAAgB,EAAA;QAC5B,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC7C;IACA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,yBAAyB,EAAE;IAClC;IACA,UAAU,CACR,QAAgB,EAChB,QAAgB,EAChB,WAA0B,EAC1B,KAAa,EACb,OAAe,EAAA;AAEf,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;QAChC,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE;QAC3D,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IACnC;IAUA,yBAAyB,GAAA;QACvB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YACnC,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YAC3E;QACF;;QAGA,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;;AAGrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACxC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAE1C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,QAAQ;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,SAAS;IACxC;IACA,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9E,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC;QACrF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;QAE9E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE;IAC/D;IACA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9E,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC;QACtF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;QAE/E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE;IAC/D;AACA,IAAA,WAAW,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AACzF,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;AACzF,QAAA,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG;IACjG;AACA,IAAA,cAAc,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AAC5F,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;AACzF,QAAA,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM;IACvG;AACA,IAAA,YAAY,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AAC1F,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;QACzF,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,IAAI;AACrD,YAAA,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ;YAC/C,OAAO,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW;IACrD;AAEA,IAAA,aAAa,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AAC3F,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;QACzF,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,IAAI;AACtD,YAAA,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ;YAChD,OAAO,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW;IACtD;AAEA,IAAA,eAAe,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QAC7F,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IAClI;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QAC9F,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IACnI;AAEA,IAAA,kBAAkB,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QAChG,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IACrI;AAEA,IAAA,mBAAmB,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QACjG,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IACtI;AAMA,IAAA,oBAAoB,CAAC,KAAiB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,+BAA+B,EAAE;AACxC,YAAA,aAAa,CAAC,IAAI,CAAC,+BAA+B,CAAC;AACnD,YAAA,IAAI,CAAC,+BAA+B,GAAG,IAAI;QAC7C;AACA,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa;AACnE,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AACvD,QAAA,IAAI,CAAC,mBAAmB,IAAI,CAAC,iBAAiB;YAAE;AAChD,QAAA,MAAM,cAAc,GAAG,mBAAmB,CAAC,qBAAqB,EAAE;AAClE,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,qBAAqB,EAAE;AAC9D,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;QAC5B,MAAM,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY;QAC7D,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;QACnE,MAAM,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY;QACjE,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;QACnE,IAAI,OAAO,GAAG,CAAC;QACf,IAAI,OAAO,GAAG,CAAC;AACf,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW;AACxC,QAAA,IAAI,UAAU;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,WAAW;AAC1C,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW;AACzC,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,WAAW;QACzC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,+BAA+B,GAAG,WAAW,CAAC,MAAK;AACtD,gBAAA,IAAI,OAAO,KAAK,CAAC,EAAE;AACjB,oBAAA,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1C;AACA,gBAAA,IAAI,OAAO,KAAK,CAAC,EAAE;AACjB,oBAAA,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;gBACxC;YACF,CAAC,EAAE,EAAE,CAAC;QACR;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,+BAA+B,EAAE;AACxC,YAAA,aAAa,CAAC,IAAI,CAAC,+BAA+B,CAAC;AACnD,YAAA,IAAI,CAAC,+BAA+B,GAAG,IAAI;QAC7C;IACF;AAgBA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC7C;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC7C;IAGA,cAAc,CAAC,KAAa,EAAE,KAAiB,EAAA;QAC7C,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACnC,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,MAAM,gBAAgB,GAAG,CAAC,CAAa,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACpE,MAAM,cAAc,GAAG,MAAK;YAC1B,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;AACvD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,CAAC;AAC3D,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC7C,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;YAChC;AACF,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;AACpD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,CAAC;IAC1D;IAEA,cAAc,CAAC,KAAa,EAAE,KAAiB,EAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI;YAAE;AAChE,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC;AAC1D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC;AACxD,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC;QACA,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3C;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;IACpC;AACA,IAAA,gBAAgB,CAAC,CAAa,EAAA;AAC5B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,aAA4B;AAC/D,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE;QAC9C,MAAM,QAAQ,GAAG,EAAE;QACnB,IAAI,YAAY,GAAG,CAAC;QAEpB,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,QAAQ,EAAE;YACnC,YAAY,GAAG,CAAC,GAAG;QACrB;aAAO,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE;YAC7C,YAAY,GAAG,GAAG;QACpB;AAEA,QAAA,IAAI,YAAY,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC5B,MAAM,IAAI,GAAG,MAAK;AAChB,oBAAA,SAAS,CAAC,SAAS,IAAI,YAAY;AACnC,oBAAA,IAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,CAAC;AACvD,gBAAA,CAAC;AACD,gBAAA,IAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,CAAC;YACvD;QACF;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC7C,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;YAChC;QACF;IACF;AAOQ,IAAA,SAAS,CAAC,IAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC;AAEA,IAAA,UAAU,CAAC,YAAqB,EAAA;;AAE9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;;AAGpB,QAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC;AAC/C,QAAA,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAC9D,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B;AAED,QAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC;IAC5C;IAIA,sBAAsB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAC5C,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B;IACH;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAE5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,8BAA8B,EAAE;QACnD,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3D;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;AACvE,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC;QAEhD;AAAO,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;AAC9E,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAE/B;AAAO,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC9E,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,EAAE;QAEb;AAAO,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC9E,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,EAAE;QACb;IACF;IAEA,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAG;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAC9C;IACF;IAEA,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAG;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAC9C;IACF;IAKA,MAAM,OAAO,CAAC,KAAqB,EAAA;QACjC,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;AACjD,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAC/D,IAAI,EACJ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,EACZ,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,WAAW,CACtB;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC;AAC1C,QAAA,IAAI,WAAW,EAAE,MAAM,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,SAAS,EAAE,YAAY;aACxB;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,MAAM,CAAC,KAAU,EAAA;AACf,QAAA,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3C;AAEA,IAAA,cAAc,CAAC,KAAU,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;AACtB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAC/B;AACA,QAAA,OAAO,KAAK,CAAC,QAAQ,EAAE;IACzB;;AAgBF,IAAA,uBAAuB,CAAC,KAAiB,EAAE,GAAQ,EAAE,GAAQ,EAAA;QAC3D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;AAC1B,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;;;IAG5B;;AAGA,IAAA,gBAAgB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAChD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAIA,IAAA,eAAe,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAC/C,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;AAEA,IAAA,kBAAkB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAClD,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC;IACjD;;IAQA,uBAAuB,CAAC,GAAQ,EAAE,GAAQ,EAAA;;AAExC,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,QAAA,EAAW,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;QACnE,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,qBAAqB,EAAE;YAC/C,OAAO,IAAI,CAAC,IAAI;QAClB;AACA,QAAA,OAAO,CAAC;IACV;;IAGA,iBAAiB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAClC,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AACrD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE;YAChC,SAAS,EAAE,IAAI,CAAC,qBAAqB;YACrC,KAAK,EAAE,IAAI,CAAC;AACb,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAE1B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,4BAA4B,CAAC,GAAQ,EAAE,GAAQ,EAAE,KAAU,EAAA;AACzD,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AACrD,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,qBAAqB,IAAI,EAAE;QAClD,IAAI,MAAM,GAAwC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAErH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,MAAM,CAAC,KAAK,GAAG,EAAE;AAEnD,QAAA,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAW,KAC/C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,CACzD;QAED,IAAI,WAAW,EAAE;;AAEf,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;QACtC;aAAO;;YAEL,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAW,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC;YACjF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3C;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,oBAAoB,CAAC,GAAQ,EAAE,MAAW,EAAE,GAAQ,EAAA;AAClD,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;QACrD,IAAI,MAAM,GAAwC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAErH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,MAAM,CAAC,KAAK,GAAG,EAAE;QAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;AAE5C,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/B;aAAO;AACL,YAAA,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7B;QAEA,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;QACtC;aAAO;YACL,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3C;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,iBAAiB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAClC,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AACrD,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAE3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,gBAAgB,CAAC,GAAQ,EAAA;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE;;AAE9B,YAAA,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD;AAEA,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAS,KAAI;YACjE,IAAI,MAAM,GAAG,IAAI;AACjB,YAAA,KAAK,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AAC5D,gBAAA,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,CAAG,CAAC,EAAE;oBACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACxC,oBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;AAC5D,oBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;AAE5D,oBAAA,QAAQ,MAAM,CAAC,SAAS;AAC5B,wBAAA,KAAK,SAAS;4BACZ,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;4BAClD;AACF,wBAAA,KAAK,QAAQ;AACX,4BAAA,MAAM,GAAG,MAAM,IAAI,SAAS,KAAK,WAAW;4BAC5C;AACF,wBAAA,KAAK,YAAY;4BACf,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC;4BACpD;AACF,wBAAA,KAAK,UAAU;4BACb,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;4BAClD;;AAGE,oBAAA,IAAI,CAAC,MAAM;wBAAE;gBACf;YACF;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,CAAC;IACF;;AAMA,IAAA,iBAAiB,CAAC,KAAmB,EAAE,GAAQ,EAAE,GAAQ,EAAE,KAAa,EAAA;AACtE,QAAA,IAAI,CAAC,2BAA2B,GAAG,GAAG;AACtC,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;IAC7B;IAEA,iBAAiB,CAAC,KAAkB,EAAE,GAAQ,EAAA;;IAE9C;IAEA,mBAAmB,CAAC,KAAuB,EAAE,GAAQ,EAAA;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;YAAE;QAE/E,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC;AACnH,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;AAEvC,QAAA,IAAI,aAAa,KAAK,YAAY,EAAE;YAClC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC;AACjE,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAG1B;AAEA,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;AACvC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;IASA,UAAU,CAAC,KAAyB,EAAE,GAAQ,EAAA;AAC5C,QAAA,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO;YAAE;AAE5B,QAAA,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;;QAG7E,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE;YAC5B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAY,KAAI;gBACxC,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;;AAEzE,gBAAA,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,CAAS,KAAI;oBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAChC,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;IACF;AAIA,IAAA,YAAY,CAAC,GAAQ,EAAA;AACnB,QAAA,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,KAAK;IACrC;IAYA,eAAe,CAAC,KAAiB,EAAE,GAAQ,EAAA;AACzC,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK;AAEvC,QAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa;AAEnD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;AAC5D,YAAA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;AAC/D,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;AAEA,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;IACxD;IAEA,qBAAqB,CAAC,KAAiB,EAAE,GAAQ,EAAA;AAC/C,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK;AACvC,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;IAGxD;AAEA,IAAA,iBAAiB,CAAC,GAAQ,EAAE,QAAgB,EAAE,QAAgB,EAAA;AAC5D,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI;YAAE;QAEvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAY,KAAI;AACxC,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,CAAC;AAC7D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAW,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEtD,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEnC,YAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE1B,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,CAAC;YAEtC,MAAM,OAAO,GAAQ,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,KAAa,KAAI;gBAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,4BAA4B,CAAC,GAAQ,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;AACxB,YAAA,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;AAC5B,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC;;AAYA,IAAA,kBAAkB,CAAC,KAAmB,EAAE,GAAQ,EAAE,GAAQ,EAAE,KAAa,EAAA;AACvE,QAAA,IAAI,CAAC,2BAA2B,GAAG,GAAG;AACtC,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;;AAG3B,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7D,qBAAqB,CAAC,MAAK;;AAEzB,YAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB;AACzE,QAAA,CAAC,CAAC;IACJ;;IAGA,oBAAoB,CAAC,KAAyB,EAAE,GAAQ,EAAA;AACtD,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK;AAEvC,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa;AACzC,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;AAEvC,QAAA,IAAI,aAAa,KAAK,YAAY,EAAE;;YAElC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAgB;YAC7E,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACpC,UAAU,CAAC,MAAK;oBACd,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC;oBACjE,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,CAAC;AACxD,oBAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC;oBACtC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACvC,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,gBAAA,CAAC,EAAE,GAAG,CAAC,CAAC;YACV;QACF;aAAO;;YAEL,qBAAqB,CAAC,MAAK;AACzB,gBAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe;AACpE,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;AACvC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/D;;AAGA,IAAA,uBAAuB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;QAC/B,MAAM,GAAG,GAAG,CAAA,EAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAA,CAAE;;AAGnC,QAAA,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,eAAe;QAC1C,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC;;AAGxD,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC5B,YAAA,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,GAAG,CAAC;SACjB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;IAYlC;;AAGA,IAAA,iBAAiB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACjD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;QAC/B,MAAM,GAAG,GAAG,CAAA,EAAG,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AAEzE,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;;AAGxD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAG;oBACd,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE;AAC9C,oBAAA,SAAS,EAAE,kBAAkB;AAC7B,oBAAA,OAAO,EAAE;iBACV;gBACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClC;;AAGA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;;AAGA,IAAA,oBAAoB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACpD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,qBAAqB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACrD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAErF,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;AAExD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAG;oBACd,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;AAC1F,oBAAA,SAAS,EAAE;iBACZ;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC;AAEA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;;AAGA,IAAA,mBAAmB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACnD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;;AAUA,IAAA,iBAAiB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACjD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAE3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,kBAAkB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAClD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAErF,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;;AAGxD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;;AAE9B,gBAAA,MAAM,OAAO,GAAG;AACd,oBAAA,IAAI,EAAE;AACJ,wBAAA,GAAG,QAAQ;wBACX,aAAa;wBACb,QAAQ;AACR,wBAAA,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;wBACxB,KAAK,EAAE,GAAG,CAAC;AACZ,qBAAA;AACD,oBAAA,SAAS,EAAE;iBACZ;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC;AAEA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;IAMA,eAAe,CAAC,QAAa,EAAE,KAAa,EAAA;AAC5C,QAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;YACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;AACpC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACjD,gBAAA,OAAO,GAAG;YACZ;YACA,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAM,KAAK,GAAG,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7F,YAAA,OAAO,YAAY,GAAG,CAAC,GAAG,CAAA,EAAG,YAAY,CAAA,CAAA,CAAG,GAAG,GAAG;QAClD;AAAO,aAAA,IAAI,KAAK,KAAK,cAAc,EAAE;AACrC,YAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;AACnD,gBAAA,OAAO,GAAG;YACZ;AACA,YAAA,OAAO,CAAA,EAAG,UAAU,CAAC,oBAAoB,GAAG;QAC5C;AAAO,aAAA,IAAI,KAAK,KAAK,aAAa,EAAE;YACpC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;AACzC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3D,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,OAAO,GAAG;QACV;AACA,QAAA,OAAO,GAAG;IACV;IACA,qBAAqB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AACtC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;AACjD,QAAA,IAAI,GAAG,CAAC,KAAK,KAAK,eAAe,IAAI,GAAG,CAAC,KAAK,KAAK,gBAAgB,EAAE;YACnE,IAAI,KAAK,EAAE;AACT,gBAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/B;QACF;AACA,QAAA,OAAO,KAAK;IACd;AAIA,IAAA,kBAAkB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAE,SAAe,EAAA;QACnE,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,QAAA,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,cAAc,EAAE;YAC1D,IAAI,CAAC,kBAAkB,GAAG,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1D,YAAA,IAAI,CAAC,mBAAmB,GAAG,cAAc;AACzC,YAAA,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB;QACF;;QAGA,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAE3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAExB,UAAU,CAAC,MAAK;YACd,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,qBAAA,EAAwB,GAAG,CAAA,EAAA,CAAI,CAAqB;YACzF,IAAI,KAAK,EAAE;gBACT,KAAK,CAAC,KAAK,EAAE;gBACb,KAAK,CAAC,MAAM,EAAE;YAChB;QACF,CAAC,EAAE,CAAC,CAAC;IACP;AAGA,IAAA,mBAAmB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACnD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAErF,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;AAExD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAG;AACd,oBAAA,IAAI,EAAE;AACJ,wBAAA,GAAG,QAAQ;wBACX,aAAa;wBACb,QAAQ;AACR,wBAAA,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;wBACxB,KAAK,EAAE,GAAG,CAAC;AACZ,qBAAA;AACD,oBAAA,SAAS,EAAE;iBACZ;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC;AAEA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;AAEA,IAAA,gBAAgB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAChD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;AAEA,IAAA,mBAAmB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACnD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;AAKA,IAAA,iBAAiB,CAAC,KAAiB,EAAE,QAAa,EAAE,KAAa,EAAA;QAC/D,IAAI,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO;AAChC,QAAA,IAAI,CAAC,kBAAkB,GAAG,QAAQ;AAClC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;QAChC,IAAI,CAAC,eAAe,GAAG;AACrB,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE;AACrB,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG;SACpB;AACD,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;IAC5B;AAMA,IAAA,oBAAoB,CAAC,GAAQ,EAAA;AAC3B,QAAA,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,GAAG,EAAE,SAAS,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK;AACxE,QAAA,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACrD,KAAK,IAAI,kBAAkB;YAC3B,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,KAAa,KAAI;gBACpD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,GAAG,KAAK;gBAC7F,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK;gBAC5C,KAAK,IAAI,CAAA,EAAA,EAAK,KAAK,GAAG,CAAC,eAAe,OAAO,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,CAAG;AAC7D,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,KAAK;IACd;IAYA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,IAAI,CAAC;QAC3D,IAAI,CAAC,uBAAuB,EAAE;IAChC;IAEA,uBAAuB,GAAA;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;AACpC,QAAA,MAAM,OAAO,GAAG,KAAK,GAAG,EAAE;AAE1B,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,IAAI,CAAC,iBAAiB,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,GAAG;QAClD;aAAO;AACL,YAAA,IAAI,CAAC,iBAAiB,GAAG,CAAA,EAAG,OAAO,GAAG;QACxC;IACF;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc;AAEtD,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE;gBACJ,GAAG,IAAI,CAAC,kBAAkB;AAC1B,gBAAA,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK;gBACrC,KAAK,EAAE,IAAI,CAAC;AACb,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;IAC7B;IAIA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;IAC7B;AAIA,IAAA,sBAAsB,CAAC,KAAiB,EAAE,SAAc,EAAE,QAAa,EAAA;AACrE,QAAA,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,MAAM,EAAE;YAC5C;QACF;QAEA,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAG,SAAS,CAAC,qBAAqB,CAAC;QAClE,IAAI,CAAC,0BAA0B,GAAG;AAChC,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG;AACtB,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG;SACpB;AACD,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAcA,mBAAmB,CAAC,KAAiB,EAAE,SAAc,EAAA;AACnD,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE;YACpC;QACF;AACA,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,aAAa;AACjD,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;AAC7E,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,qBAAqB,CAAC,KAAiB,EAAE,GAAQ,EAAE,CAAM,EAAA;QACvD,IAAI,CAAC,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE,aAAa;AAC1C,YAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG;AAChC,YAAA,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;AAC7E,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;QACxC;IACF;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC7B,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,gBAAA,IAAI,CAAC,0BAA0B,GAAG,KAAK;AACvC,gBAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;AAC5B,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;YACnC;QACF,CAAC,EAAE,GAAG,CAAC;IACT;;IAOA,sBAAsB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,6BAA6B,EAAE;AACtC,YAAA,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC;QAClD;AACA,QAAA,IAAI,CAAC,6BAA6B,GAAG,UAAU,CAAC,MAAK;AACnD,YAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;AACtC,YAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE;AAChC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAIA,6BAA6B,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,6BAA6B,EAAE;AACtC,YAAA,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC;AAChD,YAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI;QAC3C;IACF;IAEA,0BAA0B,GAAA;;IAE1B;IACA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC;QAC7C;AACA,QAAA,IAAI,CAAC,wBAAwB,GAAG,UAAU,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,EAAE,GAAG,CAAC,CAAC;IACV;IAEA,wBAAwB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC3C,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;QACtC;IACF;;AAkBA,IAAA,wBAAwB,CAAC,KAAiB,EAAE,GAAQ,EAAE,GAAQ,EAAA;QAC5D,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;AAC1B,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;QAE1B,UAAU,CAAC,MAAK;YACd,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAAuB;AACnF,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAmC;AAExD,YAAA,IAAI,OAAO,IAAI,MAAM,EAAE;gBACrB,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;gBACrC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI;YACxC;AAEA,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,CAAC,CAAC;IACP;;IAIA,aAAa,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC9B,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AAEtB,QAAA,GAAG,CAAC,SAAS,GAAG,KAAK;QACrB,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AAC1C,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,cAAc,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC/B,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AAEtB,QAAA,GAAG,CAAC,SAAS,GAAG,MAAM;QACtB,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AAC3C,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,eAAe,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAChC,QAAA,GAAG,CAAC,SAAS,GAAG,IAAI;;AAEpB,QAAA,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE;AAC5B,YAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QAClD;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEQ,IAAA,cAAc,CAAC,GAAQ,EAAE,KAAa,EAAE,KAAqB,EAAA;AACnE,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI;YAAE;AAExB,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC;AAE5C,YAAA,IAAI,KAAK,KAAK,KAAK,EAAE;gBACnB,OAAO,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;YACvD;iBAAO;gBACL,OAAO,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;YACvD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,qBAAqB,CAAC,GAAQ,EAAE,GAAQ,EAAE,MAA+B,EAAA;AACvE,QAAA,GAAG,CAAC,MAAM,GAAG,MAAM;AACnB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEQ,IAAA,oBAAoB,CAAC,GAAQ,EAAA;AACnC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE;QAE3B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;QAClF,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;QACpF,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AAE3E,QAAA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC;IACzE;;IAGA,oBAAoB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE;QAE3B,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC;AACrF,QAAA,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;QAErE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,wBAAwB,CAAC,GAAQ,EAAA;AAC/B,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE;QAE3B,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC;AACzF,QAAA,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AAEnF,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;AAClC,YAAA,GAAG,CAAC,KAAK,GAAG,UAAU;AACxB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,mBAAmB,CAAC,GAAQ,EAAA;;AAE1B,QAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC;AAClD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;AAEA,IAAA,kBAAkB,CAAC,GAAQ,EAAA;AACzB,QAAA,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE;YAC/B,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC/E;aAAO;;;AAGL,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE;gBAChC,GAAG,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/E;;YAEA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC/E;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAOA,IAAA,uBAAuB,CAAC,GAAQ,EAAA;AAC9B,QAAA,IAAI,CAAC,kCAAkC,GAAG,GAAG;AAC7C,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAClC,QAAA,IAAI,CAAC,kCAAkC,GAAG,IAAI;IAChD;IAEA,4BAA4B,CAAC,MAAW,EAAE,SAAkB,EAAA;AAC1D,QAAA,IAAI,CAAC,IAAI,CAAC,kCAAkC,EAAE,OAAO,EAAE,OAAO;YAAE;QAEhE,MAAM,GAAG,GAAG,IAAI,CAAC,kCAAkC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CACtE,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CACrC;QACD,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,UAAU,GAAG,SAAS;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,wBAAwB,GAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,kCAAkC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;AAC5E,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC;IAC3D;;;;;;;;;;IAYA,gCAAgC,GAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,kCAAkC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;AAC5E,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAClD,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC;AACxD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,mBAAmB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AACpC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO;YAAE;;AAG3B,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE;AAC/B,YAAA,GAAG,CAAC,OAAO,CAAC,cAAc,GAAG,EAAE;QACjC;;QAGA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;AACjF,QAAA,IAAI,MAAM;YAAE;;AAGZ,QAAA,GAAG,CAAC,YAAY,GAAG,IAAI;AACvB,QAAA,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;;AAG3C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IAC3B;AAEA,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,CAAC;AACtE,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI;AACjE,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;AACvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,mBAAmB,CAAC,GAAQ,EAAE,GAAQ,EAAA;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;AACrF,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C;;QAGA,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;AAC7E,QAAA,IAAI,SAAS;AAAE,YAAA,SAAS,CAAC,YAAY,GAAG,KAAK;;AAG7C,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI;AAC/D,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;;QAGzD,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC3B;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiGA,IAAA,YAAY,CAAC,GAAQ,EAAA;AACnB,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;;AAEf,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE;gBAChC,GAAG,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/E;AAEA,YAAA,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,eAAe;AAC1C,YAAA,IAAI,GAAG,CAAC,eAAe,EAAE;;AAEvB,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;AAAE,oBAAA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE;AAClD,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE;AAC7B,oBAAA,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;gBAClD;gBACA,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;AACvC,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;AAAE,wBAAA,GAAG,CAAC,UAAU,GAAG,IAAI;AACzD,gBAAA,CAAC,CAAC;;AAEF,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;AACzB,oBAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG;AACrB,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,YAAY,EAAE;qBACf;gBACH;YACF;QACF;aAAO;AACL,YAAA,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ;QAC9B;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;IAGA,oBAAoB,CAAC,GAAQ,EAAE,GAAW,EAAA;AACxC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;AACzB,YAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;QAC/D;AACA,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ;AAC/B,QAAA,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,KAAK,GAAG,GAAG,IAAI,GAAG,GAAG;AAClD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,8BAA8B,CAAC,GAAQ,EAAA;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,oBAAoB,CAAC,GAAQ,EAAA;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;AACzC,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAS,KAAI;YAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;gBAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;AACjC,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;AACzB,gBAAA,IAAI,CAAC,IAAI;AAAE,oBAAA,OAAO,IAAI;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;AACjD,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS;;gBAG/C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AACnE,gBAAA,MAAM,UAAU,GAAG,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;gBAEtE,IAAI,UAAU,EAAE;;AAEd,oBAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC;AAChC,oBAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;AAClC,oBAAA,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;AAAE,wBAAA,OAAO,KAAK;oBAExE,QAAQ,SAAS;AACf,wBAAA,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,KAAK,WAAW,CAAC,OAAO,EAAE;AAC9D,wBAAA,KAAK,WAAW,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,KAAK,WAAW,CAAC,OAAO,EAAE;AAClE,wBAAA,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE;AAC5D,wBAAA,KAAK,QAAQ,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE;AAC7D,wBAAA,SAAS,OAAO,KAAK;;gBAEzB;qBAAO;;oBAEL,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;oBAClD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;oBAC7C,QAAQ,SAAS;AACf,wBAAA,KAAK,OAAO,EAAE,OAAO,KAAK,KAAK,UAAU;AACzC,wBAAA,KAAK,WAAW,EAAE,OAAO,KAAK,KAAK,UAAU;wBAC7C,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;wBACjD,KAAK,KAAK,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC7C,wBAAA,KAAK,OAAO,EAAE,OAAO,KAAK,GAAG,UAAU;AACvC,wBAAA,KAAK,QAAQ,EAAE,OAAO,KAAK,GAAG,UAAU;wBACxC,SAAS,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;;gBAE9C;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;IAGA,oBAAoB,GAAA;;QAElB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AAC3C,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;;IAGA,oBAAoB,GAAA;;AAElB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;;AAE3C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,KAAK,CAAC;AAC9D,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAKA,IAAA,oBAAoB,CAAC,KAAiB,EAAE,GAAQ,EAAE,GAAQ,EAAA;QACxD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG;;QAGrC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,qBAAA,EAAwB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,aAAA,EAAgB,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC,CACjF;QAClB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAC1B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,qBAAA,EAAwB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,aAAA,EAAgB,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC,CACjF;QAElB,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC;;AAG/C,QAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAE9D,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;AACzC,YAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,MAAM;YACpC,IAAI,QAAQ,GAAG,EAAE;AAAE,gBAAA,QAAQ,GAAG,EAAE,CAAC;;AAGjC,YAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAG;gBACpB,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;gBAChC,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;AACrC,YAAA,CAAC,CAAC;;AAGF,YAAA,GAAG,CAAC,KAAK,GAAG,QAAQ;AACtB,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAChD,YAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACnE,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;;AAGA,IAAA,uBAAuB,CAAC,GAAQ,EAAA;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG,GAAG;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,SAAS,CAAC;IAClD;AAEQ,IAAA,qBAAqB,CAAC,GAAQ,EAAA;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE;YACxB,OAAO,IAAI,CAAC,SAAS;QACvB;;;QAIA,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;QAC/B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,cAAA,EAAiB,KAAK,CAAA,qBAAA,CAAuB,CAAgB;QAE7G,IAAI,gBAAgB,EAAE;;AAEpB,YAAA,MAAM,cAAc,GAAG,gBAAgB,CAAC,YAAY;AACpD,YAAA,IAAI,cAAc,GAAG,CAAC,EAAE;;AAEtB,gBAAA,OAAO,IAAI,CAAC,SAAS,GAAG,cAAc,GAAG,EAAE;YAC7C;QACF;;AAGA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,IAAI,EAAE;QAC1D,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACrD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,IAAI,EAAE;AACvD,QAAA,MAAM,YAAY,GAAG,cAAc,GAAG,eAAe;AACrD,QAAA,MAAM,eAAe,GAAG,GAAG,CAAC;QAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC;;QAGlE,MAAM,OAAO,GAAG,EAAE;QAElB,OAAO,IAAI,CAAC,SAAS,GAAG,YAAY,GAAG,kBAAkB,GAAG,OAAO;IACrE;;;;;;;;IAYA,kBAAkB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACvC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,2CAAA,EAA8C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC3H,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,6CAAA,EAAgD,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC1H,QAAA,IAAI,QAAQ;AAAE,YAAA,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnD,QAAA,IAAI,KAAK;AAAE,YAAA,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;IAC/C;IAEA,mBAAmB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACxC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,2CAAA,EAA8C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC3H,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,4CAAA,EAA+C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AACxH,QAAA,IAAI,QAAQ;AAAE,YAAA,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnD,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;IAC7C;;;;;;;;;;;;;;;;;;;;;;;;IAiCA,oBAAoB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACzC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;;AAGlC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,4CAAA,EAA+C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AACxH,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,6CAAA,EAAgD,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC1H,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AACpC,QAAA,IAAI,KAAK;AAAE,YAAA,KAAK,CAAC,SAAS,GAAG,SAAS;;AAGtC,QAAA,MAAM,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,oDAAA,EAAuD,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;QACjJ,IAAI,qBAAqB,EAAE;AACzB,YAAA,qBAAqB,CAAC,SAAS,GAAG,SAAS;QAC7C;IACF;;IAGA,oBAAoB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACzC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAElC,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,2CAAA,EAA8C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;QAC3H,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,SAAS,GAAG,SAAS;QAChC;IACF;AAKA,IAAA,UAAU,CAAC,KAAY,EAAA;QACnB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AAElD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,aAA4B;AACzE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa;AAEnD,QAAA,IAAI,MAAM,KAAK,QAAQ,EAAE;AACvB,YAAA,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;QACzC;AAAO,aAAA,IAAI,MAAM,KAAK,MAAM,EAAE;AAC5B,YAAA,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACzC;IACF;AAOF,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAElC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACxD;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACzD;IACF;;;;;;;;;AAWQ,IAAA,cAAc,CAAC,GAAQ,EAAA;AAC7B,QAAA,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;IAC1B;IAGA,oBAAoB,CAClB,SAAc,EACd,QAAgB,EAChB,cAAsB,EACtB,KAAa,EACb,KAAiB,EACjB,OAAoC,EAAA;QAEpC,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAE7B,QAAA,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC;QAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,IAAI,cAAc,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;QACpD,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC1F,QAAA,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE;AAC1B,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAE3B,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC;AACtD,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;AAChD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC;AACtD,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC/C;IAGA,qBAAqB,CACnB,SAAc,EACd,QAAgB,EAChB,cAAsB,EACtB,KAAa,EACb,KAAiB,EACjB,OAAoC,EAAA;QAEpC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE;QAEhD,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC;AAEvD,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;QACjC,MAAM,QAAQ,GAAmB,EAAE;;AAGnC,QAAA,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO;AAC5C,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,GAAG;oBAAE;;gBAGV,IAAI,SAAS,GAAG,KAAK;AACrB,gBAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM;gBACnC;AAAO,qBAAA,IAAI,OAAO,KAAK,OAAO,EAAE;AAC9B,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO;gBACpC;qBAAO;AACL,oBAAA,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM;gBACzB;gBAEA,IAAI,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;oBACzC,MAAM,CAAC,GAAG,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAClC,oBAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;oBACd,QAAQ,CAAC,IAAI,CAAC;AACZ,wBAAA,QAAQ,EAAE,CAAC;wBACX,QAAQ,EAAE,CAAC;AACX,wBAAA,WAAW,EAAE,CAAC;wBACd,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,wBAAA,GAAG,EAAE;AACN,qBAAA,CAAC;gBACJ;YACF;QACF;AAEA,QAAA,KAAK,CAAC,YAAY,GAAG,OAAO;AAC5B,QAAA,KAAK,CAAC,aAAa,GAAG,QAAQ;IAChC;IAEQ,iBAAiB,CAAC,GAAQ,EAAE,OAAoC,EAAA;AACtE,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,YAAA,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;QACxE;AAAO,aAAA,IAAI,OAAO,KAAK,OAAO,EAAE;AAC9B,YAAA,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;QACzE;aAAO;AACL,YAAA,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAC9D;IACF;IAEA,oBAAoB,CAAC,SAAc,EAAE,QAAgB,EAAE,cAAsB,EAAE,KAAa,EAAE,OAAoC,EAAA;QAChI,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;AACrD,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;;QAGtB,IAAI,SAAS,GAAG,KAAK;AACrB,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,YAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM;QACnC;AAAO,aAAA,IAAI,OAAO,KAAK,OAAO,EAAE;AAC9B,YAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO;QACpC;aAAO;AACL,YAAA,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM;QACzB;AAEA,QAAA,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;QAExD,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,IAAI,cAAc,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;QACpD,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IACpC;IAGA,qBAAqB,CAAC,SAAc,EAAE,OAAoC,EAAA;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAEzD,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB;AACxC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE;YACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChC;YACA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;;AAGpF,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO;YAC5C,IAAI,UAAU,GAAG,CAAC;AAClB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;AACtC,gBAAA,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,GAAG;oBAAE;gBACV,IAAI,SAAS,GAAG,KAAK;gBACrB,IAAI,OAAO,KAAK,MAAM;AAAE,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM;qBACpD,IAAI,OAAO,KAAK,OAAO;AAAE,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO;;AAC3D,oBAAA,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM;gBAE5B,IAAI,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;AACzC,oBAAA,UAAU,EAAE;gBACd;YACF;AACA,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,EAAE;QACvD;QAEA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAChC,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC1B,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B;IAGQ,kBAAkB,GAAA;QACxB,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,uCAAuC,CAAC;IAC1E;AAEQ,IAAA,qBAAqB,CAAC,KAAoB,EAAE,SAAc,EAAE,OAAoC,EAAA;AACtG,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YACvE,KAAK,CAAC,cAAc,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC3D,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC;QACxC;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC3D,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC;AACtC,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC3C;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC7C;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC;QACrC;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC;QACrC;IACF;IAKA,gBAAgB,CAAC,SAAc,EAAE,OAAoC,EAAA;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC9D,QAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,QAAA,KAAK,CAAC,SAAS,GAAG,EAAE;AAEpB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE;AACtC,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACrD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC;QAClE;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,MAAM,kBAAkB,CAAC,SAAc,EAAE,OAAoC,EAAA;QAC3E,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;AACjD,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE;QAEhD,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAErD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC;YACnC,IAAI,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;gBAAE;YAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,gBAAA,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC1D,gBAAA,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;oBAAE;AAC5B,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;AACzB,gBAAA,IAAI,GAAG,EAAE,UAAU,KAAK,KAAK,EAAE;oBAC7B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;gBACvE;YACF;QACF;;QAGA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;YAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,gBAAA,GAAG,CAAC,MAAM,GAAG,EAAE;YAC/C,IAAI,GAAG,CAAC,YAAY,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE;AAC5D,gBAAA,GAAG,CAAC,YAAY,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAClD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAGA,UAAU,CAAC,SAAc,EAAE,OAAoC,EAAA;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE;AAE5C,QAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,QAAA,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAG,CAAC;AAC/D,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,UAAU,CAAC,SAAc,EAAE,OAAoC,EAAA;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE;AAE5C,QAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,QAAA,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAG,CAAC;AAC/D,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAcQ,uBAAuB,CAAC,GAAQ,EAAE,OAAoC,EAAA;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QACtC,IAAI,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,GAAG,IAAI,GAAG,EAAE;YAClB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;QAC9C;QACA,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,KAAK,GAAG;AACN,gBAAA,aAAa,EAAE,EAAE;gBACjB,YAAY,EAAE,IAAI,GAAG,EAAE;AACvB,gBAAA,SAAS,EAAE,EAAE;AACb,gBAAA,SAAS,EAAE;aACZ;AACD,YAAA,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;QAC5B;AACA,QAAA,OAAO,KAAK;IACd;IAGQ,8BAA8B,GAAA;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,wCAAwC,CAAC;QAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,uCAAuC,CAAC;QAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,yCAAyC,CAAC;AAE/E,QAAA,MAAM,MAAM,GAAG,CAAC,EAAkB,KAAI;AACpC,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI;AACpB,YAAA,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC;YACpF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC;AACrE,QAAA,CAAC;AAED,QAAA,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE;AACvD,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE;AAC7D,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;AAC1D,QAAA,OAAO,IAAI;IACb;IAEQ,wBAAwB,CAAC,UAAe,EAAE,cAA2C,EAAA;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnD,QAAA,IAAI,CAAC,MAAM;YAAE;;QAGb,MAAM,QAAQ,GAAoC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC7E,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,IAAI,OAAO,KAAK,cAAc,EAAE;gBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;gBACjC,IAAI,KAAK,EAAE;AACT,oBAAA,KAAK,CAAC,aAAa,GAAG,EAAE;AACxB,oBAAA,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE;gBAC5B;YACF;QACF;IACF;;AAGA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC;IACtD;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;AAClH,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY;QAE9C,IAAI,mBAAmB,CAAC,IAAI,KAAK,oBAAoB,CAAC,IAAI,EAAE;AAC1D,YAAA,IAAI,CAAC,YAAY,GAAG,mBAAmB;AACvC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,KAAK,MAAM,EAAE,IAAI,mBAAmB,EAAE;YACpC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACjC,gBAAA,IAAI,CAAC,YAAY,GAAG,mBAAmB;AACvC,gBAAA,OAAO,IAAI;YACb;QACF;AAEA,QAAA,OAAO,KAAK;IACd;;;;;;IAQA,WAAW,CAAC,KAAa,EAAE,GAA+B,EAAA;;AAExD,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAChC,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;;AAExC,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;YAC5C;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;;AAGhC,QAAA,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;AAC5C,YAAA,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;AACpB,YAAA,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;;AAG3C,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,WAAW,EAAE;AACd;SACF;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,SAAS,CAAC;AAC1D,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAEjC,GAAG,CAAC,IAAI,EAAE;IACZ;AAEC,IAAA,OAAO,CAAC,GAA+B,EAAA;AACrC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;AAC1C,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,SAAS,EAAE,gBAAgB;YAC3B,IAAI,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO;SAC1D;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,GAAG,CAAC,IAAI,EAAE;IACZ;AAEA,IAAA,OAAO,CAAC,GAA+B,EAAA;;AAErC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAChC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;;AAEhE,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;YAC5C;QACF;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;;QAEhC,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YACxD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;;AAGnE,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,YAAY;AACxB,gBAAA,WAAW,EAAE;AACd;SACF;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,SAAS,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAEjC,GAAG,CAAC,IAAI,EAAE;IACZ;;IAuBU,eAAe,GAAA;AACtB,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACjC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAEtC,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACtC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAE3C,QAAA,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACvC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;AAE7C,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACzE,QAAA,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;;AAE3E,QAAA,IAAI,YAAY,GAAG,KAAK,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACvC;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACvE,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAE7E,QAAA,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACxC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAE/C,QAAA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACzD,QAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;;AAEzD,QAAA,IAAI,WAAW,GAAG,KAAK,EAAE;YACvB,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC;QAEA,OAAO;AACL,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;AAC7B,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC;AAClC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC;AACnC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;AACrC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;AACrC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC;AACpC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;AACnC,gBAAA,KAAK,EAAE;AACR,aAAA;;;;;SAKF;IACH;;AAMA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,EAAE;AAC/B,YAAA,SAAS,EAAE;SACZ;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC;;IAGA,cAAc,GAAA;AACZ,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC;;AAE1C,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAE/B,QAAA,MAAM,KAAK,GAAG;YACZ,GAAG,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE;AAC9D,YAAA,SAAS,EAAE;SACZ;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC;;AAGA,IAAA,YAAY,CAAC,MAAkC,EAAA;AAC7C,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE;IACjD;;AAGA,IAAA,YAAY,CAAC,SAA2B,EAAA;QACtC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;AAE1D,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAEhC,QAAA,IAAI,QAAc;AAClB,QAAA,IAAI,MAAY;AAEhB,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;YAC7C,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3C;aAAO;;YAEL,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;YAC7C,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;AACzC,YAAA,IAAI,MAAM,GAAG,KAAK,EAAE;AAClB,gBAAA,OAAO;YACT;QACF;QAEA,IAAI,CAAC,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;AACtC,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAE/B,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,WAAW,EAAE,IAAI,CAAC;AACnB;SACF;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;IACnC;IAGF,eAAe,CAAC,KAAuC,EAAE,MAAkC,EAAA;QAE3F,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAE5D;QACA;;AAGA,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAChC,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;;AAExC,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;YAC5C;QACF;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;AAChC,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AAC7D,QAAA,MAAM,SAAS,GAAG;AACjB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B;AACD;SACD;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,CAAC,IAAI,EAAE;IACb;AAGA,IAAA,YAAY,CAAC,KAAY,EAAA;;AAEvB,QAAA,MAAM,SAAS,GAAI,KAAK,CAAC,MAAsB,CAAC,SAAS;AACzD,QAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IACpC;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;QAGxB,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;AACA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;;AAGA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;QAC1C;AACA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;QAC1C;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;QACtC;AACA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAC/C;;AAGA,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;QAGtB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAI;;YAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YACtC,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;YACjD;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;;AAG3B,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;;AAG5B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;AACtC,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QAClC;;AAGA,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;AAG1B,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;AACjC,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;AAClC,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;AACjC,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;;AAG3B,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;AAG1B,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,EAAE;AAC7B,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;;AAG5B,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;;AAGzB,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC;QAC7C;AACA,QAAA,IAAI,IAAI,CAAC,6BAA6B,EAAE;AACtC,YAAA,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC;QAClD;AACA,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE;AACrC,YAAA,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC;QACjD;AACA,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACxC;;AAGA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE;YAChC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAK,EAAE,CAAC,CAAC;YAC7C,QAAQ,CAAC,UAAU,EAAE;QACvB;IACF;IAsBA,YAAY,GAAA,EAAK,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,oBAAoB,GAAA,EAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,cAAc,GAAA,EAAK,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,iBAAiB,GAAA,EAAK,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,YAAY,GAAA,EAAK,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,GAAA,EAAK,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,kBAAkB,GAAA,EAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IASvD,aAAa,GAAA,EAAK,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;AAE7C,IAAA,mBAAmB,CAAC,IAAY,EAAA;QAC9B,QAAQ,IAAI;AACV,YAAA,KAAK,OAAO;gBACV,IAAI,CAAC,YAAY,EAAE;gBACnB;AACF,YAAA,KAAK,gBAAgB;gBACnB,IAAI,CAAC,oBAAoB,EAAE;gBAC3B;AACF,YAAA,KAAK,UAAU;gBACb,IAAI,CAAC,cAAc,EAAE;gBACrB;AACF,YAAA,KAAK,aAAa;gBAChB,IAAI,CAAC,iBAAiB,EAAE;gBACxB;AACF,YAAA,KAAK,OAAO;gBACV,IAAI,CAAC,YAAY,EAAE;gBACnB;AACF,YAAA,KAAK,QAAQ;gBACX,IAAI,CAAC,aAAa,EAAE;gBACpB;AACF,YAAA,KAAK,wBAAwB;gBAC3B,IAAI,CAAC,kBAAkB,EAAE;gBACzB;;IAEN;AAEA,IAAA,IAAI,wBAAwB,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AACtD,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY;;AAGtC,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE;AAClB,YAAA,OAAO,KAAK;QACd;;QAGA,QACE,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE;AACzC,YAAA,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE;YACnC,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,OAAO,EAAE;IAErC;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC;IAChE;AAEA,IAAA,OAAO,CAAC,KAAU,EAAA;AAChB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7B;;IAGA,gBAAgB,GAAA;QACd,MAAM,KAAK,GAAG,EAAE;AAChB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC3B,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,GAAA,CAAK,CAAC;QACnD;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,eAAe,CAAC,UAAkB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,CAAC;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,OAAO,CAAC,CAAC,KAAK,GAAG,EAAE,GAAG,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC;IAC/C;AAEA,IAAA,oBAAoB,CAAC,GAAQ,EAAA;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,cAAc;AAAE,YAAA,OAAO,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACjE,QAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,GAAG;IAChC;AAEA,IAAA,qBAAqB,CAAC,SAAc,EAAA;QAClC,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,cAAc;AAAE,YAAA,OAAO,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;QAC9C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACjE,QAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,GAAG;IAChC;;IAGA,mBAAmB,GAAA;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,OAAO,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC5E;IAEA,gBAAgB,GAAA;AACd,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC/D,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,EAAE;QAEhB,IAAI,WAAW,GAAG,EAAE;AACpB,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC;AACpC,QAAA,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAE3D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAEpC,WAAW,CAAC,IAAI,CAAC;AACf,gBAAA,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE;AACnB,gBAAA,OAAO,EAAE,GAAG;gBACZ,cAAc,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE;gBACjD,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,YAAY;AACxD,aAAA,CAAC;AAEF,YAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,gBAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;gBACvB,WAAW,GAAG,EAAE;YAClB;QACF;AAEA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,iBAAiB,CAAC,IAAU,EAAA;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAG;YAC/B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,OAAO,OAAO,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE;AACvD,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,KAAU,EAAA;;AAEtB,QAAA,QAAQ,KAAK,CAAC,gBAAgB,EAAE,WAAW,EAAE;AAC3C,YAAA,KAAK,SAAS,EAAE,OAAO,SAAS;AAChC,YAAA,KAAK,QAAQ,EAAE,OAAO,SAAS;AAC/B,YAAA,KAAK,MAAM,EAAE,OAAO,SAAS;AAC7B,YAAA,SAAS,OAAO,SAAS;;IAE7B;AAEA,IAAA,eAAe,CAAC,KAAU,EAAA;AACxB,QAAA,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,CAAA,EAAA,EAAK,KAAK,CAAC,aAAa,CAAA,GAAA,EAAM,KAAK,CAAC,cAAc,EAAE;IACxG;AAEA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,KAAK,CAAC,aAAa,EAAE;YACvB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;QACnG;AACA,QAAA,OAAO,OAAO;IAChB;;AAGA,IAAA,mBAAmB,CAAC,GAAQ,EAAA;QAC1B,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,cAAc;AAAE,YAAA,OAAO,OAAO;QAE7D,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QACxC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;AAC9C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;;AAGjD,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,GAAW,EAAE,CAAM,KAAK,GAAG,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACtG,QAAA,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS;QAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;AACxC,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,EAAE;AAE9B,QAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,GAAG;IAChC;AAEA,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,SAAS;AAC3B,QAAA,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACvG,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AACzC,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;AAEA,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE;IAC1D;AAEA,IAAA,mBAAmB,CAAC,MAAc,EAAA;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE;QAC/D,QAAQ,WAAW;AACjB,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,YAAY;AACrB,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,iBAAiB;AAC1B,YAAA;AACE,gBAAA,OAAO,iBAAiB;;IAE9B;AAEA,IAAA,6BAA6B,CAAC,MAAc,EAAA;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE;QAC/D,QAAQ,WAAW;AACjB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,iBAAiB;AAC1B,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,iBAAiB;AAC1B,YAAA,KAAK,gBAAgB;AACnB,gBAAA,OAAO,YAAY;AACrB,YAAA,KAAK,gBAAgB;AACnB,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,gBAAgB;AACnB,gBAAA,OAAO,YAAY;AACrB,YAAA;AACE,gBAAA,OAAO,iBAAiB;;IAE9B;;IAGA,gBAAgB,GAAA;QACd,MAAM,MAAM,GAAG,EAAE;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC5B,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAC/D,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE;AACA,QAAA,OAAO,MAAM;IACf;IAEA,eAAe,GAAA;QACb,MAAM,KAAK,GAAG,EAAE;AAChB,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AAErE,QAAA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,EAAE;AACnB,YAAA,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE;AAChC,gBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;AAChC,gBAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAEpD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC;AACZ,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA,EAAA,EAAK,QAAQ,CAAA,MAAA;AAC7C,iBAAA,CAAC;YACJ;AACA,YAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QACtB;AAEA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,kBAAkB,CAAC,IAAU,EAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAG;YACxC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,OAAO,OAAO,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE;AACvD,QAAA,CAAC,CAAC;QAEF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YACrC,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,cAAc,EAAE;gBAC/C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;gBAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;gBAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;gBAClE,OAAO,KAAK,GAAG,KAAK;YACtB;AACA,YAAA,OAAO,KAAK;QACd,CAAC,EAAE,CAAC,CAAC;IACP;AAEA,IAAA,eAAe,CAAC,QAAgB,EAAA;QAC9B,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;QACpC,IAAI,QAAQ,GAAG,CAAC;AAAE,YAAA,OAAO,SAAS;QAClC,IAAI,QAAQ,GAAG,CAAC;AAAE,YAAA,OAAO,SAAS;QAClC,IAAI,QAAQ,GAAG,CAAC;AAAE,YAAA,OAAO,SAAS;AAClC,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,iBAAiB,CAAC,GAAQ,EAAA;AACxB,QAAA,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAA,EAAA,EAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;IACvE;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG;AAAE,YAAA,OAAO,EAAE;;QAGtC,IAAI,KAAK,EAAE,KAAK;YAAE,OAAO,KAAK,CAAC,KAAK;;QAGpC,IAAI,KAAK,EAAE,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI;;AAGlC,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACpD,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C;;AAGA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA;AACA,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;QAEtB,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;;AAGjC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;;AAGtB,QAAA,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC/B,YAAA,KAAK,GAAG,CAAA,WAAA,EAAc,KAAK,CAAA,IAAA,CAAM,CAAC;QACpC;QAEE,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG;IAC1F;;;;;;IAWF,qBAAqB,CAAC,KAAiB,EAAE,GAAQ,EAAA;QAC/C,IAAI,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG,EAAE,WAAW;YAC7C,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE,EAAE;AACjF,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;AACnC,YAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;AACtC,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK;QACpC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;AACjC,gBAAA,IAAI,CAAC,0BAA0B,GAAG,KAAK;AACvC,gBAAA,IAAI,CAAC,qBAAqB,GAAG,EAAE;AAC/B,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB;QACF,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,4BAA4B,GAAA;AAC1B,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;IACrC;AAEA,IAAA,+BAA+B,CAAC,GAAQ,EAAE,SAAc,EAAE,cAAoB,EAAA;AAC5E,QAAA,IAAI,GAAG,EAAE,KAAK,KAAK,QAAQ,EAAE;AAC3B,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG;AACrC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,EAAE,GAAG,CAAC;AAClD,YAAA,GAAG,CAAC,KAAK,GAAG,QAAQ;AAEpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;YAGxB,UAAU,CAAC,MAAK;gBACd,IAAI,cAAc,IAAI,OAAO,cAAc,CAAC,OAAO,KAAK,UAAU,EAAE;oBAClE,cAAc,CAAC,OAAO,EAAE;gBAC1B;AACF,YAAA,CAAC,EAAE,EAAE,CAAC,CAAC;QACT;IACF;+GAt2Qa,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,gCAAA,EAAA,kCAAA,EAAA,SAAA,EAAA,WAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,aAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,8BAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxI/B,m1kQAurMA,EAAA,MAAA,EAAA,CAAA,83oFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7kMY,YAAY,q9BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,UAAU,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,8+CAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,+BAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAY,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,UAAA,EAElL;YACV,OAAO,CAAC,iBAAiB,EAAE;AACzB,gBAAA,KAAK,CACH,WAAW,EACX,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAC7C;AACD,gBAAA,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9D,gBAAA,UAAU,CAAC,wBAAwB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;aAC/D,CAAC;YACF,OAAO,CAAC,aAAa,EAAE;gBACrB,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACxD,oBAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;iBAC7D,CAAC;gBACF,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACtD,oBAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;iBAC9D;aACF,CAAC;YACF,OAAO,CAAC,SAAS,EAAE;AACjB,gBAAA,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACnE,gBAAA,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,gBAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAClD,gBAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;aAClD;AACF,SAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAnC9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,UAAA,EAGV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAAA,eAAA,EAC9K,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC;wBACV,OAAO,CAAC,iBAAiB,EAAE;AACzB,4BAAA,KAAK,CACH,WAAW,EACX,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAC7C;AACD,4BAAA,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9D,4BAAA,UAAU,CAAC,wBAAwB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;yBAC/D,CAAC;wBACF,OAAO,CAAC,aAAa,EAAE;4BACrB,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACxD,gCAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;6BAC7D,CAAC;4BACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACtD,gCAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;6BAC9D;yBACF,CAAC;wBACF,OAAO,CAAC,SAAS,EAAE;AACjB,4BAAA,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACnE,4BAAA,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,4BAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAClD,4BAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;yBAClD;AACF,qBAAA,EAAA,QAAA,EAAA,m1kQAAA,EAAA,MAAA,EAAA,CAAA,83oFAAA,CAAA,EAAA;qIAWO,iBAAiB,EAAA,CAAA;sBAA1B;gBACS,WAAW,EAAA,CAAA;sBAApB;gBA8CU,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAGQ,uBAAuB,EAAA,CAAA;sBAA/B;gBAGQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAGQ,qBAAqB,EAAA,CAAA;sBAA7B;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAGQ,0BAA0B,EAAA,CAAA;sBAAlC;gBAGQ,uBAAuB,EAAA,CAAA;sBAA/B;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAGQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,cAAc,EAAA,CAAA;sBAAtB;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAGQ,wBAAwB,EAAA,CAAA;sBAAhC;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,+BAA+B,EAAA,CAAA;sBAAvC;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAIQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAGQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAIQ,aAAa,EAAA,CAAA;sBAArB;gBAIQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAGQ,wBAAwB,EAAA,CAAA;sBAAhC;gBAGQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAIQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;gBAIQ,OAAO,EAAA,CAAA;sBAAf;gBAIQ,MAAM,EAAA,CAAA;sBAAd;gBAIQ,WAAW,EAAA,CAAA;sBAAnB;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAIQ,WAAW,EAAA,CAAA;sBAAnB;gBAIQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,cAAc,EAAA,CAAA;sBAAtB;gBAIQ,aAAa,EAAA,CAAA;sBAArB;gBAGY,iBAAiB,EAAA,CAAA;sBAA7B;gBAUQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAEQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAEQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAGQ,0BAA0B,EAAA,CAAA;sBAAlC;gBAGQ,oBAAoB,EAAA,CAAA;sBAA5B;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAEQ,oBAAoB,EAAA,CAAA;sBAA5B;gBAGQ,qBAAqB,EAAA,CAAA;sBAA7B;gBACQ,yBAAyB,EAAA,CAAA;sBAAjC;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,2BAA2B,EAAA,CAAA;sBAAnC;gBAGQ,gCAAgC,EAAA,CAAA;sBAAxC;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAeQ,aAAa,EAAA,CAAA;sBAArB;gBAoBQ,wBAAwB,EAAA,CAAA;sBAAhC;gBACQ,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAmBgB,YAAY,EAAA,CAAA;sBAA5B;gBAGgB,aAAa,EAAA,CAAA;sBAA7B;gBAGgB,aAAa,EAAA,CAAA;sBAA7B;gBAES,YAAY,EAAA,CAAA;sBAArB;gBAES,iBAAiB,EAAA,CAAA;sBAA1B;gBAES,mBAAmB,EAAA,CAAA;sBAA5B;gBAES,yBAAyB,EAAA,CAAA;sBAAlC;gBAqgByC,QAAQ,EAAA,CAAA;sBAAjD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBA4UxC,iBAAiB,EAAA,CAAA;sBADhB,SAAS;uBAAC,mBAAmB;gBAK9B,cAAc,EAAA,CAAA;sBADb,SAAS;uBAAC,gBAAgB;gBAG3B,gBAAgB,EAAA,CAAA;sBADf,SAAS;uBAAC,kBAAkB;gBAG7B,eAAe,EAAA,CAAA;sBADd,SAAS;uBAAC,iBAAiB;gBAK5B,gBAAgB,EAAA,CAAA;sBADf,SAAS;uBAAC,kBAAkB;gBAG7B,kBAAkB,EAAA,CAAA;sBADjB,SAAS;uBAAC,oBAAoB;gBAG/B,iBAAiB,EAAA,CAAA;sBADhB,SAAS;uBAAC,mBAAmB;gBAI9B,iBAAiB,EAAA,CAAA;sBADhB,SAAS;uBAAC,mBAAmB;gBA8U9B,mBAAmB,EAAA,CAAA;sBADlB,SAAS;uBAAC,qBAAqB;gBA0wBhC,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBAo3B1C,QAAQ,EAAA,CAAA;sBADP,YAAY;uBAAC,yBAAyB,EAAE,CAAC,QAAQ,CAAC;gBAqBnD,QAAQ,EAAA,CAAA;sBADP,YAAY;uBAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;gBAiDd,YAAY,EAAA,CAAA;sBAAtC,SAAS;uBAAC,cAAc;gBA0Gf,QAAQ,EAAA,CAAA;sBAAjB;gBAiFwB,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;gBACE,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;gBAEvB,oBAAoB,EAAA,CAAA;sBADnB,SAAS;uBAAC,sBAAsB;gBAGjC,oBAAoB,EAAA,CAAA;sBADnB,SAAS;uBAAC,sBAAsB;gBA6wBI,sBAAsB,EAAA,CAAA;sBAA1D,SAAS;uBAAC,wBAAwB;gBACE,sBAAsB,EAAA,CAAA;sBAA1D,SAAS;uBAAC,wBAAwB;gBA0hDnC,SAAS,EAAA,CAAA;sBADR,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;gBA+CtC,OAAO,EAAA,CAAA;sBADZ,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBAkPnC,mBAAmB,EAAA,CAAA;sBAA3B;gBAEQ,eAAe,EAAA,CAAA;sBAAvB;gBAqsCgD,eAAe,EAAA,CAAA;sBAA/D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBACA,aAAa,EAAA,CAAA;sBAA3D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBAkBjB,aAAa,EAAA,CAAA;sBAAxC,SAAS;uBAAC,eAAe;gBACG,cAAc,EAAA,CAAA;sBAA1C,SAAS;uBAAC,gBAAgB;gBA4vBlB,OAAO,EAAA,CAAA;sBAAf;gBAOS,YAAY,EAAA,CAAA;sBAArB;gBACS,oBAAoB,EAAA,CAAA;sBAA7B;gBAYQ,4BAA4B,EAAA,CAAA;sBAApC;gBASS,cAAc,EAAA,CAAA;sBAAvB;gBACS,iBAAiB,EAAA,CAAA;sBAA1B;gBACS,YAAY,EAAA,CAAA;sBAArB;gBACS,aAAa,EAAA,CAAA;sBAAtB;gBACS,kBAAkB,EAAA,CAAA;sBAA3B;gBACS,aAAa,EAAA,CAAA;sBAAtB;;;AE9kQD;;AAEG;;ACFH;;AAEG;;;;"}