{"version":3,"file":"PanelChrome.mjs","sources":["../../../../src/components/PanelChrome/PanelChrome.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { CSSProperties, ReactElement, ReactNode, useId, useState } from 'react';\nimport * as React from 'react';\nimport { useMeasure, useToggle } from 'react-use';\n\nimport { GrafanaTheme2, LoadingState } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { usePointerDistance } from '../../utils';\nimport { DelayRender } from '../../utils/DelayRender';\nimport { useElementSelection } from '../ElementSelectionContext/ElementSelectionContext';\nimport { Icon } from '../Icon/Icon';\nimport { LoadingBar } from '../LoadingBar/LoadingBar';\nimport { Text } from '../Text/Text';\nimport { Tooltip } from '../Tooltip';\n\nimport { HoverWidget } from './HoverWidget';\nimport { PanelDescription } from './PanelDescription';\nimport { PanelMenu } from './PanelMenu';\nimport { PanelStatus } from './PanelStatus';\nimport { TitleItem } from './TitleItem';\n\n/**\n * @internal\n */\nexport type PanelChromeProps = (AutoSize | FixedDimensions) & (Collapsible | HoverHeader);\n\ninterface BaseProps {\n  padding?: PanelPadding;\n  title?: string | React.ReactElement;\n  description?: string | (() => string);\n  titleItems?: ReactNode;\n  menu?: ReactElement | (() => ReactElement);\n  dragClass?: string;\n  dragClassCancel?: string;\n  onDragStart?: (e: React.PointerEvent) => void;\n  selectionId?: string;\n  /**\n   * Use only to indicate loading or streaming data in the panel.\n   * Any other values of loadingState are ignored.\n   */\n  loadingState?: LoadingState;\n  /**\n   * Used to display status message (used for panel errors currently)\n   */\n  statusMessage?: string;\n  /**\n   * Handle opening error details view (like inspect / error tab)\n   */\n  statusMessageOnClick?: (e: React.SyntheticEvent) => void;\n  /**\n   * @deprecated use `actions' instead\n   **/\n  leftItems?: ReactNode[];\n  actions?: ReactNode;\n  displayMode?: 'default' | 'transparent';\n  onCancelQuery?: () => void;\n  /**\n   * callback when opening the panel menu\n   */\n  onOpenMenu?: () => void;\n  /**\n   * Used for setting panel attention\n   */\n  onFocus?: () => void;\n  /**\n   * Debounce the event handler, if possible\n   */\n  onMouseMove?: () => void;\n  onMouseEnter?: () => void;\n  /**\n   * If true, the VizPanelMenu will always be visible in the panel header. Defaults to false.\n   */\n  showMenuAlways?: boolean;\n}\n\ninterface FixedDimensions extends BaseProps {\n  width: number;\n  height: number;\n  children: (innerWidth: number, innerHeight: number) => ReactNode;\n}\n\ninterface AutoSize extends BaseProps {\n  width?: never;\n  height?: never;\n  children: ReactNode;\n}\n\ninterface Collapsible {\n  collapsible: boolean;\n  collapsed?: boolean;\n  /**\n   * callback when collapsing or expanding the panel\n   */\n  onToggleCollapse?: (collapsed: boolean) => void;\n  hoverHeader?: never;\n  hoverHeaderOffset?: never;\n}\n\ninterface HoverHeader {\n  collapsible?: never;\n  collapsed?: never;\n  showMenuAlways?: never;\n  onToggleCollapse?: never;\n  hoverHeader?: boolean;\n  hoverHeaderOffset?: number;\n}\n\n/**\n * @internal\n */\nexport type PanelPadding = 'none' | 'md';\n\n/**\n * @internal\n */\nexport function PanelChrome({\n  width,\n  height,\n  children,\n  padding = 'md',\n  title = '',\n  description = '',\n  displayMode = 'default',\n  titleItems,\n  menu,\n  dragClass,\n  dragClassCancel,\n  hoverHeader = false,\n  hoverHeaderOffset,\n  loadingState,\n  statusMessage,\n  statusMessageOnClick,\n  leftItems,\n  actions,\n  selectionId,\n  onCancelQuery,\n  onOpenMenu,\n  collapsible = false,\n  collapsed,\n  onToggleCollapse,\n  onFocus,\n  onMouseMove,\n  onMouseEnter,\n  onDragStart,\n  showMenuAlways = false,\n}: PanelChromeProps) {\n  const theme = useTheme2();\n  const styles = useStyles2(getStyles);\n  const panelContentId = useId();\n  const panelTitleId = useId().replace(/:/g, '_');\n  const { isSelected, onSelect, isSelectable } = useElementSelection(selectionId);\n  const pointerDistance = usePointerDistance();\n\n  const hasHeader = !hoverHeader;\n\n  const [isOpen, toggleOpen] = useToggle(true);\n\n  // Highlight the full panel when hovering over header\n  const [selectableHighlight, setSelectableHighlight] = useState(false);\n  const onHeaderEnter = React.useCallback(() => setSelectableHighlight(true), []);\n  const onHeaderLeave = React.useCallback(() => setSelectableHighlight(false), []);\n\n  // if collapsed is not defined, then component is uncontrolled and state is managed internally\n  if (collapsed === undefined) {\n    collapsed = !isOpen;\n  }\n\n  // hover menu is only shown on hover when not on touch devices\n  const showOnHoverClass = showMenuAlways ? 'always-show' : 'show-on-hover';\n  const isPanelTransparent = displayMode === 'transparent';\n\n  const headerHeight = getHeaderHeight(theme, hasHeader);\n  const { contentStyle, innerWidth, innerHeight } = getContentStyle(\n    padding,\n    theme,\n    headerHeight,\n    collapsed,\n    height,\n    width\n  );\n\n  const headerStyles: CSSProperties = {\n    height: headerHeight,\n    cursor: dragClass ? 'move' : 'auto',\n  };\n\n  const containerStyles: CSSProperties = { width, height: collapsed ? undefined : height };\n  const [ref, { width: loadingBarWidth }] = useMeasure<HTMLDivElement>();\n\n  /** Old property name now maps to actions */\n  if (leftItems) {\n    actions = leftItems;\n  }\n\n  const testid = typeof title === 'string' ? selectors.components.Panels.Panel.title(title) : 'Panel';\n\n  // Handle drag & selection events\n  // Mainly the tricky bit of differentiating between dragging and selecting\n  const onPointerUp = React.useCallback(\n    (evt: React.PointerEvent) => {\n      if (\n        pointerDistance.check(evt) ||\n        (dragClassCancel && evt.target instanceof Element && evt.target.closest(`.${dragClassCancel}`))\n      ) {\n        return;\n      }\n\n      // setTimeout is needed here because onSelect stops the event propagation\n      // By doing so, the event won't get to the document and drag will never be stopped\n      setTimeout(() => onSelect?.(evt));\n    },\n    [dragClassCancel, onSelect, pointerDistance]\n  );\n\n  const onPointerDown = React.useCallback(\n    (evt: React.PointerEvent) => {\n      evt.stopPropagation();\n\n      pointerDistance.set(evt);\n\n      onDragStart?.(evt);\n    },\n    [pointerDistance, onDragStart]\n  );\n\n  const onContentPointerDown = React.useCallback(\n    (evt: React.PointerEvent) => {\n      // Ignore clicks inside buttons, links, canvas and svg elments\n      // This does prevent a clicks inside a graphs from selecting panel as there is normal div above the canvas element that intercepts the click\n      if (evt.target instanceof Element && evt.target.closest('button,a,canvas,svg')) {\n        return;\n      }\n\n      onSelect?.(evt);\n    },\n    [onSelect]\n  );\n\n  const headerContent = (\n    <>\n      {/* Non collapsible title */}\n      {!collapsible && title && (\n        <div className={styles.title}>\n          <Text\n            element=\"h2\"\n            variant=\"h6\"\n            truncate\n            title={typeof title === 'string' ? title : undefined}\n            id={panelTitleId}\n          >\n            {title}\n          </Text>\n        </div>\n      )}\n\n      {/* Collapsible title */}\n      {collapsible && (\n        <div className={styles.title}>\n          <Text element=\"h2\" variant=\"h6\">\n            <button\n              type=\"button\"\n              className={styles.clearButtonStyles}\n              onClick={() => {\n                toggleOpen();\n                if (onToggleCollapse) {\n                  onToggleCollapse(!collapsed);\n                }\n              }}\n              aria-expanded={!collapsed}\n              aria-controls={!collapsed ? panelContentId : undefined}\n            >\n              <Icon\n                name={!collapsed ? 'angle-down' : 'angle-right'}\n                aria-hidden={!!title}\n                aria-label={!title ? 'toggle collapse panel' : undefined}\n              />\n              <Text variant=\"h6\" truncate id={panelTitleId}>\n                {title}\n              </Text>\n            </button>\n          </Text>\n        </div>\n      )}\n\n      <div className={cx(styles.titleItems, dragClassCancel)} data-testid=\"title-items-container\">\n        <PanelDescription description={description} className={dragClassCancel} />\n        {titleItems}\n      </div>\n      {loadingState === LoadingState.Streaming && (\n        <Tooltip content={onCancelQuery ? 'Stop streaming' : 'Streaming'}>\n          <TitleItem className={dragClassCancel} data-testid=\"panel-streaming\" onClick={onCancelQuery}>\n            <Icon name=\"circle-mono\" size=\"md\" className={styles.streaming} />\n          </TitleItem>\n        </Tooltip>\n      )}\n      {loadingState === LoadingState.Loading && onCancelQuery && (\n        <DelayRender delay={2000}>\n          <Tooltip content=\"Cancel query\">\n            <TitleItem\n              className={cx(dragClassCancel, styles.pointer)}\n              data-testid=\"panel-cancel-query\"\n              onClick={onCancelQuery}\n            >\n              <Icon name=\"sync-slash\" size=\"md\" />\n            </TitleItem>\n          </Tooltip>\n        </DelayRender>\n      )}\n      <div className={styles.rightAligned}>\n        {actions && <div className={styles.rightActions}>{itemsRenderer(actions, (item) => item)}</div>}\n      </div>\n    </>\n  );\n\n  return (\n    // tabIndex={0} is needed for keyboard accessibility in the plot area\n    <section\n      className={cx(\n        styles.container,\n        isPanelTransparent && styles.transparentContainer,\n        isSelected && 'dashboard-selected-element',\n        !isSelected && isSelectable && selectableHighlight && 'dashboard-selectable-element'\n      )}\n      style={containerStyles}\n      aria-labelledby={!!title ? panelTitleId : undefined}\n      data-testid={testid}\n      tabIndex={0} // eslint-disable-line jsx-a11y/no-noninteractive-tabindex\n      onFocus={onFocus}\n      onMouseMove={onMouseMove}\n      onMouseEnter={onMouseEnter}\n      ref={ref}\n    >\n      <div className={styles.loadingBarContainer}>\n        {loadingState === LoadingState.Loading ? (\n          <LoadingBar width={loadingBarWidth} ariaLabel=\"Panel loading bar\" />\n        ) : null}\n      </div>\n\n      {hoverHeader && (\n        <>\n          <HoverWidget\n            menu={menu}\n            title={typeof title === 'string' ? title : undefined}\n            offset={hoverHeaderOffset}\n            dragClass={dragClass}\n            onOpenMenu={onOpenMenu}\n          >\n            {headerContent}\n          </HoverWidget>\n\n          {statusMessage && (\n            <div className={styles.errorContainerFloating}>\n              <PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel=\"Panel status\" />\n            </div>\n          )}\n        </>\n      )}\n\n      {hasHeader && (\n        <div\n          className={cx(styles.headerContainer, dragClass)}\n          style={headerStyles}\n          data-testid=\"header-container\"\n          onPointerDown={onPointerDown}\n          onMouseEnter={isSelectable ? onHeaderEnter : undefined}\n          onMouseLeave={isSelectable ? onHeaderLeave : undefined}\n          onPointerUp={onPointerUp}\n        >\n          {statusMessage && (\n            <div className={dragClassCancel}>\n              <PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel=\"Panel status\" />\n            </div>\n          )}\n\n          {headerContent}\n\n          {menu && (\n            <PanelMenu\n              menu={menu}\n              title={typeof title === 'string' ? title : undefined}\n              placement=\"bottom-end\"\n              menuButtonClass={cx(styles.menuItem, dragClassCancel, showOnHoverClass)}\n              onOpenMenu={onOpenMenu}\n            />\n          )}\n        </div>\n      )}\n\n      {!collapsed && (\n        <div\n          id={panelContentId}\n          data-testid={selectors.components.Panels.Panel.content}\n          className={cx(styles.content, height === undefined && styles.containNone)}\n          style={contentStyle}\n          onPointerDown={onContentPointerDown}\n        >\n          {typeof children === 'function' ? children(innerWidth, innerHeight) : children}\n        </div>\n      )}\n    </section>\n  );\n}\n\nconst itemsRenderer = (items: ReactNode[] | ReactNode, renderer: (items: ReactNode[]) => ReactNode): ReactNode => {\n  const toRender = React.Children.toArray(items).filter(Boolean);\n  return toRender.length > 0 ? renderer(toRender) : null;\n};\n\nconst getHeaderHeight = (theme: GrafanaTheme2, hasHeader: boolean) => {\n  if (hasHeader) {\n    return theme.spacing.gridSize * theme.components.panel.headerHeight;\n  }\n\n  return 0;\n};\n\nconst getContentStyle = (\n  padding: string,\n  theme: GrafanaTheme2,\n  headerHeight: number,\n  collapsed: boolean,\n  height?: number,\n  width?: number\n) => {\n  const chromePadding = (padding === 'md' ? theme.components.panel.padding : 0) * theme.spacing.gridSize;\n\n  const panelPadding = chromePadding * 2;\n  const panelBorder = 1 * 2;\n\n  let innerWidth = 0;\n  if (width) {\n    innerWidth = width - panelPadding - panelBorder;\n  }\n\n  let innerHeight = 0;\n  if (height) {\n    innerHeight = height - headerHeight - panelPadding - panelBorder;\n  }\n\n  if (collapsed) {\n    innerHeight = headerHeight;\n  }\n\n  const contentStyle: CSSProperties = {\n    padding: chromePadding,\n  };\n\n  return { contentStyle, innerWidth, innerHeight };\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  const { background, borderColor, padding } = theme.components.panel;\n\n  return {\n    container: css({\n      label: 'panel-container',\n      backgroundColor: background,\n      border: `1px solid ${borderColor}`,\n      position: 'relative',\n      borderRadius: theme.shape.radius.default,\n      height: '100%',\n      display: 'flex',\n      flexDirection: 'column',\n\n      '.always-show': {\n        background: 'none',\n        '&:focus-visible, &:hover': {\n          background: theme.colors.secondary.shade,\n        },\n      },\n\n      '.show-on-hover': {\n        opacity: '0',\n        visibility: 'hidden',\n      },\n\n      '&:focus-visible, &:hover': {\n        // only show menu icon on hover or focused panel\n        '.show-on-hover': {\n          opacity: '1',\n          visibility: 'visible',\n        },\n      },\n\n      '&:focus-visible': getFocusStyles(theme),\n\n      // The not:(:focus) clause is so that this rule is only applied when decendants are focused (important otherwise the hover header is visible when panel is clicked).\n      '&:focus-within:not(:focus)': {\n        '.show-on-hover': {\n          visibility: 'visible',\n          opacity: '1',\n        },\n      },\n    }),\n    transparentContainer: css({\n      label: 'panel-transparent-container',\n      backgroundColor: 'transparent',\n      border: '1px solid transparent',\n      boxSizing: 'border-box',\n      '&:hover': {\n        border: `1px solid ${borderColor}`,\n      },\n    }),\n    loadingBarContainer: css({\n      label: 'panel-loading-bar-container',\n      position: 'absolute',\n      top: 0,\n      width: '100%',\n      // this is to force the loading bar container to create a new stacking context\n      // otherwise, in webkit browsers on windows/linux, the aliasing of panel text changes when the loading bar is shown\n      // see https://github.com/grafana/grafana/issues/88104\n      zIndex: 1,\n    }),\n    containNone: css({\n      contain: 'none',\n    }),\n    content: css({\n      label: 'panel-content',\n      flexGrow: 1,\n      contain: 'size layout',\n    }),\n    headerContainer: css({\n      label: 'panel-header',\n      display: 'flex',\n      alignItems: 'center',\n    }),\n    pointer: css({\n      cursor: 'pointer',\n    }),\n    streaming: css({\n      label: 'panel-streaming',\n      marginRight: 0,\n      color: theme.colors.success.text,\n\n      '&:hover': {\n        color: theme.colors.success.text,\n      },\n    }),\n    title: css({\n      label: 'panel-title',\n      display: 'flex',\n      padding: theme.spacing(0, padding),\n      minWidth: 0,\n      '& > h2': {\n        minWidth: 0,\n      },\n    }),\n    items: css({\n      display: 'flex',\n    }),\n    item: css({\n      display: 'flex',\n      justifyContent: 'center',\n      alignItems: 'center',\n    }),\n    hiddenMenu: css({\n      visibility: 'hidden',\n    }),\n    menuItem: css({\n      label: 'panel-menu',\n      border: 'none',\n      background: theme.colors.secondary.main,\n      '&:hover': {\n        background: theme.colors.secondary.shade,\n      },\n    }),\n    errorContainerFloating: css({\n      label: 'error-container',\n      position: 'absolute',\n      left: 0,\n      top: 0,\n      zIndex: 1,\n    }),\n    rightActions: css({\n      display: 'flex',\n      padding: theme.spacing(0, padding),\n      gap: theme.spacing(1),\n    }),\n    rightAligned: css({\n      label: 'right-aligned-container',\n      marginLeft: 'auto',\n      display: 'flex',\n      alignItems: 'center',\n    }),\n    titleItems: css({\n      display: 'flex',\n      height: '100%',\n    }),\n    clearButtonStyles: css({\n      alignItems: 'center',\n      display: 'flex',\n      gap: theme.spacing(0.5),\n      background: 'transparent',\n      border: 'none',\n      padding: 0,\n      maxWidth: '100%',\n    }),\n  };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsHO,SAAS,WAAY,CAAA;AAAA,EAC1B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAU,GAAA,IAAA;AAAA,EACV,KAAQ,GAAA,EAAA;AAAA,EACR,WAAc,GAAA,EAAA;AAAA,EACd,WAAc,GAAA,SAAA;AAAA,EACd,UAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAc,GAAA,KAAA;AAAA,EACd,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAc,GAAA,KAAA;AAAA,EACd,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAiB,GAAA;AACnB,CAAqB,EAAA;AACnB,EAAA,MAAM,QAAQ,SAAU,EAAA;AACxB,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,MAAM,iBAAiB,KAAM,EAAA;AAC7B,EAAA,MAAM,YAAe,GAAA,KAAA,EAAQ,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC9C,EAAA,MAAM,EAAE,UAAY,EAAA,QAAA,EAAU,YAAa,EAAA,GAAI,oBAAoB,WAAW,CAAA;AAC9E,EAAA,MAAM,kBAAkB,kBAAmB,EAAA;AAE3C,EAAA,MAAM,YAAY,CAAC,WAAA;AAEnB,EAAA,MAAM,CAAC,MAAA,EAAQ,UAAU,CAAA,GAAI,UAAU,IAAI,CAAA;AAG3C,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,KAAK,CAAA;AACpE,EAAM,MAAA,aAAA,GAAgB,MAAM,WAAY,CAAA,MAAM,uBAAuB,IAAI,CAAA,EAAG,EAAE,CAAA;AAC9E,EAAM,MAAA,aAAA,GAAgB,MAAM,WAAY,CAAA,MAAM,uBAAuB,KAAK,CAAA,EAAG,EAAE,CAAA;AAG/E,EAAA,IAAI,cAAc,KAAW,CAAA,EAAA;AAC3B,IAAA,SAAA,GAAY,CAAC,MAAA;AAAA;AAIf,EAAM,MAAA,gBAAA,GAAmB,iBAAiB,aAAgB,GAAA,eAAA;AAC1D,EAAA,MAAM,qBAAqB,WAAgB,KAAA,aAAA;AAE3C,EAAM,MAAA,YAAA,GAAe,eAAgB,CAAA,KAAA,EAAO,SAAS,CAAA;AACrD,EAAA,MAAM,EAAE,YAAA,EAAc,UAAY,EAAA,WAAA,EAAgB,GAAA,eAAA;AAAA,IAChD,OAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,YAA8B,GAAA;AAAA,IAClC,MAAQ,EAAA,YAAA;AAAA,IACR,MAAA,EAAQ,YAAY,MAAS,GAAA;AAAA,GAC/B;AAEA,EAAA,MAAM,kBAAiC,EAAE,KAAA,EAAO,MAAQ,EAAA,SAAA,GAAY,SAAY,MAAO,EAAA;AACvF,EAAA,MAAM,CAAC,GAAK,EAAA,EAAE,OAAO,eAAgB,EAAC,IAAI,UAA2B,EAAA;AAGrE,EAAA,IAAI,SAAW,EAAA;AACb,IAAU,OAAA,GAAA,SAAA;AAAA;AAGZ,EAAM,MAAA,MAAA,GAAS,OAAO,KAAA,KAAU,QAAW,GAAA,SAAA,CAAU,WAAW,MAAO,CAAA,KAAA,CAAM,KAAM,CAAA,KAAK,CAAI,GAAA,OAAA;AAI5F,EAAA,MAAM,cAAc,KAAM,CAAA,WAAA;AAAA,IACxB,CAAC,GAA4B,KAAA;AAC3B,MAAA,IACE,eAAgB,CAAA,KAAA,CAAM,GAAG,CAAA,IACxB,mBAAmB,GAAI,CAAA,MAAA,YAAkB,OAAW,IAAA,GAAA,CAAI,MAAO,CAAA,OAAA,CAAQ,CAAI,CAAA,EAAA,eAAe,EAAE,CAC7F,EAAA;AACA,QAAA;AAAA;AAKF,MAAW,UAAA,CAAA,MAAM,qCAAW,GAAI,CAAA,CAAA;AAAA,KAClC;AAAA,IACA,CAAC,eAAiB,EAAA,QAAA,EAAU,eAAe;AAAA,GAC7C;AAEA,EAAA,MAAM,gBAAgB,KAAM,CAAA,WAAA;AAAA,IAC1B,CAAC,GAA4B,KAAA;AAC3B,MAAA,GAAA,CAAI,eAAgB,EAAA;AAEpB,MAAA,eAAA,CAAgB,IAAI,GAAG,CAAA;AAEvB,MAAc,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAA,GAAA,CAAA;AAAA,KAChB;AAAA,IACA,CAAC,iBAAiB,WAAW;AAAA,GAC/B;AAEA,EAAA,MAAM,uBAAuB,KAAM,CAAA,WAAA;AAAA,IACjC,CAAC,GAA4B,KAAA;AAG3B,MAAA,IAAI,IAAI,MAAkB,YAAA,OAAA,IAAW,IAAI,MAAO,CAAA,OAAA,CAAQ,qBAAqB,CAAG,EAAA;AAC9E,QAAA;AAAA;AAGF,MAAW,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA;AAAA,KACb;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gCAGD,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,CAAC,eAAe,KACf,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAO,KACrB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,IAAA;AAAA,QACR,OAAQ,EAAA,IAAA;AAAA,QACR,QAAQ,EAAA,IAAA;AAAA,QACR,KAAO,EAAA,OAAO,KAAU,KAAA,QAAA,GAAW,KAAQ,GAAA,KAAA,CAAA;AAAA,QAC3C,EAAI,EAAA,YAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KAEL,EAAA,CAAA;AAAA,IAID,WAAA,oBACE,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,KACrB,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,OAAA,EAAQ,IACzB,EAAA,QAAA,kBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,QAAA;AAAA,QACL,WAAW,MAAO,CAAA,iBAAA;AAAA,QAClB,SAAS,MAAM;AACb,UAAW,UAAA,EAAA;AACX,UAAA,IAAI,gBAAkB,EAAA;AACpB,YAAA,gBAAA,CAAiB,CAAC,SAAS,CAAA;AAAA;AAC7B,SACF;AAAA,QACA,iBAAe,CAAC,SAAA;AAAA,QAChB,eAAA,EAAe,CAAC,SAAA,GAAY,cAAiB,GAAA,KAAA,CAAA;AAAA,QAE7C,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,CAAC,SAAA,GAAY,YAAe,GAAA,aAAA;AAAA,cAClC,aAAA,EAAa,CAAC,CAAC,KAAA;AAAA,cACf,YAAA,EAAY,CAAC,KAAA,GAAQ,uBAA0B,GAAA,KAAA;AAAA;AAAA,WACjD;AAAA,0BACA,GAAA,CAAC,QAAK,OAAQ,EAAA,IAAA,EAAK,UAAQ,IAAC,EAAA,EAAA,EAAI,cAC7B,QACH,EAAA,KAAA,EAAA;AAAA;AAAA;AAAA,OAEJ,CACF,EAAA,CAAA;AAAA,oBAGF,IAAA,CAAC,SAAI,SAAW,EAAA,EAAA,CAAG,OAAO,UAAY,EAAA,eAAe,CAAG,EAAA,aAAA,EAAY,uBAClE,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,gBAAA,EAAA,EAAiB,WAA0B,EAAA,SAAA,EAAW,eAAiB,EAAA,CAAA;AAAA,MACvE;AAAA,KACH,EAAA,CAAA;AAAA,IACC,YAAA,KAAiB,YAAa,CAAA,SAAA,oBAC5B,GAAA,CAAA,OAAA,EAAA,EAAQ,OAAS,EAAA,aAAA,GAAgB,gBAAmB,GAAA,WAAA,EACnD,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA,EAAU,SAAW,EAAA,eAAA,EAAiB,aAAY,EAAA,iBAAA,EAAkB,OAAS,EAAA,aAAA,EAC5E,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,IAAK,EAAA,aAAA,EAAc,IAAK,EAAA,IAAA,EAAK,SAAW,EAAA,MAAA,CAAO,SAAW,EAAA,CAAA,EAClE,CACF,EAAA,CAAA;AAAA,IAED,YAAA,KAAiB,YAAa,CAAA,OAAA,IAAW,aACxC,oBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,KAAA,EAAO,GAClB,EAAA,QAAA,kBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,OAAA,EAAQ,cACf,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,EAAA,CAAG,eAAiB,EAAA,MAAA,CAAO,OAAO,CAAA;AAAA,QAC7C,aAAY,EAAA,oBAAA;AAAA,QACZ,OAAS,EAAA,aAAA;AAAA,QAET,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,IAAK,EAAA,YAAA,EAAa,MAAK,IAAK,EAAA;AAAA;AAAA,OAEtC,CACF,EAAA,CAAA;AAAA,wBAED,KAAI,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,YAAA,EACpB,qCAAY,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,cAAe,QAAc,EAAA,aAAA,CAAA,OAAA,EAAS,CAAC,IAAS,KAAA,IAAI,GAAE,CAC3F,EAAA;AAAA,GACF,EAAA,CAAA;AAGF,EAAA;AAAA;AAAA,oBAEE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,EAAA;AAAA,UACT,MAAO,CAAA,SAAA;AAAA,UACP,sBAAsB,MAAO,CAAA,oBAAA;AAAA,UAC7B,UAAc,IAAA,4BAAA;AAAA,UACd,CAAC,UAAc,IAAA,YAAA,IAAgB,mBAAuB,IAAA;AAAA,SACxD;AAAA,QACA,KAAO,EAAA,eAAA;AAAA,QACP,iBAAiB,EAAA,CAAC,CAAC,KAAA,GAAQ,YAAe,GAAA,KAAA,CAAA;AAAA,QAC1C,aAAa,EAAA,MAAA;AAAA,QACb,QAAU,EAAA,CAAA;AAAA,QACV,OAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,GAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,mBAAA,EACpB,2BAAiB,YAAa,CAAA,OAAA,mBAC5B,GAAA,CAAA,UAAA,EAAA,EAAW,KAAO,EAAA,eAAA,EAAiB,SAAU,EAAA,mBAAA,EAAoB,IAChE,IACN,EAAA,CAAA;AAAA,UAEC,+BAEG,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,IAAA;AAAA,gBACA,KAAO,EAAA,OAAO,KAAU,KAAA,QAAA,GAAW,KAAQ,GAAA,KAAA,CAAA;AAAA,gBAC3C,MAAQ,EAAA,iBAAA;AAAA,gBACR,SAAA;AAAA,gBACA,UAAA;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YAEC,aACC,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAO,sBACrB,EAAA,QAAA,kBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,OAAA,EAAS,aAAe,EAAA,OAAA,EAAS,oBAAsB,EAAA,SAAA,EAAU,gBAAe,CAC/F,EAAA;AAAA,WAEJ,EAAA,CAAA;AAAA,UAGD,SACC,oBAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAW,EAAA,EAAA,CAAG,MAAO,CAAA,eAAA,EAAiB,SAAS,CAAA;AAAA,cAC/C,KAAO,EAAA,YAAA;AAAA,cACP,aAAY,EAAA,kBAAA;AAAA,cACZ,aAAA;AAAA,cACA,YAAA,EAAc,eAAe,aAAgB,GAAA,KAAA,CAAA;AAAA,cAC7C,YAAA,EAAc,eAAe,aAAgB,GAAA,KAAA,CAAA;AAAA,cAC7C,WAAA;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,aAAA,oBACE,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,eAAA,EACd,QAAC,kBAAA,GAAA,CAAA,WAAA,EAAA,EAAY,OAAS,EAAA,aAAA,EAAe,OAAS,EAAA,oBAAA,EAAsB,SAAU,EAAA,cAAA,EAAe,CAC/F,EAAA,CAAA;AAAA,gBAGD,aAAA;AAAA,gBAEA,IACC,oBAAA,GAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,IAAA;AAAA,oBACA,KAAO,EAAA,OAAO,KAAU,KAAA,QAAA,GAAW,KAAQ,GAAA,KAAA,CAAA;AAAA,oBAC3C,SAAU,EAAA,YAAA;AAAA,oBACV,eAAiB,EAAA,EAAA,CAAG,MAAO,CAAA,QAAA,EAAU,iBAAiB,gBAAgB,CAAA;AAAA,oBACtE;AAAA;AAAA;AACF;AAAA;AAAA,WAEJ;AAAA,UAGD,CAAC,SACA,oBAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,EAAI,EAAA,cAAA;AAAA,cACJ,aAAa,EAAA,SAAA,CAAU,UAAW,CAAA,MAAA,CAAO,KAAM,CAAA,OAAA;AAAA,cAC/C,WAAW,EAAG,CAAA,MAAA,CAAO,SAAS,MAAW,KAAA,KAAA,CAAA,IAAa,OAAO,WAAW,CAAA;AAAA,cACxE,KAAO,EAAA,YAAA;AAAA,cACP,aAAe,EAAA,oBAAA;AAAA,cAEd,iBAAO,QAAa,KAAA,UAAA,GAAa,QAAS,CAAA,UAAA,EAAY,WAAW,CAAI,GAAA;AAAA;AAAA;AACxE;AAAA;AAAA;AAEJ;AAEJ;AAEA,MAAM,aAAA,GAAgB,CAAC,KAAA,EAAgC,QAA2D,KAAA;AAChH,EAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAS,QAAQ,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AAC7D,EAAA,OAAO,QAAS,CAAA,MAAA,GAAS,CAAI,GAAA,QAAA,CAAS,QAAQ,CAAI,GAAA,IAAA;AACpD,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,KAAA,EAAsB,SAAuB,KAAA;AACpE,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAW,GAAA,KAAA,CAAM,WAAW,KAAM,CAAA,YAAA;AAAA;AAGzD,EAAO,OAAA,CAAA;AACT,CAAA;AAEA,MAAM,kBAAkB,CACtB,OAAA,EACA,OACA,YACA,EAAA,SAAA,EACA,QACA,KACG,KAAA;AACH,EAAM,MAAA,aAAA,GAAA,CAAiB,YAAY,IAAO,GAAA,KAAA,CAAM,WAAW,KAAM,CAAA,OAAA,GAAU,CAAK,IAAA,KAAA,CAAM,OAAQ,CAAA,QAAA;AAE9F,EAAA,MAAM,eAAe,aAAgB,GAAA,CAAA;AACrC,EAAA,MAAM,cAAc,CAAI,GAAA,CAAA;AAExB,EAAA,IAAI,UAAa,GAAA,CAAA;AACjB,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,UAAA,GAAa,QAAQ,YAAe,GAAA,WAAA;AAAA;AAGtC,EAAA,IAAI,WAAc,GAAA,CAAA;AAClB,EAAA,IAAI,MAAQ,EAAA;AACV,IAAc,WAAA,GAAA,MAAA,GAAS,eAAe,YAAe,GAAA,WAAA;AAAA;AAGvD,EAAA,IAAI,SAAW,EAAA;AACb,IAAc,WAAA,GAAA,YAAA;AAAA;AAGhB,EAAA,MAAM,YAA8B,GAAA;AAAA,IAClC,OAAS,EAAA;AAAA,GACX;AAEA,EAAO,OAAA,EAAE,YAAc,EAAA,UAAA,EAAY,WAAY,EAAA;AACjD,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,KAAyB,KAAA;AAC1C,EAAA,MAAM,EAAE,UAAY,EAAA,WAAA,EAAa,OAAQ,EAAA,GAAI,MAAM,UAAW,CAAA,KAAA;AAE9D,EAAO,OAAA;AAAA,IACL,WAAW,GAAI,CAAA;AAAA,MACb,KAAO,EAAA,iBAAA;AAAA,MACP,eAAiB,EAAA,UAAA;AAAA,MACjB,MAAA,EAAQ,aAAa,WAAW,CAAA,CAAA;AAAA,MAChC,QAAU,EAAA,UAAA;AAAA,MACV,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,MACjC,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA,MAAA;AAAA,MACT,aAAe,EAAA,QAAA;AAAA,MAEf,cAAgB,EAAA;AAAA,QACd,UAAY,EAAA,MAAA;AAAA,QACZ,0BAA4B,EAAA;AAAA,UAC1B,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,SAAU,CAAA;AAAA;AACrC,OACF;AAAA,MAEA,gBAAkB,EAAA;AAAA,QAChB,OAAS,EAAA,GAAA;AAAA,QACT,UAAY,EAAA;AAAA,OACd;AAAA,MAEA,0BAA4B,EAAA;AAAA;AAAA,QAE1B,gBAAkB,EAAA;AAAA,UAChB,OAAS,EAAA,GAAA;AAAA,UACT,UAAY,EAAA;AAAA;AACd,OACF;AAAA,MAEA,iBAAA,EAAmB,eAAe,KAAK,CAAA;AAAA;AAAA,MAGvC,4BAA8B,EAAA;AAAA,QAC5B,gBAAkB,EAAA;AAAA,UAChB,UAAY,EAAA,SAAA;AAAA,UACZ,OAAS,EAAA;AAAA;AACX;AACF,KACD,CAAA;AAAA,IACD,sBAAsB,GAAI,CAAA;AAAA,MACxB,KAAO,EAAA,6BAAA;AAAA,MACP,eAAiB,EAAA,aAAA;AAAA,MACjB,MAAQ,EAAA,uBAAA;AAAA,MACR,SAAW,EAAA,YAAA;AAAA,MACX,SAAW,EAAA;AAAA,QACT,MAAA,EAAQ,aAAa,WAAW,CAAA;AAAA;AAClC,KACD,CAAA;AAAA,IACD,qBAAqB,GAAI,CAAA;AAAA,MACvB,KAAO,EAAA,6BAAA;AAAA,MACP,QAAU,EAAA,UAAA;AAAA,MACV,GAAK,EAAA,CAAA;AAAA,MACL,KAAO,EAAA,MAAA;AAAA;AAAA;AAAA;AAAA,MAIP,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA,IACD,aAAa,GAAI,CAAA;AAAA,MACf,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,SAAS,GAAI,CAAA;AAAA,MACX,KAAO,EAAA,eAAA;AAAA,MACP,QAAU,EAAA,CAAA;AAAA,MACV,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,iBAAiB,GAAI,CAAA;AAAA,MACnB,KAAO,EAAA,cAAA;AAAA,MACP,OAAS,EAAA,MAAA;AAAA,MACT,UAAY,EAAA;AAAA,KACb,CAAA;AAAA,IACD,SAAS,GAAI,CAAA;AAAA,MACX,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA,IACD,WAAW,GAAI,CAAA;AAAA,MACb,KAAO,EAAA,iBAAA;AAAA,MACP,WAAa,EAAA,CAAA;AAAA,MACb,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA,IAAA;AAAA,MAE5B,SAAW,EAAA;AAAA,QACT,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA;AAAA;AAC9B,KACD,CAAA;AAAA,IACD,OAAO,GAAI,CAAA;AAAA,MACT,KAAO,EAAA,aAAA;AAAA,MACP,OAAS,EAAA,MAAA;AAAA,MACT,OAAS,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,OAAO,CAAA;AAAA,MACjC,QAAU,EAAA,CAAA;AAAA,MACV,QAAU,EAAA;AAAA,QACR,QAAU,EAAA;AAAA;AACZ,KACD,CAAA;AAAA,IACD,OAAO,GAAI,CAAA;AAAA,MACT,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,MAAM,GAAI,CAAA;AAAA,MACR,OAAS,EAAA,MAAA;AAAA,MACT,cAAgB,EAAA,QAAA;AAAA,MAChB,UAAY,EAAA;AAAA,KACb,CAAA;AAAA,IACD,YAAY,GAAI,CAAA;AAAA,MACd,UAAY,EAAA;AAAA,KACb,CAAA;AAAA,IACD,UAAU,GAAI,CAAA;AAAA,MACZ,KAAO,EAAA,YAAA;AAAA,MACP,MAAQ,EAAA,MAAA;AAAA,MACR,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,SAAU,CAAA,IAAA;AAAA,MACnC,SAAW,EAAA;AAAA,QACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,SAAU,CAAA;AAAA;AACrC,KACD,CAAA;AAAA,IACD,wBAAwB,GAAI,CAAA;AAAA,MAC1B,KAAO,EAAA,iBAAA;AAAA,MACP,QAAU,EAAA,UAAA;AAAA,MACV,IAAM,EAAA,CAAA;AAAA,MACN,GAAK,EAAA,CAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA,IACD,cAAc,GAAI,CAAA;AAAA,MAChB,OAAS,EAAA,MAAA;AAAA,MACT,OAAS,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,OAAO,CAAA;AAAA,MACjC,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,KACrB,CAAA;AAAA,IACD,cAAc,GAAI,CAAA;AAAA,MAChB,KAAO,EAAA,yBAAA;AAAA,MACP,UAAY,EAAA,MAAA;AAAA,MACZ,OAAS,EAAA,MAAA;AAAA,MACT,UAAY,EAAA;AAAA,KACb,CAAA;AAAA,IACD,YAAY,GAAI,CAAA;AAAA,MACd,OAAS,EAAA,MAAA;AAAA,MACT,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA,IACD,mBAAmB,GAAI,CAAA;AAAA,MACrB,UAAY,EAAA,QAAA;AAAA,MACZ,OAAS,EAAA,MAAA;AAAA,MACT,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACtB,UAAY,EAAA,aAAA;AAAA,MACZ,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA,CAAA;AAAA,MACT,QAAU,EAAA;AAAA,KACX;AAAA,GACH;AACF,CAAA;;;;"}