angular-hijri-gregorian-date-time-picker 1.5.0 → 1.5.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-hijri-gregorian-date-time-picker.mjs","sources":["../../../projects/hijri-gregorian-datepicker/src/_services/date-utilities.service.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.html","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.module.ts","../../../projects/hijri-gregorian-datepicker/src/public-api.ts","../../../projects/hijri-gregorian-datepicker/src/angular-hijri-gregorian-date-time-picker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport * as datesDictionary from '../_data/dictionary.json';\r\nimport { Data, DayInfo, MonthDays } from '../_interfaces/calendar-model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DateUtilitiesService {\r\n public calendarData: Data;\r\n\r\n constructor() {\r\n this.calendarData = (datesDictionary as any)['default']; //prod\r\n // this.calendarData = datesDictionary; //debug\r\n }\r\n\r\n parseDate(dateStr: string): Date | null {\r\n if (!dateStr) {\r\n return null;\r\n }\r\n const parts = dateStr?.split('/');\r\n if (parts.length !== 3) {\r\n return null;\r\n }\r\n const [day, month, year] = parts.map(Number);\r\n if (\r\n isNaN(day) ||\r\n isNaN(month) ||\r\n isNaN(year) ||\r\n day < 1 ||\r\n day > 31 ||\r\n month < 1 ||\r\n month > 12 ||\r\n year < 1\r\n ) {\r\n return null;\r\n }\r\n return new Date(year, month - 1, day);\r\n }\r\n\r\n formatDate(date: Date): string {\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n\r\n getDayShortHand(date: Date): string {\r\n return date.toLocaleString('en-US', { weekday: 'short' });\r\n }\r\n\r\n generateDates(fD: DayInfo, lD: DayInfo, uC: number): MonthDays {\r\n const startDate = this.parseDate(fD?.gD);\r\n const endDate = this.parseDate(lD?.gD);\r\n const daysInMonth: MonthDays = [];\r\n let currentGregorianDate = new Date(startDate);\r\n let currentUmmAlQuraDay = parseInt(fD?.uD?.split('/')[0]);\r\n let currentUmmAlQuraMonth = parseInt(fD?.uD?.split('/')[1]);\r\n let currentUmmAlQuraYear = parseInt(fD?.uD?.split('/')[2]);\r\n let daysInCurrentUmmAlQuraMonth = uC;\r\n while (currentGregorianDate <= endDate) {\r\n const ummAlQuraDate = `${currentUmmAlQuraDay\r\n .toString()\r\n .padStart(2, '0')}/${currentUmmAlQuraMonth\r\n .toString()\r\n .padStart(2, '0')}/${currentUmmAlQuraYear}`;\r\n daysInMonth.push({\r\n gD: this.formatDate(currentGregorianDate),\r\n uD: ummAlQuraDate,\r\n dN: this.getDayShortHand(currentGregorianDate),\r\n uC: 0,\r\n });\r\n currentGregorianDate.setDate(currentGregorianDate.getDate() + 1);\r\n currentUmmAlQuraDay += 1;\r\n if (currentUmmAlQuraDay > daysInCurrentUmmAlQuraMonth) {\r\n currentUmmAlQuraDay = 1;\r\n currentUmmAlQuraMonth += 1;\r\n if (currentUmmAlQuraMonth > 12) {\r\n currentUmmAlQuraMonth = 1;\r\n currentUmmAlQuraYear += 1;\r\n }\r\n const nextMonthData =\r\n this.calendarData[currentUmmAlQuraYear.toString()]?.[\r\n currentUmmAlQuraMonth.toString()\r\n ];\r\n daysInCurrentUmmAlQuraMonth = nextMonthData ? nextMonthData.fD.uC : 30;\r\n }\r\n }\r\n return daysInMonth;\r\n }\r\n\r\n convertDate(dateStr: string, isGregorian: boolean): DayInfo | null {\r\n if (!dateStr) return null;\r\n\r\n if (isGregorian) {\r\n // Preprocess Gregorian date\r\n const gregorianDate = this.parseDate(dateStr);\r\n if (!gregorianDate) return null;\r\n const formattedDate = this.formatDate(gregorianDate);\r\n\r\n for (const yearKey in this.calendarData) {\r\n for (const monthKey in this.calendarData[yearKey]) {\r\n const monthData = this.calendarData[yearKey][monthKey];\r\n\r\n if (\r\n this.isDateInMonthRange(\r\n formattedDate,\r\n monthData.fD?.gD,\r\n monthData.lD?.gD\r\n )\r\n ) {\r\n const daysInMonth = this.generateDates(\r\n monthData.fD,\r\n monthData.lD,\r\n monthData.fD?.uC\r\n );\r\n\r\n const dayMatch = daysInMonth.find((d) => d.gD === formattedDate);\r\n if (dayMatch) return dayMatch;\r\n }\r\n }\r\n }\r\n } else {\r\n const [day, month, year] = dateStr.split('/').map(Number);\r\n\r\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null;\r\n\r\n for (const yearKey in this.calendarData) {\r\n for (const monthKey in this.calendarData[yearKey]) {\r\n const monthData = this.calendarData[yearKey][monthKey];\r\n\r\n if (\r\n this.isDateInMonthRange(\r\n `${day}/${month}/${year}`,\r\n monthData.fD?.uD,\r\n monthData.lD?.uD\r\n )\r\n ) {\r\n const daysInMonth = this.generateDates(\r\n monthData.fD,\r\n monthData.lD,\r\n monthData.fD?.uC\r\n );\r\n\r\n const dayMatch = daysInMonth.find((d) => {\r\n const [uDay, uMonth, uYear] = d?.uD?.split('/').map(Number);\r\n return uDay === day && uMonth === month && uYear === year;\r\n });\r\n\r\n if (dayMatch) return dayMatch;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isDateInMonthRange(\r\n dateToCheck: string,\r\n monthStartDate: string | undefined,\r\n monthEndDate: string | undefined\r\n ): boolean {\r\n if (!monthStartDate || !monthEndDate) return false;\r\n\r\n const checkDate = this.parseDate(dateToCheck);\r\n const startDate = this.parseDate(monthStartDate);\r\n const endDate = this.parseDate(monthEndDate);\r\n\r\n if (!checkDate || !startDate || !endDate) return false;\r\n\r\n return checkDate >= startDate && checkDate <= endDate;\r\n }\r\n\r\n getMonthData(inputDate: string, type: string): DayInfo[] | null {\r\n const [day, month, year] = inputDate?.split('/').map(Number);\r\n let isGregorian: boolean;\r\n if (type == 'greg') {\r\n isGregorian = true;\r\n } else {\r\n isGregorian = false;\r\n }\r\n if (isGregorian) {\r\n return this.getGregorianMonthData(day, month, year);\r\n } else {\r\n return this.getUmAlQurraMonthData(day, month, year);\r\n }\r\n }\r\n\r\n getGregorianMonthData(\r\n day: number,\r\n month: number,\r\n year: number\r\n ): DayInfo[] | null {\r\n const yearData = this.calendarData[year];\r\n if (!yearData) return null;\r\n const monthData = yearData[month];\r\n if (!monthData) return null;\r\n const monthArray: DayInfo[] = [];\r\n const endDate = new Date(year, month, 0);\r\n for (let d = 1; d <= endDate.getDate(); d++) {\r\n const offset = d - 1;\r\n\r\n monthArray.push({\r\n gD: `${d.toString().padStart(2, '0')}/${month\r\n .toString()\r\n .padStart(2, '0')}/${year}`,\r\n uD: this.calculateUmAlQurraDate(\r\n monthData.fD.uD,\r\n offset,\r\n monthData.fD.uC\r\n ),\r\n dN: this.getDayName(new Date(year, month - 1, d).getDay()),\r\n uC: monthData.fD.uC,\r\n });\r\n }\r\n\r\n return monthArray;\r\n }\r\n\r\n getUmAlQurraMonthData(\r\n day: number,\r\n month: number,\r\n year: number\r\n ): DayInfo[] | null {\r\n for (const gregorianYear in this.calendarData) {\r\n const yearData = this.calendarData[parseInt(gregorianYear)];\r\n\r\n for (const monthIndex in yearData) {\r\n const monthData = yearData[parseInt(monthIndex)];\r\n const [fDay, fMonth, fYear] = monthData?.fD?.uD?.split('/').map(Number);\r\n\r\n if (fYear === year && fMonth === month) {\r\n const totalDays = monthData.fD.uC;\r\n const monthArray: DayInfo[] = [];\r\n const umAlQurraStartDate = `01/${month\r\n .toString()\r\n .padStart(2, '0')}/${year}`;\r\n const dayDifference = fDay - 1;\r\n\r\n const startGregorianDate = this.calculateGregorianDate(\r\n monthData.fD.gD,\r\n -dayDifference\r\n );\r\n\r\n for (let i = 0; i < totalDays; i++) {\r\n const uDate = this.calculateUmAlQurraDate(\r\n umAlQurraStartDate,\r\n i,\r\n totalDays\r\n );\r\n const gDate = this.calculateGregorianDate(startGregorianDate, i);\r\n const [gDay, gMonth, gYear] = gDate?.split('/').map(Number);\r\n const dayName = this.getDayName(\r\n new Date(gYear, gMonth - 1, gDay).getDay()\r\n );\r\n\r\n monthArray.push({\r\n gD: gDate,\r\n uD: uDate,\r\n dN: dayName,\r\n uC: totalDays,\r\n });\r\n }\r\n\r\n return monthArray;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n calculateGregorianDate(startGDate: string, offset: number): string {\r\n const [day, month, year] = startGDate?.split('/').map(Number);\r\n const newDate = new Date(year, month - 1, day + offset);\r\n\r\n return `${newDate.getDate().toString().padStart(2, '0')}/${(\r\n newDate.getMonth() + 1\r\n )\r\n .toString()\r\n .padStart(2, '0')}/${newDate.getFullYear()}`;\r\n }\r\n\r\n calculateUmAlQurraDate(\r\n startUDate: string,\r\n offset: number,\r\n uC: number\r\n ): string {\r\n const [day, month, year] = startUDate?.split('/').map(Number);\r\n\r\n let newDay = day + offset;\r\n let newMonth = month;\r\n let newYear = year;\r\n\r\n while (newDay > uC) {\r\n newDay -= uC;\r\n newMonth += 1;\r\n }\r\n\r\n while (newMonth > 12) {\r\n newMonth = 1;\r\n newYear += 1;\r\n }\r\n\r\n return `${newDay.toString().padStart(2, '0')}/${newMonth\r\n .toString()\r\n .padStart(2, '0')}/${newYear}`;\r\n }\r\n\r\n getDayName(dayIndex: number): string {\r\n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\n return days[dayIndex];\r\n }\r\n\r\n /// Check date is it in past or future\r\n checkPastOrFuture(inputDate: any, targetDate: any) {\r\n if (inputDate) {\r\n const [day, month, year] = inputDate?.split('/').map(Number);\r\n const dateToCheck = new Date(year, month - 1, day);\r\n const today = targetDate;\r\n today.setHours(0, 0, 0, 0);\r\n if (dateToCheck > today) {\r\n return 'Future';\r\n } else if (dateToCheck < today) {\r\n return 'Past';\r\n } else {\r\n return 'Today';\r\n }\r\n }\r\n }\r\n\r\n /// Convert english numbers to arabic equivalent\r\n parseEnglish(englishNum: any) {\r\n if (!englishNum) return englishNum;\r\n const numStr = String(englishNum);\r\n const arabicNumbers = [\r\n '\\u0660',\r\n '\\u0661',\r\n '\\u0662',\r\n '\\u0663',\r\n '\\u0664',\r\n '\\u0665',\r\n '\\u0666',\r\n '\\u0667',\r\n '\\u0668',\r\n '\\u0669',\r\n ];\r\n return numStr.replace(/[0-9]/g, (digit) => {\r\n return arabicNumbers[Number(digit)] || digit;\r\n });\r\n }\r\n\r\n /// Convert arabic numbers to english equivalent\r\n parseArabic(arabicNum: any) {\r\n return arabicNum.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d: string) {\r\n return d.charCodeAt(0) - 1632;\r\n });\r\n }\r\n\r\n ///\r\n convertDateNumerals(date: string, targetLang: 'en' | 'ar'): string {\r\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\r\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\r\n\r\n const toArabic = (value: string) =>\r\n value\r\n .split('')\r\n .map((char) => (/\\d/.test(char) ? arabicNumbers[+char] : char))\r\n .join('');\r\n\r\n const toEnglish = (value: string) =>\r\n value\r\n .split('')\r\n .map((char) => {\r\n const index = arabicNumbers.indexOf(char);\r\n return index > -1 ? englishNumbers[index] : char;\r\n })\r\n .join('');\r\n\r\n if (targetLang === 'ar') {\r\n const [day, month, year] = date.split('/');\r\n return `${toArabic(year)}/${toArabic(month)}/${toArabic(day)}`;\r\n } else {\r\n const [year, month, day] = date.split('/');\r\n return `${toEnglish(day)}/${toEnglish(month)}/${toEnglish(year)}`;\r\n }\r\n }\r\n\r\n /**\r\n * Normalize input date to DD/MM/YYYY string format (Gregorian)\r\n * Accepts Date object or DD/MM/YYYY string\r\n */\r\n normalizeDateToString(date: Date | string | undefined): string | null {\r\n if (!date) return null;\r\n\r\n if (date instanceof Date) {\r\n return this.formatDate(date);\r\n }\r\n\r\n // Already a string - validate format\r\n const parsed = this.parseDate(date);\r\n return parsed ? this.formatDate(parsed) : null;\r\n }\r\n\r\n /**\r\n * Compare two dates (Gregorian format DD/MM/YYYY)\r\n * Returns: -1 if date1 < date2, 0 if equal, 1 if date1 > date2\r\n */\r\n compareDates(date1Str: string, date2Str: string): number {\r\n const d1 = this.parseDate(date1Str);\r\n const d2 = this.parseDate(date2Str);\r\n\r\n if (!d1 || !d2) return 0;\r\n\r\n if (d1 < d2) return -1;\r\n if (d1 > d2) return 1;\r\n return 0;\r\n }\r\n\r\n /**\r\n * Compare two Hijri dates (UM format DD/MM/YYYY)\r\n * Converts to Gregorian for comparison\r\n */\r\n compareHijriDates(hijri1: string, hijri2: string): number {\r\n const day1 = this.convertDate(hijri1, false);\r\n const day2 = this.convertDate(hijri2, false);\r\n\r\n if (!day1?.gD || !day2?.gD) return 0;\r\n\r\n return this.compareDates(day1.gD, day2.gD);\r\n }\r\n\r\n /**\r\n * Check if a date is within the specified range (inclusive)\r\n * All dates in Gregorian DD/MM/YYYY format\r\n */\r\n isDateInRange(\r\n dateStr: string,\r\n minDateStr: string | null,\r\n maxDateStr: string | null\r\n ): boolean {\r\n if (!dateStr) return false;\r\n\r\n // If no constraints, date is valid\r\n if (!minDateStr && !maxDateStr) return true;\r\n\r\n // Check minimum constraint\r\n if (minDateStr && this.compareDates(dateStr, minDateStr) < 0) {\r\n return false;\r\n }\r\n\r\n // Check maximum constraint\r\n if (maxDateStr && this.compareDates(dateStr, maxDateStr) > 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Check if a Hijri date is within the specified range\r\n * Converts to Gregorian for comparison\r\n */\r\n isHijriDateInRange(\r\n hijriDateStr: string,\r\n minDateStr: string | null,\r\n maxDateStr: string | null\r\n ): boolean {\r\n if (!hijriDateStr) return false;\r\n\r\n const dayInfo = this.convertDate(hijriDateStr, false);\r\n if (!dayInfo?.gD) return false;\r\n\r\n return this.isDateInRange(dayInfo.gD, minDateStr, maxDateStr);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n OnInit,\r\n Output,\r\n EventEmitter,\r\n HostBinding,\r\n OnChanges,\r\n SimpleChanges,\r\n AfterViewInit,\r\n} from '@angular/core';\r\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\r\nimport { stylesConfig } from '../_interfaces/styles-config.model';\r\nimport { DateUtilitiesService } from '../_services/date-utilities.service';\r\nimport { TodayDate, DayInfo } from '../_interfaces/calendar-model';\r\nimport * as themesConfig from '../themes/themes.json';\r\n@Component({\r\n standalone: false,\r\n selector: 'hijri-gregorian-datepicker',\r\n templateUrl: './hijri-gregorian-datepicker.component.html',\r\n styleUrls: ['./hijri-gregorian-datepicker.component.scss'],\r\n})\r\nexport class HijriGregorianDatepickerComponent implements OnInit, OnChanges, AfterViewInit {\r\n /// Inputs\r\n @Input() markToday: boolean = true;\r\n @Input() canChangeMode: boolean = true;\r\n @Input() todaysDateSection: boolean = true;\r\n @Input() futureValidation: boolean = true;\r\n @Input() disableYearPicker: boolean = false;\r\n @Input() disableMonthPicker: boolean = false;\r\n @Input() disableDayPicker: boolean = false;\r\n @Input() multiple: boolean = false;\r\n @Input() isRequired: boolean = false;\r\n @Input() showConfirmButton: boolean = true;\r\n @Input() futureValidationMessage: boolean = false;\r\n @Input() arabicLayout: boolean = false;\r\n @Input() mode: string = 'greg';\r\n @Input() dir: string = 'ltr';\r\n @Input() locale: string = 'en';\r\n @Input() submitTextButton: string = 'Confirm';\r\n @Input() todaysDateText: string = \"Today's Date\";\r\n @Input() ummAlQuraDateText: string = 'Hijri Date';\r\n @Input() monthSelectLabel: string = 'Month';\r\n @Input() yearSelectLabel: string = 'Year';\r\n @Input() futureValidationMessageEn: string;\r\n @Input() futureValidationMessageAr: string;\r\n @Input() theme?: string = '';\r\n @Input() pastYearsLimit: number = 90;\r\n @Input() futureYearsLimit: number = 0;\r\n @Input() styles?: stylesConfig = {};\r\n\r\n // New inputs for extended functionality\r\n @Input() enableTime: boolean = false; // Enable time picker (hours & minutes)\r\n @Input() minDate?: Date | string; // Minimum allowed date (Gregorian Date or DD/MM/YYYY string)\r\n @Input() maxDate?: Date | string; // Maximum allowed date (Gregorian Date or DD/MM/YYYY string)\r\n @Input() initialDate?: Date | string; // Initial date to navigate to when picker opens\r\n \r\n // Range selection initial dates\r\n @Input() initialRangeStart?: Date | string; // Initial start date for range selection\r\n @Input() initialRangeEnd?: Date | string; // Initial end date for range selection\r\n \r\n // BACKWARD COMPATIBILITY: Default to false (24-hour format)\r\n // When true, displays 12-hour format with AM/PM toggle\r\n @Input() useMeridian: boolean = false; // Enable 12-hour format with AM/PM\r\n \r\n // BACKWARD COMPATIBILITY: Default to 'single' (existing behavior)\r\n // 'range' enables range selection mode (first click = start, second click = end)\r\n @Input() selectionMode: 'single' | 'range' = 'single';\r\n /// Outputs\r\n @Output() onSubmit = new EventEmitter<object>();\r\n @Output() onDaySelect = new EventEmitter<object>();\r\n @Output() onMonthChange = new EventEmitter<object>();\r\n @Output() onYearChange = new EventEmitter<object>();\r\n /// Variables\r\n ummAlQuraMonths = [\r\n { labelAr: 'محرم', labelEn: 'Muharram', value: 1 },\r\n { labelAr: 'صفر', labelEn: 'Safar', value: 2 },\r\n { labelAr: 'ربيع الأول', labelEn: 'Rabi al-Awwal', value: 3 },\r\n { labelAr: 'ربيع الثاني', labelEn: 'Rabi al-Thani', value: 4 },\r\n { labelAr: 'جمادى الأولى', labelEn: 'Jumada al-Awwal', value: 5 },\r\n { labelAr: 'جمادى الآخرة', labelEn: 'Jumada al-Thani', value: 6 },\r\n { labelAr: 'رجب', labelEn: 'Rajab', value: 7 },\r\n { labelAr: 'شعبان', labelEn: 'Shaban', value: 8 },\r\n { labelAr: 'رمضان', labelEn: 'Ramadan', value: 9 },\r\n { labelAr: 'شوال', labelEn: 'Shawwal', value: 10 },\r\n { labelAr: 'ذو القعدة', labelEn: 'Dhu al-Qadah', value: 11 },\r\n { labelAr: 'ذو الحجة', labelEn: 'Dhu al-Hijjah', value: 12 },\r\n ];\r\n gregMonths = [\r\n { labelAr: 'يناير', labelEn: 'January', value: 1 },\r\n { labelAr: 'فبراير', labelEn: 'February', value: 2 },\r\n { labelAr: 'مارس', labelEn: 'March', value: 3 },\r\n { labelAr: 'ابريل', labelEn: 'April', value: 4 },\r\n { labelAr: 'مايو', labelEn: 'May', value: 5 },\r\n { labelAr: 'يونيو', labelEn: 'June', value: 6 },\r\n { labelAr: 'يوليو', labelEn: 'July', value: 7 },\r\n { labelAr: 'اغسطس', labelEn: 'August', value: 8 },\r\n { labelAr: 'سبتمبر', labelEn: 'September', value: 9 },\r\n { labelAr: 'اكتوبر', labelEn: 'October', value: 10 },\r\n { labelAr: 'نوفمبر', labelEn: 'November', value: 11 },\r\n { labelAr: 'ديسمبر', labelEn: 'December', value: 12 },\r\n ];\r\n ummAlQuraYear: number;\r\n gregYear: number;\r\n years: any[];\r\n weeks: any[];\r\n months: any[];\r\n weekdaysEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\n weekdaysAr = ['سبت', 'جمعة', 'خميس', 'أربعاء', 'ثلاثاء', 'اثنين', 'أحد'];\r\n // weekdaysAr = ['س', 'ج', 'خ', 'أر', 'ث', 'إث', 'أح'];\r\n todaysDate: TodayDate = {};\r\n selectedDay: DayInfo;\r\n periodForm: UntypedFormGroup;\r\n multipleSelectedDates = [] as DayInfo[];\r\n themes = [] as any;\r\n\r\n // Time picker variables\r\n // BACKWARD COMPATIBILITY: selectedTime defaults to 0:0 to preserve existing behavior when enableTime=false\r\n // When enableTime=true, this will be initialized to current system time in ngOnInit\r\n selectedTime: { hour: number; minute: number } = { hour: 0, minute: 0 };\r\n \r\n // Track if time has been initialized to avoid re-initializing at midnight\r\n private timeInitialized: boolean = false;\r\n \r\n // BACKWARD COMPATIBILITY: Meridian only used when useMeridian=true\r\n // Tracks AM/PM state for 12-hour format\r\n meridian: 'AM' | 'PM' = 'AM';\r\n \r\n // Range selection state\r\n // BACKWARD COMPATIBILITY: These are only used when selectionMode='range'\r\n // They do not affect single or multiple selection modes\r\n rangeStart?: DayInfo = undefined;\r\n rangeEnd?: DayInfo = undefined;\r\n\r\n @HostBinding('style.font-family') fontFamilyStyle: string;\r\n constructor(\r\n public formBuilder: UntypedFormBuilder,\r\n public _dateUtilsService: DateUtilitiesService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.initTheme();\r\n this.initializeForm();\r\n this.getTodaysDateInfo();\r\n this.initializeYearsAndMonths();\r\n\r\n // Initialize time from current system time or initialDate\r\n // BACKWARD COMPATIBILITY: This only runs when enableTime=true\r\n if (this.enableTime) {\r\n this.initializeTime();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Double-check time initialization after view is ready\r\n // This handles cases where enableTime might be set after ngOnInit\r\n if (this.enableTime && !this.timeInitialized) {\r\n this.initializeTime();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (!changes['mode'].isFirstChange()) {\r\n this.changeCalendarMode();\r\n }\r\n }\r\n\r\n initTheme() {\r\n if (this.theme != '') {\r\n this.themes = themesConfig;\r\n for (const themeItem of this.themes['default']) {\r\n if (themeItem.name == this.theme) {\r\n this.styles = themeItem.stylesConfig;\r\n break;\r\n }\r\n }\r\n }\r\n this.fontFamilyStyle = this.styles.fontFamily;\r\n }\r\n\r\n /// Initialize form control for month and year select\r\n initializeForm() {\r\n this.periodForm = this.formBuilder.group({\r\n year: [{ value: '', disabled: this.disableYearPicker }, []],\r\n month: [{ value: '', disabled: this.disableMonthPicker }, []],\r\n });\r\n }\r\n\r\n // Initialize years and months for calendar\r\n initializeYearsAndMonths() {\r\n this.years = [];\r\n this.months = [];\r\n\r\n // Determine the date to use for initialization (initialDate or today)\r\n let referenceDate: string;\r\n if (this.initialDate) {\r\n const normalizedInitialDate =\r\n this._dateUtilsService.normalizeDateToString(this.initialDate);\r\n if (normalizedInitialDate) {\r\n if (this.mode == 'greg') {\r\n referenceDate = normalizedInitialDate;\r\n } else {\r\n const hijriDate = this._dateUtilsService.convertDate(\r\n normalizedInitialDate,\r\n true\r\n );\r\n referenceDate = hijriDate?.uD || this.todaysDate.ummAlQura;\r\n }\r\n } else {\r\n referenceDate =\r\n this.mode == 'greg'\r\n ? this.todaysDate.gregorian\r\n : this.todaysDate.ummAlQura;\r\n }\r\n } else {\r\n referenceDate =\r\n this.mode == 'greg'\r\n ? this.todaysDate.gregorian\r\n : this.todaysDate.ummAlQura;\r\n }\r\n\r\n if (this.mode == 'greg') {\r\n this.gregYear =\r\n this.futureYearsLimit == 0\r\n ? Number(referenceDate?.split('/')[2])\r\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\r\n for (let i = 0; i < this.gregYear; i++) {\r\n if (i < this.pastYearsLimit) {\r\n let val = this.gregYear--;\r\n this.years.push(val);\r\n } else {\r\n break;\r\n }\r\n }\r\n this.months = this.gregMonths;\r\n } else {\r\n this.ummAlQuraYear =\r\n this.futureYearsLimit == 0\r\n ? Number(referenceDate?.split('/')[2])\r\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\r\n for (let i = 0; i < this.ummAlQuraYear; i++) {\r\n if (i < this.pastYearsLimit) {\r\n let val = this.ummAlQuraYear--;\r\n this.years.push(val);\r\n } else {\r\n break;\r\n }\r\n }\r\n this.months = this.ummAlQuraMonths;\r\n }\r\n this.years.map((year: any) => {\r\n if (year == referenceDate?.split('/')[2]) {\r\n this.periodForm.controls['year'].setValue(year);\r\n }\r\n });\r\n this.months.map((month: any) => {\r\n if (month.value == referenceDate?.split('/')[1]) {\r\n this.periodForm.controls['month'].setValue(month.value);\r\n }\r\n });\r\n }\r\n\r\n /// On change event of years and months\r\n onPeriodChange(type: string) {\r\n if (type == 'year') {\r\n this.onYearChange.emit(this.periodForm.controls['year'].value);\r\n } else {\r\n this.onMonthChange.emit(this.periodForm.controls['month'].value);\r\n }\r\n const days = this._dateUtilsService.getMonthData(\r\n '01/' +\r\n this.periodForm.controls['month'].value +\r\n '/' +\r\n this.periodForm.controls['year'].value,\r\n this.mode\r\n );\r\n this.weeks = this.generateWeeksArray(days);\r\n }\r\n\r\n /// Get todays(greg and umm al qura) date info\r\n getTodaysDateInfo() {\r\n this.todaysDate.gregorian = this._dateUtilsService.formatDate(new Date());\r\n this.todaysDate.ummAlQura = this._dateUtilsService.convertDate(\r\n this.todaysDate.gregorian,\r\n true\r\n )?.uD;\r\n\r\n // Use initialDate if provided, otherwise use today's date\r\n let dateToNavigate: string;\r\n\r\n if (this.initialDate) {\r\n // Normalize initialDate to DD/MM/YYYY format\r\n const normalizedInitialDate =\r\n this._dateUtilsService.normalizeDateToString(this.initialDate);\r\n\r\n if (normalizedInitialDate) {\r\n if (this.mode == 'greg') {\r\n dateToNavigate = normalizedInitialDate;\r\n } else {\r\n // Convert to Hijri for ummAlQura mode\r\n const hijriDate = this._dateUtilsService.convertDate(\r\n normalizedInitialDate,\r\n true\r\n );\r\n dateToNavigate = hijriDate?.uD || this.todaysDate.ummAlQura;\r\n }\r\n } else {\r\n // Invalid initialDate, fall back to today\r\n dateToNavigate =\r\n this.mode == 'greg'\r\n ? this.todaysDate.gregorian\r\n : this.todaysDate.ummAlQura;\r\n }\r\n } else {\r\n // No initialDate provided, use today\r\n dateToNavigate =\r\n this.mode == 'greg'\r\n ? this.todaysDate.gregorian\r\n : this.todaysDate.ummAlQura;\r\n }\r\n\r\n this.generatetMonthData(dateToNavigate);\r\n \r\n // Highlight initialDate or initialRange if provided\r\n if (this.selectionMode === 'range' && (this.initialRangeStart || this.initialRangeEnd)) {\r\n this.highlightInitialRange();\r\n } else if (this.initialDate) {\r\n this.highlightInitialDate();\r\n }\r\n }\r\n\r\n /// Generate month days from JSON\r\n generatetMonthData(date: string) {\r\n const days = this._dateUtilsService.getMonthData(date, this.mode);\r\n this.weeks = this.generateWeeksArray(days);\r\n }\r\n\r\n /// Highlight initialDate on the calendar\r\n private highlightInitialDate() {\r\n if (!this.initialDate) {\r\n return;\r\n }\r\n\r\n const normalizedInitialDate =\r\n this._dateUtilsService.normalizeDateToString(this.initialDate);\r\n\r\n if (!normalizedInitialDate) {\r\n return;\r\n }\r\n\r\n // Find the day in the weeks array that matches initialDate\r\n for (const week of this.weeks) {\r\n for (const day of week) {\r\n if (day && day.gD === normalizedInitialDate) {\r\n // Don't select if date is disabled\r\n if (!this.isDateDisabled(day)) {\r\n // Mark as selected without triggering events\r\n day.selected = true;\r\n \r\n // Set as selectedDay based on selection mode\r\n if (this.selectionMode === 'range') {\r\n this.rangeStart = day;\r\n } else if (this.multiple) {\r\n this.multipleSelectedDates = [day];\r\n } else {\r\n this.selectedDay = day;\r\n }\r\n \r\n // Initialize time if enableTime is active\r\n if (this.enableTime && !this.timeInitialized) {\r\n this.initializeTime();\r\n }\r\n \r\n // Attach time to the day if it's a Date object with time\r\n if (this.enableTime && this.initialDate instanceof Date) {\r\n day.time = {\r\n hour: this.initialDate.getHours(),\r\n minute: this.initialDate.getMinutes()\r\n };\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /// Highlight initial range (start and end dates) on the calendar\r\n private highlightInitialRange() {\r\n if (!this.initialRangeStart && !this.initialRangeEnd) {\r\n return;\r\n }\r\n\r\n const normalizedStartDate = this.initialRangeStart\r\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeStart)\r\n : null;\r\n const normalizedEndDate = this.initialRangeEnd\r\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeEnd)\r\n : null;\r\n\r\n let startDay: DayInfo | null = null;\r\n let endDay: DayInfo | null = null;\r\n\r\n // Find both start and end dates in the weeks array\r\n for (const week of this.weeks) {\r\n for (const day of week) {\r\n if (day && normalizedStartDate && day.gD === normalizedStartDate) {\r\n if (!this.isDateDisabled(day)) {\r\n startDay = day;\r\n }\r\n }\r\n if (day && normalizedEndDate && day.gD === normalizedEndDate) {\r\n if (!this.isDateDisabled(day)) {\r\n endDay = day;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Set range start\r\n if (startDay) {\r\n startDay.selected = true;\r\n this.rangeStart = startDay;\r\n this.selectedDay = startDay;\r\n \r\n // Initialize and attach time to start date\r\n if (this.enableTime) {\r\n if (!this.timeInitialized) {\r\n this.initializeTime();\r\n }\r\n if (this.initialRangeStart instanceof Date) {\r\n startDay.time = {\r\n hour: this.initialRangeStart.getHours(),\r\n minute: this.initialRangeStart.getMinutes()\r\n };\r\n } else {\r\n startDay.time = { ...this.selectedTime };\r\n }\r\n }\r\n }\r\n\r\n // Set range end if provided\r\n if (endDay && startDay) {\r\n // Swap if end is before start\r\n const startDate = this.parseDateString(startDay.gD);\r\n const endDate = this.parseDateString(endDay.gD);\r\n \r\n if (endDate && startDate && endDate < startDate) {\r\n // Swap\r\n this.rangeEnd = startDay;\r\n this.rangeStart = endDay;\r\n endDay.selected = true;\r\n } else {\r\n this.rangeEnd = endDay;\r\n }\r\n \r\n // Attach time to end date (inherit from start)\r\n if (this.enableTime) {\r\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\r\n if (this.initialRangeEnd instanceof Date) {\r\n this.rangeEnd.time = {\r\n hour: this.initialRangeEnd.getHours(),\r\n minute: this.initialRangeEnd.getMinutes()\r\n };\r\n } else {\r\n this.rangeEnd.time = { ...timeToUse };\r\n }\r\n // Ensure start also has time\r\n this.rangeStart.time = { ...timeToUse };\r\n }\r\n \r\n // Highlight the range\r\n this.highlightRange();\r\n this.selectedDay = this.rangeEnd;\r\n }\r\n }\r\n\r\n /// Generate month weeks\r\n generateWeeksArray(daysArray: any) {\r\n const firstDayName = daysArray[0]?.dN;\r\n const startIndex = this.weekdaysEn.indexOf(firstDayName);\r\n const weeks = [[]] as any;\r\n let currentWeek = 0;\r\n let currentDayIndex = startIndex;\r\n\r\n daysArray?.forEach((day: any) => {\r\n if (!weeks[currentWeek]) {\r\n weeks[currentWeek] = [];\r\n }\r\n\r\n weeks[currentWeek][currentDayIndex] = day;\r\n currentDayIndex++;\r\n\r\n if (currentDayIndex === 7) {\r\n currentDayIndex = 0;\r\n currentWeek++;\r\n }\r\n });\r\n weeks.forEach((week: any) => {\r\n while (week.length < 7) {\r\n week.push({});\r\n }\r\n });\r\n return weeks;\r\n }\r\n\r\n /// Change calendar mode 'greg' or 'ummAlQura'\r\n changeCalendarMode() {\r\n this.mode = this.mode == 'greg' ? 'ummAlQura' : 'greg';\r\n this.initializeYearsAndMonths();\r\n this.generatetMonthData(\r\n '01/' +\r\n this.periodForm.controls['month'].value +\r\n '/' +\r\n this.periodForm.controls['year'].value\r\n );\r\n }\r\n\r\n /// On day clicked handler\r\n onDayClicked(day: DayInfo) {\r\n if (day && day?.gD) {\r\n // Check if day is disabled by min/max constraints\r\n if (this.isDateDisabled(day)) {\r\n return; // Don't allow selection of disabled dates\r\n }\r\n\r\n if (this.futureValidation) {\r\n if (this.checkFutureValidation(day)) {\r\n this.futureValidationMessage = true;\r\n } else {\r\n this.futureValidationMessage = false;\r\n this.markDaySelected(day);\r\n }\r\n } else {\r\n this.markDaySelected(day);\r\n }\r\n }\r\n }\r\n\r\n /// Mark day as selected\r\n markDaySelected(dayInfo: DayInfo) {\r\n // BACKWARD COMPATIBILITY: Range selection only when selectionMode='range'\r\n if (this.selectionMode === 'range') {\r\n this.handleRangeSelection(dayInfo);\r\n return;\r\n }\r\n \r\n // BACKWARD COMPATIBILITY: Original behavior for single/multiple selection\r\n if (dayInfo.selected) {\r\n dayInfo.selected = false;\r\n this.multipleSelectedDates = this.multipleSelectedDates.filter(\r\n (day) => day !== dayInfo\r\n );\r\n if (!this.multiple) {\r\n this.selectedDay = undefined;\r\n }\r\n } else {\r\n if (!this.multiple) {\r\n this.weeks.forEach((week: any) => {\r\n week.forEach((day: DayInfo) => {\r\n day.selected = false;\r\n });\r\n });\r\n\r\n dayInfo.selected = true;\r\n this.selectedDay = dayInfo;\r\n this.multipleSelectedDates = [dayInfo];\r\n\r\n // Attach current time if enableTime is active\r\n if (this.enableTime) {\r\n // Ensure time is initialized before attaching\r\n if (!this.timeInitialized) {\r\n this.initializeTime();\r\n }\r\n dayInfo.time = { ...this.selectedTime };\r\n }\r\n\r\n this.onDaySelect.emit(dayInfo);\r\n } else {\r\n dayInfo.selected = true;\r\n\r\n // Attach current time if enableTime is active\r\n if (this.enableTime) {\r\n // Ensure time is initialized before attaching\r\n if (!this.timeInitialized) {\r\n this.initializeTime();\r\n }\r\n dayInfo.time = { ...this.selectedTime };\r\n }\r\n\r\n this.onDaySelect.emit(dayInfo);\r\n if (!this.multipleSelectedDates.includes(dayInfo)) {\r\n this.multipleSelectedDates.push(dayInfo);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle range selection logic\r\n * BACKWARD COMPATIBILITY: Only called when selectionMode='range'\r\n * \r\n * Range selection lifecycle:\r\n * 1. First click → Sets rangeStart\r\n * 2. Second click → Sets rangeEnd, highlights range\r\n * 3. Third click → Resets range, starts new selection\r\n */\r\n private handleRangeSelection(dayInfo: DayInfo): void {\r\n // First click or resetting range\r\n if (!this.rangeStart || (this.rangeStart && this.rangeEnd)) {\r\n this.resetRange();\r\n this.rangeStart = dayInfo;\r\n dayInfo.selected = true;\r\n this.selectedDay = dayInfo;\r\n \r\n // Attach current time if enableTime is active\r\n if (this.enableTime) {\r\n // Ensure selectedTime is initialized\r\n // If time hasn't been initialized yet, initialize it now\r\n if (!this.timeInitialized) {\r\n this.initializeTime();\r\n }\r\n dayInfo.time = { ...this.selectedTime };\r\n }\r\n \r\n this.onDaySelect.emit({ start: dayInfo, end: null });\r\n }\r\n // Second click - complete the range\r\n else if (this.rangeStart && !this.rangeEnd) {\r\n const startDate = this.parseDateString(this.rangeStart.gD);\r\n const endDate = this.parseDateString(dayInfo.gD);\r\n \r\n // Swap if end is before start\r\n if (endDate && startDate && endDate < startDate) {\r\n this.rangeEnd = this.rangeStart;\r\n this.rangeStart = dayInfo;\r\n } else {\r\n this.rangeEnd = dayInfo;\r\n }\r\n \r\n // Attach time if enableTime is active\r\n // IMPORTANT: Range end inherits time from range start (not current selectedTime)\r\n if (this.enableTime) {\r\n // Use rangeStart's time if it exists, otherwise use current selectedTime\r\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\r\n this.rangeStart.time = { ...timeToUse };\r\n this.rangeEnd.time = { ...timeToUse };\r\n }\r\n \r\n this.highlightRange();\r\n this.selectedDay = this.rangeEnd;\r\n \r\n this.onDaySelect.emit({ start: this.rangeStart, end: this.rangeEnd });\r\n }\r\n }\r\n\r\n /// On confirm button clicked\r\n onConfirmClicked() {\r\n // BACKWARD COMPATIBILITY: Range selection output when selectionMode='range'\r\n if (this.selectionMode === 'range') {\r\n if (this.rangeStart && this.rangeEnd) {\r\n // Collect all dates in range\r\n const rangeDates: DayInfo[] = [];\r\n this.weeks.forEach((week: any) => {\r\n week.forEach((day: DayInfo) => {\r\n if (day && day.gD && (this.isInRange(day) || this.isRangeStart(day) || this.isRangeEnd(day))) {\r\n // Attach current time if enableTime is active\r\n if (this.enableTime && !day.time) {\r\n day.time = { ...this.selectedTime };\r\n }\r\n rangeDates.push(day);\r\n }\r\n });\r\n });\r\n \r\n this.onSubmit.emit({ \r\n start: this.rangeStart, \r\n end: this.rangeEnd,\r\n dates: rangeDates \r\n });\r\n } else {\r\n // Incomplete range\r\n this.onSubmit.emit({ start: this.rangeStart, end: null, dates: [] });\r\n }\r\n return;\r\n }\r\n \r\n // BACKWARD COMPATIBILITY: Original behavior for multiple/single selection\r\n if (this.multiple) {\r\n // For multiple dates, attach time to each if enableTime is active\r\n if (this.enableTime) {\r\n this.multipleSelectedDates.forEach((day) => {\r\n if (!day.time) {\r\n day.time = { ...this.selectedTime };\r\n }\r\n });\r\n }\r\n this.onSubmit.emit(this.multipleSelectedDates);\r\n } else {\r\n // For single date, attach time if enableTime is active\r\n if (this.enableTime && this.selectedDay) {\r\n this.selectedDay.time = { ...this.selectedTime };\r\n }\r\n this.onSubmit.emit(this.selectedDay);\r\n }\r\n }\r\n\r\n /// Check if date from future\r\n checkFutureValidation(day: DayInfo) {\r\n if (\r\n this._dateUtilsService.checkPastOrFuture(day?.gD, new Date()) == 'Future'\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n /// Check if passed day is today or not\r\n checkTodaysDate(day: DayInfo) {\r\n return (\r\n this.todaysDate?.gregorian == day?.gD ||\r\n this.todaysDate?.ummAlQura == day?.uD\r\n );\r\n }\r\n\r\n /**\r\n * Check if a day is disabled based on min/max date constraints\r\n * Works for both Gregorian and Hijri modes\r\n */\r\n isDateDisabled(day: DayInfo): boolean {\r\n if (!day || !day.gD) return true;\r\n\r\n // Normalize min/max dates to Gregorian DD/MM/YYYY format\r\n const minDateStr = this.minDate\r\n ? this._dateUtilsService.normalizeDateToString(this.minDate)\r\n : null;\r\n const maxDateStr = this.maxDate\r\n ? this._dateUtilsService.normalizeDateToString(this.maxDate)\r\n : null;\r\n\r\n // Check if the day's Gregorian date is within range\r\n return !this._dateUtilsService.isDateInRange(\r\n day.gD,\r\n minDateStr,\r\n maxDateStr\r\n );\r\n }\r\n\r\n /**\r\n * Initialize time from current system time or initialDate\r\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\r\n *\r\n * Priority:\r\n * 1. If initialDate has time, use that\r\n * 2. If selectedDay has time, use that\r\n * 3. Otherwise, use current system time\r\n */\r\n initializeTime(): void {\r\n let timeSet = false;\r\n\r\n // Check if initialDate has time information\r\n if (this.initialDate && this.initialDate instanceof Date) {\r\n this.selectedTime = {\r\n hour: this.initialDate.getHours(),\r\n minute: this.initialDate.getMinutes(),\r\n };\r\n timeSet = true;\r\n }\r\n\r\n // If no time from initialDate, use current system time\r\n if (!timeSet) {\r\n const now = new Date();\r\n this.selectedTime = {\r\n hour: now.getHours(),\r\n minute: now.getMinutes(),\r\n };\r\n }\r\n \r\n // Mark that time has been initialized\r\n this.timeInitialized = true;\r\n \r\n // BACKWARD COMPATIBILITY: Only set meridian when useMeridian=true\r\n if (this.useMeridian) {\r\n this.meridian = this.selectedTime.hour >= 12 ? 'PM' : 'AM';\r\n }\r\n }\r\n\r\n /**\r\n * Increment hour value with wraparound (0-23)\r\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\r\n */\r\n incrementHour(): void {\r\n this.selectedTime.hour = (this.selectedTime.hour + 1) % 24;\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Decrement hour value with wraparound (0-23)\r\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\r\n */\r\n decrementHour(): void {\r\n this.selectedTime.hour = (this.selectedTime.hour - 1 + 24) % 24;\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Increment minute value with wraparound (0-59)\r\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\r\n */\r\n incrementMinute(): void {\r\n this.selectedTime.minute = (this.selectedTime.minute + 1) % 60;\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Decrement minute value with wraparound (0-59)\r\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\r\n */\r\n decrementMinute(): void {\r\n this.selectedTime.minute = (this.selectedTime.minute - 1 + 60) % 60;\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Handle keyboard input for hours\r\n * Validates and clamps to 0-23 range\r\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\r\n */\r\n onHourInputChange(event: any): void {\r\n let value = parseInt(event.target.value, 10);\r\n\r\n if (isNaN(value) || value < 0) {\r\n value = 0;\r\n } else if (value > 23) {\r\n value = 23;\r\n }\r\n\r\n this.selectedTime.hour = value;\r\n event.target.value = value;\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Handle keyboard input for minutes\r\n * Validates and clamps to 0-59 range\r\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\r\n */\r\n onMinuteInputChange(event: any): void {\r\n let value = parseInt(event.target.value, 10);\r\n\r\n if (isNaN(value) || value < 0) {\r\n value = 0;\r\n } else if (value > 59) {\r\n value = 59;\r\n }\r\n\r\n this.selectedTime.minute = value;\r\n event.target.value = value;\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Handle keyboard arrow keys for hour/minute input\r\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\r\n */\r\n onTimeKeydown(event: KeyboardEvent, type: 'hour' | 'minute'): void {\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (type === 'hour') {\r\n this.incrementHour();\r\n } else {\r\n this.incrementMinute();\r\n }\r\n } else if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n if (type === 'hour') {\r\n this.decrementHour();\r\n } else {\r\n this.decrementMinute();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update the selected day's time property when time changes\r\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\r\n */\r\n private updateSelectedDayTime(): void {\r\n if (this.selectedDay) {\r\n this.selectedDay.time = { ...this.selectedTime };\r\n }\r\n }\r\n\r\n /**\r\n * Get display hour for 12-hour format\r\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\r\n * \r\n * Conversion:\r\n * - 0 (midnight) → 12 AM\r\n * - 1-11 (AM) → 1-11 AM\r\n * - 12 (noon) → 12 PM\r\n * - 13-23 (PM) → 1-11 PM\r\n * \r\n * IMPORTANT: Hour 0 is NEVER displayed as 0, always as 12\r\n */\r\n getDisplayHour(): number {\r\n if (!this.useMeridian) {\r\n return this.selectedTime.hour;\r\n }\r\n \r\n const hour = this.selectedTime.hour;\r\n \r\n // Midnight (0) → 12\r\n if (hour === 0) {\r\n return 12;\r\n }\r\n // 1-12 → 1-12 (no change)\r\n else if (hour <= 12) {\r\n return hour;\r\n }\r\n // 13-23 → 1-11 (subtract 12)\r\n else {\r\n return hour - 12;\r\n }\r\n }\r\n\r\n /**\r\n * Toggle AM/PM meridian\r\n * BACKWARD COMPATIBILITY: Only available when useMeridian=true\r\n * \r\n * When toggling:\r\n * - Adds or subtracts 12 hours\r\n * - Maintains internal 24-hour format\r\n */\r\n toggleMeridian(): void {\r\n if (this.meridian === 'AM') {\r\n this.meridian = 'PM';\r\n // Add 12 hours if not already in PM range\r\n if (this.selectedTime.hour < 12) {\r\n this.selectedTime.hour += 12;\r\n }\r\n } else {\r\n this.meridian = 'AM';\r\n // Subtract 12 hours if in PM range\r\n if (this.selectedTime.hour >= 12) {\r\n this.selectedTime.hour -= 12;\r\n }\r\n }\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Increment hour in 12-hour mode\r\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\r\n */\r\n incrementHour12(): void {\r\n let displayHour = this.getDisplayHour();\r\n displayHour = (displayHour % 12) + 1; // 1-12 cycle\r\n \r\n // Convert back to 24-hour format\r\n if (this.meridian === 'AM') {\r\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\r\n } else {\r\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\r\n }\r\n \r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Decrement hour in 12-hour mode\r\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\r\n */\r\n decrementHour12(): void {\r\n let displayHour = this.getDisplayHour();\r\n displayHour = displayHour === 1 ? 12 : displayHour - 1; // 1-12 cycle\r\n \r\n // Convert back to 24-hour format\r\n if (this.meridian === 'AM') {\r\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\r\n } else {\r\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\r\n }\r\n \r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Handle 12-hour input change\r\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\r\n * \r\n * IMPORTANT: Input must be 1-12, never 0\r\n * - User types 0 → converted to 12\r\n * - User types > 12 → clamped to 12\r\n */\r\n onHour12InputChange(event: any): void {\r\n let value = parseInt(event.target.value, 10);\r\n \r\n // Validate 1-12 range (0 is not allowed in 12-hour format)\r\n if (isNaN(value) || value < 1 || value === 0) {\r\n value = 12; // Default to 12 if invalid or 0\r\n } else if (value > 12) {\r\n value = 12;\r\n }\r\n \r\n // Convert to 24-hour format\r\n if (this.meridian === 'AM') {\r\n this.selectedTime.hour = value === 12 ? 0 : value;\r\n } else {\r\n this.selectedTime.hour = value === 12 ? 12 : value + 12;\r\n }\r\n \r\n event.target.value = value;\r\n this.updateSelectedDayTime();\r\n }\r\n\r\n /**\r\n * Check if a date is within the current range\r\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\r\n */\r\n isInRange(day: DayInfo): boolean {\r\n if (this.selectionMode !== 'range' || !this.rangeStart || !this.rangeEnd || !day?.gD) {\r\n return false;\r\n }\r\n \r\n const dayDate = this.parseDateString(day.gD);\r\n const startDate = this.parseDateString(this.rangeStart.gD);\r\n const endDate = this.parseDateString(this.rangeEnd.gD);\r\n \r\n if (!dayDate || !startDate || !endDate) {\r\n return false;\r\n }\r\n \r\n return dayDate >= startDate && dayDate <= endDate;\r\n }\r\n\r\n /**\r\n * Check if a date is the range start\r\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\r\n */\r\n isRangeStart(day: DayInfo): boolean {\r\n return this.selectionMode === 'range' && \r\n this.rangeStart?.gD === day?.gD;\r\n }\r\n\r\n /**\r\n * Check if a date is the range end\r\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\r\n */\r\n isRangeEnd(day: DayInfo): boolean {\r\n return this.selectionMode === 'range' && \r\n this.rangeEnd?.gD === day?.gD;\r\n }\r\n\r\n /**\r\n * Reset range selection\r\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\r\n */\r\n private resetRange(): void {\r\n if (this.selectionMode !== 'range') {\r\n return;\r\n }\r\n \r\n // Clear range highlighting\r\n this.weeks.forEach((week: any) => {\r\n week.forEach((day: DayInfo) => {\r\n if (day && day.gD) {\r\n day.selected = false;\r\n }\r\n });\r\n });\r\n \r\n this.rangeStart = undefined;\r\n this.rangeEnd = undefined;\r\n this.selectedDay = undefined;\r\n }\r\n\r\n /**\r\n * Parse date string (DD/MM/YYYY) to Date object\r\n * Helper for range comparison\r\n */\r\n private parseDateString(dateStr: string): Date | null {\r\n if (!dateStr) return null;\r\n \r\n const parts = dateStr.split('/');\r\n if (parts.length !== 3) return null;\r\n \r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1; // Month is 0-indexed\r\n const year = parseInt(parts[2], 10);\r\n \r\n return new Date(year, month, day);\r\n }\r\n\r\n /**\r\n * Highlight all dates in range\r\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\r\n */\r\n private highlightRange(): void {\r\n if (this.selectionMode !== 'range' || !this.rangeStart || !this.rangeEnd) {\r\n return;\r\n }\r\n \r\n this.weeks.forEach((week: any) => {\r\n week.forEach((day: DayInfo) => {\r\n if (day && day.gD) {\r\n day.selected = this.isInRange(day) || \r\n this.isRangeStart(day) || \r\n this.isRangeEnd(day);\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","<div class=\"calendar-container\" [dir]=\"dir\" [attr.lang]=\"locale\">\r\n <div\r\n class=\"toggle-section\"\r\n [dir]=\"dir\"\r\n *ngIf=\"canChangeMode\"\r\n [ngStyle]=\"{ color: styles.primaryColor }\"\r\n >\r\n <span> {{ ummAlQuraDateText }} </span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!canChangeMode\"\r\n [checked]=\"mode === 'ummAlQura'\"\r\n (change)=\"changeCalendarMode()\"\r\n #calendarCheckbox\r\n />\r\n <span\r\n class=\"slider\"\r\n [ngStyle]=\"\r\n calendarCheckbox.checked\r\n ? { 'background-color': styles.primaryColor }\r\n : { 'background-color': styles.backgroundColor }\r\n \"\r\n ></span>\r\n </label>\r\n </div>\r\n\r\n <div\r\n class=\"todays-date-section\"\r\n *ngIf=\"todaysDateSection\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.backgroundColor,\r\n color: styles.primaryColor,\r\n 'border-radius': styles.borderRadius\r\n }\"\r\n >\r\n <div\r\n class=\"text-info\"\r\n [ngClass]=\"{\r\n order: dir == 'rtl'\r\n }\"\r\n >\r\n <p>{{ todaysDateText }}</p>\r\n </div>\r\n\r\n <div\r\n class=\"data\"\r\n [dir]=\"dir\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.todaysDateBgColor,\r\n color: styles.todaysDateTextColor\r\n }\"\r\n >\r\n <p *ngIf=\"mode == 'ummAlQura'\">\r\n <!-- {{todaysDate.ummAlQura}} -->\r\n {{\r\n locale == \"ar\"\r\n ? _dateUtilsService.convertDateNumerals(todaysDate.ummAlQura, \"ar\")\r\n : todaysDate.ummAlQura\r\n }}\r\n </p>\r\n <p *ngIf=\"mode == 'greg'\">\r\n {{\r\n locale == \"ar\"\r\n ? _dateUtilsService.convertDateNumerals(todaysDate.gregorian, \"ar\")\r\n : todaysDate.gregorian\r\n }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"period-container\">\r\n <form [formGroup]=\"periodForm\" class=\"period-form\">\r\n <div\r\n class=\"select-item\"\r\n [ngClass]=\"{\r\n order: dir == 'ltr'\r\n }\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.backgroundColor,\r\n 'border-radius': styles.borderRadius\r\n }\"\r\n >\r\n <label *ngIf=\"!periodForm.controls['year'].value\">{{\r\n yearSelectLabel\r\n }}</label>\r\n\r\n <select\r\n formControlName=\"year\"\r\n class=\"{{ 'icon-' + dir }}\"\r\n placeholder=\"السنة\"\r\n (change)=\"onPeriodChange('year')\"\r\n [dir]=\"dir\"\r\n [ngStyle]=\"{\r\n color: styles.primaryColor,\r\n 'font-family': styles.fontFamily\r\n }\"\r\n >\r\n <option *ngFor=\"let year of years\" [ngValue]=\"year\">\r\n {{ locale == \"ar\" ? _dateUtilsService.parseEnglish(year) : year }}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div\r\n class=\"select-item\"\r\n [ngClass]=\"{\r\n order: dir == 'rtl'\r\n }\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.backgroundColor,\r\n 'border-radius': styles.borderRadius\r\n }\"\r\n >\r\n <label *ngIf=\"!periodForm.controls['month'].value\">{{\r\n monthSelectLabel\r\n }}</label>\r\n <select\r\n class=\"{{ 'icon-' + dir }}\"\r\n formControlName=\"month\"\r\n (change)=\"onPeriodChange('month')\"\r\n [dir]=\"dir\"\r\n [ngStyle]=\"{\r\n color: styles.primaryColor,\r\n 'font-family': styles.fontFamily\r\n }\"\r\n >\r\n <option *ngFor=\"let month of months\" [ngValue]=\"month.value\">\r\n {{ locale == \"ar\" ? month?.labelAr : month?.labelEn }}\r\n </option>\r\n </select>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div\r\n class=\"calendar-layout\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.backgroundColor,\r\n 'border-radius': styles.borderRadius\r\n }\"\r\n >\r\n <div class=\"week-days\">\r\n <div\r\n class=\"week-day\"\r\n [ngStyle]=\"{ color: styles.dayNameColor }\"\r\n *ngFor=\"let date of locale == 'ar' ? weekdaysAr : weekdaysEn\"\r\n >\r\n {{ date }}\r\n </div>\r\n </div>\r\n\r\n <div [dir]=\"dir\">\r\n <div class=\"week\" *ngFor=\"let week of weeks\">\r\n <div\r\n class=\"day\"\r\n *ngFor=\"let day of week\"\r\n (click)=\"disableDayPicker == false ? onDayClicked(day) : ''\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.backgroundColor,\r\n color: styles.dayColor\r\n }\"\r\n >\r\n <div\r\n id=\"greg-day\"\r\n [ngClass]=\"{\r\n 'todays-date': checkTodaysDate(day),\r\n 'selected-date': day?.selected == true\r\n }\"\r\n [ngStyle]=\"{\r\n border:\r\n markToday && checkTodaysDate(day)\r\n ? '1px solid ' + styles.secondaryColor\r\n : '',\r\n 'background-color':\r\n day?.selected == true ? styles.secondaryColor : '',\r\n color:\r\n (day?.selected == true ? styles.todaysDateTextColor : '') ||\r\n (checkFutureValidation(day) && futureValidation\r\n ? styles.disabledDayColor\r\n : '') ||\r\n (isDateDisabled(day) ? styles.disabledDayColor : ''),\r\n opacity: isDateDisabled(day) ? '0.4' : '1',\r\n cursor: isDateDisabled(day) ? 'not-allowed' : 'pointer'\r\n }\"\r\n >\r\n <span *ngIf=\"mode == 'greg'\">{{\r\n locale == \"ar\"\r\n ? _dateUtilsService.parseEnglish(\r\n day?.gD?.split(\"/\")[0] | number\r\n )\r\n : (day?.gD?.split(\"/\")[0] | number)\r\n }}</span>\r\n\r\n <span id=\"ummAlQura-day\" *ngIf=\"mode == 'ummAlQura'\">{{\r\n locale == \"ar\"\r\n ? _dateUtilsService.parseEnglish(\r\n day?.uD?.split(\"/\")[0] | number\r\n )\r\n : (day?.uD?.split(\"/\")[0] | number)\r\n }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"future-validation\" dir=\"auto\" *ngIf=\"futureValidationMessage\">\r\n <span *ngIf=\"locale == 'ar'\">\r\n {{ futureValidationMessageAr }}\r\n </span>\r\n <span *ngIf=\"locale == 'en'\">\r\n {{ futureValidationMessageEn }}\r\n </span>\r\n </div>\r\n\r\n <!-- Time Picker Section -->\r\n <!-- BACKWARD COMPATIBILITY: This section only renders when enableTime=true -->\r\n <div class=\"time-picker-section\" *ngIf=\"enableTime\" [dir]=\"'ltr'\">\r\n <div class=\"time-picker-wrapper\">\r\n <!-- Hour Input with Arrows -->\r\n <div class=\"time-input-container\">\r\n <button\r\n type=\"button\"\r\n class=\"time-arrow time-arrow-up\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.timePickerBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.timePickerArrowColor || '#5b479c'\r\n }\"\r\n (click)=\"useMeridian ? incrementHour12() : incrementHour()\"\r\n tabindex=\"-1\"\r\n aria-label=\"Increment hour\"\r\n >\r\n <i class=\"ri-arrow-drop-up-line\"></i>\r\n </button>\r\n <input\r\n type=\"number\"\r\n class=\"time-field\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.timePickerBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.timePickerTextColor || '#333'\r\n }\"\r\n [value]=\"getDisplayHour().toString().padStart(2, '0')\"\r\n (input)=\"\r\n useMeridian\r\n ? onHour12InputChange($event)\r\n : onHourInputChange($event)\r\n \"\r\n (keydown)=\"onTimeKeydown($event, 'hour')\"\r\n [min]=\"useMeridian ? 1 : 0\"\r\n [max]=\"useMeridian ? 12 : 23\"\r\n aria-label=\"Hour\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"time-arrow time-arrow-down\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.timePickerBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.timePickerArrowColor || '#5b479c'\r\n }\"\r\n (click)=\"useMeridian ? decrementHour12() : decrementHour()\"\r\n tabindex=\"-1\"\r\n aria-label=\"Decrement hour\"\r\n >\r\n <i class=\"ri-arrow-drop-down-line\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Colon Separator -->\r\n <span\r\n class=\"time-colon\"\r\n [ngStyle]=\"{\r\n color: styles.timePickerColonColor || '#5b479c'\r\n }\"\r\n >:</span\r\n >\r\n\r\n <!-- Minute Input with Arrows -->\r\n <div class=\"time-input-container\">\r\n <button\r\n type=\"button\"\r\n class=\"time-arrow time-arrow-up\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.timePickerBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.timePickerArrowColor || '#5b479c'\r\n }\"\r\n (click)=\"incrementMinute()\"\r\n tabindex=\"-1\"\r\n aria-label=\"Increment minute\"\r\n >\r\n <i class=\"ri-arrow-drop-up-line\"></i>\r\n </button>\r\n <input\r\n type=\"number\"\r\n class=\"time-field\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.timePickerBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.timePickerTextColor || '#333'\r\n }\"\r\n [value]=\"selectedTime.minute.toString().padStart(2, '0')\"\r\n (input)=\"onMinuteInputChange($event)\"\r\n (keydown)=\"onTimeKeydown($event, 'minute')\"\r\n min=\"0\"\r\n max=\"59\"\r\n aria-label=\"Minute\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"time-arrow time-arrow-down\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.timePickerBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.timePickerArrowColor || '#5b479c'\r\n }\"\r\n (click)=\"decrementMinute()\"\r\n tabindex=\"-1\"\r\n aria-label=\"Decrement minute\"\r\n >\r\n <i class=\"ri-arrow-drop-down-line\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- AM/PM Button Group (only when useMeridian=true) -->\r\n <!-- BACKWARD COMPATIBILITY: This only renders when useMeridian=true -->\r\n <div class=\"meridian-toggle-group\" *ngIf=\"useMeridian\">\r\n <button\r\n type=\"button\"\r\n class=\"meridian-btn\"\r\n [class.active]=\"meridian === 'AM'\"\r\n [ngStyle]=\"\r\n meridian === 'AM'\r\n ? {\r\n 'background-color':\r\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\r\n 'border-color':\r\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\r\n color: styles.meridianActiveTextColor || '#ffffff'\r\n }\r\n : {\r\n 'background-color': styles.meridianBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.meridianTextColor || '#666'\r\n }\r\n \"\r\n (click)=\"meridian !== 'AM' && toggleMeridian()\"\r\n aria-label=\"Select AM\"\r\n >\r\n AM\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"meridian-btn\"\r\n [class.active]=\"meridian === 'PM'\"\r\n [ngStyle]=\"\r\n meridian === 'PM'\r\n ? {\r\n 'background-color':\r\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\r\n 'border-color':\r\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\r\n color: styles.meridianActiveTextColor || '#ffffff'\r\n }\r\n : {\r\n 'background-color': styles.meridianBgColor || '#ffffff',\r\n 'border-color': styles.timePickerBorderColor || '#ddd',\r\n color: styles.meridianTextColor || '#666'\r\n }\r\n \"\r\n (click)=\"meridian !== 'PM' && toggleMeridian()\"\r\n aria-label=\"Select PM\"\r\n >\r\n PM\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"confirm-btn\"\r\n [disabled]=\"\r\n isRequired &&\r\n ((!selectedDay && !multiple) ||\r\n (!multipleSelectedDates.length && multiple))\r\n \"\r\n (click)=\"onConfirmClicked()\"\r\n *ngIf=\"showConfirmButton\"\r\n [ngStyle]=\"{\r\n 'background-color': styles.secondaryColor,\r\n color: styles.confirmBtnTextColor,\r\n 'font-family': styles.fontFamily,\r\n 'border-radius': styles.borderRadius\r\n }\"\r\n >\r\n {{ submitTextButton }}\r\n </button>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { HijriGregorianDatepickerComponent } from './hijri-gregorian-datepicker.component';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@NgModule({\r\n declarations: [HijriGregorianDatepickerComponent],\r\n imports: [FormsModule, ReactiveFormsModule, CommonModule],\r\n exports: [HijriGregorianDatepickerComponent],\r\n})\r\nexport class HijriGregorianDatepickerModule {}\r\n","/*\r\n * Public API Surface of hijri-gregorian-datepicker\r\n */\r\n\r\nexport * from './_services/date-utilities.service';\r\nexport * from './lib/hijri-gregorian-datepicker.component';\r\nexport * from './lib/hijri-gregorian-datepicker.module';\r\nexport * from './_interfaces/calendar-model'; // Export interfaces including TimeValue\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["datesDictionary['default']","i2.DateUtilitiesService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}