@k2b/ui 0.25.0 → 0.26.0
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.
- package/dist/browser/actions/GestureMenu.js +2 -2
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/content/Calendar.js +8 -7
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +4 -3
- package/dist/browser/content/CalendarDayView.js.map +1 -1
- package/dist/browser/content/CalendarWeekView.js +4 -3
- package/dist/browser/content/CalendarWeekView.js.map +1 -1
- package/dist/browser/content/Timeline.js +3 -3
- package/dist/browser/content/Timeline.js.map +1 -1
- package/dist/browser/content/calendar-time-view.js +0 -1
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/index.js +1 -0
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +22 -3
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/QrScanner.js +2 -1
- package/dist/browser/inputs/QrScanner.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +12 -13
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +4 -4
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/scroll-fade.js +14 -9
- package/dist/browser/layout/scroll-fade.js.map +1 -1
- package/dist/browser/layout/sidebar-scroll-memory.js +38 -0
- package/dist/browser/layout/sidebar-scroll-memory.js.map +1 -0
- package/dist/browser/motion.js +7 -0
- package/dist/browser/motion.js.map +1 -0
- package/dist/ssr/actions/GestureMenu.js +2 -2
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/content/Calendar.js +8 -7
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +4 -3
- package/dist/ssr/content/CalendarDayView.js.map +1 -1
- package/dist/ssr/content/CalendarWeekView.js +4 -3
- package/dist/ssr/content/CalendarWeekView.js.map +1 -1
- package/dist/ssr/content/Timeline.js +3 -3
- package/dist/ssr/content/Timeline.js.map +1 -1
- package/dist/ssr/content/calendar-time-view.js +0 -1
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/index.js +1 -0
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +18 -3
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/QrScanner.js +2 -1
- package/dist/ssr/inputs/QrScanner.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +12 -13
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +4 -4
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/scroll-fade.js +14 -9
- package/dist/ssr/layout/scroll-fade.js.map +1 -1
- package/dist/ssr/layout/sidebar-scroll-memory.js +38 -0
- package/dist/ssr/layout/sidebar-scroll-memory.js.map +1 -0
- package/dist/ssr/motion.js +7 -0
- package/dist/ssr/motion.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/types/content/calendar-time-view.d.ts +0 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/inputs/Combobox.d.ts +1 -0
- package/dist/types/layout/scroll-fade.d.ts +2 -0
- package/dist/types/layout/sidebar-scroll-memory.d.ts +6 -0
- package/dist/types/motion.d.ts +6 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/calendar-time-view.tsx"],"sourcesContent":["import { dates as calendar, type DateContext } from \"@k2b/stdlib\";\nimport { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport type { CalendarController, CalendarEvent, CalendarEventTimeChange, CalendarExternalDrag, CalendarLabels } from \"./Calendar\";\nimport {\n addDayKeys,\n buildDays,\n type CalendarDayHours,\n clockAt,\n DAY_MINUTES,\n type DayEntry,\n type DayGap,\n type DayGeometry,\n type DayLane,\n type DayModel,\n type DaySpan,\n dayKeyOf,\n dayLanes,\n dayMinuteAt,\n dayTopTerms,\n dayYTerms,\n freeGaps,\n GAP_LABEL_MINUTES,\n GAP_LONG_MINUTES,\n gapProposal,\n instantInDay,\n instantsInDay,\n minuteInDay,\n readDayGeometry,\n resizedInDay,\n snapMinutes,\n subtractTerms,\n termsCss,\n wakeMinutes,\n} from \"./calendar-days\";\nimport { useCalendarMessages } from \"./calendar-messages\";\nimport { startCalendarPointerSession } from \"./calendar-pointer\";\nimport {\n type CalendarOwner,\n type CalendarStop,\n EventChip,\n eventHref,\n type NormalizedEvent,\n ownerDateConfig,\n parseDate,\n placeCalendarPopover,\n validDate,\n} from \"./calendar-shared\";\n\n/**\n * Shared state and parts of the day and week views with `dayHours`: the time model of the loaded days, the selection,\n * the quick create, pointer gestures, and the pieces both views draw into a day's timeline.\n */\n\nexport type TodayDirection = \"left\" | \"right\" | \"up\" | \"down\" | \"\";\n\n/** What the header and the calendar's controller ask of the active day or week view. */\nexport type TimeViewHandle = {\n /** The first and last day the reader sees. */\n visibleKeys: () => { first: string; last: string };\n /** Moves by a day (day view) or a week (week view) when that is loaded; `false` leaves it to the header's link. */\n step: (direction: -1 | 1) => boolean;\n /** Shows a day when it is loaded; `false` leaves it to navigation. */\n goTo: (key: string) => boolean;\n /** Shows today and now when they are loaded. */\n today: () => boolean;\n todayDirection: () => TodayDirection;\n controller: CalendarController;\n};\n\nexport type TimeViewProps = {\n owner: CalendarOwner;\n view: \"day\" | \"week\";\n date: Date;\n now: Date;\n events: readonly CalendarEvent[];\n labels: Required<CalendarLabels>;\n hours: CalendarDayHours;\n register: (handle: TimeViewHandle | null) => void;\n};\n\nexport type TimeSelection = { key: string; start?: number; end?: number };\n\ntype Ghost = {\n key: string;\n start: number;\n end: number;\n title: string;\n time: string;\n colorHex?: string;\n color?: string;\n warn?: boolean;\n fit?: { fits: boolean; text: string };\n};\n\ntype QuickCreate = {\n range: CalendarEventTimeChange;\n anchor: Element | DOMRect;\n create?: string;\n key: string;\n start?: number;\n end?: number;\n};\n\nexport type BodyHit = { key: string; element: HTMLElement; geometry: DayGeometry; minute: number };\n\nconst COLOR_TOKENS: Record<string, string> = {\n blue: \"#3b82f6\",\n emerald: \"#10b981\",\n amber: \"#f59e0b\",\n red: \"#ef4444\",\n violet: \"#8b5cf6\",\n cyan: \"#06b6d4\",\n zinc: \"#a1a1aa\",\n};\nexport const eventAccent = (event: Pick<CalendarEvent, \"color\" | \"colorHex\">): string =>\n event.colorHex ?? COLOR_TOKENS[event.color ?? \"blue\"]!;\n\n/** Minimum minutes an overlap counts for a band, about the height of its title. */\nconst LANE_MINUTES = 20;\n\nexport const reducedMotion = () =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n/** Swallows the click a browser sends right after a gesture ends, never the next one. */\nexport const swallowNextClick = () => {\n const stop = (event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n };\n window.addEventListener(\"click\", stop, { capture: true, once: true });\n window.setTimeout(() => window.removeEventListener(\"click\", stop, { capture: true }), 120);\n};\n\nexport const createTimeView = (props: TimeViewProps) => {\n const messages = useCalendarMessages();\n const dateConfig = createMemo((): DateContext => ownerDateConfig(props.owner));\n const hours = () => props.hours;\n const wake = createMemo(() => wakeMinutes(props.hours));\n const keyOf = (date: Date) => calendar.formatDateKey(date, dateConfig());\n const parseKey = (key: string) => calendar.parseCalendarDate(key, dateConfig());\n\n /** The loaded days: the host's range, or the day or the week of the date. */\n const range = createMemo(\n () => {\n const context = dateConfig();\n const loaded = props.owner.range;\n if (loaded) {\n const from = parseDate(loaded.from, context);\n const to = parseDate(loaded.to, context);\n if (validDate(from) && validDate(to)) {\n const first = calendar.formatDateKey(from, context);\n const last = calendar.formatDateKey(new Date(Math.max(from.getTime(), to.getTime() - 1)), context);\n return { first, last };\n }\n }\n const key = calendar.formatDateKey(props.date, context);\n if (props.view === \"day\") return { first: key, last: key };\n const start = calendar.formatDateKey(calendar.startOfWeek(props.date, context), context);\n return { first: start, last: addDayKeys(start, 6) };\n },\n undefined,\n { equals: (left, right) => left.first === right.first && left.last === right.last },\n );\n const anchorKey = createMemo(() => keyOf(props.date));\n\n /** Checkbox states the reader just set, shown until the host's events agree or drop the entry. */\n const [checks, setChecks] = createSignal<Record<string, boolean>>({});\n const [justChecked, setJustChecked] = createSignal<ReadonlySet<string>>(new Set());\n createEffect(\n on(\n () => props.events,\n (events) => {\n const current = untrack(checks);\n const ids = Object.keys(current);\n if (ids.length === 0) return;\n const next = { ...current };\n for (const id of ids) {\n const event = events.find((candidate) => candidate.id === id);\n if (!event || event.checked === current[id]) delete next[id];\n }\n setChecks(next);\n },\n { defer: true },\n ),\n );\n const checkedOf = (event: CalendarEvent): boolean | undefined =>\n event.checked === undefined ? undefined : (checks()[event.id] ?? event.checked);\n /** What Space on an entry's chip does: check its box, where it has one the reader may change. */\n const checkOf = (event: CalendarEvent) =>\n checkedOf(event) !== undefined && props.owner.onEventCheck ? () => toggleCheck(event) : undefined;\n const forgetJustChecked = (id: string) =>\n setJustChecked((value) => {\n if (!value.has(id)) return value;\n const rest = new Set(value);\n rest.delete(id);\n return rest;\n });\n /** Today's day for a moment after its last open to-do was checked off, which its heading celebrates. */\n const [cheered, setCheered] = createSignal<string | null>(null);\n let cheerTimer = 0;\n // The server renders the view too, and has no window.\n onCleanup(() => clearTimeout(cheerTimer));\n /** The entries with a checkbox on a day: its deadlines, the to-dos planned into its hours, and the ones due all day. */\n const dueOn = (key: string) => {\n const model = dayOf(key);\n return [\n ...model.markers.map((marker) => marker.item),\n ...model.bands.map((band) => band.item),\n ...model.spans.filter((span) => span.marker && span.firstKey === key).map((span) => span.item),\n ].filter((item) => item.checked !== undefined);\n };\n const toggleCheck = (event: CalendarEvent) => {\n const current = checkedOf(event);\n if (current === undefined || !props.owner.onEventCheck) return;\n const next = !current;\n setChecks((value) => ({ ...value, [event.id]: next }));\n if (next) {\n setJustChecked((value) => new Set([...value, event.id]));\n window.setTimeout(() => forgetJustChecked(event.id), 1100);\n const today = nowKey();\n const due = dueOn(today);\n if (due.includes(event) && due.every((item) => checkedOf(item))) {\n // The heading shows it only for a moment, so a screen reader hears it once instead.\n announce(messages().calendarAllDone);\n setCheered(today);\n window.clearTimeout(cheerTimer);\n cheerTimer = window.setTimeout(() => setCheered(null), 2200);\n }\n } else setCheered(null);\n // A change the host refuses puts the box back as it was.\n void Promise.resolve(props.owner.onEventCheck(event, next)).catch(() => {\n forgetJustChecked(event.id);\n if (next) setCheered(null);\n setChecks((value) => {\n if (value[event.id] !== next) return value;\n const rest = { ...value };\n delete rest[event.id];\n return rest;\n });\n });\n };\n\n const entries = createMemo((): DayEntry<CalendarEvent>[] => {\n const context = dateConfig();\n return props.events.flatMap((event) => {\n const start = parseDate(event.start, context);\n if (!validDate(start)) return [];\n const marker = event.display === \"marker\";\n const parsedEnd = event.end ? parseDate(event.end, context) : null;\n let end = parsedEnd && validDate(parsedEnd) && parsedEnd > start ? parsedEnd : null;\n if (!end)\n end = event.allDay\n ? calendar.addDays(calendar.startOfDay(start, context), 1, context)\n : marker\n ? start\n : new Date(start.getTime() + 3_600_000);\n return [{ item: event, start, end, allDay: Boolean(event.allDay), marker }];\n });\n });\n const days = createMemo(() => buildDays(range().first, range().last, entries(), props.hours, dateConfig()));\n const emptyModel = (key: string): DayModel<CalendarEvent> => ({ key, bands: [], markers: [], spans: [], night: false, empty: true });\n const dayOf = (key: string) => days().get(key) ?? emptyModel(key);\n const sourceOf = createMemo(() => new Map(entries().map((entry) => [entry.item, entry])));\n\n /** The day that holds now: before the start hour still the day before. */\n const nowKey = createMemo(() => dayKeyOf(props.now, props.hours, dateConfig()));\n const nowMinute = createMemo(() => minuteInDay(nowKey(), props.now, props.hours, dateConfig()));\n /** Now as a minute of a day: past days lie wholly before it, coming days after. */\n const nowIn = (key: string) => (key === nowKey() ? nowMinute() : key < nowKey() ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY);\n const calendarToday = createMemo(() => keyOf(props.now));\n const clock = (minute: number) => clockAt(minute, props.hours);\n const duration = (minutes: number) => messages().calendarDuration({ minutes: Math.max(1, Math.round(minutes)) });\n const instant = (key: string, minute: number) => instantInDay(key, minute, props.hours, dateConfig());\n const slot = (key: string, start: number, end: number) => instantsInDay(key, start, end, props.hours, dateConfig());\n const dayStartMinute = (hour: number) => Math.max(0, (hour - props.hours[0]) * 60);\n\n /** A day's timed piece as the event chip reads it. */\n const normalized = (event: CalendarEvent, key: string): NormalizedEvent => {\n const source = sourceOf().get(event);\n const start = source?.start ?? parseDate(event.start, dateConfig());\n const end = source?.end ?? start;\n return { ...event, startDate: start, endDate: end, sourceStartDate: start, sourceEndDate: end, dayKey: key };\n };\n\n const [selection, setSelection] = createSignal<TimeSelection | null>(null);\n const [touchDraft, setTouchDraft] = createSignal<{ key: string; start: number; end: number } | null>(null);\n const [activeKey, setActiveKey] = createSignal<string | null>(null);\n const [ghost, setGhost] = createSignal<Ghost | null>(null);\n const [movingId, setMovingId] = createSignal(\"\");\n const [dragging, setDragging] = createSignal<\"\" | \"move\" | \"start\" | \"end\" | \"draw\" | \"external\">(\"\");\n const [nightOverrides, setNightOverrides] = createSignal<Record<string, boolean>>({});\n const [quick, setQuick] = createSignal<QuickCreate | null>(null);\n\n const rangeOfSelection = (value: TimeSelection): CalendarEventTimeChange =>\n value.start === undefined || value.end === undefined\n ? { start: parseKey(value.key), end: calendar.addDays(parseKey(value.key), 1, dateConfig()), allDay: true }\n : { ...slot(value.key, value.start, value.end), allDay: false };\n createEffect(on(selection, (value) => props.owner.onSelectionChange?.(value ? rangeOfSelection(value) : null), { defer: true }));\n onCleanup(() => {\n if (untrack(selection)) props.owner.onSelectionChange?.(null);\n });\n\n // Body elements of the days on screen, for pointer positions.\n const bodies = new Map<string, { element: HTMLElement; expanded: () => boolean }>();\n const registerBody = (key: string, element: HTMLElement, expanded: () => boolean) => {\n bodies.set(key, { element, expanded });\n onCleanup(() => {\n if (bodies.get(key)?.element === element) bodies.delete(key);\n });\n };\n const bodyAt = (clientX: number, clientY: number): BodyHit | null => {\n for (const [key, body] of bodies) {\n if (!body.element.isConnected) continue;\n const rect = body.element.getBoundingClientRect();\n if (clientX < rect.left || clientX >= rect.right || clientY < rect.top || clientY >= rect.bottom) continue;\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n return { key, element: body.element, geometry, minute: dayMinuteAt(geometry, clientY - rect.top) };\n }\n return null;\n };\n const limitOf = (key: string) => (bodies.get(key)?.expanded() ? DAY_MINUTES : wake());\n const nightOpen = (key: string, model: DayModel<CalendarEvent>) => nightOverrides()[key] ?? model.night;\n const setNight = (key: string, open: boolean) => setNightOverrides((value) => ({ ...value, [key]: open }));\n\n /** The gap under a minute while dragging, and whether `need` minutes fit it; the gap shows \"fits\" or how much is missing. */\n const fitAt = (key: string, minute: number, need: number, span?: { start: number; end: number }) => {\n const gap = freeGaps(dayOf(key).bands, wake(), Number.NEGATIVE_INFINITY).find(\n (candidate) => minute >= candidate.start && minute < candidate.end,\n );\n if (!gap) return null;\n const fits = gap.end - gap.start >= need;\n if (fits && span && (span.start < gap.start || span.end > gap.end)) return null;\n return {\n gap,\n fits,\n text: fits ? messages().calendarFits : messages().calendarTooShort({ duration: duration(need - (gap.end - gap.start)) }),\n };\n };\n const [gapHit, setGapHit] = createSignal<{ key: string; start: number; fits: boolean; text: string } | null>(null);\n const overlapAt = (key: string, start: number, end: number, except?: string) =>\n dayOf(key).bands.find((band) => band.item.id !== except && band.start < end && band.end > start)?.item ?? null;\n\n const openQuickCreate = (key: string, start: number | undefined, end: number | undefined, anchor: Element | DOMRect, create?: string) => {\n const range = rangeOfSelection({ key, start, end });\n setTouchDraft(null);\n if (!props.owner.renderQuickCreate) {\n props.owner.onSlotActivate?.(range);\n return;\n }\n setSelection({ key, start, end });\n setQuick({ range, anchor, create, key, start, end });\n };\n const canCreate = () => Boolean(props.owner.renderQuickCreate || props.owner.onSlotActivate);\n\n /** The time a new entry takes: the selection, today's next full hour while today shows, else 09:00 of the first day. */\n const createTarget = (visible: { first: string; last: string }): { key: string; start: number; end: number } => {\n const current = selection();\n if (current && current.start !== undefined && current.end !== undefined)\n return { key: current.key, start: current.start, end: current.end };\n const nine = dayStartMinute(9);\n const nextHour = (key: string) => {\n const minute = Math.ceil((nowMinute() + 1) / 60) * 60;\n return key === nowKey() ? (minute <= wake() - 60 ? minute : null) : nine;\n };\n let key: string;\n let start: number | null;\n if (current) {\n key = current.key;\n start = key === nowKey() ? nextHour(key) : nine;\n } else if (nowKey() >= visible.first && nowKey() <= visible.last) {\n key = nowKey();\n start = nextHour(key);\n } else {\n key = visible.first;\n start = nine;\n }\n if (start === null) {\n key = addDayKeys(key, 1);\n start = nine;\n }\n return { key, start, end: start + 60 };\n };\n\n // Pointer gestures: moving and resizing bands and markers, drawing a new event, and dragging entries in.\n let cancelGesture: (() => void) | undefined;\n onCleanup(() => cancelGesture?.());\n const step = (event: { shiftKey: boolean }) => (event.shiftKey ? 5 : 15);\n const shiftHeld = { current: false };\n const trackShift = (event: KeyboardEvent) => {\n shiftHeld.current = event.shiftKey;\n };\n onMount(() => {\n window.addEventListener(\"keydown\", trackShift, true);\n window.addEventListener(\"keyup\", trackShift, true);\n onCleanup(() => {\n window.removeEventListener(\"keydown\", trackShift, true);\n window.removeEventListener(\"keyup\", trackShift, true);\n });\n });\n const endGesture = () => {\n setGhost(null);\n setGapHit(null);\n setMovingId(\"\");\n setDragging(\"\");\n };\n\n const startMove = (pointerEvent: PointerEvent, event: CalendarEvent, key: string, start: number, end: number, scroller?: HTMLElement) => {\n const marker = event.display === \"marker\";\n if (!props.owner.onEventDrop) return;\n const body = bodies.get(key);\n if (!body) return;\n const rect = body.element.getBoundingClientRect();\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n const grab = dayMinuteAt(geometry, pointerEvent.clientY - rect.top) - start;\n const length = end - start;\n cancelGesture?.();\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n resolve: (clientX, clientY) => {\n const hit = bodyAt(clientX, clientY);\n if (!hit) return null;\n const limit = limitOf(hit.key);\n const from = Math.max(\n 0,\n Math.min(limit - Math.max(length, 15), snapMinutes(hit.minute - grab, step({ shiftKey: shiftHeld.current }))),\n );\n return { key: hit.key, start: from, end: from + length };\n },\n onActivate: () => {\n setMovingId(event.id);\n setDragging(\"move\");\n setSelection(null);\n },\n onPreview: (next) => {\n const clash = marker ? null : overlapAt(next.key, next.start, next.end, event.id);\n const fit = marker ? null : fitAt(next.key, next.start + (next.end - next.start) / 2, next.end - next.start, next);\n setGapHit(fit ? { key: next.key, start: fit.gap.start, fits: fit.fits, text: fit.text } : null);\n const time = marker\n ? messages().calendarDue({ time: clock(next.start) })\n : `${clock(next.start)}–${clock(next.end)} · ${duration(next.end - next.start)}`;\n setGhost({\n key: next.key,\n start: next.start,\n end: marker ? next.start + 20 : next.end,\n title: event.title,\n time: clash ? `${time} · ${messages().calendarOverlaps({ title: clash.title })}` : time,\n colorHex: eventAccent(event),\n warn: Boolean(clash),\n fit: fit ? { fits: fit.fits, text: fit.text } : undefined,\n });\n },\n onCommit: (next) => {\n endGesture();\n swallowNextClick();\n if (next.key === key && next.start === start && next.end === end) return;\n const source = sourceOf().get(event);\n // A moved entry keeps its real length, also when it lands across a clock change.\n const startDate = instant(next.key, next.start);\n const endDate = marker\n ? startDate\n : source\n ? new Date(startDate.getTime() + source.end.getTime() - source.start.getTime())\n : slot(next.key, next.start, next.end).end;\n if (source && source.start.getTime() === startDate.getTime() && source.end.getTime() === endDate.getTime()) return;\n props.owner.onEventDrop?.(event, { start: startDate, end: endDate, allDay: false });\n },\n onCancel: endGesture,\n });\n };\n\n const startResize = (\n pointerEvent: PointerEvent,\n event: CalendarEvent,\n key: string,\n start: number,\n end: number,\n edge: \"start\" | \"end\",\n scroller?: HTMLElement,\n ) => {\n if (!props.owner.onEventResize) return;\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n const body = bodies.get(key);\n if (!body) return;\n cancelGesture?.();\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n threshold: 1,\n resolve: (_clientX, clientY) => {\n const rect = body.element.getBoundingClientRect();\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n const minute = snapMinutes(dayMinuteAt(geometry, clientY - rect.top), step({ shiftKey: shiftHeld.current }));\n const limit = limitOf(key);\n const size = step({ shiftKey: shiftHeld.current });\n return edge === \"end\"\n ? { start, end: Math.max(start + size, Math.min(limit, minute)) }\n : { start: Math.max(0, Math.min(end - size, minute)), end };\n },\n onActivate: () => {\n setMovingId(event.id);\n setDragging(edge);\n },\n onPreview: (next) =>\n setGhost({\n key,\n start: next.start,\n end: next.end,\n title: event.title,\n time: `${clock(next.start)}–${clock(next.end)} · ${duration(next.end - next.start)}`,\n colorHex: eventAccent(event),\n }),\n onCommit: (next) => {\n endGesture();\n swallowNextClick();\n if (next.start === start && next.end === end) return;\n const source = sourceOf().get(event);\n const range = source ? resizedInDay(source, edge, key, next, props.hours, dateConfig()) : slot(key, next.start, next.end);\n props.owner.onEventResize?.(event, { ...range, allDay: false });\n },\n onCancel: endGesture,\n });\n };\n\n /** Drawing on free time: a new event with its live length, on a 15-minute grid, with Shift on 5 minutes. */\n const startDraw = (pointerEvent: PointerEvent, key: string, scroller?: HTMLElement) => {\n if (!canCreate() || pointerEvent.pointerType !== \"mouse\") return;\n const body = bodies.get(key);\n if (!body) return;\n const minuteAt = (clientY: number) => {\n const rect = body.element.getBoundingClientRect();\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n return Math.max(0, Math.min(limitOf(key), dayMinuteAt(geometry, clientY - rect.top)));\n };\n const origin = minuteAt(pointerEvent.clientY);\n cancelGesture?.();\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n resolve: (_clientX, clientY) => {\n const size = step({ shiftKey: shiftHeld.current });\n const minute = minuteAt(clientY);\n const from = Math.floor(Math.min(origin, minute) / size) * size;\n let to = Math.ceil(Math.max(origin, minute) / size) * size;\n if (to - from < size) to = from + size;\n return { start: from, end: Math.min(to, limitOf(key)) };\n },\n onActivate: () => {\n setDragging(\"draw\");\n setSelection(null);\n setTouchDraft(null);\n },\n onPreview: (next) =>\n setGhost({\n key,\n start: next.start,\n end: next.end,\n title: messages().calendarNewEvent,\n time: `${clock(next.start)}–${clock(next.end)} · ${duration(next.end - next.start)}`,\n }),\n onCommit: (next) => {\n const anchor = document.querySelector<HTMLElement>(\".k2b-calendar-ghost[data-live]\")?.getBoundingClientRect() ?? body.element;\n endGesture();\n swallowNextClick();\n openQuickCreate(key, next.start, next.end, anchor);\n },\n onCancel: endGesture,\n });\n };\n\n /** Follows a pointer that pressed an entry outside the calendar into its free time. */\n const dragIn = (\n pointerEvent: PointerEvent,\n item: CalendarExternalDrag,\n onDrop: (slot: CalendarEventTimeChange) => void,\n scroller?: HTMLElement,\n ) => {\n if (pointerEvent.button !== 0 || !pointerEvent.isPrimary) return;\n cancelGesture?.();\n cancelGesture = undefined;\n const length = Math.max(15, Math.round(item.minutes));\n const color = item.colorHex ?? COLOR_TOKENS[item.color ?? \"blue\"]!;\n let token: HTMLElement | undefined;\n let spring: { element: Element; timer: number } | undefined;\n const target =\n pointerEvent.target instanceof HTMLElement ? pointerEvent.target.closest<HTMLElement>(\"li, [data-calendar-drag-source]\") : null;\n let held = false;\n let cleaned = false;\n const preventContextMenu = (event: Event) => event.preventDefault();\n const preventScroll = (event: TouchEvent) => {\n if (held) event.preventDefault();\n };\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n document.removeEventListener(\"touchmove\", preventScroll);\n window.removeEventListener(\"contextmenu\", preventContextMenu, true);\n if (pointerEvent.pointerType === \"touch\") held = false;\n if (target) delete target.dataset.lifted;\n token?.remove();\n token = undefined;\n if (spring) window.clearTimeout(spring.timer);\n spring = undefined;\n endGesture();\n };\n const begin = () => {\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n armAutoScroll: true,\n threshold: held && pointerEvent.pointerType !== \"mouse\" ? 1 : 6,\n resolve: (clientX, clientY) => {\n const hit = bodyAt(clientX, clientY);\n if (!hit || hit.minute >= limitOf(hit.key)) return { key: \"\", start: 0, end: 0, clash: null };\n const fit = fitAt(hit.key, hit.minute, length);\n let start = snapMinutes(hit.minute - length / 2, 15);\n if (fit?.fits) start = Math.max(fit.gap.start, Math.min(fit.gap.end - length, start));\n start = Math.max(0, Math.min(limitOf(hit.key) - length, start));\n return { key: hit.key, start, end: start + length, clash: overlapAt(hit.key, start, start + length), fit };\n },\n onActivate: () => {\n setDragging(\"external\");\n setSelection(null);\n token = document.createElement(\"div\");\n token.className = \"k2b-calendar-token\";\n token.textContent = item.title;\n token.style.setProperty(\"--k2b-calendar-accent\", color);\n token.setAttribute(\"aria-hidden\", \"true\");\n document.body.append(token);\n },\n onMove: (clientX, clientY) => {\n if (token) token.style.transform = `translate(${clientX + 12}px, ${clientY + 10}px)`;\n // A folded run of empty days opens when the entry rests on it.\n const empty = document.elementFromPoint(clientX, clientY)?.closest(\"[data-calendar-unfold]\");\n if (empty && spring?.element !== empty) {\n if (spring) window.clearTimeout(spring.timer);\n spring = { element: empty, timer: window.setTimeout(() => (empty as HTMLElement).click(), 650) };\n } else if (!empty && spring) {\n window.clearTimeout(spring.timer);\n spring = undefined;\n }\n },\n onPreview: (next) => {\n if (token) token.dataset.hidden = next.key ? \"true\" : \"false\";\n if (!next.key) {\n setGhost(null);\n setGapHit(null);\n return;\n }\n setGapHit(next.fit ? { key: next.key, start: next.fit.gap.start, fits: next.fit.fits, text: next.fit.text } : null);\n const time = `${clock(next.start)}–${clock(next.end)} · ${duration(length)}`;\n setGhost({\n key: next.key,\n start: next.start,\n end: next.end,\n title: item.title,\n time: next.clash ? `${time} · ${messages().calendarOverlaps({ title: next.clash.title })}` : time,\n colorHex: color,\n warn: Boolean(next.clash),\n fit: next.fit ? { fits: next.fit.fits, text: next.fit.text } : undefined,\n });\n },\n onCommit: (next) => {\n swallowNextClick();\n if (next.key) onDrop({ ...slot(next.key, next.start, next.end), allDay: false });\n },\n onEnd: cleanup,\n });\n };\n if (pointerEvent.pointerType === \"mouse\") {\n begin();\n return;\n }\n // A finger first holds the entry still, so a short swipe keeps scrolling the list it sits in.\n const origin = { x: pointerEvent.clientX, y: pointerEvent.clientY };\n const abort = () => {\n window.clearTimeout(timer);\n window.removeEventListener(\"pointermove\", watch);\n window.removeEventListener(\"pointerup\", abort);\n window.removeEventListener(\"pointercancel\", abort);\n window.removeEventListener(\"contextmenu\", preventContextMenu, true);\n if (target) delete target.dataset.lifted;\n if (cancelGesture === abort) cancelGesture = undefined;\n };\n const watch = (event: PointerEvent) => {\n if (event.pointerId === pointerEvent.pointerId && Math.hypot(event.clientX - origin.x, event.clientY - origin.y) > 10) abort();\n };\n const timer = window.setTimeout(() => {\n abort();\n held = true;\n if (target) target.dataset.lifted = \"true\";\n navigator.vibrate?.(8);\n document.addEventListener(\"touchmove\", preventScroll, { passive: false });\n window.addEventListener(\"contextmenu\", preventContextMenu, true);\n begin();\n }, 420);\n window.addEventListener(\"pointermove\", watch);\n window.addEventListener(\"pointerup\", abort);\n window.addEventListener(\"pointercancel\", abort);\n window.addEventListener(\"contextmenu\", preventContextMenu, true);\n cancelGesture = abort;\n };\n\n return {\n props,\n messages,\n dateConfig,\n hours,\n wake,\n range,\n anchorKey,\n days,\n dayOf,\n keyOf,\n parseKey,\n nowKey,\n nowMinute,\n nowIn,\n calendarToday,\n clock,\n duration,\n instant,\n normalized,\n checkedOf,\n toggleCheck,\n checkOf,\n justChecked,\n cheered,\n selection,\n setSelection,\n touchDraft,\n setTouchDraft,\n activeKey,\n setActiveKey,\n ghost,\n gapHit,\n movingId,\n dragging,\n nightOpen,\n setNight,\n quick,\n setQuick,\n openQuickCreate,\n canCreate,\n createTarget,\n rangeOfSelection,\n registerBody,\n bodyAt,\n limitOf,\n startMove,\n startResize,\n startDraw,\n dragIn,\n dayStartMinute,\n };\n};\n\nexport type TimeView = ReturnType<typeof createTimeView>;\n\n/**\n * German short dates read \"Fr 9. Okt\", without the dots of the abbreviations; with `comma`, a title such as\n * \"Fr, 9. Okt 2026\" keeps the comma after the day.\n */\nexport const compactGermanDate = (text: string, locale: string | undefined, comma = false) =>\n locale?.startsWith(\"de\")\n ? text\n .replace(comma ? /\\b(Mo|Di|Mi|Do|Fr|Sa|So)\\./g : /\\b(Mo|Di|Mi|Do|Fr|Sa|So)\\.,?/g, \"$1\")\n .replace(/\\b(Jan|Feb|Mär|Apr|Jun|Jul|Aug|Sep|Sept|Okt|Nov|Dez)\\./g, \"$1\")\n : text;\n\n/** A short day such as \"Fri 9\" or \"Fr 9.\", in the calendar's locale. */\nexport const shortDay = (view: TimeView, key: string, withMonth = false) =>\n compactGermanDate(\n view.parseKey(key).toLocaleDateString(view.dateConfig().locale ?? \"en\", {\n weekday: \"short\",\n day: \"numeric\",\n ...(withMonth ? { month: \"short\" } : {}),\n timeZone: view.dateConfig().timeZone,\n }),\n view.dateConfig().locale,\n );\n\n/** A long day such as \"Friday, October 9\", with the year when it is not this year's. */\nexport const longDay = (view: TimeView, key: string) =>\n view.parseKey(key).toLocaleDateString(view.dateConfig().locale ?? \"en\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n ...(key.slice(0, 4) !== view.calendarToday().slice(0, 4) ? { year: \"numeric\" } : {}),\n timeZone: view.dateConfig().timeZone,\n });\n\nconst CHECK_PATH = \"M4.6 8.3l2.3 2.3 4.6-4.9\";\n\n/** A to-do's checkbox: it draws its check, and the title beside it strikes through. */\nexport const TimeCheck = (props: { view: TimeView; event: CalendarEvent; tabIndex?: number }) => {\n const checked = () => props.view.checkedOf(props.event) ?? false;\n const box = (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <rect x=\"1.75\" y=\"1.75\" width=\"12.5\" height=\"12.5\" rx=\"3.5\" />\n <path d={CHECK_PATH} />\n </svg>\n );\n return (\n <Show\n when={props.view.props.owner.onEventCheck}\n fallback={\n <span class=\"k2b-calendar-check\" data-checked={checked() ? \"true\" : undefined} aria-hidden=\"true\">\n {box}\n </span>\n }\n >\n <button\n type=\"button\"\n class=\"k2b-calendar-check\"\n role=\"checkbox\"\n aria-checked={checked() ? \"true\" : \"false\"}\n aria-label={props.view.messages().calendarDone({ title: props.event.title })}\n tabIndex={props.tabIndex}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={props.view.justChecked().has(props.event.id) ? \"true\" : undefined}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.view.toggleCheck(props.event);\n }}\n >\n {box}\n </button>\n </Show>\n );\n};\n\n/** A timed entry in a day's timeline: a band as long as the entry, side by side with overlapping ones. */\nexport const TimeBand = (props: {\n view: TimeView;\n band: DayLane<CalendarEvent>;\n dayKey: string;\n expanded: boolean;\n compact?: boolean;\n /** Day view: a tall band shows its place. */\n showLocation?: boolean;\n /** The height of an hour on a wide screen, for the band's size class and title lines. */\n hourPx: number;\n tabIndex?: number;\n stop?: CalendarStop;\n scroller?: () => HTMLElement | undefined;\n}) => {\n const view = props.view;\n const event = () => props.band.item;\n const wake = () => view.wake();\n const limit = () => (props.expanded ? DAY_MINUTES : wake());\n const visibleStart = () => Math.max(0, props.band.start);\n const visibleEnd = () => Math.min(limit(), props.band.end);\n const top = () => dayTopTerms(wake(), props.expanded, visibleStart());\n const bottom = () => dayYTerms(wake(), props.expanded, visibleEnd());\n const now = () => view.nowIn(props.dayKey);\n const running = () => now() >= props.band.start && now() < props.band.end && Number.isFinite(now());\n const past = () => now() >= props.band.end;\n const length = () => props.band.end - props.band.start;\n const pixels = () => (length() / 60) * props.hourPx - 2;\n const size = () => (pixels() < 27 ? \"xs\" : pixels() < 40 ? \"s\" : \"m\");\n const checked = () => view.checkedOf(event());\n const remaining = () => (running() ? view.messages().calendarRemaining({ duration: view.duration(props.band.end - now()) }) : undefined);\n const lines = () => Math.max(1, Math.floor((pixels() - 24) / 15));\n return (\n <div\n class=\"k2b-calendar-band\"\n data-calendar-entry={event().id}\n data-size={size()}\n data-past={past() ? \"true\" : undefined}\n data-running={running() ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(event().id) ? \"true\" : undefined}\n data-cut-bottom={props.band.end > limit() ? \"true\" : undefined}\n data-moving={view.movingId() === event().id ? \"true\" : undefined}\n data-display={event().display}\n style={{\n \"--k2b-calendar-accent\": eventAccent(event()),\n \"--k2b-calendar-lane\": String(props.band.lane),\n \"--k2b-calendar-lanes\": String(props.band.lanes),\n \"--k2b-calendar-lines\": String(lines()),\n \"--k2b-calendar-progress\": running() ? `${(((now() - props.band.start) / length()) * 100).toFixed(1)}%` : undefined,\n top: `calc(${termsCss(top())} + 1px)`,\n height: `max(var(--k2b-calendar-band-min), calc(${termsCss(subtractTerms(bottom(), top()))} - 2px))`,\n }}\n >\n <Show when={running()}>\n <span class=\"k2b-calendar-band__fill\" aria-hidden=\"true\" />\n </Show>\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={event()} tabIndex={props.tabIndex === undefined ? undefined : -1} />\n </Show>\n <EventChip\n event={view.normalized(event(), props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, event())}\n fill\n timeline\n compact={props.compact}\n timeLabel={`${view.clock(props.band.start)}–${view.clock(props.band.end)}`}\n showLocation={props.showLocation && size() === \"m\" && pixels() >= 64}\n remaining={remaining()}\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(event())}\n moving={view.movingId() === event().id}\n tabIndex={props.tabIndex}\n stop={props.stop}\n onMovePointerDown={\n view.props.owner.onEventDrop\n ? (pointerEvent) => view.startMove(pointerEvent, event(), props.dayKey, props.band.start, props.band.end, props.scroller?.())\n : undefined\n }\n />\n <Show when={view.props.owner.onEventResize}>\n <span\n class=\"k2b-calendar-band__grip\"\n data-edge=\"start\"\n aria-hidden=\"true\"\n onPointerDown={(pointerEvent) =>\n view.startResize(pointerEvent, event(), props.dayKey, props.band.start, props.band.end, \"start\", props.scroller?.())\n }\n />\n <Show when={props.band.end <= limit()}>\n <span\n class=\"k2b-calendar-band__grip\"\n data-edge=\"end\"\n aria-hidden=\"true\"\n onPointerDown={(pointerEvent) =>\n view.startResize(pointerEvent, event(), props.dayKey, props.band.start, props.band.end, \"end\", props.scroller?.())\n }\n />\n </Show>\n </Show>\n </div>\n );\n};\n\n/** A point in time such as a deadline: a dashed line across the day and a pill with its checkbox and title. */\nexport const TimeMarker = (props: {\n view: TimeView;\n event: CalendarEvent;\n minute: number;\n dayKey: string;\n expanded: boolean;\n above: boolean;\n /** The pill's place among deadlines whose pills would cover each other, from the left. */\n lane: number;\n lanes: number;\n showTime: boolean;\n tabIndex?: number;\n stop?: CalendarStop;\n scroller?: () => HTMLElement | undefined;\n}) => {\n const view = props.view;\n const checked = () => view.checkedOf(props.event);\n const past = () => view.nowIn(props.dayKey) >= props.minute;\n return (\n <div\n class=\"k2b-calendar-marker\"\n data-calendar-entry={props.event.id}\n data-past={past() ? \"true\" : undefined}\n data-overdue={past() && checked() === false ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(props.event.id) ? \"true\" : undefined}\n data-above={props.above ? \"true\" : undefined}\n data-moving={view.movingId() === props.event.id ? \"true\" : undefined}\n style={{\n \"--k2b-calendar-accent\": eventAccent(props.event),\n \"--k2b-calendar-marker-lane\": String(props.lane),\n \"--k2b-calendar-marker-lanes\": String(props.lanes),\n top: termsCss(dayTopTerms(view.wake(), props.expanded, props.minute)),\n }}\n >\n <span class=\"k2b-calendar-marker__line\" aria-hidden=\"true\" />\n <span class=\"k2b-calendar-marker__pill\">\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={props.event} tabIndex={props.tabIndex === undefined ? undefined : -1} />\n </Show>\n <EventChip\n event={view.normalized(props.event, props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, props.event)}\n compact\n timeline\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(props.event)}\n tabIndex={props.tabIndex}\n stop={props.stop}\n trailing={\n <Show when={props.showTime}>\n <span class=\"k2b-calendar-marker__time\">{view.clock(props.minute)}</span>\n </Show>\n }\n onMovePointerDown={\n view.props.owner.onEventDrop\n ? (pointerEvent) => view.startMove(pointerEvent, props.event, props.dayKey, props.minute, props.minute, props.scroller?.())\n : undefined\n }\n />\n </span>\n </div>\n );\n};\n\n/** Free time between entries, labelled from an hour on; activating it creates there. */\nexport const TimeGap = (props: {\n view: TimeView;\n gap: DayGap;\n dayKey: string;\n expanded: boolean;\n /** A deadline pill near the middle moves the label aside. */\n aside: boolean;\n tabIndex?: number;\n stop?: CalendarStop;\n}) => {\n const view = props.view;\n const length = () => props.gap.end - props.gap.start;\n const proposal = () => gapProposal(props.gap, view.hours());\n const label = () => view.messages().calendarFree({ duration: view.duration(length()) });\n const hit = () => {\n const current = view.gapHit();\n return current && current.key === props.dayKey && current.start === props.gap.start ? current : null;\n };\n const top = () => dayYTerms(view.wake(), props.expanded, props.gap.start);\n /**\n * Shorter free time is hidden until something is dragged into it, and past free time has no label, so neither is a\n * keyboard stop.\n */\n const labelled = () => length() >= GAP_LABEL_MINUTES;\n const stop = () => (labelled() && !props.gap.past ? props.stop : undefined);\n return (\n <div\n class=\"k2b-calendar-gap\"\n data-short={labelled() ? undefined : \"true\"}\n data-long={length() >= GAP_LONG_MINUTES ? \"true\" : undefined}\n data-past={props.gap.past ? \"true\" : undefined}\n data-aside={props.aside ? \"true\" : undefined}\n data-hit={hit() ? (hit()!.fits ? \"fit\" : \"short\") : undefined}\n style={{ top: termsCss(top()), height: termsCss(subtractTerms(dayYTerms(view.wake(), props.expanded, props.gap.end), top())) }}\n >\n <span class=\"k2b-calendar-gap__zone\" aria-hidden=\"true\" />\n <Show when={view.canCreate()}>\n <button\n type=\"button\"\n class=\"k2b-calendar-gap__button\"\n tabIndex={labelled() ? (props.tabIndex ?? (props.gap.past ? -1 : 0)) : -1}\n data-stop={stop()?.id}\n data-col={stop()?.column}\n data-minute={stop()?.minute}\n aria-label={view.messages().calendarFreeAction({\n duration: view.duration(length()),\n from: view.clock(props.gap.start),\n to: view.clock(props.gap.end),\n start: view.clock(proposal()[0]),\n end: view.clock(proposal()[1]),\n })}\n title={view.messages().calendarCreateAt({ start: view.clock(proposal()[0]), end: view.clock(proposal()[1]) })}\n onClick={(event) => {\n event.stopPropagation();\n view.openQuickCreate(props.dayKey, proposal()[0], proposal()[1], event.currentTarget);\n }}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span class=\"k2b-calendar-gap__text\">{hit() ? hit()!.text : label()}</span>\n </button>\n </Show>\n </div>\n );\n};\n\n/** The preview of a drag, a draw, or an entry dragged in, and the selected slot. */\nexport const TimeOverlays = (props: { view: TimeView; dayKey: string; expanded: boolean }) => {\n const view = props.view;\n const ghost = () => {\n const current = view.ghost();\n return current && current.key === props.dayKey ? current : null;\n };\n const selected = () => {\n const current = view.selection();\n return current && current.key === props.dayKey && current.start !== undefined && current.end !== undefined ? current : null;\n };\n const draft = () => {\n const current = view.touchDraft();\n return current && current.key === props.dayKey ? current : null;\n };\n const box = (start: number, end: number) => {\n const top = dayTopTerms(view.wake(), props.expanded, start);\n return { top: termsCss(top), height: termsCss(subtractTerms(dayYTerms(view.wake(), props.expanded, end), top)) };\n };\n return (\n <>\n <Show when={selected()}>\n {(slot) => <span class=\"k2b-calendar-slot\" style={box(slot().start!, slot().end!)} aria-hidden=\"true\" />}\n </Show>\n <Show when={draft()}>\n {(slot) => (\n <div class=\"k2b-calendar-draft\" style={box(slot().start, slot().end)}>\n <span\n class=\"k2b-calendar-draft__grip\"\n data-edge=\"start\"\n aria-hidden=\"true\"\n onPointerDown={(event) => startDraftResize(view, event, \"start\")}\n />\n <button\n type=\"button\"\n class=\"k2b-calendar-draft__open\"\n aria-label={view.messages().calendarCreateAt({ start: view.clock(slot().start), end: view.clock(slot().end) })}\n onClick={(event) => view.openQuickCreate(slot().key, slot().start, slot().end, event.currentTarget)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>\n {view.clock(slot().start)}–{view.clock(slot().end)} · {view.duration(slot().end - slot().start)}\n </span>\n </button>\n <span\n class=\"k2b-calendar-draft__grip\"\n data-edge=\"end\"\n aria-hidden=\"true\"\n onPointerDown={(event) => startDraftResize(view, event, \"end\")}\n />\n </div>\n )}\n </Show>\n <Show when={ghost()}>\n {(current) => (\n <div\n class=\"k2b-calendar-ghost\"\n data-live=\"true\"\n data-size={current().end - current().start < 40 ? \"s\" : \"m\"}\n data-warn={current().warn ? \"true\" : undefined}\n style={{ ...box(current().start, current().end), \"--k2b-calendar-accent\": current().colorHex ?? \"var(--k2b-action)\" }}\n aria-hidden=\"true\"\n >\n <span class=\"k2b-calendar-ghost__title\">{current().title}</span>\n <span class=\"k2b-calendar-ghost__time\">{current().time}</span>\n <Show when={current().fit}>\n {(fit) => (\n <span class=\"k2b-calendar-ghost__fit\" data-fit={fit().fits ? \"fit\" : \"short\"}>\n {fit().text}\n </span>\n )}\n </Show>\n </div>\n )}\n </Show>\n </>\n );\n};\n\n/** The handles of a tapped slot change its start or end. */\nconst startDraftResize = (view: TimeView, pointerEvent: PointerEvent, edge: \"start\" | \"end\") => {\n const draft = view.touchDraft();\n if (!draft) return;\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n startCalendarPointerSession({\n event: pointerEvent,\n threshold: 1,\n resolve: (clientX, clientY) => {\n const hit = view.bodyAt(clientX, clientY);\n if (!hit || hit.key !== draft.key) return null;\n const minute = snapMinutes(hit.minute, 15);\n const current = view.touchDraft() ?? draft;\n return edge === \"end\"\n ? { ...current, end: Math.max(current.start + 15, Math.min(view.limitOf(draft.key), minute)) }\n : { ...current, start: Math.max(0, Math.min(current.end - 15, minute)) };\n },\n onPreview: (next) => {\n view.setTouchDraft(next);\n view.setSelection({ key: next.key, start: next.start, end: next.end });\n },\n onCommit: () => swallowNextClick(),\n });\n};\n\n/** Free time of a day with the gap of now trimmed, as both views draw it. */\nexport const dayGaps = (view: TimeView, key: string) => freeGaps(view.dayOf(key).bands, view.wake(), view.nowIn(key));\n\n/** The bands of a day with their lanes, cut to what its timeline draws. */\nexport const dayBands = (view: TimeView, key: string, expanded: boolean) => {\n const limit = expanded ? DAY_MINUTES : view.wake();\n const visible = view.dayOf(key).bands.filter((band) => Math.min(limit, band.end) > Math.max(0, band.start));\n return dayLanes(visible, LANE_MINUTES);\n};\n\n/** Entries the folded night hides, as chips with their time. */\nexport const foldedEntries = (view: TimeView, key: string) => {\n const model = view.dayOf(key);\n const wake = view.wake();\n return [\n ...model.bands\n .filter((band) => band.end > wake)\n .map((band) => ({\n event: band.item,\n time: band.start >= wake ? view.clock(band.start) : view.messages().calendarUntil({ time: view.clock(band.end) }),\n })),\n ...model.markers.filter((marker) => marker.minute >= wake).map((marker) => ({ event: marker.item, time: view.clock(marker.minute) })),\n ];\n};\n\n/** The quick create at a slot or gap, as in the month view. */\nexport const TimeQuickCreate = (props: { view: TimeView }) => {\n const view = props.view;\n let element: HTMLDivElement | undefined;\n let returnFocus: HTMLElement | null = null;\n createEffect(() => {\n const current = view.quick();\n if (!element) return;\n if (!current) {\n if (element.matches(\":popover-open\")) element.hidePopover();\n return;\n }\n returnFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n if (!element.matches(\":popover-open\")) element.showPopover();\n queueMicrotask(() => {\n if (view.quick() !== current || !element?.isConnected) return;\n placeCalendarPopover(current.anchor, element);\n element.querySelector<HTMLElement>(\"input,textarea,select,button,a[href],[tabindex]:not([tabindex='-1'])\")?.focus();\n });\n });\n /** Whether the focus is in the popover, or fell to the page as it hid: only then does a close return it. */\n const focusInPopover = () => element?.contains(document.activeElement) || document.activeElement === document.body;\n const close = (restore: boolean) => {\n const current = view.quick();\n if (!current) return;\n const selection = view.selection();\n view.setQuick(null);\n // A late close must leave a newer selection in place.\n if (selection?.key === current.key && selection.start === current.start && selection.end === current.end) view.setSelection(null);\n if (restore && returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });\n };\n return (\n <div\n ref={element}\n class=\"k2b-calendar-popover\"\n popover=\"auto\"\n role=\"dialog\"\n aria-label={view.messages().calendarQuickCreate}\n data-kind=\"create\"\n onToggle={(event) => {\n if (event.newState !== \"closed\" || !view.quick() || event.currentTarget.matches(\":popover-open\")) return;\n close(focusInPopover());\n }}\n >\n <Show when={view.quick()} keyed>\n {(value) =>\n view.props.owner.renderQuickCreate?.(value.range, {\n create: value.create,\n close: () => {\n if (view.quick() === value) close(focusInPopover());\n },\n })\n }\n </Show>\n </div>\n );\n};\n\n/** All-day entries of a day as chips: bars with torn ends where they go on, and points due that day. */\nexport const AllDayChips = (props: { view: TimeView; dayKey: string; spans: readonly DaySpan<CalendarEvent>[] }) => {\n const view = props.view;\n return (\n <For each={props.spans}>\n {(span) => {\n const event = span.item;\n const checked = () => view.checkedOf(event);\n return (\n <span\n class=\"k2b-calendar-allday-chip\"\n data-bar={span.marker ? undefined : \"true\"}\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(event.id) ? \"true\" : undefined}\n style={{ \"--k2b-calendar-accent\": eventAccent(event) }}\n >\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={event} />\n </Show>\n <EventChip\n event={view.normalized(event, props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, event)}\n compact\n timeline\n bar={!span.marker}\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(event)}\n continuesBefore={span.firstKey < props.dayKey}\n continuesAfter={span.lastKey > props.dayKey}\n />\n </span>\n );\n }}\n </For>\n );\n};\n\n/** Hour labels and lines of a day's timeline with the night open, and the date at midnight. */\nexport const nightHours = (wake: number) => {\n const hours: number[] = [];\n for (let minute = wake + 60; minute < DAY_MINUTES; minute += 60) hours.push(minute);\n return hours;\n};\n\nexport const isNearNow = (view: TimeView, key: string, minute: number) => key === view.nowKey() && Math.abs(view.nowMinute() - minute) < 14;\n\n/** Whether a marker sits right above a band's start, so its pill goes above the line. */\nexport const markerAbove = (model: DayModel<CalendarEvent>, minute: number) =>\n model.bands.some((band) => band.start >= minute - 10 && band.start <= minute + 20);\n\n/** Whether a deadline pill sits near the middle of a gap, so the gap's label moves aside. */\nexport const gapAside = (model: DayModel<CalendarEvent>, gap: DayGap) => {\n const middle = (gap.start + gap.end) / 2;\n return model.markers.some(\n (marker) => marker.minute > gap.start - 10 && marker.minute < gap.end + 10 && Math.abs(marker.minute - middle) < 25,\n );\n};\n\n/** A day's counts for its header: events and all-day entries, to-dos and deadlines. */\nexport const daySummary = (view: TimeView, key: string) => {\n const model = view.dayOf(key);\n const isTask = (event: CalendarEvent) => event.display === \"marker\" || event.checked !== undefined;\n const all = [\n ...model.bands.map((band) => band.item),\n ...model.markers.map((marker) => marker.item),\n ...model.spans.map((span) => span.item),\n ];\n const tasks = all.filter(isTask).length;\n return view.messages().calendarDaySummary({ events: all.length - tasks, tasks });\n};\n\n/** What starts within the next hour today, such as \"Planning in 12 min\". */\nexport const soonNote = (view: TimeView, key: string) => {\n if (key !== view.nowKey()) return \"\";\n const now = view.nowMinute();\n const next = view\n .dayOf(key)\n .bands.filter((band) => band.start > now && band.start - now <= 60 && !view.checkedOf(band.item))\n .sort((left, right) => left.start - right.start)[0];\n return next ? view.messages().calendarSoon({ title: next.item.title, duration: view.duration(next.start - now) }) : \"\";\n};\n\n/** The busy minutes of a day's waking hours, merged, with the color of the first entry, for the thin load line. */\nexport const dayLoad = (view: TimeView, key: string) => {\n const pieces = view\n .dayOf(key)\n .bands.map((band) => ({ start: Math.max(0, band.start), end: Math.min(view.wake(), band.end), color: eventAccent(band.item) }))\n .filter((piece) => piece.end > piece.start)\n .sort((left, right) => left.start - right.start);\n const merged: typeof pieces = [];\n for (const piece of pieces) {\n const last = merged[merged.length - 1];\n if (last && piece.start <= last.end) last.end = Math.max(last.end, piece.end);\n else merged.push({ ...piece });\n }\n return merged;\n};\n\n/** Day keys of the week that holds a day, from its first day. */\nexport const weekKeysOf = (view: TimeView, key: string) => {\n const start = view.keyOf(calendar.startOfWeek(view.parseKey(key), view.dateConfig()));\n return Array.from({ length: 7 }, (_, index) => addDayKeys(start, index));\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,KAAK,IAAI,QAAQ,QAA0B,aAAa;AACjE,SAAS,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,QAAQ,UAAU;AAC7G,SAAS,QAAQ,QAAQ,sBAAsB;AAE/C,SACE,UAAU,EACV,SAAS,EAET,OAAO,EACP,WAAW,EAOX,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EACR,WAAW,QACN,iBAAiB;AACxB,SAAS,mBAAmB,QAAQ,qBAAqB;AACzD,SAAS,2BAA2B,QAAQ,oBAAoB;AAChE,SAGE,SAAS,EACT,SAAS,EAET,eAAe,EACf,SAAS,EACT,oBAAoB,EACpB,SAAS,QACJ,mBAAmB;;AAE1B;AACA;AACA;AACA;;AAIA;;AAkDA,MAAM,YAAoC,GAAG;EAC3C,IAAI,EAAE,SAAS;EACf,OAAO,EAAE,SAAS;EAClB,KAAK,EAAE,SAAS;EAChB,GAAG,EAAE,SAAS;EACd,MAAM,EAAE,SAAS;EACjB,IAAI,EAAE,SAAS;EACf,IAAI,EAAE;AACR,CAAC;AACD,OAAO,MAAM,WAAW,GAAI,KAAgD,IAC1E,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAE;;AAExD;AACA,MAAM,YAAY,GAAG,EAAE;AAEvB,OAAO,MAAM,aAAa,GAAG,MAC3B,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO;;AAE3I;AACA,OAAO,MAAM,gBAAgB,GAAG,MAAM;EACpC,MAAM,IAAI,GAAI,KAAY,IAAK;IAC7B,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,KAAK,CAAC,cAAc,CAAC,CAAC;EACxB,CAAC;EACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,IAAI;IAAE,IAAI,EAAE;EAAK,CAAC,CAAC;EACrE,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE;EAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAC5F,CAAC;AAED,OAAO,MAAM,cAAc,GAAI,KAAoB,IAAK;EACtD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,CAAC;EACtC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAmB,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;EAC9E,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK;EAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;EACvD,MAAM,KAAK,GAAI,IAAU,IAAK,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;EACxE,MAAM,QAAQ,GAAI,GAAW,IAAK,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;;EAE/E;EACA,MAAM,KAAK,GAAG,UAAU,CACtB,MAAM;IACJ,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK;IAChC,IAAI,MAAM,EAAE;MACV,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;MAC5C,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC;MACxC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QAClG,OAAO;UAAE,KAAK;UAAE;QAAK,CAAC;MACxB;IACF;IACA,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;IACvD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,OAAO;MAAE,KAAK,EAAE,GAAG;MAAE,IAAI,EAAE;IAAI,CAAC;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IACxF,OAAO;MAAE,KAAK,EAAE,KAAK;MAAE,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;IAAE,CAAC;EACrD,CAAC,EACD,SAAS,EACT;IAAE,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC;EAAK,CACpF,CAAC;EACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;EAErD;EACA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAA0B,CAAC,CAAC,CAAC;EACrE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,YAAY,CAAsB,IAAI,GAAG,CAAC,CAAC,CAAC;EAClF,YAAY,CACV,EAAE,CACA,MAAM,KAAK,CAAC,MAAM,EACjB,MAAM,IAAK;IACV,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;IACtB,MAAM,IAAI,GAAG;MAAE,GAAG;IAAQ,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;MACpB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;MAC7D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IAC9D;IACA,SAAS,CAAC,IAAI,CAAC;EACjB,CAAC,EACD;IAAE,KAAK,EAAE;EAAK,CAChB,CACF,CAAC;EACD,MAAM,SAAS,GAAI,KAAoB,IACrC,KAAK,CAAC,OAAO,KAAK,SAAS,GAAG,SAAS,GAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAQ;EACjF;EACA,MAAM,OAAO,GAAI,KAAoB,IACnC,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,GAAG,SAAS;EACnG,MAAM,iBAAiB,GAAI,EAAU,IACnC,cAAc,CAAE,KAAK,IAAK;IACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,KAAK;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACf,OAAO,IAAI;EACb,CAAC,CAAC;EACJ;EACA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAgB,IAAI,CAAC;EAC/D,IAAI,UAAU,GAAG,CAAC;EAClB;EACA,SAAS,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;EACzC;EACA,MAAM,KAAK,GAAI,GAAW,IAAK;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;IACxB,OAAO,CACL,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAE,MAAM,IAAK,MAAM,CAAC,IAAI,CAAC,EAC7C,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,IAAI,IAAK,IAAI,CAAC,IAAI,CAAC,EACvC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAE,IAAI,IAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,GAAG,CAAE,IAAI,IAAK,IAAI,CAAC,IAAI,CAAC,CAC/F,CAAC,MAAM,CAAE,IAAI,IAAK,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;EAChD,CAAC;EACD,MAAM,WAAW,GAAI,KAAoB,IAAK;IAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE;IACxD,MAAM,IAAI,GAAG,CAAC,OAAO;IACrB,SAAS,CAAE,KAAK,KAAM;MAAE,GAAG,KAAK;MAAE,CAAC,KAAK,CAAC,EAAE,GAAG;IAAK,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,EAAE;MACR,cAAc,CAAE,KAAK,IAAK,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;MACxD,MAAM,CAAC,UAAU,CAAC,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;MAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;MACtB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;MACxB,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAE,IAAI,IAAK,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE;QAC/D;QACA,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC;QACpC,UAAU,CAAC,KAAK,CAAC;QACjB,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;QAC/B,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;MAC9D;IACF,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC;IACvB;IACA,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MACtE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;MAC3B,IAAI,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;MAC1B,SAAS,CAAE,KAAK,IAAK;QACnB,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,OAAO,KAAK;QAC1C,MAAM,IAAI,GAAG;UAAE,GAAG;QAAM,CAAC;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI;MACb,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC;EAED,MAAM,OAAO,GAAG,UAAU,CAAC,MAAiC;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAE,KAAK,IAAK;MACrC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;MAC7C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE;MAChC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,QAAQ;MACzC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI;MAClE,IAAI,GAAG,GAAG,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,IAAI;MACnF,IAAI,CAAC,GAAG,EACN,GAAG,GAAG,KAAK,CAAC,MAAM,GACd,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,GACjE,MAAM,GACJ,KAAK,GACL,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;MAC7C,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK;QAAE,KAAK;QAAE,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE;MAAO,CAAC,CAAC;IAC7E,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;EAC3G,MAAM,UAAU,GAAI,GAAW,KAA+B;IAAE,GAAG;IAAE,KAAK,EAAE,EAAE;IAAE,OAAO,EAAE,EAAE;IAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK;IAAE,KAAK,EAAE;EAAK,CAAC,CAAC;EACpI,MAAM,KAAK,GAAI,GAAW,IAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;EACjE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAE,KAAK,IAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;;EAEzF;EACA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;EAC/E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;EAC/F;EACA,MAAM,KAAK,GAAI,GAAW,IAAM,GAAG,KAAK,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAkB;EACtI,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;EACxD,MAAM,KAAK,GAAI,MAAc,IAAK,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;EAC9D,MAAM,QAAQ,GAAI,OAAe,IAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;EAAE,CAAC,CAAC;EAChH,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,MAAc,KAAK,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;EACrG,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW,KAAK,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;EACnH,MAAM,cAAc,GAAI,IAAY,IAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;;EAElF;EACA,MAAM,UAAU,GAAG,CAAC,KAAoB,EAAE,GAAW,KAAsB;IACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,KAAK;IAChC,OAAO;MAAE,GAAG,KAAK;MAAE,SAAS,EAAE,KAAK;MAAE,OAAO,EAAE,GAAG;MAAE,eAAe,EAAE,KAAK;MAAE,aAAa,EAAE,GAAG;MAAE,MAAM,EAAE;IAAI,CAAC;EAC9G,CAAC;EAED,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,YAAY,CAAuB,IAAI,CAAC;EAC1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,YAAY,CAAqD,IAAI,CAAC;EAC1G,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,YAAY,CAAgB,IAAI,CAAC;EACnE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAe,IAAI,CAAC;EAC1D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,YAAY,CAAsD,EAAE,CAAC;EACrG,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,YAAY,CAA0B,CAAC,CAAC,CAAC;EACrF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAqB,IAAI,CAAC;EAEhE,MAAM,gBAAgB,GAAI,KAAoB,IAC5C,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,GAChD;IAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;IAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAAE,MAAM,EAAE;EAAK,CAAC,GACzG;IAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IAAE,MAAM,EAAE;EAAM,CAAC;EACnE,YAAY,CAAC,EAAE,CAAC,SAAS,EAAG,KAAK,IAAK,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE;IAAE,KAAK,EAAE;EAAK,CAAC,CAAC,CAAC;EAChI,SAAS,CAAC,MAAM;IACd,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;EAC/D,CAAC,CAAC;;EAEF;EACA,MAAM,MAAM,GAAG,IAAI,GAAG,CAA4D,CAAC;EACnF,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,OAAoB,EAAE,QAAuB,KAAK;IACnF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;MAAE,OAAO;MAAE;IAAS,CAAC,CAAC;IACtC,SAAS,CAAC,MAAM;MACd,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IAC9D,CAAC,CAAC;EACJ,CAAC;EACD,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,OAAe,KAAqB;IACnE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE;MAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;MAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;MACjD,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE;MAClG,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;MACvE,OAAO;QAAE,GAAG;QAAE,OAAO,EAAE,IAAI,CAAC,OAAO;QAAE,QAAQ;QAAE,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG;MAAE,CAAC;IACpG;IACA,OAAO,IAAI;EACb,CAAC;EACD,MAAM,OAAO,GAAI,GAAW,IAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,CAAE;EACrF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,KAA8B,KAAK,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK;EACvG,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,IAAa,KAAK,iBAAiB,CAAE,KAAK,KAAM;IAAE,GAAG,KAAK;IAAE,CAAC,GAAG,GAAG;EAAK,CAAC,CAAC,CAAC;;EAE1G;EACA,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,MAAc,EAAE,IAAY,EAAE,IAAqC,KAAK;IAClG,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAC1E,SAAS,IAAK,MAAM,IAAI,SAAS,CAAC,KAAK,IAAI,MAAM,GAAG,SAAS,CAAC,GACjE,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI;IACrB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI;IACxC,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI;IAC/E,OAAO;MACL,GAAG;MACH,IAAI;MACJ,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;MAAE,CAAC;IACzH,CAAC;EACH,CAAC;EACD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAAqE,IAAI,CAAC;EAClH,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW,EAAE,MAAe,KACzE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI;EAEhH,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,KAAyB,EAAE,GAAuB,EAAE,MAAyB,EAAE,MAAe,KAAK;IACvI,MAAM,KAAK,GAAG,gBAAgB,CAAC;MAAE,GAAG;MAAE,KAAK;MAAE;IAAI,CAAC,CAAC;IACnD,aAAa,CAAC,IAAI,CAAC;IACnB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE;MAClC,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;MACnC;IACF;IACA,YAAY,CAAC;MAAE,GAAG;MAAE,KAAK;MAAE;IAAI,CAAC,CAAC;IACjC,QAAQ,CAAC;MAAE,KAAK;MAAE,MAAM;MAAE,MAAM;MAAE,GAAG;MAAE,KAAK;MAAE;IAAI,CAAC,CAAC;EACtD,CAAC;EACD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;;EAE5F;EACA,MAAM,YAAY,GAAI,OAAwC,IAAkD;IAC9G,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC;IAC3B,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EACrE,OAAO;MAAE,GAAG,EAAE,OAAO,CAAC,GAAG;MAAE,KAAK,EAAE,OAAO,CAAC,KAAK;MAAE,GAAG,EAAE,OAAO,CAAC;IAAI,CAAC;IACrE,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAI,GAAW,IAAK;MAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE;MACrD,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC,GAAI,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,GAAI,IAAI;IAC1E,CAAC;IACD,IAAI,GAAW;IACf,IAAI,KAAoB;IACxB,IAAI,OAAO,EAAE;MACX,GAAG,GAAG,OAAO,CAAC,GAAG;MACjB,KAAK,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI;IACjD,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE;MAChE,GAAG,GAAG,MAAM,CAAC,CAAC;MACd,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;IACvB,CAAC,MAAM;MACL,GAAG,GAAG,OAAO,CAAC,KAAK;MACnB,KAAK,GAAG,IAAI;IACd;IACA,IAAI,KAAK,KAAK,IAAI,EAAE;MAClB,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;MACxB,KAAK,GAAG,IAAI;IACd;IACA,OAAO;MAAE,GAAG;MAAE,KAAK;MAAE,GAAG,EAAE,KAAK,GAAG;IAAG,CAAC;EACxC,CAAC;;EAED;EACA,IAAI,aAAuC;EAC3C,SAAS,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;EAClC,MAAM,IAAI,GAAI,KAA4B,IAAM,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAG;EACxE,MAAM,SAAS,GAAG;IAAE,OAAO,EAAE;EAAM,CAAC;EACpC,MAAM,UAAU,GAAI,KAAoB,IAAK;IAC3C,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,QAAQ;EACpC,CAAC;EACD,OAAO,CAAC,MAAM;IACZ,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC;IACpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC;IAClD,SAAS,CAAC,MAAM;MACd,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC;MACvD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC;IACvD,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,MAAM,UAAU,GAAG,MAAM;IACvB,QAAQ,CAAC,IAAI,CAAC;IACd,SAAS,CAAC,IAAI,CAAC;IACf,WAAW,CAAC,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,CAAC;EACjB,CAAC;EAED,MAAM,SAAS,GAAG,CAAC,YAA0B,EAAE,KAAoB,EAAE,GAAW,EAAE,KAAa,EAAE,GAAW,EAAE,QAAsB,KAAK;IACvI,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,QAAQ;IACzC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE;IACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;IAC3E,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK;IAC1B,aAAa,GAAG,CAAC;IACjB,aAAa,GAAG,2BAA2B,CAAC;MAC1C,KAAK,EAAE,YAAY;MACnB,eAAe,EAAE,QAAQ;MACzB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI;QACrB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC;UAAE,QAAQ,EAAE,SAAS,CAAC;QAAQ,CAAC,CAAC,CAAC,CAC9G,CAAC;QACD,OAAO;UAAE,GAAG,EAAE,GAAG,CAAC,GAAG;UAAE,KAAK,EAAE,IAAI;UAAE,GAAG,EAAE,IAAI,GAAG;QAAO,CAAC;MAC1D,CAAC;MACD,UAAU,EAAE,MAAM;QAChB,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,WAAW,CAAC,MAAM,CAAC;QACnB,YAAY,CAAC,IAAI,CAAC;MACpB,CAAC;MACD,SAAS,EAAG,IAAI,IAAK;QACnB,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACjF,MAAM,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;QAClH,SAAS,CAAC,GAAG,GAAG;UAAE,GAAG,EAAE,IAAI,CAAC,GAAG;UAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK;UAAE,IAAI,EAAE,GAAG,CAAC,IAAI;UAAE,IAAI,EAAE,GAAG,CAAC;QAAK,CAAC,GAAG,IAAI,CAAC;QAC/F,MAAM,IAAI,GAAG,MAAM,GACf,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;UAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;QAAE,CAAC,CAAC,GACnD,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;QAClF,QAAQ,CAAC;UACP,GAAG,EAAE,IAAI,CAAC,GAAG;UACb,KAAK,EAAE,IAAI,CAAC,KAAK;UACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;UACxC,KAAK,EAAE,KAAK,CAAC,KAAK;UAClB,IAAI,EAAE,KAAK,GAAG,GAAG,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAAE,KAAK,EAAE,KAAK,CAAC;UAAM,CAAC,CAAC,EAAE,GAAG,IAAI;UACvF,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC;UAC5B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;UACpB,GAAG,EAAE,GAAG,GAAG;YAAE,IAAI,EAAE,GAAG,CAAC,IAAI;YAAE,IAAI,EAAE,GAAG,CAAC;UAAK,CAAC,GAAG;QAClD,CAAC,CAAC;MACJ,CAAC;MACD,QAAQ,EAAG,IAAI,IAAK;QAClB,UAAU,CAAC,CAAC;QACZ,gBAAgB,CAAC,CAAC;QAClB,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC;QACA,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,GAClB,SAAS,GACT,MAAM,GACJ,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAC7E,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG;QAC9C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;QAC5G,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,EAAE;UAAE,KAAK,EAAE,SAAS;UAAE,GAAG,EAAE,OAAO;UAAE,MAAM,EAAE;QAAM,CAAC,CAAC;MACrF,CAAC;MACD,QAAQ,EAAE;IACZ,CAAC,CAAC;EACJ,CAAC;EAED,MAAM,WAAW,GAAG,CAClB,YAA0B,EAC1B,KAAoB,EACpB,GAAW,EACX,KAAa,EACb,GAAW,EACX,IAAqB,EACrB,QAAsB,KACnB;IACH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE;IAChC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7B,YAAY,CAAC,eAAe,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE;IACX,aAAa,GAAG,CAAC;IACjB,aAAa,GAAG,2BAA2B,CAAC;MAC1C,KAAK,EAAE,YAAY;MACnB,eAAe,EAAE,QAAQ;MACzB,SAAS,EAAE,CAAC;MACZ,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;UAAE,QAAQ,EAAE,SAAS,CAAC;QAAQ,CAAC,CAAC,CAAC;QAC5G,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC;UAAE,QAAQ,EAAE,SAAS,CAAC;QAAQ,CAAC,CAAC;QAClD,OAAO,IAAI,KAAK,KAAK,GACjB;UAAE,KAAK;UAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;QAAE,CAAC,GAC/D;UAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;UAAE;QAAI,CAAC;MAC/D,CAAC;MACD,UAAU,EAAE,MAAM;QAChB,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC;MACnB,CAAC;MACD,SAAS,EAAG,IAAI,IACd,QAAQ,CAAC;QACP,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;QACpF,QAAQ,EAAE,WAAW,CAAC,KAAK;MAC7B,CAAC,CAAC;MACJ,QAAQ,EAAG,IAAI,IAAK;QAClB,UAAU,CAAC,CAAC;QACZ,gBAAgB,CAAC,CAAC;QAClB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;QACzH,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,EAAE;UAAE,GAAG,KAAK;UAAE,MAAM,EAAE;QAAM,CAAC,CAAC;MACjE,CAAC;MACD,QAAQ,EAAE;IACZ,CAAC,CAAC;EACJ,CAAC;;EAED;EACA,MAAM,SAAS,GAAG,CAAC,YAA0B,EAAE,GAAW,EAAE,QAAsB,KAAK;IACrF,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,YAAY,CAAC,WAAW,KAAK,OAAO,EAAE;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE;IACX,MAAM,QAAQ,GAAI,OAAe,IAAK;MACpC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;MACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;MACvE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;IAC7C,aAAa,GAAG,CAAC;IACjB,aAAa,GAAG,2BAA2B,CAAC;MAC1C,KAAK,EAAE,YAAY;MACnB,eAAe,EAAE,QAAQ;MACzB,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC;UAAE,QAAQ,EAAE,SAAS,CAAC;QAAQ,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI;QAC/D,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI;QAC1D,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;QACtC,OAAO;UAAE,KAAK,EAAE,IAAI;UAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC;QAAE,CAAC;MACzD,CAAC;MACD,UAAU,EAAE,MAAM;QAChB,WAAW,CAAC,MAAM,CAAC;QACnB,YAAY,CAAC,IAAI,CAAC;QAClB,aAAa,CAAC,IAAI,CAAC;MACrB,CAAC;MACD,SAAS,EAAG,IAAI,IACd,QAAQ,CAAC;QACP,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB;QAClC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;MACpF,CAAC,CAAC;MACJ,QAAQ,EAAG,IAAI,IAAK;QAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAc,gCAAgC,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO;QAC7H,UAAU,CAAC,CAAC;QACZ,gBAAgB,CAAC,CAAC;QAClB,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;MACpD,CAAC;MACD,QAAQ,EAAE;IACZ,CAAC,CAAC;EACJ,CAAC;;EAED;EACA,MAAM,MAAM,GAAG,CACb,YAA0B,EAC1B,IAA0B,EAC1B,MAA+C,EAC/C,QAAsB,KACnB;IACH,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;IAC1D,aAAa,GAAG,CAAC;IACjB,aAAa,GAAG,SAAS;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAE;IAClE,IAAI,KAA8B;IAClC,IAAI,MAAuD;IAC3D,MAAM,MAAM,GACV,YAAY,CAAC,MAAM,YAAY,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAc,iCAAiC,CAAC,GAAG,IAAI;IACjI,IAAI,IAAI,GAAG,KAAK;IAChB,IAAI,OAAO,GAAG,KAAK;IACnB,MAAM,kBAAkB,GAAI,KAAY,IAAK,KAAK,CAAC,cAAc,CAAC,CAAC;IACnE,MAAM,aAAa,GAAI,KAAiB,IAAK;MAC3C,IAAI,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,OAAO,GAAG,MAAM;MACpB,IAAI,OAAO,EAAE;MACb,OAAO,GAAG,IAAI;MACd,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,aAAa,CAAC;MACxD,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC;MACnE,IAAI,YAAY,CAAC,WAAW,KAAK,OAAO,EAAE,IAAI,GAAG,KAAK;MACtD,IAAI,MAAM,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM;MACxC,KAAK,EAAE,MAAM,CAAC,CAAC;MACf,KAAK,GAAG,SAAS;MACjB,IAAI,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;MAC7C,MAAM,GAAG,SAAS;MAClB,UAAU,CAAC,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,MAAM;MAClB,aAAa,GAAG,2BAA2B,CAAC;QAC1C,KAAK,EAAE,YAAY;QACnB,eAAe,EAAE,QAAQ;QACzB,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,IAAI,IAAI,YAAY,CAAC,WAAW,KAAK,OAAO,GAAG,CAAC,GAAG,CAAC;QAC/D,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK;UAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;UACpC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO;YAAE,GAAG,EAAE,EAAE;YAAE,KAAK,EAAE,CAAC;YAAE,GAAG,EAAE,CAAC;YAAE,KAAK,EAAE;UAAK,CAAC;UAC7F,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;UAC9C,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;UACpD,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;UACrF,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;UAC/D,OAAO;YAAE,GAAG,EAAE,GAAG,CAAC,GAAG;YAAE,KAAK;YAAE,GAAG,EAAE,KAAK,GAAG,MAAM;YAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;YAAE;UAAI,CAAC;QAC5G,CAAC;QACD,UAAU,EAAE,MAAM;UAChB,WAAW,CAAC,UAAU,CAAC;UACvB,YAAY,CAAC,IAAI,CAAC;UAClB,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;UACrC,KAAK,CAAC,SAAS,GAAG,oBAAoB;UACtC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK;UAC9B,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,uBAAuB,EAAE,KAAK,CAAC;UACvD,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;UACzC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC;QACD,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK;UAC5B,IAAI,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,OAAO,GAAG,EAAE,OAAO,OAAO,GAAG,EAAE,KAAK;UACpF;UACA,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC;UAC5F,IAAI,KAAK,IAAI,MAAM,EAAE,OAAO,KAAK,KAAK,EAAE;YACtC,IAAI,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7C,MAAM,GAAG;cAAE,OAAO,EAAE,KAAK;cAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,MAAO,KAAK,CAAiB,KAAK,CAAC,CAAC,EAAE,GAAG;YAAE,CAAC;UAClG,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE;YAC3B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;YACjC,MAAM,GAAG,SAAS;UACpB;QACF,CAAC;QACD,SAAS,EAAG,IAAI,IAAK;UACnB,IAAI,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,OAAO;UAC7D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,QAAQ,CAAC,IAAI,CAAC;YACd,SAAS,CAAC,IAAI,CAAC;YACf;UACF;UACA,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG;YAAE,GAAG,EAAE,IAAI,CAAC,GAAG;YAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK;YAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;UAAK,CAAC,GAAG,IAAI,CAAC;UACnH,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE;UAC5E,QAAQ,CAAC;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC;cAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;YAAM,CAAC,CAAC,EAAE,GAAG,IAAI;YACjG,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG;cAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;cAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;YAAK,CAAC,GAAG;UACjE,CAAC,CAAC;QACJ,CAAC;QACD,QAAQ,EAAG,IAAI,IAAK;UAClB,gBAAgB,CAAC,CAAC;UAClB,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;YAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,EAAE;UAAM,CAAC,CAAC;QAClF,CAAC;QACD,KAAK,EAAE;MACT,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,CAAC,WAAW,KAAK,OAAO,EAAE;MACxC,KAAK,CAAC,CAAC;MACP;IACF;IACA;IACA,MAAM,MAAM,GAAG;MAAE,CAAC,EAAE,YAAY,CAAC,OAAO;MAAE,CAAC,EAAE,YAAY,CAAC;IAAQ,CAAC;IACnE,MAAM,KAAK,GAAG,MAAM;MAClB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;MAC1B,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC;MAChD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC;MAC9C,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,KAAK,CAAC;MAClD,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC;MACnE,IAAI,MAAM,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM;MACxC,IAAI,aAAa,KAAK,KAAK,EAAE,aAAa,GAAG,SAAS;IACxD,CAAC;IACD,MAAM,KAAK,GAAI,KAAmB,IAAK;MACrC,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAChI,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM;MACpC,KAAK,CAAC,CAAC;MACP,IAAI,GAAG,IAAI;MACX,IAAI,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM;MAC1C,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;MACtB,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE;QAAE,OAAO,EAAE;MAAM,CAAC,CAAC;MACzE,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC;MAChE,KAAK,CAAC,CAAC;IACT,CAAC,EAAE,GAAG,CAAC;IACP,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC;IAC7C,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC;IAC3C,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,KAAK,CAAC;IAC/C,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,CAAC;IAChE,aAAa,GAAG,KAAK;EACvB,CAAC;EAED,OAAO;IACL,KAAK;IACL,QAAQ;IACR,UAAU;IACV,KAAK;IACL,IAAI;IACJ,KAAK;IACL,SAAS;IACT,IAAI;IACJ,KAAK;IACL,KAAK;IACL,QAAQ;IACR,MAAM;IACN,SAAS;IACT,KAAK;IACL,aAAa;IACb,KAAK;IACL,QAAQ;IACR,OAAO;IACP,UAAU;IACV,SAAS;IACT,WAAW;IACX,OAAO;IACP,WAAW;IACX,OAAO;IACP,SAAS;IACT,YAAY;IACZ,UAAU;IACV,aAAa;IACb,SAAS;IACT,YAAY;IACZ,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,eAAe;IACf,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,MAAM;IACN,OAAO;IACP,SAAS;IACT,WAAW;IACX,SAAS;IACT,MAAM;IACN;EACF,CAAC;AACH,CAAC;AAID;AACA;AACA;AACA;AACA,OAAO,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,MAA0B,EAAE,KAAK,GAAG,KAAK,KACvF,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,GACpB,IAAI,CACD,OAAO,CAAC,KAAK,GAAG,6BAA6B,GAAG,+BAA+B,EAAE,IAAI,CAAC,CACtF,OAAO,CAAC,yDAAyD,EAAE,IAAI,CAAC,GAC3E,IAAI;;AAEV;AACA,OAAO,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,SAAS,GAAG,KAAK,KACrE,iBAAiB,CACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE;EACtE,OAAO,EAAE,OAAO;EAChB,GAAG,EAAE,SAAS;EACd,IAAI,SAAS,GAAG;IAAE,KAAK,EAAE;EAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;EACxC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC,EACF,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MACpB,CAAC;;AAEH;AACA,OAAO,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,GAAW,KACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE;EACtE,OAAO,EAAE,MAAM;EACf,KAAK,EAAE,MAAM;EACb,GAAG,EAAE,SAAS;EACd,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE;EAAU,CAAC,GAAG,CAAC,CAAC,CAAC;EACpF,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG,0BAA0B;;AAE7C;AACA,OAAO,MAAM,SAAS,GAAI,KAAkE,IAAK;EAC/F,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK;EAChE,MAAM,GAAG,gBAKR;EACD,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY;IAAA;IAAA,IACzC,QAAQ;MAAA,qDACyC,OAAO,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,0BAC1E,GAAG;IAAA;IAAA;MAAA,qDAQQ,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,iDAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;MAAM,CAAC,CAAC,sDAClE,KAAK,CAAC,QAAQ,iDACV,OAAO,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,sDACzB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,YAAG,SAAS,0BAQnF,GAAG;IAAA;EAAA;AAIZ,CAAC;;AAED;AACA,OAAO,MAAM,QAAQ,GAAI,KAaxB,IAAK;EACJ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;EACvB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI;EACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;EAC9B,MAAM,KAAK,GAAG,MAAO,KAAK,CAAC,QAAQ,GAAG,WAAW,GAAG,IAAI,CAAC,CAAE;EAC3D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;EACxD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;EAC1D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;EACrE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;EACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;EAC1C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;EACnG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG;EAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK;EACtD,MAAM,MAAM,GAAG,MAAO,MAAM,CAAC,CAAC,GAAG,EAAE,GAAI,KAAK,CAAC,MAAM,GAAG,CAAC;EACvD,MAAM,IAAI,GAAG,MAAO,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAI;EACrE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;EAC7C,MAAM,SAAS,GAAG,MAAO,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;EAAE,CAAC,CAAC,GAAG,SAAU;EACxI,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;EACjE,qEAGyB,KAAK,CAAC,CAAC,CAAC,EAAE,uDACpB,IAAI,CAAC,CAAC,8CACN,IAAI,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,iDACxB,OAAO,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,iDAC9B,OAAO,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,kDAC7B,OAAO,CAAC,CAAC,KAAK,SAAS,GAAG,MAAM,YAAG,SAAS,sDACxC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,YAAG,SAAS,oDACzD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,gDACjD,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,YAAG,SAAS,0DAClD,KAAK,CAAC,CAAC,CAAC,OAAO,uEAEF,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,gEACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iEACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iEACxB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,2DACZ,OAAO,CAAC,CAAC,GAAG,YAAG,CAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,GAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,UAAG,YAAG,SAAS,uCAC9G,iBAAQ,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAS,mCAC7B,mDAA0C,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAU,8BAGrG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,OAAO,CAAC,CAAC;IAAA;IAAA;MAAA;IAAA;EAAA,gCAGpB,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,OAAO,CAAC,CAAC,KAAK,SAAS;IAAA;IAAA;MAAA,yBAChC,SAAS;QAAC,IAAI,EAAE,IAAI;QAAA,IAAE,KAAK;UAAA,OAAE,KAAK,CAAC,CAAC;QAAA;QAAA,IAAE,QAAQ;UAAA,OAAE,KAAK,CAAC,QAAQ,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;QAAA;MAAA;IAAA;EAAA,gCAE/F,SAAS;IAAA,IACR,KAAK;MAAA,OAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;IAAA;IAAA,IAC7C,KAAK;MAAA,OAAE,IAAI,CAAC,KAAK,CAAC,KAAK;IAAA;IAAA,IACvB,IAAI;MAAA,OAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAAA;IAC1C,IAAI;IACJ,QAAQ;IAAA,IACR,OAAO;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA,IACtB,SAAS;MAAA,OAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAAA;IAAA,IAC1E,YAAY;MAAA,OAAE,qBAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,QAAI,MAAM,CAAC,CAAC,IAAI,EAAE;IAAA;IAAA,IACpE,SAAS;MAAA,OAAE,SAAS,CAAC,CAAC;IAAA;IAAA,IACtB,QAAQ;MAAA,OAAE,OAAO,CAAC,CAAC,KAAK,SAAS;IAAA;IAAA,IACjC,OAAO;MAAA,OAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAAA;IAAA,IAC9B,MAAM;MAAA,OAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;IAAA;IAAA,IACtC,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACxB,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;IAAA,IAChB,iBAAiB;MAAA,OACf,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GACvB,YAAY,IAAK,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAC3H,SAAS;IAAA;EAAA,gCAGhB,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa;IAAA;IAAA;MAAA,0CASvC,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;QAAA;QAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAa7C,CAAC;;AAED;AACA,OAAO,MAAM,UAAU,GAAI,KAc1B,IAAK;EACJ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;EACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;EACjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM;EAC3D,qEAGyB,KAAK,CAAC,KAAK,CAAC,EAAE,8CACxB,IAAI,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,iDACxB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,GAAG,MAAM,YAAG,SAAS,iDAClD,OAAO,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,sDACzB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,YAAG,SAAS,+CAClE,KAAK,CAAC,KAAK,GAAG,MAAM,YAAG,SAAS,gDAC/B,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,YAAG,SAAS,uEAEzC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,uEACnB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,wEACjB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,gDAC7C,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,qCAKpE,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,OAAO,CAAC,CAAC,KAAK,SAAS;IAAA;IAAA;MAAA,yBAChC,SAAS;QAAC,IAAI,EAAE,IAAI;QAAA,IAAE,KAAK;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA,IAAE,QAAQ;UAAA,OAAE,KAAK,CAAC,QAAQ,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;QAAA;MAAA;IAAA;EAAA,gCAEnG,SAAS;IAAA,IACR,KAAK;MAAA,OAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;IAAA;IAAA,IACjD,KAAK;MAAA,OAAE,IAAI,CAAC,KAAK,CAAC,KAAK;IAAA;IAAA,IACvB,IAAI;MAAA,OAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAAA;IAC9C,OAAO;IACP,QAAQ;IAAA,IACR,QAAQ;MAAA,OAAE,OAAO,CAAC,CAAC,KAAK,SAAS;IAAA;IAAA,IACjC,OAAO;MAAA,OAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAAA;IAAA,IAClC,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACxB,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;IAAA,IAChB,QAAQ;MAAA,yBACL,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,QAAQ;QAAA;QAAA;UAAA,+BACiB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAAA;MAAA;IAAA;IAAA,IAGrE,iBAAiB;MAAA,OACf,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GACvB,YAAY,IAAK,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GACzH,SAAS;IAAA;EAAA;AAMzB,CAAC;;AAED;AACA,OAAO,MAAM,OAAO,GAAI,KASvB,IAAK;EACJ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;EACvB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK;EACpD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;EAC3D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;EAAE,CAAC,CAAC;EACvF,MAAM,GAAG,GAAG,MAAM;IAChB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,OAAO,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI;EACtG,CAAC;EACD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;EACzE;AACF;AACA;AACA;EACE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,CAAC,IAAI,iBAAiB;EACpD,MAAM,IAAI,GAAG,MAAO,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,SAAU;EAC3E,mDAGgB,QAAQ,CAAC,CAAC,YAAG,SAAS,UAAG,MAAM,uCAChC,MAAM,CAAC,CAAC,IAAI,gBAAgB,GAAG,MAAM,YAAG,SAAS,8CACjD,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,YAAG,SAAS,+CAClC,KAAK,CAAC,KAAK,GAAG,MAAM,YAAG,SAAS,6CAClC,GAAG,CAAC,CAAC,GAAI,GAAG,CAAC,CAAC,CAAE,IAAI,GAAG,KAAK,GAAG,OAAO,YAAI,SAAS,qDAC/C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,mDAAU,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,qCAG3H,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAAA;IAAA;MAAA,iDAId,QAAQ,CAAC,CAAC,YAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,UAAI,CAAC,CAAC,gDAC9D,IAAI,CAAC,CAAC,EAAE,EAAE,sDACX,IAAI,CAAC,CAAC,EAAE,MAAM,yDACX,IAAI,CAAC,CAAC,EAAE,MAAM,wDACf,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QACjC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;MAC/B,CAAC,CAAC,mDACK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;MAAE,CAAC,CAAC,iBAOvE,GAAG,CAAC,CAAC,YAAG,GAAG,CAAC,CAAC,CAAE,IAAI,aAAG,KAAK,CAAC,CAAC;IAAA;EAAA;AAK7E,CAAC;;AAED;AACA,OAAO,MAAM,YAAY,GAAI,KAA4D,IAAK;EAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;EACvB,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,OAAO,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI;EACjE,CAAC;EACD,MAAM,QAAQ,GAAG,MAAM;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,OAAO,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,GAAG,OAAO,GAAG,IAAI;EAC7H,CAAC;EACD,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,OAAO,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI;EACjE,CAAC;EACD,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,GAAW,KAAK;IAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC;IAC3D,OAAO;MAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;MAAE,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IAAE,CAAC;EAClH,CAAC;EACD,0BAEK,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,QAAQ,CAAC,CAAC;IAAA;IAAA,UAClB,IAAI,+BAA4C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAG,IAAI,CAAC,CAAC,CAAC,GAAI,CAAC;EAAuB,sBAEzG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,CAAC;IAAA;IAAA,UACf,IAAI,+BACmC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,yCAUpD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC;MAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;MAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;IAAE,CAAC,CAAC,0BAK3G,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,YAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,YAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;EAUtG,sBAEF,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,CAAC;IAAA;IAAA,UACf,OAAO,gDAIM,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,uCAChD,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,YAAG,SAAS,4BACvC;MAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;MAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI;IAAoB,CAAC,YAG5E,OAAO,CAAC,CAAC,CAAC,KAAK,YAChB,OAAO,CAAC,CAAC,CAAC,IAAI,8BACrD,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,OAAO,CAAC,CAAC,CAAC,GAAG;MAAA;MAAA,UACrB,GAAG,+CAC6C,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,OAAO,mBACzE,GAAG,CAAC,CAAC,CAAC,IAAI;IAEd;EAGN;AAIT,CAAC;;AAED;AACA,MAAM,gBAAgB,GAAG,CAAC,IAAc,EAAE,YAA0B,EAAE,IAAqB,KAAK;EAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;EAC/B,IAAI,CAAC,KAAK,EAAE;EACZ,YAAY,CAAC,cAAc,CAAC,CAAC;EAC7B,YAAY,CAAC,eAAe,CAAC,CAAC;EAC9B,2BAA2B,CAAC;IAC1B,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,CAAC;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK;MAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;MACzC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,OAAO,IAAI;MAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;MAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK;MAC1C,OAAO,IAAI,KAAK,KAAK,GACjB;QAAE,GAAG,OAAO;QAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;MAAE,CAAC,GAC5F;QAAE,GAAG,OAAO;QAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,EAAE,EAAE,MAAM,CAAC;MAAE,CAAC;IAC5E,CAAC;IACD,SAAS,EAAG,IAAI,IAAK;MACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;MACxB,IAAI,CAAC,YAAY,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC,GAAG;QAAE,KAAK,EAAE,IAAI,CAAC,KAAK;QAAE,GAAG,EAAE,IAAI,CAAC;MAAI,CAAC,CAAC;IACxE,CAAC;IACD,QAAQ,EAAE,MAAM,gBAAgB,CAAC;EACnC,CAAC,CAAC;AACJ,CAAC;;AAED;AACA,OAAO,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,GAAW,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;AAErH;AACA,OAAO,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,QAAiB,KAAK;EAC1E,MAAM,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;EAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAE,IAAI,IAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;EAC3G,OAAO,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;AACxC,CAAC;;AAED;AACA,OAAO,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,GAAW,KAAK;EAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;EAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;EACxB,OAAO,CACL,GAAG,KAAK,CAAC,KAAK,CACX,MAAM,CAAE,IAAI,IAAK,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CACjC,GAAG,CAAE,IAAI,KAAM;IACd,KAAK,EAAE,IAAI,CAAC,IAAI;IAChB,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;MAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;IAAE,CAAC;EAClH,CAAC,CAAC,CAAC,EACL,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAE,MAAM,IAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,CAAE,MAAM,KAAM;IAAE,KAAK,EAAE,MAAM,CAAC,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;EAAE,CAAC,CAAC,CAAC,CACtI;AACH,CAAC;;AAED;AACA,OAAO,MAAM,eAAe,GAAI,KAAyB,IAAK;EAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;EACvB,IAAI,OAAmC;EACvC,IAAI,WAA+B,GAAG,IAAI;EAC1C,YAAY,CAAC,MAAM;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE;IACd,IAAI,CAAC,OAAO,EAAE;MACZ,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;MAC3D;IACF;IACA,WAAW,GAAG,QAAQ,CAAC,aAAa,YAAY,WAAW,GAAG,QAAQ,CAAC,aAAa,GAAG,IAAI;IAC3F,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,cAAc,CAAC,MAAM;MACnB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;MACvD,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;MAC7C,OAAO,CAAC,aAAa,CAAc,sEAAsE,CAAC,EAAE,KAAK,CAAC,CAAC;IACrH,CAAC,CAAC;EACJ,CAAC,CAAC;EACF;EACA,MAAM,cAAc,GAAG,MAAM,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,CAAC,IAAI;EAClH,MAAM,KAAK,GAAI,OAAgB,IAAK;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE;IACd,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACnB;IACA,IAAI,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IACjI,IAAI,OAAO,IAAI,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;MAAE,aAAa,EAAE;IAAK,CAAC,CAAC;EACrF,CAAC;EACD,6DAMgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,4CAO9C,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAAA;IAAE,KAAK;IAAA,UAC3B,KAAK,IACL,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,KAAK,EAAE;MAChD,MAAM,EAAE,KAAK,CAAC,MAAM;MACpB,KAAK,EAAE,MAAM;QACX,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;MACrD;IACF,CAAC;EAAC;AAKZ,CAAC;;AAED;AACA,OAAO,MAAM,WAAW,GAAI,KAAmF,IAAK;EAClH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;EACvB,yBACG,GAAG;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,UAClB,IAAI,IAAK;MACT,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;MACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;MAC3C,kDAGc,IAAI,CAAC,MAAM,YAAG,SAAS,UAAG,MAAM,2CAC3B,OAAO,CAAC,CAAC,KAAK,SAAS,GAAG,MAAM,YAAG,SAAS,iDAC7C,OAAO,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,sDACzB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,YAAG,SAAS,uEACtC,WAAW,CAAC,KAAK,CAAC,qCAEnD,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,OAAO,CAAC,CAAC,KAAK,SAAS;QAAA;QAAA;UAAA,yBAChC,SAAS;YAAC,IAAI,EAAE,IAAI;YAAE,KAAK,EAAE;UAAK;QAAA;MAAA,gCAEpC,SAAS;QAAA,IACR,KAAK;UAAA,OAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;QAAA;QAAA,IAC3C,KAAK;UAAA,OAAE,IAAI,CAAC,KAAK,CAAC,KAAK;QAAA;QAAA,IACvB,IAAI;UAAA,OAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;QAAA;QACxC,OAAO;QACP,QAAQ;QAAA,IACR,GAAG;UAAA,OAAE,CAAC,IAAI,CAAC,MAAM;QAAA;QAAA,IACjB,QAAQ;UAAA,OAAE,OAAO,CAAC,CAAC,KAAK,SAAS;QAAA;QAAA,IACjC,OAAO;UAAA,OAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAAA;QAAA,IAC5B,eAAe;UAAA,OAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM;QAAA;QAAA,IAC7C,cAAc;UAAA,OAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM;QAAA;MAAA;IAInD;EAAC;AAGP,CAAC;;AAED;AACA,OAAO,MAAM,UAAU,GAAI,IAAY,IAAK;EAC1C,MAAM,KAAe,GAAG,EAAE;EAC1B,KAAK,IAAI,MAAM,GAAG,IAAI,GAAG,EAAE,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;EACnF,OAAO,KAAK;AACd,CAAC;AAED,OAAO,MAAM,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,MAAc,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE;;AAE3I;AACA,OAAO,MAAM,WAAW,GAAG,CAAC,KAA8B,EAAE,MAAc,KACxE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,CAAC,KAAK,IAAI,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC;;AAEpF;AACA,OAAO,MAAM,QAAQ,GAAG,CAAC,KAA8B,EAAE,GAAW,KAAK;EACvE,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;EACxC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CACtB,MAAM,IAAK,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,EACnH,CAAC;AACH,CAAC;;AAED;AACA,OAAO,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,GAAW,KAAK;EACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;EAC7B,MAAM,MAAM,GAAI,KAAoB,IAAK,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;EAClG,MAAM,GAAG,GAAG,CACV,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,IAAI,IAAK,IAAI,CAAC,IAAI,CAAC,EACvC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAE,MAAM,IAAK,MAAM,CAAC,IAAI,CAAC,EAC7C,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,IAAI,IAAK,IAAI,CAAC,IAAI,CAAC,CACxC;EACD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM;EACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK;IAAE;EAAM,CAAC,CAAC;AAClF,CAAC;;AAED;AACA,OAAO,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,GAAW,KAAK;EACvD,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE;EACpC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;EAC5B,MAAM,IAAI,GAAG,IAAI,CACd,KAAK,CAAC,GAAG,CAAC,CACV,KAAK,CAAC,MAAM,CAAE,IAAI,IAAK,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAChG,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;EACrD,OAAO,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;IAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;IAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG;EAAE,CAAC,CAAC,GAAG,EAAE;AACxH,CAAC;;AAED;AACA,OAAO,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,GAAW,KAAK;EACtD,MAAM,MAAM,GAAG,IAAI,CAChB,KAAK,CAAC,GAAG,CAAC,CACV,KAAK,CAAC,GAAG,CAAE,IAAI,KAAM;IAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI;EAAE,CAAC,CAAC,CAAC,CAC9H,MAAM,CAAE,KAAK,IAAK,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAC1C,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;EAClD,MAAM,MAAqB,GAAG,EAAE;EAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KACzE,MAAM,CAAC,IAAI,CAAC;MAAE,GAAG;IAAM,CAAC,CAAC;EAChC;EACA,OAAO,MAAM;AACf,CAAC;;AAED;AACA,OAAO,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,GAAW,KAAK;EACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;EACrF,OAAO,KAAK,CAAC,IAAI,CAAC;IAAE,MAAM,EAAE;EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/calendar-time-view.tsx"],"sourcesContent":["import { dates as calendar, type DateContext } from \"@k2b/stdlib\";\nimport { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport type { CalendarController, CalendarEvent, CalendarEventTimeChange, CalendarExternalDrag, CalendarLabels } from \"./Calendar\";\nimport {\n addDayKeys,\n buildDays,\n type CalendarDayHours,\n clockAt,\n DAY_MINUTES,\n type DayEntry,\n type DayGap,\n type DayGeometry,\n type DayLane,\n type DayModel,\n type DaySpan,\n dayKeyOf,\n dayLanes,\n dayMinuteAt,\n dayTopTerms,\n dayYTerms,\n freeGaps,\n GAP_LABEL_MINUTES,\n GAP_LONG_MINUTES,\n gapProposal,\n instantInDay,\n instantsInDay,\n minuteInDay,\n readDayGeometry,\n resizedInDay,\n snapMinutes,\n subtractTerms,\n termsCss,\n wakeMinutes,\n} from \"./calendar-days\";\nimport { useCalendarMessages } from \"./calendar-messages\";\nimport { startCalendarPointerSession } from \"./calendar-pointer\";\nimport {\n type CalendarOwner,\n type CalendarStop,\n EventChip,\n eventHref,\n type NormalizedEvent,\n ownerDateConfig,\n parseDate,\n placeCalendarPopover,\n validDate,\n} from \"./calendar-shared\";\n\n/**\n * Shared state and parts of the day and week views with `dayHours`: the time model of the loaded days, the selection,\n * the quick create, pointer gestures, and the pieces both views draw into a day's timeline.\n */\n\nexport type TodayDirection = \"left\" | \"right\" | \"up\" | \"down\" | \"\";\n\n/** What the header and the calendar's controller ask of the active day or week view. */\nexport type TimeViewHandle = {\n /** The first and last day the reader sees. */\n visibleKeys: () => { first: string; last: string };\n /** Moves by a day (day view) or a week (week view) when that is loaded; `false` leaves it to the header's link. */\n step: (direction: -1 | 1) => boolean;\n /** Shows a day when it is loaded; `false` leaves it to navigation. */\n goTo: (key: string) => boolean;\n /** Shows today and now when they are loaded. */\n today: () => boolean;\n todayDirection: () => TodayDirection;\n controller: CalendarController;\n};\n\nexport type TimeViewProps = {\n owner: CalendarOwner;\n view: \"day\" | \"week\";\n date: Date;\n now: Date;\n events: readonly CalendarEvent[];\n labels: Required<CalendarLabels>;\n hours: CalendarDayHours;\n register: (handle: TimeViewHandle | null) => void;\n};\n\nexport type TimeSelection = { key: string; start?: number; end?: number };\n\ntype Ghost = {\n key: string;\n start: number;\n end: number;\n title: string;\n time: string;\n colorHex?: string;\n color?: string;\n warn?: boolean;\n fit?: { fits: boolean; text: string };\n};\n\ntype QuickCreate = {\n range: CalendarEventTimeChange;\n anchor: Element | DOMRect;\n create?: string;\n key: string;\n start?: number;\n end?: number;\n};\n\nexport type BodyHit = { key: string; element: HTMLElement; geometry: DayGeometry; minute: number };\n\nconst COLOR_TOKENS: Record<string, string> = {\n blue: \"#3b82f6\",\n emerald: \"#10b981\",\n amber: \"#f59e0b\",\n red: \"#ef4444\",\n violet: \"#8b5cf6\",\n cyan: \"#06b6d4\",\n zinc: \"#a1a1aa\",\n};\nexport const eventAccent = (event: Pick<CalendarEvent, \"color\" | \"colorHex\">): string =>\n event.colorHex ?? COLOR_TOKENS[event.color ?? \"blue\"]!;\n\n/** Minimum minutes an overlap counts for a band, about the height of its title. */\nconst LANE_MINUTES = 20;\n\n/** Swallows the click a browser sends right after a gesture ends, never the next one. */\nexport const swallowNextClick = () => {\n const stop = (event: Event) => {\n event.stopPropagation();\n event.preventDefault();\n };\n window.addEventListener(\"click\", stop, { capture: true, once: true });\n window.setTimeout(() => window.removeEventListener(\"click\", stop, { capture: true }), 120);\n};\n\nexport const createTimeView = (props: TimeViewProps) => {\n const messages = useCalendarMessages();\n const dateConfig = createMemo((): DateContext => ownerDateConfig(props.owner));\n const hours = () => props.hours;\n const wake = createMemo(() => wakeMinutes(props.hours));\n const keyOf = (date: Date) => calendar.formatDateKey(date, dateConfig());\n const parseKey = (key: string) => calendar.parseCalendarDate(key, dateConfig());\n\n /** The loaded days: the host's range, or the day or the week of the date. */\n const range = createMemo(\n () => {\n const context = dateConfig();\n const loaded = props.owner.range;\n if (loaded) {\n const from = parseDate(loaded.from, context);\n const to = parseDate(loaded.to, context);\n if (validDate(from) && validDate(to)) {\n const first = calendar.formatDateKey(from, context);\n const last = calendar.formatDateKey(new Date(Math.max(from.getTime(), to.getTime() - 1)), context);\n return { first, last };\n }\n }\n const key = calendar.formatDateKey(props.date, context);\n if (props.view === \"day\") return { first: key, last: key };\n const start = calendar.formatDateKey(calendar.startOfWeek(props.date, context), context);\n return { first: start, last: addDayKeys(start, 6) };\n },\n undefined,\n { equals: (left, right) => left.first === right.first && left.last === right.last },\n );\n const anchorKey = createMemo(() => keyOf(props.date));\n\n /** Checkbox states the reader just set, shown until the host's events agree or drop the entry. */\n const [checks, setChecks] = createSignal<Record<string, boolean>>({});\n const [justChecked, setJustChecked] = createSignal<ReadonlySet<string>>(new Set());\n createEffect(\n on(\n () => props.events,\n (events) => {\n const current = untrack(checks);\n const ids = Object.keys(current);\n if (ids.length === 0) return;\n const next = { ...current };\n for (const id of ids) {\n const event = events.find((candidate) => candidate.id === id);\n if (!event || event.checked === current[id]) delete next[id];\n }\n setChecks(next);\n },\n { defer: true },\n ),\n );\n const checkedOf = (event: CalendarEvent): boolean | undefined =>\n event.checked === undefined ? undefined : (checks()[event.id] ?? event.checked);\n /** What Space on an entry's chip does: check its box, where it has one the reader may change. */\n const checkOf = (event: CalendarEvent) =>\n checkedOf(event) !== undefined && props.owner.onEventCheck ? () => toggleCheck(event) : undefined;\n const forgetJustChecked = (id: string) =>\n setJustChecked((value) => {\n if (!value.has(id)) return value;\n const rest = new Set(value);\n rest.delete(id);\n return rest;\n });\n /** Today's day for a moment after its last open to-do was checked off, which its heading celebrates. */\n const [cheered, setCheered] = createSignal<string | null>(null);\n let cheerTimer = 0;\n // The server renders the view too, and has no window.\n onCleanup(() => clearTimeout(cheerTimer));\n /** The entries with a checkbox on a day: its deadlines, the to-dos planned into its hours, and the ones due all day. */\n const dueOn = (key: string) => {\n const model = dayOf(key);\n return [\n ...model.markers.map((marker) => marker.item),\n ...model.bands.map((band) => band.item),\n ...model.spans.filter((span) => span.marker && span.firstKey === key).map((span) => span.item),\n ].filter((item) => item.checked !== undefined);\n };\n const toggleCheck = (event: CalendarEvent) => {\n const current = checkedOf(event);\n if (current === undefined || !props.owner.onEventCheck) return;\n const next = !current;\n setChecks((value) => ({ ...value, [event.id]: next }));\n if (next) {\n setJustChecked((value) => new Set([...value, event.id]));\n window.setTimeout(() => forgetJustChecked(event.id), 1100);\n const today = nowKey();\n const due = dueOn(today);\n if (due.includes(event) && due.every((item) => checkedOf(item))) {\n // The heading shows it only for a moment, so a screen reader hears it once instead.\n announce(messages().calendarAllDone);\n setCheered(today);\n window.clearTimeout(cheerTimer);\n cheerTimer = window.setTimeout(() => setCheered(null), 2200);\n }\n } else setCheered(null);\n // A change the host refuses puts the box back as it was.\n void Promise.resolve(props.owner.onEventCheck(event, next)).catch(() => {\n forgetJustChecked(event.id);\n if (next) setCheered(null);\n setChecks((value) => {\n if (value[event.id] !== next) return value;\n const rest = { ...value };\n delete rest[event.id];\n return rest;\n });\n });\n };\n\n const entries = createMemo((): DayEntry<CalendarEvent>[] => {\n const context = dateConfig();\n return props.events.flatMap((event) => {\n const start = parseDate(event.start, context);\n if (!validDate(start)) return [];\n const marker = event.display === \"marker\";\n const parsedEnd = event.end ? parseDate(event.end, context) : null;\n let end = parsedEnd && validDate(parsedEnd) && parsedEnd > start ? parsedEnd : null;\n if (!end)\n end = event.allDay\n ? calendar.addDays(calendar.startOfDay(start, context), 1, context)\n : marker\n ? start\n : new Date(start.getTime() + 3_600_000);\n return [{ item: event, start, end, allDay: Boolean(event.allDay), marker }];\n });\n });\n const days = createMemo(() => buildDays(range().first, range().last, entries(), props.hours, dateConfig()));\n const emptyModel = (key: string): DayModel<CalendarEvent> => ({ key, bands: [], markers: [], spans: [], night: false, empty: true });\n const dayOf = (key: string) => days().get(key) ?? emptyModel(key);\n const sourceOf = createMemo(() => new Map(entries().map((entry) => [entry.item, entry])));\n\n /** The day that holds now: before the start hour still the day before. */\n const nowKey = createMemo(() => dayKeyOf(props.now, props.hours, dateConfig()));\n const nowMinute = createMemo(() => minuteInDay(nowKey(), props.now, props.hours, dateConfig()));\n /** Now as a minute of a day: past days lie wholly before it, coming days after. */\n const nowIn = (key: string) => (key === nowKey() ? nowMinute() : key < nowKey() ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY);\n const calendarToday = createMemo(() => keyOf(props.now));\n const clock = (minute: number) => clockAt(minute, props.hours);\n const duration = (minutes: number) => messages().calendarDuration({ minutes: Math.max(1, Math.round(minutes)) });\n const instant = (key: string, minute: number) => instantInDay(key, minute, props.hours, dateConfig());\n const slot = (key: string, start: number, end: number) => instantsInDay(key, start, end, props.hours, dateConfig());\n const dayStartMinute = (hour: number) => Math.max(0, (hour - props.hours[0]) * 60);\n\n /** A day's timed piece as the event chip reads it. */\n const normalized = (event: CalendarEvent, key: string): NormalizedEvent => {\n const source = sourceOf().get(event);\n const start = source?.start ?? parseDate(event.start, dateConfig());\n const end = source?.end ?? start;\n return { ...event, startDate: start, endDate: end, sourceStartDate: start, sourceEndDate: end, dayKey: key };\n };\n\n const [selection, setSelection] = createSignal<TimeSelection | null>(null);\n const [touchDraft, setTouchDraft] = createSignal<{ key: string; start: number; end: number } | null>(null);\n const [activeKey, setActiveKey] = createSignal<string | null>(null);\n const [ghost, setGhost] = createSignal<Ghost | null>(null);\n const [movingId, setMovingId] = createSignal(\"\");\n const [dragging, setDragging] = createSignal<\"\" | \"move\" | \"start\" | \"end\" | \"draw\" | \"external\">(\"\");\n const [nightOverrides, setNightOverrides] = createSignal<Record<string, boolean>>({});\n const [quick, setQuick] = createSignal<QuickCreate | null>(null);\n\n const rangeOfSelection = (value: TimeSelection): CalendarEventTimeChange =>\n value.start === undefined || value.end === undefined\n ? { start: parseKey(value.key), end: calendar.addDays(parseKey(value.key), 1, dateConfig()), allDay: true }\n : { ...slot(value.key, value.start, value.end), allDay: false };\n createEffect(on(selection, (value) => props.owner.onSelectionChange?.(value ? rangeOfSelection(value) : null), { defer: true }));\n onCleanup(() => {\n if (untrack(selection)) props.owner.onSelectionChange?.(null);\n });\n\n // Body elements of the days on screen, for pointer positions.\n const bodies = new Map<string, { element: HTMLElement; expanded: () => boolean }>();\n const registerBody = (key: string, element: HTMLElement, expanded: () => boolean) => {\n bodies.set(key, { element, expanded });\n onCleanup(() => {\n if (bodies.get(key)?.element === element) bodies.delete(key);\n });\n };\n const bodyAt = (clientX: number, clientY: number): BodyHit | null => {\n for (const [key, body] of bodies) {\n if (!body.element.isConnected) continue;\n const rect = body.element.getBoundingClientRect();\n if (clientX < rect.left || clientX >= rect.right || clientY < rect.top || clientY >= rect.bottom) continue;\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n return { key, element: body.element, geometry, minute: dayMinuteAt(geometry, clientY - rect.top) };\n }\n return null;\n };\n const limitOf = (key: string) => (bodies.get(key)?.expanded() ? DAY_MINUTES : wake());\n const nightOpen = (key: string, model: DayModel<CalendarEvent>) => nightOverrides()[key] ?? model.night;\n const setNight = (key: string, open: boolean) => setNightOverrides((value) => ({ ...value, [key]: open }));\n\n /** The gap under a minute while dragging, and whether `need` minutes fit it; the gap shows \"fits\" or how much is missing. */\n const fitAt = (key: string, minute: number, need: number, span?: { start: number; end: number }) => {\n const gap = freeGaps(dayOf(key).bands, wake(), Number.NEGATIVE_INFINITY).find(\n (candidate) => minute >= candidate.start && minute < candidate.end,\n );\n if (!gap) return null;\n const fits = gap.end - gap.start >= need;\n if (fits && span && (span.start < gap.start || span.end > gap.end)) return null;\n return {\n gap,\n fits,\n text: fits ? messages().calendarFits : messages().calendarTooShort({ duration: duration(need - (gap.end - gap.start)) }),\n };\n };\n const [gapHit, setGapHit] = createSignal<{ key: string; start: number; fits: boolean; text: string } | null>(null);\n const overlapAt = (key: string, start: number, end: number, except?: string) =>\n dayOf(key).bands.find((band) => band.item.id !== except && band.start < end && band.end > start)?.item ?? null;\n\n const openQuickCreate = (key: string, start: number | undefined, end: number | undefined, anchor: Element | DOMRect, create?: string) => {\n const range = rangeOfSelection({ key, start, end });\n setTouchDraft(null);\n if (!props.owner.renderQuickCreate) {\n props.owner.onSlotActivate?.(range);\n return;\n }\n setSelection({ key, start, end });\n setQuick({ range, anchor, create, key, start, end });\n };\n const canCreate = () => Boolean(props.owner.renderQuickCreate || props.owner.onSlotActivate);\n\n /** The time a new entry takes: the selection, today's next full hour while today shows, else 09:00 of the first day. */\n const createTarget = (visible: { first: string; last: string }): { key: string; start: number; end: number } => {\n const current = selection();\n if (current && current.start !== undefined && current.end !== undefined)\n return { key: current.key, start: current.start, end: current.end };\n const nine = dayStartMinute(9);\n const nextHour = (key: string) => {\n const minute = Math.ceil((nowMinute() + 1) / 60) * 60;\n return key === nowKey() ? (minute <= wake() - 60 ? minute : null) : nine;\n };\n let key: string;\n let start: number | null;\n if (current) {\n key = current.key;\n start = key === nowKey() ? nextHour(key) : nine;\n } else if (nowKey() >= visible.first && nowKey() <= visible.last) {\n key = nowKey();\n start = nextHour(key);\n } else {\n key = visible.first;\n start = nine;\n }\n if (start === null) {\n key = addDayKeys(key, 1);\n start = nine;\n }\n return { key, start, end: start + 60 };\n };\n\n // Pointer gestures: moving and resizing bands and markers, drawing a new event, and dragging entries in.\n let cancelGesture: (() => void) | undefined;\n onCleanup(() => cancelGesture?.());\n const step = (event: { shiftKey: boolean }) => (event.shiftKey ? 5 : 15);\n const shiftHeld = { current: false };\n const trackShift = (event: KeyboardEvent) => {\n shiftHeld.current = event.shiftKey;\n };\n onMount(() => {\n window.addEventListener(\"keydown\", trackShift, true);\n window.addEventListener(\"keyup\", trackShift, true);\n onCleanup(() => {\n window.removeEventListener(\"keydown\", trackShift, true);\n window.removeEventListener(\"keyup\", trackShift, true);\n });\n });\n const endGesture = () => {\n setGhost(null);\n setGapHit(null);\n setMovingId(\"\");\n setDragging(\"\");\n };\n\n const startMove = (pointerEvent: PointerEvent, event: CalendarEvent, key: string, start: number, end: number, scroller?: HTMLElement) => {\n const marker = event.display === \"marker\";\n if (!props.owner.onEventDrop) return;\n const body = bodies.get(key);\n if (!body) return;\n const rect = body.element.getBoundingClientRect();\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n const grab = dayMinuteAt(geometry, pointerEvent.clientY - rect.top) - start;\n const length = end - start;\n cancelGesture?.();\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n resolve: (clientX, clientY) => {\n const hit = bodyAt(clientX, clientY);\n if (!hit) return null;\n const limit = limitOf(hit.key);\n const from = Math.max(\n 0,\n Math.min(limit - Math.max(length, 15), snapMinutes(hit.minute - grab, step({ shiftKey: shiftHeld.current }))),\n );\n return { key: hit.key, start: from, end: from + length };\n },\n onActivate: () => {\n setMovingId(event.id);\n setDragging(\"move\");\n setSelection(null);\n },\n onPreview: (next) => {\n const clash = marker ? null : overlapAt(next.key, next.start, next.end, event.id);\n const fit = marker ? null : fitAt(next.key, next.start + (next.end - next.start) / 2, next.end - next.start, next);\n setGapHit(fit ? { key: next.key, start: fit.gap.start, fits: fit.fits, text: fit.text } : null);\n const time = marker\n ? messages().calendarDue({ time: clock(next.start) })\n : `${clock(next.start)}–${clock(next.end)} · ${duration(next.end - next.start)}`;\n setGhost({\n key: next.key,\n start: next.start,\n end: marker ? next.start + 20 : next.end,\n title: event.title,\n time: clash ? `${time} · ${messages().calendarOverlaps({ title: clash.title })}` : time,\n colorHex: eventAccent(event),\n warn: Boolean(clash),\n fit: fit ? { fits: fit.fits, text: fit.text } : undefined,\n });\n },\n onCommit: (next) => {\n endGesture();\n swallowNextClick();\n if (next.key === key && next.start === start && next.end === end) return;\n const source = sourceOf().get(event);\n // A moved entry keeps its real length, also when it lands across a clock change.\n const startDate = instant(next.key, next.start);\n const endDate = marker\n ? startDate\n : source\n ? new Date(startDate.getTime() + source.end.getTime() - source.start.getTime())\n : slot(next.key, next.start, next.end).end;\n if (source && source.start.getTime() === startDate.getTime() && source.end.getTime() === endDate.getTime()) return;\n props.owner.onEventDrop?.(event, { start: startDate, end: endDate, allDay: false });\n },\n onCancel: endGesture,\n });\n };\n\n const startResize = (\n pointerEvent: PointerEvent,\n event: CalendarEvent,\n key: string,\n start: number,\n end: number,\n edge: \"start\" | \"end\",\n scroller?: HTMLElement,\n ) => {\n if (!props.owner.onEventResize) return;\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n const body = bodies.get(key);\n if (!body) return;\n cancelGesture?.();\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n threshold: 1,\n resolve: (_clientX, clientY) => {\n const rect = body.element.getBoundingClientRect();\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n const minute = snapMinutes(dayMinuteAt(geometry, clientY - rect.top), step({ shiftKey: shiftHeld.current }));\n const limit = limitOf(key);\n const size = step({ shiftKey: shiftHeld.current });\n return edge === \"end\"\n ? { start, end: Math.max(start + size, Math.min(limit, minute)) }\n : { start: Math.max(0, Math.min(end - size, minute)), end };\n },\n onActivate: () => {\n setMovingId(event.id);\n setDragging(edge);\n },\n onPreview: (next) =>\n setGhost({\n key,\n start: next.start,\n end: next.end,\n title: event.title,\n time: `${clock(next.start)}–${clock(next.end)} · ${duration(next.end - next.start)}`,\n colorHex: eventAccent(event),\n }),\n onCommit: (next) => {\n endGesture();\n swallowNextClick();\n if (next.start === start && next.end === end) return;\n const source = sourceOf().get(event);\n const range = source ? resizedInDay(source, edge, key, next, props.hours, dateConfig()) : slot(key, next.start, next.end);\n props.owner.onEventResize?.(event, { ...range, allDay: false });\n },\n onCancel: endGesture,\n });\n };\n\n /** Drawing on free time: a new event with its live length, on a 15-minute grid, with Shift on 5 minutes. */\n const startDraw = (pointerEvent: PointerEvent, key: string, scroller?: HTMLElement) => {\n if (!canCreate() || pointerEvent.pointerType !== \"mouse\") return;\n const body = bodies.get(key);\n if (!body) return;\n const minuteAt = (clientY: number) => {\n const rect = body.element.getBoundingClientRect();\n const geometry = readDayGeometry(body.element, wake(), body.expanded());\n return Math.max(0, Math.min(limitOf(key), dayMinuteAt(geometry, clientY - rect.top)));\n };\n const origin = minuteAt(pointerEvent.clientY);\n cancelGesture?.();\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n resolve: (_clientX, clientY) => {\n const size = step({ shiftKey: shiftHeld.current });\n const minute = minuteAt(clientY);\n const from = Math.floor(Math.min(origin, minute) / size) * size;\n let to = Math.ceil(Math.max(origin, minute) / size) * size;\n if (to - from < size) to = from + size;\n return { start: from, end: Math.min(to, limitOf(key)) };\n },\n onActivate: () => {\n setDragging(\"draw\");\n setSelection(null);\n setTouchDraft(null);\n },\n onPreview: (next) =>\n setGhost({\n key,\n start: next.start,\n end: next.end,\n title: messages().calendarNewEvent,\n time: `${clock(next.start)}–${clock(next.end)} · ${duration(next.end - next.start)}`,\n }),\n onCommit: (next) => {\n const anchor = document.querySelector<HTMLElement>(\".k2b-calendar-ghost[data-live]\")?.getBoundingClientRect() ?? body.element;\n endGesture();\n swallowNextClick();\n openQuickCreate(key, next.start, next.end, anchor);\n },\n onCancel: endGesture,\n });\n };\n\n /** Follows a pointer that pressed an entry outside the calendar into its free time. */\n const dragIn = (\n pointerEvent: PointerEvent,\n item: CalendarExternalDrag,\n onDrop: (slot: CalendarEventTimeChange) => void,\n scroller?: HTMLElement,\n ) => {\n if (pointerEvent.button !== 0 || !pointerEvent.isPrimary) return;\n cancelGesture?.();\n cancelGesture = undefined;\n const length = Math.max(15, Math.round(item.minutes));\n const color = item.colorHex ?? COLOR_TOKENS[item.color ?? \"blue\"]!;\n let token: HTMLElement | undefined;\n let spring: { element: Element; timer: number } | undefined;\n const target =\n pointerEvent.target instanceof HTMLElement ? pointerEvent.target.closest<HTMLElement>(\"li, [data-calendar-drag-source]\") : null;\n let held = false;\n let cleaned = false;\n const preventContextMenu = (event: Event) => event.preventDefault();\n const preventScroll = (event: TouchEvent) => {\n if (held) event.preventDefault();\n };\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n document.removeEventListener(\"touchmove\", preventScroll);\n window.removeEventListener(\"contextmenu\", preventContextMenu, true);\n if (pointerEvent.pointerType === \"touch\") held = false;\n if (target) delete target.dataset.lifted;\n token?.remove();\n token = undefined;\n if (spring) window.clearTimeout(spring.timer);\n spring = undefined;\n endGesture();\n };\n const begin = () => {\n cancelGesture = startCalendarPointerSession({\n event: pointerEvent,\n scrollContainer: scroller,\n armAutoScroll: true,\n threshold: held && pointerEvent.pointerType !== \"mouse\" ? 1 : 6,\n resolve: (clientX, clientY) => {\n const hit = bodyAt(clientX, clientY);\n if (!hit || hit.minute >= limitOf(hit.key)) return { key: \"\", start: 0, end: 0, clash: null };\n const fit = fitAt(hit.key, hit.minute, length);\n let start = snapMinutes(hit.minute - length / 2, 15);\n if (fit?.fits) start = Math.max(fit.gap.start, Math.min(fit.gap.end - length, start));\n start = Math.max(0, Math.min(limitOf(hit.key) - length, start));\n return { key: hit.key, start, end: start + length, clash: overlapAt(hit.key, start, start + length), fit };\n },\n onActivate: () => {\n setDragging(\"external\");\n setSelection(null);\n token = document.createElement(\"div\");\n token.className = \"k2b-calendar-token\";\n token.textContent = item.title;\n token.style.setProperty(\"--k2b-calendar-accent\", color);\n token.setAttribute(\"aria-hidden\", \"true\");\n document.body.append(token);\n },\n onMove: (clientX, clientY) => {\n if (token) token.style.transform = `translate(${clientX + 12}px, ${clientY + 10}px)`;\n // A folded run of empty days opens when the entry rests on it.\n const empty = document.elementFromPoint(clientX, clientY)?.closest(\"[data-calendar-unfold]\");\n if (empty && spring?.element !== empty) {\n if (spring) window.clearTimeout(spring.timer);\n spring = { element: empty, timer: window.setTimeout(() => (empty as HTMLElement).click(), 650) };\n } else if (!empty && spring) {\n window.clearTimeout(spring.timer);\n spring = undefined;\n }\n },\n onPreview: (next) => {\n if (token) token.dataset.hidden = next.key ? \"true\" : \"false\";\n if (!next.key) {\n setGhost(null);\n setGapHit(null);\n return;\n }\n setGapHit(next.fit ? { key: next.key, start: next.fit.gap.start, fits: next.fit.fits, text: next.fit.text } : null);\n const time = `${clock(next.start)}–${clock(next.end)} · ${duration(length)}`;\n setGhost({\n key: next.key,\n start: next.start,\n end: next.end,\n title: item.title,\n time: next.clash ? `${time} · ${messages().calendarOverlaps({ title: next.clash.title })}` : time,\n colorHex: color,\n warn: Boolean(next.clash),\n fit: next.fit ? { fits: next.fit.fits, text: next.fit.text } : undefined,\n });\n },\n onCommit: (next) => {\n swallowNextClick();\n if (next.key) onDrop({ ...slot(next.key, next.start, next.end), allDay: false });\n },\n onEnd: cleanup,\n });\n };\n if (pointerEvent.pointerType === \"mouse\") {\n begin();\n return;\n }\n // A finger first holds the entry still, so a short swipe keeps scrolling the list it sits in.\n const origin = { x: pointerEvent.clientX, y: pointerEvent.clientY };\n const abort = () => {\n window.clearTimeout(timer);\n window.removeEventListener(\"pointermove\", watch);\n window.removeEventListener(\"pointerup\", abort);\n window.removeEventListener(\"pointercancel\", abort);\n window.removeEventListener(\"contextmenu\", preventContextMenu, true);\n if (target) delete target.dataset.lifted;\n if (cancelGesture === abort) cancelGesture = undefined;\n };\n const watch = (event: PointerEvent) => {\n if (event.pointerId === pointerEvent.pointerId && Math.hypot(event.clientX - origin.x, event.clientY - origin.y) > 10) abort();\n };\n const timer = window.setTimeout(() => {\n abort();\n held = true;\n if (target) target.dataset.lifted = \"true\";\n navigator.vibrate?.(8);\n document.addEventListener(\"touchmove\", preventScroll, { passive: false });\n window.addEventListener(\"contextmenu\", preventContextMenu, true);\n begin();\n }, 420);\n window.addEventListener(\"pointermove\", watch);\n window.addEventListener(\"pointerup\", abort);\n window.addEventListener(\"pointercancel\", abort);\n window.addEventListener(\"contextmenu\", preventContextMenu, true);\n cancelGesture = abort;\n };\n\n return {\n props,\n messages,\n dateConfig,\n hours,\n wake,\n range,\n anchorKey,\n days,\n dayOf,\n keyOf,\n parseKey,\n nowKey,\n nowMinute,\n nowIn,\n calendarToday,\n clock,\n duration,\n instant,\n normalized,\n checkedOf,\n toggleCheck,\n checkOf,\n justChecked,\n cheered,\n selection,\n setSelection,\n touchDraft,\n setTouchDraft,\n activeKey,\n setActiveKey,\n ghost,\n gapHit,\n movingId,\n dragging,\n nightOpen,\n setNight,\n quick,\n setQuick,\n openQuickCreate,\n canCreate,\n createTarget,\n rangeOfSelection,\n registerBody,\n bodyAt,\n limitOf,\n startMove,\n startResize,\n startDraw,\n dragIn,\n dayStartMinute,\n };\n};\n\nexport type TimeView = ReturnType<typeof createTimeView>;\n\n/**\n * German short dates read \"Fr 9. Okt\", without the dots of the abbreviations; with `comma`, a title such as\n * \"Fr, 9. Okt 2026\" keeps the comma after the day.\n */\nexport const compactGermanDate = (text: string, locale: string | undefined, comma = false) =>\n locale?.startsWith(\"de\")\n ? text\n .replace(comma ? /\\b(Mo|Di|Mi|Do|Fr|Sa|So)\\./g : /\\b(Mo|Di|Mi|Do|Fr|Sa|So)\\.,?/g, \"$1\")\n .replace(/\\b(Jan|Feb|Mär|Apr|Jun|Jul|Aug|Sep|Sept|Okt|Nov|Dez)\\./g, \"$1\")\n : text;\n\n/** A short day such as \"Fri 9\" or \"Fr 9.\", in the calendar's locale. */\nexport const shortDay = (view: TimeView, key: string, withMonth = false) =>\n compactGermanDate(\n view.parseKey(key).toLocaleDateString(view.dateConfig().locale ?? \"en\", {\n weekday: \"short\",\n day: \"numeric\",\n ...(withMonth ? { month: \"short\" } : {}),\n timeZone: view.dateConfig().timeZone,\n }),\n view.dateConfig().locale,\n );\n\n/** A long day such as \"Friday, October 9\", with the year when it is not this year's. */\nexport const longDay = (view: TimeView, key: string) =>\n view.parseKey(key).toLocaleDateString(view.dateConfig().locale ?? \"en\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n ...(key.slice(0, 4) !== view.calendarToday().slice(0, 4) ? { year: \"numeric\" } : {}),\n timeZone: view.dateConfig().timeZone,\n });\n\nconst CHECK_PATH = \"M4.6 8.3l2.3 2.3 4.6-4.9\";\n\n/** A to-do's checkbox: it draws its check, and the title beside it strikes through. */\nexport const TimeCheck = (props: { view: TimeView; event: CalendarEvent; tabIndex?: number }) => {\n const checked = () => props.view.checkedOf(props.event) ?? false;\n const box = (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <rect x=\"1.75\" y=\"1.75\" width=\"12.5\" height=\"12.5\" rx=\"3.5\" />\n <path d={CHECK_PATH} />\n </svg>\n );\n return (\n <Show\n when={props.view.props.owner.onEventCheck}\n fallback={\n <span class=\"k2b-calendar-check\" data-checked={checked() ? \"true\" : undefined} aria-hidden=\"true\">\n {box}\n </span>\n }\n >\n <button\n type=\"button\"\n class=\"k2b-calendar-check\"\n role=\"checkbox\"\n aria-checked={checked() ? \"true\" : \"false\"}\n aria-label={props.view.messages().calendarDone({ title: props.event.title })}\n tabIndex={props.tabIndex}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={props.view.justChecked().has(props.event.id) ? \"true\" : undefined}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n props.view.toggleCheck(props.event);\n }}\n >\n {box}\n </button>\n </Show>\n );\n};\n\n/** A timed entry in a day's timeline: a band as long as the entry, side by side with overlapping ones. */\nexport const TimeBand = (props: {\n view: TimeView;\n band: DayLane<CalendarEvent>;\n dayKey: string;\n expanded: boolean;\n compact?: boolean;\n /** Day view: a tall band shows its place. */\n showLocation?: boolean;\n /** The height of an hour on a wide screen, for the band's size class and title lines. */\n hourPx: number;\n tabIndex?: number;\n stop?: CalendarStop;\n scroller?: () => HTMLElement | undefined;\n}) => {\n const view = props.view;\n const event = () => props.band.item;\n const wake = () => view.wake();\n const limit = () => (props.expanded ? DAY_MINUTES : wake());\n const visibleStart = () => Math.max(0, props.band.start);\n const visibleEnd = () => Math.min(limit(), props.band.end);\n const top = () => dayTopTerms(wake(), props.expanded, visibleStart());\n const bottom = () => dayYTerms(wake(), props.expanded, visibleEnd());\n const now = () => view.nowIn(props.dayKey);\n const running = () => now() >= props.band.start && now() < props.band.end && Number.isFinite(now());\n const past = () => now() >= props.band.end;\n const length = () => props.band.end - props.band.start;\n const pixels = () => (length() / 60) * props.hourPx - 2;\n const size = () => (pixels() < 27 ? \"xs\" : pixels() < 40 ? \"s\" : \"m\");\n const checked = () => view.checkedOf(event());\n const remaining = () => (running() ? view.messages().calendarRemaining({ duration: view.duration(props.band.end - now()) }) : undefined);\n const lines = () => Math.max(1, Math.floor((pixels() - 24) / 15));\n return (\n <div\n class=\"k2b-calendar-band\"\n data-calendar-entry={event().id}\n data-size={size()}\n data-past={past() ? \"true\" : undefined}\n data-running={running() ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(event().id) ? \"true\" : undefined}\n data-cut-bottom={props.band.end > limit() ? \"true\" : undefined}\n data-moving={view.movingId() === event().id ? \"true\" : undefined}\n data-display={event().display}\n style={{\n \"--k2b-calendar-accent\": eventAccent(event()),\n \"--k2b-calendar-lane\": String(props.band.lane),\n \"--k2b-calendar-lanes\": String(props.band.lanes),\n \"--k2b-calendar-lines\": String(lines()),\n \"--k2b-calendar-progress\": running() ? `${(((now() - props.band.start) / length()) * 100).toFixed(1)}%` : undefined,\n top: `calc(${termsCss(top())} + 1px)`,\n height: `max(var(--k2b-calendar-band-min), calc(${termsCss(subtractTerms(bottom(), top()))} - 2px))`,\n }}\n >\n <Show when={running()}>\n <span class=\"k2b-calendar-band__fill\" aria-hidden=\"true\" />\n </Show>\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={event()} tabIndex={props.tabIndex === undefined ? undefined : -1} />\n </Show>\n <EventChip\n event={view.normalized(event(), props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, event())}\n fill\n timeline\n compact={props.compact}\n timeLabel={`${view.clock(props.band.start)}–${view.clock(props.band.end)}`}\n showLocation={props.showLocation && size() === \"m\" && pixels() >= 64}\n remaining={remaining()}\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(event())}\n moving={view.movingId() === event().id}\n tabIndex={props.tabIndex}\n stop={props.stop}\n onMovePointerDown={\n view.props.owner.onEventDrop\n ? (pointerEvent) => view.startMove(pointerEvent, event(), props.dayKey, props.band.start, props.band.end, props.scroller?.())\n : undefined\n }\n />\n <Show when={view.props.owner.onEventResize}>\n <span\n class=\"k2b-calendar-band__grip\"\n data-edge=\"start\"\n aria-hidden=\"true\"\n onPointerDown={(pointerEvent) =>\n view.startResize(pointerEvent, event(), props.dayKey, props.band.start, props.band.end, \"start\", props.scroller?.())\n }\n />\n <Show when={props.band.end <= limit()}>\n <span\n class=\"k2b-calendar-band__grip\"\n data-edge=\"end\"\n aria-hidden=\"true\"\n onPointerDown={(pointerEvent) =>\n view.startResize(pointerEvent, event(), props.dayKey, props.band.start, props.band.end, \"end\", props.scroller?.())\n }\n />\n </Show>\n </Show>\n </div>\n );\n};\n\n/** A point in time such as a deadline: a dashed line across the day and a pill with its checkbox and title. */\nexport const TimeMarker = (props: {\n view: TimeView;\n event: CalendarEvent;\n minute: number;\n dayKey: string;\n expanded: boolean;\n above: boolean;\n /** The pill's place among deadlines whose pills would cover each other, from the left. */\n lane: number;\n lanes: number;\n showTime: boolean;\n tabIndex?: number;\n stop?: CalendarStop;\n scroller?: () => HTMLElement | undefined;\n}) => {\n const view = props.view;\n const checked = () => view.checkedOf(props.event);\n const past = () => view.nowIn(props.dayKey) >= props.minute;\n return (\n <div\n class=\"k2b-calendar-marker\"\n data-calendar-entry={props.event.id}\n data-past={past() ? \"true\" : undefined}\n data-overdue={past() && checked() === false ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(props.event.id) ? \"true\" : undefined}\n data-above={props.above ? \"true\" : undefined}\n data-moving={view.movingId() === props.event.id ? \"true\" : undefined}\n style={{\n \"--k2b-calendar-accent\": eventAccent(props.event),\n \"--k2b-calendar-marker-lane\": String(props.lane),\n \"--k2b-calendar-marker-lanes\": String(props.lanes),\n top: termsCss(dayTopTerms(view.wake(), props.expanded, props.minute)),\n }}\n >\n <span class=\"k2b-calendar-marker__line\" aria-hidden=\"true\" />\n <span class=\"k2b-calendar-marker__pill\">\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={props.event} tabIndex={props.tabIndex === undefined ? undefined : -1} />\n </Show>\n <EventChip\n event={view.normalized(props.event, props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, props.event)}\n compact\n timeline\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(props.event)}\n tabIndex={props.tabIndex}\n stop={props.stop}\n trailing={\n <Show when={props.showTime}>\n <span class=\"k2b-calendar-marker__time\">{view.clock(props.minute)}</span>\n </Show>\n }\n onMovePointerDown={\n view.props.owner.onEventDrop\n ? (pointerEvent) => view.startMove(pointerEvent, props.event, props.dayKey, props.minute, props.minute, props.scroller?.())\n : undefined\n }\n />\n </span>\n </div>\n );\n};\n\n/** Free time between entries, labelled from an hour on; activating it creates there. */\nexport const TimeGap = (props: {\n view: TimeView;\n gap: DayGap;\n dayKey: string;\n expanded: boolean;\n /** A deadline pill near the middle moves the label aside. */\n aside: boolean;\n tabIndex?: number;\n stop?: CalendarStop;\n}) => {\n const view = props.view;\n const length = () => props.gap.end - props.gap.start;\n const proposal = () => gapProposal(props.gap, view.hours());\n const label = () => view.messages().calendarFree({ duration: view.duration(length()) });\n const hit = () => {\n const current = view.gapHit();\n return current && current.key === props.dayKey && current.start === props.gap.start ? current : null;\n };\n const top = () => dayYTerms(view.wake(), props.expanded, props.gap.start);\n /**\n * Shorter free time is hidden until something is dragged into it, and past free time has no label, so neither is a\n * keyboard stop.\n */\n const labelled = () => length() >= GAP_LABEL_MINUTES;\n const stop = () => (labelled() && !props.gap.past ? props.stop : undefined);\n return (\n <div\n class=\"k2b-calendar-gap\"\n data-short={labelled() ? undefined : \"true\"}\n data-long={length() >= GAP_LONG_MINUTES ? \"true\" : undefined}\n data-past={props.gap.past ? \"true\" : undefined}\n data-aside={props.aside ? \"true\" : undefined}\n data-hit={hit() ? (hit()!.fits ? \"fit\" : \"short\") : undefined}\n style={{ top: termsCss(top()), height: termsCss(subtractTerms(dayYTerms(view.wake(), props.expanded, props.gap.end), top())) }}\n >\n <span class=\"k2b-calendar-gap__zone\" aria-hidden=\"true\" />\n <Show when={view.canCreate()}>\n <button\n type=\"button\"\n class=\"k2b-calendar-gap__button\"\n tabIndex={labelled() ? (props.tabIndex ?? (props.gap.past ? -1 : 0)) : -1}\n data-stop={stop()?.id}\n data-col={stop()?.column}\n data-minute={stop()?.minute}\n aria-label={view.messages().calendarFreeAction({\n duration: view.duration(length()),\n from: view.clock(props.gap.start),\n to: view.clock(props.gap.end),\n start: view.clock(proposal()[0]),\n end: view.clock(proposal()[1]),\n })}\n title={view.messages().calendarCreateAt({ start: view.clock(proposal()[0]), end: view.clock(proposal()[1]) })}\n onClick={(event) => {\n event.stopPropagation();\n view.openQuickCreate(props.dayKey, proposal()[0], proposal()[1], event.currentTarget);\n }}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span class=\"k2b-calendar-gap__text\">{hit() ? hit()!.text : label()}</span>\n </button>\n </Show>\n </div>\n );\n};\n\n/** The preview of a drag, a draw, or an entry dragged in, and the selected slot. */\nexport const TimeOverlays = (props: { view: TimeView; dayKey: string; expanded: boolean }) => {\n const view = props.view;\n const ghost = () => {\n const current = view.ghost();\n return current && current.key === props.dayKey ? current : null;\n };\n const selected = () => {\n const current = view.selection();\n return current && current.key === props.dayKey && current.start !== undefined && current.end !== undefined ? current : null;\n };\n const draft = () => {\n const current = view.touchDraft();\n return current && current.key === props.dayKey ? current : null;\n };\n const box = (start: number, end: number) => {\n const top = dayTopTerms(view.wake(), props.expanded, start);\n return { top: termsCss(top), height: termsCss(subtractTerms(dayYTerms(view.wake(), props.expanded, end), top)) };\n };\n return (\n <>\n <Show when={selected()}>\n {(slot) => <span class=\"k2b-calendar-slot\" style={box(slot().start!, slot().end!)} aria-hidden=\"true\" />}\n </Show>\n <Show when={draft()}>\n {(slot) => (\n <div class=\"k2b-calendar-draft\" style={box(slot().start, slot().end)}>\n <span\n class=\"k2b-calendar-draft__grip\"\n data-edge=\"start\"\n aria-hidden=\"true\"\n onPointerDown={(event) => startDraftResize(view, event, \"start\")}\n />\n <button\n type=\"button\"\n class=\"k2b-calendar-draft__open\"\n aria-label={view.messages().calendarCreateAt({ start: view.clock(slot().start), end: view.clock(slot().end) })}\n onClick={(event) => view.openQuickCreate(slot().key, slot().start, slot().end, event.currentTarget)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>\n {view.clock(slot().start)}–{view.clock(slot().end)} · {view.duration(slot().end - slot().start)}\n </span>\n </button>\n <span\n class=\"k2b-calendar-draft__grip\"\n data-edge=\"end\"\n aria-hidden=\"true\"\n onPointerDown={(event) => startDraftResize(view, event, \"end\")}\n />\n </div>\n )}\n </Show>\n <Show when={ghost()}>\n {(current) => (\n <div\n class=\"k2b-calendar-ghost\"\n data-live=\"true\"\n data-size={current().end - current().start < 40 ? \"s\" : \"m\"}\n data-warn={current().warn ? \"true\" : undefined}\n style={{ ...box(current().start, current().end), \"--k2b-calendar-accent\": current().colorHex ?? \"var(--k2b-action)\" }}\n aria-hidden=\"true\"\n >\n <span class=\"k2b-calendar-ghost__title\">{current().title}</span>\n <span class=\"k2b-calendar-ghost__time\">{current().time}</span>\n <Show when={current().fit}>\n {(fit) => (\n <span class=\"k2b-calendar-ghost__fit\" data-fit={fit().fits ? \"fit\" : \"short\"}>\n {fit().text}\n </span>\n )}\n </Show>\n </div>\n )}\n </Show>\n </>\n );\n};\n\n/** The handles of a tapped slot change its start or end. */\nconst startDraftResize = (view: TimeView, pointerEvent: PointerEvent, edge: \"start\" | \"end\") => {\n const draft = view.touchDraft();\n if (!draft) return;\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n startCalendarPointerSession({\n event: pointerEvent,\n threshold: 1,\n resolve: (clientX, clientY) => {\n const hit = view.bodyAt(clientX, clientY);\n if (!hit || hit.key !== draft.key) return null;\n const minute = snapMinutes(hit.minute, 15);\n const current = view.touchDraft() ?? draft;\n return edge === \"end\"\n ? { ...current, end: Math.max(current.start + 15, Math.min(view.limitOf(draft.key), minute)) }\n : { ...current, start: Math.max(0, Math.min(current.end - 15, minute)) };\n },\n onPreview: (next) => {\n view.setTouchDraft(next);\n view.setSelection({ key: next.key, start: next.start, end: next.end });\n },\n onCommit: () => swallowNextClick(),\n });\n};\n\n/** Free time of a day with the gap of now trimmed, as both views draw it. */\nexport const dayGaps = (view: TimeView, key: string) => freeGaps(view.dayOf(key).bands, view.wake(), view.nowIn(key));\n\n/** The bands of a day with their lanes, cut to what its timeline draws. */\nexport const dayBands = (view: TimeView, key: string, expanded: boolean) => {\n const limit = expanded ? DAY_MINUTES : view.wake();\n const visible = view.dayOf(key).bands.filter((band) => Math.min(limit, band.end) > Math.max(0, band.start));\n return dayLanes(visible, LANE_MINUTES);\n};\n\n/** Entries the folded night hides, as chips with their time. */\nexport const foldedEntries = (view: TimeView, key: string) => {\n const model = view.dayOf(key);\n const wake = view.wake();\n return [\n ...model.bands\n .filter((band) => band.end > wake)\n .map((band) => ({\n event: band.item,\n time: band.start >= wake ? view.clock(band.start) : view.messages().calendarUntil({ time: view.clock(band.end) }),\n })),\n ...model.markers.filter((marker) => marker.minute >= wake).map((marker) => ({ event: marker.item, time: view.clock(marker.minute) })),\n ];\n};\n\n/** The quick create at a slot or gap, as in the month view. */\nexport const TimeQuickCreate = (props: { view: TimeView }) => {\n const view = props.view;\n let element: HTMLDivElement | undefined;\n let returnFocus: HTMLElement | null = null;\n createEffect(() => {\n const current = view.quick();\n if (!element) return;\n if (!current) {\n if (element.matches(\":popover-open\")) element.hidePopover();\n return;\n }\n returnFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n if (!element.matches(\":popover-open\")) element.showPopover();\n queueMicrotask(() => {\n if (view.quick() !== current || !element?.isConnected) return;\n placeCalendarPopover(current.anchor, element);\n element.querySelector<HTMLElement>(\"input,textarea,select,button,a[href],[tabindex]:not([tabindex='-1'])\")?.focus();\n });\n });\n /** Whether the focus is in the popover, or fell to the page as it hid: only then does a close return it. */\n const focusInPopover = () => element?.contains(document.activeElement) || document.activeElement === document.body;\n const close = (restore: boolean) => {\n const current = view.quick();\n if (!current) return;\n const selection = view.selection();\n view.setQuick(null);\n // A late close must leave a newer selection in place.\n if (selection?.key === current.key && selection.start === current.start && selection.end === current.end) view.setSelection(null);\n if (restore && returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });\n };\n return (\n <div\n ref={element}\n class=\"k2b-calendar-popover\"\n popover=\"auto\"\n role=\"dialog\"\n aria-label={view.messages().calendarQuickCreate}\n data-kind=\"create\"\n onToggle={(event) => {\n if (event.newState !== \"closed\" || !view.quick() || event.currentTarget.matches(\":popover-open\")) return;\n close(focusInPopover());\n }}\n >\n <Show when={view.quick()} keyed>\n {(value) =>\n view.props.owner.renderQuickCreate?.(value.range, {\n create: value.create,\n close: () => {\n if (view.quick() === value) close(focusInPopover());\n },\n })\n }\n </Show>\n </div>\n );\n};\n\n/** All-day entries of a day as chips: bars with torn ends where they go on, and points due that day. */\nexport const AllDayChips = (props: { view: TimeView; dayKey: string; spans: readonly DaySpan<CalendarEvent>[] }) => {\n const view = props.view;\n return (\n <For each={props.spans}>\n {(span) => {\n const event = span.item;\n const checked = () => view.checkedOf(event);\n return (\n <span\n class=\"k2b-calendar-allday-chip\"\n data-bar={span.marker ? undefined : \"true\"}\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(event.id) ? \"true\" : undefined}\n style={{ \"--k2b-calendar-accent\": eventAccent(event) }}\n >\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={event} />\n </Show>\n <EventChip\n event={view.normalized(event, props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, event)}\n compact\n timeline\n bar={!span.marker}\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(event)}\n continuesBefore={span.firstKey < props.dayKey}\n continuesAfter={span.lastKey > props.dayKey}\n />\n </span>\n );\n }}\n </For>\n );\n};\n\n/** Hour labels and lines of a day's timeline with the night open, and the date at midnight. */\nexport const nightHours = (wake: number) => {\n const hours: number[] = [];\n for (let minute = wake + 60; minute < DAY_MINUTES; minute += 60) hours.push(minute);\n return hours;\n};\n\nexport const isNearNow = (view: TimeView, key: string, minute: number) => key === view.nowKey() && Math.abs(view.nowMinute() - minute) < 14;\n\n/** Whether a marker sits right above a band's start, so its pill goes above the line. */\nexport const markerAbove = (model: DayModel<CalendarEvent>, minute: number) =>\n model.bands.some((band) => band.start >= minute - 10 && band.start <= minute + 20);\n\n/** Whether a deadline pill sits near the middle of a gap, so the gap's label moves aside. */\nexport const gapAside = (model: DayModel<CalendarEvent>, gap: DayGap) => {\n const middle = (gap.start + gap.end) / 2;\n return model.markers.some(\n (marker) => marker.minute > gap.start - 10 && marker.minute < gap.end + 10 && Math.abs(marker.minute - middle) < 25,\n );\n};\n\n/** A day's counts for its header: events and all-day entries, to-dos and deadlines. */\nexport const daySummary = (view: TimeView, key: string) => {\n const model = view.dayOf(key);\n const isTask = (event: CalendarEvent) => event.display === \"marker\" || event.checked !== undefined;\n const all = [\n ...model.bands.map((band) => band.item),\n ...model.markers.map((marker) => marker.item),\n ...model.spans.map((span) => span.item),\n ];\n const tasks = all.filter(isTask).length;\n return view.messages().calendarDaySummary({ events: all.length - tasks, tasks });\n};\n\n/** What starts within the next hour today, such as \"Planning in 12 min\". */\nexport const soonNote = (view: TimeView, key: string) => {\n if (key !== view.nowKey()) return \"\";\n const now = view.nowMinute();\n const next = view\n .dayOf(key)\n .bands.filter((band) => band.start > now && band.start - now <= 60 && !view.checkedOf(band.item))\n .sort((left, right) => left.start - right.start)[0];\n return next ? view.messages().calendarSoon({ title: next.item.title, duration: view.duration(next.start - now) }) : \"\";\n};\n\n/** The busy minutes of a day's waking hours, merged, with the color of the first entry, for the thin load line. */\nexport const dayLoad = (view: TimeView, key: string) => {\n const pieces = view\n .dayOf(key)\n .bands.map((band) => ({ start: Math.max(0, band.start), end: Math.min(view.wake(), band.end), color: eventAccent(band.item) }))\n .filter((piece) => piece.end > piece.start)\n .sort((left, right) => left.start - right.start);\n const merged: typeof pieces = [];\n for (const piece of pieces) {\n const last = merged[merged.length - 1];\n if (last && piece.start <= last.end) last.end = Math.max(last.end, piece.end);\n else merged.push({ ...piece });\n }\n return merged;\n};\n\n/** Day keys of the week that holds a day, from its first day. */\nexport const weekKeysOf = (view: TimeView, key: string) => {\n const start = view.keyOf(calendar.startOfWeek(view.parseKey(key), view.dateConfig()));\n return Array.from({ length: 7 }, (_, index) => addDayKeys(start, index));\n};\n"],"mappings":"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","ignoreList":[]}
|
package/dist/ssr/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export * from "./inputs";
|
|
|
6
6
|
export { suppressTextSelection } from "./internal/text-selection";
|
|
7
7
|
export * from "./intl";
|
|
8
8
|
export * from "./layout";
|
|
9
|
+
export { prefersReducedMotion } from "./motion";
|
|
9
10
|
export * from "./surfaces";
|
|
10
11
|
export * from "./widgets";
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/ssr/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./actions\";\nexport * from \"./chat\";\nexport * from \"./content\";\nexport * from \"./feedback\";\nexport * from \"./inputs\";\nexport { suppressTextSelection } from \"./internal/text-selection\";\nexport * from \"./intl\";\nexport * from \"./layout\";\nexport type { AccentColor, IntentTone } from \"./semantics\";\nexport * from \"./surfaces\";\nexport * from \"./widgets\";\n"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,SAAS,qBAAqB,QAAQ,2BAA2B;AACjE,cAAc,QAAQ;AACtB,cAAc,UAAU;
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./actions\";\nexport * from \"./chat\";\nexport * from \"./content\";\nexport * from \"./feedback\";\nexport * from \"./inputs\";\nexport { suppressTextSelection } from \"./internal/text-selection\";\nexport * from \"./intl\";\nexport * from \"./layout\";\nexport { prefersReducedMotion } from \"./motion\";\nexport type { AccentColor, IntentTone } from \"./semantics\";\nexport * from \"./surfaces\";\nexport * from \"./widgets\";\n"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,SAAS,qBAAqB,QAAQ,2BAA2B;AACjE,cAAc,QAAQ;AACtB,cAAc,UAAU;AACxB,SAAS,oBAAoB,QAAQ,UAAU;AAE/C,cAAc,YAAY;AAC1B,cAAc,WAAW","ignoreList":[]}
|
|
@@ -13,7 +13,7 @@ var _tmpl$ = "<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\"></i>",
|
|
|
13
13
|
_tmpl$6 = ["<button type=\"button\" id=\"", "\" class=\"k2b-choice-option\" role=\"option\"", ">", "<span><strong>", "</strong>", "</span></button>"],
|
|
14
14
|
_tmpl$7 = ["<i", " aria-hidden=\"true\"></i>"],
|
|
15
15
|
_tmpl$8 = ["<small>", "</small>"];
|
|
16
|
-
import { createSignal, For, Show } from "solid-js";
|
|
16
|
+
import { createEffect, createSignal, For, Show } from "solid-js";
|
|
17
17
|
import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
|
|
18
18
|
import { useUiMessages } from "../intl/messages";
|
|
19
19
|
import { createChoiceLoader, createChoicePopover, nextEnabledChoiceIndex } from "./choice";
|
|
@@ -44,7 +44,7 @@ export function Combobox(props) {
|
|
|
44
44
|
// chevron slot and stale results stay visible, so there is nothing to pad —
|
|
45
45
|
// 150ms keeps typing responsive without hammering the loader.
|
|
46
46
|
() => props.debounceMs ?? 150);
|
|
47
|
-
const popover = createChoicePopover(() => Boolean(props.disabled));
|
|
47
|
+
const popover = createChoicePopover(() => Boolean(props.disabled || props.readOnly));
|
|
48
48
|
const options = loader.options;
|
|
49
49
|
const focusedOption = () => options()[focusedIndex()];
|
|
50
50
|
const focus = index => {
|
|
@@ -56,7 +56,7 @@ export function Combobox(props) {
|
|
|
56
56
|
/** `eager` loads the currently controlled query on open; typing supplies its
|
|
57
57
|
* own query, so opening from `onInput` skips the duplicate request. */
|
|
58
58
|
const open = (eager = true) => {
|
|
59
|
-
if (props.disabled || popover.open()) return;
|
|
59
|
+
if (props.disabled || props.readOnly || popover.open()) return;
|
|
60
60
|
popover.show();
|
|
61
61
|
if (eager) loader.load(query(), true);
|
|
62
62
|
focus(-1);
|
|
@@ -70,7 +70,15 @@ export function Combobox(props) {
|
|
|
70
70
|
popover.hide();
|
|
71
71
|
reset();
|
|
72
72
|
};
|
|
73
|
+
createEffect(() => {
|
|
74
|
+
if (props.readOnly) {
|
|
75
|
+
popover.hide();
|
|
76
|
+
loader.cancel();
|
|
77
|
+
setFocusedIndex(-1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
73
80
|
const select = option => {
|
|
81
|
+
if (props.disabled || props.readOnly) return;
|
|
74
82
|
popover.hide();
|
|
75
83
|
props.onSelect({
|
|
76
84
|
id: option.value,
|
|
@@ -82,6 +90,7 @@ export function Combobox(props) {
|
|
|
82
90
|
inputRef?.focus();
|
|
83
91
|
};
|
|
84
92
|
const onKeyDown = event => {
|
|
93
|
+
if (props.disabled || props.readOnly) return;
|
|
85
94
|
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
86
95
|
event.preventDefault();
|
|
87
96
|
if (!popover.open()) open();else focus(nextEnabledChoiceIndex(options(), focusedIndex(), event.key === "ArrowDown" ? 1 : -1));
|
|
@@ -130,6 +139,12 @@ export function Combobox(props) {
|
|
|
130
139
|
get disabled() {
|
|
131
140
|
return props.disabled;
|
|
132
141
|
},
|
|
142
|
+
get readOnly() {
|
|
143
|
+
return props.readOnly;
|
|
144
|
+
},
|
|
145
|
+
get ["aria-readonly"]() {
|
|
146
|
+
return props.readOnly ? "true" : undefined;
|
|
147
|
+
},
|
|
133
148
|
role: "combobox",
|
|
134
149
|
"aria-autocomplete": "list",
|
|
135
150
|
get ["aria-expanded"]() {
|