{"version":3,"file":"date-panel.vue2.mjs","sources":["../../../components/date-picker/date-panel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Button } from '@/components/button'\nimport { CalendarPanel } from '@/components/calendar-panel'\nimport { Icon } from '@/components/icon'\nimport { ResizeObserver } from '@/components/resize-observer'\n\nimport { computed, onMounted, reactive, ref, watch } from 'vue'\n\nimport TimeWheel from './time-wheel.vue'\nimport { useIcons, useNameHelper } from '@vexip-ui/config'\nimport { callIfFunc, range as rangeNumbers, toDate } from '@vexip-ui/utils'\nimport { useRtl } from '@vexip-ui/hooks'\nimport { datePickerTypes } from './symbol'\n\nimport type { PropType } from 'vue'\nimport type { MonthIndex } from '@/components/calendar'\nimport type { LocaleConfig } from '@vexip-ui/config'\nimport type { Dateable } from '@vexip-ui/utils'\nimport type {\n  DatePanelSlots,\n  DatePickerType,\n  DateShortcut,\n  DateShortcutsPlacement,\n  DateTimeType,\n  DateType,\n  DisabledTime,\n  TimeType\n} from './symbol'\n\ndefineOptions({ name: 'DatePanel' })\n\nconst props = defineProps({\n  type: {\n    default: 'date' as DatePickerType,\n    validator: (value: DatePickerType) => datePickerTypes.includes(value)\n  },\n  enabled: {\n    type: Object as PropType<Record<DateTimeType, boolean>>,\n    default: () => ({})\n  },\n  startValue: {\n    type: Object as PropType<Record<DateTimeType, number>>,\n    default: null\n  },\n  endValue: {\n    type: Object as PropType<Record<DateTimeType, number>>,\n    default: null\n  },\n  shortcuts: {\n    type: Array as PropType<DateShortcut[]>,\n    default: () => []\n  },\n  confirmText: {\n    type: String,\n    default: null\n  },\n  cancelText: {\n    type: String,\n    default: null\n  },\n  today: {\n    type: [Number, String, Date] as PropType<Dateable>,\n    default: () => new Date()\n  },\n  disabledDate: {\n    type: Function as PropType<(date: Date) => boolean>,\n    default: () => false\n  },\n  noAction: {\n    type: Boolean,\n    default: false\n  },\n  steps: {\n    type: Array as PropType<number[]>,\n    default: () => [1, 1, 1]\n  },\n  range: {\n    type: Boolean,\n    default: false\n  },\n  startActivated: {\n    type: Object as PropType<Record<DateTimeType, boolean>>,\n    default: () => ({})\n  },\n  endActivated: {\n    type: Object as PropType<Record<DateTimeType, boolean>>,\n    default: () => ({})\n  },\n  min: {\n    type: [Number, String, Date] as PropType<Dateable>,\n    default: null\n  },\n  max: {\n    type: [Number, String, Date] as PropType<Dateable>,\n    default: null\n  },\n  disabledTime: {\n    type: Object as PropType<DisabledTime>,\n    default: () => ({})\n  },\n  hasError: {\n    type: Boolean,\n    default: false\n  },\n  locale: {\n    type: Object as PropType<LocaleConfig['calendar'] & LocaleConfig['datePicker']>,\n    default: () => ({})\n  },\n  selectingType: {\n    type: String as PropType<'start' | 'end'>,\n    default: 'start'\n  },\n  weekStart: {\n    type: Number,\n    default: null\n  },\n  staticWheel: {\n    type: Boolean,\n    default: false\n  },\n  shortcutsPlacement: {\n    type: String as PropType<DateShortcutsPlacement>,\n    default: 'left'\n  },\n  labeledBy: {\n    type: String,\n    default: undefined\n  }\n})\n\nconst emit = defineEmits([\n  'click',\n  'shortcut',\n  'toggle-col',\n  'change',\n  'cancel',\n  'confirm',\n  'hover',\n  'type-change',\n  'time-change'\n])\n\ndefineSlots<DatePanelSlots>()\n\nconst nh = useNameHelper('date-picker')\nconst icons = useIcons()\nconst { isRtl } = useRtl()\n\nconst today = toDate(props.today)\nconst monthRange = rangeNumbers(12, 1, 1)\n\nconst currentPanel = ref<DateType>(\n  props.type === 'year' ? 'year' : props.type === 'month' ? 'month' : 'date'\n)\nconst calendarYear = ref(today.getFullYear())\nconst calendarMonth = ref(today.getMonth() + 1) // 1 ~ 12\nconst hoveredYear = ref(0) // 0 is no hover (falsy)\nconst hoveredMonth = ref(0) // 0 is no hover (falsy)\nconst yearRange = ref<number[]>([])\n\nconst shortcutsRect = reactive({ width: 0, height: 0 })\n\nconst panelStyle = computed(() => {\n  const { width, height } = shortcutsRect\n\n  switch (props.shortcutsPlacement) {\n    case 'top':\n      return { paddingTop: `${height}px` }\n    case 'right':\n      return { paddingRight: `${width}px` }\n    case 'bottom':\n      return { paddingBottom: `${height}px` }\n    default:\n      return { paddingLeft: `${width}px` }\n  }\n})\nconst startActivated = computed(() => {\n  const activated = props.startActivated\n\n  return activated.year && activated.month && activated.date\n})\nconst endActivated = computed(() => {\n  const activated = props.endActivated\n\n  return activated.year && activated.month && activated.date\n})\nconst isDatetime = computed(() => {\n  return props.type === 'datetime'\n})\nconst calendarValue = computed(() => {\n  return props.range\n    ? startActivated.value || endActivated.value\n      ? [getStringValue('start'), getStringValue('end')]\n      : ['', '']\n    : startActivated.value\n      ? getStringValue('start')\n      : ''\n})\nconst weekDays = computed(() => {\n  return [\n    props.locale.week7,\n    props.locale.week1,\n    props.locale.week2,\n    props.locale.week3,\n    props.locale.week4,\n    props.locale.week5,\n    props.locale.week6\n  ].map(week => week.slice(0, 2))\n})\n\nwatch(\n  calendarYear,\n  value => {\n    yearRange.value = rangeNumbers(12, Math.floor(value / 10) * 10, 1)\n  },\n  { immediate: true }\n)\n\nonMounted(() => {\n  refreshCalendar('start')\n})\n\ndefineExpose({ refreshCalendar })\n\nfunction getStringValue(type: 'start' | 'end') {\n  const value = type === 'start' ? props.startValue : props.endValue\n\n  return value ? `${value.year}-${value.month}-${value.date}` : ''\n}\n\nfunction getMonthLabel(index: number) {\n  return props.locale[`month${index as MonthIndex}`]\n}\n\nfunction togglePanel(type: DateType) {\n  currentPanel.value = type\n}\n\nfunction adjustCalendar(type: 'year' | 'month', amount: number) {\n  if (type === 'year') {\n    calendarYear.value += amount\n  } else {\n    // 月份存在进位\n    calendarMonth.value += amount\n\n    const date = new Date(calendarYear.value, calendarMonth.value - 1, 1)\n\n    calendarYear.value = date.getFullYear()\n    calendarMonth.value = date.getMonth() + 1\n  }\n}\n\nfunction handleClick(event: MouseEvent) {\n  emit('click', event)\n}\n\nfunction handleShortcut(index: number) {\n  const { value, name } = props.shortcuts[index]\n\n  emit('shortcut', name, callIfFunc(value))\n}\n\nfunction handleSelectDate(date: Date) {\n  emitChange([date.getFullYear(), date.getMonth() + 1, date.getDate()])\n}\n\nfunction handleSelectYear(year: number) {\n  if (isDisabledYear(year)) return\n\n  calendarYear.value = year\n\n  if (props.type !== 'year') {\n    togglePanel('month')\n  } else {\n    emitChange([year, 1, 1])\n  }\n}\n\nfunction handleSelectMonth(month: number) {\n  if (isDisabledMonth(month)) return\n\n  calendarMonth.value = month\n\n  if (props.type !== 'month') {\n    togglePanel('date')\n  } else {\n    emitChange([calendarYear.value, month, 1])\n  }\n}\n\nfunction emitChange(values: number[]) {\n  emit('change', values)\n}\n\nfunction handleStartTimeChange(type: TimeType, time: number) {\n  emit('time-change', 'start', type, time)\n}\n\nfunction handleEndTimeChange(type: TimeType, time: number) {\n  emit('time-change', 'end', type, time)\n}\n\nfunction handleDoublePrevClick() {\n  if (currentPanel.value === 'year') {\n    yearRange.value = rangeNumbers(12, yearRange.value[0] - 10, 1)\n  } else {\n    adjustCalendar('year', -1)\n  }\n}\nfunction handleDoubleNextClick() {\n  if (currentPanel.value === 'year') {\n    yearRange.value = rangeNumbers(12, yearRange.value[10], 1)\n  } else {\n    adjustCalendar('year', 1)\n  }\n}\n\nfunction handleCancel() {\n  emit('cancel')\n}\n\nfunction handleConfirm() {\n  emit('confirm')\n}\n\nfunction handleHoverDate(date: Date | null) {\n  emit('hover', date)\n}\n\nfunction isSelectedYear(year: number) {\n  if (!year) return false\n\n  return (\n    (props.startActivated.year && props.startValue.year === year) ||\n    (props.endActivated.year && props.endValue.year === year)\n  )\n}\n\nfunction isSelectedMonth(month: number) {\n  if (!month) return false\n\n  const monthYear = 100 * calendarYear.value + month\n\n  return (\n    (props.startActivated.month &&\n      100 * props.startValue.year + props.startValue.month === monthYear) ||\n    (props.endActivated.month && 100 * props.endValue.year + props.endValue.month === monthYear)\n  )\n}\n\nfunction isDisabledYear(year: number) {\n  if (props.type === 'year') {\n    return props.disabledDate(new Date(year, 0))\n  }\n\n  for (let i = 1; i <= 12; ++i) {\n    if (!isDisabledMonth(i, year)) {\n      return false\n    }\n  }\n\n  return true\n}\n\nfunction isDisabledMonth(month: number, year = calendarYear.value) {\n  if (props.type === 'year') return false\n\n  if (props.type === 'month') {\n    return props.disabledDate(new Date(year, month - 1))\n  }\n\n  const current = new Date(year, month - 1)\n  const end = new Date(year, month, 0)\n  const dayCount = end.getDate()\n\n  for (let i = 1; i <= dayCount; ++i) {\n    current.setDate(i)\n\n    if (!props.disabledDate(current)) {\n      return false\n    }\n  }\n\n  return true\n}\n\nfunction handleYearHover(year: number) {\n  hoveredYear.value = isDisabledYear(year) ? 0 : year\n}\n\nfunction handleMonthHover(month: number) {\n  hoveredMonth.value = isDisabledMonth(month) ? 0 : month\n}\n\nfunction isYearInRange(year: number) {\n  if (\n    !props.range ||\n    (!hoveredYear.value && !props.startActivated.year && !props.endActivated.year)\n  ) {\n    return false\n  }\n\n  // if (\n  //   (props.valueType === 'start' && !props.endActivated.year) ||\n  //   (props.valueType === 'end' && !props.startActivated.year)\n  // ) {\n  //   return false\n  // }\n\n  const startYear = props.startValue.year\n  const endYear = props.endValue.year\n\n  let min: number\n  let max: number\n\n  if (!hoveredYear.value && props.startActivated.year && props.endActivated.year) {\n    min = Math.min(startYear, endYear)\n    max = Math.max(startYear, endYear)\n  } else if (hoveredYear.value) {\n    if (!props.startActivated.year && !props.endActivated.year) return false\n\n    if (!props.startActivated.year || !props.endActivated.year) {\n      const selectedYear = props.startActivated.year ? startYear : endYear\n\n      min = Math.min(hoveredYear.value, selectedYear)\n      max = Math.max(hoveredYear.value, selectedYear)\n    } else {\n      const minYear = Math.min(startYear, endYear)\n      const maxYear = Math.max(startYear, endYear)\n\n      min = Math.min(hoveredYear.value, minYear)\n      max = Math.max(hoveredYear.value, maxYear)\n    }\n  } else {\n    return false\n  }\n\n  return year >= min && year <= max\n}\n\nfunction isMonthInRange(month: number) {\n  if (\n    !props.range ||\n    (!hoveredMonth.value && !props.startActivated.month && !props.endActivated.month)\n  ) {\n    return false\n  }\n\n  // if (\n  //   (props.valueType === 'start' && !props.endActivated.month) ||\n  //   (props.valueType === 'end' && !props.startActivated.month)\n  // ) {\n  //   return false\n  // }\n\n  const startMonthYear = 100 * props.startValue.year + props.startValue.month\n  const endMonthYear = 100 * props.endValue.year + props.endValue.month\n\n  let min: number\n  let max: number\n\n  if (!hoveredMonth.value && props.startActivated.month && props.endActivated.month) {\n    min = Math.min(startMonthYear, endMonthYear)\n    max = Math.max(startMonthYear, endMonthYear)\n  } else if (hoveredMonth.value) {\n    if (!props.startActivated.month && !props.endActivated.month) return false\n\n    const hoveredMonthYear = 100 * calendarYear.value + hoveredMonth.value\n\n    if (!props.startActivated.month || !props.endActivated.month) {\n      const selectedMonthYear = props.startActivated.month ? startMonthYear : endMonthYear\n\n      min = Math.min(hoveredMonthYear, selectedMonthYear)\n      max = Math.max(hoveredMonthYear, selectedMonthYear)\n    } else {\n      const minMonthYear = Math.min(startMonthYear, endMonthYear)\n      const maxMonthYear = Math.max(startMonthYear, endMonthYear)\n\n      min = Math.min(hoveredMonthYear, minMonthYear)\n      max = Math.max(hoveredMonthYear, maxMonthYear)\n    }\n  } else {\n    return false\n  }\n\n  const monthYear = 100 * calendarYear.value + month\n\n  return monthYear >= min && monthYear <= max\n}\n\n// 重新计算日历页面\nfunction refreshCalendar(valueType: 'start' | 'end') {\n  const today = toDate(props.today)\n\n  if (valueType === 'start') {\n    calendarYear.value = props.startActivated.year ? props.startValue.year : today.getFullYear()\n    calendarMonth.value = props.startActivated.month ? props.startValue.month : today.getMonth() + 1\n  } else {\n    calendarYear.value = props.endActivated.year ? props.endValue.year : today.getFullYear()\n    calendarMonth.value = props.endActivated.month ? props.endValue.month : today.getMonth() + 1\n  }\n}\n\nfunction handleShortcutsResize(entry: ResizeObserverEntry) {\n  const box = entry.borderBoxSize?.[0]\n\n  if (box) {\n    shortcutsRect.width = box.inlineSize\n    shortcutsRect.height = box.blockSize\n  } else {\n    shortcutsRect.width = entry.contentRect.width\n    shortcutsRect.height = entry.contentRect.height\n  }\n}\n</script>\n\n<template>\n  <div\n    :class=\"{\n      [nh.be('panel')]: true,\n      [nh.bem('panel', 'vertical')]:\n        shortcuts.length && (shortcutsPlacement === 'top' || shortcutsPlacement === 'bottom')\n    }\"\n    :aria-labelledby=\"labeledBy\"\n    :style=\"panelStyle\"\n    @click=\"handleClick\"\n  >\n    <ResizeObserver v-if=\"shortcuts.length\" :on-resize=\"handleShortcutsResize\">\n      <div\n        :class=\"[\n          nh.be('list'),\n          nh.bem('list', 'sub'),\n          nh.be('shortcuts'),\n          nh.bem('shortcuts', shortcutsPlacement)\n        ]\"\n      >\n        <div\n          v-for=\"(item, index) in shortcuts\"\n          :key=\"index\"\n          :class=\"nh.be('shortcut')\"\n          :title=\"item.name\"\n          @click=\"handleShortcut(index)\"\n        >\n          {{ item.name }}\n        </div>\n      </div>\n    </ResizeObserver>\n    <div :class=\"nh.be('list')\" role=\"application\">\n      <div :class=\"nh.be('panel-body')\">\n        <div :class=\"nh.be('date-panel')\">\n          <div :class=\"nh.be('header')\">\n            <div :class=\"[nh.be('arrow'), nh.be('prev-year')]\" @click=\"handleDoublePrevClick\">\n              <Icon v-bind=\"isRtl ? icons.anglesRight : icons.anglesLeft\"></Icon>\n            </div>\n            <div\n              v-show=\"currentPanel === 'date'\"\n              :class=\"[nh.be('arrow'), nh.be('prev-month')]\"\n              @click=\"adjustCalendar('month', -1)\"\n            >\n              <Icon v-bind=\"isRtl ? icons.angleRight : icons.angleLeft\"></Icon>\n            </div>\n            <div :class=\"nh.be('year-month')\">\n              <slot\n                name=\"title\"\n                :panel=\"currentPanel\"\n                :year-start=\"yearRange[0]\"\n                :year=\"calendarYear\"\n                :month=\"calendarMonth\"\n                :toggle-panel=\"togglePanel\"\n              >\n                <div key=\"year\" :class=\"nh.be('year')\" @click.stop=\"togglePanel('year')\">\n                  <template v-if=\"currentPanel === 'year'\">\n                    {{ `${yearRange[0]}${locale.year} - ${yearRange[9]}${locale.year}` }}\n                  </template>\n                  <template v-else>\n                    {{ `${calendarYear}${locale.year}` }}\n                  </template>\n                </div>\n                <div\n                  v-show=\"currentPanel === 'date'\"\n                  :class=\"nh.be('month')\"\n                  @click.stop=\"togglePanel('month')\"\n                >\n                  {{ getMonthLabel(calendarMonth) }}\n                </div>\n              </slot>\n            </div>\n            <div\n              v-show=\"currentPanel === 'date'\"\n              :class=\"[nh.be('arrow'), nh.be('next-month')]\"\n              @click=\"adjustCalendar('month', 1)\"\n            >\n              <Icon v-bind=\"isRtl ? icons.angleLeft : icons.angleRight\"></Icon>\n            </div>\n            <div :class=\"[nh.be('arrow'), nh.be('next-year')]\" @click=\"handleDoubleNextClick\">\n              <Icon v-bind=\"isRtl ? icons.anglesLeft : icons.anglesRight\"></Icon>\n            </div>\n          </div>\n          <div :class=\"nh.be('calendar')\">\n            <div\n              v-if=\"currentPanel === 'year'\"\n              :class=\"nh.be('year-panel')\"\n              @mouseleave=\"hoveredYear = 0\"\n            >\n              <div\n                v-for=\"(item, index) in yearRange\"\n                :key=\"index\"\n                :class=\"{\n                  [nh.be('year-item')]: true,\n                  [nh.bem('year-item', 'selected')]: isSelectedYear(item),\n                  [nh.bem('year-item', 'next')]: index > 9,\n                  [nh.bem('year-item', 'disabled')]: isDisabledYear(item),\n                  [nh.bem('year-item', 'in-range')]: isYearInRange(item)\n                }\"\n                @click.stop=\"handleSelectYear(item)\"\n                @mouseenter=\"handleYearHover(item)\"\n              >\n                <div :class=\"nh.be('year-label')\">\n                  <slot\n                    name=\"year\"\n                    :year=\"item\"\n                    :selected=\"isSelectedYear(item)\"\n                    :is-next=\"index > 9\"\n                    :disabled=\"isDisabledYear(item)\"\n                    :in-range=\"isYearInRange(item)\"\n                  >\n                    <div :class=\"nh.be('year-label-inner')\">\n                      {{ item }}\n                    </div>\n                  </slot>\n                </div>\n              </div>\n            </div>\n            <div\n              v-else-if=\"currentPanel === 'month'\"\n              :class=\"nh.be('month-panel')\"\n              @mouseleave=\"hoveredMonth = 0\"\n            >\n              <div\n                v-for=\"index in monthRange\"\n                :key=\"index\"\n                :class=\"{\n                  [nh.be('month-item')]: true,\n                  [nh.bem('month-item', 'selected')]: isSelectedMonth(index),\n                  [nh.bem('month-item', 'disabled')]: isDisabledMonth(index),\n                  [nh.bem('month-item', 'in-range')]: isMonthInRange(index)\n                }\"\n                @click.stop=\"handleSelectMonth(index)\"\n                @mouseenter=\"handleMonthHover(index)\"\n              >\n                <div :class=\"nh.be('month-label')\">\n                  <slot\n                    name=\"month\"\n                    :year=\"calendarYear\"\n                    :month=\"index\"\n                    :selected=\"isSelectedMonth(index)\"\n                    :disabled=\"isDisabledMonth(index)\"\n                    :in-range=\"isMonthInRange(index)\"\n                  >\n                    <div :class=\"nh.be('month-label-inner')\">\n                      {{ getMonthLabel(index) }}\n                    </div>\n                  </slot>\n                </div>\n              </div>\n            </div>\n            <CalendarPanel\n              v-else\n              inherit\n              :value=\"calendarValue\"\n              :year=\"calendarYear\"\n              :month=\"calendarMonth\"\n              :value-type=\"selectingType\"\n              :disabled-date=\"disabledDate\"\n              :range=\"range\"\n              :min=\"min\"\n              :max=\"max\"\n              :week-start=\"weekStart\"\n              :week-days=\"weekDays\"\n              @select=\"handleSelectDate\"\n              @hover=\"handleHoverDate\"\n            >\n              <template v-if=\"$slots.week\" #week=\"weekParams\">\n                <slot name=\"week\" v-bind=\"weekParams\"></slot>\n              </template>\n              <template v-if=\"$slots.date\" #itemContent=\"itemParams\">\n                <slot name=\"date\" v-bind=\"itemParams\"></slot>\n              </template>\n            </CalendarPanel>\n          </div>\n        </div>\n        <div v-if=\"isDatetime\" :class=\"nh.be('time-panel')\">\n          <div :class=\"[nh.be('header'), nh.bem('header', 'time')]\">\n            <template v-if=\"range\">\n              <div :class=\"nh.be('title')\">\n                {{ locale.startTime }}\n              </div>\n              <div :class=\"nh.be('title')\">\n                {{ locale.endTime }}\n              </div>\n            </template>\n          </div>\n          <div :class=\"nh.be('wheel')\">\n            <TimeWheel\n              :hour=\"startValue.hour\"\n              :minute=\"startValue.minute\"\n              :second=\"startValue.second\"\n              :candidate=\"3\"\n              :steps=\"steps\"\n              :disabled-time=\"disabledTime\"\n              :no-transition=\"staticWheel\"\n              @change=\"handleStartTimeChange\"\n            ></TimeWheel>\n            <TimeWheel\n              v-if=\"range\"\n              :hour=\"endValue.hour\"\n              :minute=\"endValue.minute\"\n              :second=\"endValue.second\"\n              :candidate=\"3\"\n              :steps=\"steps\"\n              :disabled-time=\"disabledTime\"\n              :no-transition=\"staticWheel\"\n              @change=\"handleEndTimeChange\"\n            ></TimeWheel>\n          </div>\n        </div>\n      </div>\n      <div v-if=\"!noAction\" :class=\"nh.be('action')\">\n        <Button\n          inherit\n          text\n          size=\"small\"\n          @click=\"handleCancel\"\n        >\n          {{ cancelText || locale.cancel }}\n        </Button>\n        <Button\n          inherit\n          type=\"primary\"\n          size=\"small\"\n          :disabled=\"hasError\"\n          @click=\"handleConfirm\"\n        >\n          {{ confirmText || locale.confirm }}\n        </Button>\n      </div>\n    </div>\n  </div>\n</template>\n"],"names":["props","__props","emit","__emit","nh","useNameHelper","icons","useIcons","isRtl","useRtl","today","toDate","monthRange","rangeNumbers","currentPanel","ref","calendarYear","calendarMonth","hoveredYear","hoveredMonth","yearRange","shortcutsRect","reactive","panelStyle","computed","width","height","startActivated","activated","endActivated","isDatetime","calendarValue","getStringValue","weekDays","week","watch","value","onMounted","refreshCalendar","__expose","type","getMonthLabel","index","togglePanel","adjustCalendar","amount","date","handleClick","event","handleShortcut","name","callIfFunc","handleSelectDate","emitChange","handleSelectYear","year","isDisabledYear","handleSelectMonth","month","isDisabledMonth","values","handleStartTimeChange","time","handleEndTimeChange","handleDoublePrevClick","handleDoubleNextClick","handleCancel","handleConfirm","handleHoverDate","isSelectedYear","isSelectedMonth","monthYear","i","current","dayCount","handleYearHover","handleMonthHover","isYearInRange","startYear","endYear","min","max","selectedYear","minYear","maxYear","isMonthInRange","startMonthYear","endMonthYear","hoveredMonthYear","selectedMonthYear","minMonthYear","maxMonthYear","valueType","handleShortcutsResize","entry","box","_a"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,UAAMA,IAAQC,GAmGRC,IAAOC,IAcPC,IAAKC,GAAc,aAAa,GAChCC,IAAQC,GAAS,GACjB,EAAE,OAAAC,EAAM,IAAIC,GAAO,GAEnBC,IAAQC,GAAOX,EAAM,KAAK,GAC1BY,KAAaC,EAAa,IAAI,GAAG,CAAC,GAElCC,IAAeC;AAAA,MACnBf,EAAM,SAAS,SAAS,SAASA,EAAM,SAAS,UAAU,UAAU;AAAA,IACtE,GACMgB,IAAeD,EAAIL,EAAM,YAAA,CAAa,GACtCO,IAAgBF,EAAIL,EAAM,SAAA,IAAa,CAAC,GACxCQ,IAAcH,EAAI,CAAC,GACnBI,IAAeJ,EAAI,CAAC,GACpBK,IAAYL,EAAc,EAAE,GAE5BM,IAAgBC,GAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,GAEhDC,KAAaC,EAAS,MAAM;AAC1B,YAAA,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAWL;AAE1B,cAAQrB,EAAM,oBAAoB;AAAA,QAChC,KAAK;AACH,iBAAO,EAAE,YAAY,GAAG0B,CAAM,KAAK;AAAA,QACrC,KAAK;AACH,iBAAO,EAAE,cAAc,GAAGD,CAAK,KAAK;AAAA,QACtC,KAAK;AACH,iBAAO,EAAE,eAAe,GAAGC,CAAM,KAAK;AAAA,QACxC;AACE,iBAAO,EAAE,aAAa,GAAGD,CAAK,KAAK;AAAA,MAAA;AAAA,IACvC,CACD,GACKE,IAAiBH,EAAS,MAAM;AACpC,YAAMI,IAAY5B,EAAM;AAExB,aAAO4B,EAAU,QAAQA,EAAU,SAASA,EAAU;AAAA,IAAA,CACvD,GACKC,KAAeL,EAAS,MAAM;AAClC,YAAMI,IAAY5B,EAAM;AAExB,aAAO4B,EAAU,QAAQA,EAAU,SAASA,EAAU;AAAA,IAAA,CACvD,GACKE,KAAaN,EAAS,MACnBxB,EAAM,SAAS,UACvB,GACK+B,KAAgBP,EAAS,MACtBxB,EAAM,QACT2B,EAAe,SAASE,GAAa,QACnC,CAACG,EAAe,OAAO,GAAGA,EAAe,KAAK,CAAC,IAC/C,CAAC,IAAI,EAAE,IACTL,EAAe,QACbK,EAAe,OAAO,IACtB,EACP,GACKC,KAAWT,EAAS,MACjB;AAAA,MACLxB,EAAM,OAAO;AAAA,MACbA,EAAM,OAAO;AAAA,MACbA,EAAM,OAAO;AAAA,MACbA,EAAM,OAAO;AAAA,MACbA,EAAM,OAAO;AAAA,MACbA,EAAM,OAAO;AAAA,MACbA,EAAM,OAAO;AAAA,IAAA,EACb,IAAI,CAAAkC,MAAQA,EAAK,MAAM,GAAG,CAAC,CAAC,CAC/B;AAED,IAAAC;AAAA,MACEnB;AAAA,MACA,CAASoB,MAAA;AACG,QAAAhB,EAAA,QAAQP,EAAa,IAAI,KAAK,MAAMuB,IAAQ,EAAE,IAAI,IAAI,CAAC;AAAA,MACnE;AAAA,MACA,EAAE,WAAW,GAAK;AAAA,IACpB,GAEAC,GAAU,MAAM;AACd,MAAAC,GAAgB,OAAO;AAAA,IAAA,CACxB,GAEYC,GAAA,EAAE,iBAAAD,IAAiB;AAEhC,aAASN,EAAeQ,GAAuB;AAC7C,YAAMJ,IAAQI,MAAS,UAAUxC,EAAM,aAAaA,EAAM;AAEnD,aAAAoC,IAAQ,GAAGA,EAAM,IAAI,IAAIA,EAAM,KAAK,IAAIA,EAAM,IAAI,KAAK;AAAA,IAAA;AAGhE,aAASK,EAAcC,GAAe;AACpC,aAAO1C,EAAM,OAAO,QAAQ0C,CAAmB,EAAE;AAAA,IAAA;AAGnD,aAASC,EAAYH,GAAgB;AACnC,MAAA1B,EAAa,QAAQ0B;AAAA,IAAA;AAGd,aAAAI,EAAeJ,GAAwBK,GAAgB;AAC9D,UAAIL,MAAS;AACX,QAAAxB,EAAa,SAAS6B;AAAA,WACjB;AAEL,QAAA5B,EAAc,SAAS4B;AAEjB,cAAAC,IAAO,IAAI,KAAK9B,EAAa,OAAOC,EAAc,QAAQ,GAAG,CAAC;AAEvD,QAAAD,EAAA,QAAQ8B,EAAK,YAAY,GACxB7B,EAAA,QAAQ6B,EAAK,SAAa,IAAA;AAAA,MAAA;AAAA,IAC1C;AAGF,aAASC,GAAYC,GAAmB;AACtC,MAAA9C,EAAK,SAAS8C,CAAK;AAAA,IAAA;AAGrB,aAASC,GAAeP,GAAe;AACrC,YAAM,EAAE,OAAAN,GAAO,MAAAc,EAAA,IAASlD,EAAM,UAAU0C,CAAK;AAE7C,MAAAxC,EAAK,YAAYgD,GAAMC,GAAWf,CAAK,CAAC;AAAA,IAAA;AAG1C,aAASgB,GAAiBN,GAAY;AACzB,MAAAO,EAAA,CAACP,EAAK,YAAA,GAAeA,EAAK,SAAS,IAAI,GAAGA,EAAK,QAAQ,CAAC,CAAC;AAAA,IAAA;AAGtE,aAASQ,GAAiBC,GAAc;AAClC,MAAAC,EAAeD,CAAI,MAEvBvC,EAAa,QAAQuC,GAEjBvD,EAAM,SAAS,SACjB2C,EAAY,OAAO,IAEnBU,EAAW,CAACE,GAAM,GAAG,CAAC,CAAC;AAAA,IACzB;AAGF,aAASE,GAAkBC,GAAe;AACpC,MAAAC,EAAgBD,CAAK,MAEzBzC,EAAc,QAAQyC,GAElB1D,EAAM,SAAS,UACjB2C,EAAY,MAAM,IAElBU,EAAW,CAACrC,EAAa,OAAO0C,GAAO,CAAC,CAAC;AAAA,IAC3C;AAGF,aAASL,EAAWO,GAAkB;AACpC,MAAA1D,EAAK,UAAU0D,CAAM;AAAA,IAAA;AAGd,aAAAC,GAAsBrB,GAAgBsB,GAAc;AACtD,MAAA5D,EAAA,eAAe,SAASsC,GAAMsB,CAAI;AAAA,IAAA;AAGhC,aAAAC,GAAoBvB,GAAgBsB,GAAc;AACpD,MAAA5D,EAAA,eAAe,OAAOsC,GAAMsB,CAAI;AAAA,IAAA;AAGvC,aAASE,KAAwB;AAC3B,MAAAlD,EAAa,UAAU,SACfM,EAAA,QAAQP,EAAa,IAAIO,EAAU,MAAM,CAAC,IAAI,IAAI,CAAC,IAE7DwB,EAAe,QAAQ,EAAE;AAAA,IAC3B;AAEF,aAASqB,KAAwB;AAC3B,MAAAnD,EAAa,UAAU,SACzBM,EAAU,QAAQP,EAAa,IAAIO,EAAU,MAAM,EAAE,GAAG,CAAC,IAEzDwB,EAAe,QAAQ,CAAC;AAAA,IAC1B;AAGF,aAASsB,KAAe;AACtB,MAAAhE,EAAK,QAAQ;AAAA,IAAA;AAGf,aAASiE,KAAgB;AACvB,MAAAjE,EAAK,SAAS;AAAA,IAAA;AAGhB,aAASkE,GAAgBtB,GAAmB;AAC1C,MAAA5C,EAAK,SAAS4C,CAAI;AAAA,IAAA;AAGpB,aAASuB,EAAed,GAAc;AAChC,aAACA,IAGFvD,EAAM,eAAe,QAAQA,EAAM,WAAW,SAASuD,KACvDvD,EAAM,aAAa,QAAQA,EAAM,SAAS,SAASuD,IAJpC;AAAA,IAIoC;AAIxD,aAASe,GAAgBZ,GAAe;AAClC,UAAA,CAACA,EAAc,QAAA;AAEb,YAAAa,IAAY,MAAMvD,EAAa,QAAQ0C;AAG1C,aAAA1D,EAAM,eAAe,SACpB,MAAMA,EAAM,WAAW,OAAOA,EAAM,WAAW,UAAUuE,KAC1DvE,EAAM,aAAa,SAAS,MAAMA,EAAM,SAAS,OAAOA,EAAM,SAAS,UAAUuE;AAAA,IAAA;AAItF,aAASf,EAAeD,GAAc;AAChC,UAAAvD,EAAM,SAAS;AACjB,eAAOA,EAAM,aAAa,IAAI,KAAKuD,GAAM,CAAC,CAAC;AAG7C,eAASiB,IAAI,GAAGA,KAAK,IAAI,EAAEA;AACzB,YAAI,CAACb,EAAgBa,GAAGjB,CAAI;AACnB,iBAAA;AAIJ,aAAA;AAAA,IAAA;AAGT,aAASI,EAAgBD,GAAeH,IAAOvC,EAAa,OAAO;AAC7D,UAAAhB,EAAM,SAAS,OAAe,QAAA;AAE9B,UAAAA,EAAM,SAAS;AACjB,eAAOA,EAAM,aAAa,IAAI,KAAKuD,GAAMG,IAAQ,CAAC,CAAC;AAGrD,YAAMe,IAAU,IAAI,KAAKlB,GAAMG,IAAQ,CAAC,GAElCgB,IADM,IAAI,KAAKnB,GAAMG,GAAO,CAAC,EACd,QAAQ;AAE7B,eAASc,IAAI,GAAGA,KAAKE,GAAU,EAAEF;AAG/B,YAFAC,EAAQ,QAAQD,CAAC,GAEb,CAACxE,EAAM,aAAayE,CAAO;AACtB,iBAAA;AAIJ,aAAA;AAAA,IAAA;AAGT,aAASE,GAAgBpB,GAAc;AACrC,MAAArC,EAAY,QAAQsC,EAAeD,CAAI,IAAI,IAAIA;AAAA,IAAA;AAGjD,aAASqB,GAAiBlB,GAAe;AACvC,MAAAvC,EAAa,QAAQwC,EAAgBD,CAAK,IAAI,IAAIA;AAAA,IAAA;AAGpD,aAASmB,GAActB,GAAc;AACnC,UACE,CAACvD,EAAM,SACN,CAACkB,EAAY,SAAS,CAAClB,EAAM,eAAe,QAAQ,CAACA,EAAM,aAAa;AAElE,eAAA;AAUH,YAAA8E,IAAY9E,EAAM,WAAW,MAC7B+E,IAAU/E,EAAM,SAAS;AAE3B,UAAAgF,GACAC;AAEA,UAAA,CAAC/D,EAAY,SAASlB,EAAM,eAAe,QAAQA,EAAM,aAAa;AAClE,QAAAgF,IAAA,KAAK,IAAIF,GAAWC,CAAO,GAC3BE,IAAA,KAAK,IAAIH,GAAWC,CAAO;AAAA,eACxB7D,EAAY,OAAO;AACxB,YAAA,CAAClB,EAAM,eAAe,QAAQ,CAACA,EAAM,aAAa,KAAa,QAAA;AAEnE,YAAI,CAACA,EAAM,eAAe,QAAQ,CAACA,EAAM,aAAa,MAAM;AAC1D,gBAAMkF,IAAelF,EAAM,eAAe,OAAO8E,IAAYC;AAE7D,UAAAC,IAAM,KAAK,IAAI9D,EAAY,OAAOgE,CAAY,GAC9CD,IAAM,KAAK,IAAI/D,EAAY,OAAOgE,CAAY;AAAA,QAAA,OACzC;AACL,gBAAMC,IAAU,KAAK,IAAIL,GAAWC,CAAO,GACrCK,IAAU,KAAK,IAAIN,GAAWC,CAAO;AAE3C,UAAAC,IAAM,KAAK,IAAI9D,EAAY,OAAOiE,CAAO,GACzCF,IAAM,KAAK,IAAI/D,EAAY,OAAOkE,CAAO;AAAA,QAAA;AAAA,MAC3C;AAEO,eAAA;AAGF,aAAA7B,KAAQyB,KAAOzB,KAAQ0B;AAAA,IAAA;AAGhC,aAASI,GAAe3B,GAAe;AACrC,UACE,CAAC1D,EAAM,SACN,CAACmB,EAAa,SAAS,CAACnB,EAAM,eAAe,SAAS,CAACA,EAAM,aAAa;AAEpE,eAAA;AAUT,YAAMsF,IAAiB,MAAMtF,EAAM,WAAW,OAAOA,EAAM,WAAW,OAChEuF,IAAe,MAAMvF,EAAM,SAAS,OAAOA,EAAM,SAAS;AAE5D,UAAAgF,GACAC;AAEA,UAAA,CAAC9D,EAAa,SAASnB,EAAM,eAAe,SAASA,EAAM,aAAa;AACpE,QAAAgF,IAAA,KAAK,IAAIM,GAAgBC,CAAY,GACrCN,IAAA,KAAK,IAAIK,GAAgBC,CAAY;AAAA,eAClCpE,EAAa,OAAO;AACzB,YAAA,CAACnB,EAAM,eAAe,SAAS,CAACA,EAAM,aAAa,MAAc,QAAA;AAErE,cAAMwF,IAAmB,MAAMxE,EAAa,QAAQG,EAAa;AAEjE,YAAI,CAACnB,EAAM,eAAe,SAAS,CAACA,EAAM,aAAa,OAAO;AAC5D,gBAAMyF,IAAoBzF,EAAM,eAAe,QAAQsF,IAAiBC;AAElE,UAAAP,IAAA,KAAK,IAAIQ,GAAkBC,CAAiB,GAC5CR,IAAA,KAAK,IAAIO,GAAkBC,CAAiB;AAAA,QAAA,OAC7C;AACL,gBAAMC,IAAe,KAAK,IAAIJ,GAAgBC,CAAY,GACpDI,KAAe,KAAK,IAAIL,GAAgBC,CAAY;AAEpD,UAAAP,IAAA,KAAK,IAAIQ,GAAkBE,CAAY,GACvCT,IAAA,KAAK,IAAIO,GAAkBG,EAAY;AAAA,QAAA;AAAA,MAC/C;AAEO,eAAA;AAGH,YAAApB,IAAY,MAAMvD,EAAa,QAAQ0C;AAEtC,aAAAa,KAAaS,KAAOT,KAAaU;AAAA,IAAA;AAI1C,aAAS3C,GAAgBsD,GAA4B;AAC7ClF,YAAAA,IAAQC,GAAOX,EAAM,KAAK;AAEhC,MAAI4F,MAAc,WACH5E,EAAA,QAAQhB,EAAM,eAAe,OAAOA,EAAM,WAAW,OAAOU,EAAM,YAAY,GAC7EO,EAAA,QAAQjB,EAAM,eAAe,QAAQA,EAAM,WAAW,QAAQU,EAAM,SAAa,IAAA,MAElFM,EAAA,QAAQhB,EAAM,aAAa,OAAOA,EAAM,SAAS,OAAOU,EAAM,YAAY,GACzEO,EAAA,QAAQjB,EAAM,aAAa,QAAQA,EAAM,SAAS,QAAQU,EAAM,SAAa,IAAA;AAAA,IAC7F;AAGF,aAASmF,GAAsBC,GAA4B;;AACnD,YAAAC,KAAMC,IAAAF,EAAM,kBAAN,gBAAAE,EAAsB;AAElC,MAAID,KACF1E,EAAc,QAAQ0E,EAAI,YAC1B1E,EAAc,SAAS0E,EAAI,cAEb1E,EAAA,QAAQyE,EAAM,YAAY,OAC1BzE,EAAA,SAASyE,EAAM,YAAY;AAAA,IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}