@carto/ps-react-ui 4.9.1 → 4.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/category-Dnd2_j0x.js +719 -0
- package/dist/category-Dnd2_j0x.js.map +1 -0
- package/dist/change-column-BiuuHCDN.js +1156 -0
- package/dist/change-column-BiuuHCDN.js.map +1 -0
- package/dist/chat.js +1507 -0
- package/dist/chat.js.map +1 -0
- package/dist/components.js +122 -120
- package/dist/components.js.map +1 -1
- package/dist/copy-button-DGL1tyli.js +26 -0
- package/dist/copy-button-DGL1tyli.js.map +1 -0
- package/dist/{data-zoom-layout-0QSptXG_.js → data-zoom-layout--YiY6ko_.js} +4 -3
- package/dist/{data-zoom-layout-0QSptXG_.js.map → data-zoom-layout--YiY6ko_.js.map} +1 -1
- package/dist/{download-config-CzmjOT2T.js → download-config-oJIFZ2WC.js} +9 -8
- package/dist/{download-config-CzmjOT2T.js.map → download-config-oJIFZ2WC.js.map} +1 -1
- package/dist/{spread-Y9R1f5dm.js → spread-CPis22AE.js} +4 -3
- package/dist/{spread-Y9R1f5dm.js.map → spread-CPis22AE.js.map} +1 -1
- package/dist/types/chat/bubbles/chat-error-message.d.ts +2 -0
- package/dist/types/chat/bubbles/chat-suggestion-button.d.ts +2 -0
- package/dist/types/chat/bubbles/chat-user-message.d.ts +2 -0
- package/dist/types/chat/bubbles/index.d.ts +4 -0
- package/dist/types/chat/const.d.ts +4 -0
- package/dist/types/chat/containers/chat-content.d.ts +2 -0
- package/dist/types/chat/containers/chat-footer.d.ts +2 -0
- package/dist/types/chat/containers/chat-header.d.ts +2 -0
- package/dist/types/chat/containers/chat-starter.d.ts +2 -0
- package/dist/types/chat/containers/index.d.ts +4 -0
- package/dist/types/chat/containers/styles.d.ts +93 -0
- package/dist/types/chat/feedback/chat-loader.d.ts +2 -0
- package/dist/types/chat/feedback/chat-rating-action.d.ts +2 -0
- package/dist/types/chat/feedback/chat-thinking.d.ts +2 -0
- package/dist/types/chat/feedback/chat-tool-code-area.d.ts +2 -0
- package/dist/types/chat/feedback/chat-tool-full-view-dialog.d.ts +2 -0
- package/dist/types/chat/feedback/chat-tool-group.d.ts +2 -0
- package/dist/types/chat/feedback/chat-tool-trace.d.ts +3 -0
- package/dist/types/chat/feedback/get-tool-label.d.ts +2 -0
- package/dist/types/chat/feedback/index.d.ts +8 -0
- package/dist/types/chat/feedback/styles.d.ts +211 -0
- package/dist/types/chat/index.d.ts +20 -0
- package/dist/types/chat/types.d.ts +184 -0
- package/dist/types/chat/use-typewriter.d.ts +30 -0
- package/dist/types/components/copy-button/copy-button.d.ts +2 -0
- package/dist/types/components/copy-button/types.d.ts +6 -0
- package/dist/types/components/index.d.ts +2 -0
- package/dist/types/widgets/actions/brush-toggle/style.d.ts +1 -1
- package/dist/types/widgets/actions/shared/styles.d.ts +1 -1
- package/dist/types/widgets/actions/zoom-toggle/style.d.ts +1 -1
- package/dist/types/widgets/echart/types.d.ts +1 -1
- package/dist/types/widgets/toolbar-actions/styles.d.ts +1 -1
- package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +1 -1
- package/dist/types/widgets-v2/actions/change-column/style.d.ts +1 -1
- package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +1 -1
- package/dist/types/widgets-v2/actions/index.d.ts +1 -0
- package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +1 -1
- package/dist/types/widgets-v2/actions/relative-data/style.d.ts +1 -1
- package/dist/types/widgets-v2/actions/searcher/style.d.ts +1 -1
- package/dist/types/widgets-v2/actions/show-all/index.d.ts +2 -0
- package/dist/types/widgets-v2/actions/show-all/labels.d.ts +5 -0
- package/dist/types/widgets-v2/actions/show-all/show-all.d.ts +33 -0
- package/dist/types/widgets-v2/actions/show-all/style.d.ts +8 -0
- package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +1 -1
- package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +1 -1
- package/dist/types/widgets-v2/category/category-ui.d.ts +9 -2
- package/dist/types/widgets-v2/category/category.d.ts +9 -2
- package/dist/types/widgets-v2/category/components/category-row-other.d.ts +19 -6
- package/dist/types/widgets-v2/category/style.d.ts +21 -2
- package/dist/types/widgets-v2/category/types.d.ts +2 -0
- package/dist/types/widgets-v2/index.d.ts +3 -2
- package/dist/types/widgets-v2/selection-summary/labels.d.ts +7 -2
- package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +13 -6
- package/dist/types/widgets-v2/selection-summary/style.d.ts +15 -0
- package/dist/widgets/actions.js +115 -114
- package/dist/widgets/actions.js.map +1 -1
- package/dist/widgets/bar.js +1 -1
- package/dist/widgets/category.js +9 -8
- package/dist/widgets/category.js.map +1 -1
- package/dist/widgets/formula.js +11 -10
- package/dist/widgets/formula.js.map +1 -1
- package/dist/widgets/histogram.js +7 -6
- package/dist/widgets/histogram.js.map +1 -1
- package/dist/widgets/markdown.js +9 -8
- package/dist/widgets/markdown.js.map +1 -1
- package/dist/widgets/pie.js +1 -1
- package/dist/widgets/scatterplot.js +1 -1
- package/dist/widgets/spread.js +9 -8
- package/dist/widgets/spread.js.map +1 -1
- package/dist/widgets/table.js +17 -16
- package/dist/widgets/table.js.map +1 -1
- package/dist/widgets/timeseries.js +1 -1
- package/dist/widgets/utils.js +1 -1
- package/dist/widgets/wrapper.js +3 -2
- package/dist/widgets/wrapper.js.map +1 -1
- package/dist/widgets-v2/actions.js +41 -37
- package/dist/widgets-v2/bar.js +8 -7
- package/dist/widgets-v2/bar.js.map +1 -1
- package/dist/widgets-v2/category.js +22 -21
- package/dist/widgets-v2/category.js.map +1 -1
- package/dist/widgets-v2/formula.js +23 -22
- package/dist/widgets-v2/formula.js.map +1 -1
- package/dist/widgets-v2/histogram.js +10 -9
- package/dist/widgets-v2/histogram.js.map +1 -1
- package/dist/widgets-v2/markdown.js +9 -8
- package/dist/widgets-v2/markdown.js.map +1 -1
- package/dist/widgets-v2/pie.js +7 -6
- package/dist/widgets-v2/pie.js.map +1 -1
- package/dist/widgets-v2/scatterplot.js +9 -8
- package/dist/widgets-v2/scatterplot.js.map +1 -1
- package/dist/widgets-v2/spread.js +9 -8
- package/dist/widgets-v2/spread.js.map +1 -1
- package/dist/widgets-v2/table.js +16 -15
- package/dist/widgets-v2/table.js.map +1 -1
- package/dist/widgets-v2/timeseries.js +8 -7
- package/dist/widgets-v2/timeseries.js.map +1 -1
- package/dist/widgets-v2/utils.js +1 -1
- package/dist/widgets-v2.js +276 -271
- package/dist/widgets-v2.js.map +1 -1
- package/package.json +7 -3
- package/src/chat/bubbles/chat-agent-message.test.tsx +30 -0
- package/src/chat/bubbles/chat-agent-message.tsx +11 -0
- package/src/chat/bubbles/chat-error-message.test.tsx +40 -0
- package/src/chat/bubbles/chat-error-message.tsx +47 -0
- package/src/chat/bubbles/chat-suggestion-button.test.tsx +24 -0
- package/src/chat/bubbles/chat-suggestion-button.tsx +27 -0
- package/src/chat/bubbles/chat-user-message.test.tsx +27 -0
- package/src/chat/bubbles/chat-user-message.tsx +27 -0
- package/src/chat/bubbles/index.ts +4 -0
- package/src/chat/bubbles/styles.ts +148 -0
- package/src/chat/const.ts +4 -0
- package/src/chat/containers/chat-content.test.tsx +269 -0
- package/src/chat/containers/chat-content.tsx +142 -0
- package/src/chat/containers/chat-footer.test.tsx +34 -0
- package/src/chat/containers/chat-footer.tsx +78 -0
- package/src/chat/containers/chat-header.test.tsx +28 -0
- package/src/chat/containers/chat-header.tsx +29 -0
- package/src/chat/containers/chat-starter.test.tsx +32 -0
- package/src/chat/containers/chat-starter.tsx +75 -0
- package/src/chat/containers/index.ts +4 -0
- package/src/chat/containers/styles.ts +96 -0
- package/src/chat/feedback/chat-actions-container.test.tsx +64 -0
- package/src/chat/feedback/chat-actions-container.tsx +7 -0
- package/src/chat/feedback/chat-loader.test.tsx +10 -0
- package/src/chat/feedback/chat-loader.tsx +31 -0
- package/src/chat/feedback/chat-rating-action.tsx +43 -0
- package/src/chat/feedback/chat-thinking.test.tsx +15 -0
- package/src/chat/feedback/chat-thinking.tsx +23 -0
- package/src/chat/feedback/chat-tool-code-area.test.tsx +23 -0
- package/src/chat/feedback/chat-tool-code-area.tsx +71 -0
- package/src/chat/feedback/chat-tool-full-view-dialog.test.tsx +39 -0
- package/src/chat/feedback/chat-tool-full-view-dialog.tsx +121 -0
- package/src/chat/feedback/chat-tool-group.test.tsx +84 -0
- package/src/chat/feedback/chat-tool-group.tsx +156 -0
- package/src/chat/feedback/chat-tool-trace.test.tsx +81 -0
- package/src/chat/feedback/chat-tool-trace.tsx +192 -0
- package/src/chat/feedback/get-tool-label.test.tsx +91 -0
- package/src/chat/feedback/get-tool-label.ts +13 -0
- package/src/chat/feedback/index.ts +8 -0
- package/src/chat/feedback/styles.ts +229 -0
- package/src/chat/index.ts +59 -0
- package/src/chat/types.ts +215 -0
- package/src/chat/use-typewriter.test.tsx +38 -0
- package/src/chat/use-typewriter.ts +82 -0
- package/src/components/copy-button/copy-button.test.tsx +41 -0
- package/src/components/copy-button/copy-button.tsx +31 -0
- package/src/components/copy-button/types.ts +10 -0
- package/src/components/index.ts +3 -0
- package/src/widgets/echart/types.ts +1 -1
- package/src/widgets-v2/actions/index.ts +8 -0
- package/src/widgets-v2/actions/show-all/index.ts +7 -0
- package/src/widgets-v2/actions/show-all/labels.ts +8 -0
- package/src/widgets-v2/actions/show-all/show-all.test.tsx +50 -0
- package/src/widgets-v2/actions/show-all/show-all.tsx +72 -0
- package/src/widgets-v2/actions/show-all/style.ts +8 -0
- package/src/widgets-v2/category/category-ui.test.tsx +26 -10
- package/src/widgets-v2/category/category-ui.tsx +13 -3
- package/src/widgets-v2/category/category.test.tsx +4 -4
- package/src/widgets-v2/category/category.tsx +10 -1
- package/src/widgets-v2/category/components/category-row-other.test.tsx +36 -7
- package/src/widgets-v2/category/components/category-row-other.tsx +64 -13
- package/src/widgets-v2/category/style.ts +35 -4
- package/src/widgets-v2/category/types.ts +2 -0
- package/src/widgets-v2/index.ts +3 -0
- package/src/widgets-v2/selection-summary/labels.ts +8 -4
- package/src/widgets-v2/selection-summary/selection-summary.test.tsx +15 -9
- package/src/widgets-v2/selection-summary/selection-summary.tsx +42 -22
- package/src/widgets-v2/selection-summary/style.ts +15 -0
- package/dist/category-DwaeYjpX.js +0 -656
- package/dist/category-DwaeYjpX.js.map +0 -1
- package/dist/change-column-B4IT0rh6.js +0 -1110
- package/dist/change-column-B4IT0rh6.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-Dnd2_j0x.js","sources":["../src/widgets-v2/category/style.ts","../src/widgets-v2/category/components/category-bar.tsx","../src/widgets-v2/category/components/category-row-single.tsx","../src/widgets-v2/category/components/category-row-multi.tsx","../src/widgets-v2/category/components/category-bar-stacked.tsx","../src/widgets-v2/category/components/category-row-stacked.tsx","../src/widgets-v2/category/components/category-row-other.tsx","../src/widgets-v2/category/components/category-legend.tsx","../src/widgets-v2/category/category-ui.tsx","../src/widgets-v2/category/category.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material'\nimport type { CategorySize } from './types'\n\n// Size-keyed bar styles — scoped strictly to the bar primitive\n// (track + fill height & corner radius). `small` preserves the\n// historical look (4px-tall pill); `medium` renders a 12px-tall track\n// with a 2px corner radius. Every other token (gap, padding, hover,\n// transitions, label/value typography) is size-invariant.\nconst bar: Record<CategorySize, SxProps<Theme>> = {\n small: {\n position: 'relative',\n height: 4,\n bgcolor: 'action.hover',\n borderRadius: 1,\n overflow: 'hidden',\n transition: 'background-color 150ms ease',\n },\n medium: {\n position: 'relative',\n height: 12,\n bgcolor: 'action.hover',\n borderRadius: 0.25,\n overflow: 'hidden',\n transition: 'background-color 150ms ease',\n },\n}\n\nconst barFill: Record<CategorySize, SxProps<Theme>> = {\n small: {\n position: 'absolute',\n inset: '0 auto 0 0',\n borderRadius: 1,\n transition:\n 'width 300ms ease-in-out, background-color 150ms ease, filter 150ms ease',\n },\n medium: {\n position: 'absolute',\n inset: '0 auto 0 0',\n borderRadius: 0.25,\n transition:\n 'width 300ms ease-in-out, background-color 150ms ease, filter 150ms ease',\n },\n}\n\n// Square-cornered segment for the stacked bar. Adjacent segments meet\n// cleanly; the parent `bar[size]` track clips the outer ends via its\n// own borderRadius + overflow:hidden, so the stacked bar still has the\n// same rounded silhouette as a single `CategoryBar`.\nconst stackedSegment: Record<CategorySize, SxProps<Theme>> = {\n small: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n transition:\n 'left 300ms ease-in-out, width 300ms ease-in-out, background-color 150ms ease, filter 150ms ease',\n },\n medium: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n transition:\n 'left 300ms ease-in-out, width 300ms ease-in-out, background-color 150ms ease, filter 150ms ease',\n },\n}\n\nexport const styles = {\n // ── Top-level container ────────────────────────────────────────────\n root: {\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n width: '100%',\n },\n // Flat list of category rows. Holds both single + multi rows.\n list: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n py: 0.5,\n },\n // Layered on `list` only in scroll mode (`maxItems === 0`): right padding\n // so the bars + right-aligned values clear the scrollbar. Right side only\n // — the left edge stays at 0 so content stays aligned with the capped\n // view. `overflowY` + the dynamic `maxHeight` remain on the inline style.\n listScroll: {\n pr: 1,\n },\n\n // ── Single-series row ─────────────────────────────────────────────\n // v1 layout: label + value share a top flex row (justify-between); the\n // bar fills the row width below. Mirrors `rowMulti` for visual\n // consistency.\n rowSingle: {\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n // py: 0.5,\n // px: 0.5,\n cursor: 'pointer',\n userSelect: 'none',\n transition: 'background-color 80ms ease',\n // Hovering anywhere in the row also brightens the bar fill, matching\n // what the bar got from `bar:hover` before. `data-bar-fill` is set\n // on `barFill` by <CategoryBar>; descendant selector reaches it\n // through `bar` in single rows and through `multiBarRow > bar` in\n // multi rows.\n '&:hover [data-bar-fill=\"true\"]': {\n filter: 'brightness(1.2)',\n },\n '&:focus-visible': {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: -2,\n },\n },\n // Top row of `rowSingle`: label on the left, value on the right.\n rowHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 1,\n },\n // ── Multi-series row ──────────────────────────────────────────────\n // Flex column: label fills the top row; bar+value pairs stack below.\n // Bars get full track width — better legibility for N>=2 series than a\n // shared grid would give.\n rowMulti: {\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n // py: 0.5,\n // px: 0.5,\n cursor: 'pointer',\n userSelect: 'none',\n transition: 'background-color 80ms ease',\n // Row-hover brightens every bar fill inside the multi-row.\n '&:hover [data-bar-fill=\"true\"]': {\n filter: 'brightness(1.2)',\n },\n '&:focus-visible': {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: -2,\n },\n },\n // ── Row labels / values ───────────────────────────────────────────\n // Matches v1: name uses medium-weight body2 in primary text color,\n // value uses regular body2 in secondary text color. Same font size,\n // visual hierarchy via weight + color.\n name: {\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n color: 'text.primary',\n fontWeight: 'medium',\n },\n multiName: {\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n color: 'text.primary',\n fontWeight: 'medium',\n },\n value: {\n color: 'text.secondary',\n fontVariantNumeric: 'tabular-nums',\n // Right-align + minWidth keeps `rowMulti`'s per-bar value column\n // tidy (where the bar grows on the left and the number sits at a\n // fixed right edge). `rowSingle` uses `rowHeader`'s flex\n // justify-between to push the value to the trailing edge, so the\n // minWidth here is also harmless in that context.\n minWidth: 48,\n textAlign: 'right',\n },\n\n // ── Bar (track + fill) ────────────────────────────────────────────\n // Size-keyed maps live above the `styles` object; `<CategoryBar>` picks\n // the variant via its `size` prop. Hover brightening still fires from\n // the parent row (`&:hover [data-bar-fill]`), so it works regardless\n // of which size variant the bar uses.\n bar,\n barFill,\n stackedSegment,\n\n // ── Multi-series internals ────────────────────────────────────────\n // One [bar | value] flex row per series, inside `rowMulti`'s column.\n multiBarRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n },\n multiBarContainer: {\n flex: 1,\n },\n\n // ── Stacked-mode row ──────────────────────────────────────────────\n // Mirror `rowMulti`'s outer shape (click target + hover brightening +\n // focus ring) but stack three children vertically: header line, bar,\n // breakdown line.\n rowStacked: {\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n cursor: 'pointer',\n userSelect: 'none',\n transition: 'background-color 80ms ease',\n '&:hover [data-bar-fill=\"true\"]': {\n filter: 'brightness(1.2)',\n },\n '&:focus-visible': {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: -2,\n },\n },\n stackedHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 1,\n },\n // Right-aligned total in the header. Tabular-nums keeps totals lined\n // up vertically across rows; minWidth reuses the per-series-value\n // column width so the right edge sits at the same spot as `rowMulti`'s\n // value column when both modes co-exist in the same widget card.\n stackedTotal: {\n color: 'text.primary',\n fontWeight: 'medium',\n fontVariantNumeric: 'tabular-nums',\n minWidth: 48,\n textAlign: 'right',\n },\n // Flex row of \"{seriesName}: {value}\" pairs. Wraps gracefully when\n // series names are long or there are many series.\n stackedBreakdown: {\n display: 'flex',\n flexWrap: 'wrap',\n columnGap: 2,\n rowGap: 0.25,\n },\n stackedBreakdownItem: {\n color: 'text.secondary',\n fontVariantNumeric: 'tabular-nums',\n },\n\n // ── Legend (sticky bottom) ────────────────────────────────────────\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n pt: 2,\n mt: 2,\n position: 'sticky',\n bottom: 0,\n bgcolor: 'background.paper',\n borderTop: (theme: Theme) => `1px solid ${theme.palette.divider}`,\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n },\n legendDot: {\n width: 8,\n height: 8,\n borderRadius: '50%',\n },\n legendLabel: {\n color: 'text.secondary',\n textTransform: 'uppercase',\n fontWeight: 'medium',\n },\n\n // ── \"Other\" overflow row ──────────────────────────────────────────\n // Left-aligned `Others <count>` — the label sits next to a muted count\n // (no parentheses). Only the label is the click target when interactive;\n // the count is always static text beside it.\n otherRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n py: 0.5,\n px: 0.5,\n },\n // Interactive affordances layered onto the \"Others\" label only (cursor,\n // hover tint, focus ring). A negative LEFT margin + matching padding keep\n // the hover pill breathing without shifting the label's text edge (it\n // stays aligned with the category rows above). No right margin, so the\n // row `gap` is preserved between the pill and the count.\n otherLabelButton: {\n cursor: 'pointer',\n userSelect: 'none',\n borderRadius: 1,\n px: 0.5,\n ml: -0.5,\n transition: 'background-color 80ms ease',\n '&:hover': {\n bgcolor: 'action.hover',\n },\n '&:focus-visible': {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: 2,\n },\n },\n otherLabel: {\n color: 'text.primary',\n fontWeight: 'medium',\n },\n otherCount: {\n color: 'text.secondary',\n fontVariantNumeric: 'tabular-nums',\n },\n // `bar` / `barFill` are size-keyed (`Record<CategorySize, SxProps>`);\n // every other entry is a single `SxProps<Theme>`. The mixed shape means\n // we can't apply the file-wide `satisfies Record<string, SxProps<Theme>>`\n // constraint that the other widget style files use — consumers of\n // individual tokens still get full type-checking at the call site via\n // the typed `Box`/`Typography` `sx` prop.\n}\n","import { Box } from '@mui/material'\nimport type { CategorySize } from '../types'\nimport { styles } from '../style'\n\nexport interface CategoryBarProps {\n /** Numeric value driving the fill width. */\n value: number\n /** Denominator for the percentage fill. `0` → empty bar (no division by zero). */\n maxValue: number\n /** Fill color. Honors any CSS color or MUI theme token. */\n color: string\n /**\n * Visual density. `'small'` (default) keeps the historical 4px pill;\n * `'medium'` renders a 12px-tall track with a 2px corner radius. Only\n * the bar track + fill change — every other token in the parent row is\n * size-invariant.\n */\n size?: CategorySize\n}\n\n/**\n * Single horizontal bar (track + proportional fill). Pure presentation.\n * Selection / dimming live at the row level; this component is unaware of\n * both — bars stay vivid regardless of selection state (per the v2\n * \"row-bg + row-dim, never muted bar\" rule).\n */\nexport function CategoryBar({\n value,\n maxValue,\n color,\n size = 'small',\n}: CategoryBarProps) {\n const pct = maxValue > 0 ? (value / maxValue) * 100 : 0\n // Width + color rendered as inline `style` (not `sx`) to avoid\n // generating a new emotion class for every distinct value/color pair\n // — also makes the rendered DOM testable without computed-style math.\n return (\n <Box sx={styles.bar[size]} data-size={size}>\n <Box\n sx={styles.barFill[size]}\n style={{ width: `${pct}%`, backgroundColor: color }}\n // Tag the fill so an ancestor row's `:hover` selector can target\n // it (`&:hover [data-bar-fill]`) — the brightening affordance now\n // fires from anywhere in the row, not only the bar track.\n data-bar-fill='true'\n />\n </Box>\n )\n}\n","import type { KeyboardEvent } from 'react'\nimport { Box, Typography } from '@mui/material'\nimport { CategoryBar } from './category-bar'\nimport type { CategoryKey, CategorySize } from '../types'\nimport { styles } from '../style'\n\nexport interface CategoryRowSingleProps {\n /** Raw category key — what gets emitted to `onToggle` regardless of formatter. */\n name: CategoryKey\n /** Display label (post-`labelFormatter`). Falls back to `name` when omitted. */\n displayName?: string | number\n value: number\n maxValue: number\n color: string\n formatter: (n: number) => string\n selected: boolean\n onToggle: (name: CategoryKey) => void\n /** Bar visual density. Forwarded to {@link CategoryBar}. */\n size?: CategorySize\n}\n\n/**\n * Single-series category row: `[label] [bar] [value]` grid. Click /\n * Enter / Space toggles `name` in/out of the selection set via\n * `onToggle`. Selection key is always the raw `name` — `displayName` is\n * presentation only.\n *\n * Visual selection / dim signal lives ENTIRELY in the bar color\n * (`color` prop) — computed upstream by `CategoryUI` (real palette\n * color when selected or no-selection; `theme.palette.action.disabled`\n * when a selection exists and this row isn't in it). The row itself\n * has no bg tint, no opacity rule.\n */\nexport function CategoryRowSingle({\n name,\n displayName,\n value,\n maxValue,\n color,\n formatter,\n selected,\n onToggle,\n size,\n}: CategoryRowSingleProps) {\n const handleKey = (e: KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onToggle(name)\n }\n }\n return (\n <Box\n role='button'\n aria-pressed={selected}\n tabIndex={0}\n onClick={() => onToggle(name)}\n onKeyDown={handleKey}\n sx={styles.rowSingle}\n >\n <Box sx={styles.rowHeader}>\n <Typography variant='body2' sx={styles.name}>\n {displayName ?? name}\n </Typography>\n <Typography variant='body2' sx={styles.value}>\n {formatter(value)}\n </Typography>\n </Box>\n <CategoryBar\n value={value}\n maxValue={maxValue}\n color={color}\n size={size}\n />\n </Box>\n )\n}\n","import type { KeyboardEvent } from 'react'\nimport { Box, Typography } from '@mui/material'\nimport { CategoryBar } from './category-bar'\nimport type { CategoryKey, CategorySize } from '../types'\nimport { styles } from '../style'\n\nexport interface CategoryRowMultiProps {\n /** Raw category key — what gets emitted to `onToggle`. */\n name: CategoryKey\n /** Display label (post-`labelFormatter`). Falls back to `name`. */\n displayName?: string | number\n /** One value per series. `0` is rendered as an empty bar (track only). */\n values: readonly number[]\n /** One color per series (palette + per-series overrides resolved upstream). */\n colors: readonly string[]\n /** Shared max across all series + rows (or `maxOverride`). */\n maxValue: number\n formatter: (n: number) => string\n selected: boolean\n onToggle: (name: CategoryKey) => void\n /** Bar visual density. Forwarded to every {@link CategoryBar} in the row. */\n size?: CategorySize\n}\n\n/**\n * Multi-series category row: label spans the top; bar+value pairs stack\n * vertically below, one per series. Each bar uses the full row width\n * track (no shared grid) for legibility at N>=2 series. Click anywhere\n * in the row (label OR any bar/value) toggles selection by `name`.\n *\n * Visual selection / dim signal lives ENTIRELY in the bar colors\n * (`colors` prop) — every series in a dimmed row receives\n * `theme.palette.action.disabled`; selected / unselected-no-selection\n * rows receive their real palette colors. Computed upstream by\n * `CategoryUI`. The row itself has no bg tint, no opacity rule.\n */\nexport function CategoryRowMulti({\n name,\n displayName,\n values,\n colors,\n maxValue,\n formatter,\n selected,\n onToggle,\n size,\n}: CategoryRowMultiProps) {\n const handleKey = (e: KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onToggle(name)\n }\n }\n return (\n <Box\n role='button'\n aria-pressed={selected}\n tabIndex={0}\n onClick={() => onToggle(name)}\n onKeyDown={handleKey}\n sx={styles.rowMulti}\n >\n <Typography variant='body2' sx={styles.multiName}>\n {displayName ?? name}\n </Typography>\n {values.map((v, i) => (\n // Multi-bar rows iterate per series — the bar belongs to series `i`,\n // and the row is keyed on the parent's `name`, so a composite of\n // `name` + the series index is stable across reorders.\n <Box key={`${name}-series-${i}`} sx={styles.multiBarRow}>\n <Box sx={styles.multiBarContainer}>\n <CategoryBar\n value={v}\n maxValue={maxValue}\n color={colors[i] ?? ''}\n size={size}\n />\n </Box>\n <Typography variant='body2' sx={styles.value}>\n {formatter(v)}\n </Typography>\n </Box>\n ))}\n </Box>\n )\n}\n","import { Box } from '@mui/material'\nimport type { CategorySize } from '../types'\nimport { styles } from '../style'\n\nexport interface CategoryBarStackedProps {\n /** One value per series. Zero values render no segment (visually + in the DOM). */\n values: readonly number[]\n /** One color per series. Resolved upstream by `CategoryUI.colorAt`. */\n colors: readonly string[]\n /**\n * Shared denominator across all rows + series (or `maxOverride`). Same\n * value `CategoryBar` uses — segments scale identically to single-bar rows\n * so cross-row comparison is preserved.\n */\n maxValue: number\n /** Visual density. Forwarded to the track styling; segments inherit height. */\n size?: CategorySize\n}\n\n/**\n * Stacked horizontal bar: one rounded track containing N square segments\n * placed side-by-side. Each segment's width is `value_i / maxValue * 100%`\n * and its left offset is the cumulative sum of preceding values. Square\n * interior edges + the parent track's `overflow: hidden` + rounded radius\n * mean the outer ends of the stacked bar match a single `CategoryBar` while\n * interior segment boundaries meet cleanly.\n *\n * Pure presentation — selection / dimming is resolved upstream by the row\n * via the `colors` prop. Each segment carries `data-bar-fill='true'` so the\n * existing row-hover brightening selector still fires on every segment.\n */\nexport function CategoryBarStacked({\n values,\n colors,\n maxValue,\n size = 'small',\n}: CategoryBarStackedProps) {\n // Cumulative offsets pre-computed up front so the render map function\n // stays pure (no mutable closure variable — keeps the React Compiler\n // immutability check happy).\n const offsets: number[] = []\n {\n let acc = 0\n for (const v of values) {\n offsets.push(acc)\n acc += v\n }\n }\n return (\n <Box sx={styles.bar[size]} data-size={size}>\n {values.map((v, i) => {\n if (v <= 0) return null\n const leftPct = maxValue > 0 ? (offsets[i]! / maxValue) * 100 : 0\n const pct = maxValue > 0 ? (v / maxValue) * 100 : 0\n return (\n <Box\n // Segments are keyed by per-series colour (the only stable\n // distinguishing field on this side) plus the segment index for\n // when callers reuse palette colours across series.\n key={`seg-${colors[i] ?? 'none'}-${i}`}\n sx={styles.stackedSegment[size]}\n style={{\n left: `${leftPct}%`,\n width: `${pct}%`,\n backgroundColor: colors[i] ?? '',\n }}\n data-bar-fill='true'\n />\n )\n })}\n </Box>\n )\n}\n","import type { KeyboardEvent } from 'react'\nimport { Box, Typography } from '@mui/material'\nimport { CategoryBarStacked } from './category-bar-stacked'\nimport type { CategoryKey, CategorySize } from '../types'\nimport { styles } from '../style'\n\nexport interface CategoryRowStackedProps {\n /** Raw category key — what gets emitted to `onToggle`. */\n name: CategoryKey\n /** Display label (post-`labelFormatter`). Falls back to `name`. */\n displayName?: string | number\n /** One value per series. Zero values still appear in the breakdown row. */\n values: readonly number[]\n /** One color per series (palette + per-series overrides resolved upstream). */\n colors: readonly string[]\n /** Series names for the breakdown row. Missing entries fall back to `Series N`. */\n seriesNames: readonly string[]\n formatter: (n: number) => string\n selected: boolean\n onToggle: (name: CategoryKey) => void\n /** Bar visual density. Forwarded to the inner {@link CategoryBarStacked}. */\n size?: CategorySize\n}\n\n/**\n * Stacked-mode category row: label + total share a header line; a single\n * segmented bar sits below; an inline breakdown lists each series with its\n * formatted value. Click anywhere in the row toggles selection by `name`.\n *\n * Per-row normalization: the stacked bar always fills 100% of the track,\n * with each segment sized as `value_i / sum(values)`. This is intentionally\n * different from `CategoryRowMulti` (which scales bars against the global\n * `maxValue` for cross-row comparison) — in stacked mode the comparable\n * axis is the proportion of each series within the row, not the row's\n * total relative to other rows. The total numeric value is still shown in\n * the header so the per-row magnitude isn't lost.\n *\n * Visual selection / dim signal lives entirely in the segment colors\n * (`colors` prop) — every series in a dimmed row receives\n * `theme.palette.action.disabled`. The bar visually collapses to a single\n * grey shape when dimmed, but the breakdown text stays at full color so the\n * per-series values remain legible.\n */\nexport function CategoryRowStacked({\n name,\n displayName,\n values,\n colors,\n seriesNames,\n formatter,\n selected,\n onToggle,\n size,\n}: CategoryRowStackedProps) {\n const handleKey = (e: KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onToggle(name)\n }\n }\n const total = values.reduce((a, b) => a + b, 0)\n return (\n <Box\n role='button'\n aria-pressed={selected}\n tabIndex={0}\n onClick={() => onToggle(name)}\n onKeyDown={handleKey}\n sx={styles.rowStacked}\n >\n <Box sx={styles.stackedHeader}>\n <Typography variant='body2' sx={styles.multiName}>\n {displayName ?? name}\n </Typography>\n <Typography variant='body2' sx={styles.stackedTotal}>\n {formatter(total)}\n </Typography>\n </Box>\n <CategoryBarStacked\n values={values}\n colors={colors}\n maxValue={total}\n size={size}\n />\n <Box sx={styles.stackedBreakdown}>\n {values.map((v, i) => (\n // Series name is the stable identity for the breakdown line.\n <Typography\n key={`breakdown-${seriesNames[i] ?? `series-${i}`}`}\n variant='body2'\n sx={styles.stackedBreakdownItem}\n >\n {`${seriesNames[i] ?? `Series ${i + 1}`}: ${formatter(v)}`}\n </Typography>\n ))}\n </Box>\n </Box>\n )\n}\n","import type { KeyboardEvent } from 'react'\nimport { Box, Typography } from '@mui/material'\nimport { Tooltip } from '../../../components'\nimport { styles } from '../style'\n\nexport interface CategoryRowOtherProps {\n hiddenCount: number\n /** Label for the overflow row. Defaults to `'Others'`. */\n otherLabel?: string\n /** Count text with `{count}` placeholder. Defaults to `'{count}'`. */\n otherCountLabel?: string\n /**\n * When provided, the row becomes a button: clicking it (or Enter/Space)\n * fires `onShowAll`, expanding the widget to reveal every category. When\n * omitted the row renders as a static, non-interactive summary.\n */\n onShowAll?: () => void\n /** Tooltip shown over the button form. Defaults to `'Show all'`. */\n showAllLabel?: string\n}\n\n/**\n * Overflow summary row rendered after the last visible category row when\n * `data.length > maxItems`. Shows `Others <count>` (count muted, no\n * parentheses).\n *\n * When `onShowAll` is supplied the row is an interactive button — clicking\n * it (or Enter/Space) expands the widget to show all categories, mirroring\n * the Searcher's full-list view. Without `onShowAll` it stays a static,\n * non-interactive summary (backward-compatible default).\n */\nexport function CategoryRowOther({\n hiddenCount,\n otherLabel = 'Others',\n otherCountLabel = '{count}',\n onShowAll,\n showAllLabel = 'Show all',\n}: CategoryRowOtherProps) {\n const countText = otherCountLabel.replace('{count}', String(hiddenCount))\n\n const count = (\n <Typography variant='body2' sx={styles.otherCount}>\n {countText}\n </Typography>\n )\n\n if (!onShowAll) {\n return (\n <Box sx={styles.otherRow}>\n <Typography variant='body2' sx={styles.otherLabel}>\n {otherLabel}\n </Typography>\n {count}\n </Box>\n )\n }\n\n const handleKey = (e: KeyboardEvent<HTMLSpanElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onShowAll()\n }\n }\n\n // Only the label is the click target; the count stays static beside it.\n return (\n <Box sx={styles.otherRow}>\n <Tooltip title={showAllLabel}>\n <Typography\n variant='body2'\n component='span'\n role='button'\n tabIndex={0}\n onClick={onShowAll}\n onKeyDown={handleKey}\n sx={{ ...styles.otherLabel, ...styles.otherLabelButton }}\n >\n {otherLabel}\n </Typography>\n </Tooltip>\n {count}\n </Box>\n )\n}\n","import { Box, Typography } from '@mui/material'\nimport type { CategorySeriesConfig } from '../types'\nimport { styles } from '../style'\n\nexport interface CategoryLegendProps {\n /** Series metadata. Empty array → renders nothing. */\n series: readonly CategorySeriesConfig[]\n /**\n * Per-series colour resolver. Receives the series index and returns the\n * palette colour (or `undefined` to fall back to the MUI default). The\n * legend derives its dot colour from this on the fly — the caller does\n * NOT pre-compute a `colors` array (avoids passing two views of the\n * same source).\n */\n colorAt: (index: number) => string | undefined\n}\n\n/**\n * Sticky color legend rendered below a multi-series Category list.\n * Per-series `color` overrides the matching `colorAt(i)` result.\n */\nexport function CategoryLegend({ series, colorAt }: CategoryLegendProps) {\n if (series.length === 0) return null\n return (\n <Box sx={styles.legend}>\n {series.map((s, i) => (\n <Box key={s.name} sx={styles.legendItem}>\n <Box\n sx={styles.legendDot}\n style={{ backgroundColor: s.color ?? colorAt(i) }}\n />\n <Typography variant='caption' sx={styles.legendLabel}>\n {s.name}\n </Typography>\n </Box>\n ))}\n </Box>\n )\n}\n","import { useCallback, useMemo, useRef, useState } from 'react'\nimport { Box, useTheme } from '@mui/material'\nimport { CategoryRowSingle } from './components/category-row-single'\nimport { CategoryRowMulti } from './components/category-row-multi'\nimport { CategoryRowStacked } from './components/category-row-stacked'\nimport { CategoryRowOther } from './components/category-row-other'\nimport { CategoryLegend } from './components/category-legend'\nimport type {\n CategoryKey,\n CategoryLabels,\n CategorySeriesConfig,\n CategorySize,\n CategoryWidgetData,\n} from './types'\nimport { styles } from './style'\n\nconst DEFAULT_MAX_ITEMS = 20\n\n// Fallback viewport height used in scroll mode ONLY when no natural\n// measurement is available yet — i.e., the consumer mounts directly into\n// `maxItems === 0` (e.g., SearcherToggle pre-enabled), so the list has\n// never rendered in capped form for us to measure.\n//\n// small: label(~20) + gap(4) + bar(4) + list-gap(8) ≈ 36\n// medium: label(~20) + gap(4) + bar(12) + list-gap(8) ≈ 44\nconst ROW_HEIGHT_PX: Record<CategorySize, number> = { small: 36, medium: 44 }\nconst SCROLL_VIEWPORT_FALLBACK_ROWS = 8\n\nexport interface CategoryUIProps {\n data: CategoryWidgetData\n /** Currently-selected category names (destination-owned). */\n selection?: readonly CategoryKey[]\n /** Fires with the next selection set when a row is clicked. */\n onSelectionChange?: (next: readonly CategoryKey[]) => void\n /** Number formatter applied to each row's value. */\n formatter?: (value: number) => string\n /**\n * Display-only transform for category names. Selection callbacks always\n * receive the raw `item.name` regardless of this formatter.\n */\n labelFormatter?: (value: string | number) => string | number\n /**\n * Per-series metadata. Enables the legend (for multi-series) and\n * overrides palette colors per series index. Length need not match\n * `data.length`; mismatches degrade gracefully (extras ignored, gaps\n * fall back to palette).\n */\n series?: readonly CategorySeriesConfig[]\n /**\n * Caps the number of visible category rows.\n *\n * - `undefined` (omitted) — caps at {@link DEFAULT_MAX_ITEMS} (20).\n * Surplus rows fold into a single \"Others <count>\" footer row.\n * `undefined` cannot mean \"no cap\" because it's consumed by the\n * default-parameter syntax — pass `null` instead.\n * - positive finite N — same as the default but with a custom cap.\n * - `0` — **no cap WITH scroll**: every row renders inside a\n * fixed-height viewport that scrolls internally. The viewport's\n * max-height is the list's natural `clientHeight` measured on the\n * first render where the list was NOT in scroll mode (i.e., the\n * capped view) — frozen for the component's lifetime. If the\n * consumer mounts directly into scroll mode and we never see a\n * capped render, the viewport falls back to `8 × ROW_HEIGHT_PX`.\n * Composers flip into this mode while the user is searching\n * (`maxItems = searcherOpen ? 0 : userMaxItems`) so the widget\n * card height stays stable.\n * - `null` / `Infinity` / negative — **no cap, no scroll**: render\n * every row; the list grows with content. Matches v1's \"undefined\"\n * behavior. Use `null` as the canonical explicit form.\n */\n maxItems?: number | null\n /** Labels for the \"Other\" overflow row. `{count}` placeholder is replaced. */\n labels?: CategoryLabels\n /**\n * When provided, the \"Other\" overflow row becomes a button — clicking it\n * fires `onShowAll`, which a composer typically wires to expand the widget\n * (drop the row cap) so every category becomes reachable. When omitted the\n * overflow row stays a static summary.\n */\n onShowAll?: () => void\n /** Manual override for the bar-width denominator. */\n maxOverride?: number\n /**\n * Visual density of the bar primitive. `'small'` (default) keeps the\n * historical 4px-tall pill; `'medium'` switches to a 12px-tall track\n * with a 2px corner radius. Only the bar track + fill change.\n */\n size?: CategorySize\n /**\n * Multi-series stacked mode. When `true` and `data.length > 1`, each\n * category renders as a single segmented bar (one segment per series)\n * with a `formatter(sum)` total in the header and a per-series\n * breakdown line below. Composers typically thread this from\n * `useTransformEnabled(id, 'stack-toggle')`.\n *\n * No-op for single-series data — same convention as the legend.\n */\n stacked?: boolean\n}\n\ninterface GroupedRow {\n name: CategoryKey\n values: number[]\n /** Per-series per-row color override (first non-undefined wins). */\n rowColors: (string | undefined)[]\n}\n\n/**\n * Group items by `name` across series so each unique name produces one\n * row containing N values (zero-filled where a series has no entry for\n * that name). First-seen order across series is preserved.\n *\n * Ported from v1\n * (`packages/react-ui/src/widgets/category/category-ui.tsx:137-166`)\n * with readonly typing + per-row color capture.\n */\nfunction generateGroupedData(data: CategoryWidgetData): GroupedRow[] {\n if (!data || data.length === 0) return []\n const seriesCount = Math.max(data.length, 1)\n const grouped = new Map<CategoryKey, GroupedRow>()\n const order: CategoryKey[] = []\n for (let s = 0; s < data.length; s++) {\n const series = data[s] ?? []\n for (const item of series) {\n let row = grouped.get(item.name)\n if (!row) {\n row = {\n name: item.name,\n values: new Array<number>(seriesCount).fill(0),\n rowColors: new Array<string | undefined>(seriesCount).fill(undefined),\n }\n grouped.set(item.name, row)\n order.push(item.name)\n }\n row.values[s] = item.value\n row.rowColors[s] = item.color\n }\n }\n return order.map((k) => grouped.get(k)!)\n}\n\n/**\n * Pure presentational component for the Category widget. Renders\n * single-series rows (`data.length === 1`) as a compact grid or\n * multi-series rows (`data.length > 1`) as stacked-bar groups, capped at\n * `maxItems` with an overflow summary, and an optional sticky color\n * legend when `series` metadata is supplied.\n *\n * Selection is destination-owned: clicking a row fires\n * `onSelectionChange(next)` with the toggled set; the consumer keeps the\n * list in their own store. `aria-pressed` + Enter/Space keyboard\n * activation give full a11y parity with the mouse path.\n *\n * Returns `null` when there's nothing to render — `Widget.State` is the\n * empty-state authority in the canonical compositor.\n */\nexport function CategoryUI({\n data,\n selection,\n onSelectionChange,\n formatter,\n labelFormatter,\n series,\n maxItems = DEFAULT_MAX_ITEMS,\n labels,\n onShowAll,\n maxOverride,\n size = 'small',\n stacked = false,\n}: CategoryUIProps) {\n const theme = useTheme()\n const fmt = formatter ?? ((n: number) => String(n))\n\n const hasSelection = !!selection && selection.length > 0\n const selectionSet = useMemo(\n () => new Set<CategoryKey>(selection ?? []),\n [selection],\n )\n\n const toggle = useCallback(\n (name: CategoryKey) => {\n if (!onSelectionChange) return\n const cur = selection ?? []\n const next = cur.includes(name)\n ? cur.filter((n) => n !== name)\n : [...cur, name]\n onSelectionChange(next)\n },\n [onSelectionChange, selection],\n )\n\n // Palette: same convention as Bar/Pie/Histogram/Scatterplot/Timeseries v2.\n const paletteColors = useMemo<readonly string[]>(\n () => [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n [theme],\n )\n\n const colorAt = useCallback(\n (seriesIndex: number, rowColor?: string): string => {\n if (rowColor) return rowColor\n const seriesColor = series?.[seriesIndex]?.color\n if (seriesColor) return seriesColor\n return (\n paletteColors[seriesIndex % paletteColors.length] ??\n theme.palette.secondary.main\n )\n },\n [series, paletteColors, theme],\n )\n\n // Dim color for non-selected rows when a selection exists. Swapped in\n // at the bar-fill level only — text + track stay at their real colors.\n // Theme-driven so it survives palette swaps.\n const dimColor = theme.palette.action.disabled\n\n const grouped = useMemo(() => generateGroupedData(data), [data])\n\n const maxValue = useMemo(() => {\n if (typeof maxOverride === 'number' && maxOverride > 0) return maxOverride\n let m = 0\n for (const row of grouped) {\n for (const v of row.values) if (v > m) m = v\n }\n return m\n }, [grouped, maxOverride])\n\n // Three modes:\n // * positive finite N (default `DEFAULT_MAX_ITEMS = 20` when prop\n // omitted): cap at N rows; surplus folds into \"Others <count>\".\n // * `0`: no cap WITH scroll — every row renders, the list locks to a\n // fixed viewport and scrolls internally. Composers use this to\n // bypass pagination while the user is searching:\n // `maxItems = searcherOpen ? 0 : userMaxItems`\n // * `null` / `Infinity` / negative: no cap, no scroll — every row\n // renders and the list grows with content. `null` is the canonical\n // explicit form (`undefined` is consumed by the default param above).\n const scrollMode = maxItems === 0\n\n // Natural-height measurement. In scroll mode (`maxItems === 0`,\n // set by the composer when the SearcherToggle is open) every row\n // renders inside a scrollable viewport. The viewport's max-height\n // must match the pre-overflow content area — i.e., whatever the\n // list was rendering BEFORE the composer dropped the cap.\n //\n // We measure the list's `clientHeight` exactly once, the first time\n // it attaches while NOT in scroll mode (otherwise we'd capture the\n // wrong layout). Once set, `naturalHeight` is the lock anchor\n // forever — matches v1's frozen-at-mount semantics, just with a\n // real DOM measurement instead of a hard-coded constant.\n //\n // Implemented via a callback ref instead of `useLayoutEffect` so\n // setState fires during commit, not inside an effect — satisfies\n // the `react-hooks/set-state-in-effect` rule. React invokes\n // callback refs on attach (and re-invokes them when the callback\n // identity changes, which it does when `scrollMode` flips), so\n // toggling the searcher off after a scroll-mode mount triggers the\n // first measurement at that point.\n //\n // Fallback: if the consumer never lands a non-scroll render\n // (e.g., searcher pre-enabled and never closed), `naturalHeight`\n // stays `null` → viewport falls back to `8 × ROW_HEIGHT_PX`.\n const measuredRef = useRef(false)\n const [naturalHeight, setNaturalHeight] = useState<number | null>(null)\n const listRefCallback = useCallback(\n (node: HTMLDivElement | null) => {\n if (!node) return\n if (measuredRef.current) return\n if (scrollMode) return\n const h = node.clientHeight\n if (h > 0) {\n measuredRef.current = true\n setNaturalHeight(h)\n }\n },\n [scrollMode],\n )\n\n if (grouped.length === 0) return null\n\n const hasCap =\n typeof maxItems === 'number' && Number.isFinite(maxItems) && maxItems > 0\n const visible = hasCap ? grouped.slice(0, maxItems) : grouped\n const hiddenCount = hasCap ? grouped.length - visible.length : 0\n\n const isMulti = data.length > 1\n const hasLegend = isMulti && !!series && series.length > 0\n\n // Fallback viewport height matches the documented \"8 × ROW_HEIGHT_PX\"\n // (see the constants at the top of the file). Earlier code multiplied\n // this by `seriesCount`, making a 3-series widget render 3× the\n // intended viewport on the first frame before `naturalHeight` was\n // measured — a visible layout jump.\n const scrollMaxHeight = scrollMode\n ? (naturalHeight ?? ROW_HEIGHT_PX[size] * SCROLL_VIEWPORT_FALLBACK_ROWS)\n : undefined\n\n return (\n <Box sx={styles.root}>\n <Box\n ref={listRefCallback}\n sx={scrollMode ? { ...styles.list, ...styles.listScroll } : styles.list}\n style={\n scrollMaxHeight !== undefined\n ? { maxHeight: scrollMaxHeight, overflowY: 'auto' }\n : undefined\n }\n >\n {visible.map((row) => {\n const selected = selectionSet.has(row.name)\n const dimmed = hasSelection && !selected\n const displayName = labelFormatter\n ? labelFormatter(row.name)\n : undefined\n // When the row is dimmed, every series' bar fill is replaced\n // with `dimColor`. Text + track are untouched. This is the\n // ONLY visual difference between selected and non-selected\n // rows — no row-level opacity, no `rowSelected` bg tint.\n const fill = (i: number): string =>\n dimmed ? dimColor : colorAt(i, row.rowColors[i])\n if (isMulti) {\n if (stacked) {\n // Stacked-mode branch: one segmented bar per row. Toggling\n // `stacked` after the natural-height measurement does NOT\n // re-trigger measurement (see the `naturalHeight` comment\n // above) — accepted trade-off: stacked rows have a slightly\n // different height, so the scroll viewport may show extra\n // whitespace after the toggle. Visual only, not functional.\n // Stacked rows are per-row normalized — they don't take\n // the global `maxValue`. Each row's bar fills 100% of the\n // track and the segments split it by `value_i / sum`. The\n // numeric total in the header preserves the per-row\n // magnitude information.\n return (\n <CategoryRowStacked\n key={String(row.name)}\n name={row.name}\n displayName={displayName}\n values={row.values}\n colors={row.values.map((_, i) => fill(i))}\n seriesNames={series?.map((s) => s.name) ?? []}\n formatter={fmt}\n selected={selected}\n onToggle={toggle}\n size={size}\n />\n )\n }\n return (\n <CategoryRowMulti\n key={String(row.name)}\n name={row.name}\n displayName={displayName}\n values={row.values}\n colors={row.values.map((_, i) => fill(i))}\n maxValue={maxValue}\n formatter={fmt}\n selected={selected}\n onToggle={toggle}\n size={size}\n />\n )\n }\n return (\n <CategoryRowSingle\n key={String(row.name)}\n name={row.name}\n displayName={displayName}\n value={row.values[0] ?? 0}\n maxValue={maxValue}\n color={fill(0)}\n formatter={fmt}\n selected={selected}\n onToggle={toggle}\n size={size}\n />\n )\n })}\n {hiddenCount > 0 && (\n <CategoryRowOther\n hiddenCount={hiddenCount}\n otherLabel={labels?.other}\n otherCountLabel={labels?.otherCount}\n showAllLabel={labels?.showAll}\n onShowAll={onShowAll}\n />\n )}\n </Box>\n {hasLegend && series && (\n <CategoryLegend series={series} colorAt={(i) => colorAt(i)} />\n )}\n </Box>\n )\n}\n","import { useMemo } from 'react'\nimport { useWidgetId, useWidgetShallow, type WidgetState } from '../stores'\nimport { CategoryUI } from './category-ui'\nimport type {\n CategoryKey,\n CategoryLabels,\n CategorySeriesConfig,\n CategorySize,\n CategoryWidgetData,\n} from './types'\n\ninterface CategorySlice {\n data: CategoryWidgetData\n rawData: CategoryWidgetData | undefined\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n}\n\nconst categorySelector = (s: WidgetState): CategorySlice => ({\n data: (s.data ?? []) as CategoryWidgetData,\n rawData: (s.rawData ?? undefined) as CategoryWidgetData | undefined,\n formatter: s.formatter,\n labelFormatter: s.labelFormatter,\n})\n\nfunction maxFromCategoryData(d: CategoryWidgetData | undefined): number {\n if (!d) return 0\n let m = 0\n for (const series of d) {\n for (const item of series) if (item.value > m) m = item.value\n }\n return m\n}\n\nexport interface CategoryProps {\n /** Currently-selected category names. Destination-owned. */\n selection?: readonly CategoryKey[]\n /** Fires when a row is clicked. Consumer updates the destination's store. */\n onSelectionChange?: (next: readonly CategoryKey[]) => void\n /** Per-series metadata. Enables the legend + overrides palette per index. */\n series?: readonly CategorySeriesConfig[]\n /**\n * Cap visible rows; overflow folds into an \"Others <count>\" row. Default 20\n * (when omitted). Pass `0` to swap the cap for a scrollable viewport\n * (composers use this when the user opens the SearcherToggle —\n * `maxItems = searcherOpen ? 0 : userMaxItems`). Pass `null` to disable\n * the cap entirely without adding a scroll viewport.\n */\n maxItems?: number | null\n /** Labels for the \"Other\" overflow row. */\n labels?: CategoryLabels\n /**\n * When provided, the \"Other\" overflow row becomes a button that fires this\n * callback. Composers wire it to expand the widget (e.g. flip the\n * `show-all` flag) so every category is shown. Forwarded to\n * {@link CategoryUI}.\n */\n onShowAll?: () => void\n /**\n * Manual override for the bar-width denominator. When omitted, the\n * bridge auto-fills from the widget store's `rawData` so bar widths\n * stay coherent across data transforms (e.g., the Searcher filtering\n * rows in and out — bars don't rescale just because the larger rows\n * got hidden). Pass an explicit number to fix the denominator\n * regardless of the data.\n */\n maxOverride?: number\n /**\n * Visual density of the bar primitive. `'small'` (default) keeps the\n * historical 4px-tall pill; `'medium'` switches to a 12px-tall track\n * with a 2px corner radius. Forwarded as-is to {@link CategoryUI}.\n */\n size?: CategorySize\n /**\n * Multi-series stacked mode. Forwarded as-is to {@link CategoryUI}.\n * Composers typically wire this from\n * `useTransformEnabled(id, 'stack-toggle')`. No-op for single-series.\n */\n stacked?: boolean\n}\n\n/**\n * Stateful Category bridge — reads `data`, `formatter`, and\n * `labelFormatter` (post-pipeline) from the per-widget store and\n * forwards them to the pure {@link CategoryUI}. `selection` and\n * `onSelectionChange` follow the destination-owned principle: the\n * consumer keeps the list in their own store and passes it through.\n */\nexport function Category({\n selection,\n onSelectionChange,\n series,\n maxItems,\n labels,\n onShowAll,\n maxOverride,\n size,\n stacked,\n}: CategoryProps) {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, categorySelector)\n // Auto-fill `maxOverride` from `rawData` so bar widths stay coherent\n // across data transforms (e.g., the Searcher filtering rows in/out).\n // Consumer's explicit value always wins; we only fill when omitted\n // AND `rawData` has at least one positive value (CategoryUI's\n // `maxOverride > 0` guard would reject 0 anyway, but skipping is\n // cleaner — it lets the live fallback path handle the empty case).\n const naturalMax = useMemo(\n () => maxFromCategoryData(slice.rawData),\n [slice.rawData],\n )\n const effectiveMaxOverride =\n maxOverride ?? (naturalMax > 0 ? naturalMax : undefined)\n return (\n <CategoryUI\n data={slice.data}\n formatter={slice.formatter}\n labelFormatter={slice.labelFormatter}\n selection={selection}\n onSelectionChange={onSelectionChange}\n series={series}\n maxItems={maxItems}\n labels={labels}\n onShowAll={onShowAll}\n maxOverride={effectiveMaxOverride}\n size={size}\n stacked={stacked}\n />\n )\n}\n"],"names":["bar","small","position","height","bgcolor","borderRadius","overflow","transition","medium","barFill","inset","stackedSegment","top","bottom","styles","root","display","flexDirection","width","list","gap","py","listScroll","pr","rowSingle","cursor","userSelect","filter","outline","outlineColor","outlineOffset","rowHeader","justifyContent","alignItems","rowMulti","name","whiteSpace","textOverflow","color","fontWeight","multiName","value","fontVariantNumeric","minWidth","textAlign","multiBarRow","multiBarContainer","flex","rowStacked","stackedHeader","stackedTotal","stackedBreakdown","flexWrap","columnGap","rowGap","stackedBreakdownItem","legend","pt","mt","borderTop","theme","palette","divider","legendItem","legendDot","legendLabel","textTransform","otherRow","px","otherLabelButton","ml","otherLabel","otherCount","CategoryBar","t0","$","_c","maxValue","size","t1","undefined","pct","t2","t3","t4","t5","backgroundColor","t6","Box","t7","CategoryRowSingle","displayName","formatter","selected","onToggle","e","key","preventDefault","handleKey","Typography","t8","jsx","t9","CategoryRowMulti","values","colors","v","i","map","CategoryBarStacked","offsets","acc","push","v_0","leftPct","left","CategoryRowStacked","seriesNames","T0","T1","T2","t10","t11","t12","total","reduce","_temp","t13","t14","t15","t16","t17","t18","jsxs","a","b","CategoryRowOther","hiddenCount","otherCountLabel","onShowAll","showAllLabel","replace","String","countText","count","Symbol","for","Tooltip","CategoryLegend","series","colorAt","length","s","DEFAULT_MAX_ITEMS","ROW_HEIGHT_PX","SCROLL_VIEWPORT_FALLBACK_ROWS","generateGroupedData","data","seriesCount","Math","max","grouped","Map","order","item","row","get","Array","fill","rowColors","set","k","CategoryUI","selection","onSelectionChange","labelFormatter","maxItems","labels","maxOverride","stacked","useTheme","fmt","hasSelection","Set","selectionSet","cur","next","includes","n_0","n","toggle","secondary","main","Object","qualitative","bold","paletteColors","seriesIndex","rowColor","seriesColor","dimColor","action","disabled","bb0","m","scrollMode","measuredRef","useRef","naturalHeight","setNaturalHeight","useState","node","current","h","clientHeight","listRefCallback","Number","isFinite","hasCap","slice","visible","isMulti","hasLegend","scrollMaxHeight","maxHeight","overflowY","t19","row_0","has","dimmed","_","i_0","_temp2","__0","i_1","other","showAll","t20","t21","i_2","t22","categorySelector","rawData","maxFromCategoryData","d","Category","id","useWidgetId","useWidgetShallow","naturalMax","effectiveMaxOverride"],"mappings":";;;;;;;;;;;;AAQA,MAAMA,KAA4C;AAAA,EAChDC,OAAO;AAAA,IACLC,UAAU;AAAA,IACVC,QAAQ;AAAA,IACRC,SAAS;AAAA,IACTC,cAAc;AAAA,IACdC,UAAU;AAAA,IACVC,YAAY;AAAA,EAAA;AAAA,EAEdC,QAAQ;AAAA,IACNN,UAAU;AAAA,IACVC,QAAQ;AAAA,IACRC,SAAS;AAAA,IACTC,cAAc;AAAA,IACdC,UAAU;AAAA,IACVC,YAAY;AAAA,EAAA;AAEhB,GAEME,KAAgD;AAAA,EACpDR,OAAO;AAAA,IACLC,UAAU;AAAA,IACVQ,OAAO;AAAA,IACPL,cAAc;AAAA,IACdE,YACE;AAAA,EAAA;AAAA,EAEJC,QAAQ;AAAA,IACNN,UAAU;AAAA,IACVQ,OAAO;AAAA,IACPL,cAAc;AAAA,IACdE,YACE;AAAA,EAAA;AAEN,GAMMI,KAAuD;AAAA,EAC3DV,OAAO;AAAA,IACLC,UAAU;AAAA,IACVU,KAAK;AAAA,IACLC,QAAQ;AAAA,IACRN,YACE;AAAA,EAAA;AAAA,EAEJC,QAAQ;AAAA,IACNN,UAAU;AAAA,IACVU,KAAK;AAAA,IACLC,QAAQ;AAAA,IACRN,YACE;AAAA,EAAA;AAEN,GAEaO,IAAS;AAAA;AAAA,EAEpBC,MAAM;AAAA,IACJC,SAAS;AAAA,IACTC,eAAe;AAAA,IACff,UAAU;AAAA,IACVgB,OAAO;AAAA,EAAA;AAAA;AAAA,EAGTC,MAAM;AAAA,IACJH,SAAS;AAAA,IACTC,eAAe;AAAA,IACfG,KAAK;AAAA,IACLC,IAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMNC,YAAY;AAAA,IACVC,IAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAONC,WAAW;AAAA,IACTR,SAAS;AAAA,IACTC,eAAe;AAAA,IACfG,KAAK;AAAA;AAAA;AAAA,IAGLK,QAAQ;AAAA,IACRC,YAAY;AAAA,IACZnB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMZ,kCAAkC;AAAA,MAChCoB,QAAQ;AAAA,IAAA;AAAA,IAEV,mBAAmB;AAAA,MACjBC,SAAS;AAAA,MACTC,cAAc;AAAA,MACdC,eAAe;AAAA,IAAA;AAAA,EACjB;AAAA;AAAA,EAGFC,WAAW;AAAA,IACTf,SAAS;AAAA,IACTgB,gBAAgB;AAAA,IAChBC,YAAY;AAAA,IACZb,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMPc,UAAU;AAAA,IACRlB,SAAS;AAAA,IACTC,eAAe;AAAA,IACfG,KAAK;AAAA;AAAA;AAAA,IAGLK,QAAQ;AAAA,IACRC,YAAY;AAAA,IACZnB,YAAY;AAAA;AAAA,IAEZ,kCAAkC;AAAA,MAChCoB,QAAQ;AAAA,IAAA;AAAA,IAEV,mBAAmB;AAAA,MACjBC,SAAS;AAAA,MACTC,cAAc;AAAA,MACdC,eAAe;AAAA,IAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMFK,MAAM;AAAA,IACJ7B,UAAU;AAAA,IACV8B,YAAY;AAAA,IACZC,cAAc;AAAA,IACdC,OAAO;AAAA,IACPC,YAAY;AAAA,EAAA;AAAA,EAEdC,WAAW;AAAA,IACTlC,UAAU;AAAA,IACV8B,YAAY;AAAA,IACZC,cAAc;AAAA,IACdC,OAAO;AAAA,IACPC,YAAY;AAAA,EAAA;AAAA,EAEdE,OAAO;AAAA,IACLH,OAAO;AAAA,IACPI,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMpBC,UAAU;AAAA,IACVC,WAAW;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb5C,KAAAA;AAAAA,EACAS,SAAAA;AAAAA,EACAE,gBAAAA;AAAAA;AAAAA;AAAAA,EAIAkC,aAAa;AAAA,IACX7B,SAAS;AAAA,IACTiB,YAAY;AAAA,IACZb,KAAK;AAAA,EAAA;AAAA,EAEP0B,mBAAmB;AAAA,IACjBC,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAORC,YAAY;AAAA,IACVhC,SAAS;AAAA,IACTC,eAAe;AAAA,IACfG,KAAK;AAAA,IACLK,QAAQ;AAAA,IACRC,YAAY;AAAA,IACZnB,YAAY;AAAA,IACZ,kCAAkC;AAAA,MAChCoB,QAAQ;AAAA,IAAA;AAAA,IAEV,mBAAmB;AAAA,MACjBC,SAAS;AAAA,MACTC,cAAc;AAAA,MACdC,eAAe;AAAA,IAAA;AAAA,EACjB;AAAA,EAEFmB,eAAe;AAAA,IACbjC,SAAS;AAAA,IACTgB,gBAAgB;AAAA,IAChBC,YAAY;AAAA,IACZb,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMP8B,cAAc;AAAA,IACZZ,OAAO;AAAA,IACPC,YAAY;AAAA,IACZG,oBAAoB;AAAA,IACpBC,UAAU;AAAA,IACVC,WAAW;AAAA,EAAA;AAAA;AAAA;AAAA,EAIbO,kBAAkB;AAAA,IAChBnC,SAAS;AAAA,IACToC,UAAU;AAAA,IACVC,WAAW;AAAA,IACXC,QAAQ;AAAA,EAAA;AAAA,EAEVC,sBAAsB;AAAA,IACpBjB,OAAO;AAAA,IACPI,oBAAoB;AAAA,EAAA;AAAA;AAAA,EAItBc,QAAQ;AAAA,IACNxC,SAAS;AAAA,IACTiB,YAAY;AAAA,IACZb,KAAK;AAAA,IACLgC,UAAU;AAAA,IACVK,IAAI;AAAA,IACJC,IAAI;AAAA,IACJxD,UAAU;AAAA,IACVW,QAAQ;AAAA,IACRT,SAAS;AAAA,IACTuD,WAAWA,CAACC,MAAiB,aAAaA,EAAMC,QAAQC,OAAO;AAAA,EAAA;AAAA,EAEjEC,YAAY;AAAA,IACV/C,SAAS;AAAA,IACTiB,YAAY;AAAA,IACZb,KAAK;AAAA,EAAA;AAAA,EAEP4C,WAAW;AAAA,IACT9C,OAAO;AAAA,IACPf,QAAQ;AAAA,IACRE,cAAc;AAAA,EAAA;AAAA,EAEhB4D,aAAa;AAAA,IACX3B,OAAO;AAAA,IACP4B,eAAe;AAAA,IACf3B,YAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd4B,UAAU;AAAA,IACRnD,SAAS;AAAA,IACTiB,YAAY;AAAA,IACZb,KAAK;AAAA,IACLC,IAAI;AAAA,IACJ+C,IAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAONC,kBAAkB;AAAA,IAChB5C,QAAQ;AAAA,IACRC,YAAY;AAAA,IACZrB,cAAc;AAAA,IACd+D,IAAI;AAAA,IACJE,IAAI;AAAA,IACJ/D,YAAY;AAAA,IACZ,WAAW;AAAA,MACTH,SAAS;AAAA,IAAA;AAAA,IAEX,mBAAmB;AAAA,MACjBwB,SAAS;AAAA,MACTC,cAAc;AAAA,MACdC,eAAe;AAAA,IAAA;AAAA,EACjB;AAAA,EAEFyC,YAAY;AAAA,IACVjC,OAAO;AAAA,IACPC,YAAY;AAAA,EAAA;AAAA,EAEdiC,YAAY;AAAA,IACVlC,OAAO;AAAA,IACPI,oBAAoB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxB;ACtSO,SAAA+B,GAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAqB;AAAA,IAAAnC,OAAAA;AAAAA,IAAAoC,UAAAA;AAAAA,IAAAvC,OAAAA;AAAAA,IAAAwC,MAAAC;AAAAA,EAAAA,IAAAL,GAI1BI,IAAAC,MAAAC,SAAA,UAAAD,GAEAE,IAAYJ,IAAW,IAAKpC,IAAQoC,IAAY,MAApC,GAKDK,IAAApE,EAAMd,IAAK8E,CAAI,GAEhBK,IAAArE,EAAML,QAASqE,CAAI,GACPM,IAAA,GAAGH,CAAG;AAAG,MAAAI;AAAA,EAAAV,EAAA,CAAA,MAAArC,KAAAqC,SAAAS,KAAlBC,IAAA;AAAA,IAAAnE,OAASkE;AAAAA,IAASE,iBAAmBhD;AAAAA,EAAAA,GAAOqC,OAAArC,GAAAqC,OAAAS,GAAAT,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAY;AAAA,EAAAZ,EAAA,CAAA,MAAAQ,KAAAR,SAAAU,KAFrDE,sBAACC,GAAA,EACK,IAAAL,GACG,OAAAE,GAIO,iBAAA,QAAM,GACpBV,OAAAQ,GAAAR,OAAAU,GAAAV,OAAAY,KAAAA,IAAAZ,EAAA,CAAA;AAAA,MAAAc;AAAA,SAAAd,EAAA,CAAA,MAAAG,KAAAH,SAAAO,KAAAP,EAAA,CAAA,MAAAY,KARJE,sBAACD,GAAA,EAAQ,IAAAN,GAA6BJ,aAAAA,GACpCS,UAAAA,GAQF,GAAMZ,OAAAG,GAAAH,OAAAO,GAAAP,OAAAY,GAAAZ,OAAAc,KAAAA,IAAAd,EAAA,CAAA,GATNc;AASM;ACbH,SAAAC,GAAAhB,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA2B;AAAA,IAAAzC,MAAAA;AAAAA,IAAAwD,aAAAA;AAAAA,IAAAlD,OAAAA;AAAAA,IAAAoC,UAAAA;AAAAA,IAAAvC,OAAAA;AAAAA,IAAAsD,WAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAhB,MAAAA;AAAAA,EAAAA,IAAAJ;AAUT,MAAAK;AAAA,EAAAJ,EAAA,CAAA,MAAAxC,KAAAwC,SAAAmB,KACLf,IAAAgB,CAAAA,MAAA;AAChB,KAAIA,EAACC,QAAS,WAAWD,EAACC,QAAS,SACjCD,EAACE,eAAAA,GACDH,EAAS3D,CAAI;AAAA,EACd,GACFwC,OAAAxC,GAAAwC,OAAAmB,GAAAnB,OAAAI,KAAAA,IAAAJ,EAAA,CAAA;AALD,QAAAuB,IAAkBnB;AAKjB,MAAAG;AAAA,EAAAP,EAAA,CAAA,MAAAxC,KAAAwC,SAAAmB,KAMYZ,IAAAA,MAAMY,EAAS3D,CAAI,GAACwC,OAAAxC,GAAAwC,OAAAmB,GAAAnB,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAMxB,QAAAQ,IAAAQ,KAAAxD;AAAmB,MAAAiD;AAAA,EAAAT,SAAAQ,KADtBC,sBAACe,GAAA,EAAmB,SAAA,SAAY,IAAArF,EAAMqB,MACnCgD,UAAAA,EAAAA,CACH,GAAaR,OAAAQ,GAAAR,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAU;AAAA,EAAAV,EAAA,CAAA,MAAAiB,KAAAjB,SAAAlC,KAEV4C,IAAAO,EAAUnD,CAAK,GAACkC,OAAAiB,GAAAjB,OAAAlC,GAAAkC,QAAAU,KAAAA,IAAAV,EAAA,EAAA;AAAA,MAAAY;AAAA,EAAAZ,UAAAU,KADnBE,sBAACY,GAAA,EAAmB,SAAA,SAAY,IAAArF,EAAM2B,OACnC4C,UAAAA,EAAAA,CACH,GAAaV,QAAAU,GAAAV,QAAAY,KAAAA,IAAAZ,EAAA,EAAA;AAAA,MAAAc;AAAA,EAAAd,EAAA,EAAA,MAAAS,KAAAT,UAAAY,KANfE,sBAACD,GAAA,EAAQ,IAAA1E,EAAMiB,WACbqD,UAAAA;AAAAA,IAAAA;AAAAA,IAGAG;AAAAA,EAAAA,GAGF,GAAMZ,QAAAS,GAAAT,QAAAY,GAAAZ,QAAAc,KAAAA,IAAAd,EAAA,EAAA;AAAA,MAAAyB;AAAA,EAAAzB,EAAA,EAAA,MAAArC,KAAAqC,EAAA,EAAA,MAAAE,KAAAF,EAAA,EAAA,MAAAG,KAAAH,UAAAlC,KACN2D,IAAA,gBAAAC,EAAC5B,IAAA,EACQhC,OAAAA,GACGoC,UAAAA,GACHvC,OAAAA,GACDwC,MAAAA,GAAI,GACVH,QAAArC,GAAAqC,QAAAE,GAAAF,QAAAG,GAAAH,QAAAlC,GAAAkC,QAAAyB,KAAAA,IAAAzB,EAAA,EAAA;AAAA,MAAA2B;AAAA,SAAA3B,EAAA,EAAA,MAAAuB,KAAAvB,EAAA,EAAA,MAAAkB,KAAAlB,EAAA,EAAA,MAAAO,KAAAP,EAAA,EAAA,MAAAc,KAAAd,UAAAyB,KArBJE,sBAACd,GAAA,EACM,MAAA,UACSK,mBACJ,UAAA,GACD,SAAAX,GACEgB,cACP,IAAApF,EAAMU,WAEViE,UAAAA;AAAAA,IAAAA;AAAAA,IAQAW;AAAAA,EAAAA,GAMF,GAAMzB,QAAAuB,GAAAvB,QAAAkB,GAAAlB,QAAAO,GAAAP,QAAAc,GAAAd,QAAAyB,GAAAzB,QAAA2B,KAAAA,IAAA3B,EAAA,EAAA,GAtBN2B;AAsBM;ACrCH,SAAAC,GAAA7B,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA0B;AAAA,IAAAzC,MAAAA;AAAAA,IAAAwD,aAAAA;AAAAA,IAAAa,QAAAA;AAAAA,IAAAC,QAAAA;AAAAA,IAAA5B,UAAAA;AAAAA,IAAAe,WAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAhB,MAAAA;AAAAA,EAAAA,IAAAJ;AAUT,MAAAK;AAAA,EAAAJ,EAAA,CAAA,MAAAxC,KAAAwC,SAAAmB,KACJf,IAAAgB,CAAAA,MAAA;AAChB,KAAIA,EAACC,QAAS,WAAWD,EAACC,QAAS,SACjCD,EAACE,eAAAA,GACDH,EAAS3D,CAAI;AAAA,EACd,GACFwC,OAAAxC,GAAAwC,OAAAmB,GAAAnB,OAAAI,KAAAA,IAAAJ,EAAA,CAAA;AALD,QAAAuB,IAAkBnB;AAKjB,MAAAG;AAAA,EAAAP,EAAA,CAAA,MAAAxC,KAAAwC,SAAAmB,KAMYZ,IAAAA,MAAMY,EAAS3D,CAAI,GAACwC,OAAAxC,GAAAwC,OAAAmB,GAAAnB,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAK1B,QAAAQ,IAAAQ,KAAAxD;AAAmB,MAAAiD;AAAA,EAAAT,SAAAQ,KADtBC,sBAACe,GAAA,EAAmB,SAAA,SAAY,IAAArF,EAAM0B,WACnC2C,UAAAA,EAAAA,CACH,GAAaR,OAAAQ,GAAAR,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAU;AAAA,MAAAV,SAAA8B,KAAA9B,EAAA,CAAA,MAAAiB,KAAAjB,EAAA,EAAA,MAAAE,KAAAF,EAAA,EAAA,MAAAxC,KAAAwC,UAAAG,KAAAH,EAAA,EAAA,MAAA6B,GAAA;AAAA,QAAAjB;AAAA,IAAAZ,EAAA,EAAA,MAAA8B,KAAA9B,EAAA,EAAA,MAAAiB,KAAAjB,EAAA,EAAA,MAAAE,KAAAF,EAAA,EAAA,MAAAxC,KAAAwC,UAAAG,KACDS,IAAAA,CAAAmB,GAAAC,wBAITnB,GAAA,EAAoC,IAAA1E,EAAM+B,aACzC,UAAA;AAAA,MAAA,gBAAAwD,EAACb,GAAA,EAAQ,IAAA1E,EAAMgC,mBACb,4BAAC2B,IAAA,EACQiC,OAAAA,GACG7B,UAAAA,GACH,OAAA4B,EAAOE,CAAC,KAAR,IACD7B,MAAAA,MAEV;AAAA,MACA,gBAAAuB,EAACF,KAAmB,SAAA,SAAY,IAAArF,EAAM2B,OACnCmD,UAAAA,EAAUc,CAAC,EAAA,CACd;AAAA,IAAA,EAAA,GAXQ,GAAGvE,CAAI,WAAWwE,CAAC,EAY7B,GACDhC,QAAA8B,GAAA9B,QAAAiB,GAAAjB,QAAAE,GAAAF,QAAAxC,GAAAwC,QAAAG,GAAAH,QAAAY,KAAAA,IAAAZ,EAAA,EAAA,GAjBAU,IAAAmB,EAAMI,IAAKrB,CAiBX,GAACZ,OAAA8B,GAAA9B,OAAAiB,GAAAjB,QAAAE,GAAAF,QAAAxC,GAAAwC,QAAAG,GAAAH,QAAA6B,GAAA7B,QAAAU;AAAAA,EAAA;AAAAA,IAAAA,IAAAV,EAAA,EAAA;AAAA,MAAAY;AAAA,SAAAZ,EAAA,EAAA,MAAAuB,KAAAvB,EAAA,EAAA,MAAAkB,KAAAlB,EAAA,EAAA,MAAAO,KAAAP,EAAA,EAAA,MAAAS,KAAAT,UAAAU,KA5BJE,sBAACC,GAAA,EACM,MAAA,UACSK,mBACJ,UAAA,GACD,SAAAX,GACEgB,cACP,IAAApF,EAAMoB,UAEVkD,UAAAA;AAAAA,IAAAA;AAAAA,IAGCC;AAAAA,EAAAA,GAkBH,GAAMV,QAAAuB,GAAAvB,QAAAkB,GAAAlB,QAAAO,GAAAP,QAAAS,GAAAT,QAAAU,GAAAV,QAAAY,KAAAA,IAAAZ,EAAA,EAAA,GA7BNY;AA6BM;ACpDH,SAAAsB,GAAAnC,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA4B;AAAA,IAAA4B,QAAAA;AAAAA,IAAAC,QAAAA;AAAAA,IAAA5B,UAAAA;AAAAA,IAAAC,MAAAC;AAAAA,EAAAA,IAAAL,GAIjCI,IAAAC,MAAAC,SAAA,UAAAD;AAAc,MAAA+B;AAAA,MAAAnC,SAAA6B,GAAA;AAKdM,IAAAA,IAA0B,CAAA;AAExB,QAAAC,IAAU;AACV,eAAKL,KAAWF;AACdM,MAAAA,EAAOE,KAAMD,CAAG,GAChBA,IAAAA,IAAOL;AACR/B,IAAAA,OAAA6B,GAAA7B,OAAAmC;AAAAA,EAAA;AAAAA,IAAAA,IAAAnC,EAAA,CAAA;AAGQ,QAAAO,IAAApE,EAAMd,IAAK8E,CAAI;AAAC,MAAAK;AAAA,MAAAR,EAAA,CAAA,MAAA8B,KAAA9B,EAAA,CAAA,MAAAE,KAAAF,EAAA,CAAA,MAAAmC,KAAAnC,EAAA,CAAA,MAAAG,KAAAH,SAAA6B,GAAA;AAAA,QAAApB;AAAA,IAAAT,EAAA,CAAA,MAAA8B,KAAA9B,EAAA,CAAA,MAAAE,KAAAF,EAAA,EAAA,MAAAmC,KAAAnC,UAAAG,KACXM,IAAAA,CAAA6B,GAAAN,MAAA;AACV,UAAID,KAAK;AAAC,eAAS;AACnB,YAAAQ,IAAgBrC,IAAW,IAAKiC,EAAQH,CAAC,IAAK9B,IAAY,MAA1C,GAChBI,IAAYJ,IAAW,IAAK6B,IAAI7B,IAAY,MAAhC;AAAuC,+BAEhDW,GAAA,EAKK,IAAA1E,EAAMH,eAAgBmE,CAAI,GACvB,OAAA;AAAA,QAAAqC,MACC,GAAGD,CAAO;AAAA,QAAGhG,OACZ,GAAG+D,CAAG;AAAA,QAAGK,iBACCmB,EAAOE,CAAC,KAAR;AAAA,MAAA,GAEL,iBAAA,UAPT,OAAOF,EAAOE,CAAC,KAAR,MAAmB,IAAIA,CAAC,EAOhB;AAAA,IACpB,GAELhC,OAAA8B,GAAA9B,OAAAE,GAAAF,QAAAmC,GAAAnC,QAAAG,GAAAH,QAAAS,KAAAA,IAAAT,EAAA,EAAA,GAnBAQ,IAAAqB,EAAMI,IAAKxB,CAmBX,GAACT,OAAA8B,GAAA9B,OAAAE,GAAAF,OAAAmC,GAAAnC,OAAAG,GAAAH,OAAA6B,GAAA7B,OAAAQ;AAAAA,EAAA;AAAAA,IAAAA,IAAAR,EAAA,CAAA;AAAA,MAAAS;AAAA,SAAAT,EAAA,EAAA,MAAAG,KAAAH,UAAAO,KAAAP,EAAA,EAAA,MAAAQ,KApBJC,sBAACI,GAAA,EAAQ,IAAAN,GAA6BJ,aAAAA,GACnCK,UAAAA,GAoBH,GAAMR,QAAAG,GAAAH,QAAAO,GAAAP,QAAAQ,GAAAR,QAAAS,KAAAA,IAAAT,EAAA,EAAA,GArBNS;AAqBM;AC3BH,SAAAgC,GAAA1C,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA4B;AAAA,IAAAzC,MAAAA;AAAAA,IAAAwD,aAAAA;AAAAA,IAAAa,QAAAA;AAAAA,IAAAC,QAAAA;AAAAA,IAAAY,aAAAA;AAAAA,IAAAzB,WAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAhB,MAAAA;AAAAA,EAAAA,IAAAJ;AAUT,MAAAK;AAAA,EAAAJ,EAAA,CAAA,MAAAxC,KAAAwC,SAAAmB,KACNf,IAAAgB,CAAAA,MAAA;AAChB,KAAIA,EAACC,QAAS,WAAWD,EAACC,QAAS,SACjCD,EAACE,eAAAA,GACDH,EAAS3D,CAAI;AAAA,EACd,GACFwC,OAAAxC,GAAAwC,OAAAmB,GAAAnB,OAAAI,KAAAA,IAAAJ,EAAA,CAAA;AALD,QAAAuB,IAAkBnB;AAKjB,MAAAuC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAzC,GAAAC,GAAAC,GAAAC,GAAAE,GAAAE,GAAAW,GAAAE,GAAAsB;AAAA,MAAAjD,EAAA,CAAA,MAAAgB,KAAAhB,EAAA,CAAA,MAAAiB,KAAAjB,EAAA,CAAA,MAAAuB,KAAAvB,SAAAxC,KAAAwC,EAAA,CAAA,MAAAmB,KAAAnB,EAAA,CAAA,MAAAkB,KAAAlB,EAAA,CAAA,MAAA6B,GAAA;AACDoB,IAAAA,IAAcpB,EAAMqB,OAAQC,IAAiB,CAAC,GAE3CN,IAAAhC,GACMC,IAAA,UACSI,IAAAA,GACJS,IAAA,GAAC3B,EAAA,EAAA,MAAAxC,KAAAwC,UAAAmB,KACF2B,IAAAA,MAAM3B,EAAS3D,CAAI,GAACwC,QAAAxC,GAAAwC,QAAAmB,GAAAnB,QAAA8C,KAAAA,IAAA9C,EAAA,EAAA,GAClBuB,IAAAA,GACPyB,IAAA7G,EAAMkC,YAETuE,IAAA/B,GAAQH,IAAAvE,EAAMmC;AAEV,UAAA8E,IAAApC,KAAAxD;AAAmB,IAAAwC,UAAAoD,KADtBxC,IAAA,gBAAAc,EAACF,KAAmB,SAAA,SAAY,IAAArF,EAAM0B,WACnCuF,UAAAA,EAAAA,CACH,GAAapD,QAAAoD,GAAApD,QAAAY,KAAAA,IAAAZ,EAAA,EAAA,GACZ2C,IAAAnB,GAAmBjB,IAAA,SAAYC,IAAArE,EAAMoC,cACnCkC,IAAAQ,EAAUgC,CAAK,GAACjD,OAAAgB,GAAAhB,OAAAiB,GAAAjB,OAAAuB,GAAAvB,OAAAxC,GAAAwC,OAAAmB,GAAAnB,OAAAkB,GAAAlB,OAAA6B,GAAA7B,QAAA2C,GAAA3C,QAAA4C,GAAA5C,QAAA6C,GAAA7C,QAAA8C,GAAA9C,QAAA+C,GAAA/C,QAAAgD,GAAAhD,QAAAO,GAAAP,QAAAQ,GAAAR,QAAAS,GAAAT,QAAAU,GAAAV,QAAAY,GAAAZ,QAAAc,GAAAd,QAAAyB,GAAAzB,QAAA2B,GAAA3B,QAAAiD;AAAAA,EAAA;AAAAN,IAAAA,IAAA3C,EAAA,EAAA,GAAA4C,IAAA5C,EAAA,EAAA,GAAA6C,IAAA7C,EAAA,EAAA,GAAA8C,IAAA9C,EAAA,EAAA,GAAA+C,IAAA/C,EAAA,EAAA,GAAAgD,IAAAhD,EAAA,EAAA,GAAAO,IAAAP,EAAA,EAAA,GAAAQ,IAAAR,EAAA,EAAA,GAAAS,IAAAT,EAAA,EAAA,GAAAU,IAAAV,EAAA,EAAA,GAAAY,IAAAZ,EAAA,EAAA,GAAAc,IAAAd,EAAA,EAAA,GAAAyB,IAAAzB,EAAA,EAAA,GAAA2B,IAAA3B,EAAA,EAAA,GAAAiD,IAAAjD,EAAA,EAAA;AAAA,MAAAoD;AAAA,EAAApD,EAAA,EAAA,MAAA2C,KAAA3C,EAAA,EAAA,MAAAO,KAAAP,EAAA,EAAA,MAAAQ,KAAAR,UAAAS,KADnB2C,sBAACT,GAAA,EAAmB,SAAApC,GAAY,IAAAC,GAC7BC,UAAAA,GACH,GAAaT,QAAA2C,GAAA3C,QAAAO,GAAAP,QAAAQ,GAAAR,QAAAS,GAAAT,QAAAoD,KAAAA,IAAApD,EAAA,EAAA;AAAA,MAAAqD;AAAA,EAAArD,EAAA,EAAA,MAAA4C,KAAA5C,EAAA,EAAA,MAAAoD,KAAApD,EAAA,EAAA,MAAAU,KAAAV,UAAAY,KANfyC,sBAACT,GAAA,EAAQ,IAAAlC,GACPE,UAAAA;AAAAA,IAAAA;AAAAA,IAGAwC;AAAAA,EAAAA,GAGF,GAAMpD,QAAA4C,GAAA5C,QAAAoD,GAAApD,QAAAU,GAAAV,QAAAY,GAAAZ,QAAAqD,KAAAA,IAAArD,EAAA,EAAA;AAAA,MAAAsD;AAAA,EAAAtD,EAAA,EAAA,MAAA8B,KAAA9B,EAAA,EAAA,MAAAG,KAAAH,EAAA,EAAA,MAAAiD,KAAAjD,UAAA6B,KACNyB,sBAACpB,IAAA,EACSL,QAAAA,GACAC,QAAAA,GACEmB,UAAAA,GACJ9C,MAAAA,GAAI,GACVH,QAAA8B,GAAA9B,QAAAG,GAAAH,QAAAiD,GAAAjD,QAAA6B,GAAA7B,QAAAsD,KAAAA,IAAAtD,EAAA,EAAA;AAAA,MAAAuD;AAAA,MAAAvD,EAAA,EAAA,MAAAiB,KAAAjB,UAAA0C,KAAA1C,EAAA,EAAA,MAAA6B,GAAA;AAAA,QAAA2B;AAAA,IAAAxD,EAAA,EAAA,MAAAiB,KAAAjB,UAAA0C,KAEYc,IAAAA,CAAAzB,GAAAC,MAEV,gBAAAN,EAACF,GAAA,EAES,SAAA,SACJ,IAAArF,EAAMyC,sBAET,UAAA,GAAG8D,EAAYV,CAAC,KAAb,UAA4BA,IAAI,CAAC,EAAE,KAAKf,EAAUc,CAAC,CAAC,GAAA,GAJnD,aAAaW,EAAYV,CAAC,KAAb,UAA4BA,CAAC,EAAE,EAKnD,GACDhC,QAAAiB,GAAAjB,QAAA0C,GAAA1C,QAAAwD,KAAAA,IAAAxD,EAAA,EAAA,GATAuD,IAAA1B,EAAMI,IAAKuB,CASX,GAACxD,QAAAiB,GAAAjB,QAAA0C,GAAA1C,QAAA6B,GAAA7B,QAAAuD;AAAAA,EAAA;AAAAA,IAAAA,IAAAvD,EAAA,EAAA;AAAA,MAAAwD;AAAA,EAAAxD,UAAAuD,KAVJC,sBAAC3C,GAAA,EAAQ,IAAA1E,EAAMqC,kBACZ+E,UAAAA,GAUH,GAAMvD,QAAAuD,GAAAvD,QAAAwD,KAAAA,IAAAxD,EAAA,EAAA;AAAA,MAAAyD;AAAA,SAAAzD,EAAA,EAAA,MAAA6C,KAAA7C,UAAA8C,KAAA9C,EAAA,EAAA,MAAA+C,KAAA/C,UAAAgD,KAAAhD,EAAA,EAAA,MAAAqD,KAAArD,UAAAsD,KAAAtD,EAAA,EAAA,MAAAwD,KAAAxD,EAAA,EAAA,MAAAc,KAAAd,EAAA,EAAA,MAAAyB,KAAAzB,UAAA2B,KAjCR8B,IAAA,gBAAAC,EAACb,GAAA,EACM,MAAA/B,GACSI,mBACJ,UAAAS,GACD,SAAAmB,GACEvB,WAAAA,GACP,IAAAyB,GAEJK,UAAAA;AAAAA,IAAAA;AAAAA,IAQAC;AAAAA,IAMAE;AAAAA,EAAAA,GAYF,GAAMxD,QAAA6C,GAAA7C,QAAA8C,GAAA9C,QAAA+C,GAAA/C,QAAAgD,GAAAhD,QAAAqD,GAAArD,QAAAsD,GAAAtD,QAAAwD,GAAAxD,QAAAc,GAAAd,QAAAyB,GAAAzB,QAAA2B,GAAA3B,QAAAyD,KAAAA,IAAAzD,EAAA,EAAA,GAlCNyD;AAkCM;AArDH,SAAAN,GAAAQ,GAAAC,GAAA;AAAA,SAiBiCD,IAAIC;AAAC;AC7BtC,SAAAC,GAAA9D,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA0B;AAAA,IAAA6D,aAAAA;AAAAA,IAAAlE,YAAAQ;AAAAA,IAAA2D,iBAAAxD;AAAAA,IAAAyD,WAAAA;AAAAA,IAAAC,cAAAzD;AAAAA,EAAAA,IAAAT,GAE/BH,IAAAQ,MAAAC,SAAA,WAAAD,GACA2D,IAAAxD,MAAAF,SAAA,YAAAE,GAEA0D,IAAAzD,MAAAH,SAAA,aAAAG;AAAyB,MAAAC;AAAA,EAAAT,EAAA,CAAA,MAAA8D,KAAA9D,SAAA+D,KAEPtD,IAAAsD,EAAeG,QAAS,WAAWC,OAAOL,CAAW,CAAC,GAAC9D,OAAA8D,GAAA9D,OAAA+D,GAAA/D,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAzE,QAAAoE,IAAkB3D;AAAuD,MAAAC;AAAA,EAAAV,SAAAoE,KAGvE1D,sBAACc,GAAA,EAAmB,SAAA,SAAY,IAAArF,EAAM0D,yBAEtC,GAAaG,OAAAoE,GAAApE,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAHf,QAAAqE,IACE3D;AAKF,MAAI,CAACsD,GAAS;AAAA,QAAApD;AAAA,IAAAZ,SAAAJ,KAGRgB,sBAACY,GAAA,EAAmB,SAAA,SAAY,IAAArF,EAAMyD,yBAEtC,GAAaI,OAAAJ,GAAAI,OAAAY,KAAAA,IAAAZ,EAAA,CAAA;AAAA,QAAAc;AAAA,WAAAd,EAAA,CAAA,MAAAqE,KAAArE,SAAAY,KAHfE,sBAACD,GAAA,EAAQ,IAAA1E,EAAMqD,UACboB,UAAAA;AAAAA,MAAAA;AAAAA;OAIF,GAAMZ,OAAAqE,GAAArE,OAAAY,GAAAZ,OAAAc,KAAAA,IAAAd,EAAA,CAAA,GALNc;AAAAA,EAKM;AAET,MAAAF;AAAA,EAAAZ,UAAAgE,KAEiBpD,IAAAQ,CAAAA,MAAA;AAChB,KAAIA,EAACC,QAAS,WAAWD,EAACC,QAAS,SACjCD,EAACE,eAAAA,GACD0C,EAAAA;AAAAA,EACD,GACFhE,QAAAgE,GAAAhE,QAAAY,KAAAA,IAAAZ,EAAA,EAAA;AALD,QAAAuB,IAAkBX;AAKjB,MAAAE;AAAA,EAAAd,EAAA,EAAA,MAAAsE,uBAAAC,IAAA,2BAAA,KAaWzD,IAAA;AAAA,IAAA,GAAK3E,EAAMyD;AAAAA,IAAW,GAAKzD,EAAMuD;AAAAA,EAAAA,GAAmBM,QAAAc,KAAAA,IAAAd,EAAA,EAAA;AAAA,MAAAyB;AAAA,EAAAzB,EAAA,EAAA,MAAAuB,KAAAvB,UAAAgE,KAAAhE,EAAA,EAAA,MAAAJ,KAP1D6B,sBAACD,GAAA,EACS,SAAA,SACE,WAAA,QACL,MAAA,UACK,UAAA,GACDwC,YACEzC,WAAAA,GACP,IAAAT,gBAGN,GAAad,QAAAuB,GAAAvB,QAAAgE,GAAAhE,QAAAJ,GAAAI,QAAAyB,KAAAA,IAAAzB,EAAA,EAAA;AAAA,MAAA2B;AAAA,EAAA3B,EAAA,EAAA,MAAAiE,KAAAjE,UAAAyB,KAXfE,IAAA,gBAAAD,EAAC8C,IAAA,EAAeP,OAAAA,GACdxC,UAAAA,GAWF,GAAUzB,QAAAiE,GAAAjE,QAAAyB,GAAAzB,QAAA2B,KAAAA,IAAA3B,EAAA,EAAA;AAAA,MAAA8C;AAAA,SAAA9C,EAAA,EAAA,MAAAqE,KAAArE,UAAA2B,KAbZmB,sBAACjC,GAAA,EAAQ,IAAA1E,EAAMqD,UACbmC,UAAAA;AAAAA,IAAAA;AAAAA;KAcF,GAAM3B,QAAAqE,GAAArE,QAAA2B,GAAA3B,QAAA8C,KAAAA,IAAA9C,EAAA,EAAA,GAfN8C;AAeM;AC5DH,SAAA2B,GAAA1E,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAwB;AAAA,IAAAyE,QAAAA;AAAAA,IAAAC,SAAAA;AAAAA,EAAAA,IAAA5E;AAC7B,MAAI2E,EAAME,WAAY;AAAC,WAAS;AAAI,MAAAxE;AAAA,MAAAJ,EAAA,CAAA,MAAA2E,KAAA3E,SAAA0E,GAAA;AAAA,QAAAnE;AAAA,IAAAP,SAAA2E,KAGpBpE,IAAAA,CAAAsE,GAAA7C,wBACTnB,GAAA,EAAqB,IAAA1E,EAAMiD,YAC1B,UAAA;AAAA,MAAA,gBAAAsC,EAACb,GAAA,EACK,IAAA1E,EAAMkD,WACH,OAAA;AAAA,QAAAsB,iBAAmBkE,EAAClH,SAAUgH,EAAQ3C,CAAC;AAAA,MAAA,GAAG;AAAA,MAEnD,gBAAAN,EAACF,KAAmB,SAAA,WAAc,IAAArF,EAAMmD,aACrCuF,YAACrH,KAAAA,CACJ;AAAA,IAAA,EAAA,GAPQqH,EAACrH,IAQX,GACDwC,OAAA2E,GAAA3E,OAAAO,KAAAA,IAAAP,EAAA,CAAA,GAVAI,IAAAsE,EAAMzC,IAAK1B,CAUX,GAACP,OAAA2E,GAAA3E,OAAA0E,GAAA1E,OAAAI;AAAAA,EAAA;AAAAA,IAAAA,IAAAJ,EAAA,CAAA;AAAA,MAAAO;AAAA,SAAAP,SAAAI,KAXJG,sBAACM,GAAA,EAAQ,IAAA1E,EAAM0C,QACZuB,UAAAA,GAWH,GAAMJ,OAAAI,GAAAJ,OAAAO,KAAAA,IAAAP,EAAA,CAAA,GAZNO;AAYM;ACpBV,MAAMuE,KAAoB,IASpBC,KAA8C;AAAA,EAAEzJ,OAAO;AAAA,EAAIO,QAAQ;AAAG,GACtEmJ,KAAgC;AA0FtC,SAASC,GAAoBC,GAAwC;AACnE,MAAI,CAACA,KAAQA,EAAKN,WAAW,UAAU,CAAA;AACvC,QAAMO,IAAcC,KAAKC,IAAIH,EAAKN,QAAQ,CAAC,GACrCU,wBAAcC,IAAAA,GACdC,IAAuB,CAAA;AAC7B,WAASX,IAAI,GAAGA,IAAIK,EAAKN,QAAQC,KAAK;AACpC,UAAMH,IAASQ,EAAKL,CAAC,KAAK,CAAA;AAC1B,eAAWY,KAAQf,GAAQ;AACzB,UAAIgB,IAAMJ,EAAQK,IAAIF,EAAKjI,IAAI;AAC/B,MAAKkI,MACHA,IAAM;AAAA,QACJlI,MAAMiI,EAAKjI;AAAAA,QACXqE,QAAQ,IAAI+D,MAAcT,CAAW,EAAEU,KAAK,CAAC;AAAA,QAC7CC,WAAW,IAAIF,MAA0BT,CAAW,EAAEU,KAAKxF,MAAS;AAAA,MAAA,GAEtEiF,EAAQS,IAAIN,EAAKjI,MAAMkI,CAAG,GAC1BF,EAAMnD,KAAKoD,EAAKjI,IAAI,IAEtBkI,EAAI7D,OAAOgD,CAAC,IAAIY,EAAK3H,OACrB4H,EAAII,UAAUjB,CAAC,IAAIY,EAAK9H;AAAAA,IAC1B;AAAA,EACF;AACA,SAAO6H,EAAMvD,IAAK+D,CAAAA,MAAMV,EAAQK,IAAIK,CAAC,CAAE;AACzC;AAiBO,SAAAC,GAAAlG,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAoB;AAAA,IAAAiF,MAAAA;AAAAA,IAAAgB,WAAAA;AAAAA,IAAAC,mBAAAA;AAAAA,IAAAlF,WAAAA;AAAAA,IAAAmF,gBAAAA;AAAAA,IAAA1B,QAAAA;AAAAA,IAAA2B,UAAAjG;AAAAA,IAAAkG,QAAAA;AAAAA,IAAAtC,WAAAA;AAAAA,IAAAuC,aAAAA;AAAAA,IAAApG,MAAAI;AAAAA,IAAAiG,SAAAhG;AAAAA,EAAAA,IAAAT,GAOzBsG,IAAAjG,MAAAC,SAAAyE,KAAA1E,GAIAD,IAAAI,MAAAF,SAAA,UAAAE,GACAiG,IAAAhG,MAAAH,SAAA,KAAAG,GAEAvB,IAAcwH,GAAAA,GACdC,IAAYzF,KAAAkC,IAEZwD,IAAqB,CAAC,CAACT,KAAaA,EAAStB,SAAU;AAAC,MAAAnE;AAAA,EAAAT,SAAAkG,KAE3BzF,IAAAyF,KAAA,CAAA,GAAelG,OAAAkG,GAAAlG,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAU;AAAA,EAAAV,SAAAS,KAApCC,IAAA,IAAIkG,IAAiBnG,CAAe,GAACT,OAAAS,GAAAT,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAD7C,QAAA6G,IACQnG;AAEP,MAAAE;AAAA,EAAAZ,EAAA,CAAA,MAAAmG,KAAAnG,SAAAkG,KAGCtF,IAAApD,CAAAA,MAAA;AACE,QAAI,CAAC2I;AAAiB;AACtB,UAAAW,IAAYZ,KAAA,CAAA,GACZa,IAAaD,EAAGE,SAAUxJ,CAET,IADbsJ,EAAG9J,OAAQiK,CAAAA,OAAOC,OAAM1J,CACX,IAFJ,CAAA,GAELsJ,GAAKtJ,CAAI;AACjB2I,IAAAA,EAAkBY,CAAI;AAAA,EAAC,GACxB/G,OAAAmG,GAAAnG,OAAAkG,GAAAlG,OAAAY,KAAAA,IAAAZ,EAAA,CAAA;AARH,QAAAmH,IAAevG,GAeXE,IAAA7B,EAAKC,QAAQkI,UAAUC;AAAK,MAAA5F;AAAA,EAAAzB,EAAA,CAAA,MAAAf,EAAAC,WACzBuC,IAAA6F,OAAMzF,OACN5C,EAAKC,QAA+DqI,aACjDC,QADpB,EAEF,GAACxH,EAAA,CAAA,IAAAf,EAAAC,SAAAc,OAAAyB,KAAAA,IAAAzB,EAAA,CAAA;AAAA,MAAA2B;AAAA,EAAA3B,EAAA,CAAA,MAAAyB,KAAAzB,EAAA,EAAA,MAAAf,EAAAC,QAAAkI,UAAAC,QALG1F,IAAA,CACJb,GAA4B,GACzBW,CAGF,GACFzB,OAAAyB,GAAAzB,QAAAf,EAAAC,QAAAkI,UAAAC,MAAArH,QAAA2B,KAAAA,IAAA3B,EAAA,EAAA;AAPH,QAAAyH,IACQ9F;AAQP,MAAAmB;AAAA,EAAA9C,EAAA,EAAA,MAAAyH,KAAAzH,UAAA0E,KAAA1E,EAAA,EAAA,MAAAf,EAAAC,QAAAkI,UAAAC,QAGCvE,IAAAA,CAAA4E,GAAAC,MAAA;AACE,QAAIA;AAAQ,aAASA;AACrB,UAAAC,IAAoBlD,IAASgD,CAAW,GAAQ/J;AAChD,WAAIiK,MAEFH,EAAcC,IAAcD,EAAa7C,MAAO,KAChD3F,EAAKC,QAAQkI,UAAUC;AAAAA,EAAK,GAE/BrH,QAAAyH,GAAAzH,QAAA0E,GAAA1E,QAAAf,EAAAC,QAAAkI,UAAAC,MAAArH,QAAA8C,KAAAA,IAAA9C,EAAA,EAAA;AATH,QAAA2E,IAAgB7B,GAgBhB+E,IAAiB5I,EAAKC,QAAQ4I,OAAOC;AAAS,MAAAhF;AAAA,EAAA/C,UAAAkF,KAEhBnC,IAAAkC,GAAoBC,CAAI,GAAClF,QAAAkF,GAAAlF,QAAA+C,KAAAA,IAAA/C,EAAA,EAAA;AAAvD,QAAAsF,IAA8BvC;AAAkC,MAAAC;AAAAgF,EAAAA,GAAA;AAG9D,QAAI,OAAOzB,KAAgB,YAAYA,IAAc,GAAC;AAAEvD,MAAAA,IAAOuD;AAAP,YAAAyB;AAAAA,IAAkB;AAC1E,QAAAC,IAAQ;AACR,eAAKvC,KAAaJ;AAChB,iBAAKvD,KAAW2D,EAAG7D;AAAS,QAAIE,IAAIkG,MAAGA,IAAIlG;AAE7CiB,IAAAA,IAAOiF;AAAAA,EAAC;AANV,QAAA/H,IAAiB8C,GAmBjBkF,IAAmB7B,MAAa,GAyBhC8B,KAAoBC,GAAO,EAAK,GAChC,CAAAC,IAAAC,EAAA,IAA0CC,GAAwB,IAAI;AAAC,MAAAnF;AAAA,EAAApD,UAAAkI,KAErE9E,IAAAoF,CAAAA,MAAA;AAGE,QAFI,CAACA,KACDL,GAAWM,WACXP;AAAU;AACd,UAAAQ,IAAUF,EAAIG;AACd,IAAID,IAAI,MACNP,GAAWM,UAAW,IACtBH,GAAiBI,CAAC;AAAA,EACnB,GACF1I,QAAAkI,GAAAlI,QAAAoD,KAAAA,IAAApD,EAAA,EAAA;AAVH,QAAA4I,KAAwBxF;AAcxB,MAAIkC,EAAOV,WAAY;AAAC,WAAS;AAAI,MAAAvB;AAAA,EAAArD,UAAAqG,KAGnChD,KAAA,OAAOgD,KAAa,YAAYwC,OAAMC,SAAUzC,CAAQ,KAAKA,IAAW,GAACrG,QAAAqG,GAAArG,QAAAqD,MAAAA,KAAArD,EAAA,EAAA;AAD3E,QAAA+I,KACE1F;AAAyE,MAAAC;AAAA,EAAAtD,EAAA,EAAA,MAAAsF,KAAAtF,UAAA+I,MAAA/I,EAAA,EAAA,MAAAqG,KAC3D/C,KAAAyF,KAASzD,EAAO0D,MAAO,GAAG3C,CAAkB,IAA5Cf,GAA6CtF,QAAAsF,GAAAtF,QAAA+I,IAAA/I,QAAAqG,GAAArG,QAAAsD,MAAAA,KAAAtD,EAAA,EAAA;AAA7D,QAAAiJ,KAAgB3F,IAChBQ,KAAoBiF,KAASzD,EAAOV,SAAUqE,GAAOrE,SAAjC,GAEpBsE,IAAgBhE,EAAIN,SAAU,GAC9BuE,KAAkBD,KAAA,CAAY,CAACxE,KAAUA,EAAME,SAAU,GAOzDwE,KAAwBlB,IACnBG,MAAiBtD,GAAc5E,CAAI,IAAI6E,KADpB3E;AAEX,MAAAkD;AAAA,EAAAvD,UAAAkI,KAMH3E,IAAA2E,IAAA;AAAA,IAAA,GAAkB/L,EAAMK;AAAAA,IAAK,GAAKL,EAAMQ;AAAAA,EAAAA,IAAgBR,EAAMK,MAAKwD,QAAAkI,GAAAlI,QAAAuD,KAAAA,IAAAvD,EAAA,EAAA;AAAA,MAAAwD;AAAA,EAAAxD,UAAAoJ,MAErE5F,IAAA4F,OAAoB/I,SAApB;AAAA,IAAAgJ,WACiBD;AAAAA,IAAeE,WAAa;AAAA,EAAA,IAD7CjJ,QAEaL,QAAAoJ,IAAApJ,QAAAwD,KAAAA,IAAAxD,EAAA,EAAA;AAAA,MAAAyD;AAAA,MAAAzD,UAAA2E,KAAA3E,EAAA,EAAA,MAAA6H,KAAA7H,EAAA,EAAA,MAAA0G,KAAA1G,EAAA,EAAA,MAAA2G,KAAA3G,EAAA,EAAA,MAAAkJ,KAAAlJ,EAAA,EAAA,MAAAoG,KAAApG,UAAAE,KAAAF,EAAA,EAAA,MAAA6G,KAAA7G,EAAA,EAAA,MAAA0E,KAAA1E,EAAA,EAAA,MAAAG,KAAAH,EAAA,EAAA,MAAAwG,KAAAxG,UAAAmH,KAAAnH,EAAA,EAAA,MAAAiJ,IAAA;AAAA,QAAAM;AAAA,IAAAvJ,UAAA2E,KAAA3E,EAAA,EAAA,MAAA6H,KAAA7H,EAAA,EAAA,MAAA0G,KAAA1G,UAAA2G,KAAA3G,EAAA,EAAA,MAAAkJ,KAAAlJ,EAAA,EAAA,MAAAoG,KAAApG,EAAA,EAAA,MAAAE,KAAAF,UAAA6G,KAAA7G,EAAA,EAAA,MAAA0E,KAAA1E,EAAA,EAAA,MAAAG,KAAAH,UAAAwG,KAAAxG,EAAA,EAAA,MAAAmH,KAGFoC,IAAAC,CAAAA,MAAA;AACX,YAAAtI,IAAiB2F,EAAY4C,IAAK/D,EAAGlI,IAAK,GAC1CkM,KAAe/C,KAAA,CAAiBzF,GAChCF,KAAoBoF,IAChBA,EAAeV,EAAGlI,IACV,IAFQ6C,QAOpBwF,KAAa7D,QACX0H,KAAA7B,IAAoBlD,EAAQ3C,IAAG0D,EAAGI,UAAW9D,EAAC,CAAC;AACjD,aAAIkH,IACE1C,sBAaC/D,IAAA,EAEO,MAAAiD,EAAGlI,MACIwD,aAAAA,IACL,QAAA0E,EAAG7D,QACH,QAAA6D,EAAG7D,OAAOI,IAAK,CAAA0H,IAAAC,OAAU/D,GAAK7D,EAAC,CAAC,GAC3B,aAAA0C,GAAMzC,IAAM4H,EAAmB,KAA/B,CAAA,GACFnD,WAAAA,GACDxF,UAAAA,GACAiG,aACJhH,MAAAA,EAAAA,GATDgE,OAAOuB,EAAGlI,IAAK,CASV,IAKd,gBAAAkE,EAACE,IAAA,EAEO,MAAA8D,EAAGlI,MACIwD,aAAAA,IACL,QAAA0E,EAAG7D,QACH,QAAA6D,EAAG7D,OAAOI,IAAK,CAAA6H,IAAAC,OAAUlE,GAAK7D,EAAC,CAAC,GAC9B9B,UAAAA,GACCwG,cACDxF,UAAAA,GACAiG,aACJhH,MAAAA,EAAAA,GATDgE,OAAOuB,EAAGlI,IAAK,CASV,IAKd,gBAAAkE,EAACX,IAAA,EAEO,MAAA2E,EAAGlI,MACIwD,aAAAA,IACN,OAAA0E,EAAG7D,OAAO,CAAA,KAAV,GACG3B,UAAAA,GACH,OAAA2F,GAAK,CAAC,GACFa,WAAAA,GACDxF,UAAAA,GACAiG,UAAAA,GACJhH,MAAAA,EAAAA,GATDgE,OAAOuB,EAAGlI,IAAK,CASV;AAAA,IACV,GAELwC,QAAA2E,GAAA3E,QAAA6H,GAAA7H,QAAA0G,GAAA1G,QAAA2G,GAAA3G,QAAAkJ,GAAAlJ,QAAAoG,GAAApG,QAAAE,GAAAF,QAAA6G,GAAA7G,QAAA0E,GAAA1E,QAAAG,GAAAH,QAAAwG,GAAAxG,QAAAmH,GAAAnH,QAAAuJ,KAAAA,IAAAvJ,EAAA,EAAA,GArEAyD,IAAAwF,GAAOhH,IAAKsH,CAqEZ,GAACvJ,QAAA2E,GAAA3E,QAAA6H,GAAA7H,QAAA0G,GAAA1G,QAAA2G,GAAA3G,QAAAkJ,GAAAlJ,QAAAoG,GAAApG,QAAAE,GAAAF,QAAA6G,GAAA7G,QAAA0E,GAAA1E,QAAAG,GAAAH,QAAAwG,GAAAxG,QAAAmH,GAAAnH,QAAAiJ,IAAAjJ,QAAAyD;AAAAA,EAAA;AAAAA,IAAAA,IAAAzD,EAAA,EAAA;AAAA,MAAAuJ;AAAA,EAAAvJ,EAAA,EAAA,MAAA8D,MAAA9D,UAAAsG,GAAA0D,SAAAhK,EAAA,EAAA,MAAAsG,GAAAzG,cAAAG,EAAA,EAAA,MAAAsG,GAAA2D,WAAAjK,EAAA,EAAA,MAAAgE,KACDuF,IAAAzF,KAAc,KACb,gBAAApC,EAACmC,IAAA,EACcC,aAAAA,IACD,YAAAwC,GAAM0D,OACD,iBAAA1D,GAAMzG,YACT,cAAAyG,GAAM2D,SACTjG,WAAAA,GAAS,GAEvBhE,QAAA8D,IAAA9D,EAAA,EAAA,IAAAsG,GAAA0D,OAAAhK,EAAA,EAAA,IAAAsG,GAAAzG,YAAAG,EAAA,EAAA,IAAAsG,GAAA2D,SAAAjK,QAAAgE,GAAAhE,QAAAuJ,KAAAA,IAAAvJ,EAAA,EAAA;AAAA,MAAAkK;AAAA,EAAAlK,EAAA,EAAA,MAAA4I,MAAA5I,EAAA,EAAA,MAAAuD,KAAAvD,EAAA,EAAA,MAAAwD,KAAAxD,EAAA,EAAA,MAAAyD,KAAAzD,UAAAuJ,KAvFHW,sBAACrJ,GAAA,EACM+H,KAAAA,IACD,IAAArF,GAEF,OAAAC,GAKDC,UAAAA;AAAAA,IAAAA;AAAAA,IAsEA8F;AAAAA,EAAAA,GASH,GAAMvJ,QAAA4I,IAAA5I,QAAAuD,GAAAvD,QAAAwD,GAAAxD,QAAAyD,GAAAzD,QAAAuJ,GAAAvJ,QAAAkK,KAAAA,IAAAlK,EAAA,EAAA;AAAA,MAAAmK;AAAA,EAAAnK,EAAA,EAAA,MAAA2E,KAAA3E,UAAAmJ,MAAAnJ,EAAA,EAAA,MAAA0E,KACLyF,IAAAhB,MAAAzE,KACC,gBAAAhD,EAAC+C,IAAA,EAAuBC,QAAAA,GAAiB,SAAA0F,CAAAA,MAAOzF,EAAQ3C,CAAC,EAAA,CAAC,GAC3DhC,QAAA2E,GAAA3E,QAAAmJ,IAAAnJ,QAAA0E,GAAA1E,QAAAmK,KAAAA,IAAAnK,EAAA,EAAA;AAAA,MAAAqK;AAAA,SAAArK,EAAA,EAAA,MAAAkK,KAAAlK,UAAAmK,KA5FHE,uBAACxJ,GAAA,EAAQ,IAAA1E,EAAMC,MACb8N,UAAAA;AAAAA,IAAAA;AAAAA,IAyFCC;AAAAA,EAAAA,GAGH,GAAMnK,QAAAkK,GAAAlK,QAAAmK,GAAAnK,QAAAqK,MAAAA,KAAArK,EAAA,EAAA,GA7FNqK;AA6FM;AAhPH,SAAAR,GAAAhF,GAAA;AAAA,SA6L2CA,EAACrH;AAAK;AA7LjD,SAAA2F,GAAA+D,GAAA;AAAA,SAeoC/C,OAAO+C,CAAC;AAAC;ACzJpD,MAAMoD,KAAmBA,CAACzF,OAAmC;AAAA,EAC3DK,MAAOL,EAAEK,QAAQ,CAAA;AAAA,EACjBqF,SAAU1F,EAAE0F,WAAWlK;AAAAA,EACvBY,WAAW4D,EAAE5D;AAAAA,EACbmF,gBAAgBvB,EAAEuB;AACpB;AAEA,SAASoE,GAAoBC,GAA2C;AACtE,MAAI,CAACA,EAAG,QAAO;AACf,MAAIxC,IAAI;AACR,aAAWvD,KAAU+F;AACnB,eAAWhF,KAAQf,EAAQ,CAAIe,EAAK3H,QAAQmK,UAAOxC,EAAK3H;AAE1D,SAAOmK;AACT;AAwDO,SAAAyC,GAAA3K,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAkB;AAAA,IAAAiG,WAAAA;AAAAA,IAAAC,mBAAAA;AAAAA,IAAAzB,QAAAA;AAAAA,IAAA2B,UAAAA;AAAAA,IAAAC,QAAAA;AAAAA,IAAAtC,WAAAA;AAAAA,IAAAuC,aAAAA;AAAAA,IAAApG,MAAAA;AAAAA,IAAAqG,SAAAA;AAAAA,EAAAA,IAAAzG,GAWvB4K,IAAWC,GAAAA,GACX5B,IAAc6B,GAAiBF,GAAIL,EAAgB,GAOnDQ,IACQN,GAAoBxB,EAAKuB,OAAQ,GAGzCQ,IACExE,MAAgBuE,IAAa,IAAbA,IAAAzK;AAAwC,MAAAD;AAAA,SAAAJ,EAAA,CAAA,MAAA+K,KAAA/K,SAAAsG,KAAAtG,EAAA,CAAA,MAAAqG,KAAArG,EAAA,CAAA,MAAAmG,KAAAnG,EAAA,CAAA,MAAAgE,KAAAhE,EAAA,CAAA,MAAAkG,KAAAlG,EAAA,CAAA,MAAA0E,KAAA1E,EAAA,CAAA,MAAAG,KAAAH,SAAAgJ,EAAA9D,QAAAlF,EAAA,CAAA,MAAAgJ,EAAA/H,aAAAjB,EAAA,EAAA,MAAAgJ,EAAA5C,kBAAApG,EAAA,EAAA,MAAAwG,KAExDpG,IAAA,gBAAAsB,EAACuE,MACO,MAAA+C,EAAK9D,MACA,WAAA8D,EAAK/H,WACA,gBAAA+H,EAAK5C,gBACVF,WAAAA,GACQC,mBAAAA,GACXzB,QAAAA,GACE2B,UAAAA,GACFC,QAAAA,GACGtC,WAAAA,GACE+G,aAAAA,GACP5K,MAAAA,GACGqG,SAAAA,EAAAA,CAAO,GAChBxG,OAAA+K,GAAA/K,OAAAsG,GAAAtG,OAAAqG,GAAArG,OAAAmG,GAAAnG,OAAAgE,GAAAhE,OAAAkG,GAAAlG,OAAA0E,GAAA1E,OAAAG,GAAAH,EAAA,CAAA,IAAAgJ,EAAA9D,MAAAlF,EAAA,CAAA,IAAAgJ,EAAA/H,WAAAjB,EAAA,EAAA,IAAAgJ,EAAA5C,gBAAApG,QAAAwG,GAAAxG,QAAAI,KAAAA,IAAAJ,EAAA,EAAA,GAbFI;AAaE;"}
|