{"version":3,"file":"index.modern.mjs","sources":["../src/hooks/useLayoutEffect.tsx","../src/utils.ts","../src/hooks/useSnapPoints.tsx","../src/machines/overlay.ts","../src/BottomSheet.tsx","../src/hooks/useReady.tsx","../src/hooks/useSpring.tsx","../src/hooks/useReducedMotion.tsx","../src/hooks/useScrollLock.tsx","../src/hooks/useAriaHider.tsx","../src/hooks/useFocusTrap.tsx","../src/hooks/useSpringInterpolations.tsx","../src/index.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect as useLayoutEffectSafely } from 'react'\n\n// Ensure the name used in components is useLayoutEffect so the eslint react hooks plugin works\nexport const useLayoutEffect =\n  typeof window !== 'undefined' ? useLayoutEffectSafely : useEffect\n","/* eslint-disable no-self-compare */\n\n// stolen from lodash\nexport function clamp(number: number, lower: number, upper: number) {\n  number = +number\n  lower = +lower\n  upper = +upper\n  lower = lower === lower ? lower : 0\n  upper = upper === upper ? upper : 0\n  if (number === number) {\n    number = number <= upper ? number : upper\n    number = number >= lower ? number : lower\n  }\n  return number\n}\n\n// Mwahaha easiest way to filter out NaN I ever saw! >:3\nexport function deleteNaN(arr) {\n  const set = new Set(arr)\n  set.delete(NaN)\n  return [...set]\n}\n\nexport function roundAndCheckForNaN(unrounded) {\n  const rounded = Math.round(unrounded)\n  if (Number.isNaN(unrounded)) {\n    throw new TypeError(\n      'Found a NaN! Check your snapPoints / defaultSnap / snapTo '\n    )\n  }\n\n  return rounded\n}\n\n// Validate, sanitize, round and dedupe snap points, as well as extracting the minSnap and maxSnap points\nexport function processSnapPoints(unsafeSnaps: number | number[], maxHeight) {\n  const safeSnaps = [].concat(unsafeSnaps).map(roundAndCheckForNaN)\n\n  const snapPointsDedupedSet = safeSnaps.reduce((acc, snapPoint) => {\n    acc.add(clamp(snapPoint, 0, maxHeight))\n    return acc\n  }, new Set<number>())\n\n  const snapPoints = Array.from(snapPointsDedupedSet)\n\n  const minSnap = Math.min(...snapPoints)\n  if (Number.isNaN(minSnap)) {\n    throw new TypeError('minSnap is NaN')\n  }\n  const maxSnap = Math.max(...snapPoints)\n  if (Number.isNaN(maxSnap)) {\n    throw new TypeError('maxSnap is NaN')\n  }\n\n  return {\n    snapPoints,\n    minSnap,\n    maxSnap,\n  }\n}\n\nexport const debugging =\n  process.env.NODE_ENV === 'development' && typeof window !== 'undefined'\n    ? window.location.search === '?debug'\n    : false\n","import React, {\n  useCallback,\n  useDebugValue,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\nimport { ResizeObserver, ResizeObserverEntry } from '@juggle/resize-observer'\nimport type { defaultSnapProps, ResizeSource, snapPoints } from '../types'\nimport { processSnapPoints, roundAndCheckForNaN } from '../utils'\nimport { useReady } from './useReady'\nimport { ResizeObserverOptions } from '@juggle/resize-observer/lib/ResizeObserverOptions'\nimport { useLayoutEffect } from './useLayoutEffect'\n\nexport function useSnapPoints({\n  contentRef,\n  controlledMaxHeight,\n  footerEnabled,\n  footerRef,\n  getSnapPoints,\n  headerEnabled,\n  headerRef,\n  heightRef,\n  lastSnapRef,\n  ready,\n  registerReady,\n  resizeSourceRef,\n}: {\n  contentRef: React.RefObject<Element>\n  controlledMaxHeight?: number\n  footerEnabled: boolean\n  footerRef: React.RefObject<Element>\n  getSnapPoints: snapPoints\n  headerEnabled: boolean\n  headerRef: React.RefObject<Element>\n  heightRef: React.RefObject<number>\n  lastSnapRef: React.RefObject<number>\n  ready: boolean\n  registerReady: ReturnType<typeof useReady>['registerReady']\n  resizeSourceRef: React.MutableRefObject<ResizeSource>\n}) {\n  const { maxHeight, minHeight, headerHeight, footerHeight } = useDimensions({\n    contentRef: contentRef,\n    controlledMaxHeight,\n    footerEnabled,\n    footerRef,\n    headerEnabled,\n    headerRef,\n    registerReady,\n    resizeSourceRef,\n  })\n\n  const { snapPoints, minSnap, maxSnap } = processSnapPoints(\n    ready\n      ? getSnapPoints({\n          height: heightRef.current,\n          footerHeight,\n          headerHeight,\n          minHeight,\n          maxHeight,\n        })\n      : [0],\n    maxHeight\n  )\n  //console.log({ snapPoints, minSnap, maxSnap })\n\n  // @TODO investigate the gains from memoizing this\n  function findSnap(\n    numberOrCallback: number | ((state: defaultSnapProps) => number)\n  ) {\n    let unsafeSearch: number\n    if (typeof numberOrCallback === 'function') {\n      unsafeSearch = numberOrCallback({\n        footerHeight,\n        headerHeight,\n        height: heightRef.current,\n        minHeight,\n        maxHeight,\n        snapPoints,\n        lastSnap: lastSnapRef.current,\n      })\n    } else {\n      unsafeSearch = numberOrCallback\n    }\n    const querySnap = roundAndCheckForNaN(unsafeSearch)\n    return snapPoints.reduce(\n      (prev, curr) =>\n        Math.abs(curr - querySnap) < Math.abs(prev - querySnap) ? curr : prev,\n      minSnap\n    )\n  }\n\n  useDebugValue(`minSnap: ${minSnap}, maxSnap:${maxSnap}`)\n\n  return { minSnap, maxSnap, findSnap, maxHeight }\n}\n\nfunction useDimensions({\n  contentRef,\n  controlledMaxHeight,\n  footerEnabled,\n  footerRef,\n  headerEnabled,\n  headerRef,\n  registerReady,\n  resizeSourceRef,\n}: {\n  contentRef: React.RefObject<Element>\n  controlledMaxHeight?: number\n  footerEnabled: boolean\n  footerRef: React.RefObject<Element>\n  headerEnabled: boolean\n  headerRef: React.RefObject<Element>\n  registerReady: ReturnType<typeof useReady>['registerReady']\n  resizeSourceRef: React.MutableRefObject<ResizeSource>\n}) {\n  const setReady = useMemo(() => registerReady('contentHeight'), [\n    registerReady,\n  ])\n  const maxHeight = useMaxHeight(\n    controlledMaxHeight,\n    registerReady,\n    resizeSourceRef\n  )\n\n  // @TODO probably better to forward props instead of checking refs to decide if it's enabled\n  const headerHeight = useElementSizeObserver(headerRef, {\n    label: 'headerHeight',\n    enabled: headerEnabled,\n    resizeSourceRef,\n  })\n  const contentHeight = useElementSizeObserver(contentRef, {\n    label: 'contentHeight',\n    enabled: true,\n    resizeSourceRef,\n  })\n  const footerHeight = useElementSizeObserver(footerRef, {\n    label: 'footerHeight',\n    enabled: footerEnabled,\n    resizeSourceRef,\n  })\n  const minHeight =\n    Math.min(maxHeight - headerHeight - footerHeight, contentHeight) +\n    headerHeight +\n    footerHeight\n\n  useDebugValue(`minHeight: ${minHeight}`)\n\n  const ready = contentHeight > 0\n  useEffect(() => {\n    if (ready) {\n      setReady()\n    }\n  }, [ready, setReady])\n\n  return {\n    maxHeight,\n    minHeight,\n    headerHeight,\n    footerHeight,\n  }\n}\n\nconst observerOptions: ResizeObserverOptions = {\n  // Respond to changes to padding, happens often on iOS when using env(safe-area-inset-bottom)\n  // And the user hides or shows the Safari browser toolbar\n  box: 'border-box',\n}\n/**\n * Hook for determining the size of an element using the Resize Observer API.\n *\n * @param ref - A React ref to an element\n */\nfunction useElementSizeObserver(\n  ref: React.RefObject<Element>,\n  {\n    label,\n    enabled,\n    resizeSourceRef,\n  }: {\n    label: string\n    enabled: boolean\n    resizeSourceRef: React.MutableRefObject<ResizeSource>\n  }\n): number {\n  let [size, setSize] = useState(0)\n\n  useDebugValue(`${label}: ${size}`)\n\n  const handleResize = useCallback(\n    (entries: ResizeObserverEntry[]) => {\n      // we only observe one element, so accessing the first entry here is fine\n      setSize(entries[0].borderBoxSize[0].blockSize)\n      resizeSourceRef.current = 'element'\n    },\n    [resizeSourceRef]\n  )\n\n  useLayoutEffect(() => {\n    if (!ref.current || !enabled) {\n      return\n    }\n\n    const resizeObserver = new ResizeObserver(handleResize)\n    resizeObserver.observe(ref.current, observerOptions)\n\n    return () => {\n      resizeObserver.disconnect()\n    }\n  }, [ref, handleResize, enabled])\n\n  return enabled ? size : 0\n}\n\n// Blazingly keep track of the current viewport height without blocking the thread, keeping that sweet 60fps on smartphones\nfunction useMaxHeight(\n  controlledMaxHeight,\n  registerReady: ReturnType<typeof useReady>['registerReady'],\n  resizeSourceRef: React.MutableRefObject<ResizeSource>\n) {\n  const setReady = useMemo(() => registerReady('maxHeight'), [registerReady])\n  const [maxHeight, setMaxHeight] = useState(() =>\n    roundAndCheckForNaN(controlledMaxHeight) || typeof window !== 'undefined'\n      ? window.innerHeight\n      : 0\n  )\n  const ready = maxHeight > 0\n  const raf = useRef(0)\n\n  useDebugValue(controlledMaxHeight ? 'controlled' : 'auto')\n\n  useEffect(() => {\n    if (ready) {\n      setReady()\n    }\n  }, [ready, setReady])\n\n  useLayoutEffect(() => {\n    // Bail if the max height is a controlled prop\n    if (controlledMaxHeight) {\n      setMaxHeight(roundAndCheckForNaN(controlledMaxHeight))\n      resizeSourceRef.current = 'maxheightprop'\n\n      return\n    }\n\n    const handleResize = () => {\n      if (raf.current) {\n        // bail to throttle the amount of resize changes\n        return\n      }\n\n      // throttle state changes using rAF\n      raf.current = requestAnimationFrame(() => {\n        setMaxHeight(window.innerHeight)\n        resizeSourceRef.current = 'window'\n\n        raf.current = 0\n      })\n    }\n    window.addEventListener('resize', handleResize)\n    setMaxHeight(window.innerHeight)\n    resizeSourceRef.current = 'window'\n    setReady()\n\n    return () => {\n      window.removeEventListener('resize', handleResize)\n      cancelAnimationFrame(raf.current)\n    }\n  }, [controlledMaxHeight, setReady, resizeSourceRef])\n\n  return maxHeight\n}\n","import { Machine, assign } from 'xstate'\n\n// This is the root machine, composing all the other machines and is the brain of the bottom sheet\n\ninterface OverlayStateSchema {\n  states: {\n    // the overlay usually starts in the closed position\n    closed: {}\n    opening: {\n      states: {\n        // Used to fire off the springStart event\n        start: {}\n        // Decide how to transition to the open state based on what the initialState is\n        transition: {}\n        // Fast enter animation, sheet is open by default\n        immediately: {\n          states: {\n            open: {}\n            activating: {}\n          }\n        }\n        smoothly: {\n          states: {\n            // This state only happens when the overlay should start in an open state, instead of animating from the bottom\n            // openImmediately: {}\n            // visuallyHidden will render the overlay in the open state, but with opacity 0\n            // doing this solves two problems:\n            // on Android focusing an input element will trigger the softkeyboard to show up, which will change the viewport height\n            // on iOS the focus event will break the view by triggering a scrollIntoView event if focus happens while the overlay is below the viewport and body got overflow:hidden\n            // by rendering things with opacity 0 we ensure keyboards and scrollIntoView all happen in a way that match up with what the sheet will look like.\n            // we can then move it to the opening position below the viewport, and animate it into view without worrying about height changes or scrolling overflow:hidden events\n            visuallyHidden: {}\n            // In this state we're activating focus traps, scroll locks and more, this will sometimes trigger soft keyboards and scrollIntoView\n            // @TODO we might want to add a delay here before proceeding to open, to give android and iOS enough time to adjust the viewport when focusing an interactive element\n            activating: {}\n            // Animates from the bottom\n            open: {}\n          }\n        }\n        // Used to fire off the springEnd event\n        end: {}\n        // And finally we're ready to transition to open\n        done: {}\n      }\n    }\n    open: {}\n    // dragging responds to user gestures, which may interrupt the opening state, closing state or snapping\n    // when interrupting an opening event, it fires onSpringEnd(OPEN) before onSpringStart(DRAG)\n    // when interrupting a closing event, it fires onSpringCancel(CLOSE) before onSpringStart(DRAG)\n    // when interrupting a dragging event, it fires onSpringCancel(SNAP) before onSpringStart(DRAG)\n    dragging: {}\n    // snapping happens whenever transitioning to a new snap point, often after dragging\n    snapping: {\n      states: {\n        start: {}\n        snappingSmoothly: {}\n        end: {}\n        done: {}\n      }\n    }\n    resizing: {\n      states: {\n        start: {}\n        resizingSmoothly: {}\n        end: {}\n        done: {}\n      }\n    }\n    closing: {\n      states: {\n        start: {}\n        deactivating: {}\n        closingSmoothly: {}\n        end: {}\n        done: {}\n      }\n    }\n  }\n}\n\ntype OverlayEvent =\n  | { type: 'OPEN' }\n  | {\n      type: 'SNAP'\n      payload: {\n        y: number\n        velocity: number\n        source: 'dragging' | 'custom' | string\n      }\n    }\n  | { type: 'CLOSE' }\n  | { type: 'DRAG' }\n  | { type: 'RESIZE' }\n\n// The context (extended state) of the machine\ninterface OverlayContext {\n  initialState: 'OPEN' | 'CLOSED'\n}\nfunction sleep(ms = 1000) {\n  return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nconst cancelOpen = {\n  CLOSE: { target: '#overlay.closing', actions: 'onOpenCancel' },\n}\nconst openToDrag = {\n  DRAG: { target: '#overlay.dragging', actions: 'onOpenEnd' },\n}\nconst openToResize = {\n  RESIZE: { target: '#overlay.resizing', actions: 'onOpenEnd' },\n}\n\nconst initiallyOpen = ({ initialState }) => initialState === 'OPEN'\nconst initiallyClosed = ({ initialState }) => initialState === 'CLOSED'\n\n// Copy paste the machine into https://xstate.js.org/viz/ to make sense of what's going on in here ;)\n\nexport const overlayMachine = Machine<\n  OverlayContext,\n  OverlayStateSchema,\n  OverlayEvent\n>(\n  {\n    id: 'overlay',\n    initial: 'closed',\n    context: { initialState: 'CLOSED' },\n    states: {\n      closed: { on: { OPEN: 'opening', CLOSE: undefined } },\n      opening: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onOpenStart',\n              onDone: 'transition',\n            },\n          },\n          transition: {\n            always: [\n              { target: 'immediately', cond: 'initiallyOpen' },\n              { target: 'smoothly', cond: 'initiallyClosed' },\n            ],\n          },\n          immediately: {\n            initial: 'open',\n            states: {\n              open: {\n                invoke: { src: 'openImmediately', onDone: 'activating' },\n              },\n              activating: {\n                invoke: { src: 'activate', onDone: '#overlay.opening.end' },\n                on: { ...openToDrag, ...openToResize },\n              },\n            },\n          },\n          smoothly: {\n            initial: 'visuallyHidden',\n            states: {\n              visuallyHidden: {\n                invoke: { src: 'renderVisuallyHidden', onDone: 'activating' },\n              },\n              activating: {\n                invoke: { src: 'activate', onDone: 'open' },\n              },\n              open: {\n                invoke: { src: 'openSmoothly', onDone: '#overlay.opening.end' },\n                on: { ...openToDrag, ...openToResize },\n              },\n            },\n          },\n          end: {\n            invoke: { src: 'onOpenEnd', onDone: 'done' },\n            on: { CLOSE: '#overlay.closing', DRAG: '#overlay.dragging' },\n          },\n          done: {\n            type: 'final',\n          },\n        },\n        on: { ...cancelOpen },\n        onDone: 'open',\n      },\n      open: {\n        on: { DRAG: '#overlay.dragging', SNAP: 'snapping', RESIZE: 'resizing' },\n      },\n      dragging: {\n        on: { SNAP: 'snapping' },\n      },\n      snapping: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onSnapStart',\n              onDone: 'snappingSmoothly',\n            },\n            entry: [\n              assign({\n                // @ts-expect-error\n                y: (_, { payload: { y } }) => y,\n                velocity: (_, { payload: { velocity } }) => velocity,\n                snapSource: (_, { payload: { source = 'custom' } }) => source,\n              }),\n            ],\n          },\n          snappingSmoothly: {\n            invoke: { src: 'snapSmoothly', onDone: 'end' },\n          },\n          end: {\n            invoke: { src: 'onSnapEnd', onDone: 'done' },\n            on: {\n              RESIZE: '#overlay.resizing',\n              SNAP: '#overlay.snapping',\n              CLOSE: '#overlay.closing',\n              DRAG: '#overlay.dragging',\n            },\n          },\n          done: { type: 'final' },\n        },\n        on: {\n          SNAP: { target: 'snapping', actions: 'onSnapEnd' },\n          RESIZE: { target: '#overlay.resizing', actions: 'onSnapCancel' },\n          DRAG: { target: '#overlay.dragging', actions: 'onSnapCancel' },\n          CLOSE: { target: '#overlay.closing', actions: 'onSnapCancel' },\n        },\n        onDone: 'open',\n      },\n      resizing: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onResizeStart',\n              onDone: 'resizingSmoothly',\n            },\n          },\n          resizingSmoothly: {\n            invoke: { src: 'resizeSmoothly', onDone: 'end' },\n          },\n          end: {\n            invoke: { src: 'onResizeEnd', onDone: 'done' },\n            on: {\n              SNAP: '#overlay.snapping',\n              CLOSE: '#overlay.closing',\n              DRAG: '#overlay.dragging',\n            },\n          },\n          done: { type: 'final' },\n        },\n        on: {\n          RESIZE: { target: 'resizing', actions: 'onResizeEnd' },\n          SNAP: { target: 'snapping', actions: 'onResizeCancel' },\n          DRAG: { target: '#overlay.dragging', actions: 'onResizeCancel' },\n          CLOSE: { target: '#overlay.closing', actions: 'onResizeCancel' },\n        },\n        onDone: 'open',\n      },\n      closing: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onCloseStart',\n              onDone: 'deactivating',\n            },\n            on: { OPEN: { target: '#overlay.open', actions: 'onCloseCancel' } },\n          },\n          deactivating: {\n            invoke: { src: 'deactivate', onDone: 'closingSmoothly' },\n          },\n          closingSmoothly: {\n            invoke: { src: 'closeSmoothly', onDone: 'end' },\n          },\n          end: {\n            invoke: { src: 'onCloseEnd', onDone: 'done' },\n            on: {\n              OPEN: { target: '#overlay.opening', actions: 'onCloseCancel' },\n            },\n          },\n          done: { type: 'final' },\n        },\n        on: {\n          CLOSE: undefined,\n          OPEN: { target: '#overlay.opening', actions: 'onCloseCancel' },\n        },\n        onDone: 'closed',\n      },\n    },\n    on: {\n      CLOSE: 'closing',\n    },\n  },\n  {\n    actions: {\n      onOpenCancel: (context, event) => {\n        console.log('onOpenCancel', { context, event })\n      },\n      onSnapCancel: (context, event) => {\n        console.log('onSnapCancel', { context, event })\n      },\n      onResizeCancel: (context, event) => {\n        console.log('onResizeCancel', { context, event })\n      },\n      onCloseCancel: (context, event) => {\n        console.log('onCloseCancel', { context, event })\n      },\n      onOpenEnd: (context, event) => {\n        console.log('onOpenCancel', { context, event })\n      },\n      onSnapEnd: (context, event) => {\n        console.log('onSnapEnd', { context, event })\n      },\n      onRezizeEnd: (context, event) => {\n        console.log('onRezizeEnd', { context, event })\n      },\n    },\n    services: {\n      onSnapStart: async () => {\n        await sleep()\n      },\n      onOpenStart: async () => {\n        await sleep()\n      },\n      onCloseStart: async () => {\n        await sleep()\n      },\n      onResizeStart: async () => {\n        await sleep()\n      },\n      onSnapEnd: async () => {\n        await sleep()\n      },\n      onOpenEnd: async () => {\n        await sleep()\n      },\n      onCloseEnd: async () => {\n        await sleep()\n      },\n      onResizeEnd: async () => {\n        await sleep()\n      },\n      renderVisuallyHidden: async (context, event) => {\n        console.group('renderVisuallyHidden')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      activate: async (context, event) => {\n        console.group('activate')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      deactivate: async (context, event) => {\n        console.group('deactivate')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      openSmoothly: async (context, event) => {\n        console.group('openSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      openImmediately: async (context, event) => {\n        console.group('openImmediately')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      snapSmoothly: async (context, event) => {\n        console.group('snapSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      resizeSmoothly: async (context, event) => {\n        console.group('resizeSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      closeSmoothly: async (context, event) => {\n        console.group('closeSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n    },\n    guards: { initiallyClosed, initiallyOpen },\n  }\n)\n","//\n// In order to greatly reduce complexity this component is designed to always transition to open on mount, and then\n// transition to a closed state later. This ensures that all memory used to keep track of animation and gesture state\n// can be reclaimed after the sheet is closed and then unmounted.\n// It also ensures that when transitioning to open on mount the state is always clean, not affected by previous states that could\n// cause race conditions.\n\nimport { useMachine } from '@xstate/react';\nimport React, {\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n} from 'react';\nimport { animated, config } from '@react-spring/web';\nimport { rubberbandIfOutOfBounds, useDrag } from '@use-gesture/react';\nimport {\n  useAriaHider,\n  useFocusTrap,\n  useLayoutEffect,\n  useReady,\n  useReducedMotion,\n  useScrollLock,\n  useSnapPoints,\n  useSpring,\n  useSpringInterpolations,\n} from './hooks';\nimport { overlayMachine } from './machines/overlay';\nimport type {\n  defaultSnapProps,\n  Props,\n  RefHandles,\n  ResizeSource,\n  SnapPointProps,\n} from './types';\nimport { debugging } from './utils';\n\nconst { tension, friction } = config.default;\n\n// @TODO implement AbortController to deal with race conditions\n\n// @TODO rename to SpringBottomSheet and allow userland to import it directly, for those who want maximum control and minimal bundlesize\nexport const BottomSheet = React.forwardRef<\n  RefHandles,\n  {\n    initialState: 'OPEN' | 'CLOSED';\n    lastSnapRef: React.MutableRefObject<number | null>;\n  } & Props\n>(function BottomSheetInternal(\n  {\n    children,\n    sibling,\n    className,\n    footer,\n    header,\n    open: _open,\n    initialState,\n    lastSnapRef,\n    initialFocusRef,\n    onDismiss,\n    maxHeight: controlledMaxHeight,\n    defaultSnap: getDefaultSnap = _defaultSnap,\n    snapPoints: getSnapPoints = _snapPoints,\n    blocking = true,\n    scrollLocking = true,\n    style,\n    onSpringStart,\n    onSpringCancel,\n    onSpringEnd,\n    reserveScrollBarGap = blocking,\n    expandOnContentDrag = false,\n    ...props\n  },\n  forwardRef\n) {\n  // Before any animations can start we need to measure a few things, like the viewport and the dimensions of content, and header + footer if they exist\n  // @TODO make ready its own state perhaps, before open or closed\n  const { ready, registerReady } = useReady();\n\n  // Controls the drag handler, used by spring operations that happen outside the render loop in React\n  const canDragRef = useRef(false);\n\n  // This way apps don't have to remember to wrap their callbacks in useCallback to avoid breaking the sheet\n  const onSpringStartRef = useRef(onSpringStart);\n  const onSpringCancelRef = useRef(onSpringCancel);\n  const onSpringEndRef = useRef(onSpringEnd);\n  useEffect(() => {\n    onSpringStartRef.current = onSpringStart;\n    onSpringCancelRef.current = onSpringCancel;\n    onSpringEndRef.current = onSpringEnd;\n  }, [onSpringCancel, onSpringStart, onSpringEnd]);\n\n  // Behold, the engine of it all!\n  const [spring, set] = useSpring();\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const contentRef = useRef<HTMLDivElement>(null);\n  const headerRef = useRef<HTMLDivElement>(null);\n  const footerRef = useRef<HTMLDivElement>(null);\n  const overlayRef = useRef<HTMLDivElement | null>(null);\n\n  // Keeps track of the current height, or the height transitioning to\n  const heightRef = useRef(0);\n  const resizeSourceRef = useRef<ResizeSource>();\n  const preventScrollingRef = useRef(false);\n\n  const prefersReducedMotion = useReducedMotion();\n\n  // \"Plugins\" huhuhu\n  const scrollLockRef = useScrollLock({\n    targetRef: scrollRef,\n    enabled: ready && scrollLocking,\n    reserveScrollBarGap,\n  });\n  const ariaHiderRef = useAriaHider({\n    targetRef: containerRef,\n    enabled: ready && blocking,\n  });\n  const focusTrapRef = useFocusTrap({\n    targetRef: containerRef,\n    fallbackRef: overlayRef,\n    initialFocusRef: initialFocusRef || undefined,\n    enabled: ready && blocking && initialFocusRef !== false,\n  });\n\n  const { minSnap, maxSnap, maxHeight, findSnap } = useSnapPoints({\n    contentRef,\n    controlledMaxHeight,\n    footerEnabled: !!footer,\n    footerRef,\n    getSnapPoints,\n    headerEnabled: header !== false,\n    headerRef,\n    heightRef,\n    lastSnapRef,\n    ready,\n    registerReady,\n    resizeSourceRef,\n  });\n\n  // Setup refs that are used in cases where full control is needed over when a side effect is executed\n  const maxHeightRef = useRef(maxHeight);\n  const minSnapRef = useRef(minSnap);\n  const maxSnapRef = useRef(maxSnap);\n  const findSnapRef = useRef(findSnap);\n  const defaultSnapRef = useRef(0);\n  // Sync the refs with current state, giving the spring full control over when to respond to changes\n  useLayoutEffect(() => {\n    maxHeightRef.current = maxHeight;\n    maxSnapRef.current = maxSnap;\n    minSnapRef.current = minSnap;\n    findSnapRef.current = findSnap;\n    defaultSnapRef.current = findSnap(getDefaultSnap);\n  }, [findSnap, getDefaultSnap, maxHeight, maxSnap, minSnap]);\n\n  // New utility for using events safely\n  const asyncSet = useCallback<typeof set>(\n    // @ts-expect-error\n    ({ onRest, config: { velocity = 1, ...config } = {}, ...opts }) =>\n      // @ts-expect-error\n      new Promise((resolve) =>\n        set({\n          ...opts,\n          config: {\n            velocity,\n            ...config,\n            // @see https://springs.pomb.us\n            mass: 1,\n            // \"stiffness\"\n            tension,\n            // \"damping\"\n            friction: Math.max(\n              friction,\n              friction + (friction - friction * velocity)\n            ),\n          },\n          onRest: (...args) => {\n            // @ts-expect-error\n            resolve(...args);\n            onRest?.(...args);\n          },\n        })\n      ),\n    [set]\n  );\n  const [current, send] = useMachine(overlayMachine, {\n    devTools: debugging,\n    actions: {\n      onOpenCancel: useCallback(\n        () => onSpringCancelRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onSnapCancel: useCallback(\n        (context) =>\n          onSpringCancelRef.current?.({\n            type: 'SNAP',\n            source: context.snapSource,\n          }),\n        []\n      ),\n      onCloseCancel: useCallback(\n        () => onSpringCancelRef.current?.({ type: 'CLOSE' }),\n        []\n      ),\n      onResizeCancel: useCallback(\n        () =>\n          onSpringCancelRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n      onOpenEnd: useCallback(\n        () => onSpringEndRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onSnapEnd: useCallback(\n        (context, event) =>\n          onSpringEndRef.current?.({\n            type: 'SNAP',\n            source: context.snapSource,\n          }),\n        []\n      ),\n      onResizeEnd: useCallback(\n        () =>\n          onSpringEndRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n    },\n    context: { initialState },\n    services: {\n      onSnapStart: useCallback(\n        async (context, event) =>\n          onSpringStartRef.current?.({\n            type: 'SNAP',\n            source: event.payload.source || 'custom',\n          }),\n        []\n      ),\n      onOpenStart: useCallback(\n        async () => onSpringStartRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onCloseStart: useCallback(\n        async () => onSpringStartRef.current?.({ type: 'CLOSE' }),\n        []\n      ),\n      onResizeStart: useCallback(\n        async () =>\n          onSpringStartRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n      onSnapEnd: useCallback(\n        async (context, event) =>\n          onSpringEndRef.current?.({\n            type: 'SNAP',\n            source: context.snapSource,\n          }),\n        []\n      ),\n      onOpenEnd: useCallback(\n        async () => onSpringEndRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onCloseEnd: useCallback(\n        async () => onSpringEndRef.current?.({ type: 'CLOSE' }),\n        []\n      ),\n      onResizeEnd: useCallback(\n        async () =>\n          onSpringEndRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n      renderVisuallyHidden: useCallback(\n        async (context, event) => {\n          await asyncSet({\n            y: defaultSnapRef.current,\n            ready: 0,\n            maxHeight: maxHeightRef.current,\n            maxSnap: maxSnapRef.current,\n            // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n            minSnap: defaultSnapRef.current,\n            immediate: true,\n          });\n        },\n        [asyncSet]\n      ),\n      activate: useCallback(\n        async (context, event) => {\n          canDragRef.current = true;\n          await Promise.all([\n            scrollLockRef.current.activate(),\n            focusTrapRef.current.activate(),\n            ariaHiderRef.current.activate(),\n          ]);\n        },\n        [ariaHiderRef, focusTrapRef, scrollLockRef]\n      ),\n      deactivate: useCallback(async () => {\n        scrollLockRef.current.deactivate();\n        focusTrapRef.current.deactivate();\n        ariaHiderRef.current.deactivate();\n        canDragRef.current = false;\n      }, [ariaHiderRef, focusTrapRef, scrollLockRef]),\n      openImmediately: useCallback(async () => {\n        heightRef.current = defaultSnapRef.current;\n        await asyncSet({\n          y: defaultSnapRef.current,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n          minSnap: defaultSnapRef.current,\n          immediate: true,\n        });\n      }, [asyncSet]),\n      openSmoothly: useCallback(async () => {\n        await asyncSet({\n          y: 0,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n          minSnap: defaultSnapRef.current,\n          immediate: true,\n        });\n\n        heightRef.current = defaultSnapRef.current;\n\n        await asyncSet({\n          y: defaultSnapRef.current,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n          minSnap: defaultSnapRef.current,\n          immediate: prefersReducedMotion.current,\n        });\n      }, [asyncSet, prefersReducedMotion]),\n      snapSmoothly: useCallback(\n        async (context, event) => {\n          const snap = findSnapRef.current(context.y);\n          heightRef.current = snap;\n          lastSnapRef.current = snap;\n          await asyncSet({\n            y: snap,\n            ready: 1,\n            maxHeight: maxHeightRef.current,\n            maxSnap: maxSnapRef.current,\n            minSnap: minSnapRef.current,\n            immediate: prefersReducedMotion.current,\n            config: { velocity: context.velocity },\n          });\n        },\n        [asyncSet, lastSnapRef, prefersReducedMotion]\n      ),\n      resizeSmoothly: useCallback(async () => {\n        const snap = findSnapRef.current(heightRef.current);\n        heightRef.current = snap;\n        lastSnapRef.current = snap;\n        await asyncSet({\n          y: snap,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          minSnap: minSnapRef.current,\n          immediate:\n            resizeSourceRef.current === 'element'\n              ? prefersReducedMotion.current\n              : true,\n        });\n      }, [asyncSet, lastSnapRef, prefersReducedMotion]),\n      closeSmoothly: useCallback(\n        async (context, event) => {\n          // Avoid animating the height property on close and stay within FLIP bounds by upping the minSnap\n          asyncSet({\n            minSnap: heightRef.current,\n            immediate: true,\n          });\n\n          heightRef.current = 0;\n\n          await asyncSet({\n            y: 0,\n            maxHeight: maxHeightRef.current,\n            maxSnap: maxSnapRef.current,\n            immediate: prefersReducedMotion.current,\n          });\n\n          await asyncSet({ ready: 0, immediate: true });\n        },\n        [asyncSet, prefersReducedMotion]\n      ),\n    },\n  });\n\n  useEffect(() => {\n    if (!ready) return;\n\n    if (_open) {\n      send('OPEN');\n    } else {\n      send('CLOSE');\n    }\n  }, [_open, send, ready]);\n  useLayoutEffect(() => {\n    // Adjust the height whenever the snap points are changed due to resize events\n    if (maxHeight || maxSnap || minSnap) {\n      send('RESIZE');\n    }\n  }, [maxHeight, maxSnap, minSnap, send]);\n  useEffect(\n    () => () => {\n      // Ensure effects are cleaned up on unmount, in case they're not cleaned up otherwise\n      scrollLockRef.current.deactivate();\n      focusTrapRef.current.deactivate();\n      ariaHiderRef.current.deactivate();\n    },\n    [ariaHiderRef, focusTrapRef, scrollLockRef]\n  );\n\n  useImperativeHandle(\n    forwardRef,\n    () => ({\n      snapTo: (numberOrCallback, { velocity = 1, source = 'custom' } = {}) => {\n        send('SNAP', {\n          payload: {\n            y: findSnapRef.current(numberOrCallback),\n            velocity,\n            source,\n          },\n        });\n      },\n      get height() {\n        return heightRef.current;\n      },\n    }),\n    [send]\n  );\n\n  useEffect(() => {\n    const elem = scrollRef.current;\n\n    const preventScrolling = e => {\n      if (preventScrollingRef.current) {\n        e.preventDefault();\n      }\n    };\n\n    const preventSafariOverscroll = e => {\n      if (elem.scrollTop < 0) {\n        requestAnimationFrame(() => {\n          elem.style.overflow = 'hidden';\n          elem.scrollTop = 0;\n          elem.style.removeProperty('overflow');\n        });\n        e.preventDefault();\n      }\n    };\n\n    if (expandOnContentDrag) {\n      elem.addEventListener('scroll', preventScrolling);\n      elem.addEventListener('touchmove', preventScrolling);\n      elem.addEventListener('touchstart', preventSafariOverscroll);\n    }\n    return () => {\n      elem.removeEventListener('scroll', preventScrolling);\n      elem.removeEventListener('touchmove', preventScrolling);\n      elem.removeEventListener('touchstart', preventSafariOverscroll);\n    };\n  }, [expandOnContentDrag, scrollRef]);\n\n  const handleDrag = ({\n    args: [{ closeOnTap = false, isContentDragging = false } = {}] = [],\n    cancel,\n    direction: [, direction],\n    down,\n    first,\n    last,\n    memo = spring.y.get() as number,\n    movement: [, _my],\n    tap,\n    velocity,\n  }) => {\n    const my = _my * -1;\n\n    // Cancel the drag operation if the canDrag state changed\n    if (!canDragRef.current) {\n      console.log('handleDrag cancelled dragging because canDragRef is false');\n      cancel();\n      return memo;\n    }\n\n    if (onDismiss && closeOnTap && tap) {\n      cancel();\n      // Runs onDismiss in a timeout to avoid tap events on the backdrop from triggering click events on elements underneath\n      setTimeout(() => onDismiss(), 0);\n      return memo;\n    }\n\n    // Filter out taps\n    if (tap) {\n      return memo;\n    }\n\n    const rawY = memo + my;\n    const predictedDistance = my * velocity;\n    const predictedY = Math.max(\n      minSnapRef.current,\n      Math.min(maxSnapRef.current, rawY + predictedDistance * 2)\n    );\n\n    if (\n      !down &&\n      onDismiss &&\n      direction > 0 &&\n      rawY + predictedDistance < minSnapRef.current / 2\n    ) {\n      cancel();\n      onDismiss();\n      return memo;\n    }\n\n    let newY = down\n      ? // @TODO figure out a better way to deal with rubberband overshooting if min and max have the same value\n      !onDismiss && minSnapRef.current === maxSnapRef.current\n        ? rawY < minSnapRef.current\n          ? rubberbandIfOutOfBounds(\n            rawY,\n            minSnapRef.current,\n            maxSnapRef.current * 2,\n            0.55\n          )\n          : rubberbandIfOutOfBounds(\n            rawY,\n            minSnapRef.current / 2,\n            maxSnapRef.current,\n            0.55\n          )\n        : rubberbandIfOutOfBounds(\n          rawY,\n          onDismiss ? 0 : minSnapRef.current,\n          maxSnapRef.current,\n          0.55\n        )\n      : predictedY;\n\n    if (expandOnContentDrag && isContentDragging) {\n      if (newY >= maxSnapRef.current) {\n        newY = maxSnapRef.current;\n      }\n\n      if (memo === maxSnapRef.current && scrollRef.current.scrollTop > 0) {\n        newY = maxSnapRef.current;\n      }\n\n      preventScrollingRef.current = newY < maxSnapRef.current;\n    } else {\n      preventScrollingRef.current = false;\n    }\n\n    if (first) {\n      send('DRAG');\n    }\n\n    if (last) {\n      send('SNAP', {\n        payload: {\n          y: newY,\n          velocity: velocity > 0.05 ? velocity : 1,\n          source: 'dragging',\n        },\n      });\n\n      return memo;\n    }\n\n    // @TODO too many rerenders\n    //send('DRAG', { y: newY, velocity })\n    //*\n    set({\n      y: newY,\n      ready: 1,\n      maxHeight: maxHeightRef.current,\n      maxSnap: maxSnapRef.current,\n      minSnap: minSnapRef.current,\n      immediate: true,\n      config: { velocity },\n    });\n    // */\n\n    return memo;\n  };\n\n  const bind = useDrag(handleDrag, {\n    filterTaps: true,\n  });\n\n  if (Number.isNaN(maxSnapRef.current)) {\n    throw new TypeError('maxSnapRef is NaN!!');\n  }\n  if (Number.isNaN(minSnapRef.current)) {\n    throw new TypeError('minSnapRef is NaN!!');\n  }\n\n  const interpolations = useSpringInterpolations({ spring });\n\n  return (\n    <animated.div\n      {...props}\n      data-rsbs-root\n      data-rsbs-state={publicStates.find(current.matches)}\n      data-rsbs-is-blocking={blocking}\n      data-rsbs-is-dismissable={!!onDismiss}\n      data-rsbs-has-header={!!header}\n      data-rsbs-has-footer={!!footer}\n      className={className}\n      ref={containerRef}\n      style={{\n        // spread in the interpolations yeees\n        ...interpolations,\n        // but allow overriding them/disabling them\n        ...style,\n        // Not overridable as the \"focus lock with opacity 0\" trick rely on it\n        // @TODO the line below only fails on TS <4\n        // @ts-ignore\n        opacity: spring.ready,\n      }}\n    >\n      {sibling}\n      {blocking && (\n        <div\n          // This component needs to be placed outside bottom-sheet, as bottom-sheet uses transform and thus creates a new context\n          // that clips this element to the container, not allowing it to cover the full page.\n          key=\"backdrop\"\n          data-rsbs-backdrop\n          {...bind({ closeOnTap: true })}\n        />\n      )}\n      <div\n        key=\"overlay\"\n        aria-modal=\"true\"\n        role=\"dialog\"\n        data-rsbs-overlay\n        tabIndex={-1}\n        ref={overlayRef}\n        onKeyDown={(event) => {\n          if (event.key === 'Escape') {\n            // Always stop propagation, to avoid weirdness for bottom sheets inside other bottom sheets\n            event.stopPropagation();\n            if (onDismiss) onDismiss();\n          }\n        }}\n      >\n        {header !== false && (\n          <div key=\"header\" data-rsbs-header ref={headerRef} {...bind()}>\n            {header}\n          </div>\n        )}\n        <div key=\"scroll\" data-rsbs-scroll ref={scrollRef} {...(expandOnContentDrag ? bind({ isContentDragging: true }) : {})}>\n          <div data-rsbs-content ref={contentRef}>\n            {children}\n          </div>\n        </div>\n        {footer && (\n          <div key=\"footer\" ref={footerRef} data-rsbs-footer {...bind()}>\n            {footer}\n          </div>\n        )}\n      </div>\n    </animated.div>\n  );\n});\n\n// Used for the data attribute, list over states available to CSS selectors\nconst publicStates = [\n  'closed',\n  'opening',\n  'open',\n  'closing',\n  'dragging',\n  'snapping',\n  'resizing',\n];\n\n// Default prop values that are callbacks, and it's nice to save some memory and reuse their instances since they're pure\nfunction _defaultSnap({ snapPoints, lastSnap }: defaultSnapProps) {\n  return lastSnap ?? Math.min(...snapPoints);\n}\nfunction _snapPoints({ minHeight }: SnapPointProps) {\n  return minHeight;\n}\n","// Keeps track of wether everything is good to go or not, in the most efficient way possible\n\nimport { useCallback, useEffect, useState } from 'react'\n\nexport function useReady() {\n  const [ready, setReady] = useState(false)\n  const [readyMap, updateReadyMap] = useState<{ [key: string]: boolean }>({})\n\n  const registerReady = useCallback((key: string) => {\n    console.count(`registerReady:${key}`)\n    // Register the check we're gonna wait for until it's ready\n    updateReadyMap((ready) => ({ ...ready, [key]: false }))\n\n    return () => {\n      console.count(`setReady:${key}`)\n      // Set it to ready\n      updateReadyMap((ready) => ({ ...ready, [key]: true }))\n    }\n  }, [])\n\n  useEffect(() => {\n    const states = Object.values(readyMap)\n\n    if (states.length === 0) {\n      console.log('nope nothing registered yet')\n      return\n    }\n\n    const isReady = states.every(Boolean)\n    console.log('check if we are rready', readyMap, isReady)\n    if (isReady) {\n      console.warn('ready!')\n      setReady(true)\n    }\n  }, [readyMap])\n\n  return { ready, registerReady }\n}\n","import { useSpring as useReactSpring } from '@react-spring/web';\n\n// Behold, the engine of it all!\n// Put in this file befause it makes it easier to type and I'm lazy! :D\n\nexport function useSpring() {\n  return useReactSpring(() => ({\n    y: 0,\n    ready: 0,\n    maxHeight: 0,\n    minSnap: 0,\n    maxSnap: 0,\n  }));\n}\n\nexport type Spring = ReturnType<typeof useSpring>[0];\nexport type SpringSet = ReturnType<typeof useSpring>[1];\n","import { useDebugValue, useEffect, useMemo, useRef } from 'react'\n\n// @TODO refactor to addEventListener\nexport function useReducedMotion() {\n  const mql = useMemo(\n    () =>\n      typeof window !== 'undefined'\n        ? window.matchMedia('(prefers-reduced-motion: reduce)')\n        : null,\n    []\n  )\n  const ref = useRef(mql?.matches)\n\n  useDebugValue(ref.current ? 'reduce' : 'no-preference')\n\n  useEffect(() => {\n    const handler = (event) => {\n      ref.current = event.matches\n    }\n    mql?.addListener(handler)\n\n    return () => mql?.removeListener(handler)\n  }, [mql])\n\n  return ref\n}\n","import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock'\nimport { useDebugValue, useEffect, useRef } from 'react'\n\n/**\n * Handle scroll locking to ensure a good dragging experience on Android and iOS.\n *\n * On iOS the following may happen if scroll isn't locked:\n * - When dragging the sheet the background gets dragged at the same time.\n * - When dragging the page scroll is also affected, causing the drag to feel buggy and \"slow\".\n *\n * On Android it causes the chrome toolbar to pop down as you drag down, and hide as you drag up.\n * When it's in between two toolbar states it causes the framerate to drop way below 60fps on\n * the bottom sheet drag interaction.\n */\nexport function useScrollLock({\n  targetRef,\n  enabled,\n  reserveScrollBarGap,\n}: {\n  targetRef: React.RefObject<Element>\n  enabled: boolean\n  reserveScrollBarGap: boolean\n}) {\n  const ref = useRef<{ activate: () => void; deactivate: () => void }>({\n    activate: () => {\n      throw new TypeError('Tried to activate scroll lock too early')\n    },\n    deactivate: () => {},\n  })\n\n  useDebugValue(enabled ? 'Enabled' : 'Disabled')\n\n  useEffect(() => {\n    if (!enabled) {\n      ref.current.deactivate()\n      ref.current = { activate: () => {}, deactivate: () => {} }\n      return\n    }\n\n    const target = targetRef.current\n    let active = false\n\n    ref.current = {\n      activate: () => {\n        if (active) return\n        active = true\n        disableBodyScroll(target, {\n          allowTouchMove: (el) => el.closest('[data-body-scroll-lock-ignore]'),\n          reserveScrollBarGap,\n        })\n      },\n      deactivate: () => {\n        if (!active) return\n        active = false\n        enableBodyScroll(target)\n      },\n    }\n  }, [enabled, targetRef, reserveScrollBarGap])\n\n  return ref\n}\n","import React, { useDebugValue, useEffect, useRef } from 'react'\n\n// Handle hiding and restoring aria-hidden attributes\nexport function useAriaHider({\n  targetRef,\n  enabled,\n}: {\n  targetRef: React.RefObject<Element>\n  enabled: boolean\n}) {\n  const ref = useRef<{ activate: () => void; deactivate: () => void }>({\n    activate: () => {\n      throw new TypeError('Tried to activate aria hider too early')\n    },\n    deactivate: () => {},\n  })\n\n  useDebugValue(enabled ? 'Enabled' : 'Disabled')\n\n  useEffect(() => {\n    if (!enabled) {\n      ref.current.deactivate()\n      ref.current = { activate: () => {}, deactivate: () => {} }\n      return\n    }\n\n    const target = targetRef.current\n    let active = false\n    let originalValues: (null | string)[] = []\n    let rootNodes: Element[] = []\n\n    ref.current = {\n      activate: () => {\n        if (active) return\n        active = true\n\n        const parentNode = target.parentNode\n\n        document.querySelectorAll('body > *').forEach((node) => {\n          if (node === parentNode) {\n            return\n          }\n          let attr = node.getAttribute('aria-hidden')\n          let alreadyHidden = attr !== null && attr !== 'false'\n          if (alreadyHidden) {\n            return\n          }\n          originalValues.push(attr)\n          rootNodes.push(node)\n          node.setAttribute('aria-hidden', 'true')\n        })\n      },\n      deactivate: () => {\n        if (!active) return\n        active = false\n\n        rootNodes.forEach((node, index) => {\n          let originalValue = originalValues[index]\n          if (originalValue === null) {\n            node.removeAttribute('aria-hidden')\n          } else {\n            node.setAttribute('aria-hidden', originalValue)\n          }\n        })\n        originalValues = []\n        rootNodes = []\n      },\n    }\n  }, [targetRef, enabled])\n\n  return ref\n}\n","import { createFocusTrap } from 'focus-trap'\nimport { useDebugValue, useEffect, useRef } from 'react'\n\nexport function useFocusTrap({\n  targetRef,\n  fallbackRef,\n  initialFocusRef,\n  enabled,\n}: {\n  targetRef: React.RefObject<HTMLElement>\n  fallbackRef: React.RefObject<HTMLElement>\n  initialFocusRef?: React.RefObject<HTMLElement>\n  enabled: boolean\n}) {\n  const ref = useRef<{ activate: () => void; deactivate: () => void }>({\n    activate: () => {\n      throw new TypeError('Tried to activate focus trap too early')\n    },\n    deactivate: () => {},\n  })\n\n  useDebugValue(enabled ? 'Enabled' : 'Disabled')\n\n  useEffect(() => {\n    if (!enabled) {\n      ref.current.deactivate()\n      ref.current = { activate: () => {}, deactivate: () => {} }\n      return\n    }\n\n    const fallback = fallbackRef.current\n    const trap = createFocusTrap(targetRef.current, {\n      onActivate:\n        process.env.NODE_ENV !== 'production'\n          ? () => {\n              console.log('focus activate')\n            }\n          : undefined,\n      // If initialFocusRef is manually specified we don't want the first tabbable element to receive focus if initialFocusRef can't be found\n      initialFocus: initialFocusRef\n        ? () => initialFocusRef?.current || fallback\n        : undefined,\n      fallbackFocus: fallback,\n      escapeDeactivates: false,\n      clickOutsideDeactivates: false,\n    })\n    let active = false\n\n    ref.current = {\n      activate: async () => {\n        if (active) return\n        active = true\n\n        await trap.activate()\n        // it's difficult to know exactly when focus is udpated https://github.com/focus-trap/focus-trap/blob/036a72ec48b85414dda00ec0c40d631c8f0ae5ce/index.js#L369-L371\n        // This timeout is attempting to compromise between a reasonable guess, as well as not delaying the open transition more than necessary\n        await new Promise((resolve) => setTimeout(() => resolve(void 1), 0))\n      },\n      deactivate: () => {\n        if (!active) return\n        active = false\n\n        trap.deactivate()\n      },\n    }\n  }, [enabled, fallbackRef, initialFocusRef, targetRef])\n\n  return ref\n}\n","import { to } from '@react-spring/web';\nimport type { Spring } from './useSpring';\nimport { clamp } from '../utils';\n\n// It's a bit easier to ensure interpolations don't accidentally use the wrong variables by\n// putting them here, in their own closure with explicitly defined variables used\n\n// Note that the callbacks in the interpolation functions close over their scope every time react renders\n// so it's important that if anything can change outside of render that needs to be available\n// in the interpolation then a ref must be used\n\nexport function useSpringInterpolations({\n  spring,\n}: {\n  spring: Spring;\n}): React.CSSProperties {\n  // This effect is for removing rounded corners on phones when the sheet touches the top of the browser chrome\n  // as it's really ugly with the gaps border radius creates. This ensures it looks sleek.\n  // @TODO the ts-ignore comments are because the `extrapolate` param isn't in the TS defs for some reason\n  const interpolateBorderRadius = to(\n    [spring.y, spring.maxHeight],\n    (y, maxHeight) => {\n      return `${Math.round(clamp(maxHeight - y, 0, 16))}px`;\n    }\n  );\n\n  /*\n   * Only animate the height when absolute necessary\n   * @TODO currently it's only able to opt out of changing the height if there's just a single snapshot\n   *       but it should be possible to do it in other scenarios too, like on window resize,\n   *       or maybe even while dragging, but probably requires a more restrictive CSS.\n   *       As in now the sticky footer isn't overlapping the content, allowing `backdrop-filter: blur(8px)` effects.\n   *       A FLIP resize flow for content height would likely require the sticky elements to overlap the content area.\n   *       Could be done as a separat mode though, or a separate example CSS for max performance.\n   */\n  const interpolateHeight = to(\n    // @ts-ignore\n    [spring.y, spring.minSnap, spring.maxSnap],\n    (y, minSnap, maxSnap) => `${clamp(y, minSnap, maxSnap)}px`\n  );\n\n  const interpolateY = to(\n    // @ts-ignore\n    [spring.y, spring.minSnap, spring.maxSnap],\n    (y, minSnap, maxSnap) => {\n      if (y < minSnap) {\n        return `${minSnap - y}px`;\n      }\n      if (y > maxSnap) {\n        return `${maxSnap - y}px`;\n      }\n      return '0px';\n    }\n  );\n\n  const interpolateFiller = to(\n    // @ts-ignore\n    [spring.y, spring.maxSnap],\n    (y, maxSnap) => {\n      if (y >= maxSnap) {\n        return Math.ceil(y - maxSnap);\n      }\n      return 0;\n    }\n  );\n\n  const interpolateContentOpacity = to(\n    // @ts-ignore\n    [spring.y, spring.minSnap],\n    (y, minSnap) => {\n      if (!minSnap) {\n        return 0;\n      }\n      const minX = Math.max(minSnap / 2 - 45, 0);\n      const maxX = Math.min(minSnap / 2 + 45, minSnap);\n      const minY = 0;\n      const maxY = 1;\n\n      const slope = (maxY - minY) / (maxX - minX);\n      const res = (y - minX) * (slope + minY);\n      return clamp(res, 0, 1);\n    }\n  );\n\n  const interpolateBackdrop = to(\n    // @ts-ignore\n    [spring.y, spring.minSnap],\n    (y, minSnap) => (minSnap ? clamp(y / minSnap, 0, 1) : 0)\n  );\n\n  return {\n    // Fancy content fade-in effect\n    ['--rsbs-content-opacity' as any]: interpolateContentOpacity,\n    // Fading in the backdrop\n    ['--rsbs-backdrop-opacity' as any]: interpolateBackdrop,\n    // Scaling the antigap in the bottom\n    ['--rsbs-antigap-scale-y' as any]: interpolateFiller,\n    // Shifts the position of the bottom sheet, used on open and close primarily as snap point changes usually only interpolate the height\n    ['--rsbs-overlay-translate-y' as any]: interpolateY,\n    // Remove rounded borders when full height, it looks much better this way\n    ['--rsbs-overlay-rounded' as any]: interpolateBorderRadius,\n    // Animates the height state, not the most performant way but it's the safest with regards to mobile browser and focus/scrolling that could happen while animating\n    ['--rsbs-overlay-h' as any]: interpolateHeight,\n  };\n}\n","/* eslint-disable react/jsx-pascal-case */\nimport { Portal } from \"@reach/portal\";\nimport React, { forwardRef, useRef, useState, useCallback } from 'react';\nimport { BottomSheet as _BottomSheet } from './BottomSheet';\nimport type { Props, RefHandles, SpringEvent } from './types';\nimport { useLayoutEffect } from './hooks';\n\nexport type {\n  RefHandles as BottomSheetRef,\n  Props as BottomSheetProps,\n} from './types';\n\n// Because SSR is annoying to deal with, and all the million complaints about window, navigator and dom elenents!\nexport const BottomSheet = forwardRef<RefHandles, Props>(function BottomSheet(\n  { onSpringStart, onSpringEnd, skipInitialTransition, ...props },\n  ref\n) {\n  // Mounted state, helps SSR but also ensures you can't tab into the sheet while it's closed, or nav there in a screen reader\n  const [mounted, setMounted] = useState(false);\n  const timerRef = useRef<ReturnType<typeof requestAnimationFrame>>();\n  // The last point that the user snapped to, useful for open/closed toggling and the user defined height is remembered\n  const lastSnapRef = useRef(null);\n  // @TODO refactor to an initialState: OPEN | CLOSED property as it's much easier to understand\n  // And informs what we should animate from. If the sheet is mounted with open = true, then initialState = OPEN.\n  // When initialState = CLOSED, then internal sheet must first render with open={false} before setting open={props.open}\n  // It's only when initialState and props.open is mismatching that a intial transition should happen\n  // If they match then transitions will only happen when a user interaction or resize event happen.\n  const initialStateRef = useRef<'OPEN' | 'CLOSED'>(\n    skipInitialTransition && props.open ? 'OPEN' : 'CLOSED'\n  );\n\n  // Using layout effect to support cases where the bottom sheet have to appear already open, no transition\n  useLayoutEffect(() => {\n    if (props.open) {\n      cancelAnimationFrame(timerRef.current);\n      setMounted(true);\n\n      // Cleanup defaultOpen state on close\n      return () => {\n        initialStateRef.current = 'CLOSED';\n      };\n    }\n  }, [props.open]);\n\n  const handleSpringStart = useCallback(\n    async function handleSpringStart(event: SpringEvent) {\n      // Forward the event\n      await onSpringStart?.(event);\n\n      if (event.type === 'OPEN') {\n        // Ensures that when it's opening we abort any pending unmount action\n        cancelAnimationFrame(timerRef.current);\n      }\n    },\n    [onSpringStart]\n  );\n\n  const handleSpringEnd = useCallback(\n    async function handleSpringEnd(event: SpringEvent) {\n      // Forward the event\n      await onSpringEnd?.(event);\n\n      if (event.type === 'CLOSE') {\n        // Unmount from the dom to avoid contents being tabbable or visible to screen readers while closed\n        timerRef.current = requestAnimationFrame(() => setMounted(false));\n      }\n    },\n    [onSpringEnd]\n  );\n\n  // This isn't just a performance optimization, it's also to avoid issues when running a non-browser env like SSR\n  if (!mounted) {\n    return null;\n  }\n\n  return (\n    <Portal data-rsbs-portal>\n      <_BottomSheet\n        {...props}\n        lastSnapRef={lastSnapRef}\n        ref={ref}\n        initialState={initialStateRef.current}\n        onSpringStart={handleSpringStart}\n        onSpringEnd={handleSpringEnd}\n      />\n    </Portal>\n  );\n});\n"],"names":["useLayoutEffect","window","useLayoutEffectSafely","useEffect","clamp","number","lower","upper","roundAndCheckForNaN","unrounded","rounded","Math","round","Number","isNaN","TypeError","box","ref","label","enabled","resizeSourceRef","size","setSize","useState","useDebugValue","handleResize","useCallback","entries","borderBoxSize","blockSize","current","resizeObserver","observe","observerOptions","disconnect","sleep","ms","Promise","resolve","setTimeout","openToDrag","DRAG","target","actions","openToResize","RESIZE","overlayMachine","Machine","id","initial","context","initialState","states","closed","on","OPEN","CLOSE","undefined","opening","start","invoke","src","onDone","transition","always","cond","immediately","open","activating","smoothly","visuallyHidden","end","done","type","SNAP","dragging","snapping","entry","assign","y","_","payload","velocity","snapSource","source","snappingSmoothly","resizing","resizingSmoothly","closing","deactivating","closingSmoothly","onOpenCancel","event","onSnapCancel","onResizeCancel","onCloseCancel","onOpenEnd","onSnapEnd","onRezizeEnd","services","onSnapStart","async","onOpenStart","onCloseStart","onResizeStart","onCloseEnd","onResizeEnd","renderVisuallyHidden","activate","deactivate","openSmoothly","openImmediately","snapSmoothly","resizeSmoothly","closeSmoothly","guards","initiallyClosed","initiallyOpen","_excluded","_excluded2","_excluded3","tension","friction","config","default","BottomSheet","React","forwardRef","_ref","children","sibling","className","footer","header","_open","lastSnapRef","initialFocusRef","onDismiss","maxHeight","controlledMaxHeight","defaultSnap","getDefaultSnap","_defaultSnap","snapPoints","getSnapPoints","_snapPoints","blocking","scrollLocking","style","onSpringStart","onSpringCancel","onSpringEnd","reserveScrollBarGap","expandOnContentDrag","props","ready","registerReady","setReady","readyMap","updateReadyMap","key","Object","values","length","every","Boolean","useReady","canDragRef","useRef","onSpringStartRef","onSpringCancelRef","onSpringEndRef","spring","set","useReactSpring","minSnap","maxSnap","containerRef","scrollRef","contentRef","footerRef","preventScrollingRef","prefersReducedMotion","mql","useMemo","matchMedia","matches","handler","addListener","removeListener","useReducedMotion","scrollLockRef","useScrollLock","targetRef","active","disableBodyScroll","allowTouchMove","el","closest","enableBodyScroll","ariaHiderRef","useAriaHider","rootNodes","parentNode","document","querySelectorAll","forEach","node","attr","getAttribute","originalValues","push","setAttribute","index","originalValue","removeAttribute","useFocusTrap","fallbackRef","fallback","trap","createFocusTrap","onActivate","initialFocus","fallbackFocus","escapeDeactivates","clickOutsideDeactivates","overlayRef","findSnap","useSnapPoints","footerEnabled","headerEnabled","headerRef","heightRef","minHeight","headerHeight","footerHeight","setMaxHeight","innerHeight","raf","requestAnimationFrame","addEventListener","removeEventListener","cancelAnimationFrame","useMaxHeight","useElementSizeObserver","min","contentHeight","useDimensions","unsafeSnaps","snapPointsDedupedSet","concat","map","reduce","acc","snapPoint","add","Set","Array","from","max","processSnapPoints","height","numberOrCallback","unsafeSearch","lastSnap","querySnap","prev","curr","abs","maxHeightRef","minSnapRef","maxSnapRef","findSnapRef","defaultSnapRef","asyncSet","_ref2","onRest","opts","_objectWithoutPropertiesLoose","_extends","mass","args","send","useMachine","devTools","immediate","all","focusTrapRef","snap","useImperativeHandle","snapTo","elem","preventScrolling","e","preventDefault","preventSafariOverscroll","scrollTop","overflow","removeProperty","bind","useDrag","closeOnTap","isContentDragging","cancel","direction","down","first","last","memo","get","movement","_my","tap","my","_memo","predictedDistance","predictedY","rawY","newY","rubberbandIfOutOfBounds","filterTaps","interpolations","useSpringInterpolations","interpolateBorderRadius","to","interpolateHeight","interpolateY","ceil","minX","interpolateFiller","createElement","animated","div","publicStates","find","opacity","role","tabIndex","onKeyDown","stopPropagation","skipInitialTransition","mounted","setMounted","timerRef","initialStateRef","handleSpringStart","handleSpringEnd","Portal","_BottomSheet"],"mappings":"s+BAG4BA,EACR,oBAALC,OAAmBC,EAAwBC,ECD1CC,SAAAA,EAAMC,EAAgBC,EAAeC,GAUnD,OANAD,GAFAA,GAASA,IAESA,EAAQA,EAAQ,EAClCC,GAFAA,GAASA,IAESA,EAAQA,EAAQ,GAJlCF,GAAUA,IAKKA,IAEbA,GADAA,EAASA,GAAUE,EAAQF,EAASE,IACjBD,EAAQD,EAASC,GAGxCD,CAAA,CASgBG,SAAAA,EAAoBC,GAClC,MAAaC,EAAGC,KAAKC,MAAMH,GAC3B,GAAII,OAAOC,MAAML,GACf,MAAM,IAAaM,UACjB,8DAIJ,OAAOL,CACT,CCoIA,QAA+C,CAG7CM,IAAK,cAOP,WACEC,GACAC,MACEA,EAAKC,QACLA,EAAOC,gBACPA,IAOF,IAAKC,EAAMC,GAAWC,EAAS,GAE/BC,EAAiB,GAAAN,MAAUG,KAE3B,MAAkBI,EAAGC,EAClBC,IAECL,EAAQK,EAAQ,GAAGC,cAAc,GAAGC,WACpCT,EAAgBU,QAAU,SAAA,EAE5B,CAACV,IAgBH,OAbApB,EAAgB,KACd,IAAKiB,EAAIa,UAAYX,EACnB,OAGF,QAAuB,MAAmBM,GAG1C,OAFAM,EAAeC,QAAQf,EAAIa,QAASG,GAE7B,KACLF,EAAeG,YACjB,CAAA,EACC,CAACjB,EAAKQ,EAAcN,IAEhBA,EAAUE,EAAO,CAC1B,CCnHA,SAAcc,EAACC,EAAK,KAClB,OAAO,IAAWC,QAAEC,GAAYC,WAAWD,EAASF,GACtD,CAEA,MAGMI,EAAa,CACjBC,KAAM,CAAEC,OAAQ,oBAAqBC,QAAS,cAE9BC,EAAG,CACnBC,OAAQ,CAAEH,OAAQ,oBAAqBC,QAAS,cAQrCG,EAAiBC,EAK5B,CACEC,GAAI,UACJC,QAAS,SACTC,QAAS,CAAEC,aAAc,UACzBC,OAAQ,CACNC,OAAQ,CAAEC,GAAI,CAAEC,KAAM,UAAWC,WAAOC,IACxCC,QAAS,CACPT,QAAS,QACTG,OAAQ,CACNO,MAAO,CACLC,OAAQ,CACNC,IAAK,cACLC,OAAQ,eAGZC,WAAY,CACVC,OAAQ,CACN,CAAEtB,OAAQ,cAAeuB,KAAM,iBAC/B,CAAEvB,OAAQ,WAAYuB,KAAM,qBAGhCC,YAAa,CACXjB,QAAS,OACTG,OAAQ,CACNe,KAAM,CACJP,OAAQ,CAAEC,IAAK,kBAAmBC,OAAQ,eAE5CM,WAAY,CACVR,OAAQ,CAAEC,IAAK,WAAYC,OAAQ,wBACnCR,GAASd,EAAAA,CAAAA,EAAAA,EAAeI,MAI9ByB,SAAU,CACRpB,QAAS,iBACTG,OAAQ,CACNkB,eAAgB,CACdV,OAAQ,CAAEC,IAAK,uBAAwBC,OAAQ,eAEjDM,WAAY,CACVR,OAAQ,CAAEC,IAAK,WAAYC,OAAQ,SAErCK,KAAM,CACJP,OAAQ,CAAEC,IAAK,eAAgBC,OAAQ,wBACvCR,GAASd,EAAAA,CAAAA,EAAAA,EAAeI,MAI9B2B,IAAK,CACHX,OAAQ,CAAEC,IAAK,YAAaC,OAAQ,QACpCR,GAAI,CAAEE,MAAO,mBAAoBf,KAAM,sBAEzC+B,KAAM,CACJC,KAAM,UAGVnB,QA5EW,CACjBE,MAAO,CAAEd,OAAQ,mBAAoBC,QAAS,kBA4ExCmB,OAAQ,QAEVK,KAAM,CACJb,GAAI,CAAEb,KAAM,oBAAqBiC,KAAM,WAAY7B,OAAQ,aAE7D8B,SAAU,CACRrB,GAAI,CAAEoB,KAAM,aAEdE,SAAU,CACR3B,QAAS,QACTG,OAAQ,CACNO,MAAO,CACLC,OAAQ,CACNC,IAAK,cACLC,OAAQ,oBAEVe,MAAO,CACLC,EAAO,CAELC,EAAG,CAACC,GAAKC,SAAWF,QAAUA,EAC9BG,SAAU,CAACF,GAAKC,SAAWC,eAAiBA,EAC5CC,WAAY,CAACH,GAAKC,SAAWG,OAAAA,EAAS,aAAiBA,MAI7DC,iBAAkB,CAChBzB,OAAQ,CAAEC,IAAK,eAAgBC,OAAQ,QAEzCS,IAAK,CACHX,OAAQ,CAAEC,IAAK,YAAaC,OAAQ,QACpCR,GAAI,CACFT,OAAQ,oBACR6B,KAAM,oBACNlB,MAAO,mBACPf,KAAM,sBAGV+B,KAAM,CAAEC,KAAM,UAEhBnB,GAAI,CACFoB,KAAM,CAAEhC,OAAQ,WAAYC,QAAS,aACrCE,OAAQ,CAAEH,OAAQ,oBAAqBC,QAAS,gBAChDF,KAAM,CAAEC,OAAQ,oBAAqBC,QAAS,gBAC9Ca,MAAO,CAAEd,OAAQ,mBAAoBC,QAAS,iBAEhDmB,OAAQ,QAEVwB,SAAU,CACRrC,QAAS,QACTG,OAAQ,CACNO,MAAO,CACLC,OAAQ,CACNC,IAAK,gBACLC,OAAQ,qBAGZyB,iBAAkB,CAChB3B,OAAQ,CAAEC,IAAK,iBAAkBC,OAAQ,QAE3CS,IAAK,CACHX,OAAQ,CAAEC,IAAK,cAAeC,OAAQ,QACtCR,GAAI,CACFoB,KAAM,oBACNlB,MAAO,mBACPf,KAAM,sBAGV+B,KAAM,CAAEC,KAAM,UAEhBnB,GAAI,CACFT,OAAQ,CAAEH,OAAQ,WAAYC,QAAS,eACvC+B,KAAM,CAAEhC,OAAQ,WAAYC,QAAS,kBACrCF,KAAM,CAAEC,OAAQ,oBAAqBC,QAAS,kBAC9Ca,MAAO,CAAEd,OAAQ,mBAAoBC,QAAS,mBAEhDmB,OAAQ,QAEV0B,QAAS,CACPvC,QAAS,QACTG,OAAQ,CACNO,MAAO,CACLC,OAAQ,CACNC,IAAK,eACLC,OAAQ,gBAEVR,GAAI,CAAEC,KAAM,CAAEb,OAAQ,gBAAiBC,QAAS,mBAElD8C,aAAc,CACZ7B,OAAQ,CAAEC,IAAK,aAAcC,OAAQ,oBAEvC4B,gBAAiB,CACf9B,OAAQ,CAAEC,IAAK,gBAAiBC,OAAQ,QAE1CS,IAAK,CACHX,OAAQ,CAAEC,IAAK,aAAcC,OAAQ,QACrCR,GAAI,CACFC,KAAM,CAAEb,OAAQ,mBAAoBC,QAAS,mBAGjD6B,KAAM,CAAEC,KAAM,UAEhBnB,GAAI,CACFE,WAAOC,EACPF,KAAM,CAAEb,OAAQ,mBAAoBC,QAAS,kBAE/CmB,OAAQ,WAGZR,GAAI,CACFE,MAAO,YAGX,CACEb,QAAS,CACPgD,aAAc,CAACzC,EAAS0C,KAAV,EAGdC,aAAc,CAAC3C,EAAS0C,KAAV,EAGdE,eAAgB,CAAC5C,EAAS0C,KAAV,EAGhBG,cAAe,CAAC7C,EAAS0C,KAAV,EAGfI,UAAW,CAAC9C,EAAS0C,KAAV,EAGXK,UAAW,CAAC/C,EAAS0C,KAAV,EAGXM,YAAa,CAAChD,EAAS0C,KAAV,GAIfO,SAAU,CACRC,YAAaC,gBACLlE,GAAK,EAEbmE,YAAaD,gBACLlE,GAAK,EAEboE,aAAcF,gBACNlE,GAAK,EAEbqE,cAAeH,gBACPlE,GAAK,EAEb8D,UAAWI,gBACHlE,GAAK,EAEb6D,UAAWK,gBACHlE,GAAK,EAEbsE,WAAYJ,gBACJlE,GAAK,EAEbuE,YAAaL,gBACLlE,GAAK,EAEbwE,qBAAsBN,MAAOnD,EAAS0C,WAG9BzD,GAAK,EAGbyE,SAAUP,MAAOnD,EAAS0C,WAGbzD,GAEb,EACA0E,WAAYR,MAAOnD,EAAS0C,WAGfzD,GAEb,EACA2E,aAAcT,MAAOnD,EAAS0C,gBAM9BmB,gBAAiBV,MAAOnD,EAAS0C,WAGzBzD,GAAK,EAGb6E,aAAcX,MAAOnD,EAAS0C,WAGtBzD,GAAK,EAGb8E,eAAgBZ,MAAOnD,EAAS0C,WAGnBzD,GAEb,EACA+E,cAAeb,MAAOnD,EAAS0C,WAGlBzD,GAEb,GAEFgF,OAAQ,CAAEC,gBApRU,EAAGjE,kBAAoC,WAAjBA,EAoRfkE,cArRT,EAAGlE,kBAAoC,SAAjBA,KCzG5CmE,EAAA,CAAA,WAAA,UAAA,YAAA,SAAA,SAAA,OAAA,eAAA,cAAA,kBAAA,YAAA,YAAA,cAAA,aAAA,WAAA,gBAAA,QAAA,gBAAA,iBAAA,cAAA,sBAAA,uBAAAC,EAAA,CAAA,YAAAC,EAAA,CAAA,SAAA,WA8BMC,QAAEA,EAAOC,SAAEA,GAAaC,EAAOC,QAKxBC,EAAcC,EAAMC,WAM/B,SAA4BC,EAyB5BD,GAAU,IAxBVE,SACEA,EAAQC,QACRA,EAAOC,UACPA,EAASC,OACTA,EAAMC,OACNA,EACAlE,KAAMmE,EAAKnF,aACXA,EAAYoF,YACZA,EAAWC,gBACXA,EAAeC,UACfA,EACAC,UAAWC,EACXC,YAAaC,EAAiBC,EAC9BC,WAAYC,EAAgBC,EAAWC,SACvCA,GAAW,EAAIC,cACfA,GAAgB,EAAIC,MACpBA,EAAKC,cACLA,EAAaC,eACbA,EAAcC,YACdA,EAAWC,oBACXA,EAAsBN,EAAQO,oBAC9BA,IAAsB,GACnBC,EAAAA,UAML,MAAMC,MAAEA,GAAKC,cAAEA,eCxEf,MAAOD,EAAOE,GAAYtI,GAAS,IAC5BuI,EAAUC,GAAkBxI,EAAqC,CAAE,GAEpEqI,EAAgBlI,EAAasI,IAGjCD,EAAgBJ,GAAgBA,EAAAA,CAAAA,EAAAA,EAAO,CAAAK,CAACA,IAAM,KAEvC,KAGLD,EAAgBJ,GAAgBA,EAAAA,CAAAA,EAAAA,EAAO,CAAAK,CAACA,IAAM,IAChD,GACC,IAkBH,OAhBA7J,EAAU,KACR,MAAMiD,EAAS6G,OAAOC,OAAOJ,GAEP,IAAlB1G,EAAO+G,QAKK/G,EAAOgH,MAAMC,UAI3BR,GAAS,EACV,EACA,CAACC,IAEG,CAAEH,QAAOC,gBAClB,CDwCmCU,GAGjBC,GAAGC,GAAO,GAGpBC,GAAmBD,EAAOnB,GAC1BqB,GAAoBF,EAAOlB,GAC3BqB,GAAiBH,EAAOjB,GAC9BpJ,EAAU,KACRsK,GAAiB3I,QAAUuH,EAC3BqB,GAAkB5I,QAAUwH,EAC5BqB,GAAe7I,QAAUyH,CAC3B,EAAG,CAACD,EAAgBD,EAAeE,IAGnC,MAAOqB,GAAQC,IEvFRC,EAAe,KAAO,CAC3B/F,EAAG,EACH4E,MAAO,EACPjB,UAAW,EACXqC,QAAS,EACTC,QAAS,KFoFLC,GAAeT,EAAuB,MACtCU,GAAYV,EAAuB,MACnCW,GAAaX,EAAuB,SACxBA,EAAuB,MACnCY,GAAYZ,EAAuB,SACtBA,EAA8B,SAG/BA,EAAO,MACDA,IACCa,GAAGb,GAAO,GAETc,cGvG1B,MAASC,EAAGC,EACV,IACoB,oBAAXvL,OACHA,OAAOwL,WAAW,oCAClB,KACN,MAEUjB,EAAOe,MAAAA,OAAAA,EAAAA,EAAKG,SAaxB,OAXAlK,EAAcP,EAAIa,QAAU,SAAW,iBAEvC3B,EAAU,KACR,MAAMwL,EAAW/F,IACf3E,EAAIa,QAAU8D,EAAM8F,OACtB,EAGA,aAFAH,GAAAA,EAAKK,YAAYD,GAEV,IAAS,MAAHJ,OAAG,EAAHA,EAAKM,eAAeF,EAAO,EACvC,CAACJ,IAGNtK,CAAA,CHkF+B6K,GAGvBC,GIhGQC,UAAcC,UAC5BA,EAAS9K,QACTA,EAAOqI,oBACPA,IAMA,QAAYgB,EAAyD,CACnE5D,SAAU,KACR,MAAU7F,IAAAA,UAAU,0CAAyC,EAE/D8F,WAAY,SAgCd,OA7BArF,EAAcL,EAAU,UAAY,YAEpChB,EAAU,KACR,IAAKgB,EAGH,OAFAF,EAAIa,QAAQ+E,kBACZ5F,EAAIa,QAAU,CAAE8E,SAAU,OAAUC,WAAY,SAIlD,MAAMnE,EAASuJ,EAAUnK,QACzB,OAAa,EAEbb,EAAIa,QAAU,CACZ8E,SAAU,KACJsF,IACJA,GAAS,EACTC,EAAkBzJ,EAAQ,CACxB0J,eAAiBC,GAAOA,EAAGC,QAAQ,kCACnC9C,wBAEJ,EACA3C,WAAY,KACLqF,IACLA,GAAS,EACTK,EAAiB7J,GAAM,IAG1B,CAACvB,EAAS8K,EAAWzC,IAG1BvI,CAAA,CJkDwB+K,CAAc,CAClCC,UAAWf,GACX/J,QAASwI,IAASR,EAClBK,wBAEgBgD,GKhHJC,UAAaR,UAC3BA,EAAS9K,QACTA,IAKA,MAASF,EAAGuJ,EAAyD,CACnE5D,SAAU,KACR,MAAM,cAAc,yCAAwC,EAE9DC,WAAY,SAwDd,OArDArF,EAAcL,EAAU,UAAY,YAEpChB,EAAU,KACR,IAAKgB,EAGH,OAFAF,EAAIa,QAAQ+E,kBACZ5F,EAAIa,QAAU,CAAE8E,SAAU,OAAUC,WAAY,SAIlD,MAAMnE,EAASuJ,EAAUnK,QACzB,IAAIoK,GAAS,IAC2B,GAC3BQ,EAAc,GAE3BzL,EAAIa,QAAU,CACZ8E,SAAU,KACR,GAAIsF,EAAQ,OACZA,GAAS,EAET,QAAmBxJ,EAAOiK,WAE1BC,SAASC,iBAAiB,YAAYC,QAASC,IAC7C,GAAIA,IAASJ,EACX,OAEF,IAAIK,EAAOD,EAAKE,aAAa,eACA,OAATD,GAA0B,UAATA,IAIrCE,EAAeC,KAAKH,GACpBN,EAAUS,KAAKJ,GACfA,EAAKK,aAAa,cAAe,QACnC,IAEFvG,WAAY,KACLqF,IACLA,GAAS,EAETQ,EAAUI,QAAQ,CAACC,EAAMM,KACvB,IAAiBC,EAAGJ,EAAeG,GACb,OAAlBC,EACFP,EAAKQ,gBAAgB,eAErBR,EAAKK,aAAa,cAAeE,EAClC,GAEHJ,EAAiB,GACjBR,EAAY,GAAA,IAGf,CAACT,EAAW9K,IAGjBF,CAAA,CL4CuBwL,CAAa,CAChCR,UAAWhB,GACX9J,QAASwI,IAAST,OMlHNsE,UAAavB,UAC3BA,EAASwB,YACTA,EAAWjF,gBACXA,EAAerH,QACfA,IAOA,MAASF,EAAGuJ,EAAyD,CACnE5D,SAAU,KACR,MAAU7F,IAAAA,UAAU,yCAAwC,EAE9D8F,WAAY,SAiDd,OA9CArF,EAAcL,EAAU,UAAY,YAEpChB,EAAU,KACR,IAAKgB,EAGH,OAFAF,EAAIa,QAAQ+E,kBACZ5F,EAAIa,QAAU,CAAE8E,SAAU,OAAUC,WAAY,SAIlD,MAAM6G,EAAWD,EAAY3L,QACnB6L,EAAGC,EAAgB3B,EAAUnK,QAAS,CAC9C+L,gBAKMpK,EAENqK,aAActF,EACV,KAAMA,MAAAA,OAAAA,EAAAA,EAAiB1G,UAAW4L,OAClCjK,EACJsK,cAAeL,EACfM,mBAAmB,EACnBC,yBAAyB,IAE3B,IAAI/B,GAAS,EAEbjL,EAAIa,QAAU,CACZ8E,SAAUP,UACJ6F,IACJA,GAAS,QAECyB,EAAC/G,iBAGDvE,IAAAA,QAASC,GAAYC,WAAW,IAAMD,OAAQ,GAAS,IAAE,EAErEuE,WAAY,KACLqF,IACLA,GAAS,EAETyB,EAAK9G,aAAU,IAGlB,CAAC1F,EAASsM,EAAajF,EAAiByD,IAG7ChL,CAAA,CNmDuBuM,CAAa,CAChCvB,UAAWhB,GACXwC,YAAaS,GACb1F,gBAAiBA,QAAmB/E,EACpCtC,QAASwI,IAAST,IAAgC,IAApBV,KAG1BuC,QAAEA,GAAOC,QAAEA,GAAOtC,UAAEA,GAASyF,SAAEA,IF/GvBC,UAAcjD,WAC5BA,EAAUxC,oBACVA,EAAmB0F,cACnBA,EAAajD,UACbA,EAASpC,cACTA,EAAasF,cACbA,EAAaC,UACbA,EAASC,UACTA,EAASjG,YACTA,EAAWoB,MACXA,EAAKC,cACLA,EAAaxI,gBACbA,IAeA,MAAMsH,UAAEA,EAAS+F,UAAEA,EAASC,aAAEA,EAAYC,aAAEA,GAwD9C,UAAuBxD,WACrBA,EAAUxC,oBACVA,EAAmB0F,cACnBA,EAAajD,UACbA,EAASkD,cACTA,EAAaC,UACbA,EAAS3E,cACTA,EAAaxI,gBACbA,IAWA,MAAcyI,EAAG2B,EAAQ,IAAM5B,EAAc,iBAAkB,CAC7DA,IAEIlB,EAgGR,SACEC,EACAiB,EACAxI,GAEA,QAAiBoK,EAAQ,IAAM5B,EAAc,aAAc,CAACA,KACrDlB,EAAWkG,GAAgBrN,EAAS,IACzCf,EAAoBmI,IAA0C,2BAC1D1I,OAAO4O,YACP,KAEQnG,EAAY,EACjBoG,EAAGtE,EAAO,GA4CnB,OA1CAhJ,EAAcmH,EAAsB,aAAe,QAEnDxI,EAAU,KACJwJ,GACFE,GACD,EACA,CAACF,EAAOE,IAEX7J,EAAgB,KAEd,GAAI2I,EAIF,OAHAiG,EAAapO,EAAoBmI,SACjCvH,EAAgBU,QAAU,iBAK5B,MAAML,EAAe,KACfqN,EAAIhN,UAMRgN,EAAIhN,QAAUiN,sBAAsB,KAClCH,EAAa3O,OAAO4O,aACpBzN,EAAgBU,QAAU,SAE1BgN,EAAIhN,QAAU,IACf,EAOH,OALA7B,OAAO+O,iBAAiB,SAAUvN,GAClCmN,EAAa3O,OAAO4O,aACpBzN,EAAgBU,QAAU,SAC1B+H,IAEO,KACL5J,OAAOgP,oBAAoB,SAAUxN,GACrCyN,qBAAqBJ,EAAIhN,QAAO,CAClC,EACC,CAAC6G,EAAqBkB,EAAUzI,IAGrCsH,CAAA,CAzJoByG,CAChBxG,EACAiB,EACAxI,GAIgBsN,EAAGU,EAAuBb,EAAW,CACrDrN,MAAO,eACPC,QAASmN,EACTlN,sBAEoBgO,EAAuBjE,EAAY,CACvDjK,MAAO,gBACPC,SAAS,EACTC,oBAEgBuN,EAAGS,EAAuBhE,EAAW,CACrDlK,MAAO,eACPC,QAASkN,EACTjN,sBAGAT,KAAK0O,IAAI3G,EAAYgG,EAAeC,EAAcW,GAClDZ,EACAC,EAEFnN,EAAc,cAAciN,KAE5B,MAAM9E,EAAQ2F,EAAgB,EAO9B,OANAnP,EAAU,KACJwJ,GACFE,GACD,EACA,CAACF,EAAOE,IAEJ,CACLnB,YACA+F,YACAC,eACAC,eAEJ,CAxH+DY,CAAc,CACzEpE,WAAYA,EACZxC,sBACA0F,gBACAjD,YACAkD,gBACAC,YACA3E,gBACAxI,qBAGI2H,WAAEA,EAAUgC,QAAEA,EAAOC,QAAEA,GDlBf,SAAkBwE,EAAgC9G,GAChE,MAE0B+G,EAFR,GAAGC,OAAOF,GAAaG,IAAInP,GAENoP,OAAO,CAACC,EAAKC,KAClDD,EAAIE,IAAI3P,EAAM0P,EAAW,EAAGpH,IACrBmH,GACN,IAAIG,KAESjH,EAAGkH,MAAMC,KAAKT,GAExB1E,EAAUpK,KAAK0O,OAAOtG,GAC5B,GAAIlI,OAAOC,MAAMiK,GACf,MAAUhK,IAAAA,UAAU,kBAEtB,MAAaiK,EAAGrK,KAAKwP,OAAOpH,GAC5B,GAAIlI,OAAOC,MAAMkK,GACf,MAAM,IAAajK,UAAC,kBAGtB,MAAO,CACLgI,aACAgC,UACAC,UAEJ,CCN2CoF,CACvCzG,EACIX,EAAc,CACZqH,OAAQ7B,EAAU1M,QAClB6M,eACAD,eACAD,YACA/F,cAEF,CAAC,GACLA,GAgCF,OAFAlH,EAA0B,YAAAuJ,cAAoBC,KAEvC,CAAED,UAASC,UAASmD,SA3B3B,SACEmC,GAEA,IAAIC,EAEFA,EAD8B,mBAALD,EACVA,EAAiB,CAC9B3B,eACAD,eACA2B,OAAQ7B,EAAU1M,QAClB2M,YACA/F,YACAK,aACAyH,SAAUjI,EAAYzG,UAGTwO,EAEjB,MAAMG,EAAYjQ,EAAoB+P,GACtC,SAAkBX,OAChB,CAACc,EAAMC,IACLhQ,KAAKiQ,IAAID,EAAOF,GAAa9P,KAAKiQ,IAAIF,EAAOD,GAAaE,EAAOD,EACnE3F,EAEJ,EAIqCrC,YACvC,CE8BoD0F,CAAc,CAC9DjD,cACAxC,sBACA0F,gBAAiBjG,EACjBgD,aACApC,gBACAsF,eAA0B,IAAXjG,EACfkG,aACAC,aACAjG,cACAoB,SACAC,iBACAxI,qBAIIyP,GAAerG,EAAO9B,IACtBoI,GAAatG,EAAOO,IACpBgG,GAAavG,EAAOQ,IACpBgG,GAAcxG,EAAO2D,IACrB8C,GAAiBzG,EAAO,GAE9BxK,EAAgB,KACd6Q,GAAa/O,QAAU4G,GACvBqI,GAAWjP,QAAUkJ,GACrB8F,GAAWhP,QAAUiJ,GACrBiG,GAAYlP,QAAUqM,GACtB8C,GAAenP,QAAUqM,GAAStF,IACjC,CAACsF,GAAUtF,EAAgBH,GAAWsC,GAASD,KAGlD,MAAcmG,GAAGxP,EAEfyP,IAAA,IAACC,OAAEA,EAAQzJ,QAAQzC,SAAEA,EAAW,GAAiB,CAAA,GAAXyC,EAAAA,EAA3BA,EAAAA,EAAAA,UAA6C0J,EAAIC,EAAAH,EAAA3J,GAAA,OAEtDnF,IAAAA,QAASC,GACXuI,GAAG0G,EAAA,CAAA,EACEF,EACH1J,CAAAA,UACEzC,YACGyC,EAEH6J,CAAAA,KAAM,EAEN/J,UAEAC,SAAU/G,KAAKwP,IACbzI,EACAA,GAAYA,EAAWA,EAAWxC,MAGtCkM,OAAQ,IAAIK,KAEVnP,KAAWmP,GACL,MAANL,GAAAA,KAAYK,EACd,KACA,EAEN,CAAC5G,MAEI/I,GAAS4P,IAAQC,EAAW7O,EAAgB,CACjD8O,UH3HE,EG4HFjP,QAAS,CACPgD,aAAcjE,EACZ,IAA+B,MAAzBgJ,GAAkB5I,aAAO,EAAzB4I,GAAkB5I,QAAU,CAAE2C,KAAM,SAC1C,IAEFoB,aAAcnE,EACXwB,GACCwH,MAAAA,GAAkB5I,aAAlB4I,EAAAA,GAAkB5I,QAAU,CAC1B2C,KAAM,OACNW,OAAQlC,EAAQiC,aAEpB,IAEFY,cAAerE,EACb,IAA+B,MAAzBgJ,GAAkB5I,aAAO,EAAzB4I,GAAkB5I,QAAU,CAAE2C,KAAM,UAC1C,IAEFqB,eAAgBpE,EACd,IACEgJ,MAAAA,GAAkB5I,aAAlB4I,EAAAA,GAAkB5I,QAAU,CAC1B2C,KAAM,SACNW,OAAQhE,GAAgBU,UAE5B,IAEFkE,UAAWtE,EACT,IAAMiJ,MAAAA,GAAe7I,aAAf6I,EAAAA,GAAe7I,QAAU,CAAE2C,KAAM,SACvC,IAEFwB,UAAWvE,EACT,CAACwB,EAAS0C,IACc,MAAtB+E,GAAe7I,aAAO,EAAtB6I,GAAe7I,QAAU,CACvB2C,KAAM,OACNW,OAAQlC,EAAQiC,aAEpB,IAEFuB,YAAahF,EACX,IACwB,MAAtBiJ,GAAe7I,aAAO,EAAtB6I,GAAe7I,QAAU,CACvB2C,KAAM,SACNW,OAAQhE,GAAgBU,UAE5B,KAGJoB,QAAS,CAAEC,gBACXgD,SAAU,CACRC,YAAa1E,EACX2E,MAAOnD,EAAS0C,IACd6E,MAAAA,GAAiB3I,aAAjB2I,EAAAA,GAAiB3I,QAAU,CACzB2C,KAAM,OACNW,OAAQQ,EAAMX,QAAQG,QAAU,WAEpC,IAEFkB,YAAa5E,EACX2E,SAAoC,MAAxBoE,GAAiB3I,aAAO,EAAxB2I,GAAiB3I,QAAU,CAAE2C,KAAM,SAC/C,IAEF8B,aAAc7E,EACZ2E,SAAYoE,MAAAA,GAAiB3I,aAAjB2I,EAAAA,GAAiB3I,QAAU,CAAE2C,KAAM,UAC/C,IAEF+B,cAAe9E,EACb2E,SACEoE,MAAAA,GAAiB3I,aAAjB2I,EAAAA,GAAiB3I,QAAU,CACzB2C,KAAM,SACNW,OAAQhE,GAAgBU,UAE5B,IAEFmE,UAAWvE,EACT2E,MAAOnD,EAAS0C,IACQ,MAAtB+E,GAAe7I,aAAO,EAAtB6I,GAAe7I,QAAU,CACvB2C,KAAM,OACNW,OAAQlC,EAAQiC,aAEpB,IAEFa,UAAWtE,EACT2E,SAAkC,MAAtBsE,GAAe7I,aAAO,EAAtB6I,GAAe7I,QAAU,CAAE2C,KAAM,SAC7C,IAEFgC,WAAY/E,EACV2E,SAAkC,MAAtBsE,GAAe7I,aAAO,EAAtB6I,GAAe7I,QAAU,CAAE2C,KAAM,UAC7C,IAEFiC,YAAahF,EACX2E,SACEsE,MAAAA,GAAe7I,aAAf6I,EAAAA,GAAe7I,QAAU,CACvB2C,KAAM,SACNW,OAAQhE,GAAgBU,UAE5B,IAEF6E,qBAAsBjF,EACpB2E,MAAOnD,EAAS0C,WACAsL,GAAC,CACbnM,EAAGkM,GAAenP,QAClB6H,MAAO,EACPjB,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QAEpBiJ,QAASkG,GAAenP,QACxB+P,WAAW,GACZ,EAEH,CAACX,KAEHtK,SAAUlF,EACR2E,MAAOnD,EAAS0C,KACd2E,GAAWzI,SAAU,QACRO,QAACyP,IAAI,CAChB/F,GAAcjK,QAAQ8E,WACtBmL,GAAajQ,QAAQ8E,WACrB4F,GAAa1K,QAAQ8E,YAEzB,EACA,CAAC4F,GAAcuF,GAAchG,KAE/BlF,WAAYnF,EAAY2E,UACtB0F,GAAcjK,QAAQ+E,aACtBkL,GAAajQ,QAAQ+E,aACrB2F,GAAa1K,QAAQ+E,aACrB0D,GAAWzI,SAAU,CAAA,EACpB,CAAC0K,GAAcuF,GAAchG,KAChChF,gBAAiBrF,EAAY2E,UAC3BmI,GAAU1M,QAAUmP,GAAenP,iBACpB,CACbiD,EAAGkM,GAAenP,QAClB6H,MAAO,EACPjB,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QAEpBiJ,QAASkG,GAAenP,QACxB+P,WAAW,GACZ,EACA,CAACX,KACJpK,aAAcpF,EAAY2E,mBACT,CACbtB,EAAG,EACH4E,MAAO,EACPjB,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QAEpBiJ,QAASkG,GAAenP,QACxB+P,WAAW,IAGbrD,GAAU1M,QAAUmP,GAAenP,cAE7BoP,GAAS,CACbnM,EAAGkM,GAAenP,QAClB6H,MAAO,EACPjB,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QAEpBiJ,QAASkG,GAAenP,QACxB+P,UAAWvG,GAAqBxJ,SAEpC,EAAG,CAACoP,GAAU5F,KACdtE,aAActF,EACZ2E,MAAOnD,EAAS0C,KACd,MAAMoM,EAAOhB,GAAYlP,QAAQoB,EAAQ6B,GACzCyJ,GAAU1M,QAAUkQ,EACpBzJ,EAAYzG,QAAUkQ,QAChBd,GAAS,CACbnM,EAAGiN,EACHrI,MAAO,EACPjB,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QACpBiJ,QAAS+F,GAAWhP,QACpB+P,UAAWvG,GAAqBxJ,QAChC6F,OAAQ,CAAEzC,SAAUhC,EAAQgC,WAEhC,EACA,CAACgM,GAAU3I,EAAa+C,KAE1BrE,eAAgBvF,EAAY2E,UAC1B,QAAa2K,GAAYlP,QAAQ0M,GAAU1M,SAC3C0M,GAAU1M,QAAUkQ,EACpBzJ,EAAYzG,QAAUkQ,WACP,CACbjN,EAAGiN,EACHrI,MAAO,EACPjB,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QACpBiJ,QAAS+F,GAAWhP,QACpB+P,UAC8B,YAA5BzQ,GAAgBU,SACZwJ,GAAqBxJ,SAE5B,EACA,CAACoP,GAAU3I,EAAa+C,KAC3BpE,cAAexF,EACb2E,MAAOnD,EAAS0C,KAEdsL,GAAS,CACPnG,QAASyD,GAAU1M,QACnB+P,WAAW,IAGbrD,GAAU1M,QAAU,QAENoP,GAAC,CACbnM,EAAG,EACH2D,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QACpB+P,UAAWvG,GAAqBxJ,mBAGnB,CAAE6H,MAAO,EAAGkI,WAAW,GAAM,EAE9C,CAACX,GAAU5F,QAKjBnL,EAAU,KACHwJ,IAGH+H,GADEpJ,EACG,OAEA,QACN,EACA,CAACA,EAAOoJ,GAAM/H,KACjB3J,EAAgB,MAEV0I,IAAasC,IAAWD,KAC1B2G,GAAK,SACN,EACA,CAAChJ,GAAWsC,GAASD,GAAS2G,KACjCvR,EACE,IAAM,KAEJ4L,GAAcjK,QAAQ+E,aACtBkL,GAAajQ,QAAQ+E,aACrB2F,GAAa1K,QAAQ+E,cAEvB,CAAC2F,GAAcuF,GAAchG,KAG/BkG,EACElK,EACA,KAAO,CACLmK,OAAQ,CAAC5B,GAAoBpL,SAAAA,EAAW,EAAGE,OAAAA,EAAS,UAAa,MAC/DsM,GAAK,OAAQ,CACXzM,QAAS,CACPF,EAAGiM,GAAYlP,QAAQwO,GACvBpL,SAAAA,EACAE,OAAAA,IAGN,EACUiL,aACR,UAAiBvO,OACnB,IAEF,CAAC4P,KAGHvR,EAAU,KACR,MAAUgS,EAAGjH,GAAUpJ,QAEDsQ,EAAGC,IACnBhH,GAAoBvJ,SACtBuQ,EAAEC,gBACH,EAG0BC,EAAGF,IAC1BF,EAAKK,UAAY,IACnBzD,sBAAsB,KACpBoD,EAAK/I,MAAMqJ,SAAW,SACtBN,EAAKK,UAAY,EACjBL,EAAK/I,MAAMsJ,eAAe,WAAU,GAEtCL,EAAEC,iBACH,EAQH,OALI7I,KACF0I,EAAKnD,iBAAiB,SAAUoD,GAChCD,EAAKnD,iBAAiB,YAAaoD,GACnCD,EAAKnD,iBAAiB,aAAcuD,IAE/B,KACLJ,EAAKlD,oBAAoB,SAAUmD,GACnCD,EAAKlD,oBAAoB,YAAamD,GACtCD,EAAKlD,oBAAoB,aAAcsD,EACzC,CAAA,EACC,CAAC9I,GAAqByB,KAEzB,MA0HUyH,GAAGC,EA1HM,EACjBnB,OAASoB,WAAAA,GAAa,EAAOC,kBAAAA,GAAoB,GAAU,IAAM,GACjEC,SACAC,WAAcA,CAAAA,GACdC,OACAC,QACAC,OACAC,KAAAA,EAAOxI,GAAO7F,EAAEsO,MAChBC,UAAaC,CAAAA,GACbC,MACAtO,eAEA,MAAQuO,GAAU,EAAPF,EAGX,IAAKhJ,GAAWzI,QAGd,OADAiR,IAEDW,EAED,GAAIjL,GAAaoK,GAAcW,EAI7B,OAHAT,IAEAxQ,WAAW,IAAMkG,IAAa,KAKhC,GAAI+K,EACF,OAAOJ,EAGT,QAAaA,EAAOK,EACGE,EAAGF,EAAKvO,EACf0O,EAAGjT,KAAKwP,IACtBW,GAAWhP,QACXnB,KAAK0O,IAAI0B,GAAWjP,QAAS+R,EAA2B,EAApBF,IAGtC,IACGV,GACDxK,GACAuK,EAAY,GACZa,EAAOF,EAAoB7C,GAAWhP,QAAU,EAIhD,OAFAiR,IACAtK,IACO2K,EAGT,IAAIU,EAAOb,EAERxK,GAAaqI,GAAWhP,UAAYiP,GAAWjP,QAc5CiS,EACAF,EACApL,EAAY,EAAIqI,GAAWhP,QAC3BiP,GAAWjP,QACX,KAjBA+R,EAAO/C,GAAWhP,QAChBiS,EACAF,EACA/C,GAAWhP,QACU,EAArBiP,GAAWjP,QACX,KAEAiS,EACAF,EACA/C,GAAWhP,QAAU,EACrBiP,GAAWjP,QACX,KAQJ8R,EAoBJ,OAlBInK,IAAuBqJ,GACrBgB,GAAQ/C,GAAWjP,UACrBgS,EAAO/C,GAAWjP,SAGhBsR,IAASrC,GAAWjP,SAAWoJ,GAAUpJ,QAAQ0Q,UAAY,IAC/DsB,EAAO/C,GAAWjP,SAGpBuJ,GAAoBvJ,QAAUgS,EAAO/C,GAAWjP,SAEhDuJ,GAAoBvJ,SAAU,EAG5BoR,GACFxB,GAAK,QAGHyB,GACFzB,GAAK,OAAQ,CACXzM,QAAS,CACPF,EAAG+O,EACH5O,SAAUA,EAAW,IAAOA,EAAW,EACvCE,OAAQ,cAKbsO,IAKD7I,GAAI,CACF9F,EAAG+O,EACHnK,MAAO,EACPjB,UAAWmI,GAAa/O,QACxBkJ,QAAS+F,GAAWjP,QACpBiJ,QAAS+F,GAAWhP,QACpB+P,WAAW,EACXlK,OAAQ,CAAEzC,kBAOmB,CAC/B8O,YAAY,IAGd,GAAInT,OAAOC,MAAMiQ,GAAWjP,SAC1B,MAAM,IAAaf,UAAC,uBAEtB,GAAIF,OAAOC,MAAMgQ,GAAWhP,SAC1B,MAAM,cAAc,uBAGtB,MAAoBmS,GO7lBNC,UAAwBtJ,OACtCA,IAOA,MAA6BuJ,EAAGC,EAC9B,CAACxJ,EAAO7F,EAAG6F,EAAOlC,WAClB,CAAC3D,EAAG2D,OACQ/H,KAAKC,MAAMR,EAAMsI,EAAY3D,EAAG,EAAG,UAa3CsP,EAAoBD,EAExB,CAACxJ,EAAO7F,EAAG6F,EAAOG,QAASH,EAAOI,SAClC,CAACjG,EAAGgG,EAASC,OAAe5K,EAAM2E,EAAGgG,EAASC,QAG1CsJ,EAAeF,EAEnB,CAACxJ,EAAO7F,EAAG6F,EAAOG,QAASH,EAAOI,SAClC,CAACjG,EAAGgG,EAASC,IACPjG,EAAIgG,EACIA,EAAUhG,EAAV,KAERA,EAAIiG,EACIA,EAAUjG,EAAV,KAEL,SAIeqP,EAExB,CAACxJ,EAAO7F,EAAG6F,EAAOI,SAClB,CAACjG,EAAGiG,IACEjG,GAAKiG,OACKuJ,KAAKxP,EAAIiG,GAEhB,GA4BX,MAAO,CAEL,yBA1BgCoJ,EAEhC,CAACxJ,EAAO7F,EAAG6F,EAAOG,SAClB,CAAChG,EAAGgG,KACF,IAAKA,EACH,SAEF,QAAapK,KAAKwP,IAAIpF,EAAU,EAAI,GAAI,GAOxC,OAAY3K,GADC2E,EAAIyP,IADH,GAJD7T,KAAK0O,IAAItE,EAAU,EAAI,GAAIA,GAIFyJ,GAHzB,GAKK,EAAG,EAAC,GAcxB,0BAV0BJ,EAE1B,CAACxJ,EAAO7F,EAAG6F,EAAOG,SAClB,CAAChG,EAAGgG,IAAaA,EAAU3K,EAAM2E,EAAIgG,EAAS,EAAG,GAAK,GAStD,yBAAmC0J,EAEnC,6BAAuCH,EAEvC,yBAAmCH,EAEnC,mBAA6BE,EAEjC,CPggByBH,CAAwB,CAAEtJ,yBAEjD,OACE9C,EAAC4M,cAAAC,EAASC,IAAGrD,EAAA,CAAA,EACP7H,GACJ,CAAA,kBAAA,EACA,kBAAiBmL,EAAaC,KAAKhT,GAAQ4J,SAC3C,wBAAuBxC,EACvB,6BAA4BT,EAC5B,yBAAwBJ,EACxB,yBAAwBD,EACxBD,UAAWA,EACXlH,IAAKgK,GACL7B,MAAKmI,EAAA,GAEA0C,GAEA7K,EAIH2L,CAAAA,QAASnK,GAAOjB,UAGjBzB,EACAgB,gBACCpB,yBAGEkC,IAAI,WACJ,sBAAA,GACI2I,GAAK,CAAEE,YAAY,mBAG3B/K,EACE4M,cAAA,MAAA,CAAA1K,IAAI,UACJ,aAAW,OACXgL,KAAK,SACL,qBAAA,EACAC,UAAW,EACXhU,IAAKiN,GACLgH,UAAYtP,IACQ,WAAdA,EAAMoE,MAERpE,EAAMuP,kBACF1M,GAAWA,IAChB,IAGS,IAAXJ,gBACCP,EAAK4M,cAAA,MAAAnD,EAAA,CAAAvH,IAAI,SAAS,oBAAgB,EAAC/I,IAAKsN,IAAeoE,MACpDtK,gBAGLP,yBAAKkC,IAAI,SAAS,oBAAA,EAAiB/I,IAAKiK,IAAgBzB,GAAsBkJ,GAAK,CAAEG,mBAAmB,IAAU,CAAA,gBAChHhL,EAAK4M,cAAA,MAAA,CAAA,qBAAA,EAAkBzT,IAAKkK,IACzBlD,IAGJG,gBACCN,EAAA4M,cAAA,MAAAnD,EAAA,CAAKvH,IAAI,SAAS/I,IAAKmK,GAAW,oBAAA,GAAqBuH,MACpDvK,IAMb,KAGqB,CACnB,SACA,UACA,OACA,UACA,WACA,WACA,YAIF,SAAqBU,GAACC,WAAEA,EAAUyH,SAAEA,IAClC,OAAOA,MAAAA,EAAAA,EAAY7P,KAAK0O,OAAOtG,EACjC,CACA,SAASE,GAAYwF,UAAEA,IACrB,OACFA,CAAA,CQ7rBA,MAAAnH,EAAA,CAAA,gBAAA,cAAA,yBAYwBO,EAAGE,EAA8B,SAEvD9G,EAAAA,GAAG,IADHoI,cAAEA,EAAaE,YAAEA,EAAW6L,sBAAEA,GAA0B1L,EAAAA,EAIxD4H,EAAAtJ,EAAAV,GAAA,MAAO+N,EAASC,GAAc/T,GAAS,GACjCgU,EAAW/K,IAEXjC,EAAciC,EAAO,MAMrBgL,EAAkBhL,EACtB4K,GAAyB1L,EAAMvF,KAAO,OAAS,UAIjDnE,EAAgB,KACd,GAAI0J,EAAMvF,KAKR,OAJA+K,qBAAqBqG,EAASzT,SAC9BwT,GAAW,GAGJ,KACLE,EAAgB1T,QAAU,QAAA,CAE7B,EACA,CAAC4H,EAAMvF,OAEV,MAAMsR,EAAoB/T,EACxB2E,eAAiCT,SAEZ,MAAbyD,OAAa,EAAbA,EAAgBzD,IAEH,SAAfA,EAAMnB,MAERyK,qBAAqBqG,EAASzT,QAElC,EACA,CAACuH,IAGGqM,EAAkBhU,EACtB2E,eAA+BT,SAEvB2D,MAAAA,OAAAA,EAAAA,EAAc3D,IAED,UAAfA,EAAMnB,OAER8Q,EAASzT,QAAUiN,sBAAsB,IAAMuG,GAAW,IAE9D,EACA,CAAC/L,IAIH,OAAK8L,eAKHvN,EAAC4M,cAAAiB,EAAO,CAAA,oBAAA,gBACN7N,EAAA4M,cAACkB,EAAYrE,EAAA,CAAA,EACP7H,EAAK,CACTnB,YAAaA,EACbtH,IAAKA,EACLkC,aAAcqS,EAAgB1T,QAC9BuH,cAAeoM,EACflM,YAAamM,MAVlB,IAcH"}